Contract 0x2105a206B7bec31E2F90acF7385cc8F7F5f9D273

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x06fff23d1dd5f7ba70d70e2236f4f7d0038a963184bde53d962b06df611bb7caTransfer227190632023-11-29 13:35:161 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000278115
0xb9aafadd5bcee6c7365edc8f992c49ae53feafb111792846324400ee93d5fbdfTransfer227190562023-11-29 13:34:411 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363835
0xaa5661d0cf59094921fc315246ab264efefd536bb756a15828d574a55ab2725dTransfer227190502023-11-29 13:34:111 day 3 hrs ago0xa684b60f415d14bce1d9c1dd6fc12076fbe972dc IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0xa9f99b89b4cd12cf57e6d9356c6b91b3ed1985edaf557b06e05c50d0a72bd295Transfer227190432023-11-29 13:33:361 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000278175
0x98664a0bf13da8a97f1cbab6d2f8a7b43077c77fc52a8d54079b19dd89082cedTransfer227190332023-11-29 13:32:461 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x8a517f23b796b749dc85717aff86eb23ffcbc911b1e4842e3d2b0514beec7b81Transfer227190262023-11-29 13:32:111 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0xdc8569858d0fb7fb91c6cb88aca26f8eaad815a2be7c4da30758ba09628494a0Transfer227190182023-11-29 13:31:311 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000278175
0xdd203b98a08290bbdb6ac466eebb42dd29f936e989633dfb83a00da3ffbb8af8Transfer227190112023-11-29 13:30:561 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0xbd16094a458f21ea42f0ae81844c0785a4dadb37e14aa2113d6599bc4ac94a17Transfer227190032023-11-29 13:30:161 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x4fe5e0f393abc00ccfdc78aac192369fb095e5ce74d2fdc3ab8adf7bcb96fc74Transfer227189942023-11-29 13:29:311 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000278175
0x2e63a90cb243df689c582d0d909b13af2a3def6d27dd3a6b49d3b0918297ed2aTransfer227189882023-11-29 13:29:011 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x4063d9e81d05fb2c6dfad913e025a5ffb86db6e78ea6abefcf56155d8f9cee6cTransfer227189802023-11-29 13:28:211 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363835
0x3b575eb53917eeda08771dd1834d7e88381a0f916c80a37e3c9937dd6262822cTransfer227189632023-11-29 13:26:561 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0xd825f0c7faaf48e3ed64bd4061f6bfdd9c3dc8268ea2e9628707471981eaf3bbTransfer227189522023-11-29 13:26:011 day 3 hrs ago0x750419407123937c71a9ef70d0b42eb163dc993d IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.00036235
0x5ba6b0514bd164daabd5aaae72694c97b7bba4aa3a4926318fddae0f737dcf0aTransfer227146172023-11-29 7:24:451 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x391ed326c6143472206b816869e0b03f9d9fd90872b7d77d1e0de3144718704cTransfer227146052023-11-29 7:23:451 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0xb4cc92cf072c015a0361b2f417a79da6cfed60d1dd7912095038b9e2bbb3fff3Transfer227145842023-11-29 7:22:001 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x7bd40c7c6984f39bda65156c8291bd3dda55ba7bbe0f77380570b33390570104Transfer227145682023-11-29 7:20:401 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0xc3398b322bf3e39e24b49184f6fe245dbb72293b3d10caf562bab1147c906115Transfer227145542023-11-29 7:19:301 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x108a911369dfdea0e58325ca8204e5f8f8f656f05668ca8deea3f515df9212c9Transfer227145222023-11-29 7:16:501 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x4a3886ede66a0ea7ecd1bb8dc444585d9525801a1d44e492dfbb1f67391919aeTransfer227145092023-11-29 7:15:451 day 9 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363895
0x53b51fa02ee102dcd07700f4e069a6a7a518335cfdc1c694b4848120a8c5437eTransfer227144862023-11-29 7:13:501 day 10 hrs ago0x7891afe14ac1f24ad828aa3e92fa4837194006cd IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000364925
0x5c476c5e545070bd9cfc32d87e6a0bee60033e3bd9771907e8a2263f81d91dd8Transfer227035352023-11-28 16:01:132 days 1 hr ago0xffb27c3d806ce1e9170ae943f1d22c0abf2ac2f0 IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363835
0x29a7ac671789ce278ea6e9a1b35425e8094fa52bd5b9f124fa790f8b650666caTransfer227035282023-11-28 16:00:382 days 1 hr ago0xffb27c3d806ce1e9170ae943f1d22c0abf2ac2f0 IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000278115
0x5e66d6cba108fa551a09e0e9c65ca1f4a0a1e8207d6fc39401f3bb811994fd57Transfer227035182023-11-28 15:59:482 days 1 hr ago0xffb27c3d806ce1e9170ae943f1d22c0abf2ac2f0 IN  0x2105a206b7bec31e2f90acf7385cc8f7f5f9d2730 CELO0.000363835
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Similar Match Source Code
This contract matches the deployed ByteCode of the Source Code for Contract 0x45d747172e77d55575c197cba9451bc2cd8f4958
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DemurrageTokenSingleNocap

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
byzantium EvmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at celoscan.io on 2023-06-03
*/

pragma solidity >= 0.8.0;


/*
 * ABDK Math 64.64 Smart Contract Library.  Copyright © 2019 by ABDK Consulting.
 * Author: Mikhail Vladimirov <[email protected]>
 * License: BSD-4-Clause
 */
 
/**
 * Smart contract library of mathematical functions operating with signed
 * 64.64-bit fixed point numbers.  Signed 64.64-bit fixed point number is
 * basically a simple fraction whose numerator is signed 128-bit integer and
 * denominator is 2^64.  As long as denominator is always the same, there is no
 * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are
 * represented by int128 type holding only the numerator.
 */
library ABDKMath64x64 {
  /*
   * Minimum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

  /*
   * Maximum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

  /**
   * Convert signed 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromInt (int256 x) internal pure returns (int128) {
    unchecked {
      require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF);
      return int128 (x << 64);
    }
  }

  /**
   * Convert signed 64.64 fixed point number into signed 64-bit integer number
   * rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64-bit integer number
   */
  function toInt (int128 x) internal pure returns (int64) {
    unchecked {
      return int64 (x >> 64);
    }
  }

  /**
   * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromUInt (uint256 x) internal pure returns (int128) {
    unchecked {
      require (x <= 0x7FFFFFFFFFFFFFFF);
      return int128 (int256 (x << 64));
    }
  }

  /**
   * Convert signed 64.64 fixed point number into unsigned 64-bit integer
   * number rounding down.  Revert on underflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return unsigned 64-bit integer number
   */
  function toUInt (int128 x) internal pure returns (uint64) {
    unchecked {
      require (x >= 0);
      return uint64 (uint128 (x >> 64));
    }
  }

  /**
   * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point
   * number rounding down.  Revert on overflow.
   *
   * @param x signed 128.128-bin fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function from128x128 (int256 x) internal pure returns (int128) {
    unchecked {
      int256 result = x >> 64;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Convert signed 64.64 fixed point number into signed 128.128 fixed point
   * number.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 128.128 fixed point number
   */
  function to128x128 (int128 x) internal pure returns (int256) {
    unchecked {
      return int256 (x) << 64;
    }
  }

  /**
   * Calculate x + y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function add (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) + y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x - y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sub (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) - y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x * y rounding down.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function mul (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 result = int256(x) * y >> 64;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point
   * number and y is signed 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y signed 256-bit integer number
   * @return signed 256-bit integer number
   */
  function muli (int128 x, int256 y) internal pure returns (int256) {
    unchecked {
      if (x == MIN_64x64) {
        require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF &&
          y <= 0x1000000000000000000000000000000000000000000000000);
        return -y << 63;
      } else {
        bool negativeResult = false;
        if (x < 0) {
          x = -x;
          negativeResult = true;
        }
        if (y < 0) {
          y = -y; // We rely on overflow behavior here
          negativeResult = !negativeResult;
        }
        uint256 absoluteResult = mulu (x, uint256 (y));
        if (negativeResult) {
          require (absoluteResult <=
            0x8000000000000000000000000000000000000000000000000000000000000000);
          return -int256 (absoluteResult); // We rely on overflow behavior here
        } else {
          require (absoluteResult <=
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
          return int256 (absoluteResult);
        }
      }
    }
  }

  /**
   * Calculate x * y rounding down, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y unsigned 256-bit integer number
   * @return unsigned 256-bit integer number
   */
  function mulu (int128 x, uint256 y) internal pure returns (uint256) {
    unchecked {
      if (y == 0) return 0;

      require (x >= 0);

      uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
      uint256 hi = uint256 (int256 (x)) * (y >> 128);

      require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      hi <<= 64;

      require (hi <=
        0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo);
      return hi + lo;
    }
  }

  /**
   * Calculate x / y rounding towards zero.  Revert on overflow or when y is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function div (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);
      int256 result = (int256 (x) << 64) / y;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are signed 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x signed 256-bit integer number
   * @param y signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divi (int256 x, int256 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);

      bool negativeResult = false;
      if (x < 0) {
        x = -x; // We rely on overflow behavior here
        negativeResult = true;
      }
      if (y < 0) {
        y = -y; // We rely on overflow behavior here
        negativeResult = !negativeResult;
      }
      uint128 absoluteResult = divuu (uint256 (x), uint256 (y));
      if (negativeResult) {
        require (absoluteResult <= 0x80000000000000000000000000000000);
        return -int128 (absoluteResult); // We rely on overflow behavior here
      } else {
        require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
        return int128 (absoluteResult); // We rely on overflow behavior here
      }
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divu (uint256 x, uint256 y) internal pure returns (int128) {
    unchecked {
      require (y != 0);
      uint128 result = divuu (x, y);
      require (result <= uint128 (MAX_64x64));
      return int128 (result);
    }
  }

  /**
   * Calculate -x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function neg (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != MIN_64x64);
      return -x;
    }
  }

  /**
   * Calculate |x|.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function abs (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != MIN_64x64);
      return x < 0 ? -x : x;
    }
  }

  /**
   * Calculate 1 / x rounding towards zero.  Revert on overflow or when x is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function inv (int128 x) internal pure returns (int128) {
    unchecked {
      require (x != 0);
      int256 result = int256 (0x100000000000000000000000000000000) / x;
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function avg (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      return int128 ((int256 (x) + int256 (y)) >> 1);
    }
  }

  /**
   * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down.
   * Revert on overflow or in case x * y is negative.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function gavg (int128 x, int128 y) internal pure returns (int128) {
    unchecked {
      int256 m = int256 (x) * int256 (y);
      require (m >= 0);
      require (m <
          0x4000000000000000000000000000000000000000000000000000000000000000);
      return int128 (sqrtu (uint256 (m)));
    }
  }

  /**
   * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y uint256 value
   * @return signed 64.64-bit fixed point number
   */
  function pow (int128 x, uint256 y) internal pure returns (int128) {
    unchecked {
      bool negative = x < 0 && y & 1 == 1;

      uint256 absX = uint128 (x < 0 ? -x : x);
      uint256 absResult;
      absResult = 0x100000000000000000000000000000000;

      if (absX <= 0x10000000000000000) {
        absX <<= 63;
        while (y != 0) {
          if (y & 0x1 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x2 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x4 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          if (y & 0x8 != 0) {
            absResult = absResult * absX >> 127;
          }
          absX = absX * absX >> 127;

          y >>= 4;
        }

        absResult >>= 64;
      } else {
        uint256 absXShift = 63;
        if (absX < 0x1000000000000000000000000) { absX <<= 32; absXShift -= 32; }
        if (absX < 0x10000000000000000000000000000) { absX <<= 16; absXShift -= 16; }
        if (absX < 0x1000000000000000000000000000000) { absX <<= 8; absXShift -= 8; }
        if (absX < 0x10000000000000000000000000000000) { absX <<= 4; absXShift -= 4; }
        if (absX < 0x40000000000000000000000000000000) { absX <<= 2; absXShift -= 2; }
        if (absX < 0x80000000000000000000000000000000) { absX <<= 1; absXShift -= 1; }

        uint256 resultShift = 0;
        while (y != 0) {
          require (absXShift < 64);

          if (y & 0x1 != 0) {
            absResult = absResult * absX >> 127;
            resultShift += absXShift;
            if (absResult > 0x100000000000000000000000000000000) {
              absResult >>= 1;
              resultShift += 1;
            }
          }
          absX = absX * absX >> 127;
          absXShift <<= 1;
          if (absX >= 0x100000000000000000000000000000000) {
              absX >>= 1;
              absXShift += 1;
          }

          y >>= 1;
        }

        require (resultShift < 64);
        absResult >>= 64 - resultShift;
      }
      int256 result = negative ? -int256 (absResult) : int256 (absResult);
      require (result >= MIN_64x64 && result <= MAX_64x64);
      return int128 (result);
    }
  }

  /**
   * Calculate sqrt (x) rounding down.  Revert if x < 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sqrt (int128 x) internal pure returns (int128) {
    unchecked {
      require (x >= 0);
      return int128 (sqrtu (uint256 (int256 (x)) << 64));
    }
  }

  /**
   * Calculate binary logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function log_2 (int128 x) internal pure returns (int128) {
    unchecked {
      require (x > 0);

      int256 msb = 0;
      int256 xc = x;
      if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; }
      if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
      if (xc >= 0x10000) { xc >>= 16; msb += 16; }
      if (xc >= 0x100) { xc >>= 8; msb += 8; }
      if (xc >= 0x10) { xc >>= 4; msb += 4; }
      if (xc >= 0x4) { xc >>= 2; msb += 2; }
      if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

      int256 result = msb - 64 << 64;
      uint256 ux = uint256 (int256 (x)) << uint256 (127 - msb);
      for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) {
        ux *= ux;
        uint256 b = ux >> 255;
        ux >>= 127 + b;
        result += bit * int256 (b);
      }

      return int128 (result);
    }
  }

  /**
   * Calculate natural logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function ln (int128 x) internal pure returns (int128) {
    unchecked {
      require (x > 0);

      return int128 (int256 (
          uint256 (int256 (log_2 (x))) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128));
    }
  }

  /**
   * Calculate binary exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp_2 (int128 x) internal pure returns (int128) {
    unchecked {
      require (x < 0x400000000000000000); // Overflow

      if (x < -0x400000000000000000) return 0; // Underflow

      uint256 result = 0x80000000000000000000000000000000;

      if (x & 0x8000000000000000 > 0)
        result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
      if (x & 0x4000000000000000 > 0)
        result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
      if (x & 0x2000000000000000 > 0)
        result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
      if (x & 0x1000000000000000 > 0)
        result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
      if (x & 0x800000000000000 > 0)
        result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
      if (x & 0x400000000000000 > 0)
        result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
      if (x & 0x200000000000000 > 0)
        result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
      if (x & 0x100000000000000 > 0)
        result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
      if (x & 0x80000000000000 > 0)
        result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
      if (x & 0x40000000000000 > 0)
        result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
      if (x & 0x20000000000000 > 0)
        result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
      if (x & 0x10000000000000 > 0)
        result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
      if (x & 0x8000000000000 > 0)
        result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
      if (x & 0x4000000000000 > 0)
        result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
      if (x & 0x2000000000000 > 0)
        result = result * 0x1000162E525EE054754457D5995292026 >> 128;
      if (x & 0x1000000000000 > 0)
        result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
      if (x & 0x800000000000 > 0)
        result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
      if (x & 0x400000000000 > 0)
        result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
      if (x & 0x200000000000 > 0)
        result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128;
      if (x & 0x100000000000 > 0)
        result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
      if (x & 0x80000000000 > 0)
        result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
      if (x & 0x40000000000 > 0)
        result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
      if (x & 0x20000000000 > 0)
        result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
      if (x & 0x10000000000 > 0)
        result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
      if (x & 0x8000000000 > 0)
        result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
      if (x & 0x4000000000 > 0)
        result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
      if (x & 0x2000000000 > 0)
        result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
      if (x & 0x1000000000 > 0)
        result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
      if (x & 0x800000000 > 0)
        result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
      if (x & 0x400000000 > 0)
        result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
      if (x & 0x200000000 > 0)
        result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
      if (x & 0x100000000 > 0)
        result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
      if (x & 0x80000000 > 0)
        result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
      if (x & 0x40000000 > 0)
        result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
      if (x & 0x20000000 > 0)
        result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128;
      if (x & 0x10000000 > 0)
        result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
      if (x & 0x8000000 > 0)
        result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
      if (x & 0x4000000 > 0)
        result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
      if (x & 0x2000000 > 0)
        result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
      if (x & 0x1000000 > 0)
        result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128;
      if (x & 0x800000 > 0)
        result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
      if (x & 0x400000 > 0)
        result = result * 0x100000000002C5C85FDF477B662B26945 >> 128;
      if (x & 0x200000 > 0)
        result = result * 0x10000000000162E42FEFA3AE53369388C >> 128;
      if (x & 0x100000 > 0)
        result = result * 0x100000000000B17217F7D1D351A389D40 >> 128;
      if (x & 0x80000 > 0)
        result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
      if (x & 0x40000 > 0)
        result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
      if (x & 0x20000 > 0)
        result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128;
      if (x & 0x10000 > 0)
        result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
      if (x & 0x8000 > 0)
        result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
      if (x & 0x4000 > 0)
        result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128;
      if (x & 0x2000 > 0)
        result = result * 0x1000000000000162E42FEFA39F02B772C >> 128;
      if (x & 0x1000 > 0)
        result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
      if (x & 0x800 > 0)
        result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
      if (x & 0x400 > 0)
        result = result * 0x100000000000002C5C85FDF473DEA871F >> 128;
      if (x & 0x200 > 0)
        result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128;
      if (x & 0x100 > 0)
        result = result * 0x100000000000000B17217F7D1CF79E949 >> 128;
      if (x & 0x80 > 0)
        result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
      if (x & 0x40 > 0)
        result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
      if (x & 0x20 > 0)
        result = result * 0x100000000000000162E42FEFA39EF366F >> 128;
      if (x & 0x10 > 0)
        result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128;
      if (x & 0x8 > 0)
        result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
      if (x & 0x4 > 0)
        result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
      if (x & 0x2 > 0)
        result = result * 0x1000000000000000162E42FEFA39EF358 >> 128;
      if (x & 0x1 > 0)
        result = result * 0x10000000000000000B17217F7D1CF79AB >> 128;

      result >>= uint256 (int256 (63 - (x >> 64)));
      require (result <= uint256 (int256 (MAX_64x64)));

      return int128 (int256 (result));
    }
  }

  /**
   * Calculate natural exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp (int128 x) internal pure returns (int128) {
    unchecked {
      require (x < 0x400000000000000000); // Overflow

      if (x < -0x400000000000000000) return 0; // Underflow

      return exp_2 (
          int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128));
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return unsigned 64.64-bit fixed point number
   */
  function divuu (uint256 x, uint256 y) private pure returns (uint128) {
    unchecked {
      require (y != 0);

      uint256 result;

      if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        result = (x << 64) / y;
      else {
        uint256 msb = 192;
        uint256 xc = x >> 192;
        if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
        if (xc >= 0x10000) { xc >>= 16; msb += 16; }
        if (xc >= 0x100) { xc >>= 8; msb += 8; }
        if (xc >= 0x10) { xc >>= 4; msb += 4; }
        if (xc >= 0x4) { xc >>= 2; msb += 2; }
        if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

        result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1);
        require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

        uint256 hi = result * (y >> 128);
        uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

        uint256 xh = x >> 192;
        uint256 xl = x << 64;

        if (xl < lo) xh -= 1;
        xl -= lo; // We rely on overflow behavior here
        lo = hi << 128;
        if (xl < lo) xh -= 1;
        xl -= lo; // We rely on overflow behavior here

        assert (xh == hi >> 128);

        result += xl / y;
      }

      require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      return uint128 (result);
    }
  }

  /**
   * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer
   * number.
   *
   * @param x unsigned 256-bit integer number
   * @return unsigned 128-bit integer number
   */
  function sqrtu (uint256 x) private pure returns (uint128) {
    unchecked {
      if (x == 0) return 0;
      else {
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; }
        if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; }
        if (xx >= 0x100000000) { xx >>= 32; r <<= 16; }
        if (xx >= 0x10000) { xx >>= 16; r <<= 8; }
        if (xx >= 0x100) { xx >>= 8; r <<= 4; }
        if (xx >= 0x10) { xx >>= 4; r <<= 2; }
        if (xx >= 0x4) { r <<= 1; }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return uint128 (r < r1 ? r : r1);
      }
    }
  }
}


