ETH Price: $3,089.04 (+1.16%)
Gas: 3 Gwei

Token

On-Chain Alpha (OCA)
 

Overview

Max Total Supply

262 OCA

Holders

166

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
pingyu.eth
Balance
1 OCA
0x26fe97917F8D79E368d78455FEc7855a55d09086
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
OnChainAlpha

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license
File 1 of 21 : onChainAlpha.sol
/* SPDX-License-Identifier: MIT

   ██████     ░░░░░░     ▒▒▒▒▒▒
 ██████████ ░░░░░░░░░░ ▒▒▒▒▒▒▒▒▒▒
 ███    ███ ░░░░       ▒▒▒▒  ▒▒▒▒
 ██████████ ░░░░░░░░░░ ▒▒▒▒  ▒▒▒▒
   ██████     ░░░░░░    ▒▒▒  ▒▒▒

 ********************************
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░██████████████████████░░░ *
 * ░░░██░░░░░░██░░░░░░████░░░░░ *
 * ░░░██░░░░░░██░░░░░░██░░░░░░░ *
 * ░░░██████████████████░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 ************************♥tt****/

// onChainAlpha.sol is a fork of 
// IndelibleERC721A.sol by 0xHirch.eth
// With modifications by ogkenobi.eth

pragma solidity 0.8.17;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Multicall.sol";
import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "./helpers/SSTORE2.sol";
import "./helpers/DynamicBuffer.sol";
import "./helpers/HelperLib.sol";
import "./helpers/ERC721A.sol";


contract OnChainAlpha is ERC721A, IERC721Receiver, Multicall, ReentrancyGuard, Ownable {
    using HelperLib for uint256;
    using DynamicBuffer for bytes;

    event AttributesUpdated(
        uint256 tokenId,
        string userName,
        string social,
        string website,
        string profileName
    );
    event LabelsValuesUpdated(
        uint256 tokenId,
        uint256 labelId,
        string customLabels,
        string customValues
    );
    event LayersUpdated(uint256 tokenId, bool[] layerIsHidden);
    event LayersRevealed(uint256 tokenId, uint layerRevealed);
    event ImagePhlipped(uint256 tokenId, bool isPhlipped);
    event bgChanged(uint256 tokenId, string color);

    struct TraitDTO {
        string name;
        string mimetype;
        bytes data;
    }

    struct Trait {
        string name;
        string mimetype;
    }

    struct AlphaToken {
        Profile AlphaProfile;
        mapping(uint => string) labels;
        mapping(uint => string) values;
        uint256 labelcount;
    }

    struct Profile {
        string userName;
        string social;
        string website;
        string profileName;
    }

    struct ContractData {
        string name;
        string description;
        string image;
        string banner;
        string website;
        uint256 royalties;
        string royaltiesRecipient;
    }

    mapping(uint256 => address[]) internal _traitDataPointers;
    mapping(uint256 => mapping(uint256 => Trait)) internal _traitDetails;
    mapping(uint256 => bool) internal _renderTokenOffChain;
    mapping(uint256 => mapping(uint256 => bool)) internal _hideLayer;
    mapping(uint256 => mapping(uint256 => bool)) internal _revealLayer;
    mapping(uint256 => bool) internal _phlipImage;
    mapping(uint256 => AlphaToken) idValues;
    mapping(uint256 => string) bgColor;
    mapping(address => uint256) rebates;
    mapping(uint256 => bool) ogMints;
    mapping(address => uint256) mints;

    uint256 private constant NUM_LAYERS = 15;
    uint256 private constant MAX_BATCH_MINT = 10;
    uint256[][NUM_LAYERS] private TIERS;
    string[] private LAYER_NAMES = [
        unicode"Special",
        unicode"-",
        unicode"Mouth Special",
        unicode"-",
        unicode"Headwear",
        unicode"-",
        unicode"Eyewear",
        unicode"-",
        unicode"Eyes",
        unicode"-",
        unicode"Mouth",
        unicode"-",
        unicode"Ears",
        unicode"-",
        unicode"Body"
    ];

    function setLayerNames(uint _layerNum, string memory _value) public onlyOwner {
        LAYER_NAMES[_layerNum] = _value;
    }

    address public reRollDuplicateRole = 0x957356F9412830c992D465FF8CDb9b0AA023020b;
    address public faContract = 0x89d92A754FD1A672c21b5fc2a347198D1A9456b3;
    uint256 public constant maxSupply = 7777;
    uint256 public mintPrice = 0.05 ether;
    uint256 public rebateAmt = 0.02 ether;
    string public baseURI = "https://static.flooredApe.io/oca/";
    bool public isPublicMintActive = false;

    ContractData public contractData =
        ContractData(
            unicode"On-Chain Alpha",
            unicode"On-Chain Alpha is a collection of 7777 customizable digital identity tokens stored entirely on the Ethereum blockchain. Token holders can visit https://oca.gg to enable/disable existing traits, change background color, flip the image, enable Twitter hex, and more as well as reveal new trait drops to be released in the future.",
            "https://ipfs.io/ipfs/Qmdbq7N5izrazoYcbwSuxcms2dBemxuxbrLaFtw2dufdV6/collection.gif",
            "https://ipfs.io/ipfs/Qmdbq7N5izrazoYcbwSuxcms2dBemxuxbrLaFtw2dufdV6/banner.png",
            "https://oca.gg",
            500,
            "0x957356F9412830c992D465FF8CDb9b0AA023020b"
        );

    constructor() ERC721A("On-Chain Alpha", "OCA") {
        TIERS[0] = [10,15,25,50,75,100,7502]; //special 0
        TIERS[1] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[2] = [50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,1777]; //mouth special 1
        TIERS[3] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[4] = [10,20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,747]; //headwear 2
        TIERS[5] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[6] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027]; //eyewear 3
        TIERS[7] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[8] = [25,40,80,110,140,170,200,230,260,290,320,350,380,410,440,470,500,530,570,610,650,1002]; //eyes 4
        TIERS[9] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[10] = [100,200,250,300,350,400,450,500,550,600,650,700,750,850,1000,1727]; //mouth 5
        TIERS[11] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[12] = [200,300,400,500,600,700,800,900,1000,1100,1200,1300,1477]; //ears 6
        TIERS[13] = [35,65,100,130,160,190,220,250,280,310,340,370,400,450,500,650,700,750,850,1027];
        TIERS[14] = [75,100,150,200,250,300,350,400,450,500,550,600,700,800,900,1452,0]; //body 7
    }

    function rarityGen(uint256 _randinput, uint256 _rarityTier)
        internal
        view
        returns (uint256)
    {
        uint256 currentLowerBound = 0;
        for (uint256 i = 0; i < TIERS[_rarityTier].length; i++) {
            uint256 thisPercentage = TIERS[_rarityTier][i];
            if (
                _randinput >= currentLowerBound &&
                _randinput < currentLowerBound + thisPercentage
            ) return i;
            currentLowerBound = currentLowerBound + thisPercentage;
        }

        return TIERS[_rarityTier].length - 1;
    }

    modifier whenMintActive() {
        require(isMintActive());
        _;
    }

    function entropyForExtraData() internal view returns (uint24) {
        uint256 randomNumber = uint256(
            keccak256(
                abi.encodePacked(
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    block.difficulty,
                    blockhash(block.number - 1),
                    msg.sender
                )
            )
        );
        return uint24(randomNumber);
    }

    function reRollDuplicate(uint256 tokenIdA, uint256 tokenIdB)
        public
    {
        require(msg.sender == reRollDuplicateRole);

        uint256 largerTokenId = tokenIdA > tokenIdB ? tokenIdA : tokenIdB;

        _initializeOwnershipAt(largerTokenId);
        if (_exists(largerTokenId + 1)) {
            _initializeOwnershipAt(largerTokenId + 1);
        }

        _setExtraDataAt(largerTokenId, entropyForExtraData());
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual override returns (uint24) {
        return from == address(0) ? entropyForExtraData() : previousExtraData;
    }

    function tokenIdToHash(uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        require(_exists(_tokenId));
        // This will generate a NUM_LAYERS * 3 character string.
        bytes memory hashBytes = DynamicBuffer.allocate(NUM_LAYERS * 4);

        uint256[] memory hash = new uint256[](NUM_LAYERS);

        for (uint256 i = 0; i < NUM_LAYERS; i++) {
            uint256 traitIndex = hash[i];
            if(i % 2 > 0 && _revealLayer[_tokenId][i] == false){
                hash[i] = TIERS[i].length - 1;
            } else {
                uint256 tokenExtraData = uint24(_ownershipOf(_tokenId).extraData);
                uint256 _randinput = uint256(
                    keccak256(
                        abi.encodePacked(
                            tokenExtraData,
                            _tokenId,
                            _tokenId + i
                        )
                    )
                ) % maxSupply;

                traitIndex = rarityGen(_randinput, i);
                hash[i] = traitIndex;
                uint blank = TIERS[i].length - 1;

                if (_hideLayer[_tokenId][i] == true){
                    if (i == 10 && hash[i] == 10){ //astonished -> blank
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][2] == false){hash[2] = 15;}

                    } else if (i == 14 && hash[i] == 0) {
                        //ghost
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 5;}
                        
                    } else if (i == 14 && hash[i] == 2) {
                        //robot
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 1;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 0;}
                        if(_hideLayer[_tokenId][4] == false){hash[4] = 1;}
                        
                    } else if (i == 14 && hash[i] == 4) {
                        //skull
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 8;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 9;}

                    } else if (i == 14 && hash[i] == 5) {
                        //vampire
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 6;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 7;}

                    } else if (i == 14 && hash[i] == 6) {
                        //monster
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 7;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 8;}
                        if (hash[6] == 8 && _hideLayer[_tokenId][6] == false) {hash[6] = 19;}
                    } else if (i == 14 && hash[i] == 7) {
                        //clown
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 2;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 4;}

                    } else if (i == 14 && hash[i] == 9) {
                        //pepe
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 5;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 1;}

                    } else if (i == 14 && hash[i] == 10) {
                        //doge
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 4;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 2;}

                    } else if (i == 14 && hash[i] == 11) {
                        //cat
                        hash[i] = blank;
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 3;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 3;}

                    } else {
                        hash[i] = blank;
                    }
                    
                } else {

                    if (hash[10] == 10){ //astonished -> blank
                        if(_hideLayer[_tokenId][2] == false){hash[2] = 15;}
                    }

                    if (hash[14] == 0) {
                        //ghost
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 5;}
                    } else if (hash[14] == 2) {
                        //robot
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 1;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 0;}
                        if(_hideLayer[_tokenId][4] == false){hash[4] = 1;}

                    } else if (hash[14] == 4) {
                        //skull
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 8;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 9;}

                    } else if (hash[14] == 5) {
                        //vampire
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 6;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 7;}

                    } else if (hash[14] == 6) {
                        //monster
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 7;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 8;}
                        if (hash[6] == 8 && _hideLayer[_tokenId][6] == false) {hash[6] = 19;}

                    } else if (hash[14] == 7) {
                        //clown
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 2;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 4;}

                    } else if (hash[14] == 9) {
                        //pepe
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 5;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 1;}

                    } else if (hash[14] == 10) {
                        //doge
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 4;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 2;}

                    } else if (hash[14] == 11) {
                        //cat
                        if(_hideLayer[_tokenId][10] == false){hash[10] = 3;}
                        if(_hideLayer[_tokenId][8] == false){hash[8] = 3;}

                    }

                }
            }
        }

        for (uint256 i = 0; i < hash.length; i++) {
            if (hash[i] < 10) {
                hashBytes.appendSafe("00");
            } else if (hash[i] < 100) {
                hashBytes.appendSafe("0");
            }
            if (hash[i] > 999) {
                hashBytes.appendSafe("999");
            } else {
                hashBytes.appendSafe(bytes(_toString(hash[i])));
            }
        }

        return string(hashBytes);
    }

    function publicMint(uint256 _count) external payable nonReentrant whenMintActive returns (uint256) {
        uint256 totalMinted = _totalMinted();
        require(mints[msg.sender] + _count <= 100);
        require(_count <= MAX_BATCH_MINT && _count > 0);
        require(totalMinted + _count <= maxSupply);
        require(msg.sender == tx.origin);

        uint256 discount;
        uint256 numDisc = rebates[msg.sender];
        if (numDisc > 0) {
            if (numDisc <= _count) {
                discount = rebateAmt * numDisc;
                require(msg.value >= (_count * mintPrice) - discount);
                rebates[msg.sender] = 0;
            } else {
                discount = rebateAmt * _count;
                require(msg.value >= (_count * mintPrice) - discount);
                rebates[msg.sender] -= _count;
            }
        } else {
            require(msg.value >= _count * mintPrice);
        }

        mints[msg.sender] += _count;
        _mint(msg.sender, _count);

        return totalMinted;
    }

    function ogMint(uint256 _ogTokenId) external nonReentrant whenMintActive returns (uint256) {
        uint256 totalMinted = _totalMinted();
        require(_ogTokenId <= 1000);
        require(ogMints[_ogTokenId] == false);
        require(msg.sender == ERC721(faContract).ownerOf(_ogTokenId));
        require(totalMinted + 1 <= maxSupply);

        ogMints[_ogTokenId] = true;
        _mint(msg.sender, 1);
        return totalMinted;
    }

    function ogClaimed(uint256 _ogTokenId) public view returns (bool){
        return ogMints[_ogTokenId];
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) public override returns (bytes4) {
        require(
            msg.sender == faContract ||
                ERC721(faContract).ownerOf(
                    tokenId
                ) ==
                from
        );

        rebates[from]++;
        return this.onERC721Received.selector;
    }

    function getRebates(address _address) public view returns (uint256) {
        return rebates[_address];
    }

    function hashToSVG(string memory _hash, uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        uint256 thisTraitIndex;
        string memory _bgColor = "1C1531";

        if (bytes(bgColor[_tokenId]).length > 0) {
            _bgColor = bgColor[_tokenId];
        }

        bytes memory svgBytes = DynamicBuffer.allocate(1024 * 128);
        svgBytes.appendSafe(
            '<svg width="1600" height="1600" viewBox="0 0 1600 1600" version="1.2" xmlns="http://www.w3.org/2000/svg" style="background-color: #'
        );
        svgBytes.appendSafe(
            abi.encodePacked(_bgColor, ";background-image:url(")
        );
        for (uint256 i = 0; i < NUM_LAYERS - 1; i++) {
            if(!(i % 2 > 0 && _revealLayer[_tokenId][i] == false)){
            // if(_traitDataPointers[i].length > 0){
                thisTraitIndex = HelperLib.parseInt(
                    HelperLib._substring(_hash, (i * 3), (i * 3) + 3)
                );
                svgBytes.appendSafe(
                    abi.encodePacked(
                        "data:",
                        _traitDetails[i][thisTraitIndex].mimetype,
                        ";base64,",
                        Base64.encode(
                            SSTORE2.read(_traitDataPointers[i][thisTraitIndex])
                        ),
                        "),url("
                    )
                );
            }
        }

        thisTraitIndex = HelperLib.parseInt(
            HelperLib._substring(_hash, (NUM_LAYERS * 3) - 3, NUM_LAYERS * 3)
        );

        svgBytes.appendSafe(
            abi.encodePacked(
                "data:",
                _traitDetails[NUM_LAYERS - 1][thisTraitIndex].mimetype,
                ";base64,",
                Base64.encode(
                    SSTORE2.read(
                        _traitDataPointers[NUM_LAYERS - 1][thisTraitIndex]
                    )
                ),
                ');background-repeat:no-repeat;background-size:contain;background-position:center;image-rendering:-webkit-optimize-contrast;-ms-interpolation-mode:nearest-neighbor;image-rendering:-moz-crisp-edges;image-rendering:pixelated;"></svg>'
            )
        );

        return
            string(
                abi.encodePacked(
                    "data:image/svg+xml;base64,",
                    Base64.encode(svgBytes)
                )
            );
    }

    function hashToMetadata(string memory _hash, uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        bytes memory metadataBytes = DynamicBuffer.allocate(1024 * 128);
        metadataBytes.appendSafe("[");

        for (uint256 i = 0; i < NUM_LAYERS; i++) {
            uint256 thisTraitIndex = HelperLib.parseInt(
                HelperLib._substring(_hash, (i * 3), (i * 3) + 3)
            );
            if (bytes(_traitDetails[i][thisTraitIndex].name).length > 2 ) {
                metadataBytes.appendSafe(
                    abi.encodePacked(
                        '{"trait_type":"',
                        LAYER_NAMES[i],
                        '","value":"',
                        _traitDetails[i][thisTraitIndex].name,
                        '"}'
                    )
                );

                if (i == 10 && ((_hideLayer[_tokenId][11] || _revealLayer[_tokenId][11] == false) && _hideLayer[_tokenId][12] && (_hideLayer[_tokenId][13] || _revealLayer[_tokenId][13] == false) && _hideLayer[_tokenId][14])){
                    metadataBytes.appendSafe("]");
                } else if (i == 11 && (_hideLayer[_tokenId][12] && (_hideLayer[_tokenId][13] || _revealLayer[_tokenId][13] == false) && _hideLayer[_tokenId][14])){
                    metadataBytes.appendSafe("]");
                } else if (i == 12 && ((_hideLayer[_tokenId][13] || _revealLayer[_tokenId][13] == false) && _hideLayer[_tokenId][14])){
                    metadataBytes.appendSafe("]");
                } else if (i == 13 && _hideLayer[_tokenId][14]){
                    metadataBytes.appendSafe("]");
                } else if (i == 14) {
                    metadataBytes.appendSafe("]");
                } else {
                    metadataBytes.appendSafe(",");
                }

            } 
        }

        return string(metadataBytes);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId));
        require(_traitDataPointers[0].length > 0);

        string memory tokenHash = tokenIdToHash(_tokenId);

        bytes memory jsonBytes = DynamicBuffer.allocate(1024 * 128);
        if (bytes(idValues[_tokenId].AlphaProfile.userName).length > 0) {
            jsonBytes.appendSafe(
                abi.encodePacked(
                    unicode'{"name":"',
                    idValues[_tokenId].AlphaProfile.userName
                )
            );
        } else {
            jsonBytes.appendSafe(unicode'{"name":"OnChainAlpha');
        }

        jsonBytes.appendSafe(
            abi.encodePacked(
                "#",
                _toString(_tokenId),
                '","description":"',
                contractData.description,
                '",'
            )
        );

        if (bytes(baseURI).length > 0 && _renderTokenOffChain[_tokenId]) {
            jsonBytes.appendSafe(
                abi.encodePacked('"image":"', baseURI, _toString(_tokenId))
            );
        } else {
            string memory svgCode = "";
            if (_phlipImage[_tokenId]) {
                string memory svgString = hashToSVG(tokenHash, _tokenId);
                svgCode = string(
                    abi.encodePacked(
                        "data:image/svg+xml;base64,",
                        Base64.encode(
                            abi.encodePacked(
                                '<svg width="100%" height="100%" viewBox="0 0 1200 1200" style="display: block; transform: scale(-1,1)" version="1.2" xmlns="http://www.w3.org/2000/svg"><image width="1200" height="1200" href="',
                                svgString,
                                '"></image></svg>'
                            )
                        )
                    )
                );
                jsonBytes.appendSafe(
                    abi.encodePacked('"svg_image_data":"', svgString, '",')
                );
            } else {
                string memory svgString = hashToSVG(tokenHash, _tokenId);
                svgCode = string(
                    abi.encodePacked(
                        "data:image/svg+xml;base64,",
                        Base64.encode(
                            abi.encodePacked(
                                '<svg width="100%" height="100%" viewBox="0 0 1200 1200" version="1.2" xmlns="http://www.w3.org/2000/svg"><image width="1200" height="1200" href="',
                                svgString,
                                '"></image></svg>'
                            )
                        )
                    )
                );
                jsonBytes.appendSafe(
                    abi.encodePacked('"svg_image_data":"', svgString, '",')
                );
            }

            jsonBytes.appendSafe(
                abi.encodePacked('"image_data":"', svgCode, '",')
            );
        }

        jsonBytes.appendSafe(
            abi.encodePacked('"attributes":', hashToMetadata(tokenHash, _tokenId), "}")
        );

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(jsonBytes)
                )
            );
    }

    function contractURI() public view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        abi.encodePacked(
                            '{"name":"',
                            contractData.name,
                            '","description":"',
                            contractData.description,
                            '","image":"',
                            contractData.image,
                            '","banner":"',
                            contractData.banner,
                            '","external_link":"',
                            contractData.website,
                            '","seller_fee_basis_points":',
                            _toString(contractData.royalties),
                            ',"fee_recipient":"',
                            contractData.royaltiesRecipient,
                            '"}'
                        )
                    )
                )
            );
    }

    function addLayer(uint256 _layerIndex, TraitDTO[] memory traits)
        public
        onlyOwner
    {
        require(TIERS[_layerIndex].length == traits.length);
        address[] memory dataPointers = new address[](traits.length);
        for (uint256 i = 0; i < traits.length; i++) {
            dataPointers[i] = SSTORE2.write(traits[i].data);
            _traitDetails[_layerIndex][i] = Trait(
                traits[i].name,
                traits[i].mimetype
            );
        }
        _traitDataPointers[_layerIndex] = dataPointers;
        return;
    }

    function setRenderOfTokenId(uint256 _tokenId, bool _renderOffChain)
        external
    {
        require(msg.sender == ownerOf(_tokenId));
        _renderTokenOffChain[_tokenId] = _renderOffChain;
    }

    function isMintActive() public view returns (bool) {
        return _totalMinted() < maxSupply && isPublicMintActive;
    }

    function togglePublicMint() external onlyOwner {
        isPublicMintActive = !isPublicMintActive;
    }

    //metadata URI
    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setContractData(ContractData memory _contractData)
        external
        onlyOwner
    {
        contractData = _contractData;
    }

    //address info
    address private helper = 0x95c0a28443F4897Bf718243A539fd018B6C16F63;

    //withdraw to helper address
    function withdraw() external {
        uint256 balance = address(this).balance;
        require(balance > 0);
        Address.sendValue(payable(helper), balance);
    }

    function setBgColor(uint256 _tokenId, string memory _bgColor) public {
        require(ownerOf(_tokenId) == msg.sender);
        bgColor[_tokenId] = _bgColor;

        emit bgChanged(_tokenId, _bgColor);
    }

    function setProfile(
        uint256 _tokenId,
        string memory _username,
        string memory _social,
        string memory _website
    ) public {
        require(ownerOf(_tokenId) == msg.sender);

        idValues[_tokenId].AlphaProfile.userName = _username;
        idValues[_tokenId].AlphaProfile.social = _social;
        idValues[_tokenId].AlphaProfile.website = _website;

        string memory str = string(abi.encodePacked(_username,"#",_toString(_tokenId)));
        idValues[_tokenId].AlphaProfile.profileName = str;

        emit AttributesUpdated(
            _tokenId,
            _username,
            _social,
            _website,
            str
        );
    }

    function setLabelsValues(uint256 _tokenId, uint _labelNum, string memory _label, string memory _value) external {
        require(msg.sender == ownerOf(_tokenId));
        uint count = idValues[_tokenId].labelcount;
        if(_labelNum >= count){
            _labelNum = count;
            idValues[_tokenId].labelcount++;
        }

        idValues[_tokenId].labels[_labelNum] = _label;
        idValues[_tokenId].values[_labelNum] = _value;

        emit LabelsValuesUpdated(_tokenId, _labelNum, _label, _value);
    }

    function toggleLayers(uint256 _tokenId, bool[] memory states) public {
        require(msg.sender == ownerOf(_tokenId));
        for (uint256 i = 0; i < NUM_LAYERS; i++) {
            _hideLayer[_tokenId][i] = states[i];
        }

        emit LayersUpdated(_tokenId, states);
    }

    function revealLayers(uint256 _tokenId, uint _layer) public {
        require(_layer < 15);
        require(msg.sender == ownerOf(_tokenId));

        _revealLayer[_tokenId][_layer] = true;

        emit LayersRevealed(_tokenId, _layer);
    }

    function togglePhlipPFP(uint256 _tokenId, bool _flipped) public {
        require(msg.sender == ownerOf(_tokenId));
        _phlipImage[_tokenId] = _flipped;

        emit ImagePhlipped(_tokenId, _flipped);
    }

}

File 2 of 21 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 21 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 21 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

File 5 of 21 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 6 of 21 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 7 of 21 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 8 of 21 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 9 of 21 : Base64.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

File 10 of 21 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 11 of 21 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 12 of 21 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 13 of 21 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 14 of 21 : Multicall.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol)

pragma solidity ^0.8.0;

import "./Address.sol";

/**
 * @dev Provides a function to batch together multiple calls in a single external call.
 *
 * _Available since v4.1._
 */
abstract contract Multicall {
    /**
     * @dev Receives and executes a batch of function calls on this contract.
     */
    function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            results[i] = Address.functionDelegateCall(address(this), data[i]);
        }
        return results;
    }
}

File 15 of 21 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 16 of 21 : Bytecode.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


library Bytecode {
  error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end);

  /**
    @notice Generate a creation code that results on a contract with `_code` as bytecode
    @param _code The returning value of the resulting `creationCode`
    @return creationCode (constructor) for new contract
  */
  function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) {
    /*
      0x00    0x63         0x63XXXXXX  PUSH4 _code.length  size
      0x01    0x80         0x80        DUP1                size size
      0x02    0x60         0x600e      PUSH1 14            14 size size
      0x03    0x60         0x6000      PUSH1 00            0 14 size size
      0x04    0x39         0x39        CODECOPY            size
      0x05    0x60         0x6000      PUSH1 00            0 size
      0x06    0xf3         0xf3        RETURN
      <CODE>
    */

    return abi.encodePacked(
      hex"63",
      uint32(_code.length),
      hex"80_60_0E_60_00_39_60_00_F3",
      _code
    );
  }

  /**
    @notice Returns the size of the code on a given address
    @param _addr Address that may or may not contain code
    @return size of the code on the given `_addr`
  */
  function codeSize(address _addr) internal view returns (uint256 size) {
    assembly { size := extcodesize(_addr) }
  }

  /**
    @notice Returns the code of a given address
    @dev It will fail if `_end < _start`
    @param _addr Address that may or may not contain code
    @param _start number of bytes of code to skip on read
    @param _end index before which to end extraction
    @return oCode read from `_addr` deployed bytecode

    Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd
  */
  function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) {
    uint256 csize = codeSize(_addr);
    if (csize == 0) return bytes("");

    if (_start > csize) return bytes("");
    if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); 

    unchecked {
      uint256 reqSize = _end - _start;
      uint256 maxSize = csize - _start;

      uint256 size = maxSize < reqSize ? maxSize : reqSize;

      assembly {
        // allocate output byte array - this could also be done without assembly
        // by using o_code = new bytes(size)
        oCode := mload(0x40)
        // new "memory end" including padding
        mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f))))
        // store length in memory
        mstore(oCode, size)
        // actually retrieve the code, this needs assembly
        extcodecopy(_addr, add(oCode, 0x20), _start, size)
      }
    }
  }
}

File 17 of 21 : DynamicBuffer.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)

pragma solidity >=0.8.0;

