false
false

Contract Address Details

0xbb6ECE56E46dd88237f8146B1dC24e99222F0366

Contract Name
Copyright
Creator
0x9d71fb–e005bc at 0x95320f–5cdd99
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
2 Transactions
Transfers
0 Transfers
Gas Used
894,682
Last Balance Update
3601613
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Copyright




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
200
Verified at
2023-04-22T09:48:21.270233Z

contracts/Copyright.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./CopyrightType.sol";

contract Copyright {
    address public immutable owner;

    mapping(bytes32 => License) public license; // licenseUriHash - License
    mapping(address => bytes32[]) public licensorLicenseList; // licensorAddress - licenseUriHash list

    mapping(bytes32 => SingleTrackInfo) public singleTrackInfo; // musicUriHash - SingleTrackInfo
    mapping(address => bytes32[]) public singerTrackList; // singerAddress - musicUriHash list

    mapping(bytes32 => bytes32) public trackLicenseMapping; // musicUriHash - licenseUriHash

    mapping(bytes32 => bool) public trackValidation; // musicUriHash - isValid boolean

    event RegisterTrack(bytes32 musicUriHash, bytes32 licenseUriHash);
    event TrackValidationUpdate(bytes32 musicUriHash, bool isValid);

    constructor() {
        owner = msg.sender;
    }

    modifier singerOnly(address[] memory singerList) {
        bool isAuthorized = false;
        for (uint256 i = 0; i < singerList.length; i++) {
            if (singerList[i] == msg.sender) {
                isAuthorized = true;
                break;
            }
        }
        require(isAuthorized, "Caller not singer");
        _;
    }

    modifier ownerOnly() {
        require(msg.sender == owner, "Caller not owner");
        _;
    }

    function registerTrack(
        License memory _license,
        SingleTrackInfo memory _trackInfo
    ) external singerOnly(_trackInfo.singerWalletAddressList) {
        // generate musicUriHash
        bytes32 musicUriHash = keccak256(abi.encodePacked(_trackInfo.musicUri));

        // generate licenseUriHash
        bytes32 licenseUriHash = keccak256(
            abi.encodePacked(_license.licenseUri)
        );

        // check track info is not registered yet
        require(
            bytes(singleTrackInfo[musicUriHash].musicUri).length == 0,
            "musicUriHash registered"
        );

        // check license is not registered yet
        require(
            bytes(license[licenseUriHash].licenseUri).length == 0,
            "licenseUriHash registered"
        );

        singleTrackInfo[musicUriHash] = _trackInfo;
        license[licenseUriHash] = _license;
        trackLicenseMapping[musicUriHash] = licenseUriHash;

        trackValidation[musicUriHash] = true;

        addSingerTrackList(musicUriHash, _trackInfo.singerWalletAddressList);
        addLicensorLicenseList(licenseUriHash, _license.licensorWalletAddress);

        emit RegisterTrack(musicUriHash, licenseUriHash);
    }

    function addSingerTrackList(
        bytes32 musicUriHash,
        address[] memory singerList
    ) private {
        for (uint256 i = 0; i < singerList.length; i++) {
            singerTrackList[singerList[i]].push(musicUriHash);
        }
    }

    function addLicensorLicenseList(bytes32 licenseUriHash, address licensor)
        private
    {
        licensorLicenseList[licensor].push(licenseUriHash);
    }

    function getSingerTrackListLength(address singerWalletAddress)
        external
        view
        returns (uint256)
    {
        return singerTrackList[singerWalletAddress].length;
    }

    function getLicensorLicenseListLength(address licensorWalletAddress)
        external
        view
        returns (uint256)
    {
        return licensorLicenseList[licensorWalletAddress].length;
    }

    function manageTrackValidation(bytes32 musicUriHash, bool isValid)
        external
        ownerOnly
    {
        trackValidation[musicUriHash] = isValid;

        emit TrackValidationUpdate(musicUriHash, isValid);
    }

    function isTrackValidAndNotExpired(bytes32 musicUriHash)
        external
        view
        returns (bool)
    {
        bytes32 licenseUriHash = trackLicenseMapping[musicUriHash];
        require(licenseUriHash != bytes32(0), "license not found");

        bool isLicenseExpiredResult = isLicenseExpired(licenseUriHash);

        return trackValidation[musicUriHash] && !isLicenseExpiredResult;
    }

    function isLicenseExpired(bytes32 licenseUriHash)
        public
        view
        returns (bool)
    {
        require(
            bytes(license[licenseUriHash].licenseUri).length != 0,
            "license not found"
        );

        uint256 licenseExpirationTimestamp = license[licenseUriHash]
            .startTimeStamp + license[licenseUriHash].durationInSecond;

        return block.timestamp > licenseExpirationTimestamp;
    }
}
        