// SPDX-License-Identifier: GPL-3.0-or-later
contract DemurrageTokenSingleNocap {

	struct redistributionItem {
		uint32 period;
		uint72 value;
		uint64 demurrage;
	}
	redistributionItem[] public redistributions;

	// Account balances
	mapping (address => uint256) account;
	
	// Cached demurrage amount, ppm with 38 digit resolution
	//uint128 public demurrageAmount;
	int128 public demurrageAmount;

	// Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated
	uint256 public demurrageTimestamp;

	// Implements EIP173
	address public owner;

	address newOwner;

	// Implements ERC20
	string public name;

	// Implements ERC20
	string public symbol;

	// Implements ERC20
	uint256 public immutable decimals;

	uint256 supply;

	// Last executed period
	uint256 public lastPeriod;

	// Last sink redistribution amount
	uint256 public totalSink;

	// Value of burnt tokens (burnt tokens do not decay)
	uint256 burned;

	// 128 bit resolution of the demurrage divisor
	// (this constant x 1000000 is contained within 128 bits)
	//uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less

	// remaining decimal positions of nanoDivider to reach 38, equals precision in growth and decay
	//uint256 constant growthResolutionFactor = 1000000000000;

	// demurrage decimal width; 38 places
	//uint256 public immutable resolutionFactor = nanoDivider * growthResolutionFactor; 

	// Timestamp of start of periods (time which contract constructor was called)
	uint256 public immutable periodStart;

	// Duration of a single redistribution period in seconds
	uint256 public immutable periodDuration;

	// Demurrage in ppm per minute
	//uint256 public immutable decayLevel;
	// 64x64
	int128 public immutable decayLevel;
		
	// Addresses allowed to mint new tokens
	mapping (address => bool) minter;

	// Storage for ERC20 approve/transferFrom methods
	mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage)

	// Address to send unallocated redistribution tokens
	address public sinkAddress; 

	// timestamp when token contract expires
	uint256 public expires;
	bool expired;

	// supply xap
	uint256 public maxSupply;

	// Implements ERC20
	event Transfer(address indexed _from, address indexed _to, uint256 _value);

	// Implements ERC20
	event Approval(address indexed _owner, address indexed _spender, uint256 _value);

	// Implements Minter
	event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value);

	// New demurrage cache milestone calculated
	event Decayed(uint256 indexed _period, uint256 indexed _periodCount, int128 indexed _oldAmount, int128 _newAmount);

	// When a new period threshold has been crossed
	event Period(uint256 _period);

	// Redistribution applied on a single eligible account
	event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value);

	// Temporary event used in development, will be removed on prod
	//event Debug(bytes32 _foo);
	event Debug(int128 indexed _foo, uint256 indexed _bar);

	// Implements Burn
	event Burn(address indexed _burner, uint256 _value);

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

	// Implements Expire
	event Expired(uint256 _timestamp);

	// Implements Expire
	event ExpiryChange(uint256 indexed _oldTimestamp, uint256 _newTimestamp);

	event Cap(uint256 indexed _oldCap, uint256 _newCap);

	// Implements Seal
	uint256 public sealState;
	uint8 constant WRITER_STATE = 1;
	uint8 constant SINK_STATE = 2;
	uint8 constant EXPIRY_STATE = 4;
	uint8 constant CAP_STATE = 8;
	// Implements Seal
	uint256 constant public maxSealState = 15;

	// Implements Seal
	event SealStateChange(bool indexed _final, uint256 _sealState);


	constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _decayLevel, uint256 _periodMinutes, address _defaultSinkAddress) {
		require(_decayLevel < (1 << 64));
		redistributionItem memory initialRedistribution;

		//require(ABDKMath64x64.toUInt(_decayLevel) == 0);

		// ACL setup
		owner = msg.sender;

		// ERC20 setup
		name = _name;
		symbol = _symbol;
		decimals = _decimals;

		// Demurrage setup
		demurrageTimestamp = block.timestamp;
		periodStart = demurrageTimestamp;
		periodDuration = _periodMinutes * 60;
		demurrageAmount = ABDKMath64x64.fromUInt(1);

		decayLevel = ABDKMath64x64.ln(_decayLevel);
		initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1);
		redistributions.push(initialRedistribution);

		// Misc settings
		sinkAddress = _defaultSinkAddress;
	}

	function seal(uint256 _state) public returns(uint256) {
		require(_state < 16, 'ERR_INVALID_STATE');
		require(_state & sealState == 0, 'ERR_ALREADY_LOCKED');
		sealState |= _state;
		emit SealStateChange(sealState == maxSealState, sealState);
		return uint256(sealState);
	}

	function isSealed(uint256 _state) public view returns(bool) {
		require(_state < maxSealState);
		if (_state == 0) {
			return sealState == maxSealState;
		}
		return _state & sealState == _state;
	}

	// Set when token expires. 
	// Value is set it terms of redistribution periods.
	// Cannot be set to a time in the past.
	function setExpirePeriod(uint256 _expirePeriod) public {
		uint256 r;
		uint256 oldTimestamp;

		require(!isSealed(EXPIRY_STATE));
		require(!expired);
		require(msg.sender == owner);
		r = periodStart + (_expirePeriod * periodDuration);
		require(r > expires);
		oldTimestamp = expires;
		expires = r;
		emit ExpiryChange(oldTimestamp, expires);
	}

	// Change max token supply.
	// Can only increase supply cap, not decrease.
	function setMaxSupply(uint256 _cap) public {
		require(!isSealed(CAP_STATE));
		require(msg.sender == owner);
		require(_cap > totalSupply());
		emit Cap(maxSupply, _cap);
		maxSupply = _cap;
	}

	// Change sink address for redistribution
	function setSinkAddress(address _sinkAddress) public {
		require(!isSealed(SINK_STATE));
		require(msg.sender == owner);
		sinkAddress = _sinkAddress;
	}

	// Expire the contract if expire is set and we have gone over the threshold.
	// Finalizes demurrage up to the timestamp of the expiry. 
	// The first approve, transfer or transferFrom call that hits the ex == 2 will get the tx mined. but without the actual effect. Otherwise we would have to wait until an external egent called applyExpiry to get the correct final balance.
	// Implements Expire
	function applyExpiry() public returns(uint8) {
		if (expired) {
			return 1;
		}
		if (expires == 0) {
			return 0;
		}
		if (block.timestamp >= expires) {
			applyDemurrageLimited(expires - demurrageTimestamp / 60);
			expired = true;
			emit Expired(block.timestamp);
			changePeriod();
			return 2;
		}
		return 0;
	}

	// Given address will be allowed to call the mintTo() function
	// Implements Writer
	function addWriter(address _minter) public returns (bool) {
		require(!isSealed(WRITER_STATE));
		require(msg.sender == owner);
		minter[_minter] = true;
		return true;
	}

	// Given address will no longer be allowed to call the mintTo() function
	// Implements Writer
	function deleteWriter(address _minter) public returns (bool) {
		require(!isSealed(WRITER_STATE));
		require(msg.sender == owner || _minter == msg.sender);
		minter[_minter] = false;
		return true;
	}

	// Implements Writer
	function isWriter(address _minter) public view returns(bool) {
		return minter[_minter];
	}

	/// Implements ERC20
	function balanceOf(address _account) public view returns (uint256) {
		int128 baseBalance;
		int128 currentDemurragedAmount;
		uint256 periodCount;

		baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account));

		periodCount = getMinutesDelta(demurrageTimestamp);

		currentDemurragedAmount = ABDKMath64x64.mul(baseBalance, demurrageAmount);
		return decayBy(ABDKMath64x64.toUInt(currentDemurragedAmount), periodCount);
	}

	// Balance unmodified by demurrage
	function baseBalanceOf(address _account) public view returns (uint256) {
		return account[_account];
	}

	/// Increases base balance for a single account
	function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) {
		uint256 oldBalance;
		uint256 workAccount;

		workAccount = uint256(account[_account]);
	
		if (_delta == 0) {
			return false;
		}

		oldBalance = baseBalanceOf(_account);
		account[_account] = oldBalance + _delta;
		return true;
	}

	/// Decreases base balance for a single account
	function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) {
		uint256 oldBalance;
		uint256 workAccount;

		workAccount = uint256(account[_account]);

		if (_delta == 0) {
			return false;
		}

		oldBalance = baseBalanceOf(_account);	
		require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard
		account[_account] = oldBalance - _delta;
		return true;
	}

	// Send full balance of one account to another
	function sweep(address _account) public returns (uint256) {
		uint256 v;

		v = account[msg.sender];
		account[msg.sender] = 0;
		account[_account] += v;
		return v;
	}

	// Creates new tokens out of thin air, and allocates them to the given address
	// Triggers tax
	// Implements Minter
	function mintTo(address _beneficiary, uint256 _amount) public returns (bool) {
		uint256 baseAmount;

		require(applyExpiry() == 0);
		require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS');

		changePeriod();
		if (maxSupply > 0) {
			require(supply + _amount <= maxSupply);
		}
		supply += _amount;

		baseAmount = toBaseAmount(_amount);
		increaseBaseBalance(_beneficiary, baseAmount);
		emit Mint(msg.sender, _beneficiary, _amount);
		saveRedistributionSupply();
		return true;
	}

	// Implements Minter
	function mint(address _beneficiary, uint256 _amount, bytes calldata _data) public {
		_data;
		mintTo(_beneficiary, _amount);
	}

	// Implements Minter
	function safeMint(address _beneficiary, uint256 _amount, bytes calldata _data) public {
		_data;
		mintTo(_beneficiary, _amount);
	}

	// Deserializes the redistribution word
	function toRedistribution(uint256 _participants, int128 _demurrageModifier, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) {
		redistributionItem memory redistribution;

		redistribution.period = uint32(_period);
		redistribution.value = uint72(_value);
		redistribution.demurrage = uint64(uint128(_demurrageModifier) & 0xffffffffffffffff);
		_participants;
		return redistribution;

	}

	// Serializes the demurrage period part of the redistribution word
	function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) {
		return uint256(_redistribution.period);
	}

	// Serializes the supply part of the redistribution word
	function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) {
		return uint256(_redistribution.value);
	}

	// Serializes the number of participants part of the redistribution word
	function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (int128) {
		int128 r;

		r = int128(int64(_redistribution.demurrage) & int128(0x0000000000000000ffffffffffffffff));
		if (r == 0) {
			r = ABDKMath64x64.fromUInt(1);
		}
		return r;
	}

	// Client accessor to the redistributions array length
	function redistributionCount() public view returns (uint256) {
		return redistributions.length;
	}

	// Save the current total supply amount to the current redistribution period
	function saveRedistributionSupply() private returns (bool) {
		redistributionItem memory currentRedistribution;
		uint256 grownSupply;

		grownSupply = totalSupply();
		currentRedistribution = redistributions[redistributions.length-1];
		currentRedistribution.value = uint72(grownSupply);

		redistributions[redistributions.length-1] = currentRedistribution;
		return true;
	}

	// Get the demurrage period of the current block number
	function actualPeriod() public view returns (uint128) {
		return uint128((block.timestamp - periodStart) / periodDuration + 1);
	}

	// Retrieve next redistribution if the period threshold has been crossed
	function checkPeriod() private view returns (redistributionItem memory) {
		redistributionItem memory lastRedistribution;
		redistributionItem memory emptyRedistribution;
		uint256 currentPeriod;

		lastRedistribution =  redistributions[lastPeriod];
		currentPeriod = this.actualPeriod();
		if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) {
			return emptyRedistribution;
		}
		return lastRedistribution;
	}

	function getDistribution(uint256 _supply, int128 _demurrageAmount) public pure returns (uint256) {
		int128 difference;

		difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), ABDKMath64x64.sub(ABDKMath64x64.fromUInt(1), _demurrageAmount));
		return _supply - ABDKMath64x64.toUInt(difference);
			
	}

	function getDistributionFromRedistribution(redistributionItem memory _redistribution) public pure returns (uint256) {
		uint256 redistributionSupply;
		int128 redistributionDemurrage;

		redistributionSupply = toRedistributionSupply(_redistribution);
		redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution);
		return getDistribution(redistributionSupply, redistributionDemurrage);
	}

	// Returns the amount sent to the sink address
	function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) {
		uint256 unit;
		uint256 baseUnit;
	
		unit = totalSupply() - getDistributionFromRedistribution(_redistribution);	
		baseUnit = toBaseAmount(unit) - totalSink;
		increaseBaseBalance(sinkAddress, baseUnit);
		emit Redistribution(sinkAddress, _redistribution.period, unit);
		lastPeriod += 1;
		totalSink += baseUnit;
		return unit;
	}

	// Recalculate the demurrage modifier for the new period
	// Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed.
	function changePeriod() public returns (bool) {
		redistributionItem memory currentRedistribution;
		redistributionItem memory nextRedistribution;
		redistributionItem memory lastRedistribution;
		uint256 currentPeriod;
		int128 lastDemurrageAmount;
		int128 nextRedistributionDemurrage;
		uint256 demurrageCounts;
		uint256 nextPeriod;

		applyDemurrage();
		currentRedistribution = checkPeriod();
		if (isEmptyRedistribution(currentRedistribution)) {
			return false;
		}

		// calculate the decay from previous redistributino
		lastRedistribution = redistributions[lastPeriod];
		currentPeriod = toRedistributionPeriod(currentRedistribution);
		nextPeriod = currentPeriod + 1;
		lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution);
		demurrageCounts = (periodDuration * currentPeriod) / 60;
		// TODO refactor decayby to take int128 then DRY with it
		nextRedistributionDemurrage = ABDKMath64x64.exp(ABDKMath64x64.mul(decayLevel, ABDKMath64x64.fromUInt(demurrageCounts)));
		nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod);
		redistributions.push(nextRedistribution);

		applyDefaultRedistribution(nextRedistribution);
		emit Period(nextPeriod);
		return true;
	}

	// Calculate the time delta in whole minutes passed between given timestamp and current timestamp
	function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) {
		return (block.timestamp - _lastTimestamp) / 60;
	}

	// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
	function applyDemurrage() public returns (uint256) {
		return applyDemurrageLimited(0);
	}

	// returns true if expired
	function applyDemurrageLimited(uint256 _rounds) public returns (uint256) {
		int128 v;
		uint256 periodCount;
		int128 periodPoint;
		int128 lastDemurrageAmount;

		if (expired) {
			return 0; 
		}

		periodCount = getMinutesDelta(demurrageTimestamp);
		if (periodCount == 0) {
			return 0;
		}
		lastDemurrageAmount = demurrageAmount;
	
		// safety limit for exponential calculation to ensure that we can always
		// execute this code no matter how much time passes.			
		if (_rounds > 0 && _rounds < periodCount) {
			periodCount = _rounds;
		}

		periodPoint = ABDKMath64x64.fromUInt(periodCount);
		v = ABDKMath64x64.mul(decayLevel, periodPoint);
		v = ABDKMath64x64.exp(v);
		demurrageAmount = ABDKMath64x64.mul(demurrageAmount, v);

		demurrageTimestamp = demurrageTimestamp + (periodCount * 60);
		emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount);
		return periodCount;
	}

	// Return timestamp of start of period threshold
	function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) {
		return periodStart + (_periodCount * periodDuration);
	}

	// Amount of demurrage cycles inbetween the current timestamp and the given target time
	function demurrageCycles(uint256 _target) public view returns (uint256) {
		return (block.timestamp - _target) / 60;
	}

	// Equality check for empty redistribution data
	function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) {
		if (_redistribution.period > 0) {
			return false;
		}
		if (_redistribution.value > 0) {
			return false;
		}
		if (_redistribution.demurrage > 0) {
			return false;
		}
		return true;
	}


	// Calculate a value reduced by demurrage by the given period
	function decayBy(uint256 _value, uint256 _period)  public view returns (uint256) {
		int128 valuePoint;
		int128 periodPoint;
		int128 v;
	
		valuePoint = ABDKMath64x64.fromUInt(_value);
		periodPoint = ABDKMath64x64.fromUInt(_period);

		v = ABDKMath64x64.mul(decayLevel, periodPoint);
		v = ABDKMath64x64.exp(v);
		v = ABDKMath64x64.mul(valuePoint, v);
		return ABDKMath64x64.toUInt(v);
	}


	// Inflates the given amount according to the current demurrage modifier
	function toBaseAmount(uint256 _value) public view returns (uint256) {
		int128 r;
		r = ABDKMath64x64.div(ABDKMath64x64.fromUInt(_value), demurrageAmount);
		return ABDKMath64x64.toUInt(r);
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function approve(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		if (allowance[msg.sender][_spender] > 0) {
			require(_value == 0, 'ZERO_FIRST');
		}
		
		changePeriod();

		baseValue = toBaseAmount(_value);
		allowance[msg.sender][_spender] = baseValue;
		emit Approval(msg.sender, _spender, _value);
		return true;
	}

	// Reduce allowance by amount
	function decreaseAllowance(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;

		baseValue = toBaseAmount(_value);
		require(allowance[msg.sender][_spender] >= baseValue);
		
		changePeriod();

		allowance[msg.sender][_spender] -= baseValue;
		emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
		return true;
	}

	// Increase allowance by amount
	function increaseAllowance(address _spender, uint256 _value) public returns (bool) {
		uint256 baseValue;

		changePeriod();

		baseValue = toBaseAmount(_value);

		allowance[msg.sender][_spender] += baseValue;
		emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]);
		return true;
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function transfer(address _to, uint256 _value) public returns (bool) {
		uint256 baseValue;
		bool result;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		changePeriod();

		baseValue = toBaseAmount(_value);
		result = transferBase(msg.sender, _to, baseValue);
		emit Transfer(msg.sender, _to, _value);
		return result;
	}

	// Triggers tax and/or redistribution
	// Implements ERC20
	function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
		uint256 baseValue;
		bool result;
		uint8 ex;

		ex = applyExpiry();
		if (ex == 2) {
			return false;	
		} else if (ex > 0) {
			revert('EXPIRED');
		}
		changePeriod();

		baseValue = toBaseAmount(_value);
		require(allowance[_from][msg.sender] >= baseValue);

		allowance[_from][msg.sender] -= baseValue;
		result = transferBase(_from, _to, baseValue);

		emit Transfer(_from, _to, _value);
		return result;
	}

	// ERC20 transfer backend for transfer, transferFrom
	function transferBase(address _from, address _to, uint256 _value) private returns (bool) {
		decreaseBaseBalance(_from, _value);
		increaseBaseBalance(_to, _value);

		return true;
	}

	// Implements EIP173
	function transferOwnership(address _newOwner) public returns (bool) {
		address oldOwner;

		require(msg.sender == owner);
		oldOwner = owner;
		owner = _newOwner;

		emit OwnershipTransferred(oldOwner, owner);
		return true;
	}

	// Explicitly and irretrievably burn tokens
	// Only token minters can burn tokens
	// Implements Burner
	function burn(uint256 _value) public returns(bool) {
		require(applyExpiry() == 0);
		require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS');
		require(_value <= account[msg.sender]);
		uint256 _delta = toBaseAmount(_value);

		//applyDemurrage();
		decreaseBaseBalance(msg.sender, _delta);
		burned += _value;
		emit Burn(msg.sender, _value);
		return true;
	}

	// Implements Burner
	function burn(address _from, uint256 _value, bytes calldata _data) public {
		require(_from == msg.sender, 'ERR_ONLY_SELF_BURN');
		_data;
		burn(_value);
	}

	// Implements Burner
	function burn() public returns(bool) {
		return burn(account[msg.sender]);
	}

	// Implements ERC20
	function totalSupply() public view returns (uint256) {
		return supply - burned;
	}

	// Return total number of burned tokens
	// Implements Burner
	function totalBurned() public view returns (uint256) {
		return burned;
	}

	// Return total number of tokens ever minted
	// Implements Burner
	function totalMinted() public view returns (uint256) {
		return supply;
	}


	// Implements EIP165
	function supportsInterface(bytes4 _sum) public pure returns (bool) {
		if (_sum == 0xb61bc941) { // ERC20
			return true;
		}
		if (_sum == 0x5878bcf4) { // Minter
			return true;
		}
		if (_sum == 0xbc4babdd) { // Burner
			return true;
		}
		if (_sum == 0x0d7491f8) { // Seal
			return true;
		}
		if (_sum == 0xabe1f1f5) { // Writer
			return true;
		}
		if (_sum == 0x841a0e94) { // Expire
			return true;
		}
		if (_sum == 0x01ffc9a7) { // ERC165
			return true;
		}
		if (_sum == 0x9493f8b2) { // ERC173
			return true;
		}
		if (_sum == 0xd0017968) { // ERC5678Ext20
			return true;
		}
		return false;
	}
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b50604051620066d8380380620066d8833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a9640100000000026200325b176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262003281176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161597362000d65600039600081816117f1015281816126dc015281816128c90152612cc5015260008181611f3e0152818161269f01528181612c1d01528181612e62015261308a015260008181611f6a01528181612e8e015281816130ab01526130f00152600061184f01526159736000f3fe608060405234801561001057600080fd5b50600436106103d7576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610211578063a2309ff811610137578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ca8578063e809529514610cd8578063eda4e6d614610cf6578063f2fde38b14610d14576103d7565b8063d7a52fa914610c0e578063d89135cd14610c2a578063da2824a814610c48578063e54063a614610c78576103d7565b8063b470aade11610106578063b470aade14610b84578063c0ab707714610ba2578063d340ef8a14610bd2578063d5abeb0114610bf0576103d7565b8063a2309ff814610ae8578063a457c2d714610b06578063a9059cbb14610b36578063b1cb0db314610b66576103d7565b806386fe212d116101af5780638f1df6bc1161017e5780638f1df6bc14610a7257806394d008ef14610a9057806395d89b4114610aac5780639f24880814610aca576103d7565b806386fe212d146109ec5780638832e6e314610a1c5780638da5cb5b14610a385780638f0b2d5d14610a56576103d7565b8063731f237c116101eb578063731f237c146109625780637445e33a1461098057806374bedb95146109b057806384dde4af146109ce576103d7565b80636a2d094e146108e65780636f8b44b01461091657806370a0823114610932576103d7565b8063313334871161030157806344df8e701161029457806358b2833b1161026357806358b2833b1461084a5780635ae06f7e146108685780635f408c04146108985780636787a9be146108b6576103d7565b806344df8e701461079c57806347a50517146107ba5780634abfbba2146107ea57806351b4541c1461081a576103d7565b806340452d91116102d057806340452d91146106ee57806342966c6814610720578063449a52f81461075057806344d1718714610780576103d7565b80633133348714610652578063313ce5671461068257806331a5995d146106a057806339509351146106be576103d7565b806318cbbcfc1161037957806323b872dd1161034857806323b872dd146105925780632a7aec09146105c25780632b29ba23146105f25780632c1758c114610622576103d7565b806318cbbcfc146104f65780631989c6a814610514578063213d1e1e1461053257806323a8594414610562576103d7565b8063095ea7b3116103b5578063095ea7b31461045a57806309f28f3c1461048a57806311c56615146104a857806318160ddd146104d8576103d7565b806301681a62146103dc57806301ffc9a71461040c57806306fdde031461043c575b600080fd5b6103f660048036038101906103f19190614be8565b610d44565b6040516104039190614c2e565b60405180910390f35b61042660048036038101906104219190614ca1565b610e2d565b6040516104339190614ce9565b60405180910390f35b61044461111b565b6040516104519190614d94565b60405180910390f35b610474600480360381019061046f9190614de2565b6111a9565b6040516104819190614ce9565b60405180910390f35b6104926113e5565b60405161049f9190614e3e565b60405180910390f35b6104c260048036038101906104bd9190614e85565b6113f8565b6040516104cf9190614c2e565b60405180910390f35b6104e0611448565b6040516104ed9190614c2e565b60405180910390f35b6104fe61145f565b60405161050b9190614c2e565b60405180910390f35b61051c611464565b6040516105299190614c2e565b60405180910390f35b61054c60048036038101906105479190615066565b611470565b6040516105599190614c2e565b60405180910390f35b61057c60048036038101906105779190615066565b611489565b6040516105899190614ce9565b60405180910390f35b6105ac60048036038101906105a79190615093565b6114f1565b6040516105b99190614ce9565b60405180910390f35b6105dc60048036038101906105d79190615066565b61170f565b6040516105e99190614e3e565b60405180910390f35b61060c60048036038101906106079190614be8565b611747565b6040516106199190614ce9565b60405180910390f35b61063c600480360381019061063791906150e6565b61179d565b6040516106499190614ce9565b60405180910390f35b61066c60048036038101906106679190615113565b6117d0565b6040516106799190614c2e565b60405180910390f35b61068a61184d565b6040516106979190614c2e565b60405180910390f35b6106a8611871565b6040516106b59190614c2e565b60405180910390f35b6106d860048036038101906106d39190614de2565b611877565b6040516106e59190614ce9565b60405180910390f35b610708600480360381019061070391906150e6565b611a0d565b60405161071793929190615180565b60405180910390f35b61073a600480360381019061073591906150e6565b611a7c565b6040516107479190614ce9565b60405180910390f35b61076a60048036038101906107659190614de2565b611c4d565b6040516107779190614ce9565b60405180910390f35b61079a6004803603810190610795919061521c565b611e24565b005b6107a4611ea2565b6040516107b19190614ce9565b60405180910390f35b6107d460048036038101906107cf9190614be8565b611ef1565b6040516107e19190614c2e565b60405180910390f35b61080460048036038101906107ff91906150e6565b611f3a565b6040516108119190614c2e565b60405180910390f35b610834600480360381019061082f91906150e6565b611f9a565b6040516108419190614c2e565b60405180910390f35b610852611fbb565b60405161085f9190614c2e565b60405180910390f35b610882600480360381019061087d9190614be8565b611fc1565b60405161088f9190614ce9565b60405180910390f35b6108a06120cb565b6040516108ad91906152ac565b60405180910390f35b6108d060048036038101906108cb91906150e6565b612198565b6040516108dd9190614c2e565b60405180910390f35b61090060048036038101906108fb91906150e6565b6121d9565b60405161090d9190614c2e565b60405180910390f35b610930600480360381019061092b91906150e6565b6121fa565b005b61094c60048036038101906109479190614be8565b6122c2565b6040516109599190614c2e565b60405180910390f35b61096a612329565b6040516109779190614c2e565b60405180910390f35b61099a60048036038101906109959190615066565b61233a565b6040516109a79190614c2e565b60405180910390f35b6109b8612368565b6040516109c59190614c2e565b60405180910390f35b6109d661236e565b6040516109e391906152d6565b60405180910390f35b610a066004803603810190610a0191906150e6565b612394565b604051610a139190614c2e565b60405180910390f35b610a366004803603810190610a31919061521c565b61247b565b005b610a4061248c565b604051610a4d91906152d6565b60405180910390f35b610a706004803603810190610a6b9190614be8565b6124b2565b005b610a7a612567565b604051610a879190614ce9565b60405180910390f35b610aaa6004803603810190610aa5919061521c565b612828565b005b610ab4612839565b604051610ac19190614d94565b60405180910390f35b610ad26128c7565b604051610adf9190614e3e565b60405180910390f35b610af06128eb565b604051610afd9190614c2e565b60405180910390f35b610b206004803603810190610b1b9190614de2565b6128f5565b604051610b2d9190614ce9565b60405180910390f35b610b506004803603810190610b4b9190614de2565b612b14565b604051610b5d9190614ce9565b60405180910390f35b610b6e612c15565b604051610b7b9190614c2e565b60405180910390f35b610b8c612c1b565b604051610b999190614c2e565b60405180910390f35b610bbc6004803603810190610bb791906150e6565b612c3f565b604051610bc99190614c2e565b60405180910390f35b610bda612dc6565b604051610be79190614c2e565b60405180910390f35b610bf8612dcc565b604051610c059190614c2e565b60405180910390f35b610c286004803603810190610c2391906150e6565b612dd2565b005b610c32612f12565b604051610c3f9190614c2e565b60405180910390f35b610c626004803603810190610c5d9190614be8565b612f1c565b604051610c6f9190614ce9565b60405180910390f35b610c926004803603810190610c8d9190615066565b612ff0565b604051610c9f9190614c2e565b60405180910390f35b610cc26004803603810190610cbd91906152f1565b613004565b604051610ccf91906153c7565b60405180910390f35b610ce0613084565b604051610ced919061540d565b60405180910390f35b610cfe6130ee565b604051610d0b9190614c2e565b60405180910390f35b610d2e6004803603810190610d299190614be8565b613112565b604051610d3b9190614ce9565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e1d9190615457565b9250508190555080915050919050565b600063b61bc9417c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e815760019050611116565b635878bcf47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ed35760019050611116565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f255760019050611116565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f775760019050611116565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc95760019050611116565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361101b5760019050611116565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361106d5760019050611116565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036110bf5760019050611116565b63d00179687c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036111115760019050611116565b600090505b919050565b60068054611128906154ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611154906154ba565b80156111a15780601f10611176576101008083540402835291602001916111a1565b820191906000526020600020905b81548152906001019060200180831161118457829003601f168201915b505050505081565b60008060006111b66120cb565b905060028160ff16036111ce576000925050506113df565b60008160ff161115611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90615537565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112de57600084146112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d4906155a3565b60405180910390fd5b5b6112e6612567565b506112f084612198565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516113d09190614c2e565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061141f6114078561325b565b61141a611414600161325b565b866132c3565b61332a565b905061142a816133a9565b67ffffffffffffffff168461143f91906155c3565b91505092915050565b6000600b5460085461145a91906155c3565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff1611156114a657600090506114ec565b6000826020015168ffffffffffffffffff1611156114c757600090506114ec565b6000826040015167ffffffffffffffff1611156114e757600090506114ec565b600190505b919050565b6000806000806114ff6120cb565b905060028160ff16036115185760009350505050611708565b60008160ff16111561155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690615537565b60405180910390fd5b611567612567565b5061157185612198565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156115fc57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168891906155c3565b9250508190555061169a8787856133de565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516116f99190614c2e565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b0361173e5761173b600161325b565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600f82106117ac57600080fd5b600082036117c157600f6012541490506117cb565b8160125483161490505b919050565b6000806000806117df8661325b565b92506117ea8561325b565b91506118167f00000000000000000000000000000000000000000000000000000000000000008361332a565b905061182181613401565b905061182d838261332a565b9050611838816133a9565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611882612567565b5061188c83612198565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461191a9190615457565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516119fa9190614c2e565b60405180910390a3600191505092915050565b60008181548110611a1d57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611a876120cb565b60ff1614611a9457600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611b395750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f90615643565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611bc457600080fd5b6000611bcf83612198565b9050611bdb338261348e565b5082600b6000828254611bee9190615457565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611c3b9190614c2e565b60405180910390a26001915050919050565b6000806000611c5a6120cb565b60ff1614611c6757600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d0c5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4290615643565b60405180910390fd5b611d53612567565b5060006011541115611d7c5760115483600854611d709190615457565b1115611d7b57600080fd5b5b8260086000828254611d8e9190615457565b92505081905550611d9e83612198565b9050611daa8482613592565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611e089190614c2e565b60405180910390a3611e18613653565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e89906156af565b60405180910390fd5b611e9b83611a7c565b5050505050565b6000611eec600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7c565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611f6891906156cf565b7f0000000000000000000000000000000000000000000000000000000000000000611f939190615457565b9050919050565b6000603c8242611faa91906155c3565b611fb49190615740565b9050919050565b60035481565b6000611fd0600160ff1661179d565b15611fda57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061206157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61206a57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff16156120eb5760019050612195565b6000600f54036120fe5760009050612195565b600f5442106121905761212b603c6003546121199190615740565b600f5461212691906155c3565b612c3f565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe9426040516121769190614c2e565b60405180910390a1612186612567565b5060029050612195565b600090505b90565b6000806121bc6121a78461325b565b600260009054906101000a9004600f0b613817565b90506121c7816133a9565b67ffffffffffffffff16915050919050565b6000603c82426121e991906155c3565b6121f39190615740565b9050919050565b612207600860ff1661179d565b1561221157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461226b57600080fd5b612273611448565b811161227e57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516122b09190614c2e565b60405180910390a28060118190555050565b6000806000806122d96122d486611ef1565b61325b565b92506122e6600354611f9a565b905061230183600260009054906101000a9004600f0b61332a565b915061231f61230f836133a9565b67ffffffffffffffff16826117d0565b9350505050919050565b60006123356000612c3f565b905090565b600080600061234884611470565b91506123538461170f565b905061235f82826113f8565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d0906157bd565b60405180910390fd5b6000601254831614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790615829565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516124699190614c2e565b60405180910390a26012549050919050565b6124858484611c4d565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124bf600260ff1661179d565b156124c957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461252357600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612571614b3a565b612579614b3a565b612581614b3a565b6000806000806000612591612329565b5061259a6138a3565b97506125a588611489565b156125bb57600098505050505050505050612825565b6000600954815481106125d1576125d0615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061267e88612ff0565b945060018561268d9190615457565b90506126988661170f565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006126c891906156cf565b6126d29190615740565b915061270e6127097f00000000000000000000000000000000000000000000000000000000000000006127048561325b565b61332a565b613401565b925061272460008461271e611448565b84613004565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506127e087613a39565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516128109190614c2e565b60405180910390a16001985050505050505050505b90565b6128328484611c4d565b5050505050565b60078054612846906154ba565b80601f0160208091040260200160405190810160405280929190818152602001828054612872906154ba565b80156128bf5780601f10612894576101008083540402835291602001916128bf565b820191906000526020600020905b8154815290600101906020018083116128a257829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b60008061290183612198565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561298c57600080fd5b612994612567565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2191906155c3565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612b019190614c2e565b60405180910390a3600191505092915050565b600080600080612b226120cb565b905060028160ff1603612b3b5760009350505050612c0f565b60008160ff161115612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7990615537565b60405180910390fd5b612b8a612567565b50612b9485612198565b9250612ba13387856133de565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612c009190614c2e565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612c69576000945050505050612dc1565b612c74600354611f9a565b925060008303612c8b576000945050505050612dc1565b600260009054906101000a9004600f0b9050600086118015612cac57508286105b15612cb5578592505b612cbe8361325b565b9150612cea7f00000000000000000000000000000000000000000000000000000000000000008361332a565b9350612cf584613401565b9350612d10600260009054906101000a9004600f0b8561332a565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612d5891906156cf565b600354612d659190615457565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612db19190614e3e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612de2600460ff1661179d565b15612dec57600080fd5b601060009054906101000a900460ff1615612e0657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e6057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612e8c91906156cf565b7f0000000000000000000000000000000000000000000000000000000000000000612eb79190615457565b9150600f548211612ec757600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f54604051612f059190614c2e565b60405180910390a2505050565b6000600b54905090565b6000612f2b600160ff1661179d565b15612f3557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f8f57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b61300c614b3a565b613014614b3a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426130d591906155c3565b6130df9190615740565b6130e99190615457565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461316f57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff82111561327257600080fd5b6040829060020a029050919050565b60008082600f0b1361329257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6132ae84613b58565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561331757506f7fffffffffffffffffffffffffffffff600f0b8113155b61332057600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561339657506f7fffffffffffffffffffffffffffffff600f0b8113155b61339f57600080fd5b8091505092915050565b60008082600f0b12156133bb57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006133ea848361348e565b506133f58383613592565b50600190509392505050565b60006840000000000000000082600f0b1261341b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561344f5760009050613489565b6134866080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613d1e565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036134e85760009250505061358c565b6134f185611ef1565b915083821015613536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352d906158c4565b60405180910390fd5b838261354291906155c3565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600084036135ec5760009250505061364d565b6135f585611ef1565b915083826136039190615457565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b600061365d614b3a565b6000613667611448565b90506000600160008054905061367d91906155c3565b8154811061368e5761368d615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061376991906155c3565b8154811061377a57613779615849565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361382857600080fd5b600082600f0b604085600f0b9060020a028161384757613846615711565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561389057506f7fffffffffffffffffffffffffffffff600f0b8113155b61389957600080fd5b8091505092915050565b6138ab614b3a565b6138b3614b3a565b6138bb614b3a565b600080600954815481106138d2576138d1615849565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156139dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a019190615910565b6fffffffffffffffffffffffffffffffff169050613a1e83612ff0565b8111613a2f57819350505050613a36565b8293505050505b90565b6000806000613a478461233a565b613a4f611448565b613a5991906155c3565b9150600a54613a6783612198565b613a7191906155c3565b9050613a9f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613592565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613b139190614c2e565b60405180910390a3600160096000828254613b2e9190615457565b9250508190555080600a6000828254613b479190615457565b925050819055508192505050919050565b60008082600f0b13613b6957600080fd5b60008083600f0b9050680100000000000000008112613ba4576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613bd2576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613bfe576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613c29576008819060008212600003808260020a82851804189250505090506008820191505b60108112613c53576004819060008212600003808260020a82851804189250505090506004820191505b60048112613c7d576002819060008212600003808260020a82851804189250505090506002820191505b60028112613c8c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613d11578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613cb9565b5081945050505050919050565b60006840000000000000000082600f0b12613d3857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613d6c5760009050614b35565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613dba57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613df35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613e2c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613e6557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613e9e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613ed7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613f1057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613f49576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613f8157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613fb95760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613ff1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156140295760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315614061576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561409957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156140d15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561410957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156141405760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315614177576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156141ae57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b13156141e5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561421c57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156142535760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b131561428a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156142c15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b13156142f7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561432d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156143635760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561439957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156143cf5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315614405576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561443b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614471576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156144a657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156144db5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614510576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156145455760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561457a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156145af57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156145e45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561461957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561464d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614681576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156146b557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156146e9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561471d57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156147515760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614785576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156147b95760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156147ec576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561481f57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156148525760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561488557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156148b85760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156148eb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561491e57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614951576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561498357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156149b55760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156149e7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315614a195760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614a4b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315614a7d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315614aaf5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315614ae157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115614b3057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614bb582614b8a565b9050919050565b614bc581614baa565b8114614bd057600080fd5b50565b600081359050614be281614bbc565b92915050565b600060208284031215614bfe57614bfd614b80565b5b6000614c0c84828501614bd3565b91505092915050565b6000819050919050565b614c2881614c15565b82525050565b6000602082019050614c436000830184614c1f565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614c7e81614c49565b8114614c8957600080fd5b50565b600081359050614c9b81614c75565b92915050565b600060208284031215614cb757614cb6614b80565b5b6000614cc584828501614c8c565b91505092915050565b60008115159050919050565b614ce381614cce565b82525050565b6000602082019050614cfe6000830184614cda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614d3e578082015181840152602081019050614d23565b60008484015250505050565b6000601f19601f8301169050919050565b6000614d6682614d04565b614d708185614d0f565b9350614d80818560208601614d20565b614d8981614d4a565b840191505092915050565b60006020820190508181036000830152614dae8184614d5b565b905092915050565b614dbf81614c15565b8114614dca57600080fd5b50565b600081359050614ddc81614db6565b92915050565b60008060408385031215614df957614df8614b80565b5b6000614e0785828601614bd3565b9250506020614e1885828601614dcd565b9150509250929050565b600081600f0b9050919050565b614e3881614e22565b82525050565b6000602082019050614e536000830184614e2f565b92915050565b614e6281614e22565b8114614e6d57600080fd5b50565b600081359050614e7f81614e59565b92915050565b60008060408385031215614e9c57614e9b614b80565b5b6000614eaa85828601614dcd565b9250506020614ebb85828601614e70565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614f0282614d4a565b810181811067ffffffffffffffff82111715614f2157614f20614eca565b5b80604052505050565b6000614f34614b76565b9050614f408282614ef9565b919050565b600063ffffffff82169050919050565b614f5e81614f45565b8114614f6957600080fd5b50565b600081359050614f7b81614f55565b92915050565b600068ffffffffffffffffff82169050919050565b614f9f81614f81565b8114614faa57600080fd5b50565b600081359050614fbc81614f96565b92915050565b600067ffffffffffffffff82169050919050565b614fdf81614fc2565b8114614fea57600080fd5b50565b600081359050614ffc81614fd6565b92915050565b60006060828403121561501857615017614ec5565b5b6150226060614f2a565b9050600061503284828501614f6c565b600083015250602061504684828501614fad565b602083015250604061505a84828501614fed565b60408301525092915050565b60006060828403121561507c5761507b614b80565b5b600061508a84828501615002565b91505092915050565b6000806000606084860312156150ac576150ab614b80565b5b60006150ba86828701614bd3565b93505060206150cb86828701614bd3565b92505060406150dc86828701614dcd565b9150509250925092565b6000602082840312156150fc576150fb614b80565b5b600061510a84828501614dcd565b91505092915050565b6000806040838503121561512a57615129614b80565b5b600061513885828601614dcd565b925050602061514985828601614dcd565b9150509250929050565b61515c81614f45565b82525050565b61516b81614f81565b82525050565b61517a81614fc2565b82525050565b60006060820190506151956000830186615153565b6151a26020830185615162565b6151af6040830184615171565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126151dc576151db6151b7565b5b8235905067ffffffffffffffff8111156151f9576151f86151bc565b5b602083019150836001820283011115615215576152146151c1565b5b9250929050565b6000806000806060858703121561523657615235614b80565b5b600061524487828801614bd3565b945050602061525587828801614dcd565b935050604085013567ffffffffffffffff81111561527657615275614b85565b5b615282878288016151c6565b925092505092959194509250565b600060ff82169050919050565b6152a681615290565b82525050565b60006020820190506152c1600083018461529d565b92915050565b6152d081614baa565b82525050565b60006020820190506152eb60008301846152c7565b92915050565b6000806000806080858703121561530b5761530a614b80565b5b600061531987828801614dcd565b945050602061532a87828801614e70565b935050604061533b87828801614dcd565b925050606061534c87828801614dcd565b91505092959194509250565b61536181614f45565b82525050565b61537081614f81565b82525050565b61537f81614fc2565b82525050565b60608201600082015161539b6000850182615358565b5060208201516153ae6020850182615367565b5060408201516153c16040850182615376565b50505050565b60006060820190506153dc6000830184615385565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b615407816153e2565b82525050565b600060208201905061542260008301846153fe565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061546282614c15565b915061546d83614c15565b925082820190508082111561548557615484615428565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806154d257607f821691505b6020821081036154e5576154e461548b565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000615521600783614d0f565b915061552c826154eb565b602082019050919050565b6000602082019050818103600083015261555081615514565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061558d600a83614d0f565b915061559882615557565b602082019050919050565b600060208201905081810360008301526155bc81615580565b9050919050565b60006155ce82614c15565b91506155d983614c15565b92508282039050818111156155f1576155f0615428565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061562d600a83614d0f565b9150615638826155f7565b602082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b6000615699601283614d0f565b91506156a482615663565b602082019050919050565b600060208201905081810360008301526156c88161568c565b9050919050565b60006156da82614c15565b91506156e583614c15565b92508282026156f381614c15565b9150828204841483151761570a57615709615428565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061574b82614c15565b915061575683614c15565b92508261576657615765615711565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006157a7601183614d0f565b91506157b282615771565b602082019050919050565b600060208201905081810360008301526157d68161579a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615813601283614d0f565b915061581e826157dd565b602082019050919050565b6000602082019050818103600083015261584281615806565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006158ae600d83614d0f565b91506158b982615878565b602082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b6158ed816153e2565b81146158f857600080fd5b50565b60008151905061590a816158e4565b92915050565b60006020828403121561592657615925614b80565b5b6000615934848285016158fb565b9150509291505056fea2646970667358221220328f0fbbc2c230ab0b2baa7351327ca952449758c2fcb28fb33fe2b826f38dba64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000fffff8276fb8cfff000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000005523058cdffe5f3c1eadadd5015e55c6e00fb4390000000000000000000000000000000000000000000000000000000000000006536172616675000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035352460000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