/// @title DynamicBuffer
/// @author David Huber (@cxkoda) and Simon Fremaux (@dievardump). See also
///         https://raw.githubusercontent.com/dievardump/solidity-dynamic-buffer
/// @notice This library is used to allocate a big amount of container memory
//          which will be subsequently filled without needing to reallocate
///         memory.
/// @dev First, allocate memory.
///      Then use `buffer.appendUnchecked(theBytes)` or `appendSafe()` if
///      bounds checking is required.
library DynamicBuffer {
    /// @notice Allocates container space for the DynamicBuffer
    /// @param capacity The intended max amount of bytes in the buffer
    /// @return buffer The memory location of the buffer
    /// @dev Allocates `capacity + 0x60` bytes of space
    ///      The buffer array starts at the first container data position,
    ///      (i.e. `buffer = container + 0x20`)
    function allocate(uint256 capacity)
        internal
        pure
        returns (bytes memory buffer)
    {
        assembly {
            // Get next-free memory address
            let container := mload(0x40)

            // Allocate memory by setting a new next-free address
            {
                // Add 2 x 32 bytes in size for the two length fields
                // Add 32 bytes safety space for 32B chunked copy
                let size := add(capacity, 0x60)
                let newNextFree := add(container, size)
                mstore(0x40, newNextFree)
            }

            // Set the correct container length
            {
                let length := add(capacity, 0x40)
                mstore(container, length)
            }

            // The buffer starts at idx 1 in the container (0 is length)
            buffer := add(container, 0x20)

            // Init content with length 0
            mstore(buffer, 0)
        }

        return buffer;
    }

    /// @notice Appends data to buffer, and update buffer length
    /// @param buffer the buffer to append the data to
    /// @param data the data to append
    /// @dev Does not perform out-of-bound checks (container capacity)
    ///      for efficiency.
    function appendUnchecked(bytes memory buffer, bytes memory data)
        internal
        pure
    {
        assembly {
            let length := mload(data)
            for {
                data := add(data, 0x20)
                let dataEnd := add(data, length)
                let copyTo := add(buffer, add(mload(buffer), 0x20))
            } lt(data, dataEnd) {
                data := add(data, 0x20)
                copyTo := add(copyTo, 0x20)
            } {
                // Copy 32B chunks from data to buffer.
                // This may read over data array boundaries and copy invalid
                // bytes, which doesn't matter in the end since we will
                // later set the correct buffer length, and have allocated an
                // additional word to avoid buffer overflow.
                mstore(copyTo, mload(data))
            }

            // Update buffer length
            mstore(buffer, add(mload(buffer), length))
        }
    }

    /// @notice Appends data to buffer, and update buffer length
    /// @param buffer the buffer to append the data to
    /// @param data the data to append
    /// @dev Performs out-of-bound checks and calls `appendUnchecked`.
    function appendSafe(bytes memory buffer, bytes memory data) internal pure {
        uint256 capacity;
        uint256 length;
        assembly {
            capacity := sub(mload(sub(buffer, 0x20)), 0x40)
            length := mload(buffer)
        }

        require(
            length + data.length <= capacity,
            "DynamicBuffer: Appending out of bounds."
        );
        appendUnchecked(buffer, data);
    }
}

File 18 of 21 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred.
     * This includes minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 19 of 21 : HelperLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

library HelperLib {
    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function _substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }
}

File 20 of 21 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 21 of 21 : SSTORE2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../helpers/Bytecode.sol";