contracts/CopyrightType.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

struct License {
    string licenseUri;
    uint256 startTimeStamp;
    uint256 durationInSecond;
    address licensorWalletAddress;
}

struct SingleTrackInfo {
    string musicUri;
    string coverUri;
    address[] singerWalletAddressList;
    string title;
    TrackGenre genre;
    uint16 bpm;
}

enum TrackGenre {
  POPULAR_MUSCI,
  HIP_HOP_MUSIC,
  BULES,
  SOUL_MUSIC,
  REGGAE,
  ELECTRONIC_MUSIC,
  ROCK,
  JAZZ,
  CLASSICAL_MUSIC,
  FUNK,
  DISCO,
  HOUSE_MUSIC,
  OPERA,
  ELECTRO,
  OTHERS
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"RegisterTrack","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32","indexed":false},{"type":"bytes32","name":"licenseUriHash","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"TrackValidationUpdate","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32","indexed":false},{"type":"bool","name":"isValid","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLicensorLicenseListLength","inputs":[{"type":"address","name":"licensorWalletAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getSingerTrackListLength","inputs":[{"type":"address","name":"singerWalletAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLicenseExpired","inputs":[{"type":"bytes32","name":"licenseUriHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTrackValidAndNotExpired","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"licenseUri","internalType":"string"},{"type":"uint256","name":"startTimeStamp","internalType":"uint256"},{"type":"uint256","name":"durationInSecond","internalType":"uint256"},{"type":"address","name":"licensorWalletAddress","internalType":"address"}],"name":"license","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"licensorLicenseList","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manageTrackValidation","inputs":[{"type":"bytes32","name":"musicUriHash","internalType":"bytes32"},{"type":"bool","name":"isValid","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerTrack","inputs":[{"type":"tuple","name":"_license","internalType":"struct License","components":[{"type":"string","name":"licenseUri","internalType":"string"},{"type":"uint256","name":"startTimeStamp","internalType":"uint256"},{"type":"uint256","name":"durationInSecond","internalType":"uint256"},{"type":"address","name":"licensorWalletAddress","internalType":"address"}]},{"type":"tuple","name":"_trackInfo","internalType":"struct SingleTrackInfo","components":[{"type":"string","name":"musicUri","internalType":"string"},{"type":"string","name":"coverUri","internalType":"string"},{"type":"address[]","name":"singerWalletAddressList","internalType":"address[]"},{"type":"string","name":"title","internalType":"string"},{"type":"uint8","name":"genre","internalType":"enum TrackGenre"},{"type":"uint16","name":"bpm","internalType":"uint16"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"singerTrackList","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"musicUri","internalType":"string"},{"type":"string","name":"coverUri","internalType":"string"},{"type":"string","name":"title","internalType":"string"},{"type":"uint8","name":"genre","internalType":"enum TrackGenre"},{"type":"uint16","name":"bpm","internalType":"uint16"}],"name":"singleTrackInfo","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"trackLicenseMapping","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"trackValidation","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]}]
              

Contract Creation Code