26344:23454:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35536:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49154:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26944:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45090:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26684:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39315:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48742:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30123:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38030:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37437:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43968:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46884:526;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37669:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33925:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31391:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44342:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27038:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29939:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46028:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26475:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48037:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35838:511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48447:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48636:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34525:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43555:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42183:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26812:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33692:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32985:335;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44827:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43792:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32172:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34046:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42429:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39637:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27191:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28465:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31105:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36536:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26874:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40809:1269;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36377:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26990:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28105:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49048:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45619:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46405:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28541:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27975:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42555:944;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27123:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28601:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31727:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48897:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33413:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37220:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36718:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38663:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27874:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47686:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35536:175;35585:7;35599:9;35619:7;:19;35627:10;35619:19;;;;;;;;;;;;;;;;35615:23;;35665:1;35643:7;:19;35651:10;35643:19;;;;;;;;;;;;;;;:23;;;;35692:1;35671:7;:17;35679:8;35671:17;;;;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;35705:1;35698:8;;;35536:175;;;:::o;49154:641::-;49215:4;49238:10;49230:18;;:4;:18;;;;49226:56;;49272:4;49265:11;;;;49226:56;49298:10;49290:18;;:4;:18;;;;49286:57;;49333:4;49326:11;;;;49286:57;49359:10;49351:18;;:4;:18;;;;49347:57;;49394:4;49387:11;;;;49347:57;49420:10;49412:18;;:4;:18;;;;49408:55;;49453:4;49446:11;;;;49408:55;49479:10;49471:18;;:4;:18;;;;49467:57;;49514:4;49507:11;;;;49467:57;49540:10;49532:18;;:4;:18;;;;49528:57;;49575:4;49568:11;;;;49528:57;49601:10;49593:18;;:4;:18;;;;49589:57;;49636:4;49629:11;;;;49589:57;49662:10;49654:18;;:4;:18;;;;49650:57;;49697:4;49690:11;;;;49650:57;49723:10;49715:18;;:4;:18;;;;49711:63;;49764:4;49757:11;;;;49711:63;49785:5;49778:12;;49154:641;;;;:::o;26944:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45090:492::-;45157:4;45168:17;45190:8;45210:13;:11;:13::i;:::-;45205:18;;45238:1;45232:2;:7;;;45228:85;;45254:5;45247:12;;;;;;45228:85;45281:1;45276:2;:6;;;45272:41;;;45290:17;;;;;;;;;;:::i;:::-;;;;;;;;45272:41;45355:1;45321:9;:21;45331:10;45321:21;;;;;;;;;;;;;;;:31;45343:8;45321:31;;;;;;;;;;;;;;;;:35;45317:87;;;45382:1;45372:6;:11;45364:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;45317:87;45412:14;:12;:14::i;:::-;;45445:20;45458:6;45445:12;:20::i;:::-;45433:32;;45504:9;45470;:21;45480:10;45470:21;;;;;;;;;;;;;;;:31;45492:8;45470:31;;;;;;;;;;;;;;;:43;;;;45544:8;45523:38;;45532:10;45523:38;;;45554:6;45523:38;;;;;;:::i;:::-;;;;;;;;45573:4;45566:11;;;;45090:492;;;;;:::o;26684:29::-;;;;;;;;;;;;;:::o;39315:317::-;39403:7;39417:17;39454:114;39472:31;39495:7;39472:22;:31::i;:::-;39505:62;39523:25;39546:1;39523:22;:25::i;:::-;39550:16;39505:17;:62::i;:::-;39454:17;:114::i;:::-;39441:127;;39590:32;39611:10;39590:20;:32::i;:::-;39580:42;;:7;:42;;;;:::i;:::-;39573:49;;;39315:317;;;;:::o;48742:85::-;48786:7;48816:6;;48807;;:15;;;;:::i;:::-;48800:22;;48742:85;:::o;30123:41::-;30162:2;30123:41;:::o;38030:100::-;38082:7;38103:15;:22;;;;38096:29;;38030:100;:::o;37437:152::-;37533:7;37562:15;:21;;;37554:30;;37547:37;;37437:152;;;:::o;43968:303::-;44062:4;44102:1;44077:15;:22;;;:26;;;44073:56;;;44118:5;44111:12;;;;44073:56;44161:1;44137:15;:21;;;:25;;;44133:55;;;44177:5;44170:12;;;;44133:55;44224:1;44196:15;:25;;;:29;;;44192:59;;;44240:5;44233:12;;;;44192:59;44262:4;44255:11;;43968:303;;;;:::o;46884:526::-;46966:4;46977:17;46999:11;47015:8;47035:13;:11;:13::i;:::-;47030:18;;47063:1;47057:2;:7;;;47053:85;;47079:5;47072:12;;;;;;;47053:85;47106:1;47101:2;:6;;;47097:41;;;47115:17;;;;;;;;;;:::i;:::-;;;;;;;;47097:41;47142:14;:12;:14::i;:::-;;47175:20;47188:6;47175:12;:20::i;:::-;47163:32;;47240:9;47208;:16;47218:5;47208:16;;;;;;;;;;;;;;;:28;47225:10;47208:28;;;;;;;;;;;;;;;;:41;;47200:50;;;;;;47289:9;47257;:16;47267:5;47257:16;;;;;;;;;;;;;;;:28;47274:10;47257:28;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;47312:35;47325:5;47332:3;47337:9;47312:12;:35::i;:::-;47303:44;;47375:3;47359:28;;47368:5;47359:28;;;47380:6;47359:28;;;;;;:::i;:::-;;;;;;;;47399:6;47392:13;;;;;46884:526;;;;;;:::o;37669:299::-;37776:6;37789:8;37857:34;37821:15;:25;;;37815:77;;;37804:89;;37907:1;37902;:6;;;37898:53;;37920:25;37943:1;37920:22;:25::i;:::-;37916:29;;37898:53;37962:1;37955:8;;;37669:299;;;:::o;33925:93::-;33980:4;33998:6;:15;34005:7;33998:15;;;;;;;;;;;;;;;;;;;;;;;;;33991:22;;33925:93;;;:::o;31391:205::-;31445:4;30162:2;31464:6;:21;31456:30;;;;;;31505:1;31495:6;:11;31491:61;;30162:2;31521:9;;:25;31514:32;;;;31491:61;31585:6;31572:9;;31563:6;:18;:28;31556:35;;31391:205;;;;:::o;44342:403::-;44414:7;44428:17;44450:18;44473:8;44502:30;44525:6;44502:22;:30::i;:::-;44489:43;;44551:31;44574:7;44551:22;:31::i;:::-;44537:45;;44593:42;44611:10;44623:11;44593:17;:42::i;:::-;44589:46;;44644:20;44662:1;44644:17;:20::i;:::-;44640:24;;44673:32;44691:10;44703:1;44673:17;:32::i;:::-;44669:36;;44717:23;44738:1;44717:20;:23::i;:::-;44710:30;;;;;;;44342:403;;;;:::o;27038:33::-;;;:::o;29939:24::-;;;;:::o;46028:310::-;46105:4;46116:17;46140:14;:12;:14::i;:::-;;46173:20;46186:6;46173:12;:20::i;:::-;46161:32;;46235:9;46200;:21;46210:10;46200:21;;;;;;;;;;;;;;;:31;46222:8;46200:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;46275:8;46254:63;;46263:10;46254:63;;;46285:9;:21;46295:10;46285:21;;;;;;;;;;;;;;;:31;46307:8;46285:31;;;;;;;;;;;;;;;;46254:63;;;;;;:::i;:::-;;;;;;;;46329:4;46322:11;;;46028:310;;;;:::o;26475:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48037:382::-;48082:4;48118:1;48101:13;:11;:13::i;:::-;:18;;;48093:27;;;;;;48133:6;:18;48140:10;48133:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;48169:5;;;;;;;;;;;48155:19;;:10;:19;;;48133:41;48125:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48212:7;:19;48220:10;48212:19;;;;;;;;;;;;;;;;48202:6;:29;;48194:38;;;;;;48237:14;48254:20;48267:6;48254:12;:20::i;:::-;48237:37;;48304:39;48324:10;48336:6;48304:19;:39::i;:::-;;48358:6;48348;;:16;;;;;;;:::i;:::-;;;;;;;;48379:10;48374:24;;;48391:6;48374:24;;;;;;:::i;:::-;;;;;;;;48410:4;48403:11;;;48037:382;;;:::o;35838:511::-;35909:4;35920:18;35970:1;35953:13;:11;:13::i;:::-;:18;;;35945:27;;;;;;35985:6;:18;35992:10;35985:18;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;36021:5;;;;;;;;;;;36007:19;;:10;:19;;;35985:41;35977:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36048:14;:12;:14::i;:::-;;36083:1;36071:9;;:13;36067:69;;;36120:9;;36109:7;36100:6;;:16;;;;:::i;:::-;:29;;36092:38;;;;;;36067:69;36150:7;36140:6;;:17;;;;;;;:::i;:::-;;;;;;;;36177:21;36190:7;36177:12;:21::i;:::-;36164:34;;36203:45;36223:12;36237:10;36203:19;:45::i;:::-;;36275:12;36258:39;;36263:10;36258:39;;;36289:7;36258:39;;;;;;:::i;:::-;;;;;;;;36302:26;:24;:26::i;:::-;;36340:4;36333:11;;;35838:511;;;;:::o;48447:161::-;48543:10;48534:19;;:5;:19;;;48526:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;48591:12;48596:6;48591:4;:12::i;:::-;;48447:161;;;;:::o;48636:79::-;48667:4;48685:25;48690:7;:19;48698:10;48690:19;;;;;;;;;;;;;;;;48685:4;:25::i;:::-;48678:32;;48636:79;:::o;34525:105::-;34587:7;34608;:17;34616:8;34608:17;;;;;;;;;;;;;;;;34601:24;;34525:105;;;:::o;43555:142::-;43626:7;43677:14;43662:12;:29;;;;:::i;:::-;43647:11;:45;;;;:::i;:::-;43640:52;;43555:142;;;:::o;42183:135::-;42253:7;42311:2;42293:14;42275:15;:32;;;;:::i;:::-;42274:39;;;;:::i;:::-;42267:46;;42183:135;;;:::o;26812:33::-;;;;:::o;33692:205::-;33747:4;33767:22;29997:1;33767:22;;:8;:22::i;:::-;33766:23;33758:32;;;;;;33817:5;;;;;;;;;;;33803:19;;:10;:19;;;:44;;;;33837:10;33826:21;;:7;:21;;;33803:44;33795:53;;;;;;33871:5;33853:6;:15;33860:7;33853:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33888:4;33881:11;;33692:205;;;:::o;32985:335::-;33023:5;33039:7;;;;;;;;;;;33035:33;;;33061:1;33054:8;;;;33035:33;33087:1;33076:7;;:12;33072:38;;33103:1;33096:8;;;;33072:38;33137:7;;33118:15;:26;33114:189;;33152:56;33205:2;33184:18;;:23;;;;:::i;:::-;33174:7;;:33;;;;:::i;:::-;33152:21;:56::i;:::-;;33224:4;33214:7;;:14;;;;;;;;;;;;;;;;;;33239:24;33247:15;33239:24;;;;;;:::i;:::-;;;;;;;;33269:14;:12;:14::i;:::-;;33296:1;33289:8;;;;33114:189;33314:1;33307:8;;32985:335;;:::o;44827:196::-;44886:7;44900:8;44917:66;44935:30;44958:6;44935:22;:30::i;:::-;44967:15;;;;;;;;;;;44917:17;:66::i;:::-;44913:70;;44995:23;45016:1;44995:20;:23::i;:::-;44988:30;;;;;44827:196;;;:::o;43792:121::-;43855:7;43906:2;43895:7;43877:15;:25;;;;:::i;:::-;43876:32;;;;:::i;:::-;43869:39;;43792:121;;;:::o;32172:200::-;32229:19;30097:1;32229:19;;:8;:19::i;:::-;32228:20;32220:29;;;;;;32276:5;;;;;;;;;;;32262:19;;:10;:19;;;32254:28;;;;;;32302:13;:11;:13::i;:::-;32295:4;:20;32287:29;;;;;;32330:9;;32326:20;32341:4;32326:20;;;;;;:::i;:::-;;;;;;;;32363:4;32351:9;:16;;;;32172:200;:::o;34046:437::-;34104:7;34118:18;34141:30;34176:19;34216:47;34239:23;34253:8;34239:13;:23::i;:::-;34216:22;:47::i;:::-;34202:61;;34284:35;34300:18;;34284:15;:35::i;:::-;34270:49;;34352:47;34370:11;34383:15;;;;;;;;;;;34352:17;:47::i;:::-;34326:73;;34411:67;34419:45;34440:23;34419:20;:45::i;:::-;34411:67;;34466:11;34411:7;:67::i;:::-;34404:74;;;;;34046:437;;;:::o;42429:92::-;42471:7;42492:24;42514:1;42492:21;:24::i;:::-;42485:31;;42429:92;:::o;39637:413::-;39744:7;39758:28;39791:30;39851:39;39874:15;39851:22;:39::i;:::-;39828:62;;39921:50;39955:15;39921:33;:50::i;:::-;39895:76;;39983:62;39999:20;40021:23;39983:15;:62::i;:::-;39976:69;;;;39637:413;;;:::o;27191:24::-;;;;:::o;28465:26::-;;;;;;;;;;;;;:::o;31105:281::-;31150:7;31181:2;31172:6;:11;31164:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;31240:1;31227:9;;31218:6;:18;:23;31210:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;31282:6;31269:9;;:19;;;;;;;;;;;30162:2;31314:9;;:25;31298:53;;;31341:9;;31298:53;;;;;;:::i;:::-;;;;;;;;31371:9;;31356:25;;31105:281;;;:::o;36536:135::-;36637:29;36644:12;36658:7;36637:6;:29::i;:::-;;36536:135;;;;:::o;26874:20::-;;;;;;;;;;;;;:::o;32421:157::-;32488:20;30030:1;32488:20;;:8;:20::i;:::-;32487:21;32479:30;;;;;;32536:5;;;;;;;;;;;32522:19;;:10;:19;;;32514:28;;;;;;32561:12;32547:11;;:26;;;;;;;;;;;;;;;;;;32421:157;:::o;40809:1269::-;40849:4;40860:47;;:::i;:::-;40912:44;;:::i;:::-;40961;;:::i;:::-;41010:21;41036:26;41067:34;41106:23;41134:18;41159:16;:14;:16::i;:::-;;41204:13;:11;:13::i;:::-;41180:37;;41226:44;41248:21;41226;:44::i;:::-;41222:74;;;41285:5;41278:12;;;;;;;;;;;;41222:74;41378:15;41394:10;;41378:27;;;;;;;;:::i;:::-;;;;;;;;;41357:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41426:45;41449:21;41426:22;:45::i;:::-;41410:61;;41505:1;41489:13;:17;;;;:::i;:::-;41476:30;;41533:53;41567:18;41533:33;:53::i;:::-;41511:75;;41644:2;41627:13;41610:14;:30;;;;:::i;:::-;41609:37;;;;:::i;:::-;41591:55;;41741:89;41759:70;41777:10;41789:39;41812:15;41789:22;:39::i;:::-;41759:17;:70::i;:::-;41741:17;:89::i;:::-;41711:119;;41856:75;41873:1;41876:27;41905:13;:11;:13::i;:::-;41920:10;41856:16;:75::i;:::-;41835:96;;41936:15;41957:18;41936:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41983:46;42010:18;41983:26;:46::i;:::-;;42039:18;42046:10;42039:18;;;;;;:::i;:::-;;;;;;;;42069:4;42062:11;;;;;;;;;;40809:1269;;:::o;36377:131::-;36474:29;36481:12;36495:7;36474:6;:29::i;:::-;;36377:131;;;;:::o;26990:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28105:34::-;;;:::o;49048:76::-;49092:7;49113:6;;49106:13;;49048:76;:::o;45619:370::-;45696:4;45707:17;45743:20;45756:6;45743:12;:20::i;:::-;45731:32;;45811:9;45776;:21;45786:10;45776:21;;;;;;;;;;;;;;;:31;45798:8;45776:31;;;;;;;;;;;;;;;;:44;;45768:53;;;;;;45830:14;:12;:14::i;:::-;;45886:9;45851;:21;45861:10;45851:21;;;;;;;;;;;;;;;:31;45873:8;45851:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;45926:8;45905:63;;45914:10;45905:63;;;45936:9;:21;45946:10;45936:21;;;;;;;;;;;;;;;:31;45958:8;45936:31;;;;;;;;;;;;;;;;45905:63;;;;;;:::i;:::-;;;;;;;;45980:4;45973:11;;;45619:370;;;;:::o;46405:412::-;46468:4;46479:17;46501:11;46517:8;46537:13;:11;:13::i;:::-;46532:18;;46565:1;46559:2;:7;;;46555:85;;46581:5;46574:12;;;;;;;46555:85;46608:1;46603:2;:6;;;46599:41;;;46617:17;;;;;;;;;;:::i;:::-;;;;;;;;46599:41;46644:14;:12;:14::i;:::-;;46677:20;46690:6;46677:12;:20::i;:::-;46665:32;;46711:40;46724:10;46736:3;46741:9;46711:12;:40::i;:::-;46702:49;;46782:3;46761:33;;46770:10;46761:33;;;46787:6;46761:33;;;;;;:::i;:::-;;;;;;;;46806:6;46799:13;;;;;46405:412;;;;;:::o;28541:22::-;;;;:::o;27975:39::-;;;:::o;42555:944::-;42619:7;42633:8;42646:19;42670:18;42693:26;42730:7;;;;;;;;;;;42726:34;;;42752:1;42745:8;;;;;;;;42726:34;42780:35;42796:18;;42780:15;:35::i;:::-;42766:49;;42839:1;42824:11;:16;42820:42;;42855:1;42848:8;;;;;;;;42820:42;42888:15;;;;;;;;;;;42866:37;;43060:1;43050:7;:11;:36;;;;;43075:11;43065:7;:21;43050:36;43046:75;;;43108:7;43094:21;;43046:75;43141:35;43164:11;43141:22;:35::i;:::-;43127:49;;43185:42;43203:10;43215:11;43185:17;:42::i;:::-;43181:46;;43236:20;43254:1;43236:17;:20::i;:::-;43232:24;;43279:37;43297:15;;;;;;;;;;;43314:1;43279:17;:37::i;:::-;43261:15;;:55;;;;;;;;;;;;;;;;;;;;43380:2;43366:11;:16;;;;:::i;:::-;43344:18;;:39;;;;:::i;:::-;43323:18;:60;;;;43434:19;43393:78;;43421:11;43401:18;;43393:78;43455:15;;;;;;;;;;;43393:78;;;;;;:::i;:::-;;;;;;;;43483:11;43476:18;;;;;;42555:944;;;;:::o;27123:25::-;;;;:::o;28601:24::-;;;;:::o;31727:361::-;31787:9;31801:20;31837:22;30065:1;31837:22;;:8;:22::i;:::-;31836:23;31828:32;;;;;;31874:7;;;;;;;;;;;31873:8;31865:17;;;;;;31909:5;;;;;;;;;;;31895:19;;:10;:19;;;31887:28;;;;;;31955:14;31939:13;:30;;;;:::i;:::-;31924:11;:46;;;;:::i;:::-;31920:50;;31987:7;;31983:1;:11;31975:20;;;;;;32015:7;;32000:22;;32037:1;32027:7;:11;;;;32061:12;32048:35;32075:7;;32048:35;;;;;;:::i;:::-;;;;;;;;31782:306;;31727:361;:::o;48897:76::-;48941:7;48962:6;;48955:13;;48897:76;:::o;33413:176::-;33465:4;33485:22;29997:1;33485:22;;:8;:22::i;:::-;33484:23;33476:32;;;;;;33535:5;;;;;;;;;;;33521:19;;:10;:19;;;33513:28;;;;;;33564:4;33546:6;:15;33553:7;33546:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33580:4;33573:11;;33413:176;;;:::o;37220:153::-;37316:7;37345:15;:22;;;37337:31;;37330:38;;37220:153;;;:::o;36718:428::-;36847:25;;:::i;:::-;36879:40;;:::i;:::-;36957:7;36926:14;:21;;:39;;;;;;;;;;;37000:6;36970:14;:20;;:37;;;;;;;;;;;37076:18;37054;37046:48;37012:14;:24;;:83;;;;;;;;;;;37125:14;37118:21;;;36718:428;;;;;;:::o;38663:132::-;38708:7;38788:1;38771:14;38756:11;38738:15;:29;;;;:::i;:::-;38737:48;;;;:::i;:::-;:52;;;;:::i;:::-;38722:68;;38663:132;:::o;27874:36::-;;;:::o;47686:237::-;47748:4;47759:16;47804:5;;;;;;;;;;;47790:19;;:10;:19;;;47782:28;;;;;;47826:5;;;;;;;;;;;47815:16;;47844:9;47836:5;;:17;;;;;;;;;;;;;;;;;;47896:5;;;;;;;;;;;47865:37;;47886:8;47865:37;;;;;;;;;;;;47914:4;47907:11;;;47686:237;;;:::o;2009:174::-;2062:6;2110:18;2105:1;:23;;2096:33;;;;;;2166:2;2161:1;:7;;;;2138:32;;2009:174;;;:::o;15633:228::-;15679:6;15726:1;15722;:5;;;15713:15;;;;;;15843:3;15805:34;15791:9;15798:1;15791:5;:9::i;:::-;15783:18;;15774:65;:72;;;;;;;;;15739:109;;15633:228;;;:::o;4071:225::-;4128:6;4162:13;4190:1;4178:13;;4185:1;4178:9;;:13;4162:29;;815:35;4209:19;;:6;:19;;:42;;;;;973:34;4232:19;;:6;:19;;4209:42;4200:52;;;;;;4276:6;4261:22;;;4071:225;;;;:::o;4532:231::-;4589:6;4623:13;4656:2;4651:1;4639:13;;4646:1;4639:9;;:13;:19;;;;;;;;;;;;;;;;;;;4623:35;;815;4676:19;;:6;:19;;:42;;;;;973:34;4699:19;;:6;:19;;4676:42;4667:52;;;;;;4743:6;4728:22;;;4532:231;;;;:::o;2430:155::-;2480:6;2528:1;2523;:6;;;;2514:16;;;;;;2568:2;2563:1;:7;;;;;;;;;;;;;;;;;;;;;2539:33;;2430:155;;;:::o;47470:188::-;47553:4;47564:34;47584:5;47591:6;47564:19;:34::i;:::-;;47603:32;47623:3;47628:6;47603:19;:32::i;:::-;;47649:4;47642:11;;47470:188;;;;;:::o;23217:305::-;23264:6;23311:20;23307:1;:24;;;23298:34;;;;;;23363:21;23359:1;:25;;;23355:39;;;23393:1;23386:8;;;;23355:39;23425:84;23504:3;23465:35;23460:1;23452:10;;:48;:55;;;;;;;;;;;;;;;;;;;23425:5;:84::i;:::-;23418:91;;23217:305;;;;:::o;35076:406::-;35156:4;35167:18;35190:19;35238:7;:17;35246:8;35238:17;;;;;;;;;;;;;;;;35216:40;;35277:1;35267:6;:11;35263:41;;35293:5;35286:12;;;;;;35263:41;35323:23;35337:8;35323:13;:23::i;:::-;35310:36;;35374:6;35360:10;:20;;35352:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;35455:6;35442:10;:19;;;;:::i;:::-;35422:7;:17;35430:8;35422:17;;;;;;;;;;;;;;;:39;;;;35473:4;35466:11;;;;35076:406;;;;;:::o;34685:336::-;34765:4;34776:18;34799:19;34847:7;:17;34855:8;34847:17;;;;;;;;;;;;;;;;34825:40;;34887:1;34877:6;:11;34873:41;;34903:5;34896:12;;;;;;34873:41;34933:23;34947:8;34933:13;:23::i;:::-;34920:36;;34994:6;34981:10;:19;;;;:::i;:::-;34961:7;:17;34969:8;34961:17;;;;;;;;;;;;;;;:39;;;;35012:4;35005:11;;;;34685:336;;;;;:::o;38214:386::-;38267:4;38278:47;;:::i;:::-;38330:19;38370:13;:11;:13::i;:::-;38356:27;;38412:15;38451:1;38428:15;:22;;;;:24;;;;:::i;:::-;38412:41;;;;;;;;:::i;:::-;;;;;;;;;38388:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38495:11;38458:21;:27;;:49;;;;;;;;;;;38558:21;38514:15;38553:1;38530:15;:22;;;;:24;;;;:::i;:::-;38514:41;;;;;;;;:::i;:::-;;;;;;;;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38591:4;38584:11;;;;38214:386;:::o;7255:259::-;7312:6;7360:1;7355;:6;;;7346:16;;;;;;7371:13;7408:1;7387:22;;7402:2;7396:1;7388:10;;:16;;;;7387:22;;;;;:::i;:::-;;;7371:38;;815:35;7427:19;;:6;:19;;:42;;;;;973:34;7450:19;;:6;:19;;7427:42;7418:52;;;;;;7494:6;7479:22;;;7255:259;;;;:::o;38875:435::-;38920:25;;:::i;:::-;38952:44;;:::i;:::-;39001:45;;:::i;:::-;39051:21;39101:15;39117:10;;39101:27;;;;;;;;:::i;:::-;;;;;;;;;39079:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39149:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39133:35;;;;39194:42;39217:18;39194:22;:42::i;:::-;39177:13;:59;39173:103;;39251:19;39244:26;;;;;;;39173:103;39287:18;39280:25;;;;;38875:435;;:::o;40104:452::-;40200:7;40214:12;40231:16;40278:50;40312:15;40278:33;:50::i;:::-;40262:13;:11;:13::i;:::-;:66;;;;:::i;:::-;40255:73;;40366:9;;40345:18;40358:4;40345:12;:18::i;:::-;:30;;;;:::i;:::-;40334:41;;40380:42;40400:11;;;;;;;;;;;40413:8;40380:19;:42::i;:::-;;40460:15;:22;;;40432:57;;40447:11;;;;;;;;;;;40432:57;;;40484:4;40432:57;;;;;;:::i;:::-;;;;;;;;40508:1;40494:10;;:15;;;;;;;:::i;:::-;;;;;;;;40527:8;40514:9;;:21;;;;;;;:::i;:::-;;;;;;;;40547:4;40540:11;;;;40104:452;;;:::o;14584:863::-;14633:6;14680:1;14676;:5;;;14667:15;;;;;;14693:10;14716:9;14728:1;14716:13;;;;14748:19;14742:2;:25;14738:56;;14778:2;14771:9;;;;;;;;;;;;;;;;;;;;;;14789:2;14782:9;;;;14738:56;14812:11;14806:2;:17;14802:48;;14834:2;14827:9;;;;;;;;;;;;;;;;;;;;;;14845:2;14838:9;;;;14802:48;14868:7;14862:2;:13;14858:44;;14886:2;14879:9;;;;;;;;;;;;;;;;;;;;;;14897:2;14890:9;;;;14858:44;14920:5;14914:2;:11;14910:40;;14936:1;14929:8;;;;;;;;;;;;;;;;;;;;;;14946:1;14939:8;;;;14910:40;14968:4;14962:2;:10;14958:39;;14983:1;14976:8;;;;;;;;;;;;;;;;;;;;;;14993:1;14986:8;;;;14958:39;15015:3;15009:2;:9;15005:38;;15029:1;15022:8;;;;;;;;;;;;;;;;;;;;;;15039:1;15032:8;;;;15005:38;15061:3;15055:2;:9;15051:23;;15073:1;15066:8;;;;15051:23;15117:13;15145:2;15139;15133:3;:8;:14;;;;15117:30;;15156:10;15208:3;15202;:9;15186:1;15178:10;;15169:43;;;;15156:56;;15226:10;15239:18;15226:31;;15221:181;15265:1;15259:3;:7;15221:181;;;15296:2;15290:8;;;;15309:9;15327:3;15321:2;:9;;;;;;;;;15309:21;;15354:1;15348:3;:7;15341:14;;;;;;;;;;;;15390:1;15376:3;:16;15366:26;;;;15279:123;15276:1;15268:9;;;;;;;;;;;;;;;;;;;;;;15221:181;;;;15427:6;15412:22;;;;;;14584:863;;;:::o;16047:6983::-;16096:6;16143:20;16139:1;:24;;;16130:34;;;;;;16195:21;16191:1;:25;;;16187:39;;;16225:1;16218:8;;;;16187:39;16250:14;16267:34;16250:51;;16341:1;16320:18;16316:1;:22;:26;;;16312:101;;;16410:3;16371:35;16362:6;:44;:51;;;;;;;;;16353:60;;16312:101;16451:1;16430:18;16426:1;:22;:26;;;16422:101;;;16520:3;16481:35;16472:6;:44;:51;;;;;;;;;16463:60;;16422:101;16561:1;16540:18;16536:1;:22;:26;;;16532:101;;;16630:3;16591:35;16582:6;:44;:51;;;;;;;;;16573:60;;16532:101;16671:1;16650:18;16646:1;:22;:26;;;16642:101;;;16740:3;16701:35;16692:6;:44;:51;;;;;;;;;16683:60;;16642:101;16780:1;16760:17;16756:1;:21;:25;;;16752:100;;;16849:3;16810:35;16801:6;:44;:51;;;;;;;;;16792:60;;16752:100;16889:1;16869:17;16865:1;:21;:25;;;16861:100;;;16958:3;16919:35;16910:6;:44;:51;;;;;;;;;16901:60;;16861:100;16998:1;16978:17;16974:1;:21;:25;;;16970:100;;;17067:3;17028:35;17019:6;:44;:51;;;;;;;;;17010:60;;16970:100;17107:1;17087:17;17083:1;:21;:25;;;17079:100;;;17176:3;17137:35;17128:6;:44;:51;;;;;;;;;17119:60;;17079:100;17215:1;17196:16;17192:1;:20;:24;;;17188:99;;;17284:3;17245:35;17236:6;:44;:51;;;;;;;;;17227:60;;17188:99;17323:1;17304:16;17300:1;:20;:24;;;17296:99;;;17392:3;17353:35;17344:6;:44;:51;;;;;;;;;17335:60;;17296:99;17431:1;17412:16;17408:1;:20;:24;;;17404:99;;;17500:3;17461:35;17452:6;:44;:51;;;;;;;;;17443:60;;17404:99;17539:1;17520:16;17516:1;:20;:24;;;17512:99;;;17608:3;17569:35;17560:6;:44;:51;;;;;;;;;17551:60;;17512:99;17646:1;17628:15;17624:1;:19;:23;;;17620:98;;;17715:3;17676:35;17667:6;:44;:51;;;;;;;;;17658:60;;17620:98;17753:1;17735:15;17731:1;:19;:23;;;17727:98;;;17822:3;17783:35;17774:6;:44;:51;;;;;;;;;17765:60;;17727:98;17860:1;17842:15;17838:1;:19;:23;;;17834:98;;;17929:3;17890:35;17881:6;:44;:51;;;;;;;;;17872:60;;17834:98;17967:1;17949:15;17945:1;:19;:23;;;17941:98;;;18036:3;17997:35;17988:6;:44;:51;;;;;;;;;17979:60;;17941:98;18073:1;18056:14;18052:1;:18;:22;;;18048:97;;;18142:3;18103:35;18094:6;:44;:51;;;;;;;;;18085:60;;18048:97;18179:1;18162:14;18158:1;:18;:22;;;18154:97;;;18248:3;18209:35;18200:6;:44;:51;;;;;;;;;18191:60;;18154:97;18285:1;18268:14;18264:1;:18;:22;;;18260:97;;;18354:3;18315:35;18306:6;:44;:51;;;;;;;;;18297:60;;18260:97;18391:1;18374:14;18370:1;:18;:22;;;18366:97;;;18460:3;18421:35;18412:6;:44;:51;;;;;;;;;18403:60;;18366:97;18496:1;18480:13;18476:1;:17;:21;;;18472:96;;;18565:3;18526:35;18517:6;:44;:51;;;;;;;;;18508:60;;18472:96;18601:1;18585:13;18581:1;:17;:21;;;18577:96;;;18670:3;18631:35;18622:6;:44;:51;;;;;;;;;18613:60;;18577:96;18706:1;18690:13;18686:1;:17;:21;;;18682:96;;;18775:3;18736:35;18727:6;:44;:51;;;;;;;;;18718:60;;18682:96;18811:1;18795:13;18791:1;:17;:21;;;18787:96;;;18880:3;18841:35;18832:6;:44;:51;;;;;;;;;18823:60;;18787:96;18915:1;18900:12;18896:1;:16;:20;;;18892:95;;;18984:3;18945:35;18936:6;:44;:51;;;;;;;;;18927:60;;18892:95;19019:1;19004:12;19000:1;:16;:20;;;18996:95;;;19088:3;19049:35;19040:6;:44;:51;;;;;;;;;19031:60;;18996:95;19123:1;19108:12;19104:1;:16;:20;;;19100:95;;;19192:3;19153:35;19144:6;:44;:51;;;;;;;;;19135:60;;19100:95;19227:1;19212:12;19208:1;:16;:20;;;19204:95;;;19296:3;19257:35;19248:6;:44;:51;;;;;;;;;19239:60;;19204:95;19330:1;19316:11;19312:1;:15;:19;;;19308:94;;;19399:3;19360:35;19351:6;:44;:51;;;;;;;;;19342:60;;19308:94;19433:1;19419:11;19415:1;:15;:19;;;19411:94;;;19502:3;19463:35;19454:6;:44;:51;;;;;;;;;19445:60;;19411:94;19536:1;19522:11;19518:1;:15;:19;;;19514:94;;;19605:3;19566:35;19557:6;:44;:51;;;;;;;;;19548:60;;19514:94;19639:1;19625:11;19621:1;:15;:19;;;19617:94;;;19708:3;19669:35;19660:6;:44;:51;;;;;;;;;19651:60;;19617:94;19741:1;19728:10;19724:1;:14;:18;;;19720:93;;;19810:3;19771:35;19762:6;:44;:51;;;;;;;;;19753:60;;19720:93;19843:1;19830:10;19826:1;:14;:18;;;19822:93;;;19912:3;19873:35;19864:6;:44;:51;;;;;;;;;19855:60;;19822:93;19945:1;19932:10;19928:1;:14;:18;;;19924:93;;;20014:3;19975:35;19966:6;:44;:51;;;;;;;;;19957:60;;19924:93;20047:1;20034:10;20030:1;:14;:18;;;20026:93;;;20116:3;20077:35;20068:6;:44;:51;;;;;;;;;20059:60;;20026:93;20148:1;20136:9;20132:1;:13;:17;;;20128:92;;;20217:3;20178:35;20169:6;:44;:51;;;;;;;;;20160:60;;20128:92;20249:1;20237:9;20233:1;:13;:17;;;20229:92;;;20318:3;20279:35;20270:6;:44;:51;;;;;;;;;20261:60;;20229:92;20350:1;20338:9;20334:1;:13;:17;;;20330:92;;;20419:3;20380:35;20371:6;:44;:51;;;;;;;;;20362:60;;20330:92;20451:1;20439:9;20435:1;:13;:17;;;20431:92;;;20520:3;20481:35;20472:6;:44;:51;;;;;;;;;20463:60;;20431:92;20551:1;20540:8;20536:1;:12;:16;;;20532:91;;;20620:3;20581:35;20572:6;:44;:51;;;;;;;;;20563:60;;20532:91;20651:1;20640:8;20636:1;:12;:16;;;20632:91;;;20720:3;20681:35;20672:6;:44;:51;;;;;;;;;20663:60;;20632:91;20751:1;20740:8;20736:1;:12;:16;;;20732:91;;;20820:3;20781:35;20772:6;:44;:51;;;;;;;;;20763:60;;20732:91;20851:1;20840:8;20836:1;:12;:16;;;20832:91;;;20920:3;20881:35;20872:6;:44;:51;;;;;;;;;20863:60;;20832:91;20950:1;20940:7;20936:1;:11;:15;;;20932:90;;;21019:3;20980:35;20971:6;:44;:51;;;;;;;;;20962:60;;20932:90;21049:1;21039:7;21035:1;:11;:15;;;21031:90;;;21118:3;21079:35;21070:6;:44;:51;;;;;;;;;21061:60;;21031:90;21148:1;21138:7;21134:1;:11;:15;;;21130:90;;;21217:3;21178:35;21169:6;:44;:51;;;;;;;;;21160:60;;21130:90;21247:1;21237:7;21233:1;:11;:15;;;21229:90;;;21316:3;21277:35;21268:6;:44;:51;;;;;;;;;21259:60;;21229:90;21345:1;21336:6;21332:1;:10;:14;;;21328:89;;;21414:3;21375:35;21366:6;:44;:51;;;;;;;;;21357:60;;21328:89;21443:1;21434:6;21430:1;:10;:14;;;21426:89;;;21512:3;21473:35;21464:6;:44;:51;;;;;;;;;21455:60;;21426:89;21541:1;21532:6;21528:1;:10;:14;;;21524:89;;;21610:3;21571:35;21562:6;:44;:51;;;;;;;;;21553:60;;21524:89;21639:1;21630:6;21626:1;:10;:14;;;21622:89;;;21708:3;21669:35;21660:6;:44;:51;;;;;;;;;21651:60;;21622:89;21736:1;21728:5;21724:1;:9;:13;;;21720:88;;;21805:3;21766:35;21757:6;:44;:51;;;;;;;;;21748:60;;21720:88;21833:1;21825:5;21821:1;:9;:13;;;21817:88;;;21902:3;21863:35;21854:6;:44;:51;;;;;;;;;21845:60;;21817:88;21930:1;21922:5;21918:1;:9;:13;;;21914:88;;;21999:3;21960:35;21951:6;:44;:51;;;;;;;;;21942:60;;21914:88;22027:1;22019:5;22015:1;:9;:13;;;22011:88;;;22096:3;22057:35;22048:6;:44;:51;;;;;;;;;22039:60;;22011:88;22123:1;22116:4;22112:1;:8;:12;;;22108:87;;;22192:3;22153:35;22144:6;:44;:51;;;;;;;;;22135:60;;22108:87;22219:1;22212:4;22208:1;:8;:12;;;22204:87;;;22288:3;22249:35;22240:6;:44;:51;;;;;;;;;22231:60;;22204:87;22315:1;22308:4;22304:1;:8;:12;;;22300:87;;;22384:3;22345:35;22336:6;:44;:51;;;;;;;;;22327:60;;22300:87;22411:1;22404:4;22400:1;:8;:12;;;22396:87;;;22480:3;22441:35;22432:6;:44;:51;;;;;;;;;22423:60;;22396:87;22506:1;22500:3;22496:1;:7;:11;;;22492:86;;;22575:3;22536:35;22527:6;:44;:51;;;;;;;;;22518:60;;22492:86;22601:1;22595:3;22591:1;:7;:11;;;22587:86;;;22670:3;22631:35;22622:6;:44;:51;;;;;;;;;22613:60;;22587:86;22696:1;22690:3;22686:1;:7;:11;;;22682:86;;;22765:3;22726:35;22717:6;:44;:51;;;;;;;;;22708:60;;22682:86;22791:1;22785:3;22781:1;:7;:11;;;22777:86;;;22860:3;22821:35;22812:6;:44;:51;;;;;;;;;22803:60;;22777:86;22913:2;22908:1;:7;;;;;;;;;;;;;;;;;;;;;22902:2;:14;22894:23;;22874:44;;;;;;;;;;;;973:34;22955:18;;22936:6;:38;;22927:48;;;;;;23009:6;22986:31;;;16047:6983;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:246::-;3156:1;3166:113;3180:6;3177:1;3174:13;3166:113;;;3265:1;3260:3;3256:11;3250:18;3246:1;3241:3;3237:11;3230:39;3202:2;3199:1;3195:10;3190:15;;3166:113;;;3313:1;3304:6;3299:3;3295:16;3288:27;3137:184;3075:246;;;:::o;3327:102::-;3368:6;3419:2;3415:7;3410:2;3403:5;3399:14;3395:28;3385:38;;3327:102;;;:::o;3435:377::-;3523:3;3551:39;3584:5;3551:39;:::i;:::-;3606:71;3670:6;3665:3;3606:71;:::i;:::-;3599:78;;3686:65;3744:6;3739:3;3732:4;3725:5;3721:16;3686:65;:::i;:::-;3776:29;3798:6;3776:29;:::i;:::-;3771:3;3767:39;3760:46;;3527:285;3435:377;;;;:::o;3818:313::-;3931:4;3969:2;3958:9;3954:18;3946:26;;4018:9;4012:4;4008:20;4004:1;3993:9;3989:17;3982:47;4046:78;4119:4;4110:6;4046:78;:::i;:::-;4038:86;;3818:313;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:92::-;4926:7;4970:5;4966:2;4955:21;4944:32;;4890:92;;;:::o;4988:115::-;5073:23;5090:5;5073:23;:::i;:::-;5068:3;5061:36;4988:115;;:::o;5109:218::-;5200:4;5238:2;5227:9;5223:18;5215:26;;5251:69;5317:1;5306:9;5302:17;5293:6;5251:69;:::i;:::-;5109:218;;;;:::o;5333:120::-;5405:23;5422:5;5405:23;:::i;:::-;5398:5;5395:34;5385:62;;5443:1;5440;5433:12;5385:62;5333:120;:::o;5459:137::-;5504:5;5542:6;5529:20;5520:29;;5558:32;5584:5;5558:32;:::i;:::-;5459:137;;;;:::o;5602:472::-;5669:6;5677;5726:2;5714:9;5705:7;5701:23;5697:32;5694:119;;;5732:79;;:::i;:::-;5694:119;5852:1;5877:53;5922:7;5913:6;5902:9;5898:22;5877:53;:::i;:::-;5867:63;;5823:117;5979:2;6005:52;6049:7;6040:6;6029:9;6025:22;6005:52;:::i;:::-;5995:62;;5950:117;5602:472;;;;;:::o;6080:117::-;6189:1;6186;6179:12;6203:180;6251:77;6248:1;6241:88;6348:4;6345:1;6338:15;6372:4;6369:1;6362:15;6389:281;6472:27;6494:4;6472:27;:::i;:::-;6464:6;6460:40;6602:6;6590:10;6587:22;6566:18;6554:10;6551:34;6548:62;6545:88;;;6613:18;;:::i;:::-;6545:88;6653:10;6649:2;6642:22;6432:238;6389:281;;:::o;6676:129::-;6710:6;6737:20;;:::i;:::-;6727:30;;6766:33;6794:4;6786:6;6766:33;:::i;:::-;6676:129;;;:::o;6934:93::-;6970:7;7010:10;7003:5;6999:22;6988:33;;6934:93;;;:::o;7033:120::-;7105:23;7122:5;7105:23;:::i;:::-;7098:5;7095:34;7085:62;;7143:1;7140;7133:12;7085:62;7033:120;:::o;7159:137::-;7204:5;7242:6;7229:20;7220:29;;7258:32;7284:5;7258:32;:::i;:::-;7159:137;;;;:::o;7302:103::-;7338:7;7378:20;7371:5;7367:32;7356:43;;7302:103;;;:::o;7411:120::-;7483:23;7500:5;7483:23;:::i;:::-;7476:5;7473:34;7463:62;;7521:1;7518;7511:12;7463:62;7411:120;:::o;7537:137::-;7582:5;7620:6;7607:20;7598:29;;7636:32;7662:5;7636:32;:::i;:::-;7537:137;;;;:::o;7680:101::-;7716:7;7756:18;7749:5;7745:30;7734:41;;7680:101;;;:::o;7787:120::-;7859:23;7876:5;7859:23;:::i;:::-;7852:5;7849:34;7839:62;;7897:1;7894;7887:12;7839:62;7787:120;:::o;7913:137::-;7958:5;7996:6;7983:20;7974:29;;8012:32;8038:5;8012:32;:::i;:::-;7913:137;;;;:::o;8115:751::-;8200:5;8244:4;8232:9;8227:3;8223:19;8219:30;8216:117;;;8252:79;;:::i;:::-;8216:117;8351:21;8367:4;8351:21;:::i;:::-;8342:30;;8433:1;8473:48;8517:3;8508:6;8497:9;8493:22;8473:48;:::i;:::-;8466:4;8459:5;8455:16;8448:74;8382:151;8593:2;8634:48;8678:3;8669:6;8658:9;8654:22;8634:48;:::i;:::-;8627:4;8620:5;8616:16;8609:74;8543:151;8758:2;8799:48;8843:3;8834:6;8823:9;8819:22;8799:48;:::i;:::-;8792:4;8785:5;8781:16;8774:74;8704:155;8115:751;;;;:::o;8872:401::-;8967:6;9016:2;9004:9;8995:7;8991:23;8987:32;8984:119;;;9022:79;;:::i;:::-;8984:119;9142:1;9167:89;9248:7;9239:6;9228:9;9224:22;9167:89;:::i;:::-;9157:99;;9113:153;8872:401;;;;:::o;9279:619::-;9356:6;9364;9372;9421:2;9409:9;9400:7;9396:23;9392:32;9389:119;;;9427:79;;:::i;:::-;9389:119;9547:1;9572:53;9617:7;9608:6;9597:9;9593:22;9572:53;:::i;:::-;9562:63;;9518:117;9674:2;9700:53;9745:7;9736:6;9725:9;9721:22;9700:53;:::i;:::-;9690:63;;9645:118;9802:2;9828:53;9873:7;9864:6;9853:9;9849:22;9828:53;:::i;:::-;9818:63;;9773:118;9279:619;;;;;:::o;9904:329::-;9963:6;10012:2;10000:9;9991:7;9987:23;9983:32;9980:119;;;10018:79;;:::i;:::-;9980:119;10138:1;10163:53;10208:7;10199:6;10188:9;10184:22;10163:53;:::i;:::-;10153:63;;10109:117;9904:329;;;;:::o;10239:474::-;10307:6;10315;10364:2;10352:9;10343:7;10339:23;10335:32;10332:119;;;10370:79;;:::i;:::-;10332:119;10490:1;10515:53;10560:7;10551:6;10540:9;10536:22;10515:53;:::i;:::-;10505:63;;10461:117;10617:2;10643:53;10688:7;10679:6;10668:9;10664:22;10643:53;:::i;:::-;10633:63;;10588:118;10239:474;;;;;:::o;10719:115::-;10804:23;10821:5;10804:23;:::i;:::-;10799:3;10792:36;10719:115;;:::o;10840:::-;10925:23;10942:5;10925:23;:::i;:::-;10920:3;10913:36;10840:115;;:::o;10961:::-;11046:23;11063:5;11046:23;:::i;:::-;11041:3;11034:36;10961:115;;:::o;11082:430::-;11225:4;11263:2;11252:9;11248:18;11240:26;;11276:69;11342:1;11331:9;11327:17;11318:6;11276:69;:::i;:::-;11355:70;11421:2;11410:9;11406:18;11397:6;11355:70;:::i;:::-;11435;11501:2;11490:9;11486:18;11477:6;11435:70;:::i;:::-;11082:430;;;;;;:::o;11518:117::-;11627:1;11624;11617:12;11641:117;11750:1;11747;11740:12;11764:117;11873:1;11870;11863:12;11900:552;11957:8;11967:6;12017:3;12010:4;12002:6;11998:17;11994:27;11984:122;;12025:79;;:::i;:::-;11984:122;12138:6;12125:20;12115:30;;12168:18;12160:6;12157:30;12154:117;;;12190:79;;:::i;:::-;12154:117;12304:4;12296:6;12292:17;12280:29;;12358:3;12350:4;12342:6;12338:17;12328:8;12324:32;12321:41;12318:128;;;12365:79;;:::i;:::-;12318:128;11900:552;;;;;:::o;12458:817::-;12546:6;12554;12562;12570;12619:2;12607:9;12598:7;12594:23;12590:32;12587:119;;;12625:79;;:::i;:::-;12587:119;12745:1;12770:53;12815:7;12806:6;12795:9;12791:22;12770:53;:::i;:::-;12760:63;;12716:117;12872:2;12898:53;12943:7;12934:6;12923:9;12919:22;12898:53;:::i;:::-;12888:63;;12843:118;13028:2;13017:9;13013:18;13000:32;13059:18;13051:6;13048:30;13045:117;;;13081:79;;:::i;:::-;13045:117;13194:64;13250:7;13241:6;13230:9;13226:22;13194:64;:::i;:::-;13176:82;;;;12971:297;12458:817;;;;;;;:::o;13281:86::-;13316:7;13356:4;13349:5;13345:16;13334:27;;13281:86;;;:::o;13373:112::-;13456:22;13472:5;13456:22;:::i;:::-;13451:3;13444:35;13373:112;;:::o;13491:214::-;13580:4;13618:2;13607:9;13603:18;13595:26;;13631:67;13695:1;13684:9;13680:17;13671:6;13631:67;:::i;:::-;13491:214;;;;:::o;13711:118::-;13798:24;13816:5;13798:24;:::i;:::-;13793:3;13786:37;13711:118;;:::o;13835:222::-;13928:4;13966:2;13955:9;13951:18;13943:26;;13979:71;14047:1;14036:9;14032:17;14023:6;13979:71;:::i;:::-;13835:222;;;;:::o;14063:763::-;14148:6;14156;14164;14172;14221:3;14209:9;14200:7;14196:23;14192:33;14189:120;;;14228:79;;:::i;:::-;14189:120;14348:1;14373:53;14418:7;14409:6;14398:9;14394:22;14373:53;:::i;:::-;14363:63;;14319:117;14475:2;14501:52;14545:7;14536:6;14525:9;14521:22;14501:52;:::i;:::-;14491:62;;14446:117;14602:2;14628:53;14673:7;14664:6;14653:9;14649:22;14628:53;:::i;:::-;14618:63;;14573:118;14730:2;14756:53;14801:7;14792:6;14781:9;14777:22;14756:53;:::i;:::-;14746:63;;14701:118;14063:763;;;;;;;:::o;14832:105::-;14907:23;14924:5;14907:23;:::i;:::-;14902:3;14895:36;14832:105;;:::o;14943:::-;15018:23;15035:5;15018:23;:::i;:::-;15013:3;15006:36;14943:105;;:::o;15054:::-;15129:23;15146:5;15129:23;:::i;:::-;15124:3;15117:36;15054:105;;:::o;15279:705::-;15448:4;15443:3;15439:14;15537:4;15530:5;15526:16;15520:23;15556:61;15611:4;15606:3;15602:14;15588:12;15556:61;:::i;:::-;15463:164;15710:4;15703:5;15699:16;15693:23;15729:61;15784:4;15779:3;15775:14;15761:12;15729:61;:::i;:::-;15637:163;15887:4;15880:5;15876:16;15870:23;15906:61;15961:4;15956:3;15952:14;15938:12;15906:61;:::i;:::-;15810:167;15417:567;15279:705;;:::o;15990:366::-;16155:4;16193:2;16182:9;16178:18;16170:26;;16206:143;16346:1;16335:9;16331:17;16322:6;16206:143;:::i;:::-;15990:366;;;;:::o;16362:118::-;16399:7;16439:34;16432:5;16428:46;16417:57;;16362:118;;;:::o;16486:::-;16573:24;16591:5;16573:24;:::i;:::-;16568:3;16561:37;16486:118;;:::o;16610:222::-;16703:4;16741:2;16730:9;16726:18;16718:26;;16754:71;16822:1;16811:9;16807:17;16798:6;16754:71;:::i;:::-;16610:222;;;;:::o;16838:180::-;16886:77;16883:1;16876:88;16983:4;16980:1;16973:15;17007:4;17004:1;16997:15;17024:191;17064:3;17083:20;17101:1;17083:20;:::i;:::-;17078:25;;17117:20;17135:1;17117:20;:::i;:::-;17112:25;;17160:1;17157;17153:9;17146:16;;17181:3;17178:1;17175:10;17172:36;;;17188:18;;:::i;:::-;17172:36;17024:191;;;;:::o;17221:180::-;17269:77;17266:1;17259:88;17366:4;17363:1;17356:15;17390:4;17387:1;17380:15;17407:320;17451:6;17488:1;17482:4;17478:12;17468:22;;17535:1;17529:4;17525:12;17556:18;17546:81;;17612:4;17604:6;17600:17;17590:27;;17546:81;17674:2;17666:6;17663:14;17643:18;17640:38;17637:84;;17693:18;;:::i;:::-;17637:84;17458:269;17407:320;;;:::o;17733:157::-;17873:9;17869:1;17861:6;17857:14;17850:33;17733:157;:::o;17896:365::-;18038:3;18059:66;18123:1;18118:3;18059:66;:::i;:::-;18052:73;;18134:93;18223:3;18134:93;:::i;:::-;18252:2;18247:3;18243:12;18236:19;;17896:365;;;:::o;18267:419::-;18433:4;18471:2;18460:9;18456:18;18448:26;;18520:9;18514:4;18510:20;18506:1;18495:9;18491:17;18484:47;18548:131;18674:4;18548:131;:::i;:::-;18540:139;;18267:419;;;:::o;18692:160::-;18832:12;18828:1;18820:6;18816:14;18809:36;18692:160;:::o;18858:366::-;19000:3;19021:67;19085:2;19080:3;19021:67;:::i;:::-;19014:74;;19097:93;19186:3;19097:93;:::i;:::-;19215:2;19210:3;19206:12;19199:19;;18858:366;;;:::o;19230:419::-;19396:4;19434:2;19423:9;19419:18;19411:26;;19483:9;19477:4;19473:20;19469:1;19458:9;19454:17;19447:47;19511:131;19637:4;19511:131;:::i;:::-;19503:139;;19230:419;;;:::o;19655:194::-;19695:4;19715:20;19733:1;19715:20;:::i;:::-;19710:25;;19749:20;19767:1;19749:20;:::i;:::-;19744:25;;19793:1;19790;19786:9;19778:17;;19817:1;19811:4;19808:11;19805:37;;;19822:18;;:::i;:::-;19805:37;19655:194;;;;:::o;19855:160::-;19995:12;19991:1;19983:6;19979:14;19972:36;19855:160;:::o;20021:366::-;20163:3;20184:67;20248:2;20243:3;20184:67;:::i;:::-;20177:74;;20260:93;20349:3;20260:93;:::i;:::-;20378:2;20373:3;20369:12;20362:19;;20021:366;;;:::o;20393:419::-;20559:4;20597:2;20586:9;20582:18;20574:26;;20646:9;20640:4;20636:20;20632:1;20621:9;20617:17;20610:47;20674:131;20800:4;20674:131;:::i;:::-;20666:139;;20393:419;;;:::o;20818:168::-;20958:20;20954:1;20946:6;20942:14;20935:44;20818:168;:::o;20992:366::-;21134:3;21155:67;21219:2;21214:3;21155:67;:::i;:::-;21148:74;;21231:93;21320:3;21231:93;:::i;:::-;21349:2;21344:3;21340:12;21333:19;;20992:366;;;:::o;21364:419::-;21530:4;21568:2;21557:9;21553:18;21545:26;;21617:9;21611:4;21607:20;21603:1;21592:9;21588:17;21581:47;21645:131;21771:4;21645:131;:::i;:::-;21637:139;;21364:419;;;:::o;21789:410::-;21829:7;21852:20;21870:1;21852:20;:::i;:::-;21847:25;;21886:20;21904:1;21886:20;:::i;:::-;21881:25;;21941:1;21938;21934:9;21963:30;21981:11;21963:30;:::i;:::-;21952:41;;22142:1;22133:7;22129:15;22126:1;22123:22;22103:1;22096:9;22076:83;22053:139;;22172:18;;:::i;:::-;22053:139;21837:362;21789:410;;;;:::o;22205:180::-;22253:77;22250:1;22243:88;22350:4;22347:1;22340:15;22374:4;22371:1;22364:15;22391:185;22431:1;22448:20;22466:1;22448:20;:::i;:::-;22443:25;;22482:20;22500:1;22482:20;:::i;:::-;22477:25;;22521:1;22511:35;;22526:18;;:::i;:::-;22511:35;22568:1;22565;22561:9;22556:14;;22391:185;;;;:::o;22582:167::-;22722:19;22718:1;22710:6;22706:14;22699:43;22582:167;:::o;22755:366::-;22897:3;22918:67;22982:2;22977:3;22918:67;:::i;:::-;22911:74;;22994:93;23083:3;22994:93;:::i;:::-;23112:2;23107:3;23103:12;23096:19;;22755:366;;;:::o;23127:419::-;23293:4;23331:2;23320:9;23316:18;23308:26;;23380:9;23374:4;23370:20;23366:1;23355:9;23351:17;23344:47;23408:131;23534:4;23408:131;:::i;:::-;23400:139;;23127:419;;;:::o;23552:168::-;23692:20;23688:1;23680:6;23676:14;23669:44;23552:168;:::o;23726:366::-;23868:3;23889:67;23953:2;23948:3;23889:67;:::i;:::-;23882:74;;23965:93;24054:3;23965:93;:::i;:::-;24083:2;24078:3;24074:12;24067:19;;23726:366;;;:::o;24098:419::-;24264:4;24302:2;24291:9;24287:18;24279:26;;24351:9;24345:4;24341:20;24337:1;24326:9;24322:17;24315:47;24379:131;24505:4;24379:131;:::i;:::-;24371:139;;24098:419;;;:::o;24523:180::-;24571:77;24568:1;24561:88;24668:4;24665:1;24658:15;24692:4;24689:1;24682:15;24709:163;24849:15;24845:1;24837:6;24833:14;24826:39;24709:163;:::o;24878:366::-;25020:3;25041:67;25105:2;25100:3;25041:67;:::i;:::-;25034:74;;25117:93;25206:3;25117:93;:::i;:::-;25235:2;25230:3;25226:12;25219:19;;24878:366;;;:::o;25250:419::-;25416:4;25454:2;25443:9;25439:18;25431:26;;25503:9;25497:4;25493:20;25489:1;25478:9;25474:17;25467:47;25531:131;25657:4;25531:131;:::i;:::-;25523:139;;25250:419;;;:::o;25675:122::-;25748:24;25766:5;25748:24;:::i;:::-;25741:5;25738:35;25728:63;;25787:1;25784;25777:12;25728:63;25675:122;:::o;25803:143::-;25860:5;25891:6;25885:13;25876:22;;25907:33;25934:5;25907:33;:::i;:::-;25803:143;;;;:::o;25952:351::-;26022:6;26071:2;26059:9;26050:7;26046:23;26042:32;26039:119;;;26077:79;;:::i;:::-;26039:119;26197:1;26222:64;26278:7;26269:6;26258:9;26254:22;26222:64;:::i;:::-;26212:74;;26168:128;25952:351;;;;:::o

Swarm Source

ipfs://328f0fbbc2c230ab0b2baa7351327ca952449758c2fcb28fb33fe2b826f38dba
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.