/**
  @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost.
  @author Agustin Aguilar <[email protected]>

  Readme: https://github.com/0xsequence/sstore2#readme
*/
library SSTORE2 {
  error WriteError();

  /**
    @notice Stores `_data` and returns `pointer` as key for later retrieval
    @dev The pointer is a contract address with `_data` as code
    @param _data to be written
    @return pointer Pointer to the written `_data`
  */
  function write(bytes memory _data) internal returns (address pointer) {
    // Append 00 to _data so contract can't be called
    // Build init code
    bytes memory code = Bytecode.creationCodeFor(
      abi.encodePacked(
        hex'00',
        _data
      )
    );

    // Deploy contract using create
    assembly { pointer := create(0, add(code, 32), mload(code)) }

    // Address MUST be non-zero
    if (pointer == address(0)) revert WriteError();
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @return data read from `_pointer` contract
  */
  function read(address _pointer) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @param _end index before which to end extraction
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, _end + 1);
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WriteError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"userName","type":"string"},{"indexed":false,"internalType":"string","name":"social","type":"string"},{"indexed":false,"internalType":"string","name":"website","type":"string"},{"indexed":false,"internalType":"string","name":"profileName","type":"string"}],"name":"AttributesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isPhlipped","type":"bool"}],"name":"ImagePhlipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"labelId","type":"uint256"},{"indexed":false,"internalType":"string","name":"customLabels","type":"string"},{"indexed":false,"internalType":"string","name":"customValues","type":"string"}],"name":"LabelsValuesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"layerRevealed","type":"uint256"}],"name":"LayersRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool[]","name":"layerIsHidden","type":"bool[]"}],"name":"LayersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"color","type":"string"}],"name":"bgChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"_layerIndex","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"mimetype","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct OnChainAlpha.TraitDTO[]","name":"traits","type":"tuple[]"}],"name":"addLayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractData","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"string","name":"banner","type":"string"},{"internalType":"string","name":"website","type":"string"},{"internalType":"uint256","name":"royalties","type":"uint256"},{"internalType":"string","name":"royaltiesRecipient","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"faContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRebates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hashToSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogTokenId","type":"uint256"}],"name":"ogClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogTokenId","type":"uint256"}],"name":"ogMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"publicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdA","type":"uint256"},{"internalType":"uint256","name":"tokenIdB","type":"uint256"}],"name":"reRollDuplicate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reRollDuplicateRole","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebateAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_layer","type":"uint256"}],"name":"revealLayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_bgColor","type":"string"}],"name":"setBgColor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"string","name":"banner","type":"string"},{"internalType":"string","name":"website","type":"string"},{"internalType":"uint256","name":"royalties","type":"uint256"},{"internalType":"string","name":"royaltiesRecipient","type":"string"}],"internalType":"struct OnChainAlpha.ContractData","name":"_contractData","type":"tuple"}],"name":"setContractData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_labelNum","type":"uint256"},{"internalType":"string","name":"_label","type":"string"},{"internalType":"string","name":"_value","type":"string"}],"name":"setLabelsValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_layerNum","type":"uint256"},{"internalType":"string","name":"_value","type":"string"}],"name":"setLayerNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_username","type":"string"},{"internalType":"string","name":"_social","type":"string"},{"internalType":"string","name":"_website","type":"string"}],"name":"setProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_renderOffChain","type":"bool"}],"name":"setRenderOfTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool[]","name":"states","type":"bool[]"}],"name":"toggleLayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_flipped","type":"bool"}],"name":"togglePhlipPFP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60076102608181526614dc1958da585b60ca1b61028052608090815260016102a0818152602d60f81b6102c081905260a091909152600d6102e09081526c135bdd5d1a0814dc1958da585b609a1b6103005260c05261032082815261034082905260e0526008610360908152672432b0b23bb2b0b960c11b61038052610100526103a08281526103c0829052610120526103e09384526622bcb2bbb2b0b960c91b6104005261014093909352610420818152610440849052610160526004610460818152634579657360e01b61048052610180526104a08281526104c08590526101a05260056104e09081526409adeeae8d60db1b610500526101c0526105208281526105408590526101e052610560818152634561727360e01b61058052610200526105a09182526105c093909352610220526106206040526105e091825263426f647960e01b61060052610240919091526200016290602490600f62000f02565b50602580546001600160a01b031990811673957356f9412830c992d465ff8cdb9b0aa023020b17909155602680549091167389d92a754fd1a672c21b5fc2a347198d1a9456b317905566b1a2bc2ec5000060275566470de4df82000060285560408051606081019091526021808252620071916020830139602990620001e99082620010d0565b50602a805460ff191690556040805161012081018252600e60e082019081526d4f6e2d436861696e20416c70686160901b6101008301528152815161018081019092526101478083529091602080840192906200704a9083013981526020016040518060800160405280605281526020016200722a6052913981526020016040518060800160405280604e8152602001620071b2604e913981526020016040518060400160405280600e81526020016d68747470733a2f2f6f63612e676760901b81525081526020016101f481526020016040518060600160405280602a815260200162007200602a913990528051602b908190620002e99082620010d0565b5060208201516001820190620003009082620010d0565b5060408201516002820190620003179082620010d0565b50606082015160038201906200032e9082620010d0565b5060808201516004820190620003459082620010d0565b5060a0820151600582015560c08201516006820190620003669082620010d0565b5050603280546001600160a01b0319167395c0a28443f4897bf718243a539fd018b6c16f63179055503480156200039c57600080fd5b506040518060400160405280600e81526020016d4f6e2d436861696e20416c70686160901b815250604051806040016040528060038152602001624f434160e81b8152508160029081620003f19190620010d0565b506003620004008282620010d0565b506000805550506001600855620004173362000eb0565b6040805160e081018252600a8152600f602082015260199181019190915260326060820152604b6080820152606460a0820152611d4e60c08201526200046290601590600762000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee6102208201526103526102408201526104036102608201526200052290601690601462000f5f565b506040805161020081018252603281526064602082015260969181019190915260c8606082015260fa608082015261012c60a082015261015e60c082015261019060e08201526101c26101008201526101f461012082015261022661014082015261025861016082015261028a6101808201526102bc6101a08201526102ee6101c08201526106f16101e0820152620005c090601790601062000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee6102208201526103526102408201526104036102608201526200068090601890601462000f5f565b506040805161038081018252600a815260146020820152602891810191909152603c606082015260506080820152606460a080830191909152607860c0830152608c60e083015261010082015260b461012082015260c86101408083019190915260dc61016083015260f06101808301526101046101a08301526101186101c083015261012c6101e08084019190915261020083019190915261015461022083015261016861024083015261017c6102608301526101906102808301526101a46102a08301526101b86102c08301526101cc6102e08301526103008201526101f46103208201526102086103408201526102eb6103608201526200078990601990601c62000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee6102208201526103526102408201526104036102608201526200084990601a90601462000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee6102208201526103526102408201526104036102608201526200090990601b90601462000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee610220820152610352610240820152610403610260820152620009c990601c90601462000f5f565b50604080516102c0810182526019815260286020820152605091810191909152606e6060820152608c608082015260aa60a082015260c860c082015260e660e08201526101046101008201526101226101208201526101408082015261015e61016082015261017c61018082015261019a6101a08201526101b86101c08201526101d66101e08201526101f461020082015261021261022082015261023a61024082015261026261026082015261028a6102808201526103ea6102a082015262000a9890601d90601662000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee61022082015261035261024082015261040361026082015262000b5890601e90601462000f5f565b5060408051610200810182526064815260c8602082015260fa9181019190915261012c606082015261015e608082015261019060a08201526101c260c08201526101f460e082015261022661010082015261025861012082015261028a6101408201526102bc6101608201526102ee6101808201526103526101a08201526103e86101c08201526106bf6101e082015262000bf890601f90601062000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee6102208201526103526102408201526104036102608201526015600b62000cbc92910190601462000f5f565b50604080516101a08101825260c8815261012c6020820152610190918101919091526101f4606082015261025860808201526102bc60a082015261032060c082015261038460e08201526103e861010082015261044c6101208201526104b06101408201526105146101608201526105c561018082015262000d4390602190600d62000f5f565b50604080516102808101825260238152604160208201526064918101919091526082606082015260a06080820181905260be9082015260dc60c082015260fa60e08201526101186101008201526101366101208201526101546101408201526101726101608201526101906101808201526101c26101a08201526101f46101c082015261028a6101e08201526102bc6102008201526102ee61022082015261035261024082015261040361026082015262000e0390602290601462000f5f565b506040805161022081018252604b81526064602082015260969181019190915260c8606082015260fa608082015261012c60a082015261015e60c082015261019060e08201526101c26101008201526101f46101208201526102266101408201526102586101608201526102bc6101808201526103206101a08201526103846101c08201526105ac6101e0820152600061020082015262000ea990602390601162000f5f565b506200119c565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000f4d579160200282015b8281111562000f4d578251829062000f3c9082620010d0565b509160200191906001019062000f23565b5062000f5b92915062000fb1565b5090565b82805482825590600052602060002090810192821562000fa3579160200282015b8281111562000fa3578251829061ffff1690559160200191906001019062000f80565b5062000f5b92915062000fd2565b8082111562000f5b57600062000fc8828262000fe9565b5060010162000fb1565b5b8082111562000f5b576000815560010162000fd3565b50805462000ff79062001041565b6000825580601f1062001008575050565b601f01602090049060005260206000209081019062001028919062000fd2565b50565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200105657607f821691505b6020821081036200107757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620010cb57600081815260208120601f850160051c81016020861015620010a65750805b601f850160051c820191505b81811015620010c757828155600101620010b2565b5050505b505050565b81516001600160401b03811115620010ec57620010ec6200102b565b6200110481620010fd845462001041565b846200107d565b602080601f8311600181146200113c5760008415620011235750858301515b600019600386901b1c1916600185901b178555620010c7565b600085815260208120601f198616915b828110156200116d578886015182559484019460019091019084016200114c565b50858210156200118c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615e9e80620011ac6000396000f3fe6080604052600436106102395760003560e01c806301ffc9a71461023e57806306fdde0314610273578063081812fc14610295578063095ea7b3146102cd5780630ea71cfc146102ef5780630f3debbe1461030f578063150b7a021461032f57806318160ddd1461036857806319c841fd1461038b57806323b872dd146103ab5780632437013d146103cb5780632d6b6224146103eb5780632db11544146104055780633cca2420146104185780633ccfd60b146104405780634047638d1461045557806342842e0e1461046a57806355f804b31461048a5780635b92ac0d146104aa578063621a1f74146104bf5780636352211e146104df578063673cd60d146104ff5780636817c76c1461051f5780636c0360eb1461053557806370a082311461054a578063715018a61461056a578063716e43d71461057f5780637a75353a1461059f5780638da5cb5b146105bf57806395d89b41146105d457806397e2155d146105e9578063a22cb46514610609578063a78c8a7a14610629578063ac9650d81461063f578063ad9adfe31461066c578063b88d4fde1461068c578063b9e6cfad146106ac578063bc74dae6146106cc578063c406ec72146106fc578063c87b56dd1461071c578063d5abeb011461073c578063dbe9875f14610752578063dd21bb7d14610772578063e488627314610792578063e8a3d485146107b2578063e985e9c5146107c7578063f2f0dc0514610810578063f2fde38b14610846578063fb38d21114610866578063fd6b3cf514610886575b600080fd5b34801561024a57600080fd5b5061025e610259366004614668565b6108a6565b60405190151581526020015b60405180910390f35b34801561027f57600080fd5b506102886108f8565b60405161026a91906146d5565b3480156102a157600080fd5b506102b56102b03660046146e8565b61098a565b6040516001600160a01b03909116815260200161026a565b3480156102d957600080fd5b506102ed6102e8366004614716565b6109ce565b005b3480156102fb57600080fd5b506102ed61030a366004614841565b610a6e565b34801561031b57600080fd5b506102ed61032a3660046148d2565b610b6b565b34801561033b57600080fd5b5061034f61034a3660046149fc565b610bff565b6040516001600160e01b0319909116815260200161026a565b34801561037457600080fd5b50600154600054035b60405190815260200161026a565b34801561039757600080fd5b506102ed6103a6366004614aaa565b610cd4565b3480156103b757600080fd5b506102ed6103c6366004614ad6565b610d54565b3480156103d757600080fd5b506102ed6103e6366004614b3a565b610ee7565b3480156103f757600080fd5b50602a5461025e9060ff1681565b61037d6104133660046146e8565b610fa2565b34801561042457600080fd5b5061042d611146565b60405161026a9796959493929190614be2565b34801561044c57600080fd5b506102ed6114a4565b34801561046157600080fd5b506102ed6114c8565b34801561047657600080fd5b506102ed610485366004614ad6565b6114e4565b34801561049657600080fd5b506102ed6104a5366004614c6b565b611504565b3480156104b657600080fd5b5061025e61151c565b3480156104cb57600080fd5b506102886104da3660046146e8565b61153e565b3480156104eb57600080fd5b506102b56104fa3660046146e8565b6124d6565b34801561050b57600080fd5b506025546102b5906001600160a01b031681565b34801561052b57600080fd5b5061037d60275481565b34801561054157600080fd5b506102886124e1565b34801561055657600080fd5b5061037d610565366004614c9f565b61256f565b34801561057657600080fd5b506102ed6125bd565b34801561058b57600080fd5b506102ed61059a366004614cbc565b6125d1565b3480156105ab57600080fd5b506102ed6105ba366004614dfa565b612766565b3480156105cb57600080fd5b506102b56127cd565b3480156105e057600080fd5b506102886127dc565b3480156105f557600080fd5b506102ed610604366004614e40565b6127eb565b34801561061557600080fd5b506102ed610624366004614e62565b612876565b34801561063557600080fd5b5061037d60285481565b34801561064b57600080fd5b5061065f61065a366004614e8e565b61290b565b60405161026a9190614f02565b34801561067857600080fd5b50610288610687366004614f64565b6129ff565b34801561069857600080fd5b506102ed6106a7366004614fa8565b612d57565b3480156106b857600080fd5b506102886106c7366004614f64565b612d9b565b3480156106d857600080fd5b5061025e6106e73660046146e8565b60009081526013602052604090205460ff1690565b34801561070857600080fd5b506026546102b5906001600160a01b031681565b34801561072857600080fd5b506102886107373660046146e8565b6131c5565b34801561074857600080fd5b5061037d611e6181565b34801561075e57600080fd5b506102ed61076d366004614aaa565b613475565b34801561077e57600080fd5b5061037d61078d3660046146e8565b6134bb565b34801561079e57600080fd5b506102ed6107ad366004615007565b6135da565b3480156107be57600080fd5b506102886136c4565b3480156107d357600080fd5b5061025e6107e2366004615042565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081c57600080fd5b5061037d61082b366004614c9f565b6001600160a01b031660009081526012602052604090205490565b34801561085257600080fd5b506102ed610861366004614c9f565b613722565b34801561087257600080fd5b506102ed610881366004614dfa565b61379d565b34801561089257600080fd5b506102ed6108a1366004614e40565b6137cf565b60006301ffc9a760e01b6001600160e01b0319831614806108d757506380ac58cd60e01b6001600160e01b03198316145b806108f25750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546109079061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546109339061507b565b80156109805780601f1061095557610100808354040283529160200191610980565b820191906000526020600020905b81548152906001019060200180831161096357829003601f168201915b5050505050905090565b60006109958261383e565b6109b2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109d9826124d6565b9050336001600160a01b03821614610a12576109f581336107e2565b610a12576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b33610a78856124d6565b6001600160a01b031614610a8b57600080fd5b6000848152601060205260409020610aa384826150f5565b506000848152601060205260409020600101610abf83826150f5565b506000848152601060205260409020600201610adb82826150f5565b50600083610ae886613865565b604051602001610af99291906151b4565b60408051601f198184030181529181526000878152601060205220909150600301610b2482826150f5565b507fb8981c9fcfec39b56f5caf88846acca9b61e75401e68da165ef541e81991d8b68585858585604051610b5c9594939291906151f0565b60405180910390a15050505050565b610b736138b4565b80518190602b908190610b8690826150f5565b5060208201516001820190610b9b90826150f5565b5060408201516002820190610bb090826150f5565b5060608201516003820190610bc590826150f5565b5060808201516004820190610bda90826150f5565b5060a0820151600582015560c08201516006820190610bf990826150f5565b50505050565b6026546000906001600160a01b0316331480610c9057506026546040516331a9108f60e11b8152600481018690526001600160a01b03878116921690636352211e90602401602060405180830381865afa158015610c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c85919061524f565b6001600160a01b0316145b610c9957600080fd5b6001600160a01b0385166000908152601260205260408120805491610cbd83615282565b90915550630a85bd0160e11b979650505050505050565b610cdd826124d6565b6001600160a01b0316336001600160a01b031614610cfa57600080fd5b6000828152600f6020908152604091829020805460ff19168415159081179091558251858152918201527fafec4b400a28d8bdfacc6b65e3c25cc07399c2c20eeb817256f6413c7e84687c91015b60405180910390a15050565b6000610d5f82613913565b9050836001600160a01b0316816001600160a01b031614610d925760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ddf57610dc286336107e2565b610ddf57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610e0657604051633a954ecd60e21b815260040160405180910390fd5b8015610e1157600082555b6001600160a01b03808716600090815260056020526040808220805460001901905591871681522080546001019055610e5a85610e4f888287613981565b600160e11b176139a4565b600085815260046020526040812091909155600160e11b84169003610eaf57600184016000818152600460205260408120549003610ead576000548114610ead5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020615e2983398151915260405160405180910390a45b505050505050565b610ef0826124d6565b6001600160a01b0316336001600160a01b031614610f0d57600080fd5b60005b600f811015610f7057818181518110610f2b57610f2b61529b565b6020908102919091018101516000858152600d8352604080822085835290935291909120805460ff191691151591909117905580610f6881615282565b915050610f10565b507f6feffc52172e0d2f7273caf08349169b161ca5e8e463fa548b2dc2258c54cce38282604051610d489291906152b1565b6000610fac6139b9565b610fb461151c565b610fbd57600080fd5b600080543382526014602052604090912054606490610fdd908590615301565b1115610fe857600080fd5b600a8311158015610ff95750600083115b61100257600080fd5b611e6161100f8483615301565b111561101a57600080fd5b33321461102657600080fd5b3360009081526012602052604081205480156110ec5784811161108d57806028546110519190615314565b915081602754866110629190615314565b61106c919061532b565b34101561107857600080fd5b33600090815260126020526040812055611105565b8460285461109b9190615314565b915081602754866110ac9190615314565b6110b6919061532b565b3410156110c257600080fd5b33600090815260126020526040812080548792906110e190849061532b565b909155506111059050565b6027546110f99086615314565b34101561110557600080fd5b3360009081526014602052604081208054879290611124908490615301565b9091555061113490503386613a12565b5050600160085592915050565b919050565b602b805481906111559061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546111819061507b565b80156111ce5780601f106111a3576101008083540402835291602001916111ce565b820191906000526020600020905b8154815290600101906020018083116111b157829003601f168201915b5050505050908060010180546111e39061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461120f9061507b565b801561125c5780601f106112315761010080835404028352916020019161125c565b820191906000526020600020905b81548152906001019060200180831161123f57829003601f168201915b5050505050908060020180546112719061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461129d9061507b565b80156112ea5780601f106112bf576101008083540402835291602001916112ea565b820191906000526020600020905b8154815290600101906020018083116112cd57829003601f168201915b5050505050908060030180546112ff9061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461132b9061507b565b80156113785780601f1061134d57610100808354040283529160200191611378565b820191906000526020600020905b81548152906001019060200180831161135b57829003601f168201915b50505050509080600401805461138d9061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546113b99061507b565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b5050505050908060050154908060060180546114219061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461144d9061507b565b801561149a5780601f1061146f5761010080835404028352916020019161149a565b820191906000526020600020905b81548152906001019060200180831161147d57829003601f168201915b5050505050905087565b47806114af57600080fd5b6032546114c5906001600160a01b031682613aef565b50565b6114d06138b4565b602a805460ff19811660ff90911615179055565b6114ff83838360405180602001604052806000815250612d57565b505050565b61150c6138b4565b602961151882826150f5565b5050565b6000611e6161152a60005490565b1080156115395750602a5460ff165b905090565b60606115498261383e565b61155257600080fd5b6000611568611563600f6004615314565b613c05565b60408051600f808252610200820190925291925060009190602082016101e08036833701905050905060005b600f8110156123a55760008282815181106115b1576115b161529b565b6020026020010151905060006002836115ca9190615354565b1180156115f157506000868152600e6020908152604080832085845290915290205460ff16155b1561163a576001601583600f811061160b5761160b61529b565b0154611617919061532b565b8383815181106116295761162961529b565b602002602001018181525050612392565b600061164587613c22565b6060015162ffffff1690506000611e6182896116618782615301565b60408051602081019490945283019190915260608201526080016040516020818303038152906040528051906020012060001c61169e9190615354565b90506116aa8185613c3b565b9250828585815181106116bf576116bf61529b565b60200260200101818152505060006001601586600f81106116e2576116e261529b565b01546116ee919061532b565b60008a8152600d6020908152604080832089845290915290205490915060ff161515600103611f8a5784600a14801561174057508585815181106117345761173461529b565b6020026020010151600a145b156117b257808686815181106117585761175861529b565b60209081029190910181019190915260008a8152600d82526040808220600283529092529081205460ff16151590036117ad57600f866002815181106117a0576117a061529b565b6020026020010181815250505b61238e565b84600e1480156117db57508585815181106117cf576117cf61529b565b60200260200101516000145b1561183b57808686815181106117f3576117f361529b565b60209081029190910181019190915260008a8152600d82526040808220600883529092529081205460ff16151590036117ad576005866008815181106117a0576117a061529b565b84600e14801561186457508585815181106118585761185861529b565b60200260200101516002145b15611954578086868151811061187c5761187c61529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff16151590036118d157600186600a815181106118c4576118c461529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036119195760008660088151811061190c5761190c61529b565b6020026020010181815250505b6000898152600d602090815260408083206004845290915281205460ff16151590036117ad576001866004815181106117a0576117a061529b565b84600e14801561197d57508585815181106119715761197161529b565b60200260200101516004145b15611a2557808686815181106119955761199561529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff16151590036119ea57600886600a815181106119dd576119dd61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576009866008815181106117a0576117a061529b565b84600e148015611a4e5750858581518110611a4257611a4261529b565b60200260200101516005145b15611af65780868681518110611a6657611a6661529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611abb57600686600a81518110611aae57611aae61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576007866008815181106117a0576117a061529b565b84600e148015611b1f5750858581518110611b1357611b1361529b565b60200260200101516006145b15611c335780868681518110611b3757611b3761529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611b8c57600786600a81518110611b7f57611b7f61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff1615159003611bd457600886600881518110611bc757611bc761529b565b6020026020010181815250505b85600681518110611be757611be761529b565b60200260200101516008148015611c1957506000898152600d602090815260408083206006845290915290205460ff16155b156117ad576013866006815181106117a0576117a061529b565b84600e148015611c5c5750858581518110611c5057611c5061529b565b60200260200101516007145b15611d045780868681518110611c7457611c7461529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611cc957600286600a81518110611cbc57611cbc61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576004866008815181106117a0576117a061529b565b84600e148015611d2d5750858581518110611d2157611d2161529b565b60200260200101516009145b15611dd55780868681518110611d4557611d4561529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611d9a57600586600a81518110611d8d57611d8d61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576001866008815181106117a0576117a061529b565b84600e148015611dfe5750858581518110611df257611df261529b565b6020026020010151600a145b15611ea65780868681518110611e1657611e1661529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611e6b57600486600a81518110611e5e57611e5e61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576002866008815181106117a0576117a061529b565b84600e148015611ecf5750858581518110611ec357611ec361529b565b6020026020010151600b145b15611f775780868681518110611ee757611ee761529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611f3c57600386600a81518110611f2f57611f2f61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576003866008815181106117a0576117a061529b565b808686815181106117a0576117a061529b565b85600a81518110611f9d57611f9d61529b565b6020026020010151600a03611ff4576000898152600d602090815260408083206002845290915281205460ff1615159003611ff457600f86600281518110611fe757611fe761529b565b6020026020010181815250505b85600e815181106120075761200761529b565b6020026020010151600003612051576000898152600d602090815260408083206008845290915281205460ff16151590036117ad576005866008815181106117a0576117a061529b565b85600e815181106120645761206461529b565b60200260200101516002036120ae576000898152600d60209081526040808320600a845290915281205460ff16151590036118d157600186600a815181106118c4576118c461529b565b85600e815181106120c1576120c161529b565b602002602001015160040361210b576000898152600d60209081526040808320600a845290915281205460ff16151590036119ea57600886600a815181106119dd576119dd61529b565b85600e8151811061211e5761211e61529b565b6020026020010151600503612168576000898152600d60209081526040808320600a845290915281205460ff1615159003611abb57600686600a81518110611aae57611aae61529b565b85600e8151811061217b5761217b61529b565b60200260200101516006036121c5576000898152600d60209081526040808320600a845290915281205460ff1615159003611b8c57600786600a81518110611b7f57611b7f61529b565b85600e815181106121d8576121d861529b565b6020026020010151600703612222576000898152600d60209081526040808320600a845290915281205460ff1615159003611cc957600286600a81518110611cbc57611cbc61529b565b85600e815181106122355761223561529b565b602002602001015160090361227f576000898152600d60209081526040808320600a845290915281205460ff1615159003611d9a57600586600a81518110611d8d57611d8d61529b565b85600e815181106122925761229261529b565b6020026020010151600a036122dc576000898152600d60209081526040808320600a845290915281205460ff1615159003611e6b57600486600a81518110611e5e57611e5e61529b565b85600e815181106122ef576122ef61529b565b6020026020010151600b0361238e576000898152600d60209081526040808320600a845290915281205460ff161515900361234657600386600a815181106123395761233961529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff161515900361238e576003866008815181106123815761238161529b565b6020026020010181815250505b5050505b508061239d81615282565b915050611594565b5060005b81518110156124cd57600a8282815181106123c6576123c661529b565b602002602001015110156123fd57604080518082019091526002815261030360f41b60208201526123f8908490613d01565b612442565b60648282815181106124115761241161529b565b60200260200101511015612442576040805180820190915260018152600360fc1b6020820152612442908490613d01565b6103e78282815181106124575761245761529b565b6020026020010151111561248f5760408051808201909152600381526239393960e81b602082015261248a908490613d01565b6124bb565b6124bb6124b48383815181106124a7576124a761529b565b6020026020010151613865565b8490613d01565b806124c581615282565b9150506123a9565b50909392505050565b60006108f282613913565b602980546124ee9061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461251a9061507b565b80156125675780601f1061253c57610100808354040283529160200191612567565b820191906000526020600020905b81548152906001019060200180831161254a57829003601f168201915b505050505081565b60006001600160a01b038216612598576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6125c56138b4565b6125cf6000613d86565b565b6125d96138b4565b8051601583600f81106125ee576125ee61529b565b0154146125fa57600080fd5b600081516001600160401b0381111561261557612615614742565b60405190808252806020026020018201604052801561263e578160200160208202803683370190505b50905060005b8251811015612746576126738382815181106126625761266261529b565b602002602001015160400151613dd8565b8282815181106126855761268561529b565b60200260200101906001600160a01b031690816001600160a01b03168152505060405180604001604052808483815181106126c2576126c261529b565b60200260200101516000015181526020018483815181106126e5576126e561529b565b6020908102919091018101518101519091526000868152600b82526040808220858352909252208151819061271a90826150f5565b506020820151600182019061272f90826150f5565b50905050808061273e90615282565b915050612644565b506000838152600a602090815260409091208251610bf9928401906145b1565b33612770836124d6565b6001600160a01b03161461278357600080fd5b600082815260116020526040902061279b82826150f5565b507f81b1bf653f53dc046b08a20dc605eed2195235db792f342a6a722e1b5480f9548282604051610d48929190615368565b6009546001600160a01b031690565b6060600380546109079061507b565b600f81106127f857600080fd5b612801826124d6565b6001600160a01b0316336001600160a01b03161461281e57600080fd5b6000828152600e60209081526040808320848452825291829020805460ff1916600117905581518481529081018390527f4c652a0da724e2e441d4269d925eb66c004118aea8f9d00f7cfd6c906f908d229101610d48565b336001600160a01b0383160361289f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060816001600160401b0381111561292557612925614742565b60405190808252806020026020018201604052801561295857816020015b60608152602001906001900390816129435790505b50905060005b828110156129f8576129c83085858481811061297c5761297c61529b565b905060200281019061298e9190615381565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e3d92505050565b8282815181106129da576129da61529b565b602002602001018190525080806129f090615282565b91505061295e565b5092915050565b60606000806040518060400160405280600681526020016531433135333160d01b81525090506000601160008681526020019081526020016000208054612a459061507b565b90501115612ae75760008481526011602052604090208054612a669061507b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a929061507b565b8015612adf5780601f10612ab457610100808354040283529160200191612adf565b820191906000526020600020905b815481529060010190602001808311612ac257829003601f168201915b505050505090505b6000612af562020000613c05565b9050612b1a6040518060c0016040528060838152602001615d3f608391398290613d01565b612b4582604051602001612b2e91906153ce565b60408051601f198184030181529190528290613d01565b60005b612b546001600f61532b565b811015612c77576000612b68600283615354565b118015612b8f57506000868152600e6020908152604080832084845290915290205460ff16155b612c6557612bc5612bc088612ba5846003615314565b612bb0856003615314565b612bbb906003615301565b613e62565b613f2e565b60ff169350612c65600b60008381526020019081526020016000206000868152602001908152602001600020600101612c3d612c38600a60008681526020019081526020016000208881548110612c1e57612c1e61529b565b6000918252602090912001546001600160a01b0316613fe4565b613ff4565b604051602001612c4e92919061547b565b60408051601f198184030181529190528390613d01565b80612c6f81615282565b915050612b48565b50612ca2612bc0876003612c8c600f82615314565b612c96919061532b565b612bbb600f6003615314565b60ff169250612d24600b6000612cba6001600f61532b565b81526020019081526020016000206000858152602001908152602001600020600101612d13612c38600a60006001600f612cf4919061532b565b81526020019081526020016000208781548110612c1e57612c1e61529b565b604051602001612b2e9291906154d5565b612d2d81613ff4565b604051602001612d3d9190615639565b604051602081830303815290604052935050505092915050565b612d62848484610d54565b6001600160a01b0383163b15610bf957612d7e84848484614146565b610bf9576040516368d2bf6b60e11b815260040160405180910390fd5b60606000612dab62020000613c05565b9050612dd9604051806040016040528060018152602001605b60f81b81525082613d0190919063ffffffff16565b60005b600f8110156131bd576000612e04612bc087612df9856003615314565b612bb0866003615314565b6000838152600b6020908152604080832060ff949094168084529390915290208054919250600291612e359061507b565b905011156131aa57612e9b60248381548110612e5357612e5361529b565b60009182526020808320868452600b825260408085208786528352938490209351612e84949390910192910161567b565b60408051601f198184030181529190528490613d01565b81600a148015612f8057506000858152600d60209081526040808320600b845290915290205460ff1680612eea57506000858152600e60209081526040808320600b845290915290205460ff16155b8015612f1057506000858152600d60209081526040808320600c845290915290205460ff165b8015612f5a57506000858152600d6020818152604080842092845291905290205460ff1680612f5a57506000858152600e60209081526040808320600d845290915290205460ff16155b8015612f8057506000858152600d60209081526040808320600e845290915290205460ff165b15612fad576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b6131aa565b81600b14801561304657506000858152600d60209081526040808320600c845290915290205460ff16801561302057506000858152600d6020818152604080842092845291905290205460ff168061302057506000858152600e60209081526040808320600d845290915290205460ff16155b801561304657506000858152600d60209081526040808320600e845290915290205460ff165b1561306e576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b81600c1480156130e257506000858152600d6020818152604080842092845291905290205460ff16806130bc57506000858152600e60209081526040808320600d845290915290205460ff16155b80156130e257506000858152600d60209081526040808320600e845290915290205460ff165b1561310a576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b81600d14801561313457506000858152600d60209081526040808320600e845290915290205460ff165b1561315c576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b81600e03613187576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b6040805180820190915260018152600b60fa1b60208201526131aa908490613d01565b50806131b581615282565b915050612ddc565b509392505050565b60606131d08261383e565b6131d957600080fd5b60008052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35461320d57600080fd5b60006132188361153e565b9050600061322862020000613c05565b6000858152601060205260408120805492935090916132469061507b565b9050111561327757600084815260106020908152604091829020915161327292612b2e929091016156d1565b6132ae565b6040805180820190915260158152747b226e616d65223a224f6e436861696e416c70686160581b60208201526132ae908290613d01565b6132cd6132ba85613865565b604051612b2e9190602c906020016156ef565b6000602980546132dc9061507b565b90501180156132f957506000848152600c602052604090205460ff165b156133225761331d602961330c86613865565b604051602001612b2e92919061574a565b613427565b60408051602080820183526000808352878152600f909152919091205460ff16156133b857600061335384876129ff565b905061337d816040516020016133699190615781565b604051602081830303815290604052613ff4565b60405160200161338d9190615639565b60405160208183030381529060405291506133b281604051602001612e84919061588c565b50613411565b60006133c484876129ff565b90506133da8160405160200161336991906158d3565b6040516020016133ea9190615639565b604051602081830303815290604052915061340f81604051602001612e84919061588c565b505b61342581604051602001612c4e91906159ac565b505b6134446134348386612d9b565b604051602001612b2e91906159ef565b61344d81613ff4565b60405160200161345d9190615a30565b60405160208183030381529060405292505050919050565b61347e826124d6565b6001600160a01b0316336001600160a01b03161461349b57600080fd5b6000918252600c6020526040909120805460ff1916911515919091179055565b60006134c56139b9565b6134cd61151c565b6134d657600080fd5b6000546103e88311156134e857600080fd5b60008381526013602052604090205460ff161561350457600080fd5b6026546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e90602401602060405180830381865afa15801561354d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613571919061524f565b6001600160a01b0316336001600160a01b03161461358e57600080fd5b611e6161359c826001615301565b11156135a757600080fd5b6000838152601360205260409020805460ff191660019081179091556135ce903390613a12565b90506111416001600855565b6135e3846124d6565b6001600160a01b0316336001600160a01b03161461360057600080fd5b600084815260106020526040902060060154808410613641576000858152601060205260408120600601805492955085929161363b83615282565b91905055505b6000858152601060209081526040808320878452600401909152902061366784826150f5565b506000858152601060209081526040808320878452600501909152902061368e83826150f5565b507fca3ccd3f553ac426b514af81e9a960872e7c86a7a0260f8e8b244ce916776e7285858585604051610b5c9493929190615a75565b6030546060906136fe90602b90602c90602d90602e90602f906136e690613865565b60405161336996959493929190603190602001615ab1565b60405160200161370e9190615a30565b604051602081830303815290604052905090565b61372a6138b4565b6001600160a01b0381166137945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114c581613d86565b6137a56138b4565b80602483815481106137b9576137b961529b565b9060005260206000200190816114ff91906150f5565b6025546001600160a01b031633146137e657600080fd5b60008183116137f557816137f7565b825b905061380281614231565b613815613810826001615301565b61383e565b1561382d5761382d613828826001615301565b614231565b6114ff81613839614261565b6142cd565b60008054821080156108f2575050600090815260046020526040902054600160e01b161590565b604080516080810191829052607f0190826030600a8206018353600a90045b80156138a257600183039250600a81066030018353600a9004613884565b50819003601f19909101908152919050565b336138bd6127cd565b6001600160a01b0316146125cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161378b565b6000816000548110156139685760008181526004602052604081205490600160e01b82169003613966575b8060000361395f57506000190160008181526004602052604090205461393e565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600060e882811c90613994868684614322565b62ffffff16901b95945050505050565b4260a01b176001600160a01b03919091161790565b600260085403613a0b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161378b565b6002600855565b6000546001600160a01b038316613a3b57604051622e076360e81b815260040160405180910390fd5b81600003613a5c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040812080546001600160401b018502019055613aa1908490613a94908281613981565b6001851460e11b176139a4565b600082815260046020526040902055808281015b6040516001830192906001600160a01b03871690600090600080516020615e29833981519152908290a4808210613ab55760005550505050565b80471015613b3f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161378b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b50509050806114ff5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b606482015260840161378b565b604080518281016060018252910181526000602090910190815290565b613c2a614616565b6108f2613c3683613913565b614341565b600080805b601584600f8110613c5357613c5361529b565b0154811015613cd7576000601585600f8110613c7157613c7161529b565b018281548110613c8357613c8361529b565b90600052602060002001549050828610158015613ca85750613ca58184615301565b86105b15613cb7575091506108f29050565b613cc18184615301565b9250508080613ccf90615282565b915050613c40565b506001601584600f8110613ced57613ced61529b565b0154613cf9919061532b565b949350505050565b601f1982015182518251603f19909201918290613d1e9083615301565b1115613d7c5760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b606482015260840161378b565b610bf98484614384565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080613e0383604051602001613def9190615bda565b6040516020818303038152906040526143ba565b90508051602082016000f091506001600160a01b038216613e375760405163046a55db60e11b815260040160405180910390fd5b50919050565b606061395f8383604051806060016040528060278152602001615e02602791396143e6565b6060836000613e71858561532b565b6001600160401b03811115613e8857613e88614742565b6040519080825280601f01601f191660200182016040528015613eb2576020820181803683370190505b509050845b84811015613f2457828181518110613ed157613ed161529b565b01602001516001600160f81b03191682613eeb888461532b565b81518110613efb57613efb61529b565b60200101906001600160f81b031916908160001a90535080613f1c81615282565b915050613eb7565b5095945050505050565b60008181805b82518160ff1610156131bd576030838260ff1681518110613f5757613f5761529b565b016020015160f81c10801590613f8a57506039838260ff1681518110613f7f57613f7f61529b565b016020015160f81c11155b15613fd257613f9a600a83615c00565b91506030838260ff1681518110613fb357613fb361529b565b0160200151613fc5919060f81c615c1c565b613fcf9083615c35565b91505b80613fdc81615c4e565b915050613f34565b60606108f282600160001961445e565b6060815160000361401357505060408051602081019091526000815290565b6000604051806060016040528060408152602001615dc260409139905060006003845160026140429190615301565b61404c9190615c6d565b614057906004615314565b6001600160401b0381111561406e5761406e614742565b6040519080825280601f01601f191660200182016040528015614098576020820181803683370190505b509050600182016020820185865187015b80821015614104576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506140a9565b505060038651066001811461412057600281146141335761413b565b603d6001830353603d600283035361413b565b603d60018303535b509195945050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061417b903390899088908890600401615c81565b6020604051808303816000875af19250505080156141b6575060408051601f3d908101601f191682019092526141b391810190615cb4565b60015b614214573d8080156141e4576040519150601f19603f3d011682016040523d82523d6000602084013e6141e9565b606091505b50805160000361420c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60008181526004602052604081205490036114c55761424f81613913565b60008281526004602052604090205550565b6000803a43424461427360018461532b565b6040805160208101969096528501939093526060808501929092526080840152904060a083015233901b6001600160601b03191660c082015260d40160408051601f19818403018152919052805160209091012092915050565b600082815260046020526040812054908190036142fc5760405162d5815360e01b815260040160405180910390fd5b6000928352600460205260409092206001600160e81b039290921660e89190911b179055565b60006001600160a01b038416156143395781613cf9565b613cf9614261565b614349614616565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b8051602082019150808201602084510184015b818410156143af578351815260209384019301614397565b505082510190915250565b60608151826040516020016143d0929190615cd1565b6040516020818303038152906040529050919050565b6060600080856001600160a01b0316856040516144039190615d22565b600060405180830381855af49150503d806000811461443e576040519150601f19603f3d011682016040523d82523d6000602084013e614443565b606091505b509150915061445486838387614513565b9695505050505050565b6060833b600081900361448157505060408051602081019091526000815261395f565b8084111561449f57505060408051602081019091526000815261395f565b838310156144d15760405163162544fd60e11b815260048101829052602481018590526044810184905260640161378b565b83830384820360008282106144e657826144e8565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b6060831561458257825160000361457b576001600160a01b0385163b61457b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161378b565b5081613cf9565b613cf983838151156145975781518083602001fd5b8060405162461bcd60e51b815260040161378b91906146d5565b828054828255906000526020600020908101928215614606579160200282015b8281111561460657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906145d1565b5061461292915061463d565b5090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115614612576000815560010161463e565b6001600160e01b0319811681146114c557600080fd5b60006020828403121561467a57600080fd5b813561395f81614652565b60005b838110156146a0578181015183820152602001614688565b50506000910152565b600081518084526146c1816020860160208601614685565b601f01601f19169290920160200192915050565b60208152600061395f60208301846146a9565b6000602082840312156146fa57600080fd5b5035919050565b6001600160a01b03811681146114c557600080fd5b6000806040838503121561472957600080fd5b823561473481614701565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561477a5761477a614742565b60405290565b604051606081016001600160401b038111828210171561477a5761477a614742565b604051601f8201601f191681016001600160401b03811182821017156147ca576147ca614742565b604052919050565b600082601f8301126147e357600080fd5b81356001600160401b038111156147fc576147fc614742565b61480f601f8201601f19166020016147a2565b81815284602083860101111561482457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561485757600080fd5b8435935060208501356001600160401b038082111561487557600080fd5b614881888389016147d2565b9450604087013591508082111561489757600080fd5b6148a3888389016147d2565b935060608701359150808211156148b957600080fd5b506148c6878288016147d2565b91505092959194509250565b6000602082840312156148e457600080fd5b81356001600160401b03808211156148fb57600080fd5b9083019060e0828603121561490f57600080fd5b614917614758565b82358281111561492657600080fd5b614932878286016147d2565b82525060208301358281111561494757600080fd5b614953878286016147d2565b60208301525060408301358281111561496b57600080fd5b614977878286016147d2565b60408301525060608301358281111561498f57600080fd5b61499b878286016147d2565b6060830152506080830135828111156149b357600080fd5b6149bf878286016147d2565b60808301525060a083013560a082015260c0830135828111156149e157600080fd5b6149ed878286016147d2565b60c08301525095945050505050565b600080600080600060808688031215614a1457600080fd5b8535614a1f81614701565b94506020860135614a2f81614701565b93506040860135925060608601356001600160401b0380821115614a5257600080fd5b818801915088601f830112614a6657600080fd5b813581811115614a7557600080fd5b896020828501011115614a8757600080fd5b9699959850939650602001949392505050565b8035801515811461114157600080fd5b60008060408385031215614abd57600080fd5b82359150614acd60208401614a9a565b90509250929050565b600080600060608486031215614aeb57600080fd5b8335614af681614701565b92506020840135614b0681614701565b929592945050506040919091013590565b60006001600160401b03821115614b3057614b30614742565b5060051b60200190565b60008060408385031215614b4d57600080fd5b823591506020808401356001600160401b03811115614b6b57600080fd5b8401601f81018613614b7c57600080fd5b8035614b8f614b8a82614b17565b6147a2565b81815260059190911b82018301908381019088831115614bae57600080fd5b928401925b82841015614bd357614bc484614a9a565b82529284019290840190614bb3565b80955050505050509250929050565b60e081526000614bf560e083018a6146a9565b8281036020840152614c07818a6146a9565b90508281036040840152614c1b81896146a9565b90508281036060840152614c2f81886146a9565b90508281036080840152614c4381876146a9565b90508460a084015282810360c0840152614c5d81856146a9565b9a9950505050505050505050565b600060208284031215614c7d57600080fd5b81356001600160401b03811115614c9357600080fd5b613cf9848285016147d2565b600060208284031215614cb157600080fd5b813561395f81614701565b60008060408385031215614ccf57600080fd5b823591506020808401356001600160401b0380821115614cee57600080fd5b818601915086601f830112614d0257600080fd5b8135614d10614b8a82614b17565b81815260059190911b83018401908481019089831115614d2f57600080fd5b8585015b83811015614de957803585811115614d4b5760008081fd5b86016060818d03601f1901811315614d635760008081fd5b614d6b614780565b8983013588811115614d7d5760008081fd5b614d8b8f8c838701016147d2565b825250604083013588811115614da15760008081fd5b614daf8f8c838701016147d2565b828c015250908201359087821115614dc75760008081fd5b614dd58e8b848601016147d2565b604082015285525050918601918601614d33565b508096505050505050509250929050565b60008060408385031215614e0d57600080fd5b8235915060208301356001600160401b03811115614e2a57600080fd5b614e36858286016147d2565b9150509250929050565b60008060408385031215614e5357600080fd5b50508035926020909101359150565b60008060408385031215614e7557600080fd5b8235614e8081614701565b9150614acd60208401614a9a565b60008060208385031215614ea157600080fd5b82356001600160401b0380821115614eb857600080fd5b818501915085601f830112614ecc57600080fd5b813581811115614edb57600080fd5b8660208260051b8501011115614ef057600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015614f5757603f19888603018452614f458583516146a9565b94509285019290850190600101614f29565b5092979650505050505050565b60008060408385031215614f7757600080fd5b82356001600160401b03811115614f8d57600080fd5b614f99858286016147d2565b95602094909401359450505050565b60008060008060808587031215614fbe57600080fd5b8435614fc981614701565b93506020850135614fd981614701565b92506040850135915060608501356001600160401b03811115614ffb57600080fd5b6148c6878288016147d2565b6000806000806080858703121561501d57600080fd5b843593506020850135925060408501356001600160401b038082111561489757600080fd5b6000806040838503121561505557600080fd5b823561506081614701565b9150602083013561507081614701565b809150509250929050565b600181811c9082168061508f57607f821691505b602082108103613e3757634e487b7160e01b600052602260045260246000fd5b601f8211156114ff57600081815260208120601f850160051c810160208610156150d65750805b601f850160051c820191505b81811015610edf578281556001016150e2565b81516001600160401b0381111561510e5761510e614742565b6151228161511c845461507b565b846150af565b602080601f831160018114615157576000841561513f5750858301515b600019600386901b1c1916600185901b178555610edf565b600085815260208120601f198616915b8281101561518657888601518255948401946001909101908401615167565b50858210156151a45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516151c6818460208801614685565b602360f81b90830190815283516151e4816001840160208801614685565b01600101949350505050565b85815260a06020820152600061520960a08301876146a9565b828103604084015261521b81876146a9565b9050828103606084015261522f81866146a9565b9050828103608084015261524381856146a9565b98975050505050505050565b60006020828403121561526157600080fd5b815161395f81614701565b634e487b7160e01b600052601160045260246000fd5b6000600182016152945761529461526c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156152f45784511515835293830193918301916001016152d6565b5090979650505050505050565b808201808211156108f2576108f261526c565b80820281158282048414176108f2576108f261526c565b818103818111156108f2576108f261526c565b634e487b7160e01b600052601260045260246000fd5b6000826153635761536361533e565b500690565b828152604060208201526000613cf960408301846146a9565b6000808335601e1984360301811261539857600080fd5b8301803591506001600160401b038211156153b257600080fd5b6020019150368190038213156153c757600080fd5b9250929050565b600082516153e0818460208701614685565b75076c4c2c6d6cee4deeadcc85ad2dac2ceca74eae4d8560531b920191825250601601919050565b600081546154158161507b565b6001828116801561542d576001811461544257615471565b60ff1984168752821515830287019450615471565b8560005260208060002060005b858110156154685781548a82015290840190820161544f565b50505082870194505b5050505092915050565b643230ba309d60d91b815260006154956005830185615408565b670ed8985cd94d8d0b60c21b815283516154b6816008840160208801614685565b6505258eae4d8560d31b60089290910191820152600e01949350505050565b643230ba309d60d91b815260006154ef6005830185615408565b670ed8985cd94d8d0b60c21b81528351615510816008840160208801614685565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b6261600892909101918201527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460288201527f2d706f736974696f6e3a63656e7465723b696d6167652d72656e646572696e6760488201527f3a2d7765626b69742d6f7074696d697a652d636f6e74726173743b2d6d732d6960688201527f6e746572706f6c6174696f6e2d6d6f64653a6e6561726573742d6e656967686260888201527f6f723b696d6167652d72656e646572696e673a2d6d6f7a2d63726973702d656460a88201527f6765733b696d6167652d72656e646572696e673a706978656c617465643b223e60c8820152651e17b9bb339f60d11b60e882015260ee01949350505050565b7919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b81526000825161566e81601a850160208701614685565b91909101601a0192915050565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600061569f600f830185615408565b6a1116113b30b63ab2911d1160a91b81526156bd600b820185615408565b61227d60f01b815260020195945050505050565b683d913730b6b2911d1160b91b8152600061395f6009830184615408565b602360f81b81526000835161570b816001850160208801614685565b701116113232b9b1b934b83a34b7b7111d1160791b6001918401918201526157366012820185615408565b61088b60f21b815260020195945050505050565b681134b6b0b3b2911d1160b91b815260006157686009830185615408565b8351615778818360208801614685565b01949350505050565b600080516020615e4983398151915281527f76696577426f783d223020302031323030203132303022207374796c653d226460208201527f6973706c61793a20626c6f636b3b207472616e73666f726d3a207363616c652860408201527f2d312c3129222076657273696f6e3d22312e322220786d6c6e733d226874747060608201527f3a2f2f7777772e77332e6f72672f323030302f737667223e3c696d616765207760808201527f696474683d223132303022206865696768743d22313230302220687265663d2260a0820152600082516158658160c0850160208701614685565b6f111f1e17b4b6b0b3b29f1e17b9bb339f60811b60c093909101928301525060d001919050565b711139bb33afb4b6b0b3b2afb230ba30911d1160711b815281516000906158ba816012850160208701614685565b61088b60f21b6012939091019283015250601401919050565b600080516020615e4983398151915281527f76696577426f783d2230203020313230302031323030222076657273696f6e3d60208201527f22312e322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3260408201527f3030302f737667223e3c696d6167652077696474683d2231323030222068656960608201527033b43a1e91189918181110343932b31e9160791b608082015260008251615985816091850160208701614685565b6f111f1e17b4b6b0b3b29f1e17b9bb339f60811b609193909101928301525060a101919050565b6d1134b6b0b3b2afb230ba30911d1160911b815281516000906159d681600e850160208701614685565b61088b60f21b600e939091019283015250601001919050565b6c1130ba3a3934b13aba32b9911d60991b81528151600090615a1881600d850160208701614685565b607d60f81b600d939091019283015250600e01919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251615a6881601d850160208701614685565b91909101601d0192915050565b848152836020820152608060408201526000615a9460808301856146a9565b8281036060840152615aa681856146a9565b979650505050505050565b683d913730b6b2911d1160b91b81526000615acf600983018a615408565b701116113232b9b1b934b83a34b7b7111d1160791b8152615af3601182018a615408565b6a11161134b6b0b3b2911d1160a91b81529050615b13600b820189615408565b6b1116113130b73732b9111d1160a11b81529050615b34600c820188615408565b7211161132bc3a32b93730b62fb634b735911d1160691b81529050615b5c6013820187615408565b7b11161139b2b63632b92fb332b2afb130b9b4b9afb837b4b73a39911d60211b81528551909150615b9481601c840160208901614685565b7116113332b2afb932b1b4b834b2b73a111d1160711b601c9290910191820152615bc1602e820185615408565b61227d60f01b81526002019a9950505050505050505050565b6000815260008251615bf3816001850160208701614685565b9190910160010192915050565b60ff81811683821602908116908181146129f8576129f861526c565b60ff82811682821603908111156108f2576108f261526c565b60ff81811683821601908111156108f2576108f261526c565b600060ff821660ff8103615c6457615c6461526c565b60010192915050565b600082615c7c57615c7c61533e565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614454908301846146a9565b600060208284031215615cc657600080fd5b815161395f81614652565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201528151600090615d1481600e850160208701614685565b91909101600e019392505050565b60008251615d34818460208701614685565b919091019291505056fe3c7376672077696474683d223136303022206865696768743d2231363030222076696577426f783d2230203020313630302031363030222076657273696f6e3d22312e322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207374796c653d226261636b67726f756e642d636f6c6f723a20234142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef3c7376672077696474683d223130302522206865696768743d22313030252220a26469706673582212208bc6f5a3bf8014a7e6bd8281c6c9c9c5e66a8c82657506e82a754a87b363617e64736f6c634300081100334f6e2d436861696e20416c706861206973206120636f6c6c656374696f6e206f66203737373720637573746f6d697a61626c65206469676974616c206964656e7469747920746f6b656e732073746f72656420656e746972656c79206f6e2074686520457468657265756d20626c6f636b636861696e2e20546f6b656e20686f6c646572732063616e2076697369742068747470733a2f2f6f63612e676720746f20656e61626c652f64697361626c65206578697374696e67207472616974732c206368616e6765206261636b67726f756e6420636f6c6f722c20666c69702074686520696d6167652c20656e61626c652054776974746572206865782c20616e64206d6f72652061732077656c6c2061732072657665616c206e65772074726169742064726f707320746f2062652072656c656173656420696e20746865206675747572652e68747470733a2f2f7374617469632e666c6f6f7265644170652e696f2f6f63612f68747470733a2f2f697066732e696f2f697066732f516d646271374e35697a72617a6f59636277537578636d73326442656d78757862724c61467477326475666456362f62616e6e65722e706e6730783935373335364639343132383330633939324434363546463843446239623041413032333032306268747470733a2f2f697066732e696f2f697066732f516d646271374e35697a72617a6f59636277537578636d73326442656d78757862724c61467477326475666456362f636f6c6c656374696f6e2e676966

Deployed Bytecode

