Contract 0x97e39e159537949e91dE05C2Cf10E6D5ee83Cf27

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x75710aaad5997067587748d07bb2af51da6b652e0d50bcf8ca38507e0a39d19eTransfer226980832023-11-28 8:26:522 days 10 hrs ago0xb74d34c78398ff709849a729303161c84e7db6b0 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0xa8bcc6c14bfdde7f32631a71fc3dfdb4d398b026ba0d0df0b57bc0f65966a32bTransfer226980652023-11-28 8:25:222 days 10 hrs ago0xb74d34c78398ff709849a729303161c84e7db6b0 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0xd2db2250129b541d6b07c55ab75bc76b3655afc7c3a13936296c445782351bb3Transfer226980542023-11-28 8:24:272 days 10 hrs ago0xdd185316108c34b85c12347eaa8267f881c89d07 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0x80e590266e46860e8e0c666f36e9aec1a9d4f9192b54bbadf6928ea11ca362a2Transfer226980462023-11-28 8:23:472 days 10 hrs ago0xdd185316108c34b85c12347eaa8267f881c89d07 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.00036544
0xdf4a89e6ed02a63c2a834bac6701ea16abb96ebca154632b64eea491c5886f88Transfer226972962023-11-28 7:21:172 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0xf34078a1a2af6e7889d6c80bc71d7039da780bb4a60398d7adc47025e27bd3a7Transfer226972922023-11-28 7:20:572 days 11 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x474a894eacc8b6ce7ead88e1f4d4cd90ae4a20d7081327c6f43f7e3799239fd9Transfer226972892023-11-28 7:20:422 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0x5551c7de6d1693229ca64731e9a879b3d4f0d32d4c2b8ba758eb027783421abeTransfer226972822023-11-28 7:20:072 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0xb6f0d0a38c3eaf063c7e503ab4b66242b39a154ceed3b456b0655c2f739d302cTransfer226972772023-11-28 7:19:422 days 11 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x336db52fe78fa43f4d0bc21c7001071a333d0ca010d619265087e4958a75c838Transfer226972762023-11-28 7:19:372 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0x9a72484939da56e4a8ae7d9f8f1a5a0eddbe3b9121d51b6a693fdf4d6eebe8c3Transfer226972682023-11-28 7:18:572 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0xb6eb578cb487c7482a37bbf8e782a8d3a254b192da5058a79741cd914a033889Transfer226972642023-11-28 7:18:372 days 11 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x9a03f8f915993a73bc8f871f0ad9a338eec854cc8b34c0fdcd650dcaf218a3eeTransfer226972602023-11-28 7:18:172 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0x077f8be5fc08a35437abd418f04b19fc8bec8a3a4838237c5656dadbebfeb9aeTransfer226972582023-11-28 7:18:072 days 11 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x1843a75a68f793bffaf0e6e34d65be53a9868e53d1d044fd1b3a72ad125a1b64Transfer226972532023-11-28 7:17:422 days 11 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0xf21a488efd4b153d8659ab1971052b21d690c1d6c636d352b6ed7aa92c30b46fTransfer226972472023-11-28 7:17:122 days 11 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0x3a016e9c8efaee9a33eecd50018f19e54c7645121aacb8c5cb2f9fecdfad2d88Transfer226972402023-11-28 7:16:372 days 11 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.00036132
0xa3afd7178cb2302a1d832ae9a5a5954a07f28ddde8253d5aa36cc01547346862Transfer226116872023-11-23 8:10:567 days 10 hrs ago0xf9281a84f1c2190668d2aa18bbcc4940560f52f7 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
0x886fd8c4ab266c1c78d24abb4ef0b78402e95c3b627047a153b70986f6559ad6Transfer226116732023-11-23 8:09:467 days 10 hrs ago0x8f8f368017cd92a2232efbd305fbf8c9dddd8955 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x3b193f7b743c170ec22e3e1b957a54b16000dd1d1e4bd55abd4b540a511040f4Transfer226116722023-11-23 8:09:417 days 10 hrs ago0xb914a0d1469d8a263cf974e8d09fcc88393189b4 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0xeb39853c0dd785b767fd4eae307edd52bb7f75c96b731971233bf9c06916e4c7Transfer226116712023-11-23 8:09:367 days 10 hrs ago0x5f797af6fb6af7bf37cddb21ad8179ee35dbab57 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x04ccfaefb33a75d81716941ec9abf80c47f67f56ac069f812ea6a8588feaed5eTransfer226116712023-11-23 8:09:367 days 10 hrs ago0xdd185316108c34b85c12347eaa8267f881c89d07 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0xc05517e33ca2cf31937ac8360b1c587430ac57c700b3dc51b3ca24aa17b27b33Transfer226116682023-11-23 8:09:217 days 10 hrs ago0xee461da84f8e8823d51c3975748a381686ae1194 IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0xdd00fd2f0cadae7396a1487edfde0a4789600fe349a496049aee42edb696834dTransfer226116662023-11-23 8:09:117 days 10 hrs ago0x79ac66a0fd8bdf999aaaf87953679e6bc531081c IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000278175
0x350327636fc637ff7d34bcf6155cddefef9150176f90dd451a0960589da0d718Transfer226116662023-11-23 8:09:117 days 10 hrs ago0x6843f26b206d60ae5f80ea04c78e65ec3e0b557d IN  0x97e39e159537949e91de05c2cf10e6d5ee83cf270 CELO0.000363895
[ 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.