Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60e06040 | 13947387 | 1051 days ago | IN | 0 ETH | 0.696178 |
Loading...
Loading
Contract Name:
GmRenderer
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import {InflateLib} from "./InflateLib.sol"; import {GmDataInterface} from "./GmDataInterface.sol"; import {StringsUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; interface ICourierFont { function font() external view returns (string memory); } contract GmRenderer { ICourierFont private immutable font; GmDataInterface private immutable gmData1; GmDataInterface private immutable gmData2; struct Color { bytes hexNum; bytes name; } constructor( ICourierFont fontAddress, GmDataInterface gmData1Address, GmDataInterface gmData2Address ) { font = fontAddress; gmData1 = gmData1Address; gmData2 = gmData2Address; } /// @notice decompresses the GmDataSet /// @param gmData, compressed ascii svg data function decompress(GmDataInterface.GmDataSet memory gmData) public pure returns (bytes memory, bytes memory) { (, bytes memory inflated) = InflateLib.puff( gmData.compressedImage, gmData.compressedSize ); return (gmData.imageName, inflated); } /// @notice returns an svg filter /// @param index, a random number derived from the seed function _getFilter(uint256 index) internal pure returns (bytes memory) { // 1 || 2 || 3 || 4 || 5 -> noise 5% if ( (index == 1) || (index == 2) || (index == 3) || (index == 4) || (index == 5) ) { return "noise"; } // 7 || 8 || 98 -> scribble 3% if ((index == 7) || (index == 8) || (index == 9)) { return "scribble"; } // 10 - 29 -> morph 20% if (((100 - index) > 70) && ((100 - index) <= 90)) { return "morph"; } // 30 - 39 -> glow 10% if (((100 - index) > 60) && ((100 - index) <= 70)) { return "glow"; } // 69 -> fractal 1% if (index == 69) { return "fractal"; } return "none"; } /// @notice returns a background color and font color /// @param seed, pseudo random seed function _getColors(bytes32 seed) internal pure returns (Color memory bgColor, Color memory fontColor) { uint32 bgRand = uint32(bytes4(seed)) % 111; uint32 fontJitter = uint32(bytes4(seed << 32)) % 5; uint32 fontOperation = uint8(bytes1(seed << 64)) % 2; uint32 fontRand; if (fontOperation == 0) { fontRand = (bgRand + (55 + fontJitter)) % 111; } else { fontRand = (bgRand + (55 - fontJitter)) % 111; } return (_getColor(bgRand), _getColor(fontRand)); } /// @notice executes string comparison against two strings /// @param a, first string /// @param b, second string function strCompare(string memory a, string memory b) internal pure returns (bool) { if(bytes(a).length != bytes(b).length) { return false; } else { return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b)); } } /// @notice returns the raw svg yielded by seed /// @param seed, pseudo random seed function svgRaw(bytes32 seed) external view returns ( bytes memory, bytes memory, bytes memory, bytes memory, bytes memory ) { uint32 style = uint32(bytes4(seed << 65)) % 69; uint32 filterRand = uint32(bytes4(seed << 97)) % 100; bytes memory filter = _getFilter(filterRand); (Color memory bgColor, Color memory fontColor) = _getColors(seed); bytes memory inner; bytes memory name; if (style < 50) { (name, inner) = decompress(gmData1.getSvg(style)); } else { (name, inner) = decompress(gmData2.getSvg(style)); } if ((strCompare(string(name), "Hex")) || (strCompare(string(name), "Binary")) || (strCompare(string(name), "Morse")) || (strCompare(string(name), "Mnemonic"))){ filter = "none"; } return ( abi.encodePacked( svgPreambleString(bgColor.hexNum, fontColor.hexNum, filter), inner, "</svg>" ), name, bgColor.name, fontColor.name, filter ); } /// @notice returns the svg filters function svgFilterDefs() private view returns (bytes memory) { return abi.encodePacked( '<defs><filter id="fractal" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%" ><feTurbulence id="turbulence" type="fractalNoise" baseFrequency="0.03" numOctaves="1" ><animate attributeName="baseFrequency" values="0.01;0.4;0.01" dur="100s" repeatCount="indefinite" /></feTurbulence><feDisplacementMap in="SourceGraphic" scale="50"></feDisplacementMap></filter><filter id="morph"><feMorphology operator="dilate" radius="0"><animate attributeName="radius" values="0;5;0" dur="8s" repeatCount="indefinite" /></feMorphology></filter><filter id="glow" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%" ><feGaussianBlur stdDeviation="5" result="blur2" in="SourceGraphic" /><feMerge><feMergeNode in="blur2" /><feMergeNode in="SourceGraphic" /></feMerge></filter><filter id="noise"><feTurbulence baseFrequency="0.05"/><feColorMatrix type="hueRotate" values="0"><animate attributeName="values" from="0" to="360" dur="1s" repeatCount="indefinite"/></feColorMatrix><feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0"/><feDisplacementMap in="SourceGraphic" scale="10"/></filter><filter id="none"><feOffset></feOffset></filter><filter id="scribble"><feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2" result="turbulence"/><feDisplacementMap in2="turbulence" in="SourceGraphic" scale="50" xChannelSelector="R" yChannelSelector="G"/></filter><filter id="tile" x="10" y="10" width="10%" height="10%"><feTile in="SourceGraphic" x="10" y="10" width="10" height="10" /><feTile/></filter></defs>' ); } /// @notice returns the svg preamble /// @param bgColor, color of the background as hex string /// @param fontColor, color of the font as hex string /// @param filter, filter for the svg function svgPreambleString( bytes memory bgColor, bytes memory fontColor, bytes memory filter ) private view returns (bytes memory) { return abi.encodePacked( "<svg viewBox='0 0 640 640' width='100%' height='100%' xmlns='http://www.w3.org/2000/svg'><style> @font-face { font-family: CourierFont; src: url('", font.font(), "') format('opentype'); }", ".base{filter:url(#", filter, ");fill:", fontColor, ";font-family:CourierFont;font-size: 16px;}</style>", svgFilterDefs(), '<rect width="100%" height="100%" fill="', bgColor, '" /> ' ); } /// @notice returns the Color yielded by index /// @param index, random number determined by seed function _getColor(uint32 index) internal pure returns (Color memory color) { // AUTOGEN:START if (index == 0) { color.hexNum = "#000000"; color.name = "Black"; } if (index == 1) { color.hexNum = "#004c6a"; color.name = "Navy Dark Blue"; } if (index == 2) { color.hexNum = "#0098d4"; color.name = "Bayern Blue"; } if (index == 3) { color.hexNum = "#00e436"; color.name = "Lexaloffle Green"; } if (index == 4) { color.hexNum = "#1034a6"; color.name = "Egyptian Blue"; } if (index == 5) { color.hexNum = "#008811"; color.name = "Lush Garden"; } if (index == 6) { color.hexNum = "#06d078"; color.name = "Underwater Fern"; } if (index == 7) { color.hexNum = "#1c1cf0"; color.name = "Bluebonnet"; } if (index == 8) { color.hexNum = "#127453"; color.name = "Green Velvet"; } if (index == 9) { color.hexNum = "#14bab4"; color.name = "Super Rare Jade"; } if (index == 10) { color.hexNum = "#111122"; color.name = "Corbeau"; } if (index == 11) { color.hexNum = "#165d95"; color.name = "Lapis Jewel"; } if (index == 12) { color.hexNum = "#16b8f3"; color.name = "Zima Blue"; } if (index == 13) { color.hexNum = "#1ef876"; color.name = "Synthetic Spearmint"; } if (index == 14) { color.hexNum = "#214fc6"; color.name = "New Car"; } if (index == 15) { color.hexNum = "#249148"; color.name = "Paperboy's Lawn"; } if (index == 16) { color.hexNum = "#24da91"; color.name = "Reptile Green"; } if (index == 17) { color.hexNum = "#223311"; color.name = "Darkest Forest"; } if (index == 18) { color.hexNum = "#297f6d"; color.name = "Mermaid Sea"; } if (index == 19) { color.hexNum = "#22cccc"; color.name = "Mermaid Net"; } if (index == 20) { color.hexNum = "#2e2249"; color.name = "Elderberry"; } if (index == 21) { color.hexNum = "#326ab1"; color.name = "Dover Straits"; } if (index == 22) { color.hexNum = "#2bc51b"; color.name = "Felwood Leaves"; } if (index == 23) { color.hexNum = "#391285"; color.name = "Pixie Powder"; } if (index == 24) { color.hexNum = "#2e58e8"; color.name = "Veteran's Day Blue"; } if (index == 25) { color.hexNum = "#419f59"; color.name = "Chateau Green"; } if (index == 26) { color.hexNum = "#45e9c1"; color.name = "Aphrodite Aqua"; } if (index == 27) { color.hexNum = "#424330"; color.name = "Garden Path"; } if (index == 28) { color.hexNum = "#429395"; color.name = "Catalan"; } if (index == 29) { color.hexNum = "#44dd00"; color.name = "Magic Blade"; } if (index == 30) { color.hexNum = "#432e6f"; color.name = "Her Highness"; } if (index == 31) { color.hexNum = "#4477dd"; color.name = "Andrea Blue"; } if (index == 32) { color.hexNum = "#5ad33e"; color.name = "Verdant Fields"; } if (index == 33) { color.hexNum = "#3a18b1"; color.name = "Indigo Blue"; } if (index == 34) { color.hexNum = "#556611"; color.name = "Forestial Outpost"; } if (index == 35) { color.hexNum = "#55bb88"; color.name = "Bleached Olive"; } if (index == 36) { color.hexNum = "#5500ee"; color.name = "Tezcatlipoca Blue"; } if (index == 37) { color.hexNum = "#545554"; color.name = "Carbon Copy"; } if (index == 38) { color.hexNum = "#58a0bc"; color.name = "Dupain"; } if (index == 39) { color.hexNum = "#55ff22"; color.name = "Traffic Green"; } if (index == 40) { color.hexNum = "#5b3e90"; color.name = "Daisy Bush"; } if (index == 41) { color.hexNum = "#6688ff"; color.name = "Deep Denim"; } if (index == 42) { color.hexNum = "#61e160"; color.name = "Lightish Green"; } if (index == 43) { color.hexNum = "#6a31ca"; color.name = "Sagat Purple"; } if (index == 44) { color.hexNum = "#667c3e"; color.name = "Military Green"; } if (index == 45) { color.hexNum = "#68c89d"; color.name = "Intense Jade"; } if (index == 46) { color.hexNum = "#6d1008"; color.name = "Chestnut Brown"; } if (index == 47) { color.hexNum = "#696374"; color.name = "Purple Punch"; } if (index == 48) { color.hexNum = "#6fb7e0"; color.name = "Life Force"; } if (index == 49) { color.hexNum = "#770044"; color.name = "Dawn of the Fairies"; } if (index == 50) { color.hexNum = "#7851a9"; color.name = "Royal Lavender"; } if (index == 51) { color.hexNum = "#769c18"; color.name = "Luminescent Green"; } if (index == 52) { color.hexNum = "#7be892"; color.name = "Ragweed"; } if (index == 53) { color.hexNum = "#703be7"; color.name = "Bluish Purple"; } if (index == 54) { color.hexNum = "#7b8b5d"; color.name = "Sage Leaves"; } if (index == 55) { color.hexNum = "#82d9c5"; color.name = "Tender Turquoise"; } if (index == 56) { color.hexNum = "#7e2530"; color.name = "Scarlet Shade"; } if (index == 57) { color.hexNum = "#83769c"; color.name = "Voxatron Purple"; } if (index == 58) { color.hexNum = "#88cc00"; color.name = "Fabulous Frog"; } if (index == 59) { color.hexNum = "#881166"; color.name = "Possessed Purple"; } if (index == 60) { color.hexNum = "#8756e4"; color.name = "Gloomy Purple"; } if (index == 61) { color.hexNum = "#93b13d"; color.name = "Green Tea Ice Cream"; } if (index == 62) { color.hexNum = "#90fda9"; color.name = "Foam Green"; } if (index == 63) { color.hexNum = "#914b13"; color.name = "Parasite Brown"; } if (index == 64) { color.hexNum = "#919c81"; color.name = "Whispering Willow"; } if (index == 65) { color.hexNum = "#99eeee"; color.name = "Freezy Breezy"; } if (index == 66) { color.hexNum = "#983d53"; color.name = "Algae Red"; } if (index == 67) { color.hexNum = "#9c87c1"; color.name = "Petrified Purple"; } if (index == 68) { color.hexNum = "#98da2c"; color.name = "Effervescent Lime"; } if (index == 69) { color.hexNum = "#942193"; color.name = "Acai Juice"; } if (index == 70) { color.hexNum = "#a675fe"; color.name = "Purple Illusionist"; } if (index == 71) { color.hexNum = "#a4c161"; color.name = "Jungle Juice"; } if (index == 72) { color.hexNum = "#aa00cc"; color.name = "Ferocious Fuchsia"; } if (index == 73) { color.hexNum = "#a85e39"; color.name = "Earthen Jug"; } if (index == 74) { color.hexNum = "#aaa9a4"; color.name = "Ellie Grey"; } if (index == 75) { color.hexNum = "#aaee11"; color.name = "Glorious Green Glitter"; } if (index == 76) { color.hexNum = "#ad4379"; color.name = "Mystic Maroon"; } if (index == 77) { color.hexNum = "#b195e4"; color.name = "Dreamy Candy Forest"; } if (index == 78) { color.hexNum = "#b1dd52"; color.name = "Conifer"; } if (index == 79) { color.hexNum = "#c034af"; color.name = "Pink Perennial"; } if (index == 80) { color.hexNum = "#b78727"; color.name = "University of California Gold"; } if (index == 81) { color.hexNum = "#b9d08b"; color.name = "Young Leaves"; } if (index == 82) { color.hexNum = "#bb11ee"; color.name = "Promiscuous Pink"; } if (index == 83) { color.hexNum = "#c06960"; color.name = "Tapestry Red"; } if (index == 84) { color.hexNum = "#bebbc9"; color.name = "Silverberry"; } if (index == 85) { color.hexNum = "#bf0a30"; color.name = "Old Glory Red"; } if (index == 86) { color.hexNum = "#c35b99"; color.name = "Llilacquered"; } if (index == 87) { color.hexNum = "#caa906"; color.name = "Christmas Gold"; } if (index == 88) { color.hexNum = "#c2f177"; color.name = "Cucumber Milk"; } if (index == 89) { color.hexNum = "#d648d7"; color.name = "Pinkish Purple"; } if (index == 90) { color.hexNum = "#cf9346"; color.name = "Fleshtone Shade Wash"; } if (index == 91) { color.hexNum = "#d3e0b1"; color.name = "Rockmelon Rind"; } if (index == 92) { color.hexNum = "#d22d1d"; color.name = "Pure Red"; } if (index == 93) { color.hexNum = "#d28083"; color.name = "Galah"; } if (index == 94) { color.hexNum = "#d5c7e8"; color.name = "Foggy Love"; } if (index == 95) { color.hexNum = "#db1459"; color.name = "Rubylicious"; } if (index == 96) { color.hexNum = "#dd66bb"; color.name = "Pink Charge"; } if (index == 97) { color.hexNum = "#e2b227"; color.name = "Gold Tips"; } if (index == 98) { color.hexNum = "#ee0099"; color.name = "Love Vessel"; } if (index == 99) { color.hexNum = "#dd55ff"; color.name = "Flaming Flamingo"; } if (index == 100) { color.hexNum = "#eda367"; color.name = "Adventure Orange"; } if (index == 101) { color.hexNum = "#e9f1d0"; color.name = "Yellowish White"; } if (index == 102) { color.hexNum = "#ef3939"; color.name = "Vivaldi Red"; } if (index == 103) { color.hexNum = "#e78ea5"; color.name = "Underwater Flare"; } if (index == 104) { color.hexNum = "#eedd11"; color.name = "Yellow Buzzing"; } if (index == 105) { color.hexNum = "#ee2277"; color.name = "Furious Fuchsia"; } if (index == 106) { color.hexNum = "#f075e6"; color.name = "Lian Hong Lotus Pink"; } if (index == 107) { color.hexNum = "#f7c34c"; color.name = "Creamy Sweet Corn"; } if (index == 108) { color.hexNum = "#fc0fc0"; color.name = "CGA Pink"; } if (index == 109) { color.hexNum = "#ff6622"; color.name = "Sparrows Fire"; } if (index == 110) { color.hexNum = "#fbaf8d"; color.name = "Orange Grove"; } // AUTOGEN:END } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface GmDataInterface { struct GmDataSet { bytes imageName; bytes compressedImage; uint256 compressedSize; } function getSvg(uint256 index) external pure returns (GmDataSet memory); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity >=0.8.0 <0.9.0; // // inflate content script: // var pako = require('pako') // var deflate = (str) => [str.length,Buffer.from(pako.deflateRaw(Buffer.from(str, 'utf-8'), {level: 9})).toString('hex')] // /// @notice Based on https://github.com/madler/zlib/blob/master/contrib/puff library InflateLib { // Maximum bits in a code uint256 constant MAXBITS = 15; // Maximum number of literal/length codes uint256 constant MAXLCODES = 286; // Maximum number of distance codes uint256 constant MAXDCODES = 30; // Maximum codes lengths to read uint256 constant MAXCODES = (MAXLCODES + MAXDCODES); // Number of fixed literal/length codes uint256 constant FIXLCODES = 288; // Error codes enum ErrorCode { ERR_NONE, // 0 successful inflate ERR_NOT_TERMINATED, // 1 available inflate data did not terminate ERR_OUTPUT_EXHAUSTED, // 2 output space exhausted before completing inflate ERR_INVALID_BLOCK_TYPE, // 3 invalid block type (type == 3) ERR_STORED_LENGTH_NO_MATCH, // 4 stored block length did not match one's complement ERR_TOO_MANY_LENGTH_OR_DISTANCE_CODES, // 5 dynamic block code description: too many length or distance codes ERR_CODE_LENGTHS_CODES_INCOMPLETE, // 6 dynamic block code description: code lengths codes incomplete ERR_REPEAT_NO_FIRST_LENGTH, // 7 dynamic block code description: repeat lengths with no first length ERR_REPEAT_MORE, // 8 dynamic block code description: repeat more than specified lengths ERR_INVALID_LITERAL_LENGTH_CODE_LENGTHS, // 9 dynamic block code description: invalid literal/length code lengths ERR_INVALID_DISTANCE_CODE_LENGTHS, // 10 dynamic block code description: invalid distance code lengths ERR_MISSING_END_OF_BLOCK, // 11 dynamic block code description: missing end-of-block code ERR_INVALID_LENGTH_OR_DISTANCE_CODE, // 12 invalid literal/length or distance code in fixed or dynamic block ERR_DISTANCE_TOO_FAR, // 13 distance is too far back in fixed or dynamic block ERR_CONSTRUCT // 14 internal: error in construct() } // Input and output state struct State { ////////////////// // Output state // ////////////////// // Output buffer bytes output; // Bytes written to out so far uint256 outcnt; ///////////////// // Input state // ///////////////// // Input buffer bytes input; // Bytes read so far uint256 incnt; //////////////// // Temp state // //////////////// // Bit buffer uint256 bitbuf; // Number of bits in bit buffer uint256 bitcnt; ////////////////////////// // Static Huffman codes // ////////////////////////// Huffman lencode; Huffman distcode; } // Huffman code decoding tables struct Huffman { uint256[] counts; uint256[] symbols; } function bits(State memory s, uint256 need) private pure returns (ErrorCode, uint256) { // Bit accumulator (can use up to 20 bits) uint256 val; // Load at least need bits into val val = s.bitbuf; while (s.bitcnt < need) { if (s.incnt == s.input.length) { // Out of input return (ErrorCode.ERR_NOT_TERMINATED, 0); } // Load eight bits val |= uint256(uint8(s.input[s.incnt++])) << s.bitcnt; s.bitcnt += 8; } // Drop need bits and update buffer, always zero to seven bits left s.bitbuf = val >> need; s.bitcnt -= need; // Return need bits, zeroing the bits above that uint256 ret = (val & ((1 << need) - 1)); return (ErrorCode.ERR_NONE, ret); } function _stored(State memory s) private pure returns (ErrorCode) { // Length of stored block uint256 len; // Discard leftover bits from current byte (assumes s.bitcnt < 8) s.bitbuf = 0; s.bitcnt = 0; // Get length and check against its one's complement if (s.incnt + 4 > s.input.length) { // Not enough input return ErrorCode.ERR_NOT_TERMINATED; } len = uint256(uint8(s.input[s.incnt++])); len |= uint256(uint8(s.input[s.incnt++])) << 8; if ( uint8(s.input[s.incnt++]) != (~len & 0xFF) || uint8(s.input[s.incnt++]) != ((~len >> 8) & 0xFF) ) { // Didn't match complement! return ErrorCode.ERR_STORED_LENGTH_NO_MATCH; } // Copy len bytes from in to out if (s.incnt + len > s.input.length) { // Not enough input return ErrorCode.ERR_NOT_TERMINATED; } if (s.outcnt + len > s.output.length) { // Not enough output space return ErrorCode.ERR_OUTPUT_EXHAUSTED; } while (len != 0) { // Note: Solidity reverts on underflow, so we decrement here len -= 1; s.output[s.outcnt++] = s.input[s.incnt++]; } // Done with a valid stored block return ErrorCode.ERR_NONE; } function _decode(State memory s, Huffman memory h) private pure returns (ErrorCode, uint256) { // Current number of bits in code uint256 len; // Len bits being decoded uint256 code = 0; // First code of length len uint256 first = 0; // Number of codes of length len uint256 count; // Index of first code of length len in symbol table uint256 index = 0; // Error code ErrorCode err; for (len = 1; len <= MAXBITS; len++) { // Get next bit uint256 tempCode; (err, tempCode) = bits(s, 1); if (err != ErrorCode.ERR_NONE) { return (err, 0); } code |= tempCode; count = h.counts[len]; // If length len, return symbol if (code < first + count) { return (ErrorCode.ERR_NONE, h.symbols[index + (code - first)]); } // Else update for next length index += count; first += count; first <<= 1; code <<= 1; } // Ran out of codes return (ErrorCode.ERR_INVALID_LENGTH_OR_DISTANCE_CODE, 0); } function _construct( Huffman memory h, uint256[] memory lengths, uint256 n, uint256 start ) private pure returns (ErrorCode) { // Current symbol when stepping through lengths[] uint256 symbol; // Current length when stepping through h.counts[] uint256 len; // Number of possible codes left of current length uint256 left; // Offsets in symbol table for each length uint256[MAXBITS + 1] memory offs; // Count number of codes of each length for (len = 0; len <= MAXBITS; len++) { h.counts[len] = 0; } for (symbol = 0; symbol < n; symbol++) { // Assumes lengths are within bounds h.counts[lengths[start + symbol]]++; } // No codes! if (h.counts[0] == n) { // Complete, but decode() will fail return (ErrorCode.ERR_NONE); } // Check for an over-subscribed or incomplete set of lengths // One possible code of zero length left = 1; for (len = 1; len <= MAXBITS; len++) { // One more bit, double codes left left <<= 1; if (left < h.counts[len]) { // Over-subscribed--return error return ErrorCode.ERR_CONSTRUCT; } // Deduct count from possible codes left -= h.counts[len]; } // Generate offsets into symbol table for each length for sorting offs[1] = 0; for (len = 1; len < MAXBITS; len++) { offs[len + 1] = offs[len] + h.counts[len]; } // Put symbols in table sorted by length, by symbol order within each length for (symbol = 0; symbol < n; symbol++) { if (lengths[start + symbol] != 0) { h.symbols[offs[lengths[start + symbol]]++] = symbol; } } // Left > 0 means incomplete return left > 0 ? ErrorCode.ERR_CONSTRUCT : ErrorCode.ERR_NONE; } function _codes( State memory s, Huffman memory lencode, Huffman memory distcode ) private pure returns (ErrorCode) { // Decoded symbol uint256 symbol; // Length for copy uint256 len; // Distance for copy uint256 dist; // TODO Solidity doesn't support constant arrays, but these are fixed at compile-time // Size base for length codes 257..285 uint16[29] memory lens = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ]; // Extra bits for length codes 257..285 uint8[29] memory lext = [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 ]; // Offset base for distance codes 0..29 uint16[30] memory dists = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ]; // Extra bits for distance codes 0..29 uint8[30] memory dext = [ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 ]; // Error code ErrorCode err; // Decode literals and length/distance pairs while (symbol != 256) { (err, symbol) = _decode(s, lencode); if (err != ErrorCode.ERR_NONE) { // Invalid symbol return err; } if (symbol < 256) { // Literal: symbol is the byte // Write out the literal if (s.outcnt == s.output.length) { return ErrorCode.ERR_OUTPUT_EXHAUSTED; } s.output[s.outcnt] = bytes1(uint8(symbol)); s.outcnt++; } else if (symbol > 256) { uint256 tempBits; // Length // Get and compute length symbol -= 257; if (symbol >= 29) { // Invalid fixed code return ErrorCode.ERR_INVALID_LENGTH_OR_DISTANCE_CODE; } (err, tempBits) = bits(s, lext[symbol]); if (err != ErrorCode.ERR_NONE) { return err; } len = lens[symbol] + tempBits; // Get and check distance (err, symbol) = _decode(s, distcode); if (err != ErrorCode.ERR_NONE) { // Invalid symbol return err; } (err, tempBits) = bits(s, dext[symbol]); if (err != ErrorCode.ERR_NONE) { return err; } dist = dists[symbol] + tempBits; if (dist > s.outcnt) { // Distance too far back return ErrorCode.ERR_DISTANCE_TOO_FAR; } // Copy length bytes from distance bytes back if (s.outcnt + len > s.output.length) { return ErrorCode.ERR_OUTPUT_EXHAUSTED; } while (len != 0) { // Note: Solidity reverts on underflow, so we decrement here len -= 1; s.output[s.outcnt] = s.output[s.outcnt - dist]; s.outcnt++; } } else { s.outcnt += len; } } // Done with a valid fixed or dynamic block return ErrorCode.ERR_NONE; } function _build_fixed(State memory s) private pure returns (ErrorCode) { // Build fixed Huffman tables // TODO this is all a compile-time constant uint256 symbol; uint256[] memory lengths = new uint256[](FIXLCODES); // Literal/length table for (symbol = 0; symbol < 144; symbol++) { lengths[symbol] = 8; } for (; symbol < 256; symbol++) { lengths[symbol] = 9; } for (; symbol < 280; symbol++) { lengths[symbol] = 7; } for (; symbol < FIXLCODES; symbol++) { lengths[symbol] = 8; } _construct(s.lencode, lengths, FIXLCODES, 0); // Distance table for (symbol = 0; symbol < MAXDCODES; symbol++) { lengths[symbol] = 5; } _construct(s.distcode, lengths, MAXDCODES, 0); return ErrorCode.ERR_NONE; } function _fixed(State memory s) private pure returns (ErrorCode) { // Decode data until end-of-block code return _codes(s, s.lencode, s.distcode); } function _build_dynamic_lengths(State memory s) private pure returns (ErrorCode, uint256[] memory) { uint256 ncode; // Index of lengths[] uint256 index; // Descriptor code lengths uint256[] memory lengths = new uint256[](MAXCODES); // Error code ErrorCode err; // Permutation of code length codes uint8[19] memory order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; (err, ncode) = bits(s, 4); if (err != ErrorCode.ERR_NONE) { return (err, lengths); } ncode += 4; // Read code length code lengths (really), missing lengths are zero for (index = 0; index < ncode; index++) { (err, lengths[order[index]]) = bits(s, 3); if (err != ErrorCode.ERR_NONE) { return (err, lengths); } } for (; index < 19; index++) { lengths[order[index]] = 0; } return (ErrorCode.ERR_NONE, lengths); } function _build_dynamic(State memory s) private pure returns ( ErrorCode, Huffman memory, Huffman memory ) { // Number of lengths in descriptor uint256 nlen; uint256 ndist; // Index of lengths[] uint256 index; // Error code ErrorCode err; // Descriptor code lengths uint256[] memory lengths = new uint256[](MAXCODES); // Length and distance codes Huffman memory lencode = Huffman(new uint256[](MAXBITS + 1), new uint256[](MAXLCODES)); Huffman memory distcode = Huffman(new uint256[](MAXBITS + 1), new uint256[](MAXDCODES)); uint256 tempBits; // Get number of lengths in each table, check lengths (err, nlen) = bits(s, 5); if (err != ErrorCode.ERR_NONE) { return (err, lencode, distcode); } nlen += 257; (err, ndist) = bits(s, 5); if (err != ErrorCode.ERR_NONE) { return (err, lencode, distcode); } ndist += 1; if (nlen > MAXLCODES || ndist > MAXDCODES) { // Bad counts return ( ErrorCode.ERR_TOO_MANY_LENGTH_OR_DISTANCE_CODES, lencode, distcode ); } (err, lengths) = _build_dynamic_lengths(s); if (err != ErrorCode.ERR_NONE) { return (err, lencode, distcode); } // Build huffman table for code lengths codes (use lencode temporarily) err = _construct(lencode, lengths, 19, 0); if (err != ErrorCode.ERR_NONE) { // Require complete code set here return ( ErrorCode.ERR_CODE_LENGTHS_CODES_INCOMPLETE, lencode, distcode ); } // Read length/literal and distance code length tables index = 0; while (index < nlen + ndist) { // Decoded value uint256 symbol; // Last length to repeat uint256 len; (err, symbol) = _decode(s, lencode); if (err != ErrorCode.ERR_NONE) { // Invalid symbol return (err, lencode, distcode); } if (symbol < 16) { // Length in 0..15 lengths[index++] = symbol; } else { // Repeat instruction // Assume repeating zeros len = 0; if (symbol == 16) { // Repeat last length 3..6 times if (index == 0) { // No last length! return ( ErrorCode.ERR_REPEAT_NO_FIRST_LENGTH, lencode, distcode ); } // Last length len = lengths[index - 1]; (err, tempBits) = bits(s, 2); if (err != ErrorCode.ERR_NONE) { return (err, lencode, distcode); } symbol = 3 + tempBits; } else if (symbol == 17) { // Repeat zero 3..10 times (err, tempBits) = bits(s, 3); if (err != ErrorCode.ERR_NONE) { return (err, lencode, distcode); } symbol = 3 + tempBits; } else { // == 18, repeat zero 11..138 times (err, tempBits) = bits(s, 7); if (err != ErrorCode.ERR_NONE) { return (err, lencode, distcode); } symbol = 11 + tempBits; } if (index + symbol > nlen + ndist) { // Too many lengths! return (ErrorCode.ERR_REPEAT_MORE, lencode, distcode); } while (symbol != 0) { // Note: Solidity reverts on underflow, so we decrement here symbol -= 1; // Repeat last or zero symbol times lengths[index++] = len; } } } // Check for end-of-block code -- there better be one! if (lengths[256] == 0) { return (ErrorCode.ERR_MISSING_END_OF_BLOCK, lencode, distcode); } // Build huffman table for literal/length codes err = _construct(lencode, lengths, nlen, 0); if ( err != ErrorCode.ERR_NONE && (err == ErrorCode.ERR_NOT_TERMINATED || err == ErrorCode.ERR_OUTPUT_EXHAUSTED || nlen != lencode.counts[0] + lencode.counts[1]) ) { // Incomplete code ok only for single length 1 code return ( ErrorCode.ERR_INVALID_LITERAL_LENGTH_CODE_LENGTHS, lencode, distcode ); } // Build huffman table for distance codes err = _construct(distcode, lengths, ndist, nlen); if ( err != ErrorCode.ERR_NONE && (err == ErrorCode.ERR_NOT_TERMINATED || err == ErrorCode.ERR_OUTPUT_EXHAUSTED || ndist != distcode.counts[0] + distcode.counts[1]) ) { // Incomplete code ok only for single length 1 code return ( ErrorCode.ERR_INVALID_DISTANCE_CODE_LENGTHS, lencode, distcode ); } return (ErrorCode.ERR_NONE, lencode, distcode); } function _dynamic(State memory s) private pure returns (ErrorCode) { // Length and distance codes Huffman memory lencode; Huffman memory distcode; // Error code ErrorCode err; (err, lencode, distcode) = _build_dynamic(s); if (err != ErrorCode.ERR_NONE) { return err; } // Decode data until end-of-block code return _codes(s, lencode, distcode); } function puff(bytes memory source, uint256 destlen) internal pure returns (ErrorCode, bytes memory) { // Input/output state State memory s = State( new bytes(destlen), 0, source, 0, 0, 0, Huffman(new uint256[](MAXBITS + 1), new uint256[](FIXLCODES)), Huffman(new uint256[](MAXBITS + 1), new uint256[](MAXDCODES)) ); // Temp: last bit uint256 last; // Temp: block type bit uint256 t; // Error code ErrorCode err; // Build fixed Huffman tables err = _build_fixed(s); if (err != ErrorCode.ERR_NONE) { return (err, s.output); } // Process blocks until last block or error while (last == 0) { // One if last block (err, last) = bits(s, 1); if (err != ErrorCode.ERR_NONE) { return (err, s.output); } // Block type 0..3 (err, t) = bits(s, 2); if (err != ErrorCode.ERR_NONE) { return (err, s.output); } err = ( t == 0 ? _stored(s) : ( t == 1 ? _fixed(s) : ( t == 2 ? _dynamic(s) : ErrorCode.ERR_INVALID_BLOCK_TYPE ) ) ); // type == 3, invalid if (err != ErrorCode.ERR_NONE) { // Return with error break; } } return (err, s.output); } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 100 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ICourierFont","name":"fontAddress","type":"address"},{"internalType":"contract GmDataInterface","name":"gmData1Address","type":"address"},{"internalType":"contract GmDataInterface","name":"gmData2Address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"components":[{"internalType":"bytes","name":"imageName","type":"bytes"},{"internalType":"bytes","name":"compressedImage","type":"bytes"},{"internalType":"uint256","name":"compressedSize","type":"uint256"}],"internalType":"struct GmDataInterface.GmDataSet","name":"gmData","type":"tuple"}],"name":"decompress","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"seed","type":"bytes32"}],"name":"svgRaw","outputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b50604051620059ca380380620059ca83398101604081905262000034916200006b565b6001600160a01b0392831660805290821660a0521660c052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c0516158db620000ef60003960006101c4015260006101150152600061061301526158db6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063338dc74e1461003b57806390accf5614610068575b600080fd5b61004e610049366004615152565b610089565b60405161005f9594939291906151c7565b60405180910390f35b61007b61007636600461531f565b610328565b60405161005f9291906153bc565b60608080808060006100a6604563ffffffff609f8a901c166153f7565b905060006100bf606463ffffffff607f8b901c166153f7565b905060006100d28263ffffffff16610349565b90506000806100e08b6104c5565b9150915060608060328763ffffffff1610156101a55760405163586e3c7d60e11b815263ffffffff8816600482015261019c907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0dc78fa906024015b60006040518083038186803b15801561016057600080fd5b505afa158015610174573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610076919081019061546a565b92509050610200565b60405163586e3c7d60e11b815263ffffffff881660048201526101fb907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0dc78fa90602401610148565b925090505b6102258160405180604001604052806003815260200162090caf60eb1b8152506105a4565b806102535750610253816040518060400160405280600681526020016542696e61727960d01b8152506105a4565b80610280575061028081604051806040016040528060058152602001644d6f72736560d81b8152506105a4565b806102b057506102b081604051806040016040528060088152602001674d6e656d6f6e696360c01b8152506105a4565b156102d557604051806040016040528060048152602001636e6f6e6560e01b81525094505b835183516102e491908761060f565b826040516020016102f6929190615523565b60408051601f198184030181529190526020948501519390940151939d909c50919a5091985091965090945050505050565b606080600061033f846020015185604001516106de565b9451959350505050565b6060816001148061035a5750816002145b806103655750816003145b806103705750816004145b8061037b5750816005145b156103a15750506040805180820190915260058152646e6f69736560d81b602082015290565b81600714806103b05750816008145b806103bb5750816009145b156103e45750506040805180820190915260088152677363726962626c6560c01b602082015290565b60466103f1836064615579565b1180156104095750605a610406836064615579565b11155b1561042f5750506040805180820190915260058152640dadee4e0d60db1b602082015290565b603c61043c836064615579565b11801561045457506046610451836064615579565b11155b15610479575050604080518082019091526004815263676c6f7760e01b602082015290565b81604514156104a5575050604080518082019091526007815266199c9858dd185b60ca1b602082015290565b50506040805180820190915260048152636e6f6e6560e01b602082015290565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006104fe606f60e086901c6153f7565b90506000610517600563ffffffff60c088901c166153f7565b9050600061052d600260ff60b889901c16615590565b60ff16905060008161056157606f6105468460376155b2565b61055090866155b2565b61055a91906153f7565b9050610585565b606f61056e8460376155da565b61057890866155b2565b61058291906153f7565b90505b61058e8461098f565b6105978261098f565b9550955050505050915091565b600081518351146105b757506000610609565b816040516020016105c891906155ff565b60405160208183030381529060405280519060200120836040516020016105ef91906155ff565b604051602081830303815290604052805190602001201490505b92915050565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639d37bc7c6040518163ffffffff1660e01b815260040160006040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a6919081019061561b565b82846106b0612fcd565b876040516020016106c5959493929190615663565b60405160208183030381529060405290505b9392505050565b600060606000604051806101000160405280856001600160401b0381111561070857610708615234565b6040519080825280601f01601f191660200182016040528015610732576020820181803683370190505b508152602001600081526020018681526020016000815260200160008152602001600081526020016040518060400160405280600f60016107739190615846565b6001600160401b0381111561078a5761078a615234565b6040519080825280602002602001820160405280156107b3578160200160208202803683370190505b5081526040805161012080825261242082019092526020928301929091908201612400803683370190505081525081526020016040518060400160405280600f60016107ff9190615846565b6001600160401b0381111561081657610816615234565b60405190808252806020026020018201604052801561083f578160200160208202803683370190505b50815260408051601e8082526103e0820190925260209283019290919082016103c0803683375050509052905290506000808061087b8461375c565b9050600081600e8111156108915761089161585e565b146108a6579251929450919250610988915050565b8261097d576108b68460016138e6565b93509050600081600e8111156108ce576108ce61585e565b146108e3579251929450919250610988915050565b6108ee8460026138e6565b92509050600081600e8111156109065761090661585e565b1461091b579251929450919250610988915050565b811561094f57816001146109465781600214610938576003610958565b610941846139b7565b610958565b61094184613a31565b61095884613a46565b9050600081600e81111561096e5761096e61585e565b146109785761097d565b6108a6565b925192945091925050505b9250929050565b604080518082019091526060808252602082015263ffffffff82166109ef5760408051808201825260078152660233030303030360cc1b60208083019190915290835281518083019092526005825264426c61636b60d81b828201528201525b8163ffffffff1660011415610a485760408051808201825260078152662330303463366160c81b6020808301919091529083528151808301909252600e82526d4e617679204461726b20426c756560901b828201528201525b8163ffffffff1660021415610a9e57604080518082018252600781526608cc0c0e4e190d60ca1b6020808301919091529083528151808301909252600b82526a42617965726e20426c756560a81b828201528201525b8163ffffffff1660031415610af9576040805180820182526007815266119818329a199b60c91b6020808301919091529083528151808301909252601082526f2632bc30b637b33336329023b932b2b760811b828201528201525b8163ffffffff1660041415610b51576040805180820182526007815266119898199a309b60c91b6020808301919091529083528151808301909252600d82526c456779707469616e20426c756560981b828201528201525b8163ffffffff1660051415610ba75760408051808201825260078152662330303838313160c81b6020808301919091529083528151808301909252600b82526a263ab9b41023b0b93232b760a91b828201528201525b8163ffffffff1660061415610c01576040805180820182526007815266046606cc8606e760cb1b6020808301919091529083528151808301909252600f82526e2ab73232b93bb0ba32b9102332b93760891b828201528201525b8163ffffffff1660071415610c565760408051808201825260078152660233163316366360cc1b6020808301919091529083528151808301909252600a825269109b1d59589bdb9b995d60b21b828201528201525b8163ffffffff1660081415610cad5760408051808201825260078152662331323734353360c81b6020808301919091529083528151808301909252600c82526b11dc99595b8815995b1d995d60a21b828201528201525b8163ffffffff1660091415610d0757604080518082018252600781526608cc4d1898588d60ca1b6020808301919091529083528151808301909252600f82526e53757065722052617265204a61646560881b828201528201525b8163ffffffff16600a1415610d58576040805180820182526007808252661198989898991960c91b6020808401919091529184528251808401909352825266436f726265617560c81b828201528201525b8163ffffffff16600b1415610dae5760408051808201825260078152662331363564393560c81b6020808301919091529083528151808301909252600b82526a13185c1a5cc812995dd95b60aa1b828201528201525b8163ffffffff16600c1415610e025760408051808201825260078152662331366238663360c81b602080830191909152908352815180830190925260098252685a696d6120426c756560b81b828201528201525b8163ffffffff16600d1415610e605760408051808201825260078152661198b2b31c1b9b60c91b6020808301919091529083528151808301909252601382527214de5b9d1a195d1a58c814dc19585c9b5a5b9d606a1b828201528201525b8163ffffffff16600e1415610eb1576040805180820182526007808252661199189a33319b60c91b60208084019190915291845282518084019093528252662732bb9021b0b960c91b828201528201525b8163ffffffff16600f1415610f0b5760408051808201825260078152660466468726268760cb1b6020808301919091529083528151808301909252600f82526e2830b832b93137bc93b9902630bbb760891b828201528201525b8163ffffffff1660101415610f635760408051808201825260078152662332346461393160c81b6020808301919091529083528151808301909252600d82526c2932b83a34b6329023b932b2b760991b828201528201525b8163ffffffff1660111415610fbc5760408051808201825260078152662332323333313160c81b6020808301919091529083528151808301909252600e82526d11185c9ad95cdd08119bdc995cdd60921b828201528201525b8163ffffffff166012141561101257604080518082018252600781526608cc8e4dd98d9960ca1b6020808301919091529083528151808301909252600b82526a4d65726d6169642053656160a81b828201528201525b8163ffffffff16601314156110685760408051808201825260078152662332326363636360c81b6020808301919091529083528151808301909252600b82526a13595c9b585a590813995d60aa1b828201528201525b8163ffffffff16601414156110bd5760408051808201825260078152662332653232343960c81b6020808301919091529083528151808301909252600a825269456c646572626572727960b01b828201528201525b8163ffffffff16601514156111155760408051808201825260078152662333323661623160c81b6020808301919091529083528151808301909252600d82526c446f766572205374726169747360981b828201528201525b8163ffffffff166016141561116e576040805180820182526007815266119931319a98b160c91b6020808301919091529083528151808301909252600e82526d46656c776f6f64204c656176657360901b828201528201525b8163ffffffff16601714156111c55760408051808201825260078152662333393132383560c81b6020808301919091529083528151808301909252600c82526b2834bc34b2902837bbb232b960a11b828201528201525b8163ffffffff166018141561122257604080518082018252600781526604664ca6a70ca760cb1b602080830191909152908352815180830190925260128252715665746572616e27732044617920426c756560701b828201528201525b8163ffffffff166019141561127a5760408051808201825260078152662334313966353960c81b6020808301919091529083528151808301909252600d82526c21b430ba32b0ba9023b932b2b760991b828201528201525b8163ffffffff16601a14156112d35760408051808201825260078152662334356539633160c81b6020808301919091529083528151808301909252600e82526d417068726f64697465204171756160901b828201528201525b8163ffffffff16601b14156113295760408051808201825260078152660233432343333360cc1b6020808301919091529083528151808301909252600b82526a08ec2e4c8cadc40a0c2e8d60ab1b828201528201525b8163ffffffff16601c141561137a576040805180820182526007808252662334323933393560c81b602080840191909152918452825180840190935282526621b0ba30b630b760c91b828201528201525b8163ffffffff16601d14156113d05760408051808201825260078152660233434646430360cc1b6020808301919091529083528151808301909252600b82526a4d6167696320426c61646560a81b828201528201525b8163ffffffff16601e1415611427576040805180820182526007815266119a1999329b3360c91b6020808301919091529083528151808301909252600c82526b48657220486967686e65737360a01b828201528201525b8163ffffffff16601f141561147d57604080518082018252600781526608cd0d0dcdd91960ca1b6020808301919091529083528151808301909252600b82526a416e6472656120426c756560a81b828201528201525b8163ffffffff16602014156114d65760408051808201825260078152662335616433336560c81b6020808301919091529083528151808301909252600e82526d56657264616e74204669656c647360901b828201528201525b8163ffffffff166021141561152c5760408051808201825260078152662333613138623160c81b6020808301919091529083528151808301909252600b82526a496e6469676f20426c756560a81b828201528201525b8163ffffffff16602214156115885760408051808201825260078152662335353636313160c81b60208083019190915290835281518083019092526011825270119bdc995cdd1a585b0813dd5d1c1bdcdd607a1b828201528201525b8163ffffffff16602314156115e15760408051808201825260078152660466a6ac4c470760cb1b6020808301919091529083528151808301909252600e82526d426c656163686564204f6c69766560901b828201528201525b8163ffffffff166024141561163d5760408051808201825260078152662335353030656560c81b6020808301919091529083528151808301909252601182527054657a6361746c69706f636120426c756560781b828201528201525b8163ffffffff166025141561169357604080518082018252600781526608cd4d0d4d4d4d60ca1b6020808301919091529083528151808301909252600b82526a436172626f6e20436f707960a81b828201528201525b8163ffffffff16602614156116e45760408051808201825260078152662335386130626360c81b60208083019190915290835281518083019092526006825265223ab830b4b760d11b828201528201525b8163ffffffff166027141561173c576040805180820182526007815266119a9ab333191960c91b6020808301919091529083528151808301909252600d82526c2a3930b33334b19023b932b2b760991b828201528201525b8163ffffffff16602814156117915760408051808201825260078152660233562336539360cc1b6020808301919091529083528151808301909252600a825269088c2d2e6f24084eae6d60b31b828201528201525b8163ffffffff16602914156117e6576040805180820182526007815266119b1b1c1c333360c91b6020808301919091529083528151808301909252600a825269446565702044656e696d60b01b828201528201525b8163ffffffff16602a141561183f5760408051808201825260078152660233631653136360cc1b6020808301919091529083528151808301909252600e82526d2634b3b43a34b9b41023b932b2b760911b828201528201525b8163ffffffff16602b14156118965760408051808201825260078152662336613331636160c81b6020808301919091529083528151808301909252600c82526b536167617420507572706c6560a01b828201528201525b8163ffffffff16602c14156118ef5760408051808201825260078152662336363763336560c81b6020808301919091529083528151808301909252600e82526d26b4b634ba30b93c9023b932b2b760911b828201528201525b8163ffffffff16602d141561194657604080518082018252600781526608cd8e18ce0e5960ca1b6020808301919091529083528151808301909252600c82526b496e74656e7365204a61646560a01b828201528201525b8163ffffffff16602e141561199f5760408051808201825260078152660466cc8626060760cb1b6020808301919091529083528151808301909252600e82526d21b432b9ba373aba10213937bbb760911b828201528201525b8163ffffffff16602f14156119f657604080518082018252600781526608cd8e4d8ccdcd60ca1b6020808301919091529083528151808301909252600c82526b0a0eae4e0d8ca40a0eadcc6d60a31b828201528201525b8163ffffffff1660301415611a4b5760408051808201825260078152660233666623765360cc1b6020808301919091529083528151808301909252600a8252694c69666520466f72636560b01b828201528201525b8163ffffffff1660311415611aa957604080518082018252600781526608cdcdcc0c0d0d60ca1b602080830191909152908352815180830190925260138252724461776e206f6620746865204661697269657360681b828201528201525b8163ffffffff1660321415611b025760408051808201825260078152662337383531613960c81b6020808301919091529083528151808301909252600e82526d2937bcb0b6102630bb32b73232b960911b828201528201525b8163ffffffff1660331415611b5e5760408051808201825260078152660466e6c72c662760cb1b60208083019190915290835281518083019092526011825270263ab6b4b732b9b1b2b73a1023b932b2b760791b828201528201525b8163ffffffff1660341415611baf57604080518082018252600780825266119bb1329c1c9960c91b6020808401919091529184528251808401909352825266149859ddd9595960ca1b828201528201525b8163ffffffff1660351415611c075760408051808201825260078152662337303362653760c81b6020808301919091529083528151808301909252600d82526c426c7569736820507572706c6560981b828201528201525b8163ffffffff1660361415611c5d57604080518082018252600781526608cdd88e188d5960ca1b6020808301919091529083528151808301909252600b82526a53616765204c656176657360a81b828201528201525b8163ffffffff1660371415611cb85760408051808201825260078152662338326439633560c81b6020808301919091529083528151808301909252601082526f54656e6465722054757271756f69736560801b828201528201525b8163ffffffff1660381415611d105760408051808201825260078152660233765323533360cc1b6020808301919091529083528151808301909252600d82526c536361726c657420536861646560981b828201528201525b8163ffffffff1660391415611d6a5760408051808201825260078152662338333736396360c81b6020808301919091529083528151808301909252600f82526e566f786174726f6e20507572706c6560881b828201528201525b8163ffffffff16603a1415611dc25760408051808201825260078152660233838636330360cc1b6020808301919091529083528151808301909252600d82526c466162756c6f75732046726f6760981b828201528201525b8163ffffffff16603b1415611e1d576040805180820182526007815266119c1c18989b1b60c91b6020808301919091529083528151808301909252601082526f506f7373657373656420507572706c6560801b828201528201525b8163ffffffff16603c1415611e7557604080518082018252600781526608ce0dcd4d994d60ca1b6020808301919091529083528151808301909252600d82526c476c6f6f6d7920507572706c6560981b828201528201525b8163ffffffff16603d1415611ed357604080518082018252600781526608ce4cd88c4cd960ca1b60208083019190915290835281518083019092526013825272477265656e205465612049636520437265616d60681b828201528201525b8163ffffffff16603e1415611f285760408051808201825260078152662339306664613960c81b6020808301919091529083528151808301909252600a8252692337b0b69023b932b2b760b11b828201528201525b8163ffffffff16603f1415611f815760408051808201825260078152662339313462313360c81b6020808301919091529083528151808301909252600e82526d2830b930b9b4ba3290213937bbb760911b828201528201525b8163ffffffff1660401415611fdd5760408051808201825260078152662339313963383160c81b6020808301919091529083528151808301909252601182527057686973706572696e672057696c6c6f7760781b828201528201525b8163ffffffff16604114156120355760408051808201825260078152662339396565656560c81b6020808301919091529083528151808301909252600d82526c467265657a7920427265657a7960981b828201528201525b8163ffffffff16604214156120895760408051808201825260078152662339383364353360c81b60208083019190915290835281518083019092526009825268105b19d8594814995960ba1b828201528201525b8163ffffffff16604314156120e45760408051808201825260078152662339633837633160c81b6020808301919091529083528151808301909252601082526f50657472696669656420507572706c6560801b828201528201525b8163ffffffff16604414156121405760408051808201825260078152662339386461326360c81b60208083019190915290835281518083019092526011825270456666657276657363656e74204c696d6560781b828201528201525b8163ffffffff16604514156121955760408051808201825260078152662339343231393360c81b6020808301919091529083528151808301909252600a82526941636169204a7569636560b01b828201528201525b8163ffffffff16604614156121f25760408051808201825260078152662361363735666560c81b60208083019190915290835281518083019092526012825271141d5c9c1b1948125b1b1d5cda5bdb9a5cdd60721b828201528201525b8163ffffffff16604714156122495760408051808201825260078152662361346331363160c81b6020808301919091529083528151808301909252600c82526b4a756e676c65204a7569636560a01b828201528201525b8163ffffffff16604814156122a55760408051808201825260078152662361613030636360c81b602080830191909152908352815180830190925260118252704665726f63696f7573204675636873696160781b828201528201525b8163ffffffff16604914156122fb5760408051808201825260078152662361383565333960c81b6020808301919091529083528151808301909252600b82526a4561727468656e204a756760a81b828201528201525b8163ffffffff16604a141561235057604080518082018252600781526608d858584e584d60ca1b6020808301919091529083528151808301909252600a825269456c6c6965204772657960b01b828201528201525b8163ffffffff16604b14156123b15760408051808201825260078152662361616565313160c81b6020808301919091529083528151808301909252601682527523b637b934b7bab99023b932b2b71023b634ba3a32b960511b828201528201525b8163ffffffff16604c14156124095760408051808201825260078152662361643433373960c81b6020808301919091529083528151808301909252600d82526c26bcb9ba34b19026b0b937b7b760991b828201528201525b8163ffffffff16604d141561246757604080518082018252600781526608d88c4e4d594d60ca1b60208083019190915290835281518083019092526013825272111c99585b5e4810d85b991e48119bdc995cdd606a1b828201528201525b8163ffffffff16604e14156124b85760408051808201825260078082526611b118b2321a9960c91b602080840191909152918452825180840190935282526621b7b734b332b960c91b828201528201525b8163ffffffff16604f141561251157604080518082018252600781526611b198199a30b360c91b6020808301919091529083528151808301909252600e82526d141a5b9ac814195c995b9b9a585b60921b828201528201525b8163ffffffff16605014156125795760408051808201825260078152662362373837323760c81b6020808301919091529083528151808301909252601d82527f556e6976657273697479206f662043616c69666f726e696120476f6c64000000828201528201525b8163ffffffff16605114156125d057604080518082018252600781526611b11cb2181c3160c91b6020808301919091529083528151808301909252600c82526b596f756e67204c656176657360a01b828201528201525b8163ffffffff166052141561262b5760408051808201825260078152662362623131656560c81b6020808301919091529083528151808301909252601082526f50726f6d697363756f75732050696e6b60801b828201528201525b8163ffffffff16605314156126825760408051808201825260078152660236330363936360cc1b6020808301919091529083528151808301909252600c82526b15185c195cdd1c9e4814995960a21b828201528201525b8163ffffffff16605414156126d85760408051808201825260078152662362656262633960c81b6020808301919091529083528151808301909252600b82526a53696c766572626572727960a81b828201528201525b8163ffffffff16605514156127305760408051808201825260078152660236266306133360cc1b6020808301919091529083528151808301909252600d82526c13db190811db1bdc9e48149959609a1b828201528201525b8163ffffffff16605614156127875760408051808201825260078152662363333562393960c81b6020808301919091529083528151808301909252600c82526b131b1a5b1858dc5d595c995960a21b828201528201525b8163ffffffff16605714156127e057604080518082018252600781526611b1b0b09c981b60c91b6020808301919091529083528151808301909252600e82526d10da1c9a5cdd1b585cc811dbdb1960921b828201528201525b8163ffffffff16605814156128385760408051808201825260078152662363326631373760c81b6020808301919091529083528151808301909252600d82526c437563756d626572204d696c6b60981b828201528201525b8163ffffffff16605914156128915760408051808201825260078152662364363438643760c81b6020808301919091529083528151808301909252600e82526d50696e6b69736820507572706c6560901b828201528201525b8163ffffffff16605a14156128f057604080518082018252600781526611b1b31c999a1b60c91b6020808301919091529083528151808301909252601482527308cd8cae6d0e8dedcca40a6d0c2c8ca40aec2e6d60631b828201528201525b8163ffffffff16605b14156129495760408051808201825260078152662364336530623160c81b6020808301919091529083528151808301909252600e82526d149bd8dadb595b1bdb88149a5b9960921b828201528201525b8163ffffffff16605c141561299c57604080518082018252600781526608d90c8c990c5960ca1b60208083019190915290835281518083019092526008825267141d5c994814995960c21b828201528201525b8163ffffffff16605d14156129ec5760408051808201825260078152662364323830383360c81b6020808301919091529083528151808301909252600582526408ec2d8c2d60db1b828201528201525b8163ffffffff16605e1415612a41576040805180820182526007815266046c86ac66eca760cb1b6020808301919091529083528151808301909252600a825269466f676779204c6f766560b01b828201528201525b8163ffffffff16605f1415612a975760408051808201825260078152662364623134353960c81b6020808301919091529083528151808301909252600b82526a527562796c6963696f757360a81b828201528201525b8163ffffffff1660601415612aed57604080518082018252600781526611b2321b1b313160c91b6020808301919091529083528151808301909252600b82526a50696e6b2043686172676560a81b828201528201525b8163ffffffff1660611415612b415760408051808201825260078152662365326232323760c81b60208083019190915290835281518083019092526009825268476f6c64205469707360b81b828201528201525b8163ffffffff1660621415612b975760408051808201825260078152662365653030393960c81b6020808301919091529083528151808301909252600b82526a131bdd994815995cdcd95b60aa1b828201528201525b8163ffffffff1660631415612bf257604080518082018252600781526611b2321a9ab33360c91b6020808301919091529083528151808301909252601082526f466c616d696e6720466c616d696e676f60801b828201528201525b8163ffffffff1660641415612c4d5760408051808201825260078152662365646133363760c81b6020808301919091529083528151808301909252601082526f416476656e74757265204f72616e676560801b828201528201525b8163ffffffff1660651415612ca75760408051808201825260078152660236539663164360cc1b6020808301919091529083528151808301909252600f82526e59656c6c6f7769736820576869746560881b828201528201525b8163ffffffff1660661415612cfd5760408051808201825260078152662365663339333960c81b6020808301919091529083528151808301909252600b82526a159a5d985b191a4814995960aa1b828201528201525b8163ffffffff1660671415612d585760408051808201825260078152662365373865613560c81b6020808301919091529083528151808301909252601082526f556e646572776174657220466c61726560801b828201528201525b8163ffffffff1660681415612db15760408051808201825260078152662365656464313160c81b6020808301919091529083528151808301909252600e82526d59656c6c6f772042757a7a696e6760901b828201528201525b8163ffffffff1660691415612e0b5760408051808201825260078152662365653232373760c81b6020808301919091529083528151808301909252600f82526e467572696f7573204675636873696160881b828201528201525b8163ffffffff16606a1415612e6a57604080518082018252600781526611b3181b9ab29b60c91b602080830191909152908352815180830190925260148252734c69616e20486f6e67204c6f7475732050696e6b60601b828201528201525b8163ffffffff16606b1415612ec65760408051808201825260078152662366376333346360c81b6020808301919091529083528151808301909252601182527021b932b0b6bc9029bbb2b2ba1021b7b93760791b828201528201525b8163ffffffff16606c1415612f195760408051808201825260078152660236663306663360cc1b602080830191909152908352815180830190925260088252674347412050696e6b60c01b828201528201525b8163ffffffff16606d1415612f7157604080518082018252600781526611b3331b1b191960c91b6020808301919091529083528151808301909252600d82526c53706172726f7773204669726560981b828201528201525b8163ffffffff16606e1415612fc857604080518082018252600781526608d99898598e1960ca1b6020808301919091529083528151808301909252600c82526b4f72616e67652047726f766560a01b828201528201525b919050565b6060604051602001613748907f3c646566733e3c66696c7465722069643d226672616374616c222066696c746581527f72556e6974733d226f626a656374426f756e64696e67426f782220783d22302560208201527f2220793d223025222077696474683d223130302522206865696768743d22313060408201527f302522203e3c666554757262756c656e63652069643d2274757262756c656e6360608201527f652220747970653d226672616374616c4e6f697365222062617365467265717560808201527f656e63793d22302e303322206e756d4f6374617665733d223122203e3c616e6960a08201527f6d617465206174747269627574654e616d653d22626173654672657175656e6360c08201527f79222076616c7565733d22302e30313b302e343b302e303122206475723d223160e08201527f3030732220726570656174436f756e743d22696e646566696e69746522202f3e6101008201527f3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d616101208201527f7020696e3d22536f757263654772617068696322207363616c653d223530223e6101408201527f3c2f6665446973706c6163656d656e744d61703e3c2f66696c7465723e3c66696101608201527f6c7465722069643d226d6f727068223e3c66654d6f7270686f6c6f6779206f706101808201527f657261746f723d2264696c61746522207261646975733d2230223e3c616e696d6101a08201527f617465206174747269627574654e616d653d22726164697573222076616c75656101c08201527f733d22303b353b3022206475723d2238732220726570656174436f756e743d226101e08201527f696e646566696e69746522202f3e3c2f66654d6f7270686f6c6f67793e3c2f666102008201527f696c7465723e3c66696c7465722069643d22676c6f77222066696c746572556e6102208201527f6974733d226f626a656374426f756e64696e67426f782220783d2230252220796102408201527f3d223025222077696474683d223130302522206865696768743d2231303025226102608201527f203e3c6665476175737369616e426c757220737464446576696174696f6e3d226102808201527f352220726573756c743d22626c7572322220696e3d22536f75726365477261706102a08201527f68696322202f3e3c66654d657267653e3c66654d657267654e6f646520696e3d6102c08201527f22626c75723222202f3e3c66654d657267654e6f646520696e3d22536f7572636102e08201527f654772617068696322202f3e3c2f66654d657267653e3c2f66696c7465723e3c6103008201527f66696c7465722069643d226e6f697365223e3c666554757262756c656e6365206103208201527f626173654672657175656e63793d22302e3035222f3e3c6665436f6c6f724d616103408201527f7472697820747970653d22687565526f74617465222076616c7565733d2230226103608201527f3e3c616e696d617465206174747269627574654e616d653d2276616c756573226103808201527f2066726f6d3d22302220746f3d2233363022206475723d2231732220726570656103a08201527f6174436f756e743d22696e646566696e697465222f3e3c2f6665436f6c6f724d6103c08201527f61747269783e3c6665436f6c6f724d617472697820747970653d226d617472696103e08201527f78222076616c7565733d223020302030203020312030203020302030203020306104008201527f203020302030203020312030203020302030222f3e3c6665446973706c6163656104208201527f6d656e744d617020696e3d22536f757263654772617068696322207363616c656104408201527f3d223130222f3e3c2f66696c7465723e3c66696c7465722069643d226e6f6e656104608201527f223e3c66654f66667365743e3c2f66654f66667365743e3c2f66696c7465723e6104808201527f3c66696c7465722069643d227363726962626c65223e3c666554757262756c656104a08201527f6e636520747970653d2274757262756c656e63652220626173654672657175656104c08201527f6e63793d22302e303522206e756d4f6374617665733d22322220726573756c746104e08201527f3d2274757262756c656e6365222f3e3c6665446973706c6163656d656e744d616105008201527f7020696e323d2274757262756c656e63652220696e3d22536f757263654772616105208201527f7068696322207363616c653d2235302220784368616e6e656c53656c6563746f6105408201527f723d22522220794368616e6e656c53656c6563746f723d2247222f3e3c2f66696105608201527f6c7465723e3c66696c7465722069643d2274696c652220783d2231302220793d6105808201527f223130222077696474683d2231302522206865696768743d22313025223e3c666105a08201527f6554696c6520696e3d22536f75726365477261706869632220783d22313022206105c08201527f793d223130222077696474683d22313022206865696768743d22313022202f3e6105e0820152781e3332aa34b632979f1e17b334b63a32b91f1e17b232b3399f60391b6106008201526106190190565b604051602081830303815290604052905090565b604080516101208082526124208201909252600091829182916020820161240080368337019050509050600091505b60908210156137c55760088183815181106137a8576137a8615874565b6020908102919091010152816137bd8161588a565b92505061378b565b6101008210156138005760098183815181106137e3576137e3615874565b6020908102919091010152816137f88161588a565b9250506137c5565b61011882101561383b57600781838151811061381e5761381e615874565b6020908102919091010152816138338161588a565b925050613800565b61012082101561387657600881838151811061385957613859615874565b60209081029190910101528161386e8161588a565b92505061383b565b6138898460c00151826101206000613c56565b50600091505b601e8210156138c95760058183815181106138ac576138ac615874565b6020908102919091010152816138c18161588a565b92505061388f565b6138db8460e0015182601e6000613c56565b506000949350505050565b608082015160009081905b838560a00151101561397a578460400151518560600151141561391c57600160009250925050610988565b60a08501516040860151606087018051906139368261588a565b90528151811061394857613948615874565b602001015160f81c60f81b60f81c60ff16901b8117905060088560a0018181516139729190615846565b9052506138f1565b80841c608086015260a085018051859190613996908390615579565b90525060006139a8600180871b615579565b60009792169550909350505050565b60006139d6604051806040016040528060608152602001606081525090565b604080518082019091526060808252602082015260006139f585613f21565b90945092509050600081600e811115613a1057613a1061585e565b14613a1d57949350505050565b613a288584846145d7565b95945050505050565b6000610609828360c001518460e001516145d7565b60006080820181905260a082018190526040820151516060830151829190613a6f906004615846565b1115613a7e5750600192915050565b604083015160608401805190613a938261588a565b905281518110613aa557613aa5615874565b0160200151604084015160608501805160f89390931c935060089290613aca8261588a565b905281518110613adc57613adc615874565b602001015160f81c60f81b60f81c60ff16901b81179050801960ff168360400151846060018051809190613b0f9061588a565b905281518110613b2157613b21615874565b016020015160f81c141580613b6c5750604083015160608401805160ff841960081c169291613b4f8261588a565b905281518110613b6157613b61615874565b016020015160f81c14155b15613b7a5750600492915050565b826040015151818460600151613b909190615846565b1115613b9f5750600192915050565b8251516020840151613bb2908390615846565b1115613bc15750600292915050565b8015613c4d57613bd2600182615579565b90508260400151836060018051809190613beb9061588a565b905281518110613bfd57613bfd615874565b602001015160f81c60f81b8360000151846020018051809190613c1f9061588a565b905281518110613c3157613c31615874565b60200101906001600160f81b031916908160001a905350613bc1565b50600092915050565b600080600080613c64615133565b600092505b600f8311613ca657600089600001518481518110613c8957613c89615874565b602090810291909101015282613c9e8161588a565b935050613c69565b600093505b86841015613d1257885188613cc08689615846565b81518110613cd057613cd0615874565b602002602001015181518110613ce857613ce8615874565b602002602001018051809190613cfd9061588a565b90525083613d0a8161588a565b945050613cab565b868960000151600081518110613d2a57613d2a615874565b60200260200101511415613d45576000945050505050613f19565b60019150600192505b600f8311613dc8578851805160019390931b9284908110613d7157613d71615874565b6020026020010151821015613d8d57600e945050505050613f19565b8851805184908110613da157613da1615874565b602002602001015182613db49190615579565b915082613dc08161588a565b935050613d4e565b60006020820152600192505b600f831015613e4d578851805184908110613df157613df1615874565b6020026020010151818460108110613e0b57613e0b615874565b6020020151613e1a9190615846565b81613e26856001615846565b60108110613e3657613e36615874565b602002015282613e458161588a565b935050613dd4565b600093505b86841015613f005787613e658588615846565b81518110613e7557613e75615874565b6020026020010151600014613eee5760208901518490828a613e97848b615846565b81518110613ea757613ea7615874565b602002602001015160108110613ebf57613ebf615874565b60200201805190613ecf8261588a565b905281518110613ee157613ee1615874565b6020026020010181815250505b83613ef88161588a565b945050613e52565b60008211613f0f576000613f12565b600e5b9450505050505b949350505050565b6000613f40604051806040016040528060608152602001606081525090565b6040805180820190915260608082526020820152600080808080613f67601e61011e615846565b6001600160401b03811115613f7e57613f7e615234565b604051908082528060200260200182016040528015613fa7578160200160208202803683370190505b50905060006040518060400160405280600f6001613fc59190615846565b6001600160401b03811115613fdc57613fdc615234565b604051908082528060200260200182016040528015614005578160200160208202803683370190505b5081526040805161011e8082526123e0820190925260209283019290919082016123c08036833701905050815250905060006040518060400160405280600f60016140509190615846565b6001600160401b0381111561406757614067615234565b604051908082528060200260200182016040528015614090578160200160208202803683370190505b50815260408051601e8082526103e0820190925260209283019290919082016103c0803683375050509052905060006140ca8c60056138e6565b98509450600085600e8111156140e2576140e261585e565b146140fa575092985096509094506145d09350505050565b61410661010189615846565b97506141138c60056138e6565b97509450600085600e81111561412b5761412b61585e565b14614143575092985096509094506145d09350505050565b61414e600188615846565b965061011e8811806141605750601e87115b1561417a57506005995090975095506145d0945050505050565b6141838c614e02565b9095509350600085600e81111561419c5761419c61585e565b146141b4575092985096509094506145d09350505050565b6141c2838560136000613c56565b9450600085600e8111156141d8576141d861585e565b146141f257506006995090975095506145d0945050505050565b600095505b6142018789615846565b8610156143fa576000806142158e86615024565b9097509150600087600e81111561422e5761422e61585e565b146142485750949a5091985096506145d095505050505050565b60108210156142805781868961425d8161588a565b9a508151811061426f5761426f615874565b6020026020010181815250506143f3565b506000601082141561431f57876142a9575060079b509299509097506145d09650505050505050565b856142b560018a615579565b815181106142c5576142c5615874565b602002602001015190506142da8e60026138e6565b9097509250600087600e8111156142f3576142f361585e565b1461430d5750949a5091985096506145d095505050505050565b614318836003615846565b915061437f565b8160111415614333576142da8e60036138e6565b61433e8e60076138e6565b9097509250600087600e8111156143575761435761585e565b146143715750949a5091985096506145d095505050505050565b61437c83600b615846565b91505b614389898b615846565b614393838a615846565b11156143b1575060089b509299509097506145d09650505050505050565b81156143f3576143c2600183615579565b91508086896143d08161588a565b9a50815181106143e2576143e2615874565b6020026020010181815250506143b1565b50506141f7565b836101008151811061440e5761440e615874565b6020026020010151600014156144335750600b995090975095506145d0945050505050565b61444083858a6000613c56565b9450600085600e8111156144565761445661585e565b141580156144e05750600185600e8111156144735761447361585e565b14806144905750600285600e81111561448e5761448e61585e565b145b806144e057508251805160019081106144ab576144ab615874565b602002602001015183600001516000815181106144ca576144ca615874565b60200260200101516144dc9190615846565b8814155b156144fa57506009995090975095506145d0945050505050565b6145068285898b613c56565b9450600085600e81111561451c5761451c61585e565b141580156145a65750600185600e8111156145395761453961585e565b14806145565750600285600e8111156145545761455461585e565b145b806145a6575081518051600190811061457157614571615874565b6020026020010151826000015160008151811061459057614590615874565b60200260200101516145a29190615846565b8714155b156145c05750600a995090975095506145d0945050505050565b5060009950909750955050505050505b9193909250565b6000806000806000604051806103a00160405280600361ffff168152602001600461ffff168152602001600561ffff168152602001600661ffff168152602001600761ffff168152602001600861ffff168152602001600961ffff168152602001600a61ffff168152602001600b61ffff168152602001600d61ffff168152602001600f61ffff168152602001601161ffff168152602001601361ffff168152602001601761ffff168152602001601b61ffff168152602001601f61ffff168152602001602361ffff168152602001602b61ffff168152602001603361ffff168152602001603b61ffff168152602001604361ffff168152602001605361ffff168152602001606361ffff168152602001607361ffff168152602001608361ffff16815260200160a361ffff16815260200160c361ffff16815260200160e361ffff16815260200161010261ffff1681525090506000604051806103a00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600560ff168152602001600560ff168152602001600560ff168152602001600060ff1681525090506000604051806103c00160405280600161ffff168152602001600261ffff168152602001600361ffff168152602001600461ffff168152602001600561ffff168152602001600761ffff168152602001600961ffff168152602001600d61ffff168152602001601161ffff168152602001601961ffff168152602001602161ffff168152602001603161ffff168152602001604161ffff168152602001606161ffff168152602001608161ffff16815260200160c161ffff16815260200161010161ffff16815260200161018161ffff16815260200161020161ffff16815260200161030161ffff16815260200161040161ffff16815260200161060161ffff16815260200161080161ffff168152602001610c0161ffff16815260200161100161ffff16815260200161180161ffff16815260200161200161ffff16815260200161300161ffff16815260200161400161ffff16815260200161600161ffff1681525090506000604051806103c00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600160ff168152602001600160ff168152602001600260ff168152602001600260ff168152602001600360ff168152602001600360ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600560ff168152602001600660ff168152602001600660ff168152602001600760ff168152602001600760ff168152602001600860ff168152602001600860ff168152602001600960ff168152602001600960ff168152602001600a60ff168152602001600a60ff168152602001600b60ff168152602001600b60ff168152602001600c60ff168152602001600c60ff168152602001600d60ff168152602001600d60ff16815250905060005b8761010014614df057614b118c8c615024565b98509050600081600e811115614b2957614b2961585e565b14614b3d5797506106d79650505050505050565b610100881015614bb3578b515160208d01511415614b66576002985050505050505050506106d7565b8760f81b8c600001518d6020015181518110614b8457614b84615874565b60200101906001600160f81b031916908160001a90535060208c01805190614bab8261588a565b905250614afe565b610100881115614dde576000614bcb6101018a615579565b9850601d8910614be757600c99505050505050505050506106d7565b614c0a8d868b601d8110614bfd57614bfd615874565b602002015160ff166138e6565b9092509050600082600e811115614c2357614c2361585e565b14614c38575097506106d79650505050505050565b80868a601d8110614c4b57614c4b615874565b602002015161ffff16614c5e9190615846565b9750614c6a8d8c615024565b99509150600082600e811115614c8257614c8261585e565b14614c97575097506106d79650505050505050565b614cad8d848b601e8110614bfd57614bfd615874565b9092509050600082600e811115614cc657614cc661585e565b14614cdb575097506106d79650505050505050565b80848a601e8110614cee57614cee615874565b602002015161ffff16614d019190615846565b96508c60200151871115614d2157600d99505050505050505050506106d7565b8c515160208e0151614d34908a90615846565b1115614d4c57600299505050505050505050506106d7565b8715614dd857614d5d600189615579565b97508c60000151878e60200151614d749190615579565b81518110614d8457614d84615874565b602001015160f81c60f81b8d600001518e6020015181518110614da957614da9615874565b60200101906001600160f81b031916908160001a90535060208d01805190614dd08261588a565b905250614d4c565b50614afe565b868c602001818151614bab9190615846565b5060009b9a5050505050505050505050565b60006060818080614e16601e61011e615846565b6001600160401b03811115614e2d57614e2d615234565b604051908082528060200260200182016040528015614e56578160200160208202803683370190505b506040805161026081018252601081526011602082015260129181019190915260006060820181905260086080830152600760a0830152600960c0830152600660e0830152600a6101008301526005610120830152600b61014083015260046101608301819052600c61018084015260036101a0840152600d6101c084015260026101e0840152600e6102008401526001610220840152600f61024084015292935091614f049089906138e6565b95509150600082600e811115614f1c57614f1c61585e565b14614f2d5750969095509350505050565b614f38600486615846565b9450600093505b84841015614fc157614f528860036138e6565b84838760138110614f6557614f65615874565b602002015160ff1681518110614f7d57614f7d615874565b60209081029190910101529150600082600e811115614f9e57614f9e61585e565b14614faf5750969095509350505050565b83614fb98161588a565b945050614f3f565b601384101561501457600083828660138110614fdf57614fdf615874565b602002015160ff1681518110614ff757614ff7615874565b60209081029190910101528361500c8161588a565b945050614fc1565b5060009791965090945050505050565b600080600181808080805b600f86116151205760006150448b60016138e6565b9092509050600082600e81111561505d5761505d61585e565b146150745750965060009550610988945050505050565b89518051968217968890811061508c5761508c615874565b6020026020010151935083856150a29190615846565b8610156150ed5760208a01516000906150bb8789615579565b6150c59086615846565b815181106150d5576150d5615874565b60200260200101519850985050505050505050610988565b6150f78484615846565b92506151038486615846565b600196871b961b94508690506151188161588a565b96505061502f565b50600c9960009950975050505050505050565b6040518061020001604052806010906020820280368337509192915050565b60006020828403121561516457600080fd5b5035919050565b60005b8381101561518657818101518382015260200161516e565b83811115615195576000848401525b50505050565b600081518084526151b381602086016020860161516b565b601f01601f19169290920160200192915050565b60a0815260006151da60a083018861519b565b82810360208401526151ec818861519b565b90508281036040840152615200818761519b565b90508281036060840152615214818661519b565b90508281036080840152615228818561519b565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561526c5761526c615234565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529a5761529a615234565b604052919050565b60006001600160401b038211156152bb576152bb615234565b50601f01601f191660200190565b600082601f8301126152da57600080fd5b81356152ed6152e8826152a2565b615272565b81815284602083860101111561530257600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561533157600080fd5b81356001600160401b038082111561534857600080fd5b908301906060828603121561535c57600080fd5b61536461524a565b82358281111561537357600080fd5b61537f878286016152c9565b82525060208301358281111561539457600080fd5b6153a0878286016152c9565b6020830152506040830135604082015280935050505092915050565b6040815260006153cf604083018561519b565b8281036020840152613a28818561519b565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061540e5761540e6153e1565b92169190910692915050565b60006154286152e8846152a2565b905082815283838301111561543c57600080fd5b6106d783602083018461516b565b600082601f83011261545b57600080fd5b6106d78383516020850161541a565b60006020828403121561547c57600080fd5b81516001600160401b038082111561549357600080fd5b90830190606082860312156154a757600080fd5b6154af61524a565b8251828111156154be57600080fd5b6154ca8782860161544a565b8252506020830151828111156154df57600080fd5b6154eb8782860161544a565b6020830152506040830151604082015280935050505092915050565b6000815161551981856020860161516b565b9290920192915050565b6000835161553581846020880161516b565b83519083019061554981836020880161516b565b651e17b9bb339f60d11b9101908152600601949350505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561558b5761558b615563565b500390565b600060ff8316806155a3576155a36153e1565b8060ff84160691505092915050565b600063ffffffff8083168185168083038211156155d1576155d1615563565b01949350505050565b600063ffffffff838116908316818110156155f7576155f7615563565b039392505050565b6000825161561181846020870161516b565b9190910192915050565b60006020828403121561562d57600080fd5b81516001600160401b0381111561564357600080fd5b8201601f8101841361565457600080fd5b613f198482516020840161541a565b7f3c7376672076696577426f783d2730203020363430203634302720776964746881527f3d273130302527206865696768743d27313030252720786d6c6e733d2768747460208201527f703a2f2f7777772e77332e6f72672f323030302f737667273e3c7374796c653e60408201527f2040666f6e742d66616365207b20666f6e742d66616d696c793a20436f7572696060820152716572466f6e743b207372633a2075726c282760701b608082015260008651615728816092850160208b0161516b565b77272920666f726d617428276f70656e7479706527293b207d60401b609291840191820152712e626173657b66696c7465723a75726c282360701b60aa820152865161577b8160bc840160208b0161516b565b66149db334b6361d60c91b60bc929091019182015261522861583561582f6157f66157f06157ac60c387018c615507565b7f3b666f6e742d66616d696c793a436f7572696572466f6e743b666f6e742d73698152713d329d10189b383c1dbe9e17b9ba3cb6329f60711b602082015260320190565b89615507565b7f3c726563742077696474683d223130302522206865696768743d223130302522815266103334b6361e9160c91b602082015260270190565b86615507565b6401110179f160dd1b815260050190565b6000821982111561585957615859615563565b500190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060001982141561589e5761589e615563565b506001019056fea264697066735822122005c36c4204a0fa9862c9ca1c27df1968811897c74f776c879099d33cef697ae564736f6c634300080900330000000000000000000000004f58ee8f0ed85d8e02fd8a33ebc8122433bf6112000000000000000000000000944bbd7e287c74a6eab7d3c9aaad0707301fe036000000000000000000000000e643991873f308bb35e8fa39928bf8af4bd85386
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063338dc74e1461003b57806390accf5614610068575b600080fd5b61004e610049366004615152565b610089565b60405161005f9594939291906151c7565b60405180910390f35b61007b61007636600461531f565b610328565b60405161005f9291906153bc565b60608080808060006100a6604563ffffffff609f8a901c166153f7565b905060006100bf606463ffffffff607f8b901c166153f7565b905060006100d28263ffffffff16610349565b90506000806100e08b6104c5565b9150915060608060328763ffffffff1610156101a55760405163586e3c7d60e11b815263ffffffff8816600482015261019c907f000000000000000000000000944bbd7e287c74a6eab7d3c9aaad0707301fe0366001600160a01b03169063b0dc78fa906024015b60006040518083038186803b15801561016057600080fd5b505afa158015610174573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610076919081019061546a565b92509050610200565b60405163586e3c7d60e11b815263ffffffff881660048201526101fb907f000000000000000000000000e643991873f308bb35e8fa39928bf8af4bd853866001600160a01b03169063b0dc78fa90602401610148565b925090505b6102258160405180604001604052806003815260200162090caf60eb1b8152506105a4565b806102535750610253816040518060400160405280600681526020016542696e61727960d01b8152506105a4565b80610280575061028081604051806040016040528060058152602001644d6f72736560d81b8152506105a4565b806102b057506102b081604051806040016040528060088152602001674d6e656d6f6e696360c01b8152506105a4565b156102d557604051806040016040528060048152602001636e6f6e6560e01b81525094505b835183516102e491908761060f565b826040516020016102f6929190615523565b60408051601f198184030181529190526020948501519390940151939d909c50919a5091985091965090945050505050565b606080600061033f846020015185604001516106de565b9451959350505050565b6060816001148061035a5750816002145b806103655750816003145b806103705750816004145b8061037b5750816005145b156103a15750506040805180820190915260058152646e6f69736560d81b602082015290565b81600714806103b05750816008145b806103bb5750816009145b156103e45750506040805180820190915260088152677363726962626c6560c01b602082015290565b60466103f1836064615579565b1180156104095750605a610406836064615579565b11155b1561042f5750506040805180820190915260058152640dadee4e0d60db1b602082015290565b603c61043c836064615579565b11801561045457506046610451836064615579565b11155b15610479575050604080518082019091526004815263676c6f7760e01b602082015290565b81604514156104a5575050604080518082019091526007815266199c9858dd185b60ca1b602082015290565b50506040805180820190915260048152636e6f6e6560e01b602082015290565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006104fe606f60e086901c6153f7565b90506000610517600563ffffffff60c088901c166153f7565b9050600061052d600260ff60b889901c16615590565b60ff16905060008161056157606f6105468460376155b2565b61055090866155b2565b61055a91906153f7565b9050610585565b606f61056e8460376155da565b61057890866155b2565b61058291906153f7565b90505b61058e8461098f565b6105978261098f565b9550955050505050915091565b600081518351146105b757506000610609565b816040516020016105c891906155ff565b60405160208183030381529060405280519060200120836040516020016105ef91906155ff565b604051602081830303815290604052805190602001201490505b92915050565b60607f0000000000000000000000004f58ee8f0ed85d8e02fd8a33ebc8122433bf61126001600160a01b0316639d37bc7c6040518163ffffffff1660e01b815260040160006040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a6919081019061561b565b82846106b0612fcd565b876040516020016106c5959493929190615663565b60405160208183030381529060405290505b9392505050565b600060606000604051806101000160405280856001600160401b0381111561070857610708615234565b6040519080825280601f01601f191660200182016040528015610732576020820181803683370190505b508152602001600081526020018681526020016000815260200160008152602001600081526020016040518060400160405280600f60016107739190615846565b6001600160401b0381111561078a5761078a615234565b6040519080825280602002602001820160405280156107b3578160200160208202803683370190505b5081526040805161012080825261242082019092526020928301929091908201612400803683370190505081525081526020016040518060400160405280600f60016107ff9190615846565b6001600160401b0381111561081657610816615234565b60405190808252806020026020018201604052801561083f578160200160208202803683370190505b50815260408051601e8082526103e0820190925260209283019290919082016103c0803683375050509052905290506000808061087b8461375c565b9050600081600e8111156108915761089161585e565b146108a6579251929450919250610988915050565b8261097d576108b68460016138e6565b93509050600081600e8111156108ce576108ce61585e565b146108e3579251929450919250610988915050565b6108ee8460026138e6565b92509050600081600e8111156109065761090661585e565b1461091b579251929450919250610988915050565b811561094f57816001146109465781600214610938576003610958565b610941846139b7565b610958565b61094184613a31565b61095884613a46565b9050600081600e81111561096e5761096e61585e565b146109785761097d565b6108a6565b925192945091925050505b9250929050565b604080518082019091526060808252602082015263ffffffff82166109ef5760408051808201825260078152660233030303030360cc1b60208083019190915290835281518083019092526005825264426c61636b60d81b828201528201525b8163ffffffff1660011415610a485760408051808201825260078152662330303463366160c81b6020808301919091529083528151808301909252600e82526d4e617679204461726b20426c756560901b828201528201525b8163ffffffff1660021415610a9e57604080518082018252600781526608cc0c0e4e190d60ca1b6020808301919091529083528151808301909252600b82526a42617965726e20426c756560a81b828201528201525b8163ffffffff1660031415610af9576040805180820182526007815266119818329a199b60c91b6020808301919091529083528151808301909252601082526f2632bc30b637b33336329023b932b2b760811b828201528201525b8163ffffffff1660041415610b51576040805180820182526007815266119898199a309b60c91b6020808301919091529083528151808301909252600d82526c456779707469616e20426c756560981b828201528201525b8163ffffffff1660051415610ba75760408051808201825260078152662330303838313160c81b6020808301919091529083528151808301909252600b82526a263ab9b41023b0b93232b760a91b828201528201525b8163ffffffff1660061415610c01576040805180820182526007815266046606cc8606e760cb1b6020808301919091529083528151808301909252600f82526e2ab73232b93bb0ba32b9102332b93760891b828201528201525b8163ffffffff1660071415610c565760408051808201825260078152660233163316366360cc1b6020808301919091529083528151808301909252600a825269109b1d59589bdb9b995d60b21b828201528201525b8163ffffffff1660081415610cad5760408051808201825260078152662331323734353360c81b6020808301919091529083528151808301909252600c82526b11dc99595b8815995b1d995d60a21b828201528201525b8163ffffffff1660091415610d0757604080518082018252600781526608cc4d1898588d60ca1b6020808301919091529083528151808301909252600f82526e53757065722052617265204a61646560881b828201528201525b8163ffffffff16600a1415610d58576040805180820182526007808252661198989898991960c91b6020808401919091529184528251808401909352825266436f726265617560c81b828201528201525b8163ffffffff16600b1415610dae5760408051808201825260078152662331363564393560c81b6020808301919091529083528151808301909252600b82526a13185c1a5cc812995dd95b60aa1b828201528201525b8163ffffffff16600c1415610e025760408051808201825260078152662331366238663360c81b602080830191909152908352815180830190925260098252685a696d6120426c756560b81b828201528201525b8163ffffffff16600d1415610e605760408051808201825260078152661198b2b31c1b9b60c91b6020808301919091529083528151808301909252601382527214de5b9d1a195d1a58c814dc19585c9b5a5b9d606a1b828201528201525b8163ffffffff16600e1415610eb1576040805180820182526007808252661199189a33319b60c91b60208084019190915291845282518084019093528252662732bb9021b0b960c91b828201528201525b8163ffffffff16600f1415610f0b5760408051808201825260078152660466468726268760cb1b6020808301919091529083528151808301909252600f82526e2830b832b93137bc93b9902630bbb760891b828201528201525b8163ffffffff1660101415610f635760408051808201825260078152662332346461393160c81b6020808301919091529083528151808301909252600d82526c2932b83a34b6329023b932b2b760991b828201528201525b8163ffffffff1660111415610fbc5760408051808201825260078152662332323333313160c81b6020808301919091529083528151808301909252600e82526d11185c9ad95cdd08119bdc995cdd60921b828201528201525b8163ffffffff166012141561101257604080518082018252600781526608cc8e4dd98d9960ca1b6020808301919091529083528151808301909252600b82526a4d65726d6169642053656160a81b828201528201525b8163ffffffff16601314156110685760408051808201825260078152662332326363636360c81b6020808301919091529083528151808301909252600b82526a13595c9b585a590813995d60aa1b828201528201525b8163ffffffff16601414156110bd5760408051808201825260078152662332653232343960c81b6020808301919091529083528151808301909252600a825269456c646572626572727960b01b828201528201525b8163ffffffff16601514156111155760408051808201825260078152662333323661623160c81b6020808301919091529083528151808301909252600d82526c446f766572205374726169747360981b828201528201525b8163ffffffff166016141561116e576040805180820182526007815266119931319a98b160c91b6020808301919091529083528151808301909252600e82526d46656c776f6f64204c656176657360901b828201528201525b8163ffffffff16601714156111c55760408051808201825260078152662333393132383560c81b6020808301919091529083528151808301909252600c82526b2834bc34b2902837bbb232b960a11b828201528201525b8163ffffffff166018141561122257604080518082018252600781526604664ca6a70ca760cb1b602080830191909152908352815180830190925260128252715665746572616e27732044617920426c756560701b828201528201525b8163ffffffff166019141561127a5760408051808201825260078152662334313966353960c81b6020808301919091529083528151808301909252600d82526c21b430ba32b0ba9023b932b2b760991b828201528201525b8163ffffffff16601a14156112d35760408051808201825260078152662334356539633160c81b6020808301919091529083528151808301909252600e82526d417068726f64697465204171756160901b828201528201525b8163ffffffff16601b14156113295760408051808201825260078152660233432343333360cc1b6020808301919091529083528151808301909252600b82526a08ec2e4c8cadc40a0c2e8d60ab1b828201528201525b8163ffffffff16601c141561137a576040805180820182526007808252662334323933393560c81b602080840191909152918452825180840190935282526621b0ba30b630b760c91b828201528201525b8163ffffffff16601d14156113d05760408051808201825260078152660233434646430360cc1b6020808301919091529083528151808301909252600b82526a4d6167696320426c61646560a81b828201528201525b8163ffffffff16601e1415611427576040805180820182526007815266119a1999329b3360c91b6020808301919091529083528151808301909252600c82526b48657220486967686e65737360a01b828201528201525b8163ffffffff16601f141561147d57604080518082018252600781526608cd0d0dcdd91960ca1b6020808301919091529083528151808301909252600b82526a416e6472656120426c756560a81b828201528201525b8163ffffffff16602014156114d65760408051808201825260078152662335616433336560c81b6020808301919091529083528151808301909252600e82526d56657264616e74204669656c647360901b828201528201525b8163ffffffff166021141561152c5760408051808201825260078152662333613138623160c81b6020808301919091529083528151808301909252600b82526a496e6469676f20426c756560a81b828201528201525b8163ffffffff16602214156115885760408051808201825260078152662335353636313160c81b60208083019190915290835281518083019092526011825270119bdc995cdd1a585b0813dd5d1c1bdcdd607a1b828201528201525b8163ffffffff16602314156115e15760408051808201825260078152660466a6ac4c470760cb1b6020808301919091529083528151808301909252600e82526d426c656163686564204f6c69766560901b828201528201525b8163ffffffff166024141561163d5760408051808201825260078152662335353030656560c81b6020808301919091529083528151808301909252601182527054657a6361746c69706f636120426c756560781b828201528201525b8163ffffffff166025141561169357604080518082018252600781526608cd4d0d4d4d4d60ca1b6020808301919091529083528151808301909252600b82526a436172626f6e20436f707960a81b828201528201525b8163ffffffff16602614156116e45760408051808201825260078152662335386130626360c81b60208083019190915290835281518083019092526006825265223ab830b4b760d11b828201528201525b8163ffffffff166027141561173c576040805180820182526007815266119a9ab333191960c91b6020808301919091529083528151808301909252600d82526c2a3930b33334b19023b932b2b760991b828201528201525b8163ffffffff16602814156117915760408051808201825260078152660233562336539360cc1b6020808301919091529083528151808301909252600a825269088c2d2e6f24084eae6d60b31b828201528201525b8163ffffffff16602914156117e6576040805180820182526007815266119b1b1c1c333360c91b6020808301919091529083528151808301909252600a825269446565702044656e696d60b01b828201528201525b8163ffffffff16602a141561183f5760408051808201825260078152660233631653136360cc1b6020808301919091529083528151808301909252600e82526d2634b3b43a34b9b41023b932b2b760911b828201528201525b8163ffffffff16602b14156118965760408051808201825260078152662336613331636160c81b6020808301919091529083528151808301909252600c82526b536167617420507572706c6560a01b828201528201525b8163ffffffff16602c14156118ef5760408051808201825260078152662336363763336560c81b6020808301919091529083528151808301909252600e82526d26b4b634ba30b93c9023b932b2b760911b828201528201525b8163ffffffff16602d141561194657604080518082018252600781526608cd8e18ce0e5960ca1b6020808301919091529083528151808301909252600c82526b496e74656e7365204a61646560a01b828201528201525b8163ffffffff16602e141561199f5760408051808201825260078152660466cc8626060760cb1b6020808301919091529083528151808301909252600e82526d21b432b9ba373aba10213937bbb760911b828201528201525b8163ffffffff16602f14156119f657604080518082018252600781526608cd8e4d8ccdcd60ca1b6020808301919091529083528151808301909252600c82526b0a0eae4e0d8ca40a0eadcc6d60a31b828201528201525b8163ffffffff1660301415611a4b5760408051808201825260078152660233666623765360cc1b6020808301919091529083528151808301909252600a8252694c69666520466f72636560b01b828201528201525b8163ffffffff1660311415611aa957604080518082018252600781526608cdcdcc0c0d0d60ca1b602080830191909152908352815180830190925260138252724461776e206f6620746865204661697269657360681b828201528201525b8163ffffffff1660321415611b025760408051808201825260078152662337383531613960c81b6020808301919091529083528151808301909252600e82526d2937bcb0b6102630bb32b73232b960911b828201528201525b8163ffffffff1660331415611b5e5760408051808201825260078152660466e6c72c662760cb1b60208083019190915290835281518083019092526011825270263ab6b4b732b9b1b2b73a1023b932b2b760791b828201528201525b8163ffffffff1660341415611baf57604080518082018252600780825266119bb1329c1c9960c91b6020808401919091529184528251808401909352825266149859ddd9595960ca1b828201528201525b8163ffffffff1660351415611c075760408051808201825260078152662337303362653760c81b6020808301919091529083528151808301909252600d82526c426c7569736820507572706c6560981b828201528201525b8163ffffffff1660361415611c5d57604080518082018252600781526608cdd88e188d5960ca1b6020808301919091529083528151808301909252600b82526a53616765204c656176657360a81b828201528201525b8163ffffffff1660371415611cb85760408051808201825260078152662338326439633560c81b6020808301919091529083528151808301909252601082526f54656e6465722054757271756f69736560801b828201528201525b8163ffffffff1660381415611d105760408051808201825260078152660233765323533360cc1b6020808301919091529083528151808301909252600d82526c536361726c657420536861646560981b828201528201525b8163ffffffff1660391415611d6a5760408051808201825260078152662338333736396360c81b6020808301919091529083528151808301909252600f82526e566f786174726f6e20507572706c6560881b828201528201525b8163ffffffff16603a1415611dc25760408051808201825260078152660233838636330360cc1b6020808301919091529083528151808301909252600d82526c466162756c6f75732046726f6760981b828201528201525b8163ffffffff16603b1415611e1d576040805180820182526007815266119c1c18989b1b60c91b6020808301919091529083528151808301909252601082526f506f7373657373656420507572706c6560801b828201528201525b8163ffffffff16603c1415611e7557604080518082018252600781526608ce0dcd4d994d60ca1b6020808301919091529083528151808301909252600d82526c476c6f6f6d7920507572706c6560981b828201528201525b8163ffffffff16603d1415611ed357604080518082018252600781526608ce4cd88c4cd960ca1b60208083019190915290835281518083019092526013825272477265656e205465612049636520437265616d60681b828201528201525b8163ffffffff16603e1415611f285760408051808201825260078152662339306664613960c81b6020808301919091529083528151808301909252600a8252692337b0b69023b932b2b760b11b828201528201525b8163ffffffff16603f1415611f815760408051808201825260078152662339313462313360c81b6020808301919091529083528151808301909252600e82526d2830b930b9b4ba3290213937bbb760911b828201528201525b8163ffffffff1660401415611fdd5760408051808201825260078152662339313963383160c81b6020808301919091529083528151808301909252601182527057686973706572696e672057696c6c6f7760781b828201528201525b8163ffffffff16604114156120355760408051808201825260078152662339396565656560c81b6020808301919091529083528151808301909252600d82526c467265657a7920427265657a7960981b828201528201525b8163ffffffff16604214156120895760408051808201825260078152662339383364353360c81b60208083019190915290835281518083019092526009825268105b19d8594814995960ba1b828201528201525b8163ffffffff16604314156120e45760408051808201825260078152662339633837633160c81b6020808301919091529083528151808301909252601082526f50657472696669656420507572706c6560801b828201528201525b8163ffffffff16604414156121405760408051808201825260078152662339386461326360c81b60208083019190915290835281518083019092526011825270456666657276657363656e74204c696d6560781b828201528201525b8163ffffffff16604514156121955760408051808201825260078152662339343231393360c81b6020808301919091529083528151808301909252600a82526941636169204a7569636560b01b828201528201525b8163ffffffff16604614156121f25760408051808201825260078152662361363735666560c81b60208083019190915290835281518083019092526012825271141d5c9c1b1948125b1b1d5cda5bdb9a5cdd60721b828201528201525b8163ffffffff16604714156122495760408051808201825260078152662361346331363160c81b6020808301919091529083528151808301909252600c82526b4a756e676c65204a7569636560a01b828201528201525b8163ffffffff16604814156122a55760408051808201825260078152662361613030636360c81b602080830191909152908352815180830190925260118252704665726f63696f7573204675636873696160781b828201528201525b8163ffffffff16604914156122fb5760408051808201825260078152662361383565333960c81b6020808301919091529083528151808301909252600b82526a4561727468656e204a756760a81b828201528201525b8163ffffffff16604a141561235057604080518082018252600781526608d858584e584d60ca1b6020808301919091529083528151808301909252600a825269456c6c6965204772657960b01b828201528201525b8163ffffffff16604b14156123b15760408051808201825260078152662361616565313160c81b6020808301919091529083528151808301909252601682527523b637b934b7bab99023b932b2b71023b634ba3a32b960511b828201528201525b8163ffffffff16604c14156124095760408051808201825260078152662361643433373960c81b6020808301919091529083528151808301909252600d82526c26bcb9ba34b19026b0b937b7b760991b828201528201525b8163ffffffff16604d141561246757604080518082018252600781526608d88c4e4d594d60ca1b60208083019190915290835281518083019092526013825272111c99585b5e4810d85b991e48119bdc995cdd606a1b828201528201525b8163ffffffff16604e14156124b85760408051808201825260078082526611b118b2321a9960c91b602080840191909152918452825180840190935282526621b7b734b332b960c91b828201528201525b8163ffffffff16604f141561251157604080518082018252600781526611b198199a30b360c91b6020808301919091529083528151808301909252600e82526d141a5b9ac814195c995b9b9a585b60921b828201528201525b8163ffffffff16605014156125795760408051808201825260078152662362373837323760c81b6020808301919091529083528151808301909252601d82527f556e6976657273697479206f662043616c69666f726e696120476f6c64000000828201528201525b8163ffffffff16605114156125d057604080518082018252600781526611b11cb2181c3160c91b6020808301919091529083528151808301909252600c82526b596f756e67204c656176657360a01b828201528201525b8163ffffffff166052141561262b5760408051808201825260078152662362623131656560c81b6020808301919091529083528151808301909252601082526f50726f6d697363756f75732050696e6b60801b828201528201525b8163ffffffff16605314156126825760408051808201825260078152660236330363936360cc1b6020808301919091529083528151808301909252600c82526b15185c195cdd1c9e4814995960a21b828201528201525b8163ffffffff16605414156126d85760408051808201825260078152662362656262633960c81b6020808301919091529083528151808301909252600b82526a53696c766572626572727960a81b828201528201525b8163ffffffff16605514156127305760408051808201825260078152660236266306133360cc1b6020808301919091529083528151808301909252600d82526c13db190811db1bdc9e48149959609a1b828201528201525b8163ffffffff16605614156127875760408051808201825260078152662363333562393960c81b6020808301919091529083528151808301909252600c82526b131b1a5b1858dc5d595c995960a21b828201528201525b8163ffffffff16605714156127e057604080518082018252600781526611b1b0b09c981b60c91b6020808301919091529083528151808301909252600e82526d10da1c9a5cdd1b585cc811dbdb1960921b828201528201525b8163ffffffff16605814156128385760408051808201825260078152662363326631373760c81b6020808301919091529083528151808301909252600d82526c437563756d626572204d696c6b60981b828201528201525b8163ffffffff16605914156128915760408051808201825260078152662364363438643760c81b6020808301919091529083528151808301909252600e82526d50696e6b69736820507572706c6560901b828201528201525b8163ffffffff16605a14156128f057604080518082018252600781526611b1b31c999a1b60c91b6020808301919091529083528151808301909252601482527308cd8cae6d0e8dedcca40a6d0c2c8ca40aec2e6d60631b828201528201525b8163ffffffff16605b14156129495760408051808201825260078152662364336530623160c81b6020808301919091529083528151808301909252600e82526d149bd8dadb595b1bdb88149a5b9960921b828201528201525b8163ffffffff16605c141561299c57604080518082018252600781526608d90c8c990c5960ca1b60208083019190915290835281518083019092526008825267141d5c994814995960c21b828201528201525b8163ffffffff16605d14156129ec5760408051808201825260078152662364323830383360c81b6020808301919091529083528151808301909252600582526408ec2d8c2d60db1b828201528201525b8163ffffffff16605e1415612a41576040805180820182526007815266046c86ac66eca760cb1b6020808301919091529083528151808301909252600a825269466f676779204c6f766560b01b828201528201525b8163ffffffff16605f1415612a975760408051808201825260078152662364623134353960c81b6020808301919091529083528151808301909252600b82526a527562796c6963696f757360a81b828201528201525b8163ffffffff1660601415612aed57604080518082018252600781526611b2321b1b313160c91b6020808301919091529083528151808301909252600b82526a50696e6b2043686172676560a81b828201528201525b8163ffffffff1660611415612b415760408051808201825260078152662365326232323760c81b60208083019190915290835281518083019092526009825268476f6c64205469707360b81b828201528201525b8163ffffffff1660621415612b975760408051808201825260078152662365653030393960c81b6020808301919091529083528151808301909252600b82526a131bdd994815995cdcd95b60aa1b828201528201525b8163ffffffff1660631415612bf257604080518082018252600781526611b2321a9ab33360c91b6020808301919091529083528151808301909252601082526f466c616d696e6720466c616d696e676f60801b828201528201525b8163ffffffff1660641415612c4d5760408051808201825260078152662365646133363760c81b6020808301919091529083528151808301909252601082526f416476656e74757265204f72616e676560801b828201528201525b8163ffffffff1660651415612ca75760408051808201825260078152660236539663164360cc1b6020808301919091529083528151808301909252600f82526e59656c6c6f7769736820576869746560881b828201528201525b8163ffffffff1660661415612cfd5760408051808201825260078152662365663339333960c81b6020808301919091529083528151808301909252600b82526a159a5d985b191a4814995960aa1b828201528201525b8163ffffffff1660671415612d585760408051808201825260078152662365373865613560c81b6020808301919091529083528151808301909252601082526f556e646572776174657220466c61726560801b828201528201525b8163ffffffff1660681415612db15760408051808201825260078152662365656464313160c81b6020808301919091529083528151808301909252600e82526d59656c6c6f772042757a7a696e6760901b828201528201525b8163ffffffff1660691415612e0b5760408051808201825260078152662365653232373760c81b6020808301919091529083528151808301909252600f82526e467572696f7573204675636873696160881b828201528201525b8163ffffffff16606a1415612e6a57604080518082018252600781526611b3181b9ab29b60c91b602080830191909152908352815180830190925260148252734c69616e20486f6e67204c6f7475732050696e6b60601b828201528201525b8163ffffffff16606b1415612ec65760408051808201825260078152662366376333346360c81b6020808301919091529083528151808301909252601182527021b932b0b6bc9029bbb2b2ba1021b7b93760791b828201528201525b8163ffffffff16606c1415612f195760408051808201825260078152660236663306663360cc1b602080830191909152908352815180830190925260088252674347412050696e6b60c01b828201528201525b8163ffffffff16606d1415612f7157604080518082018252600781526611b3331b1b191960c91b6020808301919091529083528151808301909252600d82526c53706172726f7773204669726560981b828201528201525b8163ffffffff16606e1415612fc857604080518082018252600781526608d99898598e1960ca1b6020808301919091529083528151808301909252600c82526b4f72616e67652047726f766560a01b828201528201525b919050565b6060604051602001613748907f3c646566733e3c66696c7465722069643d226672616374616c222066696c746581527f72556e6974733d226f626a656374426f756e64696e67426f782220783d22302560208201527f2220793d223025222077696474683d223130302522206865696768743d22313060408201527f302522203e3c666554757262756c656e63652069643d2274757262756c656e6360608201527f652220747970653d226672616374616c4e6f697365222062617365467265717560808201527f656e63793d22302e303322206e756d4f6374617665733d223122203e3c616e6960a08201527f6d617465206174747269627574654e616d653d22626173654672657175656e6360c08201527f79222076616c7565733d22302e30313b302e343b302e303122206475723d223160e08201527f3030732220726570656174436f756e743d22696e646566696e69746522202f3e6101008201527f3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d616101208201527f7020696e3d22536f757263654772617068696322207363616c653d223530223e6101408201527f3c2f6665446973706c6163656d656e744d61703e3c2f66696c7465723e3c66696101608201527f6c7465722069643d226d6f727068223e3c66654d6f7270686f6c6f6779206f706101808201527f657261746f723d2264696c61746522207261646975733d2230223e3c616e696d6101a08201527f617465206174747269627574654e616d653d22726164697573222076616c75656101c08201527f733d22303b353b3022206475723d2238732220726570656174436f756e743d226101e08201527f696e646566696e69746522202f3e3c2f66654d6f7270686f6c6f67793e3c2f666102008201527f696c7465723e3c66696c7465722069643d22676c6f77222066696c746572556e6102208201527f6974733d226f626a656374426f756e64696e67426f782220783d2230252220796102408201527f3d223025222077696474683d223130302522206865696768743d2231303025226102608201527f203e3c6665476175737369616e426c757220737464446576696174696f6e3d226102808201527f352220726573756c743d22626c7572322220696e3d22536f75726365477261706102a08201527f68696322202f3e3c66654d657267653e3c66654d657267654e6f646520696e3d6102c08201527f22626c75723222202f3e3c66654d657267654e6f646520696e3d22536f7572636102e08201527f654772617068696322202f3e3c2f66654d657267653e3c2f66696c7465723e3c6103008201527f66696c7465722069643d226e6f697365223e3c666554757262756c656e6365206103208201527f626173654672657175656e63793d22302e3035222f3e3c6665436f6c6f724d616103408201527f7472697820747970653d22687565526f74617465222076616c7565733d2230226103608201527f3e3c616e696d617465206174747269627574654e616d653d2276616c756573226103808201527f2066726f6d3d22302220746f3d2233363022206475723d2231732220726570656103a08201527f6174436f756e743d22696e646566696e697465222f3e3c2f6665436f6c6f724d6103c08201527f61747269783e3c6665436f6c6f724d617472697820747970653d226d617472696103e08201527f78222076616c7565733d223020302030203020312030203020302030203020306104008201527f203020302030203020312030203020302030222f3e3c6665446973706c6163656104208201527f6d656e744d617020696e3d22536f757263654772617068696322207363616c656104408201527f3d223130222f3e3c2f66696c7465723e3c66696c7465722069643d226e6f6e656104608201527f223e3c66654f66667365743e3c2f66654f66667365743e3c2f66696c7465723e6104808201527f3c66696c7465722069643d227363726962626c65223e3c666554757262756c656104a08201527f6e636520747970653d2274757262756c656e63652220626173654672657175656104c08201527f6e63793d22302e303522206e756d4f6374617665733d22322220726573756c746104e08201527f3d2274757262756c656e6365222f3e3c6665446973706c6163656d656e744d616105008201527f7020696e323d2274757262756c656e63652220696e3d22536f757263654772616105208201527f7068696322207363616c653d2235302220784368616e6e656c53656c6563746f6105408201527f723d22522220794368616e6e656c53656c6563746f723d2247222f3e3c2f66696105608201527f6c7465723e3c66696c7465722069643d2274696c652220783d2231302220793d6105808201527f223130222077696474683d2231302522206865696768743d22313025223e3c666105a08201527f6554696c6520696e3d22536f75726365477261706869632220783d22313022206105c08201527f793d223130222077696474683d22313022206865696768743d22313022202f3e6105e0820152781e3332aa34b632979f1e17b334b63a32b91f1e17b232b3399f60391b6106008201526106190190565b604051602081830303815290604052905090565b604080516101208082526124208201909252600091829182916020820161240080368337019050509050600091505b60908210156137c55760088183815181106137a8576137a8615874565b6020908102919091010152816137bd8161588a565b92505061378b565b6101008210156138005760098183815181106137e3576137e3615874565b6020908102919091010152816137f88161588a565b9250506137c5565b61011882101561383b57600781838151811061381e5761381e615874565b6020908102919091010152816138338161588a565b925050613800565b61012082101561387657600881838151811061385957613859615874565b60209081029190910101528161386e8161588a565b92505061383b565b6138898460c00151826101206000613c56565b50600091505b601e8210156138c95760058183815181106138ac576138ac615874565b6020908102919091010152816138c18161588a565b92505061388f565b6138db8460e0015182601e6000613c56565b506000949350505050565b608082015160009081905b838560a00151101561397a578460400151518560600151141561391c57600160009250925050610988565b60a08501516040860151606087018051906139368261588a565b90528151811061394857613948615874565b602001015160f81c60f81b60f81c60ff16901b8117905060088560a0018181516139729190615846565b9052506138f1565b80841c608086015260a085018051859190613996908390615579565b90525060006139a8600180871b615579565b60009792169550909350505050565b60006139d6604051806040016040528060608152602001606081525090565b604080518082019091526060808252602082015260006139f585613f21565b90945092509050600081600e811115613a1057613a1061585e565b14613a1d57949350505050565b613a288584846145d7565b95945050505050565b6000610609828360c001518460e001516145d7565b60006080820181905260a082018190526040820151516060830151829190613a6f906004615846565b1115613a7e5750600192915050565b604083015160608401805190613a938261588a565b905281518110613aa557613aa5615874565b0160200151604084015160608501805160f89390931c935060089290613aca8261588a565b905281518110613adc57613adc615874565b602001015160f81c60f81b60f81c60ff16901b81179050801960ff168360400151846060018051809190613b0f9061588a565b905281518110613b2157613b21615874565b016020015160f81c141580613b6c5750604083015160608401805160ff841960081c169291613b4f8261588a565b905281518110613b6157613b61615874565b016020015160f81c14155b15613b7a5750600492915050565b826040015151818460600151613b909190615846565b1115613b9f5750600192915050565b8251516020840151613bb2908390615846565b1115613bc15750600292915050565b8015613c4d57613bd2600182615579565b90508260400151836060018051809190613beb9061588a565b905281518110613bfd57613bfd615874565b602001015160f81c60f81b8360000151846020018051809190613c1f9061588a565b905281518110613c3157613c31615874565b60200101906001600160f81b031916908160001a905350613bc1565b50600092915050565b600080600080613c64615133565b600092505b600f8311613ca657600089600001518481518110613c8957613c89615874565b602090810291909101015282613c9e8161588a565b935050613c69565b600093505b86841015613d1257885188613cc08689615846565b81518110613cd057613cd0615874565b602002602001015181518110613ce857613ce8615874565b602002602001018051809190613cfd9061588a565b90525083613d0a8161588a565b945050613cab565b868960000151600081518110613d2a57613d2a615874565b60200260200101511415613d45576000945050505050613f19565b60019150600192505b600f8311613dc8578851805160019390931b9284908110613d7157613d71615874565b6020026020010151821015613d8d57600e945050505050613f19565b8851805184908110613da157613da1615874565b602002602001015182613db49190615579565b915082613dc08161588a565b935050613d4e565b60006020820152600192505b600f831015613e4d578851805184908110613df157613df1615874565b6020026020010151818460108110613e0b57613e0b615874565b6020020151613e1a9190615846565b81613e26856001615846565b60108110613e3657613e36615874565b602002015282613e458161588a565b935050613dd4565b600093505b86841015613f005787613e658588615846565b81518110613e7557613e75615874565b6020026020010151600014613eee5760208901518490828a613e97848b615846565b81518110613ea757613ea7615874565b602002602001015160108110613ebf57613ebf615874565b60200201805190613ecf8261588a565b905281518110613ee157613ee1615874565b6020026020010181815250505b83613ef88161588a565b945050613e52565b60008211613f0f576000613f12565b600e5b9450505050505b949350505050565b6000613f40604051806040016040528060608152602001606081525090565b6040805180820190915260608082526020820152600080808080613f67601e61011e615846565b6001600160401b03811115613f7e57613f7e615234565b604051908082528060200260200182016040528015613fa7578160200160208202803683370190505b50905060006040518060400160405280600f6001613fc59190615846565b6001600160401b03811115613fdc57613fdc615234565b604051908082528060200260200182016040528015614005578160200160208202803683370190505b5081526040805161011e8082526123e0820190925260209283019290919082016123c08036833701905050815250905060006040518060400160405280600f60016140509190615846565b6001600160401b0381111561406757614067615234565b604051908082528060200260200182016040528015614090578160200160208202803683370190505b50815260408051601e8082526103e0820190925260209283019290919082016103c0803683375050509052905060006140ca8c60056138e6565b98509450600085600e8111156140e2576140e261585e565b146140fa575092985096509094506145d09350505050565b61410661010189615846565b97506141138c60056138e6565b97509450600085600e81111561412b5761412b61585e565b14614143575092985096509094506145d09350505050565b61414e600188615846565b965061011e8811806141605750601e87115b1561417a57506005995090975095506145d0945050505050565b6141838c614e02565b9095509350600085600e81111561419c5761419c61585e565b146141b4575092985096509094506145d09350505050565b6141c2838560136000613c56565b9450600085600e8111156141d8576141d861585e565b146141f257506006995090975095506145d0945050505050565b600095505b6142018789615846565b8610156143fa576000806142158e86615024565b9097509150600087600e81111561422e5761422e61585e565b146142485750949a5091985096506145d095505050505050565b60108210156142805781868961425d8161588a565b9a508151811061426f5761426f615874565b6020026020010181815250506143f3565b506000601082141561431f57876142a9575060079b509299509097506145d09650505050505050565b856142b560018a615579565b815181106142c5576142c5615874565b602002602001015190506142da8e60026138e6565b9097509250600087600e8111156142f3576142f361585e565b1461430d5750949a5091985096506145d095505050505050565b614318836003615846565b915061437f565b8160111415614333576142da8e60036138e6565b61433e8e60076138e6565b9097509250600087600e8111156143575761435761585e565b146143715750949a5091985096506145d095505050505050565b61437c83600b615846565b91505b614389898b615846565b614393838a615846565b11156143b1575060089b509299509097506145d09650505050505050565b81156143f3576143c2600183615579565b91508086896143d08161588a565b9a50815181106143e2576143e2615874565b6020026020010181815250506143b1565b50506141f7565b836101008151811061440e5761440e615874565b6020026020010151600014156144335750600b995090975095506145d0945050505050565b61444083858a6000613c56565b9450600085600e8111156144565761445661585e565b141580156144e05750600185600e8111156144735761447361585e565b14806144905750600285600e81111561448e5761448e61585e565b145b806144e057508251805160019081106144ab576144ab615874565b602002602001015183600001516000815181106144ca576144ca615874565b60200260200101516144dc9190615846565b8814155b156144fa57506009995090975095506145d0945050505050565b6145068285898b613c56565b9450600085600e81111561451c5761451c61585e565b141580156145a65750600185600e8111156145395761453961585e565b14806145565750600285600e8111156145545761455461585e565b145b806145a6575081518051600190811061457157614571615874565b6020026020010151826000015160008151811061459057614590615874565b60200260200101516145a29190615846565b8714155b156145c05750600a995090975095506145d0945050505050565b5060009950909750955050505050505b9193909250565b6000806000806000604051806103a00160405280600361ffff168152602001600461ffff168152602001600561ffff168152602001600661ffff168152602001600761ffff168152602001600861ffff168152602001600961ffff168152602001600a61ffff168152602001600b61ffff168152602001600d61ffff168152602001600f61ffff168152602001601161ffff168152602001601361ffff168152602001601761ffff168152602001601b61ffff168152602001601f61ffff168152602001602361ffff168152602001602b61ffff168152602001603361ffff168152602001603b61ffff168152602001604361ffff168152602001605361ffff168152602001606361ffff168152602001607361ffff168152602001608361ffff16815260200160a361ffff16815260200160c361ffff16815260200160e361ffff16815260200161010261ffff1681525090506000604051806103a00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600260ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600560ff168152602001600560ff168152602001600560ff168152602001600060ff1681525090506000604051806103c00160405280600161ffff168152602001600261ffff168152602001600361ffff168152602001600461ffff168152602001600561ffff168152602001600761ffff168152602001600961ffff168152602001600d61ffff168152602001601161ffff168152602001601961ffff168152602001602161ffff168152602001603161ffff168152602001604161ffff168152602001606161ffff168152602001608161ffff16815260200160c161ffff16815260200161010161ffff16815260200161018161ffff16815260200161020161ffff16815260200161030161ffff16815260200161040161ffff16815260200161060161ffff16815260200161080161ffff168152602001610c0161ffff16815260200161100161ffff16815260200161180161ffff16815260200161200161ffff16815260200161300161ffff16815260200161400161ffff16815260200161600161ffff1681525090506000604051806103c00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600160ff168152602001600160ff168152602001600260ff168152602001600260ff168152602001600360ff168152602001600360ff168152602001600460ff168152602001600460ff168152602001600560ff168152602001600560ff168152602001600660ff168152602001600660ff168152602001600760ff168152602001600760ff168152602001600860ff168152602001600860ff168152602001600960ff168152602001600960ff168152602001600a60ff168152602001600a60ff168152602001600b60ff168152602001600b60ff168152602001600c60ff168152602001600c60ff168152602001600d60ff168152602001600d60ff16815250905060005b8761010014614df057614b118c8c615024565b98509050600081600e811115614b2957614b2961585e565b14614b3d5797506106d79650505050505050565b610100881015614bb3578b515160208d01511415614b66576002985050505050505050506106d7565b8760f81b8c600001518d6020015181518110614b8457614b84615874565b60200101906001600160f81b031916908160001a90535060208c01805190614bab8261588a565b905250614afe565b610100881115614dde576000614bcb6101018a615579565b9850601d8910614be757600c99505050505050505050506106d7565b614c0a8d868b601d8110614bfd57614bfd615874565b602002015160ff166138e6565b9092509050600082600e811115614c2357614c2361585e565b14614c38575097506106d79650505050505050565b80868a601d8110614c4b57614c4b615874565b602002015161ffff16614c5e9190615846565b9750614c6a8d8c615024565b99509150600082600e811115614c8257614c8261585e565b14614c97575097506106d79650505050505050565b614cad8d848b601e8110614bfd57614bfd615874565b9092509050600082600e811115614cc657614cc661585e565b14614cdb575097506106d79650505050505050565b80848a601e8110614cee57614cee615874565b602002015161ffff16614d019190615846565b96508c60200151871115614d2157600d99505050505050505050506106d7565b8c515160208e0151614d34908a90615846565b1115614d4c57600299505050505050505050506106d7565b8715614dd857614d5d600189615579565b97508c60000151878e60200151614d749190615579565b81518110614d8457614d84615874565b602001015160f81c60f81b8d600001518e6020015181518110614da957614da9615874565b60200101906001600160f81b031916908160001a90535060208d01805190614dd08261588a565b905250614d4c565b50614afe565b868c602001818151614bab9190615846565b5060009b9a5050505050505050505050565b60006060818080614e16601e61011e615846565b6001600160401b03811115614e2d57614e2d615234565b604051908082528060200260200182016040528015614e56578160200160208202803683370190505b506040805161026081018252601081526011602082015260129181019190915260006060820181905260086080830152600760a0830152600960c0830152600660e0830152600a6101008301526005610120830152600b61014083015260046101608301819052600c61018084015260036101a0840152600d6101c084015260026101e0840152600e6102008401526001610220840152600f61024084015292935091614f049089906138e6565b95509150600082600e811115614f1c57614f1c61585e565b14614f2d5750969095509350505050565b614f38600486615846565b9450600093505b84841015614fc157614f528860036138e6565b84838760138110614f6557614f65615874565b602002015160ff1681518110614f7d57614f7d615874565b60209081029190910101529150600082600e811115614f9e57614f9e61585e565b14614faf5750969095509350505050565b83614fb98161588a565b945050614f3f565b601384101561501457600083828660138110614fdf57614fdf615874565b602002015160ff1681518110614ff757614ff7615874565b60209081029190910101528361500c8161588a565b945050614fc1565b5060009791965090945050505050565b600080600181808080805b600f86116151205760006150448b60016138e6565b9092509050600082600e81111561505d5761505d61585e565b146150745750965060009550610988945050505050565b89518051968217968890811061508c5761508c615874565b6020026020010151935083856150a29190615846565b8610156150ed5760208a01516000906150bb8789615579565b6150c59086615846565b815181106150d5576150d5615874565b60200260200101519850985050505050505050610988565b6150f78484615846565b92506151038486615846565b600196871b961b94508690506151188161588a565b96505061502f565b50600c9960009950975050505050505050565b6040518061020001604052806010906020820280368337509192915050565b60006020828403121561516457600080fd5b5035919050565b60005b8381101561518657818101518382015260200161516e565b83811115615195576000848401525b50505050565b600081518084526151b381602086016020860161516b565b601f01601f19169290920160200192915050565b60a0815260006151da60a083018861519b565b82810360208401526151ec818861519b565b90508281036040840152615200818761519b565b90508281036060840152615214818661519b565b90508281036080840152615228818561519b565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561526c5761526c615234565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529a5761529a615234565b604052919050565b60006001600160401b038211156152bb576152bb615234565b50601f01601f191660200190565b600082601f8301126152da57600080fd5b81356152ed6152e8826152a2565b615272565b81815284602083860101111561530257600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561533157600080fd5b81356001600160401b038082111561534857600080fd5b908301906060828603121561535c57600080fd5b61536461524a565b82358281111561537357600080fd5b61537f878286016152c9565b82525060208301358281111561539457600080fd5b6153a0878286016152c9565b6020830152506040830135604082015280935050505092915050565b6040815260006153cf604083018561519b565b8281036020840152613a28818561519b565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061540e5761540e6153e1565b92169190910692915050565b60006154286152e8846152a2565b905082815283838301111561543c57600080fd5b6106d783602083018461516b565b600082601f83011261545b57600080fd5b6106d78383516020850161541a565b60006020828403121561547c57600080fd5b81516001600160401b038082111561549357600080fd5b90830190606082860312156154a757600080fd5b6154af61524a565b8251828111156154be57600080fd5b6154ca8782860161544a565b8252506020830151828111156154df57600080fd5b6154eb8782860161544a565b6020830152506040830151604082015280935050505092915050565b6000815161551981856020860161516b565b9290920192915050565b6000835161553581846020880161516b565b83519083019061554981836020880161516b565b651e17b9bb339f60d11b9101908152600601949350505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561558b5761558b615563565b500390565b600060ff8316806155a3576155a36153e1565b8060ff84160691505092915050565b600063ffffffff8083168185168083038211156155d1576155d1615563565b01949350505050565b600063ffffffff838116908316818110156155f7576155f7615563565b039392505050565b6000825161561181846020870161516b565b9190910192915050565b60006020828403121561562d57600080fd5b81516001600160401b0381111561564357600080fd5b8201601f8101841361565457600080fd5b613f198482516020840161541a565b7f3c7376672076696577426f783d2730203020363430203634302720776964746881527f3d273130302527206865696768743d27313030252720786d6c6e733d2768747460208201527f703a2f2f7777772e77332e6f72672f323030302f737667273e3c7374796c653e60408201527f2040666f6e742d66616365207b20666f6e742d66616d696c793a20436f7572696060820152716572466f6e743b207372633a2075726c282760701b608082015260008651615728816092850160208b0161516b565b77272920666f726d617428276f70656e7479706527293b207d60401b609291840191820152712e626173657b66696c7465723a75726c282360701b60aa820152865161577b8160bc840160208b0161516b565b66149db334b6361d60c91b60bc929091019182015261522861583561582f6157f66157f06157ac60c387018c615507565b7f3b666f6e742d66616d696c793a436f7572696572466f6e743b666f6e742d73698152713d329d10189b383c1dbe9e17b9ba3cb6329f60711b602082015260320190565b89615507565b7f3c726563742077696474683d223130302522206865696768743d223130302522815266103334b6361e9160c91b602082015260270190565b86615507565b6401110179f160dd1b815260050190565b6000821982111561585957615859615563565b500190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060001982141561589e5761589e615563565b506001019056fea264697066735822122005c36c4204a0fa9862c9ca1c27df1968811897c74f776c879099d33cef697ae564736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004f58ee8f0ed85d8e02fd8a33ebc8122433bf6112000000000000000000000000944bbd7e287c74a6eab7d3c9aaad0707301fe036000000000000000000000000e643991873f308bb35e8fa39928bf8af4bd85386
-----Decoded View---------------
Arg [0] : fontAddress (address): 0x4F58Ee8F0eD85d8E02fD8A33ebC8122433bf6112
Arg [1] : gmData1Address (address): 0x944bBD7E287c74a6EaB7d3c9AAad0707301FE036
Arg [2] : gmData2Address (address): 0xE643991873F308BB35E8fa39928bF8aF4bD85386
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f58ee8f0ed85d8e02fd8a33ebc8122433bf6112
Arg [1] : 000000000000000000000000944bbd7e287c74a6eab7d3c9aaad0707301fe036
Arg [2] : 000000000000000000000000e643991873f308bb35e8fa39928bf8af4bd85386
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.