0x6080604052600436106102395760003560e01c806301ffc9a71461023e57806306fdde0314610273578063081812fc14610295578063095ea7b3146102cd5780630ea71cfc146102ef5780630f3debbe1461030f578063150b7a021461032f57806318160ddd1461036857806319c841fd1461038b57806323b872dd146103ab5780632437013d146103cb5780632d6b6224146103eb5780632db11544146104055780633cca2420146104185780633ccfd60b146104405780634047638d1461045557806342842e0e1461046a57806355f804b31461048a5780635b92ac0d146104aa578063621a1f74146104bf5780636352211e146104df578063673cd60d146104ff5780636817c76c1461051f5780636c0360eb1461053557806370a082311461054a578063715018a61461056a578063716e43d71461057f5780637a75353a1461059f5780638da5cb5b146105bf57806395d89b41146105d457806397e2155d146105e9578063a22cb46514610609578063a78c8a7a14610629578063ac9650d81461063f578063ad9adfe31461066c578063b88d4fde1461068c578063b9e6cfad146106ac578063bc74dae6146106cc578063c406ec72146106fc578063c87b56dd1461071c578063d5abeb011461073c578063dbe9875f14610752578063dd21bb7d14610772578063e488627314610792578063e8a3d485146107b2578063e985e9c5146107c7578063f2f0dc0514610810578063f2fde38b14610846578063fb38d21114610866578063fd6b3cf514610886575b600080fd5b34801561024a57600080fd5b5061025e610259366004614668565b6108a6565b60405190151581526020015b60405180910390f35b34801561027f57600080fd5b506102886108f8565b60405161026a91906146d5565b3480156102a157600080fd5b506102b56102b03660046146e8565b61098a565b6040516001600160a01b03909116815260200161026a565b3480156102d957600080fd5b506102ed6102e8366004614716565b6109ce565b005b3480156102fb57600080fd5b506102ed61030a366004614841565b610a6e565b34801561031b57600080fd5b506102ed61032a3660046148d2565b610b6b565b34801561033b57600080fd5b5061034f61034a3660046149fc565b610bff565b6040516001600160e01b0319909116815260200161026a565b34801561037457600080fd5b50600154600054035b60405190815260200161026a565b34801561039757600080fd5b506102ed6103a6366004614aaa565b610cd4565b3480156103b757600080fd5b506102ed6103c6366004614ad6565b610d54565b3480156103d757600080fd5b506102ed6103e6366004614b3a565b610ee7565b3480156103f757600080fd5b50602a5461025e9060ff1681565b61037d6104133660046146e8565b610fa2565b34801561042457600080fd5b5061042d611146565b60405161026a9796959493929190614be2565b34801561044c57600080fd5b506102ed6114a4565b34801561046157600080fd5b506102ed6114c8565b34801561047657600080fd5b506102ed610485366004614ad6565b6114e4565b34801561049657600080fd5b506102ed6104a5366004614c6b565b611504565b3480156104b657600080fd5b5061025e61151c565b3480156104cb57600080fd5b506102886104da3660046146e8565b61153e565b3480156104eb57600080fd5b506102b56104fa3660046146e8565b6124d6565b34801561050b57600080fd5b506025546102b5906001600160a01b031681565b34801561052b57600080fd5b5061037d60275481565b34801561054157600080fd5b506102886124e1565b34801561055657600080fd5b5061037d610565366004614c9f565b61256f565b34801561057657600080fd5b506102ed6125bd565b34801561058b57600080fd5b506102ed61059a366004614cbc565b6125d1565b3480156105ab57600080fd5b506102ed6105ba366004614dfa565b612766565b3480156105cb57600080fd5b506102b56127cd565b3480156105e057600080fd5b506102886127dc565b3480156105f557600080fd5b506102ed610604366004614e40565b6127eb565b34801561061557600080fd5b506102ed610624366004614e62565b612876565b34801561063557600080fd5b5061037d60285481565b34801561064b57600080fd5b5061065f61065a366004614e8e565b61290b565b60405161026a9190614f02565b34801561067857600080fd5b50610288610687366004614f64565b6129ff565b34801561069857600080fd5b506102ed6106a7366004614fa8565b612d57565b3480156106b857600080fd5b506102886106c7366004614f64565b612d9b565b3480156106d857600080fd5b5061025e6106e73660046146e8565b60009081526013602052604090205460ff1690565b34801561070857600080fd5b506026546102b5906001600160a01b031681565b34801561072857600080fd5b506102886107373660046146e8565b6131c5565b34801561074857600080fd5b5061037d611e6181565b34801561075e57600080fd5b506102ed61076d366004614aaa565b613475565b34801561077e57600080fd5b5061037d61078d3660046146e8565b6134bb565b34801561079e57600080fd5b506102ed6107ad366004615007565b6135da565b3480156107be57600080fd5b506102886136c4565b3480156107d357600080fd5b5061025e6107e2366004615042565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081c57600080fd5b5061037d61082b366004614c9f565b6001600160a01b031660009081526012602052604090205490565b34801561085257600080fd5b506102ed610861366004614c9f565b613722565b34801561087257600080fd5b506102ed610881366004614dfa565b61379d565b34801561089257600080fd5b506102ed6108a1366004614e40565b6137cf565b60006301ffc9a760e01b6001600160e01b0319831614806108d757506380ac58cd60e01b6001600160e01b03198316145b806108f25750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546109079061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546109339061507b565b80156109805780601f1061095557610100808354040283529160200191610980565b820191906000526020600020905b81548152906001019060200180831161096357829003601f168201915b5050505050905090565b60006109958261383e565b6109b2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109d9826124d6565b9050336001600160a01b03821614610a12576109f581336107e2565b610a12576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b33610a78856124d6565b6001600160a01b031614610a8b57600080fd5b6000848152601060205260409020610aa384826150f5565b506000848152601060205260409020600101610abf83826150f5565b506000848152601060205260409020600201610adb82826150f5565b50600083610ae886613865565b604051602001610af99291906151b4565b60408051601f198184030181529181526000878152601060205220909150600301610b2482826150f5565b507fb8981c9fcfec39b56f5caf88846acca9b61e75401e68da165ef541e81991d8b68585858585604051610b5c9594939291906151f0565b60405180910390a15050505050565b610b736138b4565b80518190602b908190610b8690826150f5565b5060208201516001820190610b9b90826150f5565b5060408201516002820190610bb090826150f5565b5060608201516003820190610bc590826150f5565b5060808201516004820190610bda90826150f5565b5060a0820151600582015560c08201516006820190610bf990826150f5565b50505050565b6026546000906001600160a01b0316331480610c9057506026546040516331a9108f60e11b8152600481018690526001600160a01b03878116921690636352211e90602401602060405180830381865afa158015610c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c85919061524f565b6001600160a01b0316145b610c9957600080fd5b6001600160a01b0385166000908152601260205260408120805491610cbd83615282565b90915550630a85bd0160e11b979650505050505050565b610cdd826124d6565b6001600160a01b0316336001600160a01b031614610cfa57600080fd5b6000828152600f6020908152604091829020805460ff19168415159081179091558251858152918201527fafec4b400a28d8bdfacc6b65e3c25cc07399c2c20eeb817256f6413c7e84687c91015b60405180910390a15050565b6000610d5f82613913565b9050836001600160a01b0316816001600160a01b031614610d925760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ddf57610dc286336107e2565b610ddf57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610e0657604051633a954ecd60e21b815260040160405180910390fd5b8015610e1157600082555b6001600160a01b03808716600090815260056020526040808220805460001901905591871681522080546001019055610e5a85610e4f888287613981565b600160e11b176139a4565b600085815260046020526040812091909155600160e11b84169003610eaf57600184016000818152600460205260408120549003610ead576000548114610ead5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b0316600080516020615e2983398151915260405160405180910390a45b505050505050565b610ef0826124d6565b6001600160a01b0316336001600160a01b031614610f0d57600080fd5b60005b600f811015610f7057818181518110610f2b57610f2b61529b565b6020908102919091018101516000858152600d8352604080822085835290935291909120805460ff191691151591909117905580610f6881615282565b915050610f10565b507f6feffc52172e0d2f7273caf08349169b161ca5e8e463fa548b2dc2258c54cce38282604051610d489291906152b1565b6000610fac6139b9565b610fb461151c565b610fbd57600080fd5b600080543382526014602052604090912054606490610fdd908590615301565b1115610fe857600080fd5b600a8311158015610ff95750600083115b61100257600080fd5b611e6161100f8483615301565b111561101a57600080fd5b33321461102657600080fd5b3360009081526012602052604081205480156110ec5784811161108d57806028546110519190615314565b915081602754866110629190615314565b61106c919061532b565b34101561107857600080fd5b33600090815260126020526040812055611105565b8460285461109b9190615314565b915081602754866110ac9190615314565b6110b6919061532b565b3410156110c257600080fd5b33600090815260126020526040812080548792906110e190849061532b565b909155506111059050565b6027546110f99086615314565b34101561110557600080fd5b3360009081526014602052604081208054879290611124908490615301565b9091555061113490503386613a12565b5050600160085592915050565b919050565b602b805481906111559061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546111819061507b565b80156111ce5780601f106111a3576101008083540402835291602001916111ce565b820191906000526020600020905b8154815290600101906020018083116111b157829003601f168201915b5050505050908060010180546111e39061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461120f9061507b565b801561125c5780601f106112315761010080835404028352916020019161125c565b820191906000526020600020905b81548152906001019060200180831161123f57829003601f168201915b5050505050908060020180546112719061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461129d9061507b565b80156112ea5780601f106112bf576101008083540402835291602001916112ea565b820191906000526020600020905b8154815290600101906020018083116112cd57829003601f168201915b5050505050908060030180546112ff9061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461132b9061507b565b80156113785780601f1061134d57610100808354040283529160200191611378565b820191906000526020600020905b81548152906001019060200180831161135b57829003601f168201915b50505050509080600401805461138d9061507b565b80601f01602080910402602001604051908101604052809291908181526020018280546113b99061507b565b80156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b5050505050908060050154908060060180546114219061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461144d9061507b565b801561149a5780601f1061146f5761010080835404028352916020019161149a565b820191906000526020600020905b81548152906001019060200180831161147d57829003601f168201915b5050505050905087565b47806114af57600080fd5b6032546114c5906001600160a01b031682613aef565b50565b6114d06138b4565b602a805460ff19811660ff90911615179055565b6114ff83838360405180602001604052806000815250612d57565b505050565b61150c6138b4565b602961151882826150f5565b5050565b6000611e6161152a60005490565b1080156115395750602a5460ff165b905090565b60606115498261383e565b61155257600080fd5b6000611568611563600f6004615314565b613c05565b60408051600f808252610200820190925291925060009190602082016101e08036833701905050905060005b600f8110156123a55760008282815181106115b1576115b161529b565b6020026020010151905060006002836115ca9190615354565b1180156115f157506000868152600e6020908152604080832085845290915290205460ff16155b1561163a576001601583600f811061160b5761160b61529b565b0154611617919061532b565b8383815181106116295761162961529b565b602002602001018181525050612392565b600061164587613c22565b6060015162ffffff1690506000611e6182896116618782615301565b60408051602081019490945283019190915260608201526080016040516020818303038152906040528051906020012060001c61169e9190615354565b90506116aa8185613c3b565b9250828585815181106116bf576116bf61529b565b60200260200101818152505060006001601586600f81106116e2576116e261529b565b01546116ee919061532b565b60008a8152600d6020908152604080832089845290915290205490915060ff161515600103611f8a5784600a14801561174057508585815181106117345761173461529b565b6020026020010151600a145b156117b257808686815181106117585761175861529b565b60209081029190910181019190915260008a8152600d82526040808220600283529092529081205460ff16151590036117ad57600f866002815181106117a0576117a061529b565b6020026020010181815250505b61238e565b84600e1480156117db57508585815181106117cf576117cf61529b565b60200260200101516000145b1561183b57808686815181106117f3576117f361529b565b60209081029190910181019190915260008a8152600d82526040808220600883529092529081205460ff16151590036117ad576005866008815181106117a0576117a061529b565b84600e14801561186457508585815181106118585761185861529b565b60200260200101516002145b15611954578086868151811061187c5761187c61529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff16151590036118d157600186600a815181106118c4576118c461529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036119195760008660088151811061190c5761190c61529b565b6020026020010181815250505b6000898152600d602090815260408083206004845290915281205460ff16151590036117ad576001866004815181106117a0576117a061529b565b84600e14801561197d57508585815181106119715761197161529b565b60200260200101516004145b15611a2557808686815181106119955761199561529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff16151590036119ea57600886600a815181106119dd576119dd61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576009866008815181106117a0576117a061529b565b84600e148015611a4e5750858581518110611a4257611a4261529b565b60200260200101516005145b15611af65780868681518110611a6657611a6661529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611abb57600686600a81518110611aae57611aae61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576007866008815181106117a0576117a061529b565b84600e148015611b1f5750858581518110611b1357611b1361529b565b60200260200101516006145b15611c335780868681518110611b3757611b3761529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611b8c57600786600a81518110611b7f57611b7f61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff1615159003611bd457600886600881518110611bc757611bc761529b565b6020026020010181815250505b85600681518110611be757611be761529b565b60200260200101516008148015611c1957506000898152600d602090815260408083206006845290915290205460ff16155b156117ad576013866006815181106117a0576117a061529b565b84600e148015611c5c5750858581518110611c5057611c5061529b565b60200260200101516007145b15611d045780868681518110611c7457611c7461529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611cc957600286600a81518110611cbc57611cbc61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576004866008815181106117a0576117a061529b565b84600e148015611d2d5750858581518110611d2157611d2161529b565b60200260200101516009145b15611dd55780868681518110611d4557611d4561529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611d9a57600586600a81518110611d8d57611d8d61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576001866008815181106117a0576117a061529b565b84600e148015611dfe5750858581518110611df257611df261529b565b6020026020010151600a145b15611ea65780868681518110611e1657611e1661529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611e6b57600486600a81518110611e5e57611e5e61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576002866008815181106117a0576117a061529b565b84600e148015611ecf5750858581518110611ec357611ec361529b565b6020026020010151600b145b15611f775780868681518110611ee757611ee761529b565b60209081029190910181019190915260008a8152600d82526040808220600a83529092529081205460ff1615159003611f3c57600386600a81518110611f2f57611f2f61529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff16151590036117ad576003866008815181106117a0576117a061529b565b808686815181106117a0576117a061529b565b85600a81518110611f9d57611f9d61529b565b6020026020010151600a03611ff4576000898152600d602090815260408083206002845290915281205460ff1615159003611ff457600f86600281518110611fe757611fe761529b565b6020026020010181815250505b85600e815181106120075761200761529b565b6020026020010151600003612051576000898152600d602090815260408083206008845290915281205460ff16151590036117ad576005866008815181106117a0576117a061529b565b85600e815181106120645761206461529b565b60200260200101516002036120ae576000898152600d60209081526040808320600a845290915281205460ff16151590036118d157600186600a815181106118c4576118c461529b565b85600e815181106120c1576120c161529b565b602002602001015160040361210b576000898152600d60209081526040808320600a845290915281205460ff16151590036119ea57600886600a815181106119dd576119dd61529b565b85600e8151811061211e5761211e61529b565b6020026020010151600503612168576000898152600d60209081526040808320600a845290915281205460ff1615159003611abb57600686600a81518110611aae57611aae61529b565b85600e8151811061217b5761217b61529b565b60200260200101516006036121c5576000898152600d60209081526040808320600a845290915281205460ff1615159003611b8c57600786600a81518110611b7f57611b7f61529b565b85600e815181106121d8576121d861529b565b6020026020010151600703612222576000898152600d60209081526040808320600a845290915281205460ff1615159003611cc957600286600a81518110611cbc57611cbc61529b565b85600e815181106122355761223561529b565b602002602001015160090361227f576000898152600d60209081526040808320600a845290915281205460ff1615159003611d9a57600586600a81518110611d8d57611d8d61529b565b85600e815181106122925761229261529b565b6020026020010151600a036122dc576000898152600d60209081526040808320600a845290915281205460ff1615159003611e6b57600486600a81518110611e5e57611e5e61529b565b85600e815181106122ef576122ef61529b565b6020026020010151600b0361238e576000898152600d60209081526040808320600a845290915281205460ff161515900361234657600386600a815181106123395761233961529b565b6020026020010181815250505b6000898152600d602090815260408083206008845290915281205460ff161515900361238e576003866008815181106123815761238161529b565b6020026020010181815250505b5050505b508061239d81615282565b915050611594565b5060005b81518110156124cd57600a8282815181106123c6576123c661529b565b602002602001015110156123fd57604080518082019091526002815261030360f41b60208201526123f8908490613d01565b612442565b60648282815181106124115761241161529b565b60200260200101511015612442576040805180820190915260018152600360fc1b6020820152612442908490613d01565b6103e78282815181106124575761245761529b565b6020026020010151111561248f5760408051808201909152600381526239393960e81b602082015261248a908490613d01565b6124bb565b6124bb6124b48383815181106124a7576124a761529b565b6020026020010151613865565b8490613d01565b806124c581615282565b9150506123a9565b50909392505050565b60006108f282613913565b602980546124ee9061507b565b80601f016020809104026020016040519081016040528092919081815260200182805461251a9061507b565b80156125675780601f1061253c57610100808354040283529160200191612567565b820191906000526020600020905b81548152906001019060200180831161254a57829003601f168201915b505050505081565b60006001600160a01b038216612598576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6125c56138b4565b6125cf6000613d86565b565b6125d96138b4565b8051601583600f81106125ee576125ee61529b565b0154146125fa57600080fd5b600081516001600160401b0381111561261557612615614742565b60405190808252806020026020018201604052801561263e578160200160208202803683370190505b50905060005b8251811015612746576126738382815181106126625761266261529b565b602002602001015160400151613dd8565b8282815181106126855761268561529b565b60200260200101906001600160a01b031690816001600160a01b03168152505060405180604001604052808483815181106126c2576126c261529b565b60200260200101516000015181526020018483815181106126e5576126e561529b565b6020908102919091018101518101519091526000868152600b82526040808220858352909252208151819061271a90826150f5565b506020820151600182019061272f90826150f5565b50905050808061273e90615282565b915050612644565b506000838152600a602090815260409091208251610bf9928401906145b1565b33612770836124d6565b6001600160a01b03161461278357600080fd5b600082815260116020526040902061279b82826150f5565b507f81b1bf653f53dc046b08a20dc605eed2195235db792f342a6a722e1b5480f9548282604051610d48929190615368565b6009546001600160a01b031690565b6060600380546109079061507b565b600f81106127f857600080fd5b612801826124d6565b6001600160a01b0316336001600160a01b03161461281e57600080fd5b6000828152600e60209081526040808320848452825291829020805460ff1916600117905581518481529081018390527f4c652a0da724e2e441d4269d925eb66c004118aea8f9d00f7cfd6c906f908d229101610d48565b336001600160a01b0383160361289f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060816001600160401b0381111561292557612925614742565b60405190808252806020026020018201604052801561295857816020015b60608152602001906001900390816129435790505b50905060005b828110156129f8576129c83085858481811061297c5761297c61529b565b905060200281019061298e9190615381565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e3d92505050565b8282815181106129da576129da61529b565b602002602001018190525080806129f090615282565b91505061295e565b5092915050565b60606000806040518060400160405280600681526020016531433135333160d01b81525090506000601160008681526020019081526020016000208054612a459061507b565b90501115612ae75760008481526011602052604090208054612a669061507b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a929061507b565b8015612adf5780601f10612ab457610100808354040283529160200191612adf565b820191906000526020600020905b815481529060010190602001808311612ac257829003601f168201915b505050505090505b6000612af562020000613c05565b9050612b1a6040518060c0016040528060838152602001615d3f608391398290613d01565b612b4582604051602001612b2e91906153ce565b60408051601f198184030181529190528290613d01565b60005b612b546001600f61532b565b811015612c77576000612b68600283615354565b118015612b8f57506000868152600e6020908152604080832084845290915290205460ff16155b612c6557612bc5612bc088612ba5846003615314565b612bb0856003615314565b612bbb906003615301565b613e62565b613f2e565b60ff169350612c65600b60008381526020019081526020016000206000868152602001908152602001600020600101612c3d612c38600a60008681526020019081526020016000208881548110612c1e57612c1e61529b565b6000918252602090912001546001600160a01b0316613fe4565b613ff4565b604051602001612c4e92919061547b565b60408051601f198184030181529190528390613d01565b80612c6f81615282565b915050612b48565b50612ca2612bc0876003612c8c600f82615314565b612c96919061532b565b612bbb600f6003615314565b60ff169250612d24600b6000612cba6001600f61532b565b81526020019081526020016000206000858152602001908152602001600020600101612d13612c38600a60006001600f612cf4919061532b565b81526020019081526020016000208781548110612c1e57612c1e61529b565b604051602001612b2e9291906154d5565b612d2d81613ff4565b604051602001612d3d9190615639565b604051602081830303815290604052935050505092915050565b612d62848484610d54565b6001600160a01b0383163b15610bf957612d7e84848484614146565b610bf9576040516368d2bf6b60e11b815260040160405180910390fd5b60606000612dab62020000613c05565b9050612dd9604051806040016040528060018152602001605b60f81b81525082613d0190919063ffffffff16565b60005b600f8110156131bd576000612e04612bc087612df9856003615314565b612bb0866003615314565b6000838152600b6020908152604080832060ff949094168084529390915290208054919250600291612e359061507b565b905011156131aa57612e9b60248381548110612e5357612e5361529b565b60009182526020808320868452600b825260408085208786528352938490209351612e84949390910192910161567b565b60408051601f198184030181529190528490613d01565b81600a148015612f8057506000858152600d60209081526040808320600b845290915290205460ff1680612eea57506000858152600e60209081526040808320600b845290915290205460ff16155b8015612f1057506000858152600d60209081526040808320600c845290915290205460ff165b8015612f5a57506000858152600d6020818152604080842092845291905290205460ff1680612f5a57506000858152600e60209081526040808320600d845290915290205460ff16155b8015612f8057506000858152600d60209081526040808320600e845290915290205460ff165b15612fad576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b6131aa565b81600b14801561304657506000858152600d60209081526040808320600c845290915290205460ff16801561302057506000858152600d6020818152604080842092845291905290205460ff168061302057506000858152600e60209081526040808320600d845290915290205460ff16155b801561304657506000858152600d60209081526040808320600e845290915290205460ff165b1561306e576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b81600c1480156130e257506000858152600d6020818152604080842092845291905290205460ff16806130bc57506000858152600e60209081526040808320600d845290915290205460ff16155b80156130e257506000858152600d60209081526040808320600e845290915290205460ff165b1561310a576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b81600d14801561313457506000858152600d60209081526040808320600e845290915290205460ff165b1561315c576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b81600e03613187576040805180820190915260018152605d60f81b6020820152612fa8908490613d01565b6040805180820190915260018152600b60fa1b60208201526131aa908490613d01565b50806131b581615282565b915050612ddc565b509392505050565b60606131d08261383e565b6131d957600080fd5b60008052600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35461320d57600080fd5b60006132188361153e565b9050600061322862020000613c05565b6000858152601060205260408120805492935090916132469061507b565b9050111561327757600084815260106020908152604091829020915161327292612b2e929091016156d1565b6132ae565b6040805180820190915260158152747b226e616d65223a224f6e436861696e416c70686160581b60208201526132ae908290613d01565b6132cd6132ba85613865565b604051612b2e9190602c906020016156ef565b6000602980546132dc9061507b565b90501180156132f957506000848152600c602052604090205460ff165b156133225761331d602961330c86613865565b604051602001612b2e92919061574a565b613427565b60408051602080820183526000808352878152600f909152919091205460ff16156133b857600061335384876129ff565b905061337d816040516020016133699190615781565b604051602081830303815290604052613ff4565b60405160200161338d9190615639565b60405160208183030381529060405291506133b281604051602001612e84919061588c565b50613411565b60006133c484876129ff565b90506133da8160405160200161336991906158d3565b6040516020016133ea9190615639565b604051602081830303815290604052915061340f81604051602001612e84919061588c565b505b61342581604051602001612c4e91906159ac565b505b6134446134348386612d9b565b604051602001612b2e91906159ef565b61344d81613ff4565b60405160200161345d9190615a30565b60405160208183030381529060405292505050919050565b61347e826124d6565b6001600160a01b0316336001600160a01b03161461349b57600080fd5b6000918252600c6020526040909120805460ff1916911515919091179055565b60006134c56139b9565b6134cd61151c565b6134d657600080fd5b6000546103e88311156134e857600080fd5b60008381526013602052604090205460ff161561350457600080fd5b6026546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e90602401602060405180830381865afa15801561354d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613571919061524f565b6001600160a01b0316336001600160a01b03161461358e57600080fd5b611e6161359c826001615301565b11156135a757600080fd5b6000838152601360205260409020805460ff191660019081179091556135ce903390613a12565b90506111416001600855565b6135e3846124d6565b6001600160a01b0316336001600160a01b03161461360057600080fd5b600084815260106020526040902060060154808410613641576000858152601060205260408120600601805492955085929161363b83615282565b91905055505b6000858152601060209081526040808320878452600401909152902061366784826150f5565b506000858152601060209081526040808320878452600501909152902061368e83826150f5565b507fca3ccd3f553ac426b514af81e9a960872e7c86a7a0260f8e8b244ce916776e7285858585604051610b5c9493929190615a75565b6030546060906136fe90602b90602c90602d90602e90602f906136e690613865565b60405161336996959493929190603190602001615ab1565b60405160200161370e9190615a30565b604051602081830303815290604052905090565b61372a6138b4565b6001600160a01b0381166137945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6114c581613d86565b6137a56138b4565b80602483815481106137b9576137b961529b565b9060005260206000200190816114ff91906150f5565b6025546001600160a01b031633146137e657600080fd5b60008183116137f557816137f7565b825b905061380281614231565b613815613810826001615301565b61383e565b1561382d5761382d613828826001615301565b614231565b6114ff81613839614261565b6142cd565b60008054821080156108f2575050600090815260046020526040902054600160e01b161590565b604080516080810191829052607f0190826030600a8206018353600a90045b80156138a257600183039250600a81066030018353600a9004613884565b50819003601f19909101908152919050565b336138bd6127cd565b6001600160a01b0316146125cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161378b565b6000816000548110156139685760008181526004602052604081205490600160e01b82169003613966575b8060000361395f57506000190160008181526004602052604090205461393e565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600060e882811c90613994868684614322565b62ffffff16901b95945050505050565b4260a01b176001600160a01b03919091161790565b600260085403613a0b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161378b565b6002600855565b6000546001600160a01b038316613a3b57604051622e076360e81b815260040160405180910390fd5b81600003613a5c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600090815260056020526040812080546001600160401b018502019055613aa1908490613a94908281613981565b6001851460e11b176139a4565b600082815260046020526040902055808281015b6040516001830192906001600160a01b03871690600090600080516020615e29833981519152908290a4808210613ab55760005550505050565b80471015613b3f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161378b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b50509050806114ff5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b606482015260840161378b565b604080518281016060018252910181526000602090910190815290565b613c2a614616565b6108f2613c3683613913565b614341565b600080805b601584600f8110613c5357613c5361529b565b0154811015613cd7576000601585600f8110613c7157613c7161529b565b018281548110613c8357613c8361529b565b90600052602060002001549050828610158015613ca85750613ca58184615301565b86105b15613cb7575091506108f29050565b613cc18184615301565b9250508080613ccf90615282565b915050613c40565b506001601584600f8110613ced57613ced61529b565b0154613cf9919061532b565b949350505050565b601f1982015182518251603f19909201918290613d1e9083615301565b1115613d7c5760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b606482015260840161378b565b610bf98484614384565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080613e0383604051602001613def9190615bda565b6040516020818303038152906040526143ba565b90508051602082016000f091506001600160a01b038216613e375760405163046a55db60e11b815260040160405180910390fd5b50919050565b606061395f8383604051806060016040528060278152602001615e02602791396143e6565b6060836000613e71858561532b565b6001600160401b03811115613e8857613e88614742565b6040519080825280601f01601f191660200182016040528015613eb2576020820181803683370190505b509050845b84811015613f2457828181518110613ed157613ed161529b565b01602001516001600160f81b03191682613eeb888461532b565b81518110613efb57613efb61529b565b60200101906001600160f81b031916908160001a90535080613f1c81615282565b915050613eb7565b5095945050505050565b60008181805b82518160ff1610156131bd576030838260ff1681518110613f5757613f5761529b565b016020015160f81c10801590613f8a57506039838260ff1681518110613f7f57613f7f61529b565b016020015160f81c11155b15613fd257613f9a600a83615c00565b91506030838260ff1681518110613fb357613fb361529b565b0160200151613fc5919060f81c615c1c565b613fcf9083615c35565b91505b80613fdc81615c4e565b915050613f34565b60606108f282600160001961445e565b6060815160000361401357505060408051602081019091526000815290565b6000604051806060016040528060408152602001615dc260409139905060006003845160026140429190615301565b61404c9190615c6d565b614057906004615314565b6001600160401b0381111561406e5761406e614742565b6040519080825280601f01601f191660200182016040528015614098576020820181803683370190505b509050600182016020820185865187015b80821015614104576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506140a9565b505060038651066001811461412057600281146141335761413b565b603d6001830353603d600283035361413b565b603d60018303535b509195945050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061417b903390899088908890600401615c81565b6020604051808303816000875af19250505080156141b6575060408051601f3d908101601f191682019092526141b391810190615cb4565b60015b614214573d8080156141e4576040519150601f19603f3d011682016040523d82523d6000602084013e6141e9565b606091505b50805160000361420c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60008181526004602052604081205490036114c55761424f81613913565b60008281526004602052604090205550565b6000803a43424461427360018461532b565b6040805160208101969096528501939093526060808501929092526080840152904060a083015233901b6001600160601b03191660c082015260d40160408051601f19818403018152919052805160209091012092915050565b600082815260046020526040812054908190036142fc5760405162d5815360e01b815260040160405180910390fd5b6000928352600460205260409092206001600160e81b039290921660e89190911b179055565b60006001600160a01b038416156143395781613cf9565b613cf9614261565b614349614616565b6001600160a01b03821681526001600160401b0360a083901c166020820152600160e01b82161515604082015260e89190911c606082015290565b8051602082019150808201602084510184015b818410156143af578351815260209384019301614397565b505082510190915250565b60608151826040516020016143d0929190615cd1565b6040516020818303038152906040529050919050565b6060600080856001600160a01b0316856040516144039190615d22565b600060405180830381855af49150503d806000811461443e576040519150601f19603f3d011682016040523d82523d6000602084013e614443565b606091505b509150915061445486838387614513565b9695505050505050565b6060833b600081900361448157505060408051602081019091526000815261395f565b8084111561449f57505060408051602081019091526000815261395f565b838310156144d15760405163162544fd60e11b815260048101829052602481018590526044810184905260640161378b565b83830384820360008282106144e657826144e8565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b6060831561458257825160000361457b576001600160a01b0385163b61457b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161378b565b5081613cf9565b613cf983838151156145975781518083602001fd5b8060405162461bcd60e51b815260040161378b91906146d5565b828054828255906000526020600020908101928215614606579160200282015b8281111561460657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906145d1565b5061461292915061463d565b5090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115614612576000815560010161463e565b6001600160e01b0319811681146114c557600080fd5b60006020828403121561467a57600080fd5b813561395f81614652565b60005b838110156146a0578181015183820152602001614688565b50506000910152565b600081518084526146c1816020860160208601614685565b601f01601f19169290920160200192915050565b60208152600061395f60208301846146a9565b6000602082840312156146fa57600080fd5b5035919050565b6001600160a01b03811681146114c557600080fd5b6000806040838503121561472957600080fd5b823561473481614701565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561477a5761477a614742565b60405290565b604051606081016001600160401b038111828210171561477a5761477a614742565b604051601f8201601f191681016001600160401b03811182821017156147ca576147ca614742565b604052919050565b600082601f8301126147e357600080fd5b81356001600160401b038111156147fc576147fc614742565b61480f601f8201601f19166020016147a2565b81815284602083860101111561482457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561485757600080fd5b8435935060208501356001600160401b038082111561487557600080fd5b614881888389016147d2565b9450604087013591508082111561489757600080fd5b6148a3888389016147d2565b935060608701359150808211156148b957600080fd5b506148c6878288016147d2565b91505092959194509250565b6000602082840312156148e457600080fd5b81356001600160401b03808211156148fb57600080fd5b9083019060e0828603121561490f57600080fd5b614917614758565b82358281111561492657600080fd5b614932878286016147d2565b82525060208301358281111561494757600080fd5b614953878286016147d2565b60208301525060408301358281111561496b57600080fd5b614977878286016147d2565b60408301525060608301358281111561498f57600080fd5b61499b878286016147d2565b6060830152506080830135828111156149b357600080fd5b6149bf878286016147d2565b60808301525060a083013560a082015260c0830135828111156149e157600080fd5b6149ed878286016147d2565b60c08301525095945050505050565b600080600080600060808688031215614a1457600080fd5b8535614a1f81614701565b94506020860135614a2f81614701565b93506040860135925060608601356001600160401b0380821115614a5257600080fd5b818801915088601f830112614a6657600080fd5b813581811115614a7557600080fd5b896020828501011115614a8757600080fd5b9699959850939650602001949392505050565b8035801515811461114157600080fd5b60008060408385031215614abd57600080fd5b82359150614acd60208401614a9a565b90509250929050565b600080600060608486031215614aeb57600080fd5b8335614af681614701565b92506020840135614b0681614701565b929592945050506040919091013590565b60006001600160401b03821115614b3057614b30614742565b5060051b60200190565b60008060408385031215614b4d57600080fd5b823591506020808401356001600160401b03811115614b6b57600080fd5b8401601f81018613614b7c57600080fd5b8035614b8f614b8a82614b17565b6147a2565b81815260059190911b82018301908381019088831115614bae57600080fd5b928401925b82841015614bd357614bc484614a9a565b82529284019290840190614bb3565b80955050505050509250929050565b60e081526000614bf560e083018a6146a9565b8281036020840152614c07818a6146a9565b90508281036040840152614c1b81896146a9565b90508281036060840152614c2f81886146a9565b90508281036080840152614c4381876146a9565b90508460a084015282810360c0840152614c5d81856146a9565b9a9950505050505050505050565b600060208284031215614c7d57600080fd5b81356001600160401b03811115614c9357600080fd5b613cf9848285016147d2565b600060208284031215614cb157600080fd5b813561395f81614701565b60008060408385031215614ccf57600080fd5b823591506020808401356001600160401b0380821115614cee57600080fd5b818601915086601f830112614d0257600080fd5b8135614d10614b8a82614b17565b81815260059190911b83018401908481019089831115614d2f57600080fd5b8585015b83811015614de957803585811115614d4b5760008081fd5b86016060818d03601f1901811315614d635760008081fd5b614d6b614780565b8983013588811115614d7d5760008081fd5b614d8b8f8c838701016147d2565b825250604083013588811115614da15760008081fd5b614daf8f8c838701016147d2565b828c015250908201359087821115614dc75760008081fd5b614dd58e8b848601016147d2565b604082015285525050918601918601614d33565b508096505050505050509250929050565b60008060408385031215614e0d57600080fd5b8235915060208301356001600160401b03811115614e2a57600080fd5b614e36858286016147d2565b9150509250929050565b60008060408385031215614e5357600080fd5b50508035926020909101359150565b60008060408385031215614e7557600080fd5b8235614e8081614701565b9150614acd60208401614a9a565b60008060208385031215614ea157600080fd5b82356001600160401b0380821115614eb857600080fd5b818501915085601f830112614ecc57600080fd5b813581811115614edb57600080fd5b8660208260051b8501011115614ef057600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015614f5757603f19888603018452614f458583516146a9565b94509285019290850190600101614f29565b5092979650505050505050565b60008060408385031215614f7757600080fd5b82356001600160401b03811115614f8d57600080fd5b614f99858286016147d2565b95602094909401359450505050565b60008060008060808587031215614fbe57600080fd5b8435614fc981614701565b93506020850135614fd981614701565b92506040850135915060608501356001600160401b03811115614ffb57600080fd5b6148c6878288016147d2565b6000806000806080858703121561501d57600080fd5b843593506020850135925060408501356001600160401b038082111561489757600080fd5b6000806040838503121561505557600080fd5b823561506081614701565b9150602083013561507081614701565b809150509250929050565b600181811c9082168061508f57607f821691505b602082108103613e3757634e487b7160e01b600052602260045260246000fd5b601f8211156114ff57600081815260208120601f850160051c810160208610156150d65750805b601f850160051c820191505b81811015610edf578281556001016150e2565b81516001600160401b0381111561510e5761510e614742565b6151228161511c845461507b565b846150af565b602080601f831160018114615157576000841561513f5750858301515b600019600386901b1c1916600185901b178555610edf565b600085815260208120601f198616915b8281101561518657888601518255948401946001909101908401615167565b50858210156151a45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516151c6818460208801614685565b602360f81b90830190815283516151e4816001840160208801614685565b01600101949350505050565b85815260a06020820152600061520960a08301876146a9565b828103604084015261521b81876146a9565b9050828103606084015261522f81866146a9565b9050828103608084015261524381856146a9565b98975050505050505050565b60006020828403121561526157600080fd5b815161395f81614701565b634e487b7160e01b600052601160045260246000fd5b6000600182016152945761529461526c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156152f45784511515835293830193918301916001016152d6565b5090979650505050505050565b808201808211156108f2576108f261526c565b80820281158282048414176108f2576108f261526c565b818103818111156108f2576108f261526c565b634e487b7160e01b600052601260045260246000fd5b6000826153635761536361533e565b500690565b828152604060208201526000613cf960408301846146a9565b6000808335601e1984360301811261539857600080fd5b8301803591506001600160401b038211156153b257600080fd5b6020019150368190038213156153c757600080fd5b9250929050565b600082516153e0818460208701614685565b75076c4c2c6d6cee4deeadcc85ad2dac2ceca74eae4d8560531b920191825250601601919050565b600081546154158161507b565b6001828116801561542d576001811461544257615471565b60ff1984168752821515830287019450615471565b8560005260208060002060005b858110156154685781548a82015290840190820161544f565b50505082870194505b5050505092915050565b643230ba309d60d91b815260006154956005830185615408565b670ed8985cd94d8d0b60c21b815283516154b6816008840160208801614685565b6505258eae4d8560d31b60089290910191820152600e01949350505050565b643230ba309d60d91b815260006154ef6005830185615408565b670ed8985cd94d8d0b60c21b81528351615510816008840160208801614685565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b6261600892909101918201527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460288201527f2d706f736974696f6e3a63656e7465723b696d6167652d72656e646572696e6760488201527f3a2d7765626b69742d6f7074696d697a652d636f6e74726173743b2d6d732d6960688201527f6e746572706f6c6174696f6e2d6d6f64653a6e6561726573742d6e656967686260888201527f6f723b696d6167652d72656e646572696e673a2d6d6f7a2d63726973702d656460a88201527f6765733b696d6167652d72656e646572696e673a706978656c617465643b223e60c8820152651e17b9bb339f60d11b60e882015260ee01949350505050565b7919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b81526000825161566e81601a850160208701614685565b91909101601a0192915050565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600061569f600f830185615408565b6a1116113b30b63ab2911d1160a91b81526156bd600b820185615408565b61227d60f01b815260020195945050505050565b683d913730b6b2911d1160b91b8152600061395f6009830184615408565b602360f81b81526000835161570b816001850160208801614685565b701116113232b9b1b934b83a34b7b7111d1160791b6001918401918201526157366012820185615408565b61088b60f21b815260020195945050505050565b681134b6b0b3b2911d1160b91b815260006157686009830185615408565b8351615778818360208801614685565b01949350505050565b600080516020615e4983398151915281527f76696577426f783d223020302031323030203132303022207374796c653d226460208201527f6973706c61793a20626c6f636b3b207472616e73666f726d3a207363616c652860408201527f2d312c3129222076657273696f6e3d22312e322220786d6c6e733d226874747060608201527f3a2f2f7777772e77332e6f72672f323030302f737667223e3c696d616765207760808201527f696474683d223132303022206865696768743d22313230302220687265663d2260a0820152600082516158658160c0850160208701614685565b6f111f1e17b4b6b0b3b29f1e17b9bb339f60811b60c093909101928301525060d001919050565b711139bb33afb4b6b0b3b2afb230ba30911d1160711b815281516000906158ba816012850160208701614685565b61088b60f21b6012939091019283015250601401919050565b600080516020615e4983398151915281527f76696577426f783d2230203020313230302031323030222076657273696f6e3d60208201527f22312e322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3260408201527f3030302f737667223e3c696d6167652077696474683d2231323030222068656960608201527033b43a1e91189918181110343932b31e9160791b608082015260008251615985816091850160208701614685565b6f111f1e17b4b6b0b3b29f1e17b9bb339f60811b609193909101928301525060a101919050565b6d1134b6b0b3b2afb230ba30911d1160911b815281516000906159d681600e850160208701614685565b61088b60f21b600e939091019283015250601001919050565b6c1130ba3a3934b13aba32b9911d60991b81528151600090615a1881600d850160208701614685565b607d60f81b600d939091019283015250600e01919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251615a6881601d850160208701614685565b91909101601d0192915050565b848152836020820152608060408201526000615a9460808301856146a9565b8281036060840152615aa681856146a9565b979650505050505050565b683d913730b6b2911d1160b91b81526000615acf600983018a615408565b701116113232b9b1b934b83a34b7b7111d1160791b8152615af3601182018a615408565b6a11161134b6b0b3b2911d1160a91b81529050615b13600b820189615408565b6b1116113130b73732b9111d1160a11b81529050615b34600c820188615408565b7211161132bc3a32b93730b62fb634b735911d1160691b81529050615b5c6013820187615408565b7b11161139b2b63632b92fb332b2afb130b9b4b9afb837b4b73a39911d60211b81528551909150615b9481601c840160208901614685565b7116113332b2afb932b1b4b834b2b73a111d1160711b601c9290910191820152615bc1602e820185615408565b61227d60f01b81526002019a9950505050505050505050565b6000815260008251615bf3816001850160208701614685565b9190910160010192915050565b60ff81811683821602908116908181146129f8576129f861526c565b60ff82811682821603908111156108f2576108f261526c565b60ff81811683821601908111156108f2576108f261526c565b600060ff821660ff8103615c6457615c6461526c565b60010192915050565b600082615c7c57615c7c61533e565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614454908301846146a9565b600060208284031215615cc657600080fd5b815161395f81614652565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201528151600090615d1481600e850160208701614685565b91909101600e019392505050565b60008251615d34818460208701614685565b919091019291505056fe3c7376672077696474683d223136303022206865696768743d2231363030222076696577426f783d2230203020313630302031363030222076657273696f6e3d22312e322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207374796c653d226261636b67726f756e642d636f6c6f723a20234142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef3c7376672077696474683d223130302522206865696768743d22313030252220a26469706673582212208bc6f5a3bf8014a7e6bd8281c6c9c9c5e66a8c82657506e82a754a87b363617e64736f6c63430008110033