0x60a060405234801561001057600080fd5b503360805260805161122761003760003960008181610215015261079e01526112276000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806358bdf27f1161008c57806381cfa3b91161006657806381cfa3b9146101e75780638da5cb5b14610210578063a8ab9fc41461024f578063ea7a23a31461026257600080fd5b806358bdf27f1461019857806371689ed1146101c1578063742b7741146101d457600080fd5b80630444e110146100d457806306e3844d146100fc57806313d8f6191461012a5780633d0bcfa91461013f5780634024db80146101625780634c88662a14610185575b600080fd5b6100e76100e2366004610c2a565b610286565b60405190151581526020015b60405180910390f35b61011c61010a366004610c2a565b60046020526000908152604090205481565b6040519081526020016100f3565b61013d610138366004610ee5565b61030d565b005b6100e761014d366004610c2a565b60056020526000908152604090205460ff1681565b610175610170366004610c2a565b6106a7565b6040516100f39493929190610ff8565b61011c610193366004611030565b610762565b61011c6101a636600461105a565b6001600160a01b031660009081526003602052604090205490565b61013d6101cf36600461107c565b610793565b6100e76101e2366004610c2a565b610857565b61011c6101f536600461105a565b6001600160a01b031660009081526001602052604090205490565b6102377f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100f3565b61011c61025d366004611030565b6108e0565b610275610270366004610c2a565b6108fc565b6040516100f39594939291906110c7565b600081815260046020526040812054806102db5760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064015b60405180910390fd5b60006102e682610857565b60008581526005602052604090205490915060ff168015610305575080155b949350505050565b80604001516000805b825181101561036d57336001600160a01b031683828151811061033b5761033b61113b565b60200260200101516001600160a01b0316141561035b576001915061036d565b8061036581611167565b915050610316565b50806103af5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9103737ba1039b4b733b2b960791b60448201526064016102d2565b82516040516000916103c391602001611182565b60408051601f1981840301815290829052805160209182012087519093506000926103ee9201611182565b60408051601f1981840301815291815281516020928301206000858152600290935291208054919250906104219061119e565b1590506104705760405162461bcd60e51b815260206004820152601760248201527f6d7573696355726948617368207265676973746572656400000000000000000060448201526064016102d2565b600081815260208190526040902080546104899061119e565b1590506104d85760405162461bcd60e51b815260206004820152601960248201527f6c6963656e73655572694861736820726567697374657265640000000000000060448201526064016102d2565b60008281526002602090815260409091208651805188936104fd928492910190610b3c565b5060208281015180516105169260018501920190610b3c565b5060408201518051610532916002840191602090910190610bc0565b506060820151805161054e916003840191602090910190610b3c565b50608082015160048201805460ff1916600183600e811115610572576105726110b1565b021790555060a091909101516004909101805461ffff9092166101000262ffff00199092169190911790556000818152602081815260409091208751805189936105c0928492910190610b3c565b506020828101516001838101919091556040808501516002850155606090940151600390930180546001600160a01b0319166001600160a01b03909416939093179092556000858152600482528381208590556005909152829020805460ff19169091179055850151610634908390610acb565b6106668187606001516001600160a01b0316600090815260016020818152604083208054928301815583529091200155565b60408051838152602081018390527fb67d8104e28f72b24d5e1f1b3412956f7c2ad9942d467b2cb9df21e6f412a13c910160405180910390a1505050505050565b6000602081905290815260409020805481906106c29061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546106ee9061119e565b801561073b5780601f106107105761010080835404028352916020019161073b565b820191906000526020600020905b81548152906001019060200180831161071e57829003601f168201915b5050505060018301546002840154600390940154929390929091506001600160a01b031684565b6001602052816000526040600020818154811061077e57600080fd5b90600052602060002001600091509150505481565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107fe5760405162461bcd60e51b815260206004820152601060248201526f21b0b63632b9103737ba1037bbb732b960811b60448201526064016102d2565b600082815260056020908152604091829020805460ff19168415159081179091558251858152918201527fca7e640d2d483c720a548e3a630ccd7ca04b55ec7ddcd0b5fea6493c52f89b67910160405180910390a15050565b600081815260208190526040812080546108709061119e565b151590506108b45760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064016102d2565b600082815260208190526040812060028101546001909101546108d791906111d9565b42119392505050565b6003602052816000526040600020818154811061077e57600080fd5b6002602052600090815260409020805481906109179061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109439061119e565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050908060010180546109a59061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109d19061119e565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806003018054610a339061119e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061119e565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050506004909301549192505060ff81169061ffff6101009091041685565b60005b8151811015610b375760036000838381518110610aed57610aed61113b565b6020908102919091018101516001600160a01b0316825281810192909252604001600090812080546001810182559082529190200183905580610b2f81611167565b915050610ace565b505050565b828054610b489061119e565b90600052602060002090601f016020900481019282610b6a5760008555610bb0565b82601f10610b8357805160ff1916838001178555610bb0565b82800160010185558215610bb0579182015b82811115610bb0578251825591602001919060010190610b95565b50610bbc929150610c15565b5090565b828054828255906000526020600020908101928215610bb0579160200282015b82811115610bb057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610be0565b5b80821115610bbc5760008155600101610c16565b600060208284031215610c3c57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b604051601f8201601f1916810167ffffffffffffffff81118282101715610cce57610cce610c43565b604052919050565b600082601f830112610ce757600080fd5b813567ffffffffffffffff811115610d0157610d01610c43565b610d14601f8201601f1916602001610ca5565b818152846020838601011115610d2957600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b0381168114610d5d57600080fd5b919050565b600082601f830112610d7357600080fd5b8135602067ffffffffffffffff821115610d8f57610d8f610c43565b8160051b610d9e828201610ca5565b9283528481018201928281019087851115610db857600080fd5b83870192505b84831015610dde57610dcf83610d46565b82529183019190830190610dbe565b979650505050505050565b8035600f8110610d5d57600080fd5b803561ffff81168114610d5d57600080fd5b600060c08284031215610e1c57600080fd5b610e24610c59565b9050813567ffffffffffffffff80821115610e3e57600080fd5b610e4a85838601610cd6565b83526020840135915080821115610e6057600080fd5b610e6c85838601610cd6565b60208401526040840135915080821115610e8557600080fd5b610e9185838601610d62565b60408401526060840135915080821115610eaa57600080fd5b50610eb784828501610cd6565b606083015250610ec960808301610de9565b6080820152610eda60a08301610df8565b60a082015292915050565b60008060408385031215610ef857600080fd5b823567ffffffffffffffff80821115610f1057600080fd5b9084019060808287031215610f2457600080fd5b610f2c610c82565b823582811115610f3b57600080fd5b610f4788828601610cd6565b8252506020830135602082015260408301356040820152610f6a60608401610d46565b606082015293506020850135915080821115610f8557600080fd5b50610f9285828601610e0a565b9150509250929050565b60005b83811015610fb7578181015183820152602001610f9f565b83811115610fc6576000848401525b50505050565b60008151808452610fe4816020860160208601610f9c565b601f01601f19169290920160200192915050565b60808152600061100b6080830187610fcc565b60208301959095525060408101929092526001600160a01b0316606090910152919050565b6000806040838503121561104357600080fd5b61104c83610d46565b946020939093013593505050565b60006020828403121561106c57600080fd5b61107582610d46565b9392505050565b6000806040838503121561108f57600080fd5b82359150602083013580151581146110a657600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60a0815260006110da60a0830188610fcc565b82810360208401526110ec8188610fcc565b905082810360408401526111008187610fcc565b915050600f841061112157634e487b7160e01b600052602160045260246000fd5b83606083015261ffff831660808301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561117b5761117b611151565b5060010190565b60008251611194818460208701610f9c565b9190910192915050565b600181811c908216806111b257607f821691505b602082108114156111d357634e487b7160e01b600052602260045260246000fd5b50919050565b600082198211156111ec576111ec611151565b50019056fea2646970667358221220fbbf3ee3532c3fcf98f8143431755d6d5209e74207120ce6810a48e78c91b78364736f6c63430008090033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c806358bdf27f1161008c57806381cfa3b91161006657806381cfa3b9146101e75780638da5cb5b14610210578063a8ab9fc41461024f578063ea7a23a31461026257600080fd5b806358bdf27f1461019857806371689ed1146101c1578063742b7741146101d457600080fd5b80630444e110146100d457806306e3844d146100fc57806313d8f6191461012a5780633d0bcfa91461013f5780634024db80146101625780634c88662a14610185575b600080fd5b6100e76100e2366004610c2a565b610286565b60405190151581526020015b60405180910390f35b61011c61010a366004610c2a565b60046020526000908152604090205481565b6040519081526020016100f3565b61013d610138366004610ee5565b61030d565b005b6100e761014d366004610c2a565b60056020526000908152604090205460ff1681565b610175610170366004610c2a565b6106a7565b6040516100f39493929190610ff8565b61011c610193366004611030565b610762565b61011c6101a636600461105a565b6001600160a01b031660009081526003602052604090205490565b61013d6101cf36600461107c565b610793565b6100e76101e2366004610c2a565b610857565b61011c6101f536600461105a565b6001600160a01b031660009081526001602052604090205490565b6102377f0000000000000000000000009d71fb2d4bbc6522f6faf8126405a34084e005bc81565b6040516001600160a01b0390911681526020016100f3565b61011c61025d366004611030565b6108e0565b610275610270366004610c2a565b6108fc565b6040516100f39594939291906110c7565b600081815260046020526040812054806102db5760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064015b60405180910390fd5b60006102e682610857565b60008581526005602052604090205490915060ff168015610305575080155b949350505050565b80604001516000805b825181101561036d57336001600160a01b031683828151811061033b5761033b61113b565b60200260200101516001600160a01b0316141561035b576001915061036d565b8061036581611167565b915050610316565b50806103af5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9103737ba1039b4b733b2b960791b60448201526064016102d2565b82516040516000916103c391602001611182565b60408051601f1981840301815290829052805160209182012087519093506000926103ee9201611182565b60408051601f1981840301815291815281516020928301206000858152600290935291208054919250906104219061119e565b1590506104705760405162461bcd60e51b815260206004820152601760248201527f6d7573696355726948617368207265676973746572656400000000000000000060448201526064016102d2565b600081815260208190526040902080546104899061119e565b1590506104d85760405162461bcd60e51b815260206004820152601960248201527f6c6963656e73655572694861736820726567697374657265640000000000000060448201526064016102d2565b60008281526002602090815260409091208651805188936104fd928492910190610b3c565b5060208281015180516105169260018501920190610b3c565b5060408201518051610532916002840191602090910190610bc0565b506060820151805161054e916003840191602090910190610b3c565b50608082015160048201805460ff1916600183600e811115610572576105726110b1565b021790555060a091909101516004909101805461ffff9092166101000262ffff00199092169190911790556000818152602081815260409091208751805189936105c0928492910190610b3c565b506020828101516001838101919091556040808501516002850155606090940151600390930180546001600160a01b0319166001600160a01b03909416939093179092556000858152600482528381208590556005909152829020805460ff19169091179055850151610634908390610acb565b6106668187606001516001600160a01b0316600090815260016020818152604083208054928301815583529091200155565b60408051838152602081018390527fb67d8104e28f72b24d5e1f1b3412956f7c2ad9942d467b2cb9df21e6f412a13c910160405180910390a1505050505050565b6000602081905290815260409020805481906106c29061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546106ee9061119e565b801561073b5780601f106107105761010080835404028352916020019161073b565b820191906000526020600020905b81548152906001019060200180831161071e57829003601f168201915b5050505060018301546002840154600390940154929390929091506001600160a01b031684565b6001602052816000526040600020818154811061077e57600080fd5b90600052602060002001600091509150505481565b336001600160a01b037f0000000000000000000000009d71fb2d4bbc6522f6faf8126405a34084e005bc16146107fe5760405162461bcd60e51b815260206004820152601060248201526f21b0b63632b9103737ba1037bbb732b960811b60448201526064016102d2565b600082815260056020908152604091829020805460ff19168415159081179091558251858152918201527fca7e640d2d483c720a548e3a630ccd7ca04b55ec7ddcd0b5fea6493c52f89b67910160405180910390a15050565b600081815260208190526040812080546108709061119e565b151590506108b45760405162461bcd60e51b81526020600482015260116024820152701b1a58d95b9cd9481b9bdd08199bdd5b99607a1b60448201526064016102d2565b600082815260208190526040812060028101546001909101546108d791906111d9565b42119392505050565b6003602052816000526040600020818154811061077e57600080fd5b6002602052600090815260409020805481906109179061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109439061119e565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050908060010180546109a59061119e565b80601f01602080910402602001604051908101604052809291908181526020018280546109d19061119e565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505090806003018054610a339061119e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061119e565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050506004909301549192505060ff81169061ffff6101009091041685565b60005b8151811015610b375760036000838381518110610aed57610aed61113b565b6020908102919091018101516001600160a01b0316825281810192909252604001600090812080546001810182559082529190200183905580610b2f81611167565b915050610ace565b505050565b828054610b489061119e565b90600052602060002090601f016020900481019282610b6a5760008555610bb0565b82601f10610b8357805160ff1916838001178555610bb0565b82800160010185558215610bb0579182015b82811115610bb0578251825591602001919060010190610b95565b50610bbc929150610c15565b5090565b828054828255906000526020600020908101928215610bb0579160200282015b82811115610bb057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610be0565b5b80821115610bbc5760008155600101610c16565b600060208284031215610c3c57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7c57610c7c610c43565b604051601f8201601f1916810167ffffffffffffffff81118282101715610cce57610cce610c43565b604052919050565b600082601f830112610ce757600080fd5b813567ffffffffffffffff811115610d0157610d01610c43565b610d14601f8201601f1916602001610ca5565b818152846020838601011115610d2957600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b0381168114610d5d57600080fd5b919050565b600082601f830112610d7357600080fd5b8135602067ffffffffffffffff821115610d8f57610d8f610c43565b8160051b610d9e828201610ca5565b9283528481018201928281019087851115610db857600080fd5b83870192505b84831015610dde57610dcf83610d46565b82529183019190830190610dbe565b979650505050505050565b8035600f8110610d5d57600080fd5b803561ffff81168114610d5d57600080fd5b600060c08284031215610e1c57600080fd5b610e24610c59565b9050813567ffffffffffffffff80821115610e3e57600080fd5b610e4a85838601610cd6565b83526020840135915080821115610e6057600080fd5b610e6c85838601610cd6565b60208401526040840135915080821115610e8557600080fd5b610e9185838601610d62565b60408401526060840135915080821115610eaa57600080fd5b50610eb784828501610cd6565b606083015250610ec960808301610de9565b6080820152610eda60a08301610df8565b60a082015292915050565b60008060408385031215610ef857600080fd5b823567ffffffffffffffff80821115610f1057600080fd5b9084019060808287031215610f2457600080fd5b610f2c610c82565b823582811115610f3b57600080fd5b610f4788828601610cd6565b8252506020830135602082015260408301356040820152610f6a60608401610d46565b606082015293506020850135915080821115610f8557600080fd5b50610f9285828601610e0a565b9150509250929050565b60005b83811015610fb7578181015183820152602001610f9f565b83811115610fc6576000848401525b50505050565b60008151808452610fe4816020860160208601610f9c565b601f01601f19169290920160200192915050565b60808152600061100b6080830187610fcc565b60208301959095525060408101929092526001600160a01b0316606090910152919050565b6000806040838503121561104357600080fd5b61104c83610d46565b946020939093013593505050565b60006020828403121561106c57600080fd5b61107582610d46565b9392505050565b6000806040838503121561108f57600080fd5b82359150602083013580151581146110a657600080fd5b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60a0815260006110da60a0830188610fcc565b82810360208401526110ec8188610fcc565b905082810360408401526111008187610fcc565b915050600f841061112157634e487b7160e01b600052602160045260246000fd5b83606083015261ffff831660808301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561117b5761117b611151565b5060010190565b60008251611194818460208701610f9c565b9190910192915050565b600181811c908216806111b257607f821691505b602082108114156111d357634e487b7160e01b600052602260045260246000fd5b50919050565b600082198211156111ec576111ec611151565b50019056fea2646970667358221220fbbf3ee3532c3fcf98f8143431755d6d5209e74207120ce6810a48e78c91b78364736f6c63430008090033