Deployed Bytecode Sourcemap

1709:29000:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5653:607:16;;;;;;;;;;-1:-1:-1;5653:607:16;;;;;:::i;:::-;;:::i;:::-;;;565:14:21;;558:22;540:41;;528:2;513:18;5653:607:16;;;;;;;;11161:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13048:200::-;;;;;;;;;;-1:-1:-1;13048:200:16;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:21;;;1679:51;;1667:2;1652:18;13048:200:16;1533:203:21;12611:376:16;;;;;;;;;;-1:-1:-1;12611:376:16;;;;;:::i;:::-;;:::i;:::-;;28732:690:20;;;;;;;;;;-1:-1:-1;28732:690:20;;;;;:::i;:::-;;:::i;28067:144::-;;;;;;;;;;-1:-1:-1;28067:144:20;;;;;:::i;:::-;;:::i;17580:429::-;;;;;;;;;;-1:-1:-1;17580:429:20;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;7129:33:21;;;7111:52;;7099:2;7084:18;17580:429:20;6967:202:21;4736:309:16;;;;;;;;;;-1:-1:-1;4998:12:16;;4789:7;4982:13;:28;4736:309;;;7320:25:21;;;7308:2;7293:18;4736:309:16;7174:177:21;30494:212:20;;;;;;;;;;-1:-1:-1;30494:212:20;;;;;:::i;:::-;;:::i;22055:2739:16:-;;;;;;;;;;-1:-1:-1;22055:2739:16;;;;;:::i;:::-;;:::i;29956:283:20:-;;;;;;;;;;-1:-1:-1;29956:283:20;;;;;:::i;:::-;;:::i;4701:38::-;;;;;;;;;;-1:-1:-1;4701:38:20;;;;;;;;15977:1036;;;;;;:::i;:::-;;:::i;4746:749::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;28343:168::-;;;;;;;;;;;;;:::i;27834:104::-;;;;;;;;;;;;;:::i;13912:179:16:-;;;;;;;;;;-1:-1:-1;13912:179:16;;;;;:::i;:::-;;:::i;27963:98:20:-;;;;;;;;;;-1:-1:-1;27963:98:20;;;;;:::i;:::-;;:::i;27705:123::-;;;;;;;;;;;;;:::i;8909:7062::-;;;;;;;;;;-1:-1:-1;8909:7062:20;;;;;:::i;:::-;;:::i;10957:142:16:-;;;;;;;;;;-1:-1:-1;10957:142:16;;;;;:::i;:::-;;:::i;4343:79:20:-;;;;;;;;;;-1:-1:-1;4343:79:20;;;;-1:-1:-1;;;;;4343:79:20;;;4550:37;;;;;;;;;;;;;;;;4636:59;;;;;;;;;;;;;:::i;6319:221:16:-;;;;;;;;;;-1:-1:-1;6319:221:16;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;26919:570:20:-;;;;;;;;;;-1:-1:-1;26919:570:20;;;;;:::i;:::-;;:::i;28517:209::-;;;;;;;;;;-1:-1:-1;28517:209:20;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;;;;:::i;11323:102:16:-;;;;;;;;;;;;;:::i;30245:243:20:-;;;;;;;;;;-1:-1:-1;30245:243:20;;;;;:::i;:::-;;:::i;13315:303:16:-;;;;;;;;;;-1:-1:-1;13315:303:16;;;;;:::i;:::-;;:::i;4593:37:20:-;;;;;;;;;;;;;;;;407:308:9;;;;;;;;;;-1:-1:-1;407:308:9;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18130:2413:20:-;;;;;;;;;;-1:-1:-1;18130:2413:20;;;;;:::i;:::-;;:::i;14157:388:16:-;;;;;;;;;;-1:-1:-1;14157:388:16;;;;;:::i;:::-;;:::i;20549:1891:20:-;;;;;;;;;;-1:-1:-1;20549:1891:20;;;;;:::i;:::-;;:::i;17466:108::-;;;;;;;;;;-1:-1:-1;17466:108:20;;;;;:::i;:::-;17526:4;17548:19;;;:7;:19;;;;;;;;;17466:108;4428:70;;;;;;;;;;-1:-1:-1;4428:70:20;;;;-1:-1:-1;;;;;4428:70:20;;;22446:3372;;;;;;;;;;-1:-1:-1;22446:3372:20;;;;;:::i;:::-;;:::i;4504:40::-;;;;;;;;;;;;4540:4;4504:40;;27495:204;;;;;;;;;;-1:-1:-1;27495:204:20;;;;;:::i;:::-;;:::i;17019:441::-;;;;;;;;;;-1:-1:-1;17019:441:20;;;;;:::i;:::-;;:::i;29428:522::-;;;;;;;;;;-1:-1:-1;29428:522:20;;;;;:::i;:::-;;:::i;25824:1089::-;;;;;;;;;;;;;:::i;13684:162:16:-;;;;;;;;;;-1:-1:-1;13684:162:16;;;;;:::i;:::-;-1:-1:-1;;;;;13804:25:16;;;13781:4;13804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13684:162;18015:109:20;;;;;;;;;;-1:-1:-1;18015:109:20;;;;;:::i;:::-;-1:-1:-1;;;;;18100:17:20;18074:7;18100:17;;;:7;:17;;;;;;;18015:109;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;4211:126:20:-;;;;;;;;;;-1:-1:-1;4211:126:20;;;;;:::i;:::-;;:::i;8227:434::-;;;;;;;;;;-1:-1:-1;8227:434:20;;;;;:::i;:::-;;:::i;5653:607:16:-;5738:4;-1:-1:-1;;;;;;;;;6033:25:16;;;;:101;;-1:-1:-1;;;;;;;;;;6109:25:16;;;6033:101;:177;;;-1:-1:-1;;;;;;;;;;6185:25:16;;;6033:177;6014:196;5653:607;-1:-1:-1;;5653:607:16:o;11161:98::-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;13048:200::-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;-1:-1:-1;;;13165:34:16;;;;;;;;;;;13135:64;-1:-1:-1;13217:24:16;;;;:15;:24;;;;;;-1:-1:-1;;;;;13217:24:16;;13048:200::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;-1:-1:-1;32960:10:16;-1:-1:-1;;;;;12730:28:16;;;12726:172;;12777:44;12794:5;32960:10;13684:162;:::i;12777:44::-;12772:126;;12848:35;;-1:-1:-1;;;12848:35:16;;;;;;;;;;;12772:126;12908:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;12908:29:16;-1:-1:-1;;;;;12908:29:16;;;;;;;;;12952:28;;12908:24;;12952:28;;;;;;;12673:314;12611:376;;:::o;28732:690:20:-;28926:10;28905:17;28913:8;28905:7;:17::i;:::-;-1:-1:-1;;;;;28905:31:20;;28897:40;;;;;;28948:18;;;;:8;:18;;;;;:52;28991:9;28948:18;:52;:::i;:::-;-1:-1:-1;29010:18:20;;;;:8;:18;;;;;:38;;:48;29051:7;29010:38;:48;:::i;:::-;-1:-1:-1;29068:18:20;;;;:8;:18;;;;;:39;;:50;29110:8;29068:39;:50;:::i;:::-;;29129:17;29173:9;29187:19;29197:8;29187:9;:19::i;:::-;29156:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29156:51:20;;;;;;;;;29218:18;;;;:8;29156:51;29218:18;;29156:51;;-1:-1:-1;29218:43:20;;:49;29156:51;29218:43;:49;:::i;:::-;;29283:132;29314:8;29336:9;29359:7;29380:8;29402:3;29283:132;;;;;;;;;;:::i;:::-;;;;;;;;28887:535;28732:690;;;;:::o;28067:144::-;1094:13:0;:11;:13::i;:::-;28176:28:20;;28191:13;;28176:12:::1;::::0;;;:28:::1;::::0;:12;:28:::1;:::i;:::-;-1:-1:-1::0;28176:28:20::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;28176:28:20::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;28176:28:20::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;28176:28:20::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;28176:28:20::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;28067:144:20:o;17580:429::-;17792:10;;17739:6;;-1:-1:-1;;;;;17792:10:20;17778;:24;;:141;;-1:-1:-1;17829:10:20;;17822:73;;-1:-1:-1;;;17822:73:20;;;;;7320:25:21;;;-1:-1:-1;;;;;17822:97:20;;;;17829:10;;17822:26;;7293:18:21;;17822:73:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17822:97:20;;17778:141;17757:172;;;;;;-1:-1:-1;;;;;17940:13:20;;;;;;:7;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;;;17972:30:20;17580:429;-1:-1:-1;;;;;;;17580:429:20:o;30494:212::-;30590:17;30598:8;30590:7;:17::i;:::-;-1:-1:-1;;;;;30576:31:20;:10;-1:-1:-1;;;;;30576:31:20;;30568:40;;;;;;30618:21;;;;:11;:21;;;;;;;;;:32;;-1:-1:-1;;30618:32:20;;;;;;;;;;30666:33;;22559:25:21;;;22600:18;;;22593:50;30666:33:20;;22532:18:21;30666:33:20;;;;;;;;30494:212;;:::o;22055:2739:16:-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;-1:-1:-1;;;;;22256:45:16;22272:19;-1:-1:-1;;;;;22256:45:16;;22252:86;;22310:28;;-1:-1:-1;;;22310:28:16;;;;;;;;;;;22252:86;22350:27;20821:21;;;20652:15;20862:4;20855:36;20943:4;20927:21;;21031:26;;32960:10;21766:30;;;-1:-1:-1;;;;;21468:26:16;;21745:19;;;21742:55;22526:173;;22612:43;22629:4;32960:10;13684:162;:::i;22612:43::-;22607:92;;22664:35;;-1:-1:-1;;;22664:35:16;;;;;;;;;;;22607:92;-1:-1:-1;;;;;22714:16:16;;22710:52;;22739:23;;-1:-1:-1;;;22739:23:16;;;;;;;;;;;22710:52;22905:15;22902:157;;;23043:1;23022:19;23015:30;22902:157;-1:-1:-1;;;;;23429:24:16;;;;;;;:18;:24;;;;;;23427:26;;-1:-1:-1;;23427:26:16;;;23497:22;;;;;;23495:24;;23427:26;23495:24;;;23812:142;23516:2;23895:45;23448:4;23516:2;23920:19;23895:14;:45::i;:::-;-1:-1:-1;;;23868:72:16;23812:18;:142::i;:::-;23783:26;;;;:17;:26;;;;;:171;;;;-1:-1:-1;;;24071:46:16;;:51;;24067:616;;24174:1;24164:11;;24142:19;24295:30;;;:17;:30;;;;;;:35;;24291:378;;24431:13;;24416:11;:28;24412:239;;24576:30;;;;:17;:30;;;;;:52;;;24412:239;24124:559;24067:616;24727:7;24723:2;-1:-1:-1;;;;;24708:27:16;24717:4;-1:-1:-1;;;;;24708:27:16;-1:-1:-1;;;;;;;;;;;24708:27:16;;;;;;;;;24745:42;22174:2620;;;22055:2739;;;:::o;29956:283:20:-;30057:17;30065:8;30057:7;:17::i;:::-;-1:-1:-1;;;;;30043:31:20;:10;-1:-1:-1;;;;;30043:31:20;;30035:40;;;;;;30090:9;30085:101;3724:2;30105:1;:14;30085:101;;;30166:6;30173:1;30166:9;;;;;;;;:::i;:::-;;;;;;;;;;;;30140:20;;;;:10;:20;;;;;;:23;;;;;;;;;;:35;;-1:-1:-1;;30140:35:20;;;;;;;;;;:23;30121:3;30140:23;30121:3;:::i;:::-;;;;30085:101;;;;30201:31;30215:8;30225:6;30201:31;;;;;;;:::i;15977:1036::-;16067:7;2261:21:1;:19;:21::i;:::-;7714:14:20::1;:12;:14::i;:::-;7706:23;;;::::0;::::1;;16086:19:::2;5369:13:16::0;;16146:10:20::2;16140:17:::0;;:5:::2;:17;::::0;;;;;;16170:3:::2;::::0;16140:26:::2;::::0;16160:6;;16140:26:::2;:::i;:::-;:33;;16132:42;;;::::0;::::2;;3774:2;16192:6;:24;;:38;;;;;16229:1;16220:6;:10;16192:38;16184:47;;;::::0;::::2;;4540:4;16249:20;16263:6:::0;16249:11;:20:::2;:::i;:::-;:33;;16241:42;;;::::0;::::2;;16301:10;16315:9;16301:23;16293:32;;;::::0;::::2;;16388:10;16336:16;16380:19:::0;;;:7:::2;:19;::::0;;;;;16413:11;;16409:496:::2;;16455:6;16444:7;:17;16440:384;;16504:7;16492:9;;:19;;;;:::i;:::-;16481:30;;16573:8;16560:9;;16551:6;:18;;;;:::i;:::-;16550:31;;;;:::i;:::-;16537:9;:44;;16529:53;;;::::0;::::2;;16608:10;16622:1;16600:19:::0;;;:7:::2;:19;::::0;;;;:23;16409:496:::2;;16440:384;16685:6;16673:9;;:18;;;;:::i;:::-;16662:29;;16753:8;16740:9;;16731:6;:18;;;;:::i;:::-;16730:31;;;;:::i;:::-;16717:9;:44;;16709:53;;;::::0;::::2;;16788:10;16780:19;::::0;;;:7:::2;:19;::::0;;;;:29;;16803:6;;16780:19;:29:::2;::::0;16803:6;;16780:29:::2;:::i;:::-;::::0;;;-1:-1:-1;16409:496:20::2;::::0;-1:-1:-1;16409:496:20::2;;16884:9;::::0;16875:18:::2;::::0;:6;:18:::2;:::i;:::-;16862:9;:31;;16854:40;;;::::0;::::2;;16921:10;16915:17;::::0;;;:5:::2;:17;::::0;;;;:27;;16936:6;;16915:17;:27:::2;::::0;16936:6;;16915:27:::2;:::i;:::-;::::0;;;-1:-1:-1;16952:25:20::2;::::0;-1:-1:-1;16958:10:20::2;16970:6:::0;16952:5:::2;:25::i;:::-;-1:-1:-1::0;;1716:1:1;2809:7;:22;16995:11:20;15977:1036;-1:-1:-1;;15977:1036:20:o;2303:20:1:-;15977:1036:20;;;:::o;4746:749::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28343:168::-;28400:21;28439:11;28431:20;;;;;;28487:6;;28461:43;;-1:-1:-1;;;;;28487:6:20;28496:7;28461:17;:43::i;:::-;28372:139;28343:168::o;27834:104::-;1094:13:0;:11;:13::i;:::-;27913:18:20::1;::::0;;-1:-1:-1;;27891:40:20;::::1;27913:18;::::0;;::::1;27912:19;27891:40;::::0;;27834:104::o;13912:179:16:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;27963:98:20:-;1094:13:0;:11;:13::i;:::-;28036:7:20::1;:18;28046:8:::0;28036:7;:18:::1;:::i;:::-;;27963:98:::0;:::o;27705:123::-;27750:4;4540;27773:14;5185:7:16;5369:13;;5138:279;27773:14:20;:26;:48;;;;-1:-1:-1;27803:18:20;;;;27773:48;27766:55;;27705:123;:::o;8909:7062::-;8995:13;9032:17;9040:8;9032:7;:17::i;:::-;9024:26;;;;;;9125:22;9150:38;9173:14;3724:2;9186:1;9173:14;:::i;:::-;9150:22;:38::i;:::-;9223:25;;;3724:2;9223:25;;;;;;;;;9125:63;;-1:-1:-1;9199:21:20;;9223:25;;;;;;;;;;;-1:-1:-1;9223:25:20;9199:49;;9264:9;9259:6257;3724:2;9279:1;:14;9259:6257;;;9314:18;9335:4;9340:1;9335:7;;;;;;;;:::i;:::-;;;;;;;9314:28;;9367:1;9363;9359;:5;;;;:::i;:::-;:9;:47;;;;-1:-1:-1;9372:22:20;;;;:12;:22;;;;;;;;:25;;;;;;;;;;;:34;9359:47;9356:6150;;;9453:1;9435:5;9441:1;9435:8;;;;;;;:::i;:::-;;:15;:19;;;;:::i;:::-;9425:4;9430:1;9425:7;;;;;;;;:::i;:::-;;;;;;:29;;;;;9356:6150;;;9493:22;9525;9538:8;9525:12;:22::i;:::-;:32;;;9493:65;;;-1:-1:-1;9576:18:20;4540:4;9493:65;9751:8;9789:12;9800:1;9751:8;9789:12;:::i;:::-;9661:166;;;;;;24374:19:21;;;;24409:12;;24402:28;;;;24446:12;;;24439:28;24483:12;;9661:166:20;;;;;;;;;;;;9626:223;;;;;;9597:270;;:282;;;;:::i;:::-;9576:303;;9911:24;9921:10;9933:1;9911:9;:24::i;:::-;9898:37;;9963:10;9953:4;9958:1;9953:7;;;;;;;;:::i;:::-;;;;;;:20;;;;;9991:10;10022:1;10004:5;10010:1;10004:8;;;;;;;:::i;:::-;;:15;:19;;;;:::i;:::-;10046:20;;;;:10;:20;;;;;;;;:23;;;;;;;;;9991:32;;-1:-1:-1;10046:23:20;;:31;;:23;:31;10042:5450;;10104:1;10109:2;10104:7;:24;;;;;10115:4;10120:1;10115:7;;;;;;;;:::i;:::-;;;;;;;10126:2;10115:13;10104:24;10100:2959;;;10187:5;10177:4;10182:1;10177:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;10221:20;;;;:10;:20;;;;;;10242:1;10221:23;;;;;;;;;;;:32;;;;10218:51;;10265:2;10255:4;10260:1;10255:7;;;;;;;;:::i;:::-;;;;;;:12;;;;;10218:51;10042:5450;;10100:2959;10302:1;10307:2;10302:7;:23;;;;;10313:4;10318:1;10313:7;;;;;;;;:::i;:::-;;;;;;;10324:1;10313:12;10302:23;10298:2761;;;10395:5;10385:4;10390:1;10385:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;10429:20;;;;:10;:20;;;;;;10450:1;10429:23;;;;;;;;;;;:32;;;;10426:50;;10473:1;10463:4;10468:1;10463:7;;;;;;;;:::i;10298:2761::-;10533:1;10538:2;10533:7;:23;;;;;10544:4;10549:1;10544:7;;;;;;;;:::i;:::-;;;;;;;10555:1;10544:12;10533:23;10529:2530;;;10626:5;10616:4;10621:1;10616:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;10660:20;;;;:10;:20;;;;;;10681:2;10660:24;;;;;;;;;;;:33;;;;10657:52;;10706:1;10695:4;10700:2;10695:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;10657:52;10737:20;;;;:10;:20;;;;;;;;10758:1;10737:23;;;;;;;;;;:32;;;;10734:50;;10781:1;10771:4;10776:1;10771:7;;;;;;;;:::i;:::-;;;;;;:11;;;;;10734:50;10812:20;;;;:10;:20;;;;;;;;10833:1;10812:23;;;;;;;;;;:32;;;;10809:50;;10856:1;10846:4;10851:1;10846:7;;;;;;;;:::i;10529:2530::-;10916:1;10921:2;10916:7;:23;;;;;10927:4;10932:1;10927:7;;;;;;;;:::i;:::-;;;;;;;10938:1;10927:12;10916:23;10912:2147;;;11009:5;10999:4;11004:1;10999:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;11043:20;;;;:10;:20;;;;;;11064:2;11043:24;;;;;;;;;;;:33;;;;11040:52;;11089:1;11078:4;11083:2;11078:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;11040:52;11120:20;;;;:10;:20;;;;;;;;11141:1;11120:23;;;;;;;;;;:32;;;;11117:50;;11164:1;11154:4;11159:1;11154:7;;;;;;;;:::i;10912:2147::-;11200:1;11205:2;11200:7;:23;;;;;11211:4;11216:1;11211:7;;;;;;;;:::i;:::-;;;;;;;11222:1;11211:12;11200:23;11196:1863;;;11295:5;11285:4;11290:1;11285:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;11329:20;;;;:10;:20;;;;;;11350:2;11329:24;;;;;;;;;;;:33;;;;11326:52;;11375:1;11364:4;11369:2;11364:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;11326:52;11406:20;;;;:10;:20;;;;;;;;11427:1;11406:23;;;;;;;;;;:32;;;;11403:50;;11450:1;11440:4;11445:1;11440:7;;;;;;;;:::i;11196:1863::-;11486:1;11491:2;11486:7;:23;;;;;11497:4;11502:1;11497:7;;;;;;;;:::i;:::-;;;;;;;11508:1;11497:12;11486:23;11482:1577;;;11581:5;11571:4;11576:1;11571:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;11615:20;;;;:10;:20;;;;;;11636:2;11615:24;;;;;;;;;;;:33;;;;11612:52;;11661:1;11650:4;11655:2;11650:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;11612:52;11692:20;;;;:10;:20;;;;;;;;11713:1;11692:23;;;;;;;;;;:32;;;;11689:50;;11736:1;11726:4;11731:1;11726:7;;;;;;;;:::i;:::-;;;;;;:11;;;;;11689:50;11768:4;11773:1;11768:7;;;;;;;;:::i;:::-;;;;;;;11779:1;11768:12;:48;;;;-1:-1:-1;11784:20:20;;;;:10;:20;;;;;;;;11805:1;11784:23;;;;;;;;;;:32;11768:48;11764:69;;;11829:2;11819:4;11824:1;11819:7;;;;;;;;:::i;11482:1577::-;11865:1;11870:2;11865:7;:23;;;;;11876:4;11881:1;11876:7;;;;;;;;:::i;:::-;;;;;;;11887:1;11876:12;11865:23;11861:1198;;;11958:5;11948:4;11953:1;11948:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;11992:20;;;;:10;:20;;;;;;12013:2;11992:24;;;;;;;;;;;:33;;;;11989:52;;12038:1;12027:4;12032:2;12027:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;11989:52;12069:20;;;;:10;:20;;;;;;;;12090:1;12069:23;;;;;;;;;;:32;;;;12066:50;;12113:1;12103:4;12108:1;12103:7;;;;;;;;:::i;11861:1198::-;12149:1;12154:2;12149:7;:23;;;;;12160:4;12165:1;12160:7;;;;;;;;:::i;:::-;;;;;;;12171:1;12160:12;12149:23;12145:914;;;12241:5;12231:4;12236:1;12231:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;12275:20;;;;:10;:20;;;;;;12296:2;12275:24;;;;;;;;;;;:33;;;;12272:52;;12321:1;12310:4;12315:2;12310:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;12272:52;12352:20;;;;:10;:20;;;;;;;;12373:1;12352:23;;;;;;;;;;:32;;;;12349:50;;12396:1;12386:4;12391:1;12386:7;;;;;;;;:::i;12145:914::-;12432:1;12437:2;12432:7;:24;;;;;12443:4;12448:1;12443:7;;;;;;;;:::i;:::-;;;;;;;12454:2;12443:13;12432:24;12428:631;;;12525:5;12515:4;12520:1;12515:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;12559:20;;;;:10;:20;;;;;;12580:2;12559:24;;;;;;;;;;;:33;;;;12556:52;;12605:1;12594:4;12599:2;12594:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;12556:52;12636:20;;;;:10;:20;;;;;;;;12657:1;12636:23;;;;;;;;;;:32;;;;12633:50;;12680:1;12670:4;12675:1;12670:7;;;;;;;;:::i;12428:631::-;12716:1;12721:2;12716:7;:24;;;;;12727:4;12732:1;12727:7;;;;;;;;:::i;:::-;;;;;;;12738:2;12727:13;12716:24;12712:347;;;12808:5;12798:4;12803:1;12798:7;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;12842:20;;;;:10;:20;;;;;;12863:2;12842:24;;;;;;;;;;;:33;;;;12839:52;;12888:1;12877:4;12882:2;12877:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;12839:52;12919:20;;;;:10;:20;;;;;;;;12940:1;12919:23;;;;;;;;;;:32;;;;12916:50;;12963:1;12953:4;12958:1;12953:7;;;;;;;;:::i;12712:347::-;13031:5;13021:4;13026:1;13021:7;;;;;;;;:::i;10042:5450::-;13131:4;13136:2;13131:8;;;;;;;;:::i;:::-;;;;;;;13143:2;13131:14;13127:140;;13197:20;;;;:10;:20;;;;;;;;13218:1;13197:23;;;;;;;;;;:32;;;;13194:51;;13241:2;13231:4;13236:1;13231:7;;;;;;;;:::i;:::-;;;;;;:12;;;;;13194:51;13293:4;13298:2;13293:8;;;;;;;;:::i;:::-;;;;;;;13305:1;13293:13;13289:2184;;13369:20;;;;:10;:20;;;;;;;;13390:1;13369:23;;;;;;;;;;:32;;;;13366:50;;13413:1;13403:4;13408:1;13403:7;;;;;;;;:::i;13289:2184::-;13448:4;13453:2;13448:8;;;;;;;;:::i;:::-;;;;;;;13460:1;13448:13;13444:2029;;13524:20;;;;:10;:20;;;;;;;;13545:2;13524:24;;;;;;;;;;:33;;;;13521:52;;13570:1;13559:4;13564:2;13559:8;;;;;;;;:::i;13444:2029::-;13756:4;13761:2;13756:8;;;;;;;;:::i;:::-;;;;;;;13768:1;13756:13;13752:1721;;13832:20;;;;:10;:20;;;;;;;;13853:2;13832:24;;;;;;;;;;:33;;;;13829:52;;13878:1;13867:4;13872:2;13867:8;;;;;;;;:::i;13752:1721::-;13989:4;13994:2;13989:8;;;;;;;;:::i;:::-;;;;;;;14001:1;13989:13;13985:1488;;14067:20;;;;:10;:20;;;;;;;;14088:2;14067:24;;;;;;;;;;:33;;;;14064:52;;14113:1;14102:4;14107:2;14102:8;;;;;;;;:::i;13985:1488::-;14224:4;14229:2;14224:8;;;;;;;;:::i;:::-;;;;;;;14236:1;14224:13;14220:1253;;14302:20;;;;:10;:20;;;;;;;;14323:2;14302:24;;;;;;;;;;:33;;;;14299:52;;14348:1;14337:4;14342:2;14337:8;;;;;;;;:::i;14220:1253::-;14553:4;14558:2;14553:8;;;;;;;;:::i;:::-;;;;;;;14565:1;14553:13;14549:924;;14629:20;;;;:10;:20;;;;;;;;14650:2;14629:24;;;;;;;;;;:33;;;;14626:52;;14675:1;14664:4;14669:2;14664:8;;;;;;;;:::i;14549:924::-;14786:4;14791:2;14786:8;;;;;;;;:::i;:::-;;;;;;;14798:1;14786:13;14782:691;;14861:20;;;;:10;:20;;;;;;;;14882:2;14861:24;;;;;;;;;;:33;;;;14858:52;;14907:1;14896:4;14901:2;14896:8;;;;;;;;:::i;14782:691::-;15018:4;15023:2;15018:8;;;;;;;;:::i;:::-;;;;;;;15030:2;15018:14;15014:459;;15094:20;;;;:10;:20;;;;;;;;15115:2;15094:24;;;;;;;;;;:33;;;;15091:52;;15140:1;15129:4;15134:2;15129:8;;;;;;;;:::i;15014:459::-;15251:4;15256:2;15251:8;;;;;;;;:::i;:::-;;;;;;;15263:2;15251:14;15247:226;;15326:20;;;;:10;:20;;;;;;;;15347:2;15326:24;;;;;;;;;;:33;;;;15323:52;;15372:1;15361:4;15366:2;15361:8;;;;;;;;:::i;:::-;;;;;;:12;;;;;15323:52;15403:20;;;;:10;:20;;;;;;;;15424:1;15403:23;;;;;;;;;;:32;;;;15400:50;;15447:1;15437:4;15442:1;15437:7;;;;;;;;:::i;:::-;;;;;;:11;;;;;15400:50;9475:6031;;;9356:6150;-1:-1:-1;9295:3:20;;;;:::i;:::-;;;;9259:6257;;;;15531:9;15526:404;15550:4;:11;15546:1;:15;15526:404;;;15596:2;15586:4;15591:1;15586:7;;;;;;;;:::i;:::-;;;;;;;:12;15582:160;;;15618:26;;;;;;;;;;;;-1:-1:-1;;;15618:26:20;;;;;;:9;;:20;:26::i;:::-;15582:160;;;15679:3;15669:4;15674:1;15669:7;;;;;;;;:::i;:::-;;;;;;;:13;15665:77;;;15702:25;;;;;;;;;;;;-1:-1:-1;;;15702:25:20;;;;;;:9;;:20;:25::i;:::-;15769:3;15759:4;15764:1;15759:7;;;;;;;;:::i;:::-;;;;;;;:13;15755:165;;;15792:27;;;;;;;;;;;;-1:-1:-1;;;15792:27:20;;;;;;:9;;:20;:27::i;:::-;15755:165;;;15858:47;15885:18;15895:4;15900:1;15895:7;;;;;;;;:::i;:::-;;;;;;;15885:9;:18::i;:::-;15858:9;;:20;:47::i;:::-;15563:3;;;;:::i;:::-;;;;15526:404;;;-1:-1:-1;15954:9:20;;8909:7062;-1:-1:-1;;;8909:7062:20:o;10957:142:16:-;11021:7;11063:27;11082:7;11063:18;:27::i;4636:59:20:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6319:221:16:-;6383:7;-1:-1:-1;;;;;6406:19:16;;6402:60;;6434:28;;-1:-1:-1;;;6434:28:16;;;;;;;;;;;6402:60;-1:-1:-1;;;;;;6479:25:16;;;;;:18;:25;;;;;;-1:-1:-1;;;;;6479:54:16;;6319:221::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;26919:570:20:-;1094:13:0;:11;:13::i;:::-;27068:6:20::1;:13;27039:5;27045:11;27039:18;;;;;;;:::i;:::-;;:25:::0;:42:::1;27031:51;;;::::0;::::1;;27092:29;27138:6;:13;-1:-1:-1::0;;;;;27124:28:20::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;27124:28:20::1;;27092:60;;27167:9;27162:249;27186:6;:13;27182:1;:17;27162:249;;;27238:29;27252:6;27259:1;27252:9;;;;;;;;:::i;:::-;;;;;;;:14;;;27238:13;:29::i;:::-;27220:12;27233:1;27220:15;;;;;;;;:::i;:::-;;;;;;:47;-1:-1:-1::0;;;;;27220:47:20::1;;;-1:-1:-1::0;;;;;27220:47:20::1;;;::::0;::::1;27313:87;;;;;;;;27336:6;27343:1;27336:9;;;;;;;;:::i;:::-;;;;;;;:14;;;27313:87;;;;27368:6;27375:1;27368:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:18;::::1;::::0;27313:87;;;27281:26:::1;::::0;;;:13:::1;:26:::0;;;;;;:29;;;;;;;:119;;:29;;:119:::1;::::0;:29;:119:::1;:::i;:::-;-1:-1:-1::0;27281:119:20::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;;27201:3;;;;;:::i;:::-;;;;27162:249;;;-1:-1:-1::0;27420:31:20::1;::::0;;;:18:::1;:31;::::0;;;;;;;:46;;::::1;::::0;;::::1;::::0;::::1;:::i;28517:209::-:0;28625:10;28604:17;28612:8;28604:7;:17::i;:::-;-1:-1:-1;;;;;28604:31:20;;28596:40;;;;;;28646:17;;;;:7;:17;;;;;:28;28666:8;28646:17;:28;:::i;:::-;;28690:29;28700:8;28710;28690:29;;;;;;;:::i;1201:85:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;;1201:85::o;11323:102:16:-;11379:13;11411:7;11404:14;;;;;:::i;30245:243:20:-;30332:2;30323:6;:11;30315:20;;;;;;30367:17;30375:8;30367:7;:17::i;:::-;-1:-1:-1;;;;;30353:31:20;:10;-1:-1:-1;;;;;30353:31:20;;30345:40;;;;;;30396:22;;;;:12;:22;;;;;;;;:30;;;;;;;;;:37;;-1:-1:-1;;30396:37:20;30429:4;30396:37;;;30449:32;;24976:25:21;;;25017:18;;;25010:34;;;30449:32:20;;24949:18:21;30449:32:20;24802:248:21;13315:303:16;32960:10;-1:-1:-1;;;;;13413:31:16;;;13409:61;;13453:17;;-1:-1:-1;;;13453:17:16;;;;;;;;;;;13409:61;32960:10;13481:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;13481:49:16;;;;;;;;;;;;:60;;-1:-1:-1;;13481:60:16;;;;;;;;;;13556:55;;540:41:21;;;13481:49:16;;32960:10;13556:55;;513:18:21;13556:55:16;;;;;;;13315:303;;:::o;407:308:9:-;475:22;531:4;-1:-1:-1;;;;;519:24:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:34;;558:9;553:132;573:15;;;553:132;;;622:52;659:4;666;;671:1;666:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;622:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;622:28:9;;-1:-1:-1;;;622:52:9:i;:::-;609:7;617:1;609:10;;;;;;;;:::i;:::-;;;;;;:65;;;;590:3;;;;;:::i;:::-;;;;553:132;;;;407:308;;;;:::o;18130:2413:20:-;18233:13;18262:22;18294;:33;;;;;;;;;;;;;-1:-1:-1;;;18294:33:20;;;;;18376:1;18348:7;:17;18356:8;18348:17;;;;;;;;;;;18342:31;;;;;:::i;:::-;;;:35;18338:94;;;18404:17;;;;:7;:17;;;;;18393:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18338:94;18442:21;18466:34;18489:10;18466:22;:34::i;:::-;18442:58;;18510:176;;;;;;;;;;;;;;;;;;:8;;:19;:176::i;:::-;18696:95;18746:8;18729:52;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18729:52:20;;;;;;;;;18696:8;;:19;:95::i;:::-;18806:9;18801:764;18825:14;18838:1;3724:2;18825:14;:::i;:::-;18821:1;:18;18801:764;;;18873:1;18865:5;18869:1;18865;:5;:::i;:::-;:9;:47;;;;-1:-1:-1;18878:22:20;;;;:12;:22;;;;;;;;:25;;;;;;;;;;;:34;18865:47;18860:695;;19002:107;19042:49;19063:5;19071;:1;19075;19071:5;:::i;:::-;19080;:1;19084;19080:5;:::i;:::-;19079:11;;19089:1;19079:11;:::i;:::-;19042:20;:49::i;:::-;19002:18;:107::i;:::-;18985:124;;;;19127:413;19243:13;:16;19257:1;19243:16;;;;;;;;;;;:32;19260:14;19243:32;;;;;;;;;;;:41;;19346:120;19389:51;19402:18;:21;19421:1;19402:21;;;;;;;;;;;19424:14;19402:37;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19402:37:20;19389:12;:51::i;:::-;19346:13;:120::i;:::-;19168:354;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;19168:354:20;;;;;;;;;19127:8;;:19;:413::i;:::-;18841:3;;;;:::i;:::-;;;;18801:764;;;-1:-1:-1;19592:107:20;19624:65;19645:5;19671:1;19653:14;3724:2;19671:1;19653:14;:::i;:::-;19652:20;;;;:::i;:::-;19674:14;3724:2;19687:1;19674:14;:::i;19592:107::-;19575:124;;;-1:-1:-1;19710:629:20;19802:13;:29;19816:14;19829:1;3724:2;19816:14;:::i;:::-;19802:29;;;;;;;;;;;:45;19832:14;19802:45;;;;;;;;;;;:54;;19902:163;19937:110;19975:18;:34;20007:1;3724:2;19994:14;;;;:::i;:::-;19975:34;;;;;;;;;;;20010:14;19975:50;;;;;;;;:::i;19902:163::-;19743:586;;;;;;;;;:::i;19710:629::-;20481:23;20495:8;20481:13;:23::i;:::-;20393:129;;;;;;;;:::i;:::-;;;;;;;;;;;;;20350:186;;;;;18130:2413;;;;:::o;14157:388:16:-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;-1:-1:-1;;;;;14363:14:16;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;-1:-1:-1;;;14484:40:16;;;;;;;;;;;20549:1891:20;20657:13;20686:26;20715:34;20738:10;20715:22;:34::i;:::-;20686:63;;20759:29;;;;;;;;;;;;;;-1:-1:-1;;;20759:29:20;;;:13;:24;;:29;;;;:::i;:::-;20804:9;20799:1596;3724:2;20819:1;:14;20799:1596;;;20854:22;20879:99;20915:49;20936:5;20944;:1;20948;20944:5;:::i;:::-;20953;:1;20957;20953:5;:::i;20879:99::-;21002:16;;;;:13;:16;;;;;;;;20854:124;;;;;21002:32;;;;;;;;;20996:51;;20854:124;;-1:-1:-1;21050:1:20;;20996:51;;;:::i;:::-;;;:55;20992:1392;;;21072:317;21203:11;21215:1;21203:14;;;;;;;;:::i;:::-;;;;;;;;;21282:16;;;:13;:16;;;;;;:32;;;;;;;;;21118:253;;;;21203:14;;;;;21282:32;21118:253;;:::i;:::-;;;;-1:-1:-1;;21118:253:20;;;;;;;;;21072:13;;:24;:317::i;:::-;21412:1;21417:2;21412:7;:203;;;;-1:-1:-1;21425:20:20;;;;:10;:20;;;;;;;;21446:2;21425:24;;;;;;;;;;;:63;;-1:-1:-1;21453:22:20;;;;:12;:22;;;;;;;;21476:2;21453:26;;;;;;;;;;:35;21425:63;21424:93;;;;-1:-1:-1;21493:20:20;;;;:10;:20;;;;;;;;21514:2;21493:24;;;;;;;;;;21424:93;:162;;;;-1:-1:-1;21522:20:20;;;;:10;:20;;;;;;;;:24;;;;;;;;;;;;:63;;-1:-1:-1;21550:22:20;;;;:12;:22;;;;;;;;21573:2;21550:26;;;;;;;;;;:35;21522:63;21424:190;;;;-1:-1:-1;21590:20:20;;;;:10;:20;;;;;;;;21611:2;21590:24;;;;;;;;;;21424:190;21408:961;;;21638:29;;;;;;;;;;;;-1:-1:-1;;;21638:29:20;;;;;;:13;;:24;:29::i;:::-;21408:961;;;21696:1;21701:2;21696:7;:134;;;;-1:-1:-1;21708:20:20;;;;:10;:20;;;;;;;;21729:2;21708:24;;;;;;;;;;:93;;;;-1:-1:-1;21737:20:20;;;;:10;:20;;;;;;;;:24;;;;;;;;;;;;:63;;-1:-1:-1;21765:22:20;;;;:12;:22;;;;;;;;21788:2;21765:26;;;;;;;;;;:35;21737:63;21708:121;;;;-1:-1:-1;21805:20:20;;;;:10;:20;;;;;;;;21826:2;21805:24;;;;;;;;;;21708:121;21692:677;;;21853:29;;;;;;;;;;;;-1:-1:-1;;;21853:29:20;;;;;;:13;;:24;:29::i;21692:677::-;21911:1;21916:2;21911:7;:106;;;;-1:-1:-1;21924:20:20;;;;:10;:20;;;;;;;;:24;;;;;;;;;;;;:63;;-1:-1:-1;21952:22:20;;;;:12;:22;;;;;;;;21975:2;21952:26;;;;;;;;;;:35;21924:63;21923:93;;;;-1:-1:-1;21992:20:20;;;;:10;:20;;;;;;;;22013:2;21992:24;;;;;;;;;;21923:93;21907:462;;;22040:29;;;;;;;;;;;;-1:-1:-1;;;22040:29:20;;;;;;:13;;:24;:29::i;21907:462::-;22098:1;22103:2;22098:7;:35;;;;-1:-1:-1;22109:20:20;;;;:10;:20;;;;;;;;22130:2;22109:24;;;;;;;;;;22098:35;22094:275;;;22156:29;;;;;;;;;;;;-1:-1:-1;;;22156:29:20;;;;;;:13;;:24;:29::i;22094:275::-;22214:1;22219:2;22214:7;22210:159;;22245:29;;;;;;;;;;;;-1:-1:-1;;;22245:29:20;;;;;;:13;;:24;:29::i;22210:159::-;22321:29;;;;;;;;;;;;-1:-1:-1;;;22321:29:20;;;;;;:13;;:24;:29::i;:::-;-1:-1:-1;20835:3:20;;;;:::i;:::-;;;;20799:1596;;;-1:-1:-1;22419:13:20;20549:1891;-1:-1:-1;;;20549:1891:20:o;22446:3372::-;22544:13;22581:17;22589:8;22581:7;:17::i;:::-;22573:26;;;;;;22648:1;22617:21;;:18;:21;;;:28;22609:41;;;;;;22661:23;22687;22701:8;22687:13;:23::i;:::-;22661:49;;22721:22;22746:34;22769:10;22746:22;:34::i;:::-;22851:1;22800:18;;;:8;:18;;;;;22794:54;;22721:59;;-1:-1:-1;22851:1:20;;22794:54;;;:::i;:::-;;;:58;22790:360;;;22984:18;;;;:8;:18;;;;;;;;;22906:136;;22868:188;;22906:136;;22984:18;;22906:136;;:::i;22868:188::-;22790:360;;;23087:52;;;;;;;;;;;;-1:-1:-1;;;23087:52:20;;;;;;:9;;:20;:52::i;:::-;23160:233;23249:19;23259:8;23249:9;:19::i;:::-;23194:189;;;;;23323:24;;23194:189;;;:::i;23160:233::-;23432:1;23414:7;23408:21;;;;;:::i;:::-;;;:25;:59;;;;-1:-1:-1;23437:30:20;;;;:20;:30;;;;;;;;23408:59;23404:2077;;;23483:111;23551:7;23560:19;23570:8;23560:9;:19::i;:::-;23521:59;;;;;;;;;:::i;23483:111::-;23404:2077;;;23625:26;;;;;;;;;:21;:26;;;23669:21;;;:11;:21;;;;;;;;;;23665:1690;;;23710:23;23736:30;23746:9;23757:8;23736:9;:30::i;:::-;23710:56;;23918:438;24239:9;23961:369;;;;;;;;:::i;:::-;;;;;;;;;;;;;23918:13;:438::i;:::-;23822:556;;;;;;;;:::i;:::-;;;;;;;;;;;;;23784:612;;24414:115;24495:9;24456:55;;;;;;;;:::i;24414:115::-;23692:852;23665:1690;;;24568:23;24594:30;24604:9;24615:8;24594:9;:30::i;:::-;24568:56;;24776:391;25050:9;24819:322;;;;;;;;:::i;24776:391::-;24680:509;;;;;;;;:::i;:::-;;;;;;;;;;;;;24642:565;;25225:115;25306:9;25267:55;;;;;;;;:::i;25225:115::-;24550:805;23665:1690;25369:101;25442:7;25407:49;;;;;;;;:::i;25369:101::-;23611:1870;23404:2077;25491:119;25559:35;25574:9;25585:8;25559:14;:35::i;:::-;25525:75;;;;;;;;:::i;25491:119::-;25755:24;25769:9;25755:13;:24::i;:::-;25664:133;;;;;;;;:::i;:::-;;;;;;;;;;;;;25621:190;;;;22446:3372;;;:::o;27495:204::-;27616:17;27624:8;27616:7;:17::i;:::-;-1:-1:-1;;;;;27602:31:20;:10;-1:-1:-1;;;;;27602:31:20;;27594:40;;;;;;27644:30;;;;:20;:30;;;;;;:48;;-1:-1:-1;;27644:48:20;;;;;;;;;;27495:204::o;17019:441::-;17101:7;2261:21:1;:19;:21::i;:::-;7714:14:20::1;:12;:14::i;:::-;7706:23;;;::::0;::::1;;17120:19:::2;5369:13:16::0;17188:4:20::2;17174:18:::0;::::2;;17166:27;;;::::0;::::2;;17211:19;::::0;;;:7:::2;:19;::::0;;;;;::::2;;:28;17203:37;;;::::0;::::2;;17279:10;::::0;17272:38:::2;::::0;-1:-1:-1;;;17272:38:20;;::::2;::::0;::::2;7320:25:21::0;;;-1:-1:-1;;;;;17279:10:20;;::::2;::::0;17272:26:::2;::::0;7293:18:21;;17272:38:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17258:52:20::2;:10;-1:-1:-1::0;;;;;17258:52:20::2;;17250:61;;;::::0;::::2;;4540:4;17329:15;:11:::0;17343:1:::2;17329:15;:::i;:::-;:28;;17321:37;;;::::0;::::2;;17369:19;::::0;;;:7:::2;:19;::::0;;;;:26;;-1:-1:-1;;17369:26:20::2;17391:4;17369:26:::0;;::::2;::::0;;;17405:20:::2;::::0;17411:10:::2;::::0;17405:5:::2;:20::i;:::-;17442:11:::0;-1:-1:-1;2303:20:1;1716:1;2809:7;:22;2629:209;29428:522:20;29572:17;29580:8;29572:7;:17::i;:::-;-1:-1:-1;;;;;29558:31:20;:10;-1:-1:-1;;;;;29558:31:20;;29550:40;;;;;;29600:10;29613:18;;;:8;:18;;;;;:29;;;29655:18;;;29652:109;;29719:18;;;;:8;:18;;;;;:29;;:31;;29700:5;;-1:-1:-1;29700:5:20;;29719:31;;;;:::i;:::-;;;;;;29652:109;29771:18;;;;:8;:18;;;;;;;;:36;;;:25;;:36;;;;;:45;29810:6;29771:36;:45;:::i;:::-;-1:-1:-1;29826:18:20;;;;:8;:18;;;;;;;;:36;;;:25;;:36;;;;;:45;29865:6;29826:36;:45;:::i;:::-;;29887:56;29907:8;29917:9;29928:6;29936;29887:56;;;;;;;;;:::i;25824:1089::-;26658:22;;25868:13;;26027:847;;26153:12;;26249:24;;26346:18;;26438:19;;26538:20;;26648:33;;:9;:33::i;:::-;26066:786;;;;;;;;;;26761:31;;26066:786;;;:::i;26027:847::-;25936:956;;;;;;;;:::i;:::-;;;;;;;;;;;;;25893:1013;;25824:1089;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;39659:2:21;2161:73:0::1;::::0;::::1;39641:21:21::0;39698:2;39678:18;;;39671:30;39737:34;39717:18;;;39710:62;-1:-1:-1;;;39788:18:21;;;39781:36;39834:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;4211:126:20:-:0;1094:13:0;:11;:13::i;:::-;4324:6:20::1;4299:11;4311:9;4299:22;;;;;;;;:::i;:::-;;;;;;;;:31;;;;;;:::i;8227:434::-:0;8339:19;;-1:-1:-1;;;;;8339:19:20;8325:10;:33;8317:42;;;;;;8370:21;8405:8;8394;:19;:41;;8427:8;8394:41;;;8416:8;8394:41;8370:65;;8446:37;8469:13;8446:22;:37::i;:::-;8497:26;8505:17;:13;8521:1;8505:17;:::i;:::-;8497:7;:26::i;:::-;8493:98;;;8539:41;8562:17;:13;8578:1;8562:17;:::i;:::-;8539:22;:41::i;:::-;8601:53;8617:13;8632:21;:19;:21::i;:::-;8601:15;:53::i;14791:268:16:-;14848:4;14935:13;;14925:7;:23;14883:150;;;;-1:-1:-1;;14985:26:16;;;;:17;:26;;;;;;-1:-1:-1;;;14985:43:16;:48;;14791:268::o;33078:1920::-;33541:4;33535:11;;33548:3;33531:21;;33624:17;;;;34307:11;;;34188:5;34437:2;34451;34441:13;;34433:22;34307:11;34420:36;34491:2;34481:13;;34082:682;34509:4;34082:682;;;34695:1;34690:3;34686:11;34679:18;;34745:2;34739:4;34735:13;34731:2;34727:22;34722:3;34714:36;34602:2;34592:13;;34082:682;;;-1:-1:-1;34792:13:16;;;-1:-1:-1;;34905:12:16;;;34963:19;;;34905:12;33078:1920;-1:-1:-1;33078:1920:16:o;1359:130:0:-;32960:10:16;1422:7:0;:5;:7::i;:::-;-1:-1:-1;;;;;1422:23:0;;1414:68;;;;-1:-1:-1;;;1414:68:0;;40066:2:21;1414:68:0;;;40048:21:21;;;40085:18;;;40078:30;40144:34;40124:18;;;40117:62;40196:18;;1414:68:0;39864:356:21;7949:1105:16;8016:7;8050;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:23;;;:17;:23;;;;;;;-1:-1:-1;;;8289:23:16;;:28;;8285:687;;8800:111;8807:6;8817:1;8807:11;8800:111;;-1:-1:-1;;;8877:6:16;8859:25;;;;:17;:25;;;;;;8800:111;;;8943:6;7949:1105;-1:-1:-1;;;7949:1105:16:o;8285:687::-;8163:827;8137:853;9016:31;;-1:-1:-1;;;9016:31:16;;;;;;;;;;;30099:302;30230:7;2166:3;30275:40;;;;30341:31;30352:4;30358:2;30275:40;30341:10;:31::i;:::-;30333:40;;:61;;;30099:302;-1:-1:-1;;;;;30099:302:16:o;10460:440::-;10863:11;10839:22;10835:40;10832:51;-1:-1:-1;;;;;10694:27:16;;;;10822:62;;10460:440::o;2336:287:1:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:1;;40427:2:21;2460:63:1;;;40409:21:21;40466:2;40446:18;;;40439:30;40505:33;40485:18;;;40478:61;40556:18;;2460:63:1;40225:355:21;2460:63:1;1759:1;2598:7;:18;2336:287::o;16563:1492:16:-;16627:20;16650:13;-1:-1:-1;;;;;16677:16:16;;16673:48;;16702:19;;-1:-1:-1;;;16702:19:16;;;;;;;;;;;16673:48;16735:8;16747:1;16735:13;16731:44;;16757:18;;-1:-1:-1;;;16757:18:16;;;;;;;;;;;16731:44;-1:-1:-1;;;;;17250:22:16;;;;;;:18;:22;;1156:2;17250:22;;:70;;-1:-1:-1;;;;;17276:44:16;;17250:70;;;17590:136;;17269:2;;17679:33;;17269:2;17250:22;17679:14;:33::i;:::-;12535:1;12522:15;;12497:23;12493:45;17646:66;17590:18;:136::i;:::-;17556:31;;;;:17;:31;;;;;:170;17574:12;17799:23;;;17836:99;17862:35;;17887:9;;;;;-1:-1:-1;;;;;17862:35:16;;;17879:1;;-1:-1:-1;;;;;;;;;;;17862:35:16;17879:1;;17862:35;17930:3;17920:7;:13;17836:99;;17949:13;:19;-1:-1:-1;13912:179:16;;;:::o;2412:312:6:-;2526:6;2501:21;:31;;2493:73;;;;-1:-1:-1;;;2493:73:6;;40787:2:21;2493:73:6;;;40769:21:21;40826:2;40806:18;;;40799:30;40865:31;40845:18;;;40838:59;40914:18;;2493:73:6;40585:353:21;2493:73:6;2578:12;2596:9;-1:-1:-1;;;;;2596:14:6;2618:6;2596:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:52;;;2647:7;2639:78;;;;-1:-1:-1;;;2639:78:6;;41355:2:21;2639:78:6;;;41337:21:21;41394:2;41374:18;;;41367:30;41433:34;41413:18;;;41406:62;-1:-1:-1;;;41484:18:21;;;41477:56;41550:19;;2639:78:6;41153:422:21;1035:989:15;1243:4;1237:11;;1549:20;;;1118:19;1549:20;1586:25;;1719:19;;1755:25;;-1:-1:-1;1906:4:15;1891:20;;;1967:17;;;1891:20;1035:989::o;10226:156:16:-;10288:21;;:::i;:::-;10328:47;10347:27;10366:7;10347:18;:27::i;:::-;10328:18;:47::i;7091:573:20:-;7198:7;;;7260:351;7284:5;7290:11;7284:18;;;;;;;:::i;:::-;;:25;7280:29;;7260:351;;;7330:22;7355:5;7361:11;7355:18;;;;;;;:::i;:::-;;7374:1;7355:21;;;;;;;;:::i;:::-;;;;;;;;;7330:46;;7425:17;7411:10;:31;;:98;;;;-1:-1:-1;7475:34:20;7495:14;7475:17;:34;:::i;:::-;7462:10;:47;7411:98;7390:142;;;-1:-1:-1;7531:1:20;-1:-1:-1;7524:8:20;;-1:-1:-1;7524:8:20;7390:142;7566:34;7586:14;7566:17;:34;:::i;:::-;7546:54;;7316:295;7311:3;;;;;:::i;:::-;;;;7260:351;;;;7656:1;7628:5;7634:11;7628:18;;;;;;;:::i;:::-;;:25;:29;;;;:::i;:::-;7621:36;7091:573;-1:-1:-1;;;;7091:573:20:o;3501:424:15:-;-1:-1:-1;;3680:17:15;;3674:24;3728:13;;3791:11;;-1:-1:-1;;3670:35:15;;;;;;3782:20;;3728:13;3782:20;:::i;:::-;:32;;3761:118;;;;-1:-1:-1;;;3761:118:15;;41782:2:21;3761:118:15;;;41764:21:21;41821:2;41801:18;;;41794:30;41860:34;41840:18;;;41833:62;-1:-1:-1;;;41911:18:21;;;41904:37;41958:19;;3761:118:15;41580:403:21;3761:118:15;3889:29;3905:6;3913:4;3889:15;:29::i;2433:187:0:-;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;586:460:19:-;639:15;739:17;759:94;834:5;791:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;759:24;:94::i;:::-;739:114;;949:4;943:11;938:2;932:4;928:13;925:1;918:37;907:48;-1:-1:-1;;;;;;999:21:19;;995:46;;1029:12;;-1:-1:-1;;;1029:12:19;;;;;;;;;;;995:46;656:390;586:460;;;:::o;6469:198:6:-;6552:12;6583:77;6604:6;6612:4;6583:77;;;;;;;;;;;;;;;;;:20;:77::i;574:409:17:-;704:13;759:3;729:21;805;816:10;805:8;:21;:::i;:::-;-1:-1:-1;;;;;795:32:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;795:32:17;-1:-1:-1;773:54:17;-1:-1:-1;854:10:17;837:109;870:8;866:1;:12;837:109;;;924:8;933:1;924:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;924:11:17;899:6;906:14;910:10;906:1;:14;:::i;:::-;899:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;899:36:17;;;;;;;;-1:-1:-1;880:3:17;;;;:::i;:::-;;;;837:109;;;-1:-1:-1;969:6:17;574:409;-1:-1:-1;;;;;574:409:17:o;82:486::-;165:16;226:2;165:16;;263:278;285:7;:14;281:1;:18;;;263:278;;;370:2;354:7;362:1;354:10;;;;;;;;;;:::i;:::-;;;;;;;342:30;;;;341:84;;;422:2;406:7;414:1;406:10;;;;;;;;;;:::i;:::-;;;;;;;394:30;;341:84;320:211;;;458:10;466:2;458:10;;:::i;:::-;;;514:2;500:7;508:1;500:10;;;;;;;;;;:::i;:::-;;;;;494:22;;;500:10;;494:22;:::i;:::-;486:30;;;;:::i;:::-;;;320:211;301:3;;;;:::i;:::-;;;;263:278;;1300:134:19;1355:12;1382:47;1398:8;1408:1;-1:-1:-1;;1382:15:19;:47::i;505:3026:7:-;563:13;795:4;:11;810:1;795:16;791:31;;-1:-1:-1;;813:9:7;;;;;;;;;-1:-1:-1;813:9:7;;;505:3026::o;791:31::-;872:19;894:6;;;;;;;;;;;;;;;;;872:28;;1303:20;1362:1;1343:4;:11;1357:1;1343:15;;;;:::i;:::-;1342:21;;;;:::i;:::-;1337:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;1326:39:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1326:39:7;;1303:62;;1540:1;1533:5;1529:13;1641:2;1633:6;1629:15;1748:4;1799;1793:11;1787:4;1783:22;1711:1403;1832:6;1823:7;1820:19;1711:1403;;;1934:1;1925:7;1921:15;1910:26;;1972:7;1966:14;2615:4;2607:5;2603:2;2599:14;2595:25;2585:8;2581:40;2575:47;2564:9;2556:67;2668:1;2657:9;2653:17;2640:30;;2758:4;2750:5;2746:2;2742:14;2738:25;2728:8;2724:40;2718:47;2707:9;2699:67;2811:1;2800:9;2796:17;2783:30;;2900:4;2892:5;2889:1;2885:13;2881:24;2871:8;2867:39;2861:46;2850:9;2842:66;2953:1;2942:9;2938:17;2925:30;;3034:4;3027:5;3023:16;3013:8;3009:31;3003:38;2992:9;2984:58;;3087:1;3076:9;3072:17;3059:30;;1711:1403;;;1715:104;;3272:1;3265:4;3259:11;3255:19;3292:1;3287:120;;;;3425:1;3420:71;;;;3248:243;;3287:120;3339:4;3335:1;3324:9;3320:17;3312:32;3388:4;3384:1;3373:9;3369:17;3361:32;3287:120;;3420:71;3472:4;3468:1;3457:9;3453:17;3445:32;3248:243;-1:-1:-1;3518:6:7;;505:3026;-1:-1:-1;;;;;505:3026:7:o;28649:697:16:-;28827:88;;-1:-1:-1;;;28827:88:16;;28807:4;;-1:-1:-1;;;;;28827:45:16;;;;;:88;;32960:10;;28894:4;;28900:7;;28909:5;;28827:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28827:88:16;;;;;;;;-1:-1:-1;;28827:88:16;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29105:6;:13;29122:1;29105:18;29101:229;;29150:40;;-1:-1:-1;;;29150:40:16;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;-1:-1:-1;;;;;;28983:64:16;-1:-1:-1;;;28983:64:16;;-1:-1:-1;28649:697:16;;;;;;:::o;9846:184::-;9916:24;;;;:17;:24;;;;;;:29;;9912:112;;9988:25;10007:5;9988:18;:25::i;:::-;9961:24;;;;:17;:24;;;;;:52;9846:184;:::o;7753:468:20:-;7807:6;;7934:11;7967:12;8001:15;8038:16;8086;8101:1;7967:12;8086:16;:::i;:::-;7896:257;;;;;;44281:19:21;;;;44316:12;;44309:28;;;;44353:12;;;;44346:28;;;;44390:12;;;44383:28;8076:27:20;;44427:13:21;;;44420:29;8125:10:20;44484:15:21;;-1:-1:-1;;;;;;44480:45:21;44465:13;;;44458:68;44542:13;;7896:257:20;;;-1:-1:-1;;7896:257:20;;;;;;;;;7869:298;;7896:257;7869:298;;;;;7753:468;-1:-1:-1;;7753:468:20:o;29441:512:16:-;29518:14;29535:24;;;:17;:24;;;;;;;29573:11;;;29569:61;;29593:37;;-1:-1:-1;;;29593:37:16;;;;;;;;;;;29569:61;29640:23;29913:24;;;:17;:24;;;;;;-1:-1:-1;;;;;29823:38:16;;;;2166:3;29866:36;;;;29822:81;29913:33;;29441:512::o;8667:236:20:-;8809:6;-1:-1:-1;;;;;8834:18:20;;;:62;;8879:17;8834:62;;;8855:21;:19;:21::i;9143:358:16:-;9209:31;;:::i;:::-;-1:-1:-1;;;;;9252:41:16;;;;-1:-1:-1;;;;;1661:3:16;9337:32;;;9303:67;:24;;;:67;-1:-1:-1;;;9399:23:16;;:28;;9380:16;;;:47;2166:3;9466:27;;;;9437:19;;;:57;9252:9;9143:358::o;2289:976:15:-;2441:4;2435:11;2499:4;2493;2489:15;2481:23;;2546:6;2540:4;2536:17;2615:4;2606:6;2600:13;2596:24;2588:6;2584:37;2459:698;2645:7;2639:4;2636:17;2459:698;;;3131:11;;3116:27;;2690:4;2680:15;;;;2722:17;2459:698;;;-1:-1:-1;;3226:13:15;;3222:26;3207:42;;;-1:-1:-1;2289:976:15:o;378:700:14:-;446:12;1002:5;:12;1062:5;956:117;;;;;;;;;:::i;:::-;;;;;;;;;;;;;949:124;;378:700;;;:::o;6853:325:6:-;6994:12;7019;7033:23;7060:6;-1:-1:-1;;;;;7060:19:6;7080:4;7060:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7018:67;;;;7102:69;7129:6;7137:7;7146:10;7158:12;7102:26;:69::i;:::-;7095:76;6853:325;-1:-1:-1;;;;;;6853:325:6:o;1793:946:14:-;1877:18;1356;;1903:13;1944:10;;;1940:32;;-1:-1:-1;;1963:9:14;;;;;;;;;-1:-1:-1;1963:9:14;;1956:16;;1940:32;1992:5;1983:6;:14;1979:36;;;-1:-1:-1;;2006:9:14;;;;;;;;;-1:-1:-1;2006:9:14;;1999:16;;1979:36;2032:6;2025:4;:13;2021:65;;;2047:39;;-1:-1:-1;;;2047:39:14;;;;;45756:25:21;;;45797:18;;;45790:34;;;45840:18;;;45833:34;;;45729:18;;2047:39:14;45554:319:21;2021:65:14;2130:13;;;2169:14;;;2112:15;2207:17;;;:37;;2237:7;2207:37;;;2227:7;2207:37;2413:4;2407:11;;2501:26;;;-1:-1:-1;;2497:42:14;2486:54;;2473:68;;;2584:19;;;2407:11;-1:-1:-1;2192:52:14;-1:-1:-1;2192:52:14;2708:6;2515:4;2690:16;;2683:5;2671:50;2262:467;;;1897:842;1793:946;;;;;:::o;7466:628:6:-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:6;;;7908:60;;;;-1:-1:-1;;;7908:60:6;;46080:2:21;7908:60:6;;;46062:21:21;46119:2;46099:18;;;46092:30;46158:31;46138:18;;;46131:59;46207:18;;7908:60:6;45878:353:21;7908:60:6;-1:-1:-1;8003:10:6;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:6;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:21;-1:-1:-1;;;;;;88:32:21;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:21;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:21;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:21:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:21;;1348:180;-1:-1:-1;1348:180:21:o;1741:131::-;-1:-1:-1;;;;;1816:31:21;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:21:o;2197:127::-;2258:10;2253:3;2249:20;2246:1;2239:31;2289:4;2286:1;2279:15;2313:4;2310:1;2303:15;2329:253;2401:2;2395:9;2443:4;2431:17;;-1:-1:-1;;;;;2463:34:21;;2499:22;;;2460:62;2457:88;;;2525:18;;:::i;:::-;2561:2;2554:22;2329:253;:::o;2587:::-;2659:2;2653:9;2701:4;2689:17;;-1:-1:-1;;;;;2721:34:21;;2757:22;;;2718:62;2715:88;;;2783:18;;:::i;2845:275::-;2916:2;2910:9;2981:2;2962:13;;-1:-1:-1;;2958:27:21;2946:40;;-1:-1:-1;;;;;3001:34:21;;3037:22;;;2998:62;2995:88;;;3063:18;;:::i;:::-;3099:2;3092:22;2845:275;;-1:-1:-1;2845:275:21:o;3125:531::-;3168:5;3221:3;3214:4;3206:6;3202:17;3198:27;3188:55;;3239:1;3236;3229:12;3188:55;3262:20;;-1:-1:-1;;;;;3294:26:21;;3291:52;;;3323:18;;:::i;:::-;3367:55;3410:2;3391:13;;-1:-1:-1;;3387:27:21;3416:4;3383:38;3367:55;:::i;:::-;3447:2;3438:7;3431:19;3493:3;3486:4;3481:2;3473:6;3469:15;3465:26;3462:35;3459:55;;;3510:1;3507;3500:12;3459:55;3575:2;3568:4;3560:6;3556:17;3549:4;3540:7;3536:18;3523:55;3623:1;3598:16;;;3616:4;3594:27;3587:38;;;;3602:7;3125:531;-1:-1:-1;;;3125:531:21:o;3661:812::-;3777:6;3785;3793;3801;3854:3;3842:9;3833:7;3829:23;3825:33;3822:53;;;3871:1;3868;3861:12;3822:53;3894:23;;;-1:-1:-1;3968:2:21;3953:18;;3940:32;-1:-1:-1;;;;;4021:14:21;;;4018:34;;;4048:1;4045;4038:12;4018:34;4071:50;4113:7;4104:6;4093:9;4089:22;4071:50;:::i;:::-;4061:60;;4174:2;4163:9;4159:18;4146:32;4130:48;;4203:2;4193:8;4190:16;4187:36;;;4219:1;4216;4209:12;4187:36;4242:52;4286:7;4275:8;4264:9;4260:24;4242:52;:::i;:::-;4232:62;;4347:2;4336:9;4332:18;4319:32;4303:48;;4376:2;4366:8;4363:16;4360:36;;;4392:1;4389;4382:12;4360:36;;4415:52;4459:7;4448:8;4437:9;4433:24;4415:52;:::i;:::-;4405:62;;;3661:812;;;;;;;:::o;4478:1543::-;4567:6;4620:2;4608:9;4599:7;4595:23;4591:32;4588:52;;;4636:1;4633;4626:12;4588:52;4663:23;;-1:-1:-1;;;;;4735:14:21;;;4732:34;;;4762:1;4759;4752:12;4732:34;4785:22;;;;4841:4;4823:16;;;4819:27;4816:47;;;4859:1;4856;4849:12;4816:47;4885:22;;:::i;:::-;4945:2;4932:16;4973:2;4963:8;4960:16;4957:36;;;4989:1;4986;4979:12;4957:36;5016:45;5053:7;5042:8;5038:2;5034:17;5016:45;:::i;:::-;5009:5;5002:60;;5108:2;5104;5100:11;5087:25;5137:2;5127:8;5124:16;5121:36;;;5153:1;5150;5143:12;5121:36;5189:45;5226:7;5215:8;5211:2;5207:17;5189:45;:::i;:::-;5184:2;5177:5;5173:14;5166:69;;5281:2;5277;5273:11;5260:25;5310:2;5300:8;5297:16;5294:36;;;5326:1;5323;5316:12;5294:36;5362:45;5399:7;5388:8;5384:2;5380:17;5362:45;:::i;:::-;5357:2;5350:5;5346:14;5339:69;;5454:2;5450;5446:11;5433:25;5483:2;5473:8;5470:16;5467:36;;;5499:1;5496;5489:12;5467:36;5535:45;5572:7;5561:8;5557:2;5553:17;5535:45;:::i;:::-;5530:2;5523:5;5519:14;5512:69;;5627:3;5623:2;5619:12;5606:26;5657:2;5647:8;5644:16;5641:36;;;5673:1;5670;5663:12;5641:36;5710:45;5747:7;5736:8;5732:2;5728:17;5710:45;:::i;:::-;5704:3;5697:5;5693:15;5686:70;;5810:3;5806:2;5802:12;5789:26;5783:3;5776:5;5772:15;5765:51;5862:3;5858:2;5854:12;5841:26;5892:2;5882:8;5879:16;5876:36;;;5908:1;5905;5898:12;5876:36;5945:45;5982:7;5971:8;5967:2;5963:17;5945:45;:::i;:::-;5939:3;5928:15;;5921:70;-1:-1:-1;5932:5:21;4478:1543;-1:-1:-1;;;;;4478:1543:21:o;6026:936::-;6123:6;6131;6139;6147;6155;6208:3;6196:9;6187:7;6183:23;6179:33;6176:53;;;6225:1;6222;6215:12;6176:53;6264:9;6251:23;6283:31;6308:5;6283:31;:::i;:::-;6333:5;-1:-1:-1;6390:2:21;6375:18;;6362:32;6403:33;6362:32;6403:33;:::i;:::-;6455:7;-1:-1:-1;6509:2:21;6494:18;;6481:32;;-1:-1:-1;6564:2:21;6549:18;;6536:32;-1:-1:-1;;;;;6617:14:21;;;6614:34;;;6644:1;6641;6634:12;6614:34;6682:6;6671:9;6667:22;6657:32;;6727:7;6720:4;6716:2;6712:13;6708:27;6698:55;;6749:1;6746;6739:12;6698:55;6789:2;6776:16;6815:2;6807:6;6804:14;6801:34;;;6831:1;6828;6821:12;6801:34;6876:7;6871:2;6862:6;6858:2;6854:15;6850:24;6847:37;6844:57;;;6897:1;6894;6887:12;6844:57;6026:936;;;;-1:-1:-1;6026:936:21;;-1:-1:-1;6928:2:21;6920:11;;6950:6;6026:936;-1:-1:-1;;;6026:936:21:o;7356:160::-;7421:20;;7477:13;;7470:21;7460:32;;7450:60;;7506:1;7503;7496:12;7521:248;7586:6;7594;7647:2;7635:9;7626:7;7622:23;7618:32;7615:52;;;7663:1;7660;7653:12;7615:52;7699:9;7686:23;7676:33;;7728:35;7759:2;7748:9;7744:18;7728:35;:::i;:::-;7718:45;;7521:248;;;;;:::o;7774:456::-;7851:6;7859;7867;7920:2;7908:9;7899:7;7895:23;7891:32;7888:52;;;7936:1;7933;7926:12;7888:52;7975:9;7962:23;7994:31;8019:5;7994:31;:::i;:::-;8044:5;-1:-1:-1;8101:2:21;8086:18;;8073:32;8114:33;8073:32;8114:33;:::i;:::-;7774:456;;8166:7;;-1:-1:-1;;;8220:2:21;8205:18;;;;8192:32;;7774:456::o;8235:180::-;8292:4;-1:-1:-1;;;;;8314:30:21;;8311:56;;;8347:18;;:::i;:::-;-1:-1:-1;8392:1:21;8388:14;8404:4;8384:25;;8235:180::o;8420:956::-;8510:6;8518;8571:2;8559:9;8550:7;8546:23;8542:32;8539:52;;;8587:1;8584;8577:12;8539:52;8610:23;;;-1:-1:-1;8652:2:21;8690:18;;;8677:32;-1:-1:-1;;;;;8721:30:21;;8718:50;;;8764:1;8761;8754:12;8718:50;8787:22;;8840:4;8832:13;;8828:27;-1:-1:-1;8818:55:21;;8869:1;8866;8859:12;8818:55;8905:2;8892:16;8928:57;8944:40;8981:2;8944:40;:::i;:::-;8928:57;:::i;:::-;9019:15;;;9101:1;9097:10;;;;9089:19;;9085:28;;;9050:12;;;;9125:19;;;9122:39;;;9157:1;9154;9147:12;9122:39;9181:11;;;;9201:145;9217:6;9212:3;9209:15;9201:145;;;9283:20;9299:3;9283:20;:::i;:::-;9271:33;;9234:12;;;;9324;;;;9201:145;;;9365:5;9355:15;;;;;;;8420:956;;;;;:::o;9381:1111::-;9798:3;9787:9;9780:22;9761:4;9825:46;9866:3;9855:9;9851:19;9843:6;9825:46;:::i;:::-;9919:9;9911:6;9907:22;9902:2;9891:9;9887:18;9880:50;9953:33;9979:6;9971;9953:33;:::i;:::-;9939:47;;10034:9;10026:6;10022:22;10017:2;10006:9;10002:18;9995:50;10068:33;10094:6;10086;10068:33;:::i;:::-;10054:47;;10149:9;10141:6;10137:22;10132:2;10121:9;10117:18;10110:50;10183:33;10209:6;10201;10183:33;:::i;:::-;10169:47;;10265:9;10257:6;10253:22;10247:3;10236:9;10232:19;10225:51;10299:33;10325:6;10317;10299:33;:::i;:::-;10285:47;;10369:6;10363:3;10352:9;10348:19;10341:35;10425:9;10417:6;10413:22;10407:3;10396:9;10392:19;10385:51;10453:33;10479:6;10471;10453:33;:::i;:::-;10445:41;9381:1111;-1:-1:-1;;;;;;;;;;9381:1111:21:o;10497:322::-;10566:6;10619:2;10607:9;10598:7;10594:23;10590:32;10587:52;;;10635:1;10632;10625:12;10587:52;10662:23;;-1:-1:-1;;;;;10697:30:21;;10694:50;;;10740:1;10737;10730:12;10694:50;10763;10805:7;10796:6;10785:9;10781:22;10763:50;:::i;10824:247::-;10883:6;10936:2;10924:9;10915:7;10911:23;10907:32;10904:52;;;10952:1;10949;10942:12;10904:52;10991:9;10978:23;11010:31;11035:5;11010:31;:::i;11076:2211::-;11195:6;11203;11256:2;11244:9;11235:7;11231:23;11227:32;11224:52;;;11272:1;11269;11262:12;11224:52;11295:23;;;-1:-1:-1;11337:2:21;11375:18;;;11362:32;-1:-1:-1;;;;;11443:14:21;;;11440:34;;;11470:1;11467;11460:12;11440:34;11508:6;11497:9;11493:22;11483:32;;11553:7;11546:4;11542:2;11538:13;11534:27;11524:55;;11575:1;11572;11565:12;11524:55;11611:2;11598:16;11634:57;11650:40;11687:2;11650:40;:::i;11634:57::-;11725:15;;;11807:1;11803:10;;;;11795:19;;11791:28;;;11756:12;;;;11831:19;;;11828:39;;;11863:1;11860;11853:12;11828:39;11895:2;11891;11887:11;11907:1350;11923:6;11918:3;11915:15;11907:1350;;;12009:3;11996:17;12045:2;12032:11;12029:19;12026:109;;;12089:1;12118:2;12114;12107:14;12026:109;12158:20;;12201:4;12229:16;;;-1:-1:-1;;12225:30:21;12221:39;-1:-1:-1;12218:129:21;;;12301:1;12330:2;12326;12319:14;12218:129;12373:22;;:::i;:::-;12445:2;12441;12437:11;12424:25;12478:2;12468:8;12465:16;12462:106;;;12522:1;12551:2;12547;12540:14;12462:106;12595:54;12641:7;12636:2;12625:8;12621:2;12617:17;12613:26;12595:54;:::i;:::-;12588:5;12581:69;;12700:2;12696;12692:11;12679:25;12733:2;12723:8;12720:16;12717:109;;;12778:1;12808:3;12803;12796:16;12717:109;12862:54;12908:7;12903:2;12892:8;12888:2;12884:17;12880:26;12862:54;:::i;:::-;12846:14;;;12839:78;-1:-1:-1;12959:11:21;;;12946:25;;12987:16;;;12984:109;;;13045:1;13075:3;13070;13063:16;12984:109;13129:54;13175:7;13170:2;13159:8;13155:2;13151:17;13147:26;13129:54;:::i;:::-;13124:2;13113:14;;13106:78;13197:18;;-1:-1:-1;;13235:12:21;;;;11940;;11907:1350;;;11911:3;13276:5;13266:15;;;;;;;;11076:2211;;;;;:::o;13292:390::-;13370:6;13378;13431:2;13419:9;13410:7;13406:23;13402:32;13399:52;;;13447:1;13444;13437:12;13399:52;13470:23;;;-1:-1:-1;13544:2:21;13529:18;;13516:32;-1:-1:-1;;;;;13560:30:21;;13557:50;;;13603:1;13600;13593:12;13557:50;13626;13668:7;13659:6;13648:9;13644:22;13626:50;:::i;:::-;13616:60;;;13292:390;;;;;:::o;13687:248::-;13755:6;13763;13816:2;13804:9;13795:7;13791:23;13787:32;13784:52;;;13832:1;13829;13822:12;13784:52;-1:-1:-1;;13855:23:21;;;13925:2;13910:18;;;13897:32;;-1:-1:-1;13687:248:21:o;13940:315::-;14005:6;14013;14066:2;14054:9;14045:7;14041:23;14037:32;14034:52;;;14082:1;14079;14072:12;14034:52;14121:9;14108:23;14140:31;14165:5;14140:31;:::i;:::-;14190:5;-1:-1:-1;14214:35:21;14245:2;14230:18;;14214:35;:::i;14260:626::-;14357:6;14365;14418:2;14406:9;14397:7;14393:23;14389:32;14386:52;;;14434:1;14431;14424:12;14386:52;14461:23;;-1:-1:-1;;;;;14533:14:21;;;14530:34;;;14560:1;14557;14550:12;14530:34;14598:6;14587:9;14583:22;14573:32;;14643:7;14636:4;14632:2;14628:13;14624:27;14614:55;;14665:1;14662;14655:12;14614:55;14705:2;14692:16;14731:2;14723:6;14720:14;14717:34;;;14747:1;14744;14737:12;14717:34;14800:7;14795:2;14785:6;14782:1;14778:14;14774:2;14770:23;14766:32;14763:45;14760:65;;;14821:1;14818;14811:12;14760:65;14852:2;14844:11;;;;;14874:6;;-1:-1:-1;14260:626:21;;-1:-1:-1;;;;14260:626:21:o;14891:801::-;15051:4;15080:2;15120;15109:9;15105:18;15150:2;15139:9;15132:21;15173:6;15208;15202:13;15239:6;15231;15224:22;15277:2;15266:9;15262:18;15255:25;;15339:2;15329:6;15326:1;15322:14;15311:9;15307:30;15303:39;15289:53;;15377:2;15369:6;15365:15;15398:1;15408:255;15422:6;15419:1;15416:13;15408:255;;;15515:2;15511:7;15499:9;15491:6;15487:22;15483:36;15478:3;15471:49;15543:40;15576:6;15567;15561:13;15543:40;:::i;:::-;15533:50;-1:-1:-1;15641:12:21;;;;15606:15;;;;15444:1;15437:9;15408:255;;;-1:-1:-1;15680:6:21;;14891:801;-1:-1:-1;;;;;;;14891:801:21:o;15697:390::-;15775:6;15783;15836:2;15824:9;15815:7;15811:23;15807:32;15804:52;;;15852:1;15849;15842:12;15804:52;15879:23;;-1:-1:-1;;;;;15914:30:21;;15911:50;;;15957:1;15954;15947:12;15911:50;15980;16022:7;16013:6;16002:9;15998:22;15980:50;:::i;:::-;15970:60;16077:2;16062:18;;;;16049:32;;-1:-1:-1;;;;15697:390:21:o;16092:666::-;16187:6;16195;16203;16211;16264:3;16252:9;16243:7;16239:23;16235:33;16232:53;;;16281:1;16278;16271:12;16232:53;16320:9;16307:23;16339:31;16364:5;16339:31;:::i;:::-;16389:5;-1:-1:-1;16446:2:21;16431:18;;16418:32;16459:33;16418:32;16459:33;:::i;:::-;16511:7;-1:-1:-1;16565:2:21;16550:18;;16537:32;;-1:-1:-1;16620:2:21;16605:18;;16592:32;-1:-1:-1;;;;;16636:30:21;;16633:50;;;16679:1;16676;16669:12;16633:50;16702;16744:7;16735:6;16724:9;16720:22;16702:50;:::i;16763:680::-;16869:6;16877;16885;16893;16946:3;16934:9;16925:7;16921:23;16917:33;16914:53;;;16963:1;16960;16953:12;16914:53;16986:23;;;-1:-1:-1;17056:2:21;17041:18;;17028:32;;-1:-1:-1;17111:2:21;17096:18;;17083:32;-1:-1:-1;;;;;17164:14:21;;;17161:34;;;17191:1;17188;17181:12;17448:388;17516:6;17524;17577:2;17565:9;17556:7;17552:23;17548:32;17545:52;;;17593:1;17590;17583:12;17545:52;17632:9;17619:23;17651:31;17676:5;17651:31;:::i;:::-;17701:5;-1:-1:-1;17758:2:21;17743:18;;17730:32;17771:33;17730:32;17771:33;:::i;:::-;17823:7;17813:17;;;17448:388;;;;;:::o;17841:380::-;17920:1;17916:12;;;;17963;;;17984:61;;18038:4;18030:6;18026:17;18016:27;;17984:61;18091:2;18083:6;18080:14;18060:18;18057:38;18054:161;;18137:10;18132:3;18128:20;18125:1;18118:31;18172:4;18169:1;18162:15;18200:4;18197:1;18190:15;18352:545;18454:2;18449:3;18446:11;18443:448;;;18490:1;18515:5;18511:2;18504:17;18560:4;18556:2;18546:19;18630:2;18618:10;18614:19;18611:1;18607:27;18601:4;18597:38;18666:4;18654:10;18651:20;18648:47;;;-1:-1:-1;18689:4:21;18648:47;18744:2;18739:3;18735:12;18732:1;18728:20;18722:4;18718:31;18708:41;;18799:82;18817:2;18810:5;18807:13;18799:82;;;18862:17;;;18843:1;18832:13;18799:82;;19073:1352;19193:10;;-1:-1:-1;;;;;19215:30:21;;19212:56;;;19248:18;;:::i;:::-;19277:97;19367:6;19327:38;19359:4;19353:11;19327:38;:::i;:::-;19321:4;19277:97;:::i;:::-;19429:4;;19493:2;19482:14;;19510:1;19505:663;;;;20212:1;20229:6;20226:89;;;-1:-1:-1;20281:19:21;;;20275:26;20226:89;-1:-1:-1;;19030:1:21;19026:11;;;19022:24;19018:29;19008:40;19054:1;19050:11;;;19005:57;20328:81;;19475:944;;19505:663;18299:1;18292:14;;;18336:4;18323:18;;-1:-1:-1;;19541:20:21;;;19659:236;19673:7;19670:1;19667:14;19659:236;;;19762:19;;;19756:26;19741:42;;19854:27;;;;19822:1;19810:14;;;;19689:19;;19659:236;;;19663:3;19923:6;19914:7;19911:19;19908:201;;;19984:19;;;19978:26;-1:-1:-1;;20067:1:21;20063:14;;;20079:3;20059:24;20055:37;20051:42;20036:58;20021:74;;19908:201;-1:-1:-1;;;;;20155:1:21;20139:14;;;20135:22;20122:36;;-1:-1:-1;19073:1352:21:o;20430:640::-;20710:3;20748:6;20742:13;20764:66;20823:6;20818:3;20811:4;20803:6;20799:17;20764:66;:::i;:::-;-1:-1:-1;;;20852:16:21;;;20877:18;;;20920:13;;20942:78;20920:13;21007:1;20996:13;;20989:4;20977:17;;20942:78;:::i;:::-;21040:20;21062:1;21036:28;;20430:640;-1:-1:-1;;;;20430:640:21:o;21075:783::-;21396:6;21385:9;21378:25;21439:3;21434:2;21423:9;21419:18;21412:31;21359:4;21466:46;21507:3;21496:9;21492:19;21484:6;21466:46;:::i;:::-;21560:9;21552:6;21548:22;21543:2;21532:9;21528:18;21521:50;21594:33;21620:6;21612;21594:33;:::i;:::-;21580:47;;21675:9;21667:6;21663:22;21658:2;21647:9;21643:18;21636:50;21709:33;21735:6;21727;21709:33;:::i;:::-;21695:47;;21791:9;21783:6;21779:22;21773:3;21762:9;21758:19;21751:51;21819:33;21845:6;21837;21819:33;:::i;:::-;21811:41;21075:783;-1:-1:-1;;;;;;;;21075:783:21:o;21863:251::-;21933:6;21986:2;21974:9;21965:7;21961:23;21957:32;21954:52;;;22002:1;21999;21992:12;21954:52;22034:9;22028:16;22053:31;22078:5;22053:31;:::i;22119:127::-;22180:10;22175:3;22171:20;22168:1;22161:31;22211:4;22208:1;22201:15;22235:4;22232:1;22225:15;22251:135;22290:3;22311:17;;;22308:43;;22331:18;;:::i;:::-;-1:-1:-1;22378:1:21;22367:13;;22251:135::o;22654:127::-;22715:10;22710:3;22706:20;22703:1;22696:31;22746:4;22743:1;22736:15;22770:4;22767:1;22760:15;22786:713;22950:4;22998:2;22987:9;22983:18;23028:6;23017:9;23010:25;23054:2;23092;23087;23076:9;23072:18;23065:30;23115:6;23150;23144:13;23181:6;23173;23166:22;23219:2;23208:9;23204:18;23197:25;;23257:2;23249:6;23245:15;23231:29;;23278:1;23288:185;23302:6;23299:1;23296:13;23288:185;;;23377:13;;23370:21;23363:29;23351:42;;23448:15;;;;23413:12;;;;23324:1;23317:9;23288:185;;;-1:-1:-1;23490:3:21;;22786:713;-1:-1:-1;;;;;;;22786:713:21:o;23504:125::-;23569:9;;;23590:10;;;23587:36;;;23603:18;;:::i;23634:168::-;23707:9;;;23738;;23755:15;;;23749:22;;23735:37;23725:71;;23776:18;;:::i;23807:128::-;23874:9;;;23895:11;;;23892:37;;;23909:18;;:::i;23940:127::-;24001:10;23996:3;23992:20;23989:1;23982:31;24032:4;24029:1;24022:15;24056:4;24053:1;24046:15;24072:112;24104:1;24130;24120:35;;24135:18;;:::i;:::-;-1:-1:-1;24169:9:21;;24072:112::o;24506:291::-;24683:6;24672:9;24665:25;24726:2;24721;24710:9;24706:18;24699:30;24646:4;24746:45;24787:2;24776:9;24772:18;24764:6;24746:45;:::i;25055:521::-;25132:4;25138:6;25198:11;25185:25;25292:2;25288:7;25277:8;25261:14;25257:29;25253:43;25233:18;25229:68;25219:96;;25311:1;25308;25301:12;25219:96;25338:33;;25390:20;;;-1:-1:-1;;;;;;25422:30:21;;25419:50;;;25465:1;25462;25455:12;25419:50;25498:4;25486:17;;-1:-1:-1;25529:14:21;25525:27;;;25515:38;;25512:58;;;25566:1;25563;25556:12;25512:58;25055:521;;;;;:::o;25581:474::-;25813:3;25851:6;25845:13;25867:66;25926:6;25921:3;25914:4;25906:6;25902:17;25867:66;:::i;:::-;-1:-1:-1;;;25955:16:21;;25980:39;;;-1:-1:-1;26046:2:21;26035:14;;25581:474;-1:-1:-1;25581:474:21:o;26060:722::-;26110:3;26151:5;26145:12;26180:36;26206:9;26180:36;:::i;:::-;26235:1;26252:18;;;26279:133;;;;26426:1;26421:355;;;;26245:531;;26279:133;-1:-1:-1;;26312:24:21;;26300:37;;26385:14;;26378:22;26366:35;;26357:45;;;-1:-1:-1;26279:133:21;;26421:355;26452:5;26449:1;26442:16;26481:4;26526:2;26523:1;26513:16;26551:1;26565:165;26579:6;26576:1;26573:13;26565:165;;;26657:14;;26644:11;;;26637:35;26700:16;;;;26594:10;;26565:165;;;26569:3;;;26759:6;26754:3;26750:16;26743:23;;26245:531;;;;;26060:722;;;;:::o;26787:835::-;-1:-1:-1;;;27291:3:21;27284:20;27266:3;27323:46;27366:1;27361:3;27357:11;27349:6;27323:46;:::i;:::-;-1:-1:-1;;;27385:2:21;27378:22;27429:6;27423:13;27445:73;27511:6;27507:1;27503:2;27499:10;27492:4;27484:6;27480:17;27445:73;:::i;:::-;-1:-1:-1;;;27576:1:21;27537:15;;;;27568:10;;;27561:28;27613:2;27605:11;;26787:835;-1:-1:-1;;;;26787:835:21:o;27627:1321::-;-1:-1:-1;;;28131:3:21;28124:20;28106:3;28163:46;28206:1;28201:3;28197:11;28189:6;28163:46;:::i;:::-;-1:-1:-1;;;28225:2:21;28218:22;28269:6;28263:13;28285:73;28351:6;28347:1;28343:2;28339:10;28332:4;28324:6;28320:17;28285:73;:::i;:::-;28420:34;28416:1;28377:15;;;;28408:10;;;28401:54;28484:34;28479:2;28471:11;;28464:55;28548:34;28543:2;28535:11;;28528:55;28613:34;28607:3;28599:12;;28592:56;28678:34;28672:3;28664:12;;28657:56;28743:34;28737:3;28729:12;;28722:56;28808:66;28802:3;28794:12;;28787:88;-1:-1:-1;;;28899:3:21;28891:12;;28884:30;28938:3;28930:12;;27627:1321;-1:-1:-1;;;;27627:1321:21:o;28953:458::-;-1:-1:-1;;;29210:3:21;29203:41;29185:3;29273:6;29267:13;29289:75;29357:6;29352:2;29347:3;29343:12;29336:4;29328:6;29324:17;29289:75;:::i;:::-;29384:16;;;;29402:2;29380:25;;28953:458;-1:-1:-1;;28953:458:21:o;29416:802::-;-1:-1:-1;;;29910:55:21;;29892:3;29984:47;30027:2;30018:12;;30010:6;29984:47;:::i;:::-;-1:-1:-1;;;30040:46:21;;30105;30147:2;30139:11;;30131:6;30105:46;:::i;:::-;-1:-1:-1;;;30160:26:21;;30210:1;30202:10;;29416:802;-1:-1:-1;;;;;29416:802:21:o;30223:358::-;-1:-1:-1;;;30470:43:21;;30452:3;30529:46;30572:1;30563:11;;30555:6;30529:46;:::i;30586:874::-;-1:-1:-1;;;31090:3:21;31083:16;31065:3;31128:6;31122:13;31144:74;31211:6;31207:1;31202:3;31198:11;31191:4;31183:6;31179:17;31144:74;:::i;:::-;-1:-1:-1;;;31277:1:21;31237:16;;;31269:10;;;31262:66;31347:46;31389:2;31381:11;;31373:6;31347:46;:::i;:::-;-1:-1:-1;;;31402:26:21;;31452:1;31444:10;;30586:874;-1:-1:-1;;;;;30586:874:21:o;31465:550::-;-1:-1:-1;;;31760:43:21;;31742:3;31822:46;31865:1;31856:11;;31848:6;31822:46;:::i;:::-;31897:6;31891:13;31913:65;31971:6;31967:2;31960:4;31952:6;31948:17;31913:65;:::i;:::-;31994:15;;31465:550;-1:-1:-1;;;;31465:550:21:o;32020:1148::-;-1:-1:-1;;;;;;;;;;;32378:3:21;32371:79;32480:66;32475:2;32470:3;32466:12;32459:88;32577:34;32572:2;32567:3;32563:12;32556:56;32642:66;32637:2;32632:3;32628:12;32621:88;32740:66;32734:3;32729;32725:13;32718:89;32838:66;32832:3;32827;32823:13;32816:89;32353:3;32934:6;32928:13;32950:74;33017:6;33011:3;33006;33002:13;32997:2;32989:6;32985:15;32950:74;:::i;:::-;-1:-1:-1;;;33083:3:21;33043:16;;;;33075:12;;;33068:66;-1:-1:-1;33158:3:21;33150:12;;32020:1148;-1:-1:-1;32020:1148:21:o;33173:644::-;-1:-1:-1;;;33524:61:21;;33608:13;;33506:3;;33630:75;33608:13;33693:2;33684:12;;33677:4;33665:17;;33630:75;:::i;:::-;-1:-1:-1;;;33764:2:21;33724:16;;;;33756:11;;;33749:35;-1:-1:-1;33808:2:21;33800:11;;33173:644;-1:-1:-1;33173:644:21:o;33822:1062::-;-1:-1:-1;;;;;;;;;;;34180:3:21;34173:79;34282:66;34277:2;34272:3;34268:12;34261:88;34379:66;34374:2;34369:3;34365:12;34358:88;34476:66;34471:2;34466:3;34462:12;34455:88;34583:36;34578:3;34574:46;34568:3;34563;34559:13;34552:69;34155:3;34650:6;34644:13;34666:74;34733:6;34727:3;34722;34718:13;34713:2;34705:6;34701:15;34666:74;:::i;:::-;-1:-1:-1;;;34799:3:21;34759:16;;;;34791:12;;;34784:66;-1:-1:-1;34874:3:21;34866:12;;33822:1062;-1:-1:-1;33822:1062:21:o;34889:636::-;-1:-1:-1;;;35240:53:21;;35316:13;;35222:3;;35338:75;35316:13;35401:2;35392:12;;35385:4;35373:17;;35338:75;:::i;:::-;-1:-1:-1;;;35472:2:21;35432:16;;;;35464:11;;;35457:35;-1:-1:-1;35516:2:21;35508:11;;34889:636;-1:-1:-1;34889:636:21:o;35530:623::-;-1:-1:-1;;;35881:51:21;;35955:13;;35863:3;;35977:75;35955:13;36040:2;36031:12;;36024:4;36012:17;;35977:75;:::i;:::-;-1:-1:-1;;;36111:2:21;36071:16;;;;36103:11;;;36096:24;-1:-1:-1;36144:2:21;36136:11;;35530:623;-1:-1:-1;35530:623:21:o;36158:461::-;36420:31;36415:3;36408:44;36390:3;36481:6;36475:13;36497:75;36565:6;36560:2;36555:3;36551:12;36544:4;36536:6;36532:17;36497:75;:::i;:::-;36592:16;;;;36610:2;36588:25;;36158:461;-1:-1:-1;;36158:461:21:o;36624:527::-;36877:6;36866:9;36859:25;36920:6;36915:2;36904:9;36900:18;36893:34;36963:3;36958:2;36947:9;36943:18;36936:31;36840:4;36990:46;37031:3;37020:9;37016:19;37008:6;36990:46;:::i;:::-;37084:9;37076:6;37072:22;37067:2;37056:9;37052:18;37045:50;37112:33;37138:6;37130;37112:33;:::i;:::-;37104:41;36624:527;-1:-1:-1;;;;;;;36624:527:21:o;37156:2296::-;-1:-1:-1;;;38383:43:21;;38365:3;38445:46;38488:1;38479:11;;38471:6;38445:46;:::i;:::-;-1:-1:-1;;;38500:58:21;;38577:46;38619:2;38611:11;;38603:6;38577:46;:::i;:::-;-1:-1:-1;;;38632:46:21;;38567:56;-1:-1:-1;38697:46:21;38739:2;38731:11;;38723:6;38697:46;:::i;:::-;-1:-1:-1;;;38752:48:21;;38687:56;-1:-1:-1;38819:46:21;38861:2;38853:11;;38845:6;38819:46;:::i;:::-;-1:-1:-1;;;38874:62:21;;38809:56;-1:-1:-1;38955:46:21;38997:2;38989:11;;38981:6;38955:46;:::i;:::-;-1:-1:-1;;;39010:79:21;;39112:13;;38945:56;;-1:-1:-1;39134:74:21;39112:13;39196:2;39188:11;;39181:4;39169:17;;39134:74;:::i;:::-;-1:-1:-1;;;39266:2:21;39227:15;;;;39258:11;;;39251:69;39339:46;39381:2;39373:11;;39365:6;39339:46;:::i;:::-;-1:-1:-1;;;39394:26:21;;39444:1;39436:10;;37156:2296;-1:-1:-1;;;;;;;;;;37156:2296:21:o;41988:427::-;42248:1;42243:3;42236:14;42218:3;42279:6;42273:13;42295:74;42362:6;42358:1;42353:3;42349:11;42342:4;42334:6;42330:17;42295:74;:::i;:::-;42389:16;;;;42407:1;42385:24;;41988:427;-1:-1:-1;;41988:427:21:o;42420:225::-;42524:4;42503:12;;;42517;;;42499:31;42550:22;;;;42591:24;;;42581:58;;42619:18;;:::i;42650:151::-;42740:4;42733:12;;;42719;;;42715:31;;42758:14;;42755:40;;;42775:18;;:::i;42806:148::-;42894:4;42873:12;;;42887;;;42869:31;;42912:13;;42909:39;;;42928:18;;:::i;42959:175::-;42996:3;43040:4;43033:5;43029:16;43069:4;43060:7;43057:17;43054:43;;43077:18;;:::i;:::-;43126:1;43113:15;;42959:175;-1:-1:-1;;42959:175:21:o;43139:120::-;43179:1;43205;43195:35;;43210:18;;:::i;:::-;-1:-1:-1;43244:9:21;;43139:120::o;43264:489::-;-1:-1:-1;;;;;43533:15:21;;;43515:34;;43585:15;;43580:2;43565:18;;43558:43;43632:2;43617:18;;43610:34;;;43680:3;43675:2;43660:18;;43653:31;;;43458:4;;43701:46;;43727:19;;43719:6;43701:46;:::i;43758:249::-;43827:6;43880:2;43868:9;43859:7;43855:23;43851:32;43848:52;;;43896:1;43893;43886:12;43848:52;43928:9;43922:16;43947:30;43971:5;43947:30;:::i;44566:691::-;-1:-1:-1;;;44941:16:21;;45012:3;44990:16;;;-1:-1:-1;;;;;;44986:43:21;44982:1;44973:11;;44966:64;-1:-1:-1;;;45055:1:21;45046:11;;45039:51;45113:13;;-1:-1:-1;;45135:75:21;45113:13;45198:2;45189:12;;45182:4;45170:17;;45135:75;:::i;:::-;45230:16;;;;45248:2;45226:25;;44566:691;-1:-1:-1;;;44566:691:21:o;45262:287::-;45391:3;45429:6;45423:13;45445:66;45504:6;45499:3;45492:4;45484:6;45480:17;45445:66;:::i;:::-;45527:16;;;;;45262:287;-1:-1:-1;;45262:287:21:o

Swarm Source

ipfs://8bc6f5a3bf8014a7e6bd8281c6c9c9c5e66a8c82657506e82a754a87b363617e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.