Contract 0xCf30AeeBF2ef45FbC27e4761E2B842313dfBf99b 2

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0a55471dacb32093472be3d7145a738f285ab8f6d6e89058fe06485b041d08d2Meta Safe Batch ...338925742022-10-03 20:41:557 hrs 27 mins ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.005997558229 32.611199055
0x4ddfb80745c2c5ba4bf8bdda3883cb79bf6dac86e2ec5dff1d14dfc80ee52defMeta Safe Batch ...338845452022-10-03 16:04:1312 hrs 5 mins ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.002239912111 31.370000024
0xf9348e1a35cbb4aa845b39558c70d36891b2978869b3c684015e5171742cef2eMeta Safe Batch ...338841032022-10-03 15:48:3412 hrs 21 mins ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.002892036262 30.723200003
0xc43117fd5aa1cc705a02b580879dc08d079b8302acce2939f6dbdc512575afafMeta Safe Batch ...338439322022-10-02 16:32:211 day 11 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.002427682801 34.800000016
0xd9a57d8bff585ef66ff03911699a19be9256df1fd73ed95240eb5fd72c85ad41Meta Safe Batch ...338429892022-10-02 15:59:551 day 12 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.004810455519 30.879999999
0xcc668159af744f7059676f41b0f99060083437f7ea99316d92ec8af0688acf3dSet Approval For...337886632022-10-01 8:33:482 days 19 hrs ago0xc7bd81866455ebff9b832899a0c71e6e96d3fba3 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00144666 30.000000014
0xe921466e8605bda7dcafe93e35a26c7f19e895170939dcd1025f97bccc8c365bMeta Safe Batch ...337097092022-09-29 10:34:564 days 17 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.003873347641 31.860000014
0x39447174447a545459b77f9d0ee37a301ac9188b9377b61f92c758351b03be7bMeta Safe Batch ...337096982022-09-29 10:34:344 days 17 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.002290951241 32.84000002
0xb169f41ab0c5a6f1acf46470e01b165f24a0b0d40f774fb263830f9c90f4feceMeta Safe Batch ...337092872022-09-29 10:20:244 days 17 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.004149763415 34.113999997
0x8fa0f0bd95a661b6f90a66e860a525be069ec14927ff744675369058b93e232bMeta Safe Batch ...337092742022-09-29 10:19:584 days 17 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.002145332129 30.752600013
0xa28a58941d2c8ad418905833b76e274af5393486cd7f355ee6614b3f53bc117dSet Approval For...336915902022-09-29 0:09:045 days 4 hrs ago0x4d60f624b3da62af4365f13482ce488c325f8b0a IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.001446660006 30.000000128
0x69317bf5441c86dc09cb67ef16f31c315c0b8d3d096a57c9a3ce7ad75b11ad03Meta Safe Batch ...336835862022-09-28 19:33:555 days 8 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.003828598199 40.679999999
0x4b011ea4e2ba7f4864c4924938a0ee32eec7289580ea0f8f1c449c206cba89b0Set Approval For...336835822022-09-28 19:33:435 days 8 hrs ago0xa468ff763530d9f7c1355c6c92e2e0e402eacbe6 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00147342321 30.555000012
0x968cc15e9677a0d9a5ff0c8c3d8cdf8e8293e393c395ea9c3f5513707a879f6aMeta Safe Batch ...336746832022-09-28 14:27:225 days 13 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00457707561 37.648474264
0x41eb51f74c891b948c4692a61811f0f06f73e60c0708b96b781e5b0f0246cfffSafe Transfer Fr...336746492022-09-28 14:26:145 days 13 hrs ago0x881ee0c4b131cc79d3bb9dc44a4539bc034a35e6 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.001963174328 36.421853551
0x074fcfa068a211ff9e563aebf3c1fa82b2ecc9e8119fb0e60e72ec0f7982f14cSet Approval For...336487062022-09-27 23:29:406 days 4 hrs ago0xda0e533954ec82c16676d57b4e004e049e15c3f8 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00144666 30.000000011
0xfcbd174067ad59630be9cd1e0b3f92fa3d0ba8e52542ea4a1aa2f940f5dee28bMeta Safe Batch ...336479752022-09-27 23:02:216 days 5 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.005421526955 34.800000996
0x14eebe349152a4a165c089ea5eadee8787a4a035960e495ed8fa2543b506a853Meta Safe Batch ...336366242022-09-27 16:24:346 days 11 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.009553350385 61.296006477
0xa2c75c3b409b17723e6d9f154fec40102386a7a96ececcc82e2d6f4a97bcf1ffMeta Safe Batch ...336208832022-09-27 6:40:196 days 21 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.007331665865 30.752600019
0xf6b5772e12b2c7d7108d0ae4cf7e1983cceaef582209b29e165c68a0c2ae4cc0Set Approval For...335587202022-09-25 18:18:278 days 9 hrs ago0xcb567b9b978a2f341995108b6b3e7fa3714c0dc4 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00144666 30.000000011
0xdaa1f32aa9f2bf0a76e609e3ff898b39cf41f54851f3ec4822e7d90baf365174Meta Safe Batch ...335537622022-09-25 15:27:558 days 12 hrs ago0x0aab511fc5d1fb970f17d92a0ebdfd3ff627a0ff IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.002908093439 37.739999998
0xfda283cc5d7d3a0a62b5910d9bd91e9fa901fbd386c9cf6a453b65ee0ec9a71fSet Approval For...335532922022-09-25 15:09:398 days 13 hrs ago0xcbc321b880cebabaea15708bd717ee642b0bf8da IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00144666 30.000000016
0xe4a7f5b4010ed2fa66f3a07366647ce9ee341ffbff71174156b74b7bbfaeb6b1Set Approval For...335475922022-09-25 11:53:268 days 16 hrs ago0xd394c6d836587038863dafeb2eef0292c8895538 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00144666 30.000000012
0xe141849eaf7f5f2949dc4c8aacc8a023d0bd9bdef00edd19f57f53c93e8957d9Set Approval For...335449432022-09-25 10:22:168 days 17 hrs ago0x071c111418cb247b7f31dd6f57b93a4eedaaa2c2 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00144666 30.000000014
0x6f297a59b1bf1ef4f907c40b4f0095f6c077b3bc6dfb24428c1b315ff46f6abfSet Approval For...335448932022-09-25 10:20:328 days 17 hrs ago0xa0ddea94a1c76181ab8bbfdf6a2c2353cbe3ca05 IN  0xcf30aeebf2ef45fbc27e4761e2b842313dfbf99b0 MATIC0.00154358622 32.010000018
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SynergyOfSerraAssets

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-09
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

/**
    @title ERC-1155 Multi Token Standard
    @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md
    Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    /* is ERC165 */
    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_id` argument MUST be the token type being transferred.
        The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferSingle(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _value
    );

    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_ids` argument MUST be the list of tokens being transferred.
        The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferBatch(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _values
    );

    /**
        @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled).
    */
    event ApprovalForAll(
        address indexed _owner,
        address indexed _operator,
        bool _approved
    );

    /**
        @dev MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _id      ID of the token type
        @param _value   Transfer amount
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if length of `_ids` is not the same as length of `_values`.
        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST revert on any other error.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _ids     IDs of each token type (order and length must match _values array)
        @param _values  Transfer amounts per token type (order and length must match _ids array)
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
    */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external;

    /**
        @notice Get the balance of an account's Tokens.
        @param _owner  The address of the token holder
        @param _id     ID of the Token
        @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id)
        external
        view
        returns (uint256);

    /**
        @notice Get the balance of multiple account/token pairs
        @param _owners The addresses of the token holders
        @param _ids    ID of the Tokens
        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @param _operator  Address to add to the set of authorized operators
        @param _approved  True if the operator is approved, false to revoke approval
    */
    function setApprovalForAll(address _operator, bool _approved) external;

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param _owner     The owner of the Tokens
        @param _operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address _owner, address _operator)
        external
        view
        returns (bool);
}

/**
    @title ERC-1155 Mixed Fungible Token Standard
 */
interface IERC1155MixedFungible {
    /**
        @notice Returns true for non-fungible token id.
        @dev    Returns true for non-fungible token id.
        @param _id  Id of the token
        @return     If a token is non-fungible
     */
    function isNonFungible(uint256 _id) external pure returns (bool);

    /**
        @notice Returns true for fungible token id.
        @dev    Returns true for fungible token id.
        @param _id  Id of the token
        @return     If a token is fungible
     */
    function isFungible(uint256 _id) external pure returns (bool);

    /**
        @notice Returns the mint# of a token type.
        @dev    Returns the mint# of a token type.
        @param _id  Id of the token
        @return     The mint# of a token type.
     */
    function getNonFungibleIndex(uint256 _id) external pure returns (uint256);

    /**
        @notice Returns the base type of a token id.
        @dev    Returns the base type of a token id.
        @param _id  Id of the token
        @return     The base type of a token id.
     */
    function getNonFungibleBaseType(uint256 _id)
        external
        pure
        returns (uint256);

    /**
        @notice Returns true if the base type of the token id is a non-fungible base type.
        @dev    Returns true if the base type of the token id is a non-fungible base type.
        @param _id  Id of the token
        @return     The non-fungible base type info as bool
     */
    function isNonFungibleBaseType(uint256 _id) external pure returns (bool);

    /**
        @notice Returns true if the base type of the token id is a fungible base type.
        @dev    Returns true if the base type of the token id is a fungible base type.
        @param _id  Id of the token
        @return     The fungible base type info as bool
     */
    function isNonFungibleItem(uint256 _id) external pure returns (bool);

    /**
        @notice Returns the owner of a token.
        @dev    Returns the owner of a token.
        @param _id  Id of the token
        @return     The owner address
     */
    function ownerOf(uint256 _id) external view returns (address);
}

/**
    @author The Calystral Team
    @title The ERC1155CalystralMixedFungibleMintable' Interface
*/
interface IERC1155CalystralMixedFungibleMintable {
    /**
        @dev MUST emit when a release timestamp is set or updated.
        The `typeId` argument MUST be the id of a type.
        The `timestamp` argument MUST be the timestamp of the release in seconds.
    */
    event OnReleaseTimestamp(uint256 indexed typeId, uint256 timestamp);

    /**
        @notice Updates the metadata base URI.
        @dev Updates the `_metadataBaseURI`.
        @param uri The metadata base URI
    */
    function updateMetadataBaseURI(string calldata uri) external;

    /**
        @notice Creates a non-fungible type.
        @dev Creates a non-fungible type. This function only creates the type and is not used for minting.
        The type also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        returns (uint256);

    /**
        @notice Creates a fungible type.
        @dev Creates a fungible type. This function only creates the type and is not used for minting.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        returns (uint256);

    /**
        @notice Mints a non-fungible type.
        @dev Mints a non-fungible type.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param toArr    An array of receivers
    */
    function mintNonFungible(uint256 typeId, address[] calldata toArr) external;

    /**
        @notice Mints a fungible type.
        @dev Mints a fungible type.
        Reverts if array lengths are unequal.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param toArr    An array of receivers
    */
    function mintFungible(
        uint256 typeId,
        address[] calldata toArr,
        uint256[] calldata quantitiesArr
    ) external;

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner or approved operator of the owner.
        Reverts if `_to` is the zero address.
        Reverts if balance of holder for token `_id` is lower than the `_value` sent.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer       The signing account. This SHOULD be the owner of the asset or an approved operator of the owner.
        @param _to          Target address
        @param _id          ID of the token type
        @param _value       Transfer amount
        @param _data        Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSafeTransferFrom(
        bytes memory signature,
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner or approved operator of the owner.
        Reverts if `_to` is the zero address.
        Reverts if length of `_ids` is not the same as length of `_values`.
        Reverts if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer       The signing account. This SHOULD be the owner of the asset or an approved operator of the owner.
        @param _to          Target address
        @param _ids         IDs of each token type (order and length must match _values array)
        @param _values      Transfer amounts per token type (order and length must match _ids array)
        @param _data        Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSafeBatchTransferFrom(
        bytes memory signature,
        address signer,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Burns fungible and/or non-fungible tokens.
        @dev Sends FTs and/or NFTs to 0x0 address.
        Uses Meta Transactions - transactions are signed by the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner.
        Emits the `TransferBatch` event where the `to` argument is the 0x0 address.
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer The signing account. This SHOULD be the owner of the asset
        @param ids An array of token Ids which should be burned
        @param values An array of amounts which should be burned. The order matches the order in the ids array
        @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaBatchBurn(
        bytes memory signature,
        address signer,
        uint256[] calldata ids,
        uint256[] calldata values,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        Uses Meta Transactions - transactions are signed by the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner.
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer       The signing account. This SHOULD be the owner of the asset
        @param _operator    Address to add to the set of authorized operators
        @param _approved    True if the operator is approved, false to revoke approval
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSetApprovalForAll(
        bytes memory signature,
        address signer,
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Sets a release timestamp.
        @dev Sets a release timestamp.
        Reverts if `timestamp` == 0.
        Reverts if the `typeId` is released already.
        @param typeId       The type which should be set or updated
        @param timestamp    The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
    */
    function setReleaseTimestamp(uint256 typeId, uint256 timestamp) external;

    /**
        @notice Get the release timestamp of a type.
        @dev Get the release timestamp of a type.
        @return The release timestamp of a type.
    */
    function getReleaseTimestamp(uint256 typeId)
        external
        view
        returns (uint256);

    /**
        @notice Get all existing type Ids.
        @dev Get all existing type Ids.
        @return An array of all existing type Ids.
    */
    function getTypeIds() external view returns (uint256[] memory);

    /**
        @notice Get a specific type Id.
        @dev Get a specific type Id.
        Reverts if `typeNonce` is 0 or if it does not exist.
        @param  typeNonce The type nonce for which the id is requested
        @return A specific type Id.
    */
    function getTypeId(uint256 typeNonce) external view returns (uint256);

    /**
        @notice Get all non-fungible assets for a specific user.
        @dev Get all non-fungible assets for a specific user.
        @param  owner The address of the requested user
        @return An array of Ids that are owned by the user
    */
    function getNonFungibleAssets(address owner)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Get all fungible assets for a specific user.
        @dev Get all fungible assets for a specific user.
        @param  owner The address of the requested user
        @return An array of Ids that are owned by the user
                An array for the amount owned of each Id
    */
    function getFungibleAssets(address owner)
        external
        view
        returns (uint256[] memory, uint256[] memory);

    /**
        @notice Get the type nonce.
        @dev Get the type nonce.
        @return The type nonce.
    */
    function getTypeNonce() external view returns (uint256);

    /**
        @notice The amount of tokens that have been minted of a specific type.
        @dev    The amount of tokens that have been minted of a specific type.
                Reverts if the given typeId does not exist.
        @param  typeId The requested type
        @return The minted amount
    */
    function getMintedSupply(uint256 typeId) external view returns (uint256);

    /**
        @notice The amount of tokens that can be minted of a specific type.
        @dev    The amount of tokens that can be minted of a specific type.
                Reverts if the given typeId does not exist.
        @param  typeId The requested type
        @return The maximum mintable amount
    */
    function getMaxSupply(uint256 typeId) external view returns (uint256);

    /**
        @notice Get the burn nonce of a specific user.
        @dev    Get the burn nonce of a specific user / signer.
        @param  signer The requested signer
        @return The burn nonce of a specific user
    */
    function getMetaNonce(address signer) external view returns (uint256);
}

/**
 * @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);
}

/**
    @author The Calystral Team
    @title The RegistrableContractState's Interface
*/
interface IRegistrableContractState is IERC165 {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /// @dev MUST emit when the contract is set to an active state.
    event Activated();
    /// @dev MUST emit when the contract is set to an inactive state.
    event Inactivated();

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the contract state to active.
        @dev Sets the contract state to active.
    */
    function setActive() external;

    /**
        @notice Sets the contract state to inactive.
        @dev Sets the contract state to inactive.
    */
    function setInactive() external;

    /**
        @dev Sets the registry contract object.
        Reverts if the registryAddress doesn't implement the IRegistry interface.
        @param registryAddress The registry address
    */
    function setRegistry(address registryAddress) external;

    /**
        @notice Returns the current contract state.
        @dev Returns the current contract state.
        @return The current contract state (true == active; false == inactive)
    */
    function getIsActive() external view returns (bool);

    /**
        @notice Returns the Registry address.
        @dev Returns the Registry address.
        @return The Registry address
    */
    function getRegistryAddress() external view returns (address);

    /**
        @notice Returns the current address associated with `key` identifier.
        @dev Look-up in the Registry.
        Returns the current address associated with `key` identifier.
        @return The key identifier
    */
    function getContractAddress(uint256 key) external view returns (address);
}

/**
    @author The Calystral Team
    @title The Assets' Interface
*/
interface IAssets is
    IERC1155,
    IERC1155MixedFungible,
    IERC1155CalystralMixedFungibleMintable,
    IRegistrableContractState
{
    /**
        @dev MUST emit when any property type is created.
        The `propertyId` argument MUST be the id of a property.
        The `name` argument MUST be the name of this specific id.
        The `propertyType` argument MUST be the property type.
    */
    event OnCreateProperty(
        uint256 propertyId,
        string name,
        PropertyType indexed propertyType
    );
    /**
        @dev MUST emit when an int type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateIntProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        int256 value
    );
    /**
        @dev MUST emit when an string type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateStringProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        string value
    );
    /**
        @dev MUST emit when an address type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateAddressProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        address value
    );
    /**
        @dev MUST emit when an byte type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateByteProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        bytes32 value
    );
    /**
        @dev MUST emit when an int array type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateIntArrayProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        int256[] value
    );
    /**
        @dev MUST emit when an address array type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateAddressArrayProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        address[] value
    );

    /// @dev Enum representing all existing property types that can be used.
    enum PropertyType {INT, STRING, ADDRESS, BYTE, INTARRAY, ADDRESSARRAY}

    /**
        @notice Creates a property of type int.
        @dev Creates a property of type int.
        @param name The name for this property
        @return     The property id
    */
    function createIntProperty(string calldata name) external returns (uint256);

    /**
        @notice Creates a property of type string.
        @dev Creates a property of type string.
        @param name The name for this property
        @return     The property id
    */
    function createStringProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type address.
        @dev Creates a property of type address.
        @param name The name for this property
        @return     The property id
    */
    function createAddressProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type byte.
        @dev Creates a property of type byte.
        @param name The name for this property
        @return     The property id
    */
    function createByteProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type int array.
        @dev Creates a property of type int array.
        @param name The name for this property
        @return     The property id
    */
    function createIntArrayProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type address array.
        @dev Creates a property of type address array.
        @param name The name for this property
        @return     The property id
    */
    function createAddressArrayProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Updates an existing int property for the passed value.
        @dev Updates an existing int property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateIntProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256 value
    ) external;

    /**
        @notice Updates an existing string property for the passed value.
        @dev Updates an existing string property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateStringProperty(
        uint256 tokenId,
        uint256 propertyId,
        string calldata value
    ) external;

    /**
        @notice Updates an existing address property for the passed value.
        @dev Updates an existing address property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateAddressProperty(
        uint256 tokenId,
        uint256 propertyId,
        address value
    ) external;

    /**
        @notice Updates an existing byte property for the passed value.
        @dev Updates an existing byte property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateByteProperty(
        uint256 tokenId,
        uint256 propertyId,
        bytes32 value
    ) external;

    /**
        @notice Updates an existing int array property for the passed value.
        @dev Updates an existing int array property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateIntArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256[] calldata value
    ) external;

    /**
        @notice Updates an existing address array property for the passed value.
        @dev Updates an existing address array property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateAddressArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        address[] calldata value
    ) external;

    /**
        @notice Get the property type of a property.
        @dev Get the property type of a property.
        @return The property type
    */
    function getPropertyType(uint256 propertyId)
        external
        view
        returns (PropertyType);

    /**
        @notice Get the count of available properties.
        @dev Get the count of available properties.
        @return The property count
    */
    function getPropertyCounter() external view returns (uint256);
}

/**
    Note: The ERC-165 identifier for this interface is 0x0e89341c.
*/
interface IERC1155Metadata_URI {
    /**
        @notice A distinct Uniform Resource Identifier (URI) for a given token.
        @dev URIs are defined in RFC 3986.
        The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".        
        @return URI string
    */
    function uri(uint256 _id) external view returns (string memory);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
    @author The Calystral Team
    @title The Registry's Interface
*/
interface IRegistry is IRegistrableContractState {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /**
        @dev MUST emit when an entry in the Registry is set or updated.
        The `key` argument MUST be the key of the entry which is set or updated.
        The `value` argument MUST be the address of the entry which is set or updated.
    */
    event EntrySet(uint256 indexed key, address value);
    /**
        @dev MUST emit when an entry in the Registry is removed.
        The `key` argument MUST be the key of the entry which is removed.
        The `value` argument MUST be the address of the entry which is removed.
    */
    event EntryRemoved(uint256 indexed key, address value);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the MultiSigAdmin contract as Registry entry 1.
        @dev Sets the MultiSigAdmin contract as Registry entry 1.
        @param msaAddress The contract address of the MultiSigAdmin
    */
    function initializeMultiSigAdmin(address msaAddress) external;

    /**
        @notice Checks if the registry Map contains the key.
        @dev Returns true if the key is in the registry map. O(1).
        @param key  The key to search for
        @return     The boolean result
    */
    function contains(uint256 key) external view returns (bool);

    /**
        @notice Returns the registry map length.
        @dev Returns the number of key-value pairs in the registry map. O(1).
        @return     The registry map length
    */
    function length() external view returns (uint256);

    /**
        @notice Returns the key-value pair stored at position `index` in the registry map.
        @dev Returns the key-value pair stored at position `index` in the registry map. O(1).
        Note that there are no guarantees on the ordering of entries inside the
        array, and it may change when more entries are added or removed.
        Requirements:
        - `index` must be strictly less than {length}.
        @param index    The position in the registry map
        @return         The key-value pair as a tuple
    */
    function at(uint256 index) external view returns (uint256, address);

    /**
        @notice Tries to return the value associated with `key`.
        @dev Tries to return the value associated with `key`.  O(1).
        Does not revert if `key` is not in the registry map.
        @param key    The key to search for
        @return       The key-value pair as a tuple
    */
    function tryGet(uint256 key) external view returns (bool, address);

    /**
        @notice Returns the value associated with `key`.
        @dev Returns the value associated with `key`.  O(1).
        Requirements:
        - `key` must be in the registry map.
        @param key    The key to search for
        @return       The contract address
    */
    function get(uint256 key) external view returns (address);

    /**
        @notice Returns all indices, keys, addresses.
        @dev Returns all indices, keys, addresses as three seperate arrays.
        @return Indices, keys, addresses
    */
    function getAll()
        external
        view
        returns (
            uint256[] memory,
            uint256[] memory,
            address[] memory
        );

    /**
        @notice Adds a key-value pair to a map, or updates the value for an existing
        key.
        @dev Adds a key-value pair to the registry map, or updates the value for an existing
        key. O(1).
        Returns true if the key was added to the registry map, that is if it was not
        already present.
        @param key    The key as an identifier
        @param value  The address of the contract
        @return       Success as a bool
    */
    function set(uint256 key, address value) external returns (bool);

    /**
        @notice Removes a value from the registry map.
        @dev Removes a value from the registry map. O(1).
        Returns true if the key was removed from the registry map, that is if it was present.
        @param key    The key as an identifier
        @return       Success as a bool
    */
    function remove(uint256 key) external returns (bool);

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param key    The key as an identifier
    */
    function setContractActiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param contractAddress The contract's address
    */
    function setContractActiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state active.
        @dev Sets all contracts within the registry to state active.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsActive() external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param key    The key as an identifier
    */
    function setContractInactiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param contractAddress The contract's address
    */
    function setContractInactiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state inactive.
        @dev Sets all contracts within the registry to state inactive.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsInactive() external;
}

/**
    @author The Calystral Team
    @title A helper parent contract: Pausable & Registry
*/
contract RegistrableContractState is IRegistrableContractState, ERC165 {
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev Current contract state
    bool private _isActive;
    /// @dev Current registry pointer
    address private _registryAddress;

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isActive() {
        _isActiveCheck();
        _;
    }

    modifier isAuthorizedAdmin() {
        _isAuthorizedAdmin();
        _;
    }

    modifier isAuthorizedAdminOrRegistry() {
        _isAuthorizedAdminOrRegistry();
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /**
        @notice Creates and initializes the contract.
        @dev Creates and initializes the contract.
        Registers all implemented interfaces.
        Inheriting contracts are INACTIVE by default.
    */
    constructor(address registryAddress) {
        _registryAddress = registryAddress;

        _registerInterface(type(IRegistrableContractState).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function setActive() external override isAuthorizedAdminOrRegistry() {
        _isActive = true;

        emit Activated();
    }

    function setInactive() external override isAuthorizedAdminOrRegistry() {
        _isActive = false;

        emit Inactivated();
    }

    function setRegistry(address registryAddress)
        external
        override
        isAuthorizedAdmin()
    {
        _registryAddress = registryAddress;

        try
            _registryContract().supportsInterface(type(IRegistry).interfaceId)
        returns (bool supportsInterface) {
            require(
                supportsInterface,
                "The provided contract does not implement the Registry interface"
            );
        } catch {
            revert(
                "The provided contract does not implement the Registry interface"
            );
        }
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function getIsActive() public view override returns (bool) {
        return _isActive;
    }

    function getRegistryAddress() public view override returns (address) {
        return _registryAddress;
    }

    function getContractAddress(uint256 key)
        public
        view
        override
        returns (address)
    {
        return _registryContract().get(key);
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev Returns the target Registry object.
        @return The target Registry object
    */
    function _registryContract() internal view returns (IRegistry) {
        return IRegistry(_registryAddress);
    }

    /**
        @dev Checks if the contract is in an active state.
        Reverts if the contract is INACTIVE.
    */
    function _isActiveCheck() internal view {
        require(_isActive == true, "The contract is not active");
    }

    /**
        @dev Checks if the msg.sender is the Admin.
        Reverts if msg.sender is not the Admin.
    */
    function _isAuthorizedAdmin() internal view {
        require(msg.sender == getContractAddress(1), "Unauthorized call");
    }

    /**
        @dev Checks if the msg.sender is the Admin or the Registry.
        Reverts if msg.sender is not the Admin or the Registry.
    */
    function _isAuthorizedAdminOrRegistry() internal view {
        require(
            msg.sender == _registryAddress ||
                msg.sender == getContractAddress(1),
            "Unauthorized call"
        );
    }
}

/**
    Note: Simple contract to use as base for const vals
*/
contract CommonConstants {
    bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
}

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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 functionCall(target, data, "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"
        );
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            target.call{value: value}(data);
        return _verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    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.3._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/*
Begin solidity-cborutils
https://github.com/smartcontractkit/solidity-cborutils

MIT License

Copyright (c) 2018 SmartContract ChainLink, Ltd.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

library Strings {
    function strConcat(string memory _a, string memory _b)
        internal
        pure
        returns (string memory _concatenatedString)
    {
        return strConcat(_a, _b, "", "", "");
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c
    ) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c,
        string memory _d
    ) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c,
        string memory _d,
        string memory _e
    ) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde =
            new string(
                _ba.length + _bb.length + _bc.length + _bd.length + _be.length
            );
        bytes memory babcde = bytes(abcde);
        uint256 k = 0;
        uint256 i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(
            uint256(s) <=
                0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
            "ECDSA: invalid signature 's' value"
        );
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }
}

/**
    Note: The ERC-165 identifier for this interface is 0x4e2312e0.
*/
interface IERC1155TokenReceiver {
    /**
        @notice Handle the receipt of a single ERC1155 token type.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated.
        This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61) if it accepts the transfer.
        This function MUST revert if it rejects the transfer.
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _id        The ID of the token being transferred
        @param _value     The amount of tokens being transferred
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    */
    function onERC1155Received(
        address _operator,
        address _from,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external returns (bytes4);

    /**
        @notice Handle the receipt of multiple ERC1155 token types.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated.
        This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81) if it accepts the transfer(s).
        This function MUST revert if it rejects the transfer(s).
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the batch transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _ids       An array containing ids of each token being transferred (order and length must match _values array)
        @param _values    An array containing amounts of each token being transferred (order and length must match _ids array)
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    */
    function onERC1155BatchReceived(
        address _operator,
        address _from,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external returns (bytes4);
}

/**
    @author The Calystral Team
    @title Synergy of Serra Assets (NFTs, FTs, and their arbitrary Properties)
*/
contract SynergyOfSerraAssets is
    IAssets,
    IERC1155Metadata_URI,
    RegistrableContractState,
    CommonConstants
{
    using Address for address;
    using Strings for string;

    /*==============================
    =          CONSTANTS           =
    ==============================*/
    /// @dev The maximum allowed supply for FTs and NFTs, half of uint256 is reserved for type and half for the index.
    uint256 public constant MAX_TYPE_SUPPLY = 2**128;

    /// @dev Use a split bit implementation. Store the type in the upper 128 bits..
    uint256 public constant TYPE_MASK = uint256(uint128(int128(~0))) << 128;

    /// @dev ..and the non-fungible index in the lower 128
    uint256 public constant NF_INDEX_MASK = uint128(int128(~0));

    /// @dev The top bit is a flag to tell if this is a NFI.
    uint256 public constant TYPE_NF_BIT = 1 << 255;

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev A counter used to create the propertyId where propertyId 0 is not existing / reserved.
    uint256 public propertyCounter;

    /// @dev A counter which is used to iterate over all existing type Ids. There is no type for _typeNonce 0.
    uint256 private _typeNonce;

    /// @dev Points to the base url of an api to receive meta data.
    string private _metadataBaseURI;

    /// @dev property id => property type
    mapping(uint256 => PropertyType) private _propertyIdToPropertyType;

    /// @dev type id => minted supply
    mapping(uint256 => uint256) private _typeToMintedSupply;

    /// @dev type id => max supply
    mapping(uint256 => uint256) private _typeToMaxSupply;

    /// @dev type id => release timestamp
    mapping(uint256 => uint256) private _tokenTypeToReleaseTimestamp;

    /// @dev type nonce => type id
    mapping(uint256 => uint256) private _typeNonceToTypeId;

    /// @dev signer => burn nonce
    mapping(address => uint256) private _signerToMetaNonce;

    /// @dev id => (owner => balance)
    mapping(uint256 => mapping(address => uint256)) internal balances;

    /// @dev id => owner
    mapping(uint256 => address) nfOwners;

    /// @dev owner => (operator => approved)
    mapping(address => mapping(address => bool)) internal operatorApproval;

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isValidToken(uint256 tokenId) {
        _isValidToken(tokenId);
        _;
    }

    modifier isValidProperty(uint256 propertyId) {
        _isValidProperty(propertyId);
        _;
    }

    modifier isPropertyType(uint256 propertyId, PropertyType propertyType) {
        _isPropertyType(propertyId, propertyType);
        _;
    }

    modifier isAuthorizedAssetManager() {
        _isAuthorizedAssetManager();
        _;
    }

    modifier isValidTypeId(uint256 typeId) {
        _isValidTypeId(typeId);
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /**
        @notice Creates and initializes the contract.
        @dev Creates and initializes the contract.
        Registers all implemented interfaces.
        Contract is INACTIVE by default.
        @param registryAddress Address of the Registry
    */
    constructor(address registryAddress)
        RegistrableContractState(registryAddress)
    {
        _registerInterface(type(IAssets).interfaceId);
        _registerInterface(type(IERC1155).interfaceId);
        _registerInterface(type(IERC1155Metadata_URI).interfaceId);
        _registerInterface(type(IERC1155MixedFungible).interfaceId);
        _registerInterface(
            type(IERC1155CalystralMixedFungibleMintable).interfaceId
        );
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/
    function metaSafeTransferFrom(
        bytes memory signature,
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external override isActive() {
        // Meta Transaction
        bytes32 dataHash =
            _getSafeTransferFromDataHash(
                signer,
                _to,
                _id,
                _value,
                _data,
                nonce,
                maxTimestamp
            );
        address signaturePublicKey =
            ECDSA.recover(ECDSA.toEthSignedMessageHash(dataHash), signature);
        require(
            signer == signaturePublicKey ||
                operatorApproval[signer][signaturePublicKey] == true,
            "Need operator approval for 3rd party transfers."
        );
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );
        _signerToMetaNonce[signer]++;
        // Function Logic
        require(_to != address(0x0), "cannot send to zero address");
        if (isNonFungible(_id)) {
            require(nfOwners[_id] == signer);
            nfOwners[_id] = _to;
            // You could keep balance of NF type in base type id like so:
            // uint256 baseType = getNonFungibleBaseType(_id);
            // balances[baseType][signer] = balances[baseType][signer] - _value ;
            // balances[baseType][_to]   = balances[baseType][_to] + _value ;
        } else {
            balances[_id][signer] -= _value;
            balances[_id][_to] += _value;
        }
        emit TransferSingle(msg.sender, signer, _to, _id, _value);
        _doSafeTransferAcceptanceCheck(
            msg.sender,
            signer,
            _to,
            _id,
            _value,
            _data
        );
    }

    function metaSafeBatchTransferFrom(
        bytes memory signature,
        address signer,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external override isActive() {
        // Meta Transaction
        address signaturePublicKey =
            ECDSA.recover(
                ECDSA.toEthSignedMessageHash(
                    _getSafeBatchTransferFromDataHash(
                        signer,
                        _to,
                        _ids,
                        _values,
                        _data,
                        nonce,
                        maxTimestamp
                    )
                ),
                signature
            );
        require(
            signer == signaturePublicKey ||
                operatorApproval[signer][signaturePublicKey] == true,
            "Need operator approval for 3rd party transfers."
        );
        require(_ids.length == _values.length, "Array length must match.");
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );
        _signerToMetaNonce[signer]++;
        // Function Logic
        require(_to != address(0x0), "cannot send to zero address");
        require(_ids.length == _values.length, "Array length must match");
        for (uint256 i = 0; i < _ids.length; ++i) {
            if (isNonFungible(_ids[i])) {
                require(nfOwners[_ids[i]] == signer);
                nfOwners[_ids[i]] = _to;
            } else {
                balances[_ids[i]][signer] -= _values[i];
                balances[_ids[i]][_to] += _values[i];
            }
        }
        emit TransferBatch(msg.sender, signer, _to, _ids, _values);
        _doSafeBatchTransferAcceptanceCheck(
            msg.sender,
            signer,
            _to,
            _ids,
            _values,
            _data
        );
    }

    function metaSetApprovalForAll(
        bytes memory signature,
        address signer,
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) external override isActive() {
        // Meta Transaction
        bytes32 dataHash =
            _getSetApprovalForAllHash(
                _operator,
                _approved,
                nonce,
                maxTimestamp
            );
        address signaturePublicKey =
            ECDSA.recover(ECDSA.toEthSignedMessageHash(dataHash), signature);
        require(signaturePublicKey == signer, "Invalid signature.");
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );
        _signerToMetaNonce[signer]++;
        // Function Logic
        operatorApproval[signaturePublicKey][_operator] = _approved;
        emit ApprovalForAll(signaturePublicKey, _operator, _approved);
    }

    function setApprovalForAll(address _operator, bool _approved)
        external
        override
        isActive()
    {
        operatorApproval[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external override isActive() {
        require(_to != address(0x0), "cannot send to zero address");
        require(
            _from == msg.sender || operatorApproval[_from][msg.sender] == true,
            "Need operator approval for 3rd party transfers."
        );

        if (isNonFungible(_id)) {
            require(nfOwners[_id] == _from);
            nfOwners[_id] = _to;
            // You could keep balance of NF type in base type id like so:
            // uint256 baseType = getNonFungibleBaseType(_id);
            // balances[baseType][_from] = balances[baseType][_from] - _value;
            // balances[baseType][_to]   = balances[baseType][_to] + _value;
        } else {
            balances[_id][_from] = balances[_id][_from] - _value;
            balances[_id][_to] = balances[_id][_to] + _value;
        }

        emit TransferSingle(msg.sender, _from, _to, _id, _value);

        _doSafeTransferAcceptanceCheck(
            msg.sender,
            _from,
            _to,
            _id,
            _value,
            _data
        );
    }

    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external override isActive() {
        require(_to != address(0x0), "cannot send to zero address");
        require(_ids.length == _values.length, "Array length must match");

        // Only supporting a global operator approval allows us to do only 1 check and not to touch storage to handle allowances.
        require(
            _from == msg.sender || operatorApproval[_from][msg.sender] == true,
            "Need operator approval for 3rd party transfers."
        );

        for (uint256 i = 0; i < _ids.length; ++i) {
            // Cache value to local variable to reduce read costs.
            uint256 id = _ids[i];
            uint256 value = _values[i];

            if (isNonFungible(id)) {
                require(nfOwners[id] == _from);
                nfOwners[id] = _to;
            } else {
                balances[id][_from] = balances[id][_from] - value;
                balances[id][_to] = value + balances[id][_to];
            }
        }

        emit TransferBatch(msg.sender, _from, _to, _ids, _values);

        _doSafeBatchTransferAcceptanceCheck(
            msg.sender,
            _from,
            _to,
            _ids,
            _values,
            _data
        );
    }

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function metaBatchBurn(
        bytes memory signature,
        address signer,
        uint256[] calldata ids,
        uint256[] calldata values,
        uint256 nonce,
        uint256 maxTimestamp
    ) external override isAuthorizedAssetManager() {
        // Meta Transaction
        bytes32 dataHash = _getBurnDataHash(ids, values, nonce, maxTimestamp);
        require(
            (
                ECDSA.recover(ECDSA.toEthSignedMessageHash(dataHash), signature)
            ) == signer,
            "Invalid signature."
        );
        require(ids.length == values.length, "Array length must match.");
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );
        _signerToMetaNonce[signer]++;
        // Function Logic
        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            if (isNonFungible(id)) {
                require(nfOwners[id] == signer, "You are not the owner.");
                nfOwners[id] = address(0x0);
            } else {
                uint256 value = values[i];
                balances[id][signer] -= value;
            }
        }
        emit TransferBatch(msg.sender, signer, address(0x0), ids, values);
    }

    function createIntProperty(string calldata name)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.INT);
    }

    function createStringProperty(string calldata name)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.STRING);
    }

    function createAddressProperty(string calldata name)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.ADDRESS);
    }

    function createByteProperty(string calldata name)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.BYTE);
    }

    function createIntArrayProperty(string calldata name)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.INTARRAY);
    }

    function createAddressArrayProperty(string calldata name)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.ADDRESSARRAY);
    }

    function updateIntProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256 value
    )
        external
        override
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.INT)
    {
        emit OnUpdateIntProperty(tokenId, propertyId, value);
    }

    function updateStringProperty(
        uint256 tokenId,
        uint256 propertyId,
        string calldata value
    )
        external
        override
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.STRING)
    {
        emit OnUpdateStringProperty(tokenId, propertyId, value);
    }

    function updateAddressProperty(
        uint256 tokenId,
        uint256 propertyId,
        address value
    )
        external
        override
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.ADDRESS)
    {
        emit OnUpdateAddressProperty(tokenId, propertyId, value);
    }

    function updateByteProperty(
        uint256 tokenId,
        uint256 propertyId,
        bytes32 value
    )
        external
        override
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.BYTE)
    {
        emit OnUpdateByteProperty(tokenId, propertyId, value);
    }

    function updateIntArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256[] calldata value
    )
        external
        override
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.INTARRAY)
    {
        emit OnUpdateIntArrayProperty(tokenId, propertyId, value);
    }

    function updateAddressArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        address[] calldata value
    )
        external
        override
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.ADDRESSARRAY)
    {
        emit OnUpdateAddressArrayProperty(tokenId, propertyId, value);
    }

    function updateMetadataBaseURI(string calldata baseUri)
        external
        override
        isAuthorizedAssetManager()
    {
        _metadataBaseURI = baseUri;
    }

    function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        uint256 result = _create(true, maxSupply);
        _setReleaseTimestamp(result, releaseTimestamp);
        return result;
    }

    function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        override
        isAuthorizedAssetManager()
        returns (uint256)
    {
        uint256 result = _create(false, maxSupply);
        _setReleaseTimestamp(result, releaseTimestamp);
        return result;
    }

    function mintNonFungible(uint256 typeId, address[] calldata toArr)
        external
        override
        isAuthorizedAssetManager()
        isValidTypeId(typeId)
    {
        require(
            isNonFungible(typeId),
            "This typeId is not a non fungible type."
        );

        // Index are 1-based.
        uint256 index = _typeToMintedSupply[typeId] + 1;
        _typeToMintedSupply[typeId] += toArr.length;

        for (uint256 i = 0; i < toArr.length; ++i) {
            address to = toArr[i];
            uint256 id = typeId | (index + i);

            nfOwners[id] = to;

            emit TransferSingle(msg.sender, address(0x0), to, id, 1);

            _doSafeTransferAcceptanceCheck(
                msg.sender,
                msg.sender,
                to,
                id,
                1,
                ""
            );
        }
        require(
            _typeToMintedSupply[typeId] <= _typeToMaxSupply[typeId],
            "Out of stock."
        );
    }

    function mintFungible(
        uint256 typeId,
        address[] calldata toArr,
        uint256[] calldata quantitiesArr
    ) external override isAuthorizedAssetManager() isValidTypeId(typeId) {
        require(isFungible(typeId), "This typeId is not a fungible type.");
        require(
            toArr.length == quantitiesArr.length,
            "Array length must match."
        );

        for (uint256 i = 0; i < toArr.length; ++i) {
            address to = toArr[i];
            uint256 quantity = quantitiesArr[i];

            // Grant the items to the caller
            balances[typeId][to] += quantity;
            _typeToMintedSupply[typeId] += quantity;

            // the 0x0 source address implies a mint
            // It will also provide the circulating supply info.
            emit TransferSingle(msg.sender, address(0x0), to, typeId, quantity);

            _doSafeTransferAcceptanceCheck(
                msg.sender,
                msg.sender,
                to,
                typeId,
                quantity,
                ""
            );
        }
        require(
            _typeToMintedSupply[typeId] <= _typeToMaxSupply[typeId],
            "Out of stock."
        );
    }

    function setReleaseTimestamp(uint256 typeId, uint256 timestamp)
        external
        override
        isAuthorizedAssetManager()
        isValidTypeId(typeId)
    {
        _setReleaseTimestamp(typeId, timestamp);
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function getPropertyType(uint256 propertyId)
        public
        view
        override
        isValidProperty(propertyId)
        returns (PropertyType)
    {
        return _propertyIdToPropertyType[propertyId];
    }

    function getPropertyCounter() public view override returns (uint256) {
        return propertyCounter;
    }

    function uri(uint256 _id) public view override returns (string memory) {
        return Strings.strConcat(_metadataBaseURI, Strings.uint2str(_id));
    }

    function getReleaseTimestamp(uint256 typeId)
        public
        view
        override
        isValidTypeId(typeId)
        returns (uint256)
    {
        return _tokenTypeToReleaseTimestamp[typeId];
    }

    function getTypeIds() public view override returns (uint256[] memory) {
        uint256[] memory resultIds = new uint256[](_typeNonce);
        for (uint256 i = 0; i < _typeNonce; i++) {
            resultIds[i] = getTypeId(i + 1);
        }
        return resultIds;
    }

    function getTypeId(uint256 typeNonce)
        public
        view
        override
        returns (uint256)
    {
        require(
            typeNonce <= _typeNonce && typeNonce != 0,
            "TypeNonce does not exist."
        );
        return _typeNonceToTypeId[typeNonce];
    }

    function getNonFungibleAssets(address owner)
        public
        view
        override
        returns (uint256[] memory)
    {
        uint256 counter;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = (i << 128) | TYPE_NF_BIT;
            if (_typeToMaxSupply[typeId] != 0) {
                for (uint256 j = 1; j <= _typeToMintedSupply[typeId]; j++) {
                    uint256 id = typeId | j;
                    if (nfOwners[id] == owner) {
                        counter++;
                    }
                }
            }
        }

        uint256[] memory result = new uint256[](counter);
        counter = 0;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = (i << 128) | TYPE_NF_BIT;
            if (_typeToMaxSupply[typeId] != 0) {
                for (uint256 j = 1; j <= _typeToMintedSupply[typeId]; j++) {
                    uint256 id = typeId | j;
                    if (nfOwners[id] == owner) {
                        result[counter] = id;
                        counter++;
                    }
                }
            }
        }
        return result;
    }

    function getFungibleAssets(address owner)
        public
        view
        override
        returns (uint256[] memory, uint256[] memory)
    {
        uint256 counter;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = i << 128;
            if (_typeToMaxSupply[typeId] != 0) {
                if (balances[typeId][owner] > 0) {
                    counter++;
                }
            }
        }

        uint256[] memory resultIds = new uint256[](counter);
        uint256[] memory resultAmounts = new uint256[](counter);
        counter = 0;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = i << 128;
            if (_typeToMaxSupply[typeId] != 0) {
                if (balances[typeId][owner] > 0) {
                    resultIds[counter] = typeId;
                    resultAmounts[counter] = balances[typeId][owner];
                    counter++;
                }
            }
        }
        return (resultIds, resultAmounts);
    }

    function getTypeNonce() public view override returns (uint256) {
        return _typeNonce;
    }

    function getMintedSupply(uint256 typeId)
        public
        view
        override
        isValidTypeId(typeId)
        returns (uint256)
    {
        return _typeToMintedSupply[typeId];
    }

    function getMaxSupply(uint256 typeId)
        public
        view
        override
        isValidTypeId(typeId)
        returns (uint256)
    {
        return _typeToMaxSupply[typeId];
    }

    function getMetaNonce(address signer)
        public
        view
        override
        returns (uint256)
    {
        return _signerToMetaNonce[signer];
    }

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        override
        returns (bool)
    {
        return operatorApproval[_owner][_operator];
    }

    function isNonFungible(uint256 _id) public pure override returns (bool) {
        return _id & TYPE_NF_BIT == TYPE_NF_BIT;
    }

    function isFungible(uint256 _id) public pure override returns (bool) {
        return _id & TYPE_NF_BIT == 0;
    }

    function getNonFungibleIndex(uint256 _id)
        public
        pure
        override
        returns (uint256)
    {
        return _id & NF_INDEX_MASK;
    }

    function getNonFungibleBaseType(uint256 _id)
        public
        pure
        override
        returns (uint256)
    {
        return _id & TYPE_MASK;
    }

    function isNonFungibleBaseType(uint256 _id)
        public
        pure
        override
        returns (bool)
    {
        // A base type has the NF bit but does not have an index.
        return (_id & TYPE_NF_BIT == TYPE_NF_BIT) && (_id & NF_INDEX_MASK == 0);
    }

    function isNonFungibleItem(uint256 _id)
        public
        pure
        override
        returns (bool)
    {
        // A base type has the NF bit but does has an index.
        return (_id & TYPE_NF_BIT == TYPE_NF_BIT) && (_id & NF_INDEX_MASK != 0);
    }

    function ownerOf(uint256 _id) public view override returns (address) {
        return nfOwners[_id];
    }

    function balanceOf(address _owner, uint256 _id)
        external
        view
        override
        returns (uint256)
    {
        if (isNonFungibleItem(_id)) return nfOwners[_id] == _owner ? 1 : 0;
        return balances[_id][_owner];
    }

    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        view
        override
        returns (uint256[] memory)
    {
        require(_owners.length == _ids.length);

        uint256[] memory balances_ = new uint256[](_owners.length);

        for (uint256 i = 0; i < _owners.length; ++i) {
            uint256 id = _ids[i];
            if (isNonFungibleItem(id)) {
                balances_[i] = nfOwners[id] == _owners[i] ? 1 : 0;
            } else {
                balances_[i] = balances[id][_owners[i]];
            }
        }

        return balances_;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev Checks if the `tokenId` exists:
        NFs are checked via `nfOwners` mapping.
        NFTs are checked via `getMaxSupply` function.
        @param tokenId  The tokenId which should be checked
    */
    function _isValidToken(uint256 tokenId) internal view {
        if (isNonFungible(tokenId)) {
            require(
                nfOwners[tokenId] != address(0x0),
                "TokenId does not exist."
            );
        } else {
            require(getMaxSupply(tokenId) != 0, "TokenId does not exist.");
        }
    }

    /**
        @dev Checks if the `propertyId` exists.
        @param propertyId  The propertyId which should be checked
    */
    function _isValidProperty(uint256 propertyId) internal view {
        require(
            propertyId <= propertyCounter && propertyId != 0,
            "Invalid property requested."
        );
    }

    /**
        @dev Checks if a given `propertyId` matches the given `propertyType`.
        @param propertyId   The propertyId which should be checked
        @param propertyType The PropertyType which should be checked against
    */
    function _isPropertyType(uint256 propertyId, PropertyType propertyType)
        internal
        view
    {
        require(
            _propertyIdToPropertyType[propertyId] == propertyType,
            "The given property id does not match the property type."
        );
    }

    /**
        @dev Creates a new property.
        @param name         The name of the property
        @param propertyType The PropertyType of the property
        @return             The propertyId of the property
    */
    function _createProperty(string memory name, PropertyType propertyType)
        private
        returns (uint256)
    {
        propertyCounter++; // propertyCounter starts with 1 for the first attribute
        _propertyIdToPropertyType[propertyCounter] = propertyType;

        emit OnCreateProperty(propertyCounter, name, propertyType);

        return propertyCounter;
    }

    /**
        @dev Checks if the AssetManager (from the Registry) is the msg.sender.
        Reverts if the msg.sender is not the correct AssetManager registered in the Registry.
    */
    function _isAuthorizedAssetManager() internal view {
        require(
            getContractAddress(3) == msg.sender,
            "Unauthorized call. Thanks for supporting the network with your ETH."
        );
    }

    /**
        @dev Checks if a given `typeId` exists.
        Reverts if given `typeId` does not exist.
        @param typeId The typeId which should be checked
    */
    function _isValidTypeId(uint256 typeId) internal view {
        require(_typeToMaxSupply[typeId] != 0, "TypeId does not exist.");
    }

    /**
        @dev Creates fungible and non-fungible types. This function only creates the type and is not used for minting.
        NFT types also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param isNF         Flag if the creation should be a non-fungible, false for fungible tokens
        @param maxSupply    The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @return             The `typeId`
    */
    function _create(bool isNF, uint256 maxSupply) private returns (uint256) {
        require(
            maxSupply != 0 && maxSupply <= MAX_TYPE_SUPPLY,
            "Minimum 1 and maximum 2**128 tokens of one type can exist."
        );

        // Store the type in the upper 128 bits
        uint256 typeId = (++_typeNonce << 128);

        // Set a flag if this is an NFI.
        if (isNF) typeId = typeId | TYPE_NF_BIT;

        _typeToMaxSupply[typeId] = maxSupply;
        _typeNonceToTypeId[_typeNonce] = typeId;

        // emit a Transfer event with Create semantic to help with discovery.
        emit TransferSingle(msg.sender, address(0x0), address(0x0), typeId, 0);

        return typeId;
    }

    /**
        @dev Sets a release timestamp.
        Reverts if `timestamp` == 0.
        Reverts if the `typeId` is released already.
        @param typeId       The type which should be set or updated
        @param timestamp    The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
    */
    function _setReleaseTimestamp(uint256 typeId, uint256 timestamp) private {
        require(
            timestamp != 0,
            "A 0 timestamp is not allowed. For immediate release choose 1337."
        );
        require(
            _tokenTypeToReleaseTimestamp[typeId] == 0 ||
                _tokenTypeToReleaseTimestamp[typeId] > block.timestamp,
            "This token is released already."
        );
        _tokenTypeToReleaseTimestamp[typeId] = timestamp;

        emit OnReleaseTimestamp(typeId, timestamp);
    }

    /**
        @dev Get the data hash required for the meta transaction comparison of burn executions.
        @param ids          An array of token Ids which should be burned
        @param values       An array of amounts which should be burned
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
        @return             The keccak256 hash of the data input
    */
    function _getBurnDataHash(
        uint256[] memory ids,
        uint256[] memory values,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(ids, values, nonce, maxTimestamp));
    }

    /**
        @dev Get the data hash required for the meta transaction comparison of transfer executions.
        @param signer       The signer of the transaction
        @param _to          The receiver address
        @param _id          An token id which should be transfered
        @param _value       An amount which should be transfered
        @param _data        Additional data field
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
        @return             The keccak256 hash of the data input
    */
    function _getSafeTransferFromDataHash(
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes memory _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    signer,
                    _to,
                    _id,
                    _value,
                    _data,
                    nonce,
                    maxTimestamp
                )
            );
    }

    /**
        @dev Get the data hash required for the meta transaction comparison of transfer executions.
        @param signer       The signer of the transaction
        @param _to          The receiver address
        @param _ids         An array of token Ids which should be transfered
        @param _values      An array of amounts which should be transfered
        @param _data        Additional data field
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
        @return             The keccak256 hash of the data input
    */
    function _getSafeBatchTransferFromDataHash(
        address signer,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _values,
        bytes memory _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    signer,
                    _to,
                    _ids,
                    _values,
                    _data,
                    nonce,
                    maxTimestamp
                )
            );
    }

    /**
        @dev Get the data hash required for the meta transaction comparison of transfer executions.
        @param _operator    Address to add to the set of authorized operators
        @param _approved    True if the operator is approved, false to revoke approval
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
        @return             The keccak256 hash of the data input
    */
    function _getSetApprovalForAllHash(
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(_operator, _approved, nonce, maxTimestamp)
            );
    }

    /**
        @dev Checks if the contract allows receiving ERC1155 in case the "to" address is a contract.
        The receiving contract needs to implement IERC1155TokenReceiver.
        @param operator The operator address
        @param from     The address of the holder whose balance is decreased
        @param to       Target address
        @param id       ID of the token type
        @param amount   Transfer amount
        @param data     Additional data field
    */
    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal {
        if (to.isContract()) {
            try
                IERC1155TokenReceiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (
                    response !=
                    IERC1155TokenReceiver(to).onERC1155Received.selector
                ) {
                    revert("ERC1155: ERC1155TokenReceiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert(
                    "ERC1155: transfer to non ERC1155TokenReceiver implementer"
                );
            }
        }
    }

    /**
        @dev Checks if the contract allows receiving ERC1155 in case the "to" address is a contract.
        The receiving contract needs to implement IERC1155TokenReceiver.
        @param operator The operator address
        @param from     The address of the holder whose balance is decreased
        @param to       Target address
        @param ids      Array of ids of the token types
        @param amounts  Array of amounts of to transfer
        @param data     Additional data field
    */
    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal {
        if (to.isContract()) {
            try
                IERC1155TokenReceiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response !=
                    IERC1155TokenReceiver(to).onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Activated","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":[],"name":"Inactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"enum IAssets.PropertyType","name":"propertyType","type":"uint8"}],"name":"OnCreateProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OnReleaseTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"value","type":"address[]"}],"name":"OnUpdateAddressArrayProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"OnUpdateAddressProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"OnUpdateByteProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"int256[]","name":"value","type":"int256[]"}],"name":"OnUpdateIntArrayProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"value","type":"int256"}],"name":"OnUpdateIntProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"OnUpdateStringProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"MAX_TYPE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NF_INDEX_MASK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE_MASK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE_NF_BIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createAddressArrayProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createAddressProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createByteProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"createFungibleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createIntArrayProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createIntProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"createNonFungibleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createStringProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"getContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getFungibleAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"getMetaNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getMintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getNonFungibleAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNonFungibleBaseType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNonFungibleIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPropertyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"propertyId","type":"uint256"}],"name":"getPropertyType","outputs":[{"internalType":"enum IAssets.PropertyType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getReleaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeNonce","type":"uint256"}],"name":"getTypeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTypeIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTypeNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungibleBaseType","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungibleItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaBatchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSafeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSetApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256[]","name":"quantitiesArr","type":"uint256[]"}],"name":"mintFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"toArr","type":"address[]"}],"name":"mintNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"propertyCounter","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":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setActive","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":[],"name":"setInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setReleaseTimestamp","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"address[]","name":"value","type":"address[]"}],"name":"updateAddressArrayProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"address","name":"value","type":"address"}],"name":"updateAddressProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"updateByteProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"name":"updateIntArrayProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"int256","name":"value","type":"int256"}],"name":"updateIntProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"updateMetadataBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"string","name":"value","type":"string"}],"name":"updateStringProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005b6238038062005b6283398101604081905262000034916200015f565b80620000476301ffc9a760e01b620000db565b60018054610100600160a81b0319166101006001600160a01b03841602179055620000796389edd2db60e01b620000db565b506200008c6363dcd68160e11b620000db565b6200009e636cdb3d1360e11b620000db565b620000b06303a24d0760e21b620000db565b620000c2637aa46e1560e11b620000db565b620000d46345bd216f60e01b620000db565b506200018f565b6001600160e01b031980821614156200013a5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b60006020828403121562000171578081fd5b81516001600160a01b038116811462000188578182fd5b9392505050565b6159c3806200019f6000396000f3fe608060405234801561001057600080fd5b50600436106103985760003560e01c80636c27479d116101e9578063adebf6f21161010f578063e44591f0116100ad578063f242432a1161007c578063f242432a1461086f578063f519ca0c14610882578063f941908814610895578063fba7cc79146108a857610398565b8063e44591f0146107fa578063e985e9c514610814578063f1b9ee2414610850578063f21de1e81461085857610398565b8063ca4708ee116100e9578063ca4708ee146107c0578063d090e47e146107d3578063d270acb9146107dc578063d905af55146107ef57610398565b8063adebf6f214610782578063aefa7d981461079a578063c55ebe69146107ad57610398565b80638b3188ce11610187578063a22cb46511610156578063a22cb46514610736578063a6203b6314610749578063a91ee0dc1461075c578063ab7b9a311461076f57610398565b80638b3188ce146106da5780639b6b5b66146106ed5780639cca1c64146107005780639f0ab7da1461072357610398565b8063760a8c2a116101c3578063760a8c2a1461069957806378b27221146106a157806378c9adad146106b4578063829dc5f0146106c757610398565b80636c27479d1461064f5780636f969c2d146106625780637269a3271461068657610398565b80632f817bf8116102ce5780635a6471551161026c5780636352211e1161023b5780636352211e146105d35780636712f55f146106145780636907aa57146106345780636b7dfd721461064757610398565b80635a6471551461057c5780635e495d74146105a55780635e81b958146105b85780635ff66eb7146105cb57610398565b806349eae3c5116102a857806349eae3c51461051a5780634a71aa0a146105325780634e1273f41461054557806352fb73991461056557610398565b80632f817bf8146104e15780633dfbc247146104f4578063491078f41461050757610398565b80630f94cc501161033b57806319ef07881161031557806319ef078814610487578063282a84da1461049a5780632ccd2c84146104bb5780632eb2c2d6146104ce57610398565b80630f94cc501461045457806315ee4ee31461046c57806319daa4401461047457610398565b806305a85c2c1161037757806305a85c2c146103fb578063084e6adf1461040e57806308f51a84146104215780630e89341c1461043457610398565b8062fdd58e1461039d57806301ffc9a7146103c35780630478b6b9146103e6575b600080fd5b6103b06103ab366004614d6c565b6108b3565b6040519081526020015b60405180910390f35b6103d66103d1366004614e1c565b610923565b60405190151581526020016103ba565b6103f96103f4366004614f45565b61095e565b005b6103b0610409366004615135565b610bb0565b6103b061041c366004615175565b610c03565b6103f961042f3660046152ec565b610c27565b610447610442366004615175565b610c94565b6040516103ba91906156f3565b6103b06fffffffffffffffffffffffffffffffff1981565b6103b0610d32565b6103f9610482366004614fca565b610d39565b6103b0610495366004615135565b611169565b6104ad6104a8366004614b9a565b6111b5565b6040516103ba929190615677565b6103f96104c936600461524e565b6113cd565b6103f96104dc366004614c0a565b6113ee565b6103b06104ef36600461524e565b6117fe565b6103b0610502366004615135565b611821565b6103b061051536600461524e565b61186d565b6103b070010000000000000000000000000000000081565b6103f96105403660046152ec565b611884565b610558610553366004614d97565b6118e0565b6040516103ba9190615664565b6103b06fffffffffffffffffffffffffffffffff81565b6103b061058a366004614b9a565b6001600160a01b03166000908152600a602052604090205490565b6103b06105b3366004615175565b611ac8565b6103d66105c6366004615175565b611ae8565b610558611b12565b6105fc6105e1366004615175565b6000908152600c60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016103ba565b610627610622366004615175565b611bc9565b6040516103ba919061569c565b6103f961064236600461526f565b611bec565b6002546103b0565b6103b061065d366004615135565b611c52565b6103b0610670366004615175565b6fffffffffffffffffffffffffffffffff191690565b6103d6610694366004615175565b611c9e565b6103f9611cc7565b6103f96106af3660046151d7565b611d06565b6103f96106c2366004615135565b611f98565b6103b06106d5366004615135565b611fac565b6103f96106e83660046152a7565b611ff5565b6103b06106fb366004615175565b612051565b6103b061070e366004615175565b6fffffffffffffffffffffffffffffffff1690565b610558610731366004614b9a565b6120c3565b6103f9610744366004614d3f565b612291565b6103b0610757366004615175565b612305565b6103f961076a366004614b9a565b612325565b6103f961077d3660046152a7565b61250f565b6103d6610790366004615175565b600160ff1b161590565b6105fc6107a8366004615175565b61256b565b6103b06107bb366004615135565b612601565b6103f96107ce366004615317565b61264d565b6103b060025481565b6103f96107ea366004615081565b6126a9565b6103b0600160ff1b81565b6103d6610808366004615175565b600160ff1b9081161490565b6103d6610822366004614bd2565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205460ff1690565b6103f9612b05565b6105fc60015461010090046001600160a01b031690565b6103f961087d366004614cc5565b612b42565b6103f9610890366004614e54565b612dc9565b6103f96108a336600461518d565b6134ff565b60015460ff166103d6565b60006108be82611ae8565b156108f8576000828152600c60205260409020546001600160a01b038481169116146108eb5760006108ee565b60015b60ff16905061091d565b506000818152600b602090815260408083206001600160a01b03861684529091529020545b92915050565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b61096661373b565b600061097485858585613793565b905060006109d86109d2836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b896137ef565b9050866001600160a01b0316816001600160a01b031614610a405760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964207369676e61747572652e000000000000000000000000000060448201526064015b60405180910390fd5b824210610a9e5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a37565b6001600160a01b0387166000908152600a60205260409020548414610b145760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a37565b6001600160a01b0387166000908152600a60205260408120805491610b388361584c565b90915550506001600160a01b038181166000818152600d60209081526040808320948b1680845294825291829020805460ff19168a151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050505050505050565b6000610bba61386a565b610bfc83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060039250613917915050565b9392505050565b600081610c0f816139d8565b60008381526006602052604090205491505b50919050565b610c2f61386a565b82610c3981613a33565b82610c4381613aff565b836000610c508282613b5c565b85877f5eaea1ab442fc547ed0ca77214f10950027909260a85911e2b428c3c0f8cf46787604051610c8391815260200190565b60405180910390a350505050505050565b606061091d60048054610ca6906157ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd2906157ea565b8015610d1f5780601f10610cf457610100808354040283529160200191610d1f565b820191906000526020600020905b815481529060010190602001808311610d0257829003601f168201915b5050505050610d2d84613c22565b613d84565b6003545b90565b610d4161373b565b6000610d8a8989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a9150613dc09050565b90506000610dee610de8836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8c6137ef565b9050806001600160a01b03168a6001600160a01b03161480610e3a57506001600160a01b03808b166000908152600d602090815260408083209385168352929052205460ff1615156001145b610e9e5760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a37565b824210610efc5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a37565b6001600160a01b038a166000908152600a60205260409020548414610f725760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a37565b6001600160a01b038a166000908152600a60205260408120805491610f968361584c565b90915550506001600160a01b038916610ff15760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a37565b600160ff1b808916141561105e576000888152600c60205260409020546001600160a01b038b811691161461102557600080fd5b6000888152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038b161790556110cd565b6000888152600b602090815260408083206001600160a01b038e168452909152812080548992906110909084906157a3565b90915550506000888152600b602090815260408083206001600160a01b038d168452909152812080548992906110c7908490615727565b90915550505b60408051898152602081018990526001600160a01b03808c1692908d169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461115c338b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e0292505050565b5050505050505050505050565b600061117361386a565b610bfc83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060029250613917915050565b606080600060015b600354811161122857608081901b60008181526007602052604090205415611215576000818152600b602090815260408083206001600160a01b038a1684529091529020541561121557826112118161584c565b9350505b50806112208161584c565b9150506111bd565b5060008167ffffffffffffffff81111561125257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561127b578160200160208202803683370190505b50905060008267ffffffffffffffff8111156112a757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156112d0578160200160208202803683370190505b5060009350905060015b60035481116113c157608081901b600081815260076020526040902054156113ae576000818152600b602090815260408083206001600160a01b038c168452909152902054156113ae578084868151811061134557634e487b7160e01b600052603260045260246000fd5b6020908102919091018101919091526000828152600b825260408082206001600160a01b038c1683529092522054835184908790811061139557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152846113aa8161584c565b9550505b50806113b98161584c565b9150506112da565b50909350915050915091565b6113d561386a565b816113df816139d8565b6113e98383613fed565b505050565b6113f661373b565b6001600160a01b03871661144c5760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a37565b84831461149b5760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e677468206d757374206d617463680000000000000000006044820152606401610a37565b6001600160a01b0388163314806114da57506001600160a01b0388166000908152600d6020908152604080832033845290915290205460ff1615156001145b61153e5760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a37565b60005b858110156116f457600087878381811061156b57634e487b7160e01b600052603260045260246000fd5b905060200201359050600086868481811061159657634e487b7160e01b600052603260045260246000fd5b9050602002013590506115af82600160ff1b9081161490565b15611613576000828152600c60205260409020546001600160a01b038c81169116146115da57600080fd5b6000828152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c161790556116e1565b6000828152600b602090815260408083206001600160a01b038f1684529091529020546116419082906157a3565b600b600084815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600b600083815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002054816116bd9190615727565b6000838152600b602090815260408083206001600160a01b038f1684529091529020555b5050806116ed9061584c565b9050611541565b50866001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89898989604051611748949392919061563d565b60405180910390a46117f433898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061412792505050565b5050505050505050565b600061180861386a565b60006118156001856142ef565b9050610bfc8184613fed565b600061182b61386a565b610bfc83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060049250613917915050565b600061187761386a565b60006118156000856142ef565b61188c61386a565b8261189681613a33565b826118a081613aff565b8360036118ad8282613b5c565b85877f43227f67dc2dfb884342caef2f9c7a09a99b9f02ab2c524b6e1cf8bc854a6d6687604051610c8391815260200190565b60608382146118ee57600080fd5b60008467ffffffffffffffff81111561191757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611940578160200160208202803683370190505b50905060005b85811015611abe57600085858381811061197057634e487b7160e01b600052603260045260246000fd5b90506020020135905061198281611ae8565b15611a1b578787838181106119a757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119bc9190614b9a565b6000828152600c60205260409020546001600160a01b039081169116146119e45760006119e7565b60015b60ff16838381518110611a0a57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050611aad565b6000818152600b6020526040812090898985818110611a4a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611a5f9190614b9a565b6001600160a01b03166001600160a01b0316815260200190815260200160002054838381518110611aa057634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b50611ab78161584c565b9050611946565b5095945050505050565b600081611ad4816139d8565b505060009081526007602052604090205490565b6000600160ff1b80831614801561091d5750506fffffffffffffffffffffffffffffffff16151590565b6060600060035467ffffffffffffffff811115611b3f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b68578160200160208202803683370190505b50905060005b600354811015611bc357611b866106fb826001615727565b828281518110611ba657634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611bbb8161584c565b915050611b6e565b50905090565b600081611bd581613aff565b505060009081526005602052604090205460ff1690565b611bf461386a565b82611bfe81613a33565b82611c0881613aff565b836002611c158282613b5c565b6040516001600160a01b0386168152869088907fe6fddd529ce511f88c7ea518e8bcd74716a89345a44ceb7a02a63c6319500c1e90602001610c83565b6000611c5c61386a565b610bfc83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250613917915050565b6000600160ff1b80831614801561091d5750506fffffffffffffffffffffffffffffffff161590565b611ccf614410565b6001805460ff1916811790556040517fed1cd0670ee0c0017f550451a038818c696d0b6a9d6ce5b369e44275573cf9b090600090a1565b611d0e61386a565b84611d18816139d8565b600160ff1b861615611d925760405162461bcd60e51b815260206004820152602360248201527f5468697320747970654964206973206e6f7420612066756e6769626c6520747960448201527f70652e00000000000000000000000000000000000000000000000000000000006064820152608401610a37565b838214611de15760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610a37565b60005b84811015611f26576000868683818110611e0e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e239190614b9a565b90506000858584818110611e4757634e487b7160e01b600052603260045260246000fd5b60008c8152600b602090815260408083206001600160a01b038916845282528220805493909102949094013594508493925090611e85908490615727565b909155505060008981526006602052604081208054839290611ea8908490615727565b9091555050604080518a8152602081018390526001600160a01b0384169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f133333848c8560405180602001604052806000815250613e02565b505080611f1f9061584c565b9050611de4565b506000868152600760209081526040808320546006909252909120541115611f905760405162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e000000000000000000000000000000000000006044820152606401610a37565b505050505050565b611fa061386a565b6113e9600483836149fe565b6000611fb661386a565b610bfc83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250613917915050565b611ffd61386a565b8361200781613a33565b8361201181613aff565b84600561201e8282613b5c565b86887fb698dab408fb6e2c5e168a33c150bc87854d0e8eb37bcab3883691019f85b7088888604051610b9e9291906155be565b6000600354821115801561206457508115155b6120b05760405162461bcd60e51b815260206004820152601960248201527f547970654e6f6e636520646f6573206e6f742065786973742e000000000000006044820152606401610a37565b5060009081526009602052604090205490565b6060600060015b600354811161216557608081901b600160ff1b17600081815260076020526040902054156121525760015b6000828152600660205260409020548111612150578082176000818152600c60205260409020546001600160a01b038881169116141561213d57846121398161584c565b9550505b50806121488161584c565b9150506120f5565b505b508061215d8161584c565b9150506120ca565b5060008167ffffffffffffffff81111561218f57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156121b8578160200160208202803683370190505b5060009250905060015b600354811161228957608081901b600160ff1b17600081815260076020526040902054156122765760015b6000828152600660205260409020548111612274578082176000818152600c60205260409020546001600160a01b0389811691161415612261578085878151811061224857634e487b7160e01b600052603260045260246000fd5b60209081029190910101528561225d8161584c565b9650505b508061226c8161584c565b9150506121ed565b505b50806122818161584c565b9150506121c2565b509392505050565b61229961373b565b336000818152600d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081612311816139d8565b505060009081526008602052604090205490565b61232d614494565b600180547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0384160217905561237b60015461010090046001600160a01b031690565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f60e56d110000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391909116906301ffc9a79060240160206040518083038186803b1580156123f557600080fd5b505afa925050508015612425575060408051601f3d908101601f1916820190925261242291810190614e00565b60015b6124975760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610a37565b8061250a5760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610a37565b505b50565b61251761386a565b8361252181613a33565b8361252b81613aff565b8460046125388282613b5c565b86887fbbd005d6024e5cd44017cf21a00d7fa1aaf59e19edb7fc5bb1f04629a8fee4088888604051610b9e92919061560c565b600061258460015461010090046001600160a01b031690565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016125b191815260200190565b60206040518083038186803b1580156125c957600080fd5b505afa1580156125dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091d9190614bb6565b600061260b61386a565b610bfc83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060059250613917915050565b61265561386a565b8361265f81613a33565b8361266981613aff565b8460016126768282613b5c565b86887fe27ba0a6870802af6a1f5b15e632c86c1a8c9441586cb5ac1b785527fa3a02d28888604051610b9e9291906156c4565b6126b161386a565b600061272487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525088925087915061449e9050565b9050876001600160a01b031661279061278a836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8b6137ef565b6001600160a01b0316146127e65760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964207369676e61747572652e00000000000000000000000000006044820152606401610a37565b8584146128355760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610a37565b8142106128935760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a37565b6001600160a01b0388166000908152600a602052604090205483146129095760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a37565b6001600160a01b0388166000908152600a6020526040812080549161292d8361584c565b919050555060005b86811015612a9d57600088888381811061295f57634e487b7160e01b600052603260045260246000fd5b90506020020135905061297881600160ff1b9081161490565b15612a14576000818152600c60205260409020546001600160a01b038b81169116146129e65760405162461bcd60e51b815260206004820152601660248201527f596f7520617265206e6f7420746865206f776e65722e000000000000000000006044820152606401610a37565b6000818152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055612a8c565b6000878784818110612a3657634e487b7160e01b600052603260045260246000fd5b90506020020135905080600b600084815260200190815260200160002060008d6001600160a01b03166001600160a01b031681526020019081526020016000206000828254612a8591906157a3565b9091555050505b50612a968161584c565b9050612935565b5060006001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a8a8a604051612af2949392919061563d565b60405180910390a4505050505050505050565b612b0d614410565b6001805460ff191690556040517f83b03c3d41b5de9902c98822951ff375666c0cd7fd69f8993c0267ad087734d190600090a1565b612b4a61373b565b6001600160a01b038516612ba05760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a37565b6001600160a01b038616331480612bdf57506001600160a01b0386166000908152600d6020908152604080832033845290915290205460ff1615156001145b612c435760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a37565b600160ff1b8085161415612cb0576000848152600c60205260409020546001600160a01b03878116911614612c7757600080fd5b6000848152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716179055612d3a565b6000848152600b602090815260408083206001600160a01b038a168452909152902054612cde9084906157a3565b6000858152600b602090815260408083206001600160a01b038b81168552925280832093909355871681522054612d16908490615727565b6000858152600b602090815260408083206001600160a01b038a1684529091529020555b60408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f90338787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e0292505050565b612dd161373b565b6000612efb612ef5612ea28d8d8d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c91506144b79050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8d6137ef565b9050806001600160a01b03168b6001600160a01b03161480612f4757506001600160a01b03808c166000908152600d602090815260408083209385168352929052205460ff1615156001145b612fab5760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a37565b878614612ffa5760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610a37565b8142106130585760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a37565b6001600160a01b038b166000908152600a602052604090205483146130ce5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a37565b6001600160a01b038b166000908152600a602052604081208054916130f28361584c565b90915550506001600160a01b038a1661314d5760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a37565b87861461319c5760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e677468206d757374206d617463680000000000000000006044820152606401610a37565b60005b888110156133e0576131dd8a8a838181106131ca57634e487b7160e01b600052603260045260246000fd5b90506020020135600160ff1b9081161490565b156132a0578b6001600160a01b0316600c60008c8c8581811061321057634e487b7160e01b600052603260045260246000fd5b60209081029290920135835250810191909152604001600020546001600160a01b03161461323d57600080fd5b8a600c60008c8c8581811061326257634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506133d0565b8787828181106132c057634e487b7160e01b600052603260045260246000fd5b90506020020135600b60008c8c858181106132eb57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461333291906157a3565b90915550889050878281811061335857634e487b7160e01b600052603260045260246000fd5b90506020020135600b60008c8c8581811061338357634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546133ca9190615727565b90915550505b6133d98161584c565b905061319f565b50896001600160a01b03168b6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c604051613434949392919061563d565b60405180910390a46134f1338c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061412792505050565b505050505050505050505050565b61350761386a565b82613511816139d8565b600160ff1b8085161461358c5760405162461bcd60e51b815260206004820152602760248201527f5468697320747970654964206973206e6f742061206e6f6e2066756e6769626c60448201527f6520747970652e000000000000000000000000000000000000000000000000006064820152608401610a37565b6000848152600660205260408120546135a6906001615727565b6000868152600660205260408120805492935085929091906135c9908490615727565b90915550600090505b838110156136ca5760008585838181106135fc57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906136119190614b9a565b9050600061361f8385615727565b88176000818152600c60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816908117909155815185815260019381019390935293945033917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46136b733338484600160405180602001604052806000815250613e02565b5050806136c39061584c565b90506135d2565b5060008581526007602090815260408083205460069092529091205411156137345760405162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e000000000000000000000000000000000000006044820152606401610a37565b5050505050565b6001805460ff161515146137915760405162461bcd60e51b815260206004820152601a60248201527f54686520636f6e7472616374206973206e6f74206163746976650000000000006044820152606401610a37565b565b6040516bffffffffffffffffffffffff19606086901b16602082015283151560f81b603482015260358101839052605581018290526000906075015b604051602081830303815290604052805190602001209050949350505050565b600081516041146138425760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a37565b60208201516040830151606084015160001a613860868285856144d6565b9695505050505050565b33613875600361256b565b6001600160a01b0316146137915760405162461bcd60e51b815260206004820152604360248201527f556e617574686f72697a65642063616c6c2e205468616e6b7320666f7220737560448201527f70706f7274696e6720746865206e6574776f726b207769746820796f7572204560648201527f54482e0000000000000000000000000000000000000000000000000000000000608482015260a401610a37565b60028054600091826139288361584c565b909155505060025460009081526005602081905260409091208054849260ff1990911690600190849081111561396e57634e487b7160e01b600052602160045260246000fd5b021790555081600581111561399357634e487b7160e01b600052602160045260246000fd5b7fd5773e0c12c5a7e1b711e66c7b9f3fe7c25cb73e0fdd332614a0a35bed00801b600254856040516139c6929190615706565b60405180910390a25060025492915050565b60008181526007602052604090205461250c5760405162461bcd60e51b815260206004820152601660248201527f54797065496420646f6573206e6f742065786973742e000000000000000000006044820152606401610a37565b600160ff1b8082161415613aaa576000818152600c60205260409020546001600160a01b0316613aa55760405162461bcd60e51b815260206004820152601760248201527f546f6b656e496420646f6573206e6f742065786973742e0000000000000000006044820152606401610a37565b61250c565b613ab381611ac8565b61250c5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e496420646f6573206e6f742065786973742e0000000000000000006044820152606401610a37565b6002548111158015613b1057508015155b61250c5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642070726f7065727479207265717565737465642e00000000006044820152606401610a37565b806005811115613b7c57634e487b7160e01b600052602160045260246000fd5b60008381526005602081905260409091205460ff1690811115613baf57634e487b7160e01b600052602160045260246000fd5b1461250a5760405162461bcd60e51b815260206004820152603760248201527f54686520676976656e2070726f706572747920696420646f6573206e6f74206d60448201527f61746368207468652070726f706572747920747970652e0000000000000000006064820152608401610a37565b606081613c63575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610959565b8160005b8115613c8d5780613c778161584c565b9150613c869050600a83615764565b9150613c67565b60008167ffffffffffffffff811115613cb657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613ce0576020820181803683370190505b509050815b8515613d7b57613cf66001826157a3565b90506000613d05600a88615764565b613d1090600a615784565b613d1a90886157a3565b613d2590603061573f565b905060008160f81b905080848481518110613d5057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613d72600a89615764565b97505050613ce5565b50949350505050565b6060610bfc838360405180602001604052806000815250604051806020016040528060008152506040518060200160405280600081525061467f565b600087878787878787604051602001613ddf9796959493929190615495565b604051602081830303815290604052805190602001209050979650505050505050565b6001600160a01b0384163b15611f905760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613e46908990899088908890889060040161557b565b602060405180830381600087803b158015613e6057600080fd5b505af1925050508015613e90575060408051601f3d908101601f19168201909252613e8d91810190614e38565b60015b613f4657613e9c615893565b806308c379a01415613ed65750613eb16158aa565b80613ebc5750613ed8565b8060405162461bcd60e51b8152600401610a3791906156f3565b505b60405162461bcd60e51b815260206004820152603960248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f546f6b656e526563656976657220696d706c656d656e746572000000000000006064820152608401610a37565b7fffffffff00000000000000000000000000000000000000000000000000000000811663f23a6e6160e01b14613fe45760405162461bcd60e51b815260206004820152602d60248201527f455243313135353a2045524331313535546f6b656e526563656976657220726560448201527f6a656374656420746f6b656e73000000000000000000000000000000000000006064820152608401610a37565b50505050505050565b80614062576040805162461bcd60e51b81526020600482015260248101919091527f4120302074696d657374616d70206973206e6f7420616c6c6f7765642e20466f60448201527f7220696d6d6564696174652072656c656173652063686f6f736520313333372e6064820152608401610a37565b600082815260086020526040902054158061408a575060008281526008602052604090205442105b6140d65760405162461bcd60e51b815260206004820152601f60248201527f5468697320746f6b656e2069732072656c656173656420616c72656164792e006044820152606401610a37565b600082815260086020526040908190208290555182907fbb3d1cf2b9311031fc607cdae1b14e022317b838640f988d4ec0d7cf4e81c6109061411b9084815260200190565b60405180910390a25050565b6001600160a01b0384163b15611f905760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061416b908990899088908890889060040161551d565b602060405180830381600087803b15801561418557600080fd5b505af19250505080156141b5575060408051601f3d908101601f191682019092526141b291810190614e38565b60015b614251576141c1615893565b806308c379a014156141e157506141d66158aa565b80613ebc57506141e3565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610a37565b7fffffffff00000000000000000000000000000000000000000000000000000000811663bc197c8160e01b14613fe45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610a37565b6000811580159061431157507001000000000000000000000000000000008211155b6143835760405162461bcd60e51b815260206004820152603a60248201527f4d696e696d756d203120616e64206d6178696d756d20322a2a31323820746f6b60448201527f656e73206f66206f6e6520747970652063616e2065786973742e0000000000006064820152608401610a37565b600060806003600081546143969061584c565b9182905550901b905083156143ac57600160ff1b175b60008181526007602090815260408083208690556003548352600982528083208490558051848152918201839052829133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a49392505050565b60015461010090046001600160a01b03163314806144485750614433600161256b565b6001600160a01b0316336001600160a01b0316145b6137915760405162461bcd60e51b815260206004820152601160248201527f556e617574686f72697a65642063616c6c0000000000000000000000000000006044820152606401610a37565b614433600161256b565b6000848484846040516020016137cf94939291906154f5565b600087878787878787604051602001613ddf9796959493929190615434565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156145535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a37565b8360ff16601b148061456857508360ff16601c145b6145bf5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a37565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015614613573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166146765760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a37565b95945050505050565b805182518451865188516060948a948a948a948a948a946000949093909290916146a99190615727565b6146b39190615727565b6146bd9190615727565b6146c79190615727565b67ffffffffffffffff8111156146ed57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614717576020820181803683370190505b509050806000805b88518110156147ab5788818151811061474857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836147628161584c565b94508151811061478257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806147a38161584c565b91505061471f565b5060005b875181101561483b578781815181106147d857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836147f28161584c565b94508151811061481257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806148338161584c565b9150506147af565b5060005b86518110156148cb5786818151811061486857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836148828161584c565b9450815181106148a257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806148c38161584c565b91505061483f565b5060005b855181101561495b578581815181106148f857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836149128161584c565b94508151811061493257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806149538161584c565b9150506148cf565b5060005b84518110156149eb5784818151811061498857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836149a28161584c565b9450815181106149c257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806149e38161584c565b91505061495f565b50909d9c50505050505050505050505050565b828054614a0a906157ea565b90600052602060002090601f016020900481019282614a2c5760008555614a72565b82601f10614a455782800160ff19823516178555614a72565b82800160010185558215614a72579182015b82811115614a72578235825591602001919060010190614a57565b50614a7e929150614a82565b5090565b5b80821115614a7e5760008155600101614a83565b80356109598161593c565b60008083601f840112614ab3578081fd5b50813567ffffffffffffffff811115614aca578182fd5b6020830191508360208083028501011115614ae457600080fd5b9250929050565b60008083601f840112614afc578182fd5b50813567ffffffffffffffff811115614b13578182fd5b602083019150836020828501011115614ae457600080fd5b600082601f830112614b3b578081fd5b813567ffffffffffffffff811115614b5557614b5561587d565b604051614b6c601f8301601f19166020018261581f565b818152846020838601011115614b80578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614bab578081fd5b8135610bfc8161593c565b600060208284031215614bc7578081fd5b8151610bfc8161593c565b60008060408385031215614be4578081fd5b8235614bef8161593c565b91506020830135614bff8161593c565b809150509250929050565b60008060008060008060008060a0898b031215614c25578384fd5b8835614c308161593c565b97506020890135614c408161593c565b9650604089013567ffffffffffffffff80821115614c5c578586fd5b614c688c838d01614aa2565b909850965060608b0135915080821115614c80578586fd5b614c8c8c838d01614aa2565b909650945060808b0135915080821115614ca4578384fd5b50614cb18b828c01614aeb565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215614cdd578182fd5b8635614ce88161593c565b95506020870135614cf88161593c565b94506040870135935060608701359250608087013567ffffffffffffffff811115614d21578283fd5b614d2d89828a01614aeb565b979a9699509497509295939492505050565b60008060408385031215614d51578182fd5b8235614d5c8161593c565b91506020830135614bff81615951565b60008060408385031215614d7e578182fd5b8235614d898161593c565b946020939093013593505050565b60008060008060408587031215614dac578384fd5b843567ffffffffffffffff80821115614dc3578586fd5b614dcf88838901614aa2565b90965094506020870135915080821115614de7578384fd5b50614df487828801614aa2565b95989497509550505050565b600060208284031215614e11578081fd5b8151610bfc81615951565b600060208284031215614e2d578081fd5b8135610bfc8161595f565b600060208284031215614e49578081fd5b8151610bfc8161595f565b60008060008060008060008060008060006101008c8e031215614e75578485fd5b67ffffffffffffffff808d351115614e8b578586fd5b614e988e8e358f01614b2b565b9b50614ea660208e01614a97565b9a50614eb460408e01614a97565b99508060608e01351115614ec6578586fd5b614ed68e60608f01358f01614aa2565b909950975060808d0135811015614eeb578586fd5b614efb8e60808f01358f01614aa2565b909750955060a08d0135811015614f10578384fd5b50614f218d60a08e01358e01614aeb565b9b9e9a9d50989b979a96999598949794969560c08601359560e00135945092505050565b60008060008060008060c08789031215614f5d578384fd5b863567ffffffffffffffff811115614f73578485fd5b614f7f89828a01614b2b565b9650506020870135614f908161593c565b94506040870135614fa08161593c565b93506060870135614fb081615951565b9598949750929560808101359460a0909101359350915050565b60008060008060008060008060006101008a8c031215614fe8578283fd5b893567ffffffffffffffff80821115614fff578485fd5b61500b8d838e01614b2b565b9a5060208c0135915061501d8261593c565b90985060408b01359061502f8261593c565b90975060608b0135965060808b0135955060a08b01359080821115615052578485fd5b5061505f8c828d01614aeb565b9a9d999c50979a96999598959660c08101359660e09091013595509350505050565b60008060008060008060008060c0898b03121561509c578182fd5b883567ffffffffffffffff808211156150b3578384fd5b6150bf8c838d01614b2b565b995060208b013591506150d18261593c565b90975060408a013590808211156150e6578384fd5b6150f28c838d01614aa2565b909850965060608b013591508082111561510a578384fd5b506151178b828c01614aa2565b999c989b5096999598969760808701359660a0013595509350505050565b60008060208385031215615147578182fd5b823567ffffffffffffffff81111561515d578283fd5b61516985828601614aeb565b90969095509350505050565b600060208284031215615186578081fd5b5035919050565b6000806000604084860312156151a1578081fd5b83359250602084013567ffffffffffffffff8111156151be578182fd5b6151ca86828701614aa2565b9497909650939450505050565b6000806000806000606086880312156151ee578283fd5b85359450602086013567ffffffffffffffff8082111561520c578485fd5b61521889838a01614aa2565b90965094506040880135915080821115615230578283fd5b5061523d88828901614aa2565b969995985093965092949392505050565b60008060408385031215615260578182fd5b50508035926020909101359150565b600080600060608486031215615283578081fd5b8335925060208401359150604084013561529c8161593c565b809150509250925092565b600080600080606085870312156152bc578182fd5b8435935060208501359250604085013567ffffffffffffffff8111156152e0578283fd5b614df487828801614aa2565b600080600060608486031215615300578081fd5b505081359360208301359350604090920135919050565b6000806000806060858703121561532c578182fd5b8435935060208501359250604085013567ffffffffffffffff811115615350578283fd5b614df487828801614aeb565b60008284527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561538d578081fd5b6020830280836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b838110156153d8578151875295820195908201906001016153bc565b509495945050505050565b805160009060208084018383156153d8578151875295820195908201906001016153bc565b600081518084526154208160208601602086016157ba565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff19808a60601b168352808960601b1660148401525061546e61546860288401896153e3565b876153e3565b855161547e818360208a016157ba565b019384525050602082015260400195945050505050565b60006bffffffffffffffffffffffff19808a60601b168352808960601b1660148401525086602883015285604883015284516154d88160688501602089016157ba565b909101606881019390935250608882015260a80195945050505050565b600061550a61550483886153e3565b866153e3565b9384525050602082015260400192915050565b60006001600160a01b03808816835280871660208401525060a0604083015261554960a08301866153a9565b828103606084015261555b81866153a9565b9050828103608084015261556f8185615408565b98975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526155b360a0830184615408565b979650505050505050565b60208082528181018390526000908460408401835b868110156156015782356155e68161593c565b6001600160a01b0316825291830191908301906001016155d3565b509695505050505050565b60208082528181018390526000908460408401835b8681101561560157823582529183019190830190600101615621565b60006040825261565160408301868861535c565b82810360208401526155b381858761535c565b600060208252610bfc60208301846153a9565b60006040825261568a60408301856153a9565b828103602084015261467681856153a9565b60208101600683106156be57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b600060208252610bfc6020830184615408565b60008382526040602083015261571f6040830184615408565b949350505050565b6000821982111561573a5761573a615867565b500190565b600060ff821660ff84168060ff0382111561575c5761575c615867565b019392505050565b60008261577f57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561579e5761579e615867565b500290565b6000828210156157b5576157b5615867565b500390565b60005b838110156157d55781810151838201526020016157bd565b838111156157e4576000848401525b50505050565b6002810460018216806157fe57607f821691505b60208210811415610c2157634e487b7160e01b600052602260045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156158455761584561587d565b6040525050565b600060001982141561586057615860615867565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115610d3657600481823e5160e01c90565b600060443d10156158ba57610d36565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156158ec575050505050610d36565b828501915081518181111561590657505050505050610d36565b843d870101602082850101111561592257505050505050610d36565b6159316020828601018761581f565b509094505050505090565b6001600160a01b038116811461250c57600080fd5b801515811461250c57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461250c57600080fdfea2646970667358221220a86c551bc518eec3293dc47b2892f9c06907b7ca284c701732f848af376fa70c64736f6c63430008020033000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51

-----Decoded View---------------
Arg [0] : registryAddress (address): 0x801b308f0213445e070f0d0cc052db38c17eda51

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51


Deployed ByteCode Sourcemap

69049:40696:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96131:254;;;;;;:::i;:::-;;:::i;:::-;;;26443:25:1;;;26431:2;26416:18;96131:254:0;;;;;;;;37830:183;;;;;;:::i;:::-;;:::i;:::-;;;26270:14:1;;26263:22;26245:41;;26233:2;26218:18;37830:183:0;26200:92:1;77337:1122:0;;;;;;:::i;:::-;;:::i;:::-;;83679:220;;;;;;:::i;:::-;;:::i;94033:205::-;;;;;;:::i;:::-;;:::i;84387:382::-;;;;;;:::i;:::-;;:::i;90686:155::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69624:71::-;;-1:-1:-1;;69624:71:0;;93926:99;;;:::i;73047:2078::-;;;;;;:::i;:::-;;:::i;83445:226::-;;;;;;:::i;:::-;;:::i;92874:1044::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;89978:230::-;;;;;;:::i;:::-;;:::i;79996:1434::-;;;;;;:::i;:::-;;:::i;87013:321::-;;;;;;:::i;:::-;;:::i;83907:228::-;;;;;;:::i;:::-;;:::i;87342:319::-;;;;;;:::i;:::-;;:::i;69482:48::-;;69524:6;69482:48;;85588:386;;;;;;:::i;:::-;;:::i;96393:634::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69764:59::-;;;;;94453:170;;;;;;:::i;:::-;-1:-1:-1;;;;;94589:26:0;94557:7;94589:26;;;:18;:26;;;;;;;94453:170;94246:199;;;;;;:::i;:::-;;:::i;95738:269::-;;;;;;:::i;:::-;;:::i;91075:279::-;;;:::i;96015:108::-;;;;;;:::i;:::-;96075:7;96102:13;;;:8;:13;;;;;;-1:-1:-1;;;;;96102:13:0;;96015:108;;;;-1:-1:-1;;;;;21935:55:1;;;21917:74;;21905:2;21890:18;96015:108:0;21872:125:1;90330:230:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;85185:395::-;;;;;;:::i;:::-;;:::i;90568:110::-;90655:15;;90568:110;;83213:224;;;;;;:::i;:::-;;:::i;95278:166::-;;;;;;:::i;:::-;-1:-1:-1;;95421:15:0;;95278:166;95452:278;;;;;;:::i;:::-;;:::i;46524:133::-;;;:::i;88716:1254::-;;;;;;:::i;:::-;;:::i;86827:178::-;;;;;;:::i;:::-;;:::i;82987:218::-;;;;;;:::i;:::-;;:::i;86398:421::-;;;;;;:::i;:::-;;:::i;91362:300::-;;;;;;:::i;:::-;;:::i;95103:167::-;;;;;;:::i;:::-;95249:13;95243:19;;95103:167;91670:1196;;;;;;:::i;:::-;;:::i;78467:257::-;;;;;;:::i;:::-;;:::i;90849:218::-;;;;;;:::i;:::-;;:::i;46811:615::-;;;;;;:::i;:::-;;:::i;85982:408::-;;;;;;:::i;:::-;;:::i;94978:117::-;;;;;;:::i;:::-;-1:-1:-1;;;95065:17:0;:22;;94978:117;47769:175;;;;;;:::i;:::-;;:::i;84143:236::-;;;;;;:::i;:::-;;:::i;84777:400::-;;;;;;:::i;:::-;;:::i;70164:30::-;;;;;;81552:1427;;;;;;:::i;:::-;;:::i;69894:46::-;;-1:-1:-1;;;69894:46:0;;94840:130;;;;;;:::i;:::-;-1:-1:-1;;;94930:17:0;;;:32;;94840:130;94631:201;;;;;;:::i;:::-;-1:-1:-1;;;;;94789:24:0;;;94760:4;94789:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;94631:201;46665:138;;;:::i;47650:111::-;;47737:16;;;;;-1:-1:-1;;;;;47737:16:0;;47650:111;78732:1256;;;;;;:::i;:::-;;:::i;75133:2196::-;;;;;;:::i;:::-;;:::i;87669:1039::-;;;;;;:::i;:::-;;:::i;47548:94::-;47625:9;;;;47548:94;;96131:254;96247:7;96276:22;96294:3;96276:17;:22::i;:::-;96272:66;;;96307:13;;;;:8;:13;;;;;;-1:-1:-1;;;;;96307:23:0;;;:13;;:23;:31;;96337:1;96307:31;;;96333:1;96307:31;96300:38;;;;;;96272:66;-1:-1:-1;96356:13:0;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;96356:21:0;;;;;;;;;;96131:254;;;;;:::o;37830:183::-;37972:33;;;37943:4;37972:33;;;;;;;;;;;;;37830:183;;;;:::o;77337:1122::-;45540:16;:14;:16::i;:::-;77610::::1;77642:151;77686:9;77714;77742:5;77766:12;77642:25;:151::i;:::-;77610:183;;77804:26;77846:64;77860:38;77889:8;65952:58:::0;;21628:66:1;65952:58:0;;;21616:79:1;21711:12;;;21704:28;;;65783:7:0;;21748:12:1;;65952:58:0;;;;;;;;;;;;65924:101;;;;;;65904:121;;65687:346;;;;77860:38:::1;77900:9;77846:13;:64::i;:::-;77804:106;;77951:6;-1:-1:-1::0;;;;;77929:28:0::1;:18;-1:-1:-1::0;;;;;77929:28:0::1;;77921:59;;;::::0;-1:-1:-1;;;77921:59:0;;39844:2:1;77921:59:0::1;::::0;::::1;39826:21:1::0;39883:2;39863:18;;;39856:30;39922:20;39902:18;;;39895:48;39960:18;;77921:59:0::1;;;;;;;;;78031:12;78013:15;:30;77991:118;;;::::0;-1:-1:-1;;;77991:118:0;;30880:2:1;77991:118:0::1;::::0;::::1;30862:21:1::0;30919:2;30899:18;;;30892:30;30958:34;30938:18;;;30931:62;-1:-1:-1;;;31009:18:1;;;31002:36;31055:19;;77991:118:0::1;30852:228:1::0;77991:118:0::1;-1:-1:-1::0;;;;;78142:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;78120:123;;;::::0;-1:-1:-1;;;78120:123:0;;37905:2:1;78120:123:0::1;::::0;::::1;37887:21:1::0;37944:2;37924:18;;;37917:30;37983:34;37963:18;;;37956:62;-1:-1:-1;;;38034:18:1;;;38027:36;38080:19;;78120:123:0::1;37877:228:1::0;78120:123:0::1;-1:-1:-1::0;;;;;78254:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;78320:36:0;;::::1;;::::0;;;:16:::1;:36;::::0;;;;;;;:47;;::::1;::::0;;;;;;;;;;:59;;-1:-1:-1;;78320:59:0::1;::::0;::::1;;::::0;;::::1;::::0;;;78395:56;;26245:41:1;;;78395:56:0::1;::::0;26218:18:1;78395:56:0::1;;;;;;;;45567:1;;77337:1122:::0;;;;;;:::o;83679:220::-;83819:7;71923:27;:25;:27::i;:::-;83851:40:::1;83867:4;;83851:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;83873:17:0::1;::::0;-1:-1:-1;83851:15:0::1;::::0;-1:-1:-1;;83851:40:0:i:1;:::-;83844:47:::0;83679:220;-1:-1:-1;;;83679:220:0:o;94033:205::-;94171:7;94145:6;72028:22;72043:6;72028:14;:22::i;:::-;94203:27:::1;::::0;;;:19:::1;:27;::::0;;;;;;-1:-1:-1;72061:1:0::1;94033:205:::0;;;;:::o;84387:382::-;71923:27;:25;:27::i;:::-;84593:7:::1;71563:22;71577:7;71563:13;:22::i;:::-;84627:10:::2;71669:28;71686:10;71669:16;:28::i;:::-;84663:10:::3;84675:16;71807:41;71823:10;71835:12;71807:15;:41::i;:::-;84743:10:::4;84734:7;84714:47;84755:5;84714:47;;;;26443:25:1::0;;26431:2;26416:18;;26398:76;84714:47:0::4;;;;;;;;71708:1:::3;;71596::::2;71961::::1;84387:382:::0;;;:::o;90686:155::-;90742:13;90775:58;90793:16;90775:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90811:21;90828:3;90811:16;:21::i;:::-;90775:17;:58::i;93926:99::-;94007:10;;93926:99;;:::o;73047:2078::-;45540:16;:14;:16::i;:::-;73366::::1;73398:216;73445:6;73470:3;73492;73514:6;73539:5;;73398:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;73563:5:0;;-1:-1:-1;73587:12:0;;-1:-1:-1;73398:28:0::1;::::0;-1:-1:-1;73398:216:0:i:1;:::-;73366:248;;73625:26;73667:64;73681:38;73710:8;65952:58:::0;;21628:66:1;65952:58:0;;;21616:79:1;21711:12;;;21704:28;;;65783:7:0;;21748:12:1;;65952:58:0;;;;;;;;;;;;65924:101;;;;;;65904:121;;65687:346;;;;73681:38:::1;73721:9;73667:13;:64::i;:::-;73625:106;;73774:18;-1:-1:-1::0;;;;;73764:28:0::1;:6;-1:-1:-1::0;;;;;73764:28:0::1;;:101;;;-1:-1:-1::0;;;;;;73813:24:0;;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;:44;;::::1;::::0;;;;;;;::::1;;:52;;:44:::0;:52:::1;73764:101;73742:198;;;::::0;-1:-1:-1;;;73742:198:0;;35111:2:1;73742:198:0::1;::::0;::::1;35093:21:1::0;35150:2;35130:18;;;35123:30;35189:34;35169:18;;;35162:62;-1:-1:-1;;;35240:18:1;;;35233:45;35295:19;;73742:198:0::1;35083:237:1::0;73742:198:0::1;73991:12;73973:15;:30;73951:118;;;::::0;-1:-1:-1;;;73951:118:0;;30880:2:1;73951:118:0::1;::::0;::::1;30862:21:1::0;30919:2;30899:18;;;30892:30;30958:34;30938:18;;;30931:62;-1:-1:-1;;;31009:18:1;;;31002:36;31055:19;;73951:118:0::1;30852:228:1::0;73951:118:0::1;-1:-1:-1::0;;;;;74102:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;74080:123;;;::::0;-1:-1:-1;;;74080:123:0;;37905:2:1;74080:123:0::1;::::0;::::1;37887:21:1::0;37944:2;37924:18;;;37917:30;37983:34;37963:18;;;37956:62;-1:-1:-1;;;38034:18:1;;;38027:36;38080:19;;74080:123:0::1;37877:228:1::0;74080:123:0::1;-1:-1:-1::0;;;;;74214:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;74288:19:0;::::1;74280:59;;;::::0;-1:-1:-1;;;74280:59:0;;32041:2:1;74280:59:0::1;::::0;::::1;32023:21:1::0;32080:2;32060:18;;;32053:30;32119:29;32099:18;;;32092:57;32166:18;;74280:59:0::1;32013:177:1::0;74280:59:0::1;-1:-1:-1::0;;;94930:17:0;;;:32;74350:525:::1;;;74397:13;::::0;;;:8:::1;:13;::::0;;;;;-1:-1:-1;;;;;74397:23:0;;::::1;:13:::0;::::1;:23;74389:32;;;::::0;::::1;;74436:13;::::0;;;:8:::1;:13;::::0;;;;:19;;-1:-1:-1;;74436:19:0::1;-1:-1:-1::0;;;;;74436:19:0;::::1;;::::0;;74350:525:::1;;;74789:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;74789:21:0;::::1;::::0;;;;;;;:31;;74814:6;;74789:13;:31:::1;::::0;74814:6;;74789:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;74835:13:0::1;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;74835:18:0;::::1;::::0;;;;;;;:28;;74857:6;;74835:13;:28:::1;::::0;74857:6;;74835:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;74350:525:0::1;74890:52;::::0;;40705:25:1;;;40761:2;40746:18;;40739:34;;;-1:-1:-1;;;;;74890:52:0;;::::1;::::0;;;::::1;::::0;74905:10:::1;::::0;74890:52:::1;::::0;40678:18:1;74890:52:0::1;;;;;;;74953:164;74998:10;75023:6;75044:3;75062;75080:6;75101:5;;74953:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;74953:30:0::1;::::0;-1:-1:-1;;;74953:164:0:i:1;:::-;45567:1;;73047:2078:::0;;;;;;;;;:::o;83445:226::-;83588:7;71923:27;:25;:27::i;:::-;83620:43:::1;83636:4;;83620:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;83642:20:0::1;::::0;-1:-1:-1;83620:15:0::1;::::0;-1:-1:-1;;83620:43:0:i:1;92874:1044::-:0;92982:16;;93034:15;93077:1;93060:262;93085:10;;93080:1;:15;93060:262;;93139:3;93134:8;;;93117:14;93161:24;;;:16;:24;;;;;;:29;93157:154;;93241:1;93215:16;;;:8;:16;;;;;;;;-1:-1:-1;;;;;93215:23:0;;;;;;;;;;:27;93211:85;;93267:9;;;;:::i;:::-;;;;93211:85;-1:-1:-1;93097:3:0;;;;:::i;:::-;;;;93060:262;;;;93334:26;93377:7;93363:22;;;;;;-1:-1:-1;;;93363:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93363:22:0;;93334:51;;93396:30;93443:7;93429:22;;;;;;-1:-1:-1;;;93429:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93429:22:0;-1:-1:-1;93472:1:0;;-1:-1:-1;93396:55:0;-1:-1:-1;93501:1:0;93484:383;93509:10;;93504:1;:15;93484:383;;93563:3;93558:8;;;93541:14;93585:24;;;:16;:24;;;;;;:29;93581:275;;93665:1;93639:16;;;:8;:16;;;;;;;;-1:-1:-1;;;;;93639:23:0;;;;;;;;;;:27;93635:206;;93712:6;93691:9;93701:7;93691:18;;;;;;-1:-1:-1;;;93691:18:0;;;;;;;;;;;;;;;;;;;:27;;;;93766:16;;;;:8;:16;;;;;;-1:-1:-1;;;;;93766:23:0;;;;;;;;;93741:22;;:13;;93755:7;;93741:22;;;;-1:-1:-1;;;93741:22:0;;;;;;;;;;;;;;;;;;:48;93812:9;;;;:::i;:::-;;;;93635:206;-1:-1:-1;93521:3:0;;;;:::i;:::-;;;;93484:383;;;-1:-1:-1;93885:9:0;;-1:-1:-1;93896:13:0;-1:-1:-1;;92874:1044:0;;;:::o;89978:230::-;71923:27;:25;:27::i;:::-;90137:6:::1;72028:22;72043:6;72028:14;:22::i;:::-;90161:39:::2;90182:6;90190:9;90161:20;:39::i;:::-;71961:1:::1;89978:230:::0;;:::o;79996:1434::-;45540:16;:14;:16::i;:::-;-1:-1:-1;;;;;80230:19:0;::::1;80222:59;;;::::0;-1:-1:-1;;;80222:59:0;;32041:2:1;80222:59:0::1;::::0;::::1;32023:21:1::0;32080:2;32060:18;;;32053:30;32119:29;32099:18;;;32092:57;32166:18;;80222:59:0::1;32013:177:1::0;80222:59:0::1;80300:29:::0;;::::1;80292:65;;;::::0;-1:-1:-1;;;80292:65:0;;40191:2:1;80292:65:0::1;::::0;::::1;40173:21:1::0;40230:2;40210:18;;;40203:30;40269:25;40249:18;;;40242:53;40312:18;;80292:65:0::1;40163:173:1::0;80292:65:0::1;-1:-1:-1::0;;;;;80523:19:0;::::1;80532:10;80523:19;::::0;:66:::1;;-1:-1:-1::0;;;;;;80546:23:0;::::1;;::::0;;;:16:::1;:23;::::0;;;;;;;80570:10:::1;80546:35:::0;;;;;;;;::::1;;:43;;:35:::0;:43:::1;80523:66;80501:163;;;::::0;-1:-1:-1;;;80501:163:0;;35111:2:1;80501:163:0::1;::::0;::::1;35093:21:1::0;35150:2;35130:18;;;35123:30;35189:34;35169:18;;;35162:62;-1:-1:-1;;;35240:18:1;;;35233:45;35295:19;;80501:163:0::1;35083:237:1::0;80501:163:0::1;80682:9;80677:493;80697:15:::0;;::::1;80677:493;;;80802:10;80815:4;;80820:1;80815:7;;;;;-1:-1:-1::0;;;80815:7:0::1;;;;;;;;;;;;;;;80802:20;;80837:13;80853:7;;80861:1;80853:10;;;;;-1:-1:-1::0;;;80853:10:0::1;;;;;;;;;;;;;;;80837:26;;80884:17;80898:2;-1:-1:-1::0;;;94930:17:0;;;:32;;94840:130;80884:17:::1;80880:279;;;80930:12;::::0;;;:8:::1;:12;::::0;;;;;-1:-1:-1;;;;;80930:21:0;;::::1;:12:::0;::::1;:21;80922:30;;;::::0;::::1;;80971:12;::::0;;;:8:::1;:12;::::0;;;;:18;;-1:-1:-1;;80971:18:0::1;-1:-1:-1::0;;;;;80971:18:0;::::1;;::::0;;80880:279:::1;;;81052:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;81052:19:0;::::1;::::0;;;;;;;;:27:::1;::::0;81074:5;;81052:27:::1;:::i;:::-;81030:8;:12;81039:2;81030:12;;;;;;;;;;;:19;81043:5;-1:-1:-1::0;;;;;81030:19:0::1;-1:-1:-1::0;;;;;81030:19:0::1;;;;;;;;;;;;:49;;;;81126:8;:12;81135:2;81126:12;;;;;;;;;;;:17;81139:3;-1:-1:-1::0;;;;;81126:17:0::1;-1:-1:-1::0;;;;;81126:17:0::1;;;;;;;;;;;;;81118:5;:25;;;;:::i;:::-;81098:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;81098:17:0;::::1;::::0;;;;;;;:45;80880:279:::1;80677:493;;80714:3;;;;:::i;:::-;;;80677:493;;;;81220:3;-1:-1:-1::0;;;;;81187:52:0::1;81213:5;-1:-1:-1::0;;;;;81187:52:0::1;81201:10;-1:-1:-1::0;;;;;81187:52:0::1;;81225:4;;81231:7;;81187:52;;;;;;;;;:::i;:::-;;;;;;;;81252:170;81302:10;81327:5;81347:3;81365:4;;81252:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;81252:170:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;81384:7:0;;-1:-1:-1;81384:7:0;;;;81252:170;::::1;::::0;81384:7;;81252:170;81384:7;81252:170;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;81252:170:0::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;81406:5:0;;-1:-1:-1;81406:5:0;;;;81252:170;::::1;81406:5:::0;;;;81252:170;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;81252:35:0::1;::::0;-1:-1:-1;;;81252:170:0:i:1;:::-;79996:1434:::0;;;;;;;;:::o;87013:321::-;87179:7;71923:27;:25;:27::i;:::-;87204:14:::1;87221:24;87229:4;87235:9;87221:7;:24::i;:::-;87204:41;;87256:46;87277:6;87285:16;87256:20;:46::i;83907:228::-:0;84051:7;71923:27;:25;:27::i;:::-;84083:44:::1;84099:4;;84083:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;84105:21:0::1;::::0;-1:-1:-1;84083:15:0::1;::::0;-1:-1:-1;;84083:44:0:i:1;87342:319::-:0;87505:7;71923:27;:25;:27::i;:::-;87530:14:::1;87547:25;87555:5;87562:9;87547:7;:25::i;85588:386::-:0;71923:27;:25;:27::i;:::-;85796:7:::1;71563:22;71577:7;71563:13;:22::i;:::-;85830:10:::2;71669:28;71686:10;71669:16;:28::i;:::-;85866:10:::3;85878:17;71807:41;71823:10;71835:12;71807:15;:41::i;:::-;85948:10:::4;85939:7;85918:48;85960:5;85918:48;;;;26443:25:1::0;;26431:2;26416:18;;26398:76;96393:634:0;96538:16;96580:29;;;96572:38;;;;;;96623:26;96666:7;96652:29;;;;;;-1:-1:-1;;;96652:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96652:29:0;;96623:58;;96699:9;96694:297;96714:18;;;96694:297;;;96754:10;96767:4;;96772:1;96767:7;;;;;-1:-1:-1;;;96767:7:0;;;;;;;;;;;;;;;96754:20;;96793:21;96811:2;96793:17;:21::i;:::-;96789:191;;;96866:7;;96874:1;96866:10;;;;;-1:-1:-1;;;96866:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96850:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;96850:12:0;;;:26;;;:34;;96883:1;96850:34;;;96879:1;96850:34;96835:49;;:9;96845:1;96835:12;;;;;;-1:-1:-1;;;96835:12:0;;;;;;;;;;;;;;:49;;;;;96789:191;;;96940:12;;;;:8;:12;;;;;;96953:7;;96961:1;96953:10;;;;;-1:-1:-1;;;96953:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;96940:24:0;-1:-1:-1;;;;;96940:24:0;;;;;;;;;;;;;96925:9;96935:1;96925:12;;;;;;-1:-1:-1;;;96925:12:0;;;;;;;;;;;;;;:39;;;;;96789:191;-1:-1:-1;96734:3:0;;;:::i;:::-;;;96694:297;;;-1:-1:-1;97010:9:0;96393:634;-1:-1:-1;;;;;96393:634:0:o;94246:199::-;94381:7;94355:6;72028:22;72043:6;72028:14;:22::i;:::-;-1:-1:-1;;94413:24:0::1;::::0;;;:16:::1;:24;::::0;;;;;;94246:199::o;95738:269::-;95844:4;-1:-1:-1;;;69932:8:0;95936:3;:17;:32;95935:64;;;;-1:-1:-1;;95980:13:0;95974:19;:24;;;95738:269::o;91075:279::-;91127:16;91156:26;91199:10;;91185:25;;;;;;-1:-1:-1;;;91185:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;91185:25:0;;91156:54;;91226:9;91221:99;91245:10;;91241:1;:14;91221:99;;;91292:16;91302:5;:1;91306;91302:5;:::i;91292:16::-;91277:9;91287:1;91277:12;;;;;;-1:-1:-1;;;91277:12:0;;;;;;;;;;;;;;;;;;:31;91257:3;;;;:::i;:::-;;;;91221:99;;;-1:-1:-1;91337:9:0;-1:-1:-1;91075:279:0;:::o;90330:230::-;90478:12;90448:10;71669:28;71686:10;71669:16;:28::i;:::-;-1:-1:-1;;90515:37:0::1;::::0;;;:25:::1;:37;::::0;;;;;::::1;;::::0;90330:230::o;85185:395::-;71923:27;:25;:27::i;:::-;85396:7:::1;71563:22;71577:7;71563:13;:22::i;:::-;85430:10:::2;71669:28;71686:10;71669:16;:28::i;:::-;85466:10:::3;85478:20;71807:41;71823:10;71835:12;71807:15;:41::i;:::-;85521:51:::4;::::0;-1:-1:-1;;;;;21935:55:1;;21917:74;;85554:10:0;;85545:7;;85521:51:::4;::::0;21905:2:1;21890:18;85521:51:0::4;21872:125:1::0;83213:224:0;83355:7;71923:27;:25;:27::i;:::-;83387:42:::1;83403:4;;83387:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;83409:19:0::1;::::0;-1:-1:-1;83387:15:0::1;::::0;-1:-1:-1;;83387:42:0:i:1;95452:278::-:0;95562:4;-1:-1:-1;;;69932:8:0;95659:3;:17;:32;95658:64;;;;-1:-1:-1;;95703:13:0;95697:19;:24;;95452:278::o;46524:133::-;45722:30;:28;:30::i;:::-;46616:4:::1;46604:16:::0;;-1:-1:-1;;46604:16:0::1;::::0;::::1;::::0;;46638:11:::1;::::0;::::1;::::0;46604:9:::1;::::0;46638:11:::1;46524:133::o:0;88716:1254::-;71923:27;:25;:27::i;:::-;88907:6:::1;72028:22;72043:6;72028:14;:22::i;:::-;-1:-1:-1::0;;;95065:17:0;;:22;88926:66:::2;;;::::0;-1:-1:-1;;;88926:66:0;;39089:2:1;88926:66:0::2;::::0;::::2;39071:21:1::0;39128:2;39108:18;;;39101:30;39167:34;39147:18;;;39140:62;39238:5;39218:18;;;39211:33;39261:19;;88926:66:0::2;39061:225:1::0;88926:66:0::2;89025:36:::0;;::::2;89003:110;;;::::0;-1:-1:-1;;;89003:110:0;;38736:2:1;89003:110:0::2;::::0;::::2;38718:21:1::0;38775:2;38755:18;;;38748:30;38814:26;38794:18;;;38787:54;38858:18;;89003:110:0::2;38708:174:1::0;89003:110:0::2;89131:9;89126:708;89146:16:::0;;::::2;89126:708;;;89184:10;89197:5;;89203:1;89197:8;;;;;-1:-1:-1::0;;;89197:8:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89184:21;;89220:16;89239:13;;89253:1;89239:16;;;;;-1:-1:-1::0;;;89239:16:0::2;;;;;;;;;89318;::::0;;;:8:::2;89239:16;89318::::0;;;;;;;-1:-1:-1;;;;;89318:20:0;::::2;::::0;;;;;;:32;;89239:16;;;::::2;::::0;;;::::2;;::::0;-1:-1:-1;89239:16:0;;89318:20;-1:-1:-1;89318:16:0;:32:::2;::::0;89239:16;;89318:32:::2;:::i;:::-;::::0;;;-1:-1:-1;;89365:27:0::2;::::0;;;:19:::2;:27;::::0;;;;:39;;89396:8;;89365:27;:39:::2;::::0;89396:8;;89365:39:::2;:::i;:::-;::::0;;;-1:-1:-1;;89546:62:0::2;::::0;;40705:25:1;;;40761:2;40746:18;;40739:34;;;-1:-1:-1;;;;;89546:62:0;::::2;::::0;89581:3:::2;::::0;89561:10:::2;::::0;89546:62:::2;::::0;40678:18:1;89546:62:0::2;;;;;;;89625:197;89674:10;89703;89732:2;89753:6;89778:8;89625:197;;;;;;;;;;;::::0;:30:::2;:197::i;:::-;89126:708;;89164:3;;;;:::i;:::-;;;89126:708;;;-1:-1:-1::0;89897:24:0::2;::::0;;;:16:::2;:24;::::0;;;;;;;;89866:19:::2;:27:::0;;;;;;;:55:::2;;89844:118;;;::::0;-1:-1:-1;;;89844:118:0;;32397:2:1;89844:118:0::2;::::0;::::2;32379:21:1::0;32436:2;32416:18;;;32409:30;32475:15;32455:18;;;32448:43;32508:18;;89844:118:0::2;32369:163:1::0;89844:118:0::2;71961:1:::1;88716:1254:::0;;;;;:::o;86827:178::-;71923:27;:25;:27::i;:::-;86971:26:::1;:16;86990:7:::0;;86971:26:::1;:::i;82987:218::-:0;83126:7;71923:27;:25;:27::i;:::-;83158:39:::1;83174:4;;83158:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;83158:39:0;-1:-1:-1;83158:15:0::1;::::0;-1:-1:-1;;83158:39:0:i:1;86398:421::-:0;71923:27;:25;:27::i;:::-;86625:7:::1;71563:22;71577:7;71563:13;:22::i;:::-;86659:10:::2;71669:28;71686:10;71669:16;:28::i;:::-;86695:10:::3;86707:25;71807:41;71823:10;71835:12;71807:15;:41::i;:::-;86793:10:::4;86784:7;86755:56;86805:5;;86755:56;;;;;;;:::i;91362:300::-:0;91466:7;91526:10;;91513:9;:23;;:41;;;;-1:-1:-1;91540:14:0;;;91513:41;91491:116;;;;-1:-1:-1;;;91491:116:0;;32739:2:1;91491:116:0;;;32721:21:1;32778:2;32758:18;;;32751:30;32817:27;32797:18;;;32790:55;32862:18;;91491:116:0;32711:175:1;91491:116:0;-1:-1:-1;91625:29:0;;;;:18;:29;;;;;;;91362:300::o;91670:1196::-;91781:16;91815:15;91858:1;91841:427;91866:10;;91861:1;:15;91841:427;;91921:3;91916:8;;;-1:-1:-1;;;91915:24:0;91898:14;91958:24;;;:16;:24;;;;;;:29;91954:303;;92025:1;92008:234;92033:27;;;;:19;:27;;;;;;92028:32;;92008:234;;92103:10;;;92090;92140:12;;;:8;:12;;;;;;-1:-1:-1;;;;;92140:21:0;;;:12;;:21;92136:87;;;92190:9;;;;:::i;:::-;;;;92136:87;-1:-1:-1;92062:3:0;;;;:::i;:::-;;;;92008:234;;;;91954:303;-1:-1:-1;91878:3:0;;;;:::i;:::-;;;;91841:427;;;;92280:23;92320:7;92306:22;;;;;;-1:-1:-1;;;92306:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92306:22:0;-1:-1:-1;92349:1:0;;-1:-1:-1;92280:48:0;-1:-1:-1;92378:1:0;92361:474;92386:10;;92381:1;:15;92361:474;;92441:3;92436:8;;;-1:-1:-1;;;92435:24:0;92418:14;92478:24;;;:16;:24;;;;;;:29;92474:350;;92545:1;92528:281;92553:27;;;;:19;:27;;;;;;92548:32;;92528:281;;92623:10;;;92610;92660:12;;;:8;:12;;;;;;-1:-1:-1;;;;;92660:21:0;;;:12;;:21;92656:134;;;92728:2;92710:6;92717:7;92710:15;;;;;;-1:-1:-1;;;92710:15:0;;;;;;;;;;;;;;;;;;:20;92757:9;;;;:::i;:::-;;;;92656:134;-1:-1:-1;92582:3:0;;;;:::i;:::-;;;;92528:281;;;;92474:350;-1:-1:-1;92398:3:0;;;;:::i;:::-;;;;92361:474;;;-1:-1:-1;92852:6:0;91670:1196;-1:-1:-1;;;91670:1196:0:o;78467:257::-;45540:16;:14;:16::i;:::-;78618:10:::1;78601:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;78601:39:0;::::1;::::0;;;;;;;;;;:51;;-1:-1:-1;;78601:51:0::1;::::0;::::1;;::::0;;::::1;::::0;;;78668:48;;26245:41:1;;;78601:39:0;;78618:10;78668:48:::1;::::0;26218:18:1;78668:48:0::1;;;;;;;78467:257:::0;;:::o;90849:218::-;90991:7;90965:6;72028:22;72043:6;72028:14;:22::i;:::-;-1:-1:-1;;91023:36:0::1;::::0;;;:28:::1;:36;::::0;;;;;;90849:218::o;46811:615::-;45624:20;:18;:20::i;:::-;46938:16:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;;;46938:34:0;::::1;;;::::0;;47002:19:::1;47737:16:::0;;;;;-1:-1:-1;;;;;47737:16:0;;47650:111;47002:19:::1;:66;::::0;;;;47040:27:::1;47002:66;::::0;::::1;27026:98:1::0;-1:-1:-1;;;;;47002:37:0;;;::::1;::::0;::::1;::::0;26999:18:1;;47002:66:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;47002:66:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;47002:66:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;46985:434;;47302:105;::::0;-1:-1:-1;;;47302:105:0;;30088:2:1;47302:105:0::1;::::0;::::1;30070:21:1::0;30127:2;30107:18;;;30100:30;30166:34;30146:18;;;30139:62;30237:33;30217:18;;;30210:61;30288:19;;47302:105:0::1;30060:253:1::0;46985:434:0::1;47152:17;47126:142;;;::::0;-1:-1:-1;;;47126:142:0;;30088:2:1;47126:142:0::1;::::0;::::1;30070:21:1::0;30127:2;30107:18;;;30100:30;30166:34;30146:18;;;30139:62;30237:33;30217:18;;;30210:61;30288:19;;47126:142:0::1;30060:253:1::0;47126:142:0::1;47078:202;46985:434;46811:615:::0;:::o;85982:408::-;71923:27;:25;:27::i;:::-;86204:7:::1;71563:22;71577:7;71563:13;:22::i;:::-;86238:10:::2;71669:28;71686:10;71669:16;:28::i;:::-;86274:10:::3;86286:21;71807:41;71823:10;71835:12;71807:15;:41::i;:::-;86364:10:::4;86355:7;86330:52;86376:5;;86330:52;;;;;;;:::i;47769:175::-:0;47876:7;47908:19;47737:16;;;;;-1:-1:-1;;;;;47737:16:0;;47650:111;47908:19;-1:-1:-1;;;;;47908:23:0;;47932:3;47908:28;;;;;;;;;;;;;26443:25:1;;26431:2;26416:18;;26398:76;47908:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;84143:236::-;84291:7;71923:27;:25;:27::i;:::-;84323:48:::1;84339:4;;84323:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;84345:25:0::1;::::0;-1:-1:-1;84323:15:0::1;::::0;-1:-1:-1;;84323:48:0:i:1;84777:400::-:0;71923:27;:25;:27::i;:::-;84995:7:::1;71563:22;71577:7;71563:13;:22::i;:::-;85029:10:::2;71669:28;71686:10;71669:16;:28::i;:::-;85065:10:::3;85077:19;71807:41;71823:10;71835:12;71807:15;:41::i;:::-;85151:10:::4;85142:7;85119:50;85163:5;;85119:50;;;;;;;:::i;81552:1427::-:0;71923:27;:25;:27::i;:::-;81849:16:::1;81868:50;81885:3;;81868:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;81868:50:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;81890:6:0;;-1:-1:-1;81890:6:0;;;;81868:50;::::1;::::0;81890:6;;81868:50;81890:6;81868:50;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;81898:5:0;;-1:-1:-1;81905:12:0;;-1:-1:-1;81868:16:0::1;::::0;-1:-1:-1;81868:50:0:i:1;:::-;81849:69;;82053:6;-1:-1:-1::0;;;;;81951:108:0::1;81970:64;81984:38;82013:8;65952:58:::0;;21628:66:1;65952:58:0;;;21616:79:1;21711:12;;;21704:28;;;65783:7:0;;21748:12:1;;65952:58:0;;;;;;;;;;;;65924:101;;;;;;65904:121;;65687:346;;;;81984:38:::1;82024:9;81970:13;:64::i;:::-;-1:-1:-1::0;;;;;81951:108:0::1;;81929:176;;;::::0;-1:-1:-1;;;81929:176:0;;39844:2:1;81929:176:0::1;::::0;::::1;39826:21:1::0;39883:2;39863:18;;;39856:30;39922:20;39902:18;;;39895:48;39960:18;;81929:176:0::1;39816:168:1::0;81929:176:0::1;82124:27:::0;;::::1;82116:64;;;::::0;-1:-1:-1;;;82116:64:0;;38736:2:1;82116:64:0::1;::::0;::::1;38718:21:1::0;38775:2;38755:18;;;38748:30;38814:26;38794:18;;;38787:54;38858:18;;82116:64:0::1;38708:174:1::0;82116:64:0::1;82231:12;82213:15;:30;82191:118;;;::::0;-1:-1:-1;;;82191:118:0;;30880:2:1;82191:118:0::1;::::0;::::1;30862:21:1::0;30919:2;30899:18;;;30892:30;30958:34;30938:18;;;30931:62;-1:-1:-1;;;31009:18:1;;;31002:36;31055:19;;82191:118:0::1;30852:228:1::0;82191:118:0::1;-1:-1:-1::0;;;;;82342:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;82320:123;;;::::0;-1:-1:-1;;;82320:123:0;;37905:2:1;82320:123:0::1;::::0;::::1;37887:21:1::0;37944:2;37924:18;;;37917:30;37983:34;37963:18;;;37956:62;-1:-1:-1;;;38034:18:1;;;38027:36;38080:19;;82320:123:0::1;37877:228:1::0;82320:123:0::1;-1:-1:-1::0;;;;;82454:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;;;;;;82525:9;82520:376;82540:14:::0;;::::1;82520:376;;;82576:10;82589:3;;82593:1;82589:6;;;;;-1:-1:-1::0;;;82589:6:0::1;;;;;;;;;;;;;;;82576:19;;82614:17;82628:2;-1:-1:-1::0;;;94930:17:0;;;:32;;94840:130;82614:17:::1;82610:275;;;82660:12;::::0;;;:8:::1;:12;::::0;;;;;-1:-1:-1;;;;;82660:22:0;;::::1;:12:::0;::::1;:22;82652:57;;;::::0;-1:-1:-1;;;82652:57:0;;39493:2:1;82652:57:0::1;::::0;::::1;39475:21:1::0;39532:2;39512:18;;;39505:30;39571:24;39551:18;;;39544:52;39613:18;;82652:57:0::1;39465:172:1::0;82652:57:0::1;82751:3;82728:12:::0;;;:8:::1;:12;::::0;;;;:27;;-1:-1:-1;;82728:27:0::1;::::0;;82610:275:::1;;;82796:13;82812:6;;82819:1;82812:9;;;;;-1:-1:-1::0;;;82812:9:0::1;;;;;;;;;;;;;;;82796:25;;82864:5;82840:8;:12;82849:2;82840:12;;;;;;;;;;;:20;82853:6;-1:-1:-1::0;;;;;82840:20:0::1;-1:-1:-1::0;;;;;82840:20:0::1;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;82610:275:0::1;-1:-1:-1::0;82556:3:0::1;::::0;::::1;:::i;:::-;;;82520:376;;;;82953:3;-1:-1:-1::0;;;;;82911:60:0::1;82937:6;-1:-1:-1::0;;;;;82911:60:0::1;82925:10;-1:-1:-1::0;;;;;82911:60:0::1;;82959:3;;82964:6;;82911:60;;;;;;;;;:::i;:::-;;;;;;;;71961:1;81552:1427:::0;;;;;;;;:::o;46665:138::-;45722:30;:28;:30::i;:::-;46747:9:::1;:17:::0;;-1:-1:-1;;46747:17:0::1;::::0;;46782:13:::1;::::0;::::1;::::0;46759:5:::1;::::0;46782:13:::1;46665:138::o:0;78732:1256::-;45540:16;:14;:16::i;:::-;-1:-1:-1;;;;;78937:19:0;::::1;78929:59;;;::::0;-1:-1:-1;;;78929:59:0;;32041:2:1;78929:59:0::1;::::0;::::1;32023:21:1::0;32080:2;32060:18;;;32053:30;32119:29;32099:18;;;32092:57;32166:18;;78929:59:0::1;32013:177:1::0;78929:59:0::1;-1:-1:-1::0;;;;;79021:19:0;::::1;79030:10;79021:19;::::0;:66:::1;;-1:-1:-1::0;;;;;;79044:23:0;::::1;;::::0;;;:16:::1;:23;::::0;;;;;;;79068:10:::1;79044:35:::0;;;;;;;;::::1;;:43;;:35:::0;:43:::1;79021:66;78999:163;;;::::0;-1:-1:-1;;;78999:163:0;;35111:2:1;78999:163:0::1;::::0;::::1;35093:21:1::0;35150:2;35130:18;;;35123:30;35189:34;35169:18;;;35162:62;-1:-1:-1;;;35240:18:1;;;35233:45;35295:19;;78999:163:0::1;35083:237:1::0;78999:163:0::1;-1:-1:-1::0;;;94930:17:0;;;:32;79175:561:::1;;;79222:13;::::0;;;:8:::1;:13;::::0;;;;;-1:-1:-1;;;;;79222:22:0;;::::1;:13:::0;::::1;:22;79214:31;;;::::0;::::1;;79260:13;::::0;;;:8:::1;:13;::::0;;;;:19;;-1:-1:-1;;79260:19:0::1;-1:-1:-1::0;;;;;79260:19:0;::::1;;::::0;;79175:561:::1;;;79632:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;79632:20:0;::::1;::::0;;;;;;;;:29:::1;::::0;79655:6;;79632:29:::1;:::i;:::-;79609:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;79609:20:0;;::::1;::::0;;;;;;;:52;;;;79697:18;::::1;::::0;;;;:27:::1;::::0;79718:6;;79697:27:::1;:::i;:::-;79676:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;79676:18:0;::::1;::::0;;;;;;;:48;79175:561:::1;79753:51;::::0;;40705:25:1;;;40761:2;40746:18;;40739:34;;;-1:-1:-1;;;;;79753:51:0;;::::1;::::0;;;::::1;::::0;79768:10:::1;::::0;79753:51:::1;::::0;40678:18:1;79753:51:0::1;;;;;;;79817:163;79862:10;79887:5;79907:3;79925;79943:6;79964:5;;79817:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;79817:30:0::1;::::0;-1:-1:-1;;;79817:163:0:i:1;75133:2196::-:0;45540:16;:14;:16::i;:::-;75481:26:::1;75523:432;75555:357;75606:287;75666:6;75699:3;75729:4;;75606:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75760:7;;75606:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75794:5;;75606:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;75826:5:0;;-1:-1:-1;75858:12:0;;-1:-1:-1;75606:33:0::1;::::0;-1:-1:-1;75606:287:0:i:1;:::-;65952:58:::0;;21628:66:1;65952:58:0;;;21616:79:1;21711:12;;;21704:28;;;65783:7:0;;21748:12:1;;65952:58:0;;;;;;;;;;;;65924:101;;;;;;65904:121;;65687:346;;;;75555:357:::1;75931:9;75523:13;:432::i;:::-;75481:474;;75998:18;-1:-1:-1::0;;;;;75988:28:0::1;:6;-1:-1:-1::0;;;;;75988:28:0::1;;:101;;;-1:-1:-1::0;;;;;;76037:24:0;;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;:44;;::::1;::::0;;;;;;;::::1;;:52;;:44:::0;:52:::1;75988:101;75966:198;;;::::0;-1:-1:-1;;;75966:198:0;;35111:2:1;75966:198:0::1;::::0;::::1;35093:21:1::0;35150:2;35130:18;;;35123:30;35189:34;35169:18;;;35162:62;-1:-1:-1;;;35240:18:1;;;35233:45;35295:19;;75966:198:0::1;35083:237:1::0;75966:198:0::1;76183:29:::0;;::::1;76175:66;;;::::0;-1:-1:-1;;;76175:66:0;;38736:2:1;76175:66:0::1;::::0;::::1;38718:21:1::0;38775:2;38755:18;;;38748:30;38814:26;38794:18;;;38787:54;38858:18;;76175:66:0::1;38708:174:1::0;76175:66:0::1;76292:12;76274:15;:30;76252:118;;;::::0;-1:-1:-1;;;76252:118:0;;30880:2:1;76252:118:0::1;::::0;::::1;30862:21:1::0;30919:2;30899:18;;;30892:30;30958:34;30938:18;;;30931:62;-1:-1:-1;;;31009:18:1;;;31002:36;31055:19;;76252:118:0::1;30852:228:1::0;76252:118:0::1;-1:-1:-1::0;;;;;76403:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;76381:123;;;::::0;-1:-1:-1;;;76381:123:0;;37905:2:1;76381:123:0::1;::::0;::::1;37887:21:1::0;37944:2;37924:18;;;37917:30;37983:34;37963:18;;;37956:62;-1:-1:-1;;;38034:18:1;;;38027:36;38080:19;;76381:123:0::1;37877:228:1::0;76381:123:0::1;-1:-1:-1::0;;;;;76515:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;76589:19:0;::::1;76581:59;;;::::0;-1:-1:-1;;;76581:59:0;;32041:2:1;76581:59:0::1;::::0;::::1;32023:21:1::0;32080:2;32060:18;;;32053:30;32119:29;32099:18;;;32092:57;32166:18;;76581:59:0::1;32013:177:1::0;76581:59:0::1;76659:29:::0;;::::1;76651:65;;;::::0;-1:-1:-1;;;76651:65:0;;40191:2:1;76651:65:0::1;::::0;::::1;40173:21:1::0;40230:2;40210:18;;;40203:30;40269:25;40249:18;;;40242:53;40312:18;;76651:65:0::1;40163:173:1::0;76651:65:0::1;76732:9;76727:344;76747:15:::0;;::::1;76727:344;;;76788:22;76802:4;;76807:1;76802:7;;;;;-1:-1:-1::0;;;76802:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;94930:17:0;;;:32;;94840:130;76788:22:::1;76784:276;;;76860:6;-1:-1:-1::0;;;;;76839:27:0::1;:8;:17;76848:4;;76853:1;76848:7;;;;;-1:-1:-1::0;;;76848:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;::::1;;76839:17:::0;;-1:-1:-1;76839:17:0;::::1;::::0;;;;;;-1:-1:-1;76839:17:0;;-1:-1:-1;;;;;76839:17:0::1;:27;76831:36;;;::::0;::::1;;76906:3;76886:8;:17;76895:4;;76900:1;76895:7;;;;;-1:-1:-1::0;;;76895:7:0::1;;;;;;;;;;;;;;;76886:17;;;;;;;;;;;;:23;;;;;-1:-1:-1::0;;;;;76886:23:0::1;;;;;-1:-1:-1::0;;;;;76886:23:0::1;;;;;;76784:276;;;76979:7;;76987:1;76979:10;;;;;-1:-1:-1::0;;;76979:10:0::1;;;;;;;;;;;;;;;76950:8;:17;76959:4;;76964:1;76959:7;;;;;-1:-1:-1::0;;;76959:7:0::1;;;;;;;;;;;;;;;76950:17;;;;;;;;;;;:25;76968:6;-1:-1:-1::0;;;;;76950:25:0::1;-1:-1:-1::0;;;;;76950:25:0::1;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;77034:7:0;;-1:-1:-1;77034:7:0;77042:1;77034:10;;::::1;;;-1:-1:-1::0;;;77034:10:0::1;;;;;;;;;;;;;;;77008:8;:17;77017:4;;77022:1;77017:7;;;;;-1:-1:-1::0;;;77017:7:0::1;;;;;;;;;;;;;;;77008:17;;;;;;;;;;;:22;77026:3;-1:-1:-1::0;;;;;77008:22:0::1;-1:-1:-1::0;;;;;77008:22:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;76784:276:0::1;76764:3;::::0;::::1;:::i;:::-;;;76727:344;;;;77120:3;-1:-1:-1::0;;;;;77086:53:0::1;77112:6;-1:-1:-1::0;;;;;77086:53:0::1;77100:10;-1:-1:-1::0;;;;;77086:53:0::1;;77125:4;;77131:7;;77086:53;;;;;;;;;:::i;:::-;;;;;;;;77150:171;77200:10;77225:6;77246:3;77264:4;;77150:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77283:7;;77150:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;77150:171:0::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;77305:5:0;;-1:-1:-1;77305:5:0;;;;77150:171;::::1;77305:5:::0;;;;77150:171;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;77150:35:0::1;::::0;-1:-1:-1;;;77150:171:0:i:1;:::-;45567:1;75133:2196:::0;;;;;;;;;;;:::o;87669:1039::-;71923:27;:25;:27::i;:::-;87831:6:::1;72028:22;72043:6;72028:14;:22::i;:::-;-1:-1:-1::0;;;94930:17:0;;;:32;87855:110:::2;;;::::0;-1:-1:-1;;;87855:110:0;;31633:2:1;87855:110:0::2;::::0;::::2;31615:21:1::0;31672:2;31652:18;;;31645:30;31711:34;31691:18;;;31684:62;31782:9;31762:18;;;31755:37;31809:19;;87855:110:0::2;31605:229:1::0;87855:110:0::2;88009:13;88025:27:::0;;;:19:::2;:27;::::0;;;;;:31:::2;::::0;88055:1:::2;88025:31;:::i;:::-;88067:27;::::0;;;:19:::2;:27;::::0;;;;:43;;88009:47;;-1:-1:-1;88098:5:0;;88067:27;;;:43:::2;::::0;88098:5;;88067:43:::2;:::i;:::-;::::0;;;-1:-1:-1;88128:9:0::2;::::0;-1:-1:-1;88123:449:0::2;88143:16:::0;;::::2;88123:449;;;88181:10;88194:5;;88200:1;88194:8;;;;;-1:-1:-1::0;;;88194:8:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88181:21:::0;-1:-1:-1;88217:10:0::2;88240:9;88248:1:::0;88240:5;:9:::2;:::i;:::-;88230:20:::0;::::2;88267:12;::::0;;;:8:::2;:12;::::0;;;;;;;:17;;-1:-1:-1;;88267:17:0::2;-1:-1:-1::0;;;;;88267:17:0;::::2;::::0;;::::2;::::0;;;88306:51;;40705:25:1;;;-1:-1:-1;40746:18:1;;;40739:34;;;;88230:20:0;;-1:-1:-1;88321:10:0::2;::::0;88306:51:::2;::::0;40678:18:1;88306:51:0::2;;;;;;;88374:186;88423:10;88452;88481:2;88502;88523:1;88374:186;;;;;;;;;;;::::0;:30:::2;:186::i;:::-;88123:449;;88161:3;;;;:::i;:::-;;;88123:449;;;-1:-1:-1::0;88635:24:0::2;::::0;;;:16:::2;:24;::::0;;;;;;;;88604:19:::2;:27:::0;;;;;;;:55:::2;;88582:118;;;::::0;-1:-1:-1;;;88582:118:0;;32397:2:1;88582:118:0::2;::::0;::::2;32379:21:1::0;32436:2;32416:18;;;32409:30;32475:15;32455:18;;;32448:43;32508:18;;88582:118:0::2;32369:163:1::0;88582:118:0::2;72061:1;71961::::1;87669:1039:::0;;;:::o;48424:115::-;48483:9;;;;;:17;;;48475:56;;;;-1:-1:-1;;;48475:56:0;;34756:2:1;48475:56:0;;;34738:21:1;34795:2;34775:18;;;34768:30;34834:28;34814:18;;;34807:56;34880:18;;48475:56:0;34728:176:1;48475:56:0;48424:115::o;106360:322::-;106600:59;;-1:-1:-1;;20614:2:1;20610:15;;;20606:88;106600:59:0;;;20594:101:1;20741:14;;20734:22;20729:3;20725:32;20711:12;;;20704:54;20774:12;;;20767:28;;;20811:12;;;20804:28;;;106532:7:0;;20848:12:1;;106600:59:0;;;;;;;;;;;;;106572:102;;;;;;106552:122;;106360:322;;;;;;:::o;62937:793::-;63042:7;63110:9;:16;63130:2;63110:22;63106:96;;63149:41;;-1:-1:-1;;;63149:41:0;;30520:2:1;63149:41:0;;;30502:21:1;30559:2;30539:18;;;30532:30;30598:33;30578:18;;;30571:61;30649:18;;63149:41:0;30492:181:1;63106:96:0;63563:4;63548:20;;63542:27;63609:4;63594:20;;63588:27;63663:4;63648:20;;63642:27;63271:9;63634:36;63700:22;63708:4;63634:36;63542:27;63588;63700:7;:22::i;:::-;63693:29;62937:793;-1:-1:-1;;;;;;62937:793:0:o;99425:222::-;99534:10;99509:21;99528:1;99509:18;:21::i;:::-;-1:-1:-1;;;;;99509:35:0;;99487:152;;;;-1:-1:-1;;;99487:152:0;;33847:2:1;99487:152:0;;;33829:21:1;33886:2;33866:18;;;33859:30;33925:34;33905:18;;;33898:62;33996:34;33976:18;;;33969:62;34068:5;34047:19;;;34040:34;34091:19;;99487:152:0;33819:297:1;98837:388:0;98969:15;:17;;98944:7;;;98969:17;;;:::i;:::-;;;;-1:-1:-1;;99080:15:0;;99054:42;;;;:25;:42;;;;;;;;:57;;99099:12;;-1:-1:-1;;99054:57:0;;;;;;99099:12;;99054:57;;;;;-1:-1:-1;;;99054:57:0;;;;;;;;;;;;;;99169:12;99129:53;;;;;;-1:-1:-1;;;99129:53:0;;;;;;;;;;99146:15;;99163:4;99129:53;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;99202:15:0;;98837:388;;;;:::o;99830:137::-;99903:24;;;;:16;:24;;;;;;99895:64;;;;-1:-1:-1;;;99895:64:0;;33093:2:1;99895:64:0;;;33075:21:1;33132:2;33112:18;;;33105:30;33171:24;33151:18;;;33144:52;33213:18;;99895:64:0;33065:172:1;97377:340:0;-1:-1:-1;;;94930:17:0;;;:32;97442:268;;;97540:3;97511:17;;;:8;:17;;;;;;-1:-1:-1;;;;;97511:17:0;97485:118;;;;-1:-1:-1;;;97485:118:0;;35930:2:1;97485:118:0;;;35912:21:1;35969:2;35949:18;;;35942:30;36008:25;35988:18;;;35981:53;36051:18;;97485:118:0;35902:173:1;97485:118:0;97442:268;;;97644:21;97657:7;97644:12;:21::i;:::-;97636:62;;;;-1:-1:-1;;;97636:62:0;;35930:2:1;97636:62:0;;;35912:21:1;35969:2;35949:18;;;35942:30;36008:25;35988:18;;;35981:53;36051:18;;97636:62:0;35902:173:1;97858:204:0;97965:15;;97951:10;:29;;:48;;;;-1:-1:-1;97984:15:0;;;97951:48;97929:125;;;;-1:-1:-1;;;97929:125:0;;37549:2:1;97929:125:0;;;37531:21:1;37588:2;37568:18;;;37561:30;37627:29;37607:18;;;37600:57;37674:18;;97929:125:0;37521:177:1;98312:286:0;98495:12;98454:53;;;;;;-1:-1:-1;;;98454:53:0;;;;;;;;;:37;;;;:25;:37;;;;;;;;;;;;:53;;;;;-1:-1:-1;;;98454:53:0;;;;;;;;;;98432:158;;;;-1:-1:-1;;;98432:158:0;;38312:2:1;98432:158:0;;;38294:21:1;38351:2;38331:18;;;38324:30;38390:34;38370:18;;;38363:62;38461:25;38441:18;;;38434:53;38504:19;;98432:158:0;38284:245:1;61282:621:0;61362:27;61411:7;61407:50;;-1:-1:-1;61435:10:0;;;;;;;;;;;;;;;;;;;61407:50;61479:2;61467:9;61514:69;61521:6;;61514:69;;61544:5;;;;:::i;:::-;;-1:-1:-1;61564:7:0;;-1:-1:-1;61569:2:0;61564:7;;:::i;:::-;;;61514:69;;;61593:17;61623:3;61613:14;;;;;;-1:-1:-1;;;61613:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61613:14:0;-1:-1:-1;61593:34:0;-1:-1:-1;61650:3:0;61664:202;61671:7;;61664:202;;61699:5;61703:1;61699;:5;:::i;:::-;61695:9;-1:-1:-1;61719:10:0;61750:7;61755:2;61750;:7;:::i;:::-;61749:14;;61761:2;61749:14;:::i;:::-;61744:19;;:2;:19;:::i;:::-;61733:31;;:2;:31;:::i;:::-;61719:46;;61780:9;61799:4;61792:12;;61780:24;;61829:2;61819:4;61824:1;61819:7;;;;;;-1:-1:-1;;;61819:7:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;61819:12:0;;;;;;;;-1:-1:-1;61846:8:0;61852:2;61846:8;;:::i;:::-;;;61664:202;;;;;-1:-1:-1;61890:4:0;61282:621;-1:-1:-1;;;;61282:621:0:o;59434:200::-;59539:33;59597:29;59607:2;59611;59597:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;103822:572::-;104067:7;104174:6;104203:3;104229;104255:6;104284:5;104312;104340:12;104135:236;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;104107:279;;;;;;104087:299;;103822:572;;;;;;;;;:::o;107181:1024::-;-1:-1:-1;;;;;107397:13:0;;50645:20;50693:8;107393:805;;107450:201;;-1:-1:-1;;;107450:201:0;;-1:-1:-1;;;;;107450:43:0;;;;;:201;;107516:8;;107547:4;;107574:2;;107599:6;;107628:4;;107450:201;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107450:201:0;;;;;;;;-1:-1:-1;;107450:201:0;;;;;;;;;;;;:::i;:::-;;;107429:758;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;108015:6;108008:14;;-1:-1:-1;;;108008:14:0;;;;;;;;:::i;107429:758::-;;;108064:107;;-1:-1:-1;;;108064:107:0;;36282:2:1;108064:107:0;;;36264:21:1;36321:2;36301:18;;;36294:30;36360:34;36340:18;;;36333:62;36431:27;36411:18;;;36404:55;36476:19;;108064:107:0;36254:247:1;107429:758:0;107736:85;;;-1:-1:-1;;;107736:85:0;107710:229;;107864:55;;-1:-1:-1;;;107864:55:0;;37135:2:1;107864:55:0;;;37117:21:1;37174:2;37154:18;;;37147:30;37213:34;37193:18;;;37186:62;37284:15;37264:18;;;37257:43;37317:19;;107864:55:0;37107:235:1;107710:229:0;107665:289;107181:1024;;;;;;:::o;101687:542::-;101793:14;101771:128;;;;;-1:-1:-1;;;101771:128:0;;34323:2:1;101771:128:0;;;34305:21:1;34342:18;;;34335:30;;;;34401:34;34381:18;;;34374:62;34472:34;34452:18;;;34445:62;34524:19;;101771:128:0;34295:254:1;101771:128:0;101932:36;;;;:28;:36;;;;;;:41;;:116;;-1:-1:-1;101994:36:0;;;;:28;:36;;;;;;102033:15;-1:-1:-1;101932:116:0;101910:197;;;;-1:-1:-1;;;101910:197:0;;29728:2:1;101910:197:0;;;29710:21:1;29767:2;29747:18;;;29740:30;29806:33;29786:18;;;29779:61;29857:18;;101910:197:0;29700:181:1;101910:197:0;102118:36;;;;:28;:36;;;;;;;:48;;;102184:37;102147:6;;102184:37;;;;102157:9;26443:25:1;;26431:2;26416:18;;26398:76;102184:37:0;;;;;;;;101687:542;;:::o;108731:1011::-;-1:-1:-1;;;;;108972:13:0;;50645:20;50693:8;108968:767;;109025:208;;-1:-1:-1;;;109025:208:0;;-1:-1:-1;;;;;109025:48:0;;;;;:208;;109096:8;;109127:4;;109154:3;;109180:7;;109210:4;;109025:208;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109025:208:0;;;;;;;;-1:-1:-1;;109025:208:0;;;;;;;;;;;;:::i;:::-;;;109004:720;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;109646:62;;-1:-1:-1;;;109646:62:0;;28898:2:1;109646:62:0;;;28880:21:1;28937:2;28917:18;;;28910:30;28976:34;28956:18;;;28949:62;29047:22;29027:18;;;29020:50;29087:19;;109646:62:0;28870:242:1;109004:720:0;109318:90;;;-1:-1:-1;;;109318:90:0;109292:229;;109451:50;;-1:-1:-1;;;109451:50:0;;29319:2:1;109451:50:0;;;29301:21:1;29358:2;29338:18;;;29331:30;29397:34;29377:18;;;29370:62;29468:10;29448:18;;;29441:38;29496:19;;109451:50:0;29291:230:1;100597:727:0;100661:7;100703:14;;;;;:46;;;69524:6;100721:9;:28;;100703:46;100681:154;;;;-1:-1:-1;;;100681:154:0;;36708:2:1;100681:154:0;;;36690:21:1;36747:2;36727:18;;;36720:30;36786:34;36766:18;;;36759:62;36857:28;36837:18;;;36830:56;36903:19;;100681:154:0;36680:248:1;100681:154:0;100897:14;100931:3;100917:10;;100915:12;;;;;:::i;:::-;;;;;-1:-1:-1;100915:19:0;;;-1:-1:-1;100990:39:0;;;;-1:-1:-1;;;101009:20:0;100990:39;101042:24;;;;:16;:24;;;;;;;;:36;;;101108:10;;101089:30;;:18;:30;;;;;:39;;;101225:65;;40705:25:1;;;40746:18;;;40739:34;;;101042:24:0;;101240:10;;101225:65;;40678:18:1;101225:65:0;;;;;;;101310:6;100597:727;-1:-1:-1;;;100597:727:0:o;48953:226::-;49054:16;;;;;-1:-1:-1;;;;;49054:16:0;49040:10;:30;;:86;;;49105:21;49124:1;49105:18;:21::i;:::-;-1:-1:-1;;;;;49091:35:0;:10;-1:-1:-1;;;;;49091:35:0;;49040:86;49018:153;;;;-1:-1:-1;;;49018:153:0;;31287:2:1;49018:153:0;;;31269:21:1;31326:2;31306:18;;;31299:30;31365:19;31345:18;;;31338:47;31402:18;;49018:153:0;31259:167:1;48666:128:0;48743:21;48762:1;48743:18;:21::i;102814:271::-;102989:7;103043:3;103048:6;103056:5;103063:12;103026:50;;;;;;;;;;;:::i;105151:599::-;105421:7;105528:6;105557:3;105583:4;105610:7;105640:5;105668;105696:12;105489:238;;;;;;;;;;;;;;:::i;63884:1529::-;64012:7;64968:66;64937:97;;;64915:181;;;;-1:-1:-1;;;64915:181:0;;33444:2:1;64915:181:0;;;33426:21:1;33483:2;33463:18;;;33456:30;33522:34;33502:18;;;33495:62;-1:-1:-1;;;33573:18:1;;;33566:32;33615:19;;64915:181:0;33416:224:1;64915:181:0;65115:1;:7;;65120:2;65115:7;:18;;;;65126:1;:7;;65131:2;65126:7;65115:18;65107:65;;;;-1:-1:-1;;;65107:65:0;;35527:2:1;65107:65:0;;;35509:21:1;35566:2;35546:18;;;35539:30;35605:34;35585:18;;;35578:62;-1:-1:-1;;;35656:18:1;;;35649:32;35698:19;;65107:65:0;35499:224:1;65107:65:0;65287:24;;;65270:14;65287:24;;;;;;;;;26706:25:1;;;26779:4;26767:17;;26747:18;;;26740:45;;;;26801:18;;;26794:34;;;26844:18;;;26837:34;;;65287:24:0;;26678:19:1;;65287:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65287:24:0;;-1:-1:-1;;65287:24:0;;;-1:-1:-1;;;;;;;65330:20:0;;65322:57;;;;-1:-1:-1;;;65322:57:0;;28545:2:1;65322:57:0;;;28527:21:1;28584:2;28564:18;;;28557:30;28623:26;28603:18;;;28596:54;28667:18;;65322:57:0;28517:174:1;65322:57:0;65399:6;63884:1529;-1:-1:-1;;;;;63884:1529:0:o;60125:1149::-;60666:10;;60653;;60640;;60627;;60614;;60309:33;;60380:2;;60419;;60458;;60497;;60536;;60355:16;;60666:10;;60653;;60640;;60614:23;;60627:10;60614:23;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;:62;;;;:::i;:::-;60585:106;;;;;;-1:-1:-1;;;60585:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60585:106:0;-1:-1:-1;60550:141:0;-1:-1:-1;60550:141:0;60702:19;;60795:80;60811:3;:10;60807:1;:14;60795:80;;;60857:3;60861:1;60857:6;;;;;;-1:-1:-1;;;60857:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;60857:6:0;60843;60850:3;;;;:::i;:::-;;;60843:11;;;;;;-1:-1:-1;;;60843:11:0;;;;;;;;;;;;:20;-1:-1:-1;;;;;60843:20:0;;;;;;;;-1:-1:-1;60823:3:0;;;;:::i;:::-;;;;60795:80;;;-1:-1:-1;60894:1:0;60885:80;60901:3;:10;60897:1;:14;60885:80;;;60947:3;60951:1;60947:6;;;;;;-1:-1:-1;;;60947:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;60947:6:0;60933;60940:3;;;;:::i;:::-;;;60933:11;;;;;;-1:-1:-1;;;60933:11:0;;;;;;;;;;;;:20;-1:-1:-1;;;;;60933:20:0;;;;;;;;-1:-1:-1;60913:3:0;;;;:::i;:::-;;;;60885:80;;;-1:-1:-1;60984:1:0;60975:80;60991:3;:10;60987:1;:14;60975:80;;;61037:3;61041:1;61037:6;;;;;;-1:-1:-1;;;61037:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;61037:6:0;61023;61030:3;;;;:::i;:::-;;;61023:11;;;;;;-1:-1:-1;;;61023:11:0;;;;;;;;;;;;:20;-1:-1:-1;;;;;61023:20:0;;;;;;;;-1:-1:-1;61003:3:0;;;;:::i;:::-;;;;60975:80;;;-1:-1:-1;61074:1:0;61065:80;61081:3;:10;61077:1;:14;61065:80;;;61127:3;61131:1;61127:6;;;;;;-1:-1:-1;;;61127:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;61127:6:0;61113;61120:3;;;;:::i;:::-;;;61113:11;;;;;;-1:-1:-1;;;61113:11:0;;;;;;;;;;;;:20;-1:-1:-1;;;;;61113:20:0;;;;;;;;-1:-1:-1;61093:3:0;;;;:::i;:::-;;;;61065:80;;;-1:-1:-1;61164:1:0;61155:80;61171:3;:10;61167:1;:14;61155:80;;;61217:3;61221:1;61217:6;;;;;;-1:-1:-1;;;61217:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;61217:6:0;61203;61210:3;;;;:::i;:::-;;;61203:11;;;;;;-1:-1:-1;;;61203:11:0;;;;;;;;;;;;:20;-1:-1:-1;;;;;61203:20:0;;;;;;;;-1:-1:-1;61183:3:0;;;;:::i;:::-;;;;61155:80;;;-1:-1:-1;61259:6:0;;60125:1149;-1:-1:-1;;;;;;;;;;;;;60125:1149:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:394::-;;;280:3;273:4;265:6;261:17;257:27;247:2;;303:6;295;288:22;247:2;-1:-1:-1;331:20:1;;374:18;363:30;;360:2;;;413:8;403;396:26;360:2;457:4;449:6;445:17;433:29;;520:3;513:4;505;497:6;493:17;485:6;481:30;477:41;474:50;471:2;;;537:1;534;527:12;471:2;237:310;;;;;:::o;552:375::-;;;667:3;660:4;652:6;648:17;644:27;634:2;;692:8;682;675:26;634:2;-1:-1:-1;722:20:1;;765:18;754:30;;751:2;;;804:8;794;787:26;751:2;848:4;840:6;836:17;824:29;;900:3;893:4;884:6;876;872:19;868:30;865:39;862:2;;;917:1;914;907:12;932:575;;1027:3;1020:4;1012:6;1008:17;1004:27;994:2;;1049:5;1042;1035:20;994:2;1089:6;1076:20;1115:18;1111:2;1108:26;1105:2;;;1137:18;;:::i;:::-;1186:2;1180:9;1198:67;1253:2;1234:13;;-1:-1:-1;;1230:27:1;1259:4;1226:38;1180:9;1198:67;:::i;:::-;1289:2;1281:6;1274:18;1335:3;1328:4;1323:2;1315:6;1311:15;1307:26;1304:35;1301:2;;;1356:5;1349;1342:20;1301:2;1424;1417:4;1409:6;1405:17;1398:4;1390:6;1386:17;1373:54;1447:15;;;1464:4;1443:26;1436:41;;;;1451:6;984:523;-1:-1:-1;;984:523:1:o;1512:257::-;;1624:2;1612:9;1603:7;1599:23;1595:32;1592:2;;;1645:6;1637;1630:22;1592:2;1689:9;1676:23;1708:31;1733:5;1708:31;:::i;1774:261::-;;1897:2;1885:9;1876:7;1872:23;1868:32;1865:2;;;1918:6;1910;1903:22;1865:2;1955:9;1949:16;1974:31;1999:5;1974:31;:::i;2040:398::-;;;2169:2;2157:9;2148:7;2144:23;2140:32;2137:2;;;2190:6;2182;2175:22;2137:2;2234:9;2221:23;2253:31;2278:5;2253:31;:::i;:::-;2303:5;-1:-1:-1;2360:2:1;2345:18;;2332:32;2373:33;2332:32;2373:33;:::i;:::-;2425:7;2415:17;;;2127:311;;;;;:::o;2443:1378::-;;;;;;;;;2712:3;2700:9;2691:7;2687:23;2683:33;2680:2;;;2734:6;2726;2719:22;2680:2;2778:9;2765:23;2797:31;2822:5;2797:31;:::i;:::-;2847:5;-1:-1:-1;2904:2:1;2889:18;;2876:32;2917:33;2876:32;2917:33;:::i;:::-;2969:7;-1:-1:-1;3027:2:1;3012:18;;2999:32;3050:18;3080:14;;;3077:2;;;3112:6;3104;3097:22;3077:2;3156:70;3218:7;3209:6;3198:9;3194:22;3156:70;:::i;:::-;3245:8;;-1:-1:-1;3130:96:1;-1:-1:-1;3333:2:1;3318:18;;3305:32;;-1:-1:-1;3349:16:1;;;3346:2;;;3383:6;3375;3368:22;3346:2;3427:72;3491:7;3480:8;3469:9;3465:24;3427:72;:::i;:::-;3518:8;;-1:-1:-1;3401:98:1;-1:-1:-1;3606:3:1;3591:19;;3578:33;;-1:-1:-1;3623:16:1;;;3620:2;;;3657:6;3649;3642:22;3620:2;;3701:60;3753:7;3742:8;3731:9;3727:24;3701:60;:::i;:::-;2670:1151;;;;-1:-1:-1;2670:1151:1;;-1:-1:-1;2670:1151:1;;;;;;3780:8;-1:-1:-1;;;2670:1151:1:o;3826:843::-;;;;;;;4025:3;4013:9;4004:7;4000:23;3996:33;3993:2;;;4047:6;4039;4032:22;3993:2;4091:9;4078:23;4110:31;4135:5;4110:31;:::i;:::-;4160:5;-1:-1:-1;4217:2:1;4202:18;;4189:32;4230:33;4189:32;4230:33;:::i;:::-;4282:7;-1:-1:-1;4336:2:1;4321:18;;4308:32;;-1:-1:-1;4387:2:1;4372:18;;4359:32;;-1:-1:-1;4442:3:1;4427:19;;4414:33;4470:18;4459:30;;4456:2;;;4507:6;4499;4492:22;4456:2;4551:58;4601:7;4592:6;4581:9;4577:22;4551:58;:::i;:::-;3983:686;;;;-1:-1:-1;3983:686:1;;-1:-1:-1;3983:686:1;;4628:8;;3983:686;-1:-1:-1;;;3983:686:1:o;4674:392::-;;;4800:2;4788:9;4779:7;4775:23;4771:32;4768:2;;;4821:6;4813;4806:22;4768:2;4865:9;4852:23;4884:31;4909:5;4884:31;:::i;:::-;4934:5;-1:-1:-1;4991:2:1;4976:18;;4963:32;5004:30;4963:32;5004:30;:::i;5071:325::-;;;5200:2;5188:9;5179:7;5175:23;5171:32;5168:2;;;5221:6;5213;5206:22;5168:2;5265:9;5252:23;5284:31;5309:5;5284:31;:::i;:::-;5334:5;5386:2;5371:18;;;;5358:32;;-1:-1:-1;;;5158:238:1:o;5401:803::-;;;;;5600:2;5588:9;5579:7;5575:23;5571:32;5568:2;;;5621:6;5613;5606:22;5568:2;5666:9;5653:23;5695:18;5736:2;5728:6;5725:14;5722:2;;;5757:6;5749;5742:22;5722:2;5801:70;5863:7;5854:6;5843:9;5839:22;5801:70;:::i;:::-;5890:8;;-1:-1:-1;5775:96:1;-1:-1:-1;5978:2:1;5963:18;;5950:32;;-1:-1:-1;5994:16:1;;;5991:2;;;6028:6;6020;6013:22;5991:2;;6072:72;6136:7;6125:8;6114:9;6110:24;6072:72;:::i;:::-;5558:646;;;;-1:-1:-1;6163:8:1;-1:-1:-1;;;;5558:646:1:o;6209:255::-;;6329:2;6317:9;6308:7;6304:23;6300:32;6297:2;;;6350:6;6342;6335:22;6297:2;6387:9;6381:16;6406:28;6428:5;6406:28;:::i;6469:255::-;;6580:2;6568:9;6559:7;6555:23;6551:32;6548:2;;;6601:6;6593;6586:22;6548:2;6645:9;6632:23;6664:30;6688:5;6664:30;:::i;6729:259::-;;6851:2;6839:9;6830:7;6826:23;6822:32;6819:2;;;6872:6;6864;6857:22;6819:2;6909:9;6903:16;6928:30;6952:5;6928:30;:::i;6993:1562::-;;;;;;;;;;;;7323:3;7311:9;7302:7;7298:23;7294:33;7291:2;;;7345:6;7337;7330:22;7291:2;7373:18;7431:2;7419:9;7406:23;7403:31;7400:2;;;7452:6;7444;7437:22;7400:2;7480:66;7538:7;7525:9;7512:23;7501:9;7497:39;7480:66;:::i;:::-;7470:76;;7565:38;7599:2;7588:9;7584:18;7565:38;:::i;:::-;7555:48;;7622:38;7656:2;7645:9;7641:18;7622:38;:::i;:::-;7612:48;;7709:2;7703;7692:9;7688:18;7675:32;7672:40;7669:2;;;7730:6;7722;7715:22;7669:2;7774:96;7862:7;7855:2;7844:9;7840:18;7827:32;7816:9;7812:48;7774:96;:::i;:::-;7889:8;;-1:-1:-1;7916:8:1;-1:-1:-1;7967:3:1;7952:19;;7939:33;7936:41;-1:-1:-1;7933:2:1;;;7995:6;7987;7980:22;7933:2;8039:97;8128:7;8120:3;8109:9;8105:19;8092:33;8081:9;8077:49;8039:97;:::i;:::-;8155:8;;-1:-1:-1;8182:8:1;-1:-1:-1;8233:3:1;8218:19;;8205:33;8202:41;-1:-1:-1;8199:2:1;;;8261:6;8253;8246:22;8199:2;;8305:85;8382:7;8374:3;8363:9;8359:19;8346:33;8335:9;8331:49;8305:85;:::i;:::-;7281:1274;;;;-1:-1:-1;7281:1274:1;;;;;;;;;;8409:8;;8436;8491:3;8476:19;;8463:33;;8544:3;8529:19;8516:33;;-1:-1:-1;7281:1274:1;-1:-1:-1;;;7281:1274:1:o;8560:890::-;;;;;;;8763:3;8751:9;8742:7;8738:23;8734:33;8731:2;;;8785:6;8777;8770:22;8731:2;8830:9;8817:23;8863:18;8855:6;8852:30;8849:2;;;8900:6;8892;8885:22;8849:2;8928:49;8969:7;8960:6;8949:9;8945:22;8928:49;:::i;:::-;8918:59;;;9027:2;9016:9;9012:18;8999:32;9040:31;9065:5;9040:31;:::i;:::-;9090:5;-1:-1:-1;9147:2:1;9132:18;;9119:32;9160:33;9119:32;9160:33;:::i;:::-;9212:7;-1:-1:-1;9271:2:1;9256:18;;9243:32;9284:30;9243:32;9284:30;:::i;:::-;8721:729;;;;-1:-1:-1;8721:729:1;;9387:3;9372:19;;9359:33;;9439:3;9424:19;;;9411:33;;-1:-1:-1;8721:729:1;-1:-1:-1;;8721:729:1:o;9455:1211::-;;;;;;;;;;9714:3;9702:9;9693:7;9689:23;9685:33;9682:2;;;9736:6;9728;9721:22;9682:2;9781:9;9768:23;9810:18;9851:2;9843:6;9840:14;9837:2;;;9872:6;9864;9857:22;9837:2;9900:49;9941:7;9932:6;9921:9;9917:22;9900:49;:::i;:::-;9890:59;;9999:2;9988:9;9984:18;9971:32;9958:45;;10012:31;10037:5;10012:31;:::i;:::-;10062:5;;-1:-1:-1;10119:2:1;10104:18;;10091:32;;10132:33;10091:32;10132:33;:::i;:::-;10184:7;;-1:-1:-1;10238:2:1;10223:18;;10210:32;;-1:-1:-1;10289:3:1;10274:19;;10261:33;;-1:-1:-1;10347:3:1;10332:19;;10319:33;;10364:16;;;10361:2;;;10398:6;10390;10383:22;10361:2;;10442:60;10494:7;10483:8;10472:9;10468:24;10442:60;:::i;:::-;9672:994;;;;-1:-1:-1;9672:994:1;;;;;;10416:86;;10603:3;10588:19;;10575:33;;10655:3;10640:19;;;10627:33;;-1:-1:-1;9672:994:1;-1:-1:-1;;;;9672:994:1:o;10671:1285::-;;;;;;;;;10947:3;10935:9;10926:7;10922:23;10918:33;10915:2;;;10969:6;10961;10954:22;10915:2;11014:9;11001:23;11043:18;11084:2;11076:6;11073:14;11070:2;;;11105:6;11097;11090:22;11070:2;11133:49;11174:7;11165:6;11154:9;11150:22;11133:49;:::i;:::-;11123:59;;11232:2;11221:9;11217:18;11204:32;11191:45;;11245:31;11270:5;11245:31;:::i;:::-;11295:5;;-1:-1:-1;11353:2:1;11338:18;;11325:32;;11369:16;;;11366:2;;;11403:6;11395;11388:22;11366:2;11447:72;11511:7;11500:8;11489:9;11485:24;11447:72;:::i;:::-;11538:8;;-1:-1:-1;11421:98:1;-1:-1:-1;11626:2:1;11611:18;;11598:32;;-1:-1:-1;11642:16:1;;;11639:2;;;11676:6;11668;11661:22;11639:2;;11720:72;11784:7;11773:8;11762:9;11758:24;11720:72;:::i;:::-;10905:1051;;;;-1:-1:-1;10905:1051:1;;;;11811:8;;11893:3;11878:19;;11865:33;;11945:3;11930:19;11917:33;;-1:-1:-1;10905:1051:1;-1:-1:-1;;;;10905:1051:1:o;11961:430::-;;;12093:2;12081:9;12072:7;12068:23;12064:32;12061:2;;;12114:6;12106;12099:22;12061:2;12159:9;12146:23;12192:18;12184:6;12181:30;12178:2;;;12229:6;12221;12214:22;12178:2;12273:58;12323:7;12314:6;12303:9;12299:22;12273:58;:::i;:::-;12350:8;;12247:84;;-1:-1:-1;12051:340:1;-1:-1:-1;;;;12051:340:1:o;12396:190::-;;12508:2;12496:9;12487:7;12483:23;12479:32;12476:2;;;12529:6;12521;12514:22;12476:2;-1:-1:-1;12557:23:1;;12466:120;-1:-1:-1;12466:120:1:o;12591:525::-;;;;12755:2;12743:9;12734:7;12730:23;12726:32;12723:2;;;12776:6;12768;12761:22;12723:2;12817:9;12804:23;12794:33;;12878:2;12867:9;12863:18;12850:32;12905:18;12897:6;12894:30;12891:2;;;12942:6;12934;12927:22;12891:2;12986:70;13048:7;13039:6;13028:9;13024:22;12986:70;:::i;:::-;12713:403;;13075:8;;-1:-1:-1;12960:96:1;;-1:-1:-1;;;;12713:403:1:o;13121:871::-;;;;;;13337:2;13325:9;13316:7;13312:23;13308:32;13305:2;;;13358:6;13350;13343:22;13305:2;13399:9;13386:23;13376:33;;13460:2;13449:9;13445:18;13432:32;13483:18;13524:2;13516:6;13513:14;13510:2;;;13545:6;13537;13530:22;13510:2;13589:70;13651:7;13642:6;13631:9;13627:22;13589:70;:::i;:::-;13678:8;;-1:-1:-1;13563:96:1;-1:-1:-1;13766:2:1;13751:18;;13738:32;;-1:-1:-1;13782:16:1;;;13779:2;;;13816:6;13808;13801:22;13779:2;;13860:72;13924:7;13913:8;13902:9;13898:24;13860:72;:::i;:::-;13295:697;;;;-1:-1:-1;13295:697:1;;-1:-1:-1;13951:8:1;;13834:98;13295:697;-1:-1:-1;;;13295:697:1:o;13997:258::-;;;14126:2;14114:9;14105:7;14101:23;14097:32;14094:2;;;14147:6;14139;14132:22;14094:2;-1:-1:-1;;14175:23:1;;;14245:2;14230:18;;;14217:32;;-1:-1:-1;14084:171:1:o;14260:393::-;;;;14406:2;14394:9;14385:7;14381:23;14377:32;14374:2;;;14427:6;14419;14412:22;14374:2;14468:9;14455:23;14445:33;;14525:2;14514:9;14510:18;14497:32;14487:42;;14579:2;14568:9;14564:18;14551:32;14592:31;14617:5;14592:31;:::i;:::-;14642:5;14632:15;;;14364:289;;;;;:::o;14658:593::-;;;;;14839:2;14827:9;14818:7;14814:23;14810:32;14807:2;;;14860:6;14852;14845:22;14807:2;14901:9;14888:23;14878:33;;14958:2;14947:9;14943:18;14930:32;14920:42;;15013:2;15002:9;14998:18;14985:32;15040:18;15032:6;15029:30;15026:2;;;15077:6;15069;15062:22;15026:2;15121:70;15183:7;15174:6;15163:9;15159:22;15121:70;:::i;15853:326::-;;;;15999:2;15987:9;15978:7;15974:23;15970:32;15967:2;;;16020:6;16012;16005:22;15967:2;-1:-1:-1;;16048:23:1;;;16118:2;16103:18;;16090:32;;-1:-1:-1;16169:2:1;16154:18;;;16141:32;;15957:222;-1:-1:-1;15957:222:1:o;16514:566::-;;;;;16680:2;16668:9;16659:7;16655:23;16651:32;16648:2;;;16701:6;16693;16686:22;16648:2;16742:9;16729:23;16719:33;;16799:2;16788:9;16784:18;16771:32;16761:42;;16854:2;16843:9;16839:18;16826:32;16881:18;16873:6;16870:30;16867:2;;;16918:6;16910;16903:22;16867:2;16962:58;17012:7;17003:6;16992:9;16988:22;16962:58;:::i;17085:410::-;;17185:6;17180:3;17173:19;17215:66;17207:6;17204:78;17201:2;;;17297:3;17292;17285:16;17201:2;17340:4;17332:6;17328:17;17390:8;17383:5;17376:4;17371:3;17367:14;17354:45;17422:18;;;;17442:4;17418:29;17456:15;;;-1:-1:-1;17418:29:1;;17163:332;-1:-1:-1;17163:332:1:o;17500:448::-;;17602:5;17596:12;17629:6;17624:3;17617:19;17655:4;17684:2;17679:3;17675:12;17668:19;;17721:2;17714:5;17710:14;17742:3;17754:169;17768:6;17765:1;17762:13;17754:169;;;17829:13;;17817:26;;17863:12;;;;17898:15;;;;17790:1;17783:9;17754:169;;;-1:-1:-1;17939:3:1;;17572:376;-1:-1:-1;;;;;17572:376:1:o;17953:400::-;18038:12;;17953:400;;18088:4;18115:14;;;17953:400;18167:13;;18159:169;;18234:13;;18222:26;;18268:12;;;;18303:15;;;;18195:1;18188:9;18159:169;;18358:257;;18437:5;18431:12;18464:6;18459:3;18452:19;18480:63;18536:6;18529:4;18524:3;18520:14;18513:4;18506:5;18502:16;18480:63;:::i;:::-;18597:2;18576:15;-1:-1:-1;;18572:29:1;18563:39;;;;18604:4;18559:50;;18407:208;-1:-1:-1;;18407:208:1:o;18620:940::-;;-1:-1:-1;;19153:2:1;19144:6;19140:2;19136:15;19132:24;19127:3;19120:37;19208:2;19199:6;19195:2;19191:15;19187:24;19182:2;19177:3;19173:12;19166:46;;19231:88;19268:50;19314:2;19309:3;19305:12;19297:6;19268:50;:::i;:::-;19260:6;19231:88;:::i;:::-;19348:6;19342:13;19364:52;19409:6;19405:2;19398:4;19390:6;19386:17;19364:52;:::i;:::-;19438:15;19462:21;;;-1:-1:-1;;19510:4:1;19499:16;;19492:32;19551:2;19540:14;;19025:535;-1:-1:-1;;;;;19025:535:1:o;19565:817::-;;-1:-1:-1;;19998:2:1;19989:6;19985:2;19981:15;19977:24;19972:3;19965:37;20053:2;20044:6;20040:2;20036:15;20032:24;20027:2;20022:3;20018:12;20011:46;;20087:6;20082:2;20077:3;20073:12;20066:28;20124:6;20119:2;20114:3;20110:12;20103:28;20160:6;20154:13;20176:63;20232:6;20226:3;20221;20217:13;20210:4;20202:6;20198:17;20176:63;:::i;:::-;20258:16;;;20298:3;20290:12;;20283:28;;;;-1:-1:-1;20335:3:1;20327:12;;20320:28;20372:3;20364:12;;;-1:-1:-1;;;;;19870:512:1:o;20871:510::-;;21197:79;21234:41;21271:3;21263:6;21234:41;:::i;:::-;21226:6;21197:79;:::i;:::-;21285:21;;;-1:-1:-1;;21333:2:1;21322:14;;21315:30;21372:2;21361:14;;21174:207;-1:-1:-1;;21174:207:1:o;22002:871::-;;-1:-1:-1;;;;;22434:2:1;22426:6;22422:15;22411:9;22404:34;22486:2;22478:6;22474:15;22469:2;22458:9;22454:18;22447:43;;22526:3;22521:2;22510:9;22506:18;22499:31;22553:68;22616:3;22605:9;22601:19;22593:6;22553:68;:::i;:::-;22669:9;22661:6;22657:22;22652:2;22641:9;22637:18;22630:50;22703:55;22751:6;22743;22703:55;:::i;:::-;22689:69;;22807:9;22799:6;22795:22;22789:3;22778:9;22774:19;22767:51;22835:32;22860:6;22852;22835:32;:::i;:::-;22827:40;22333:540;-1:-1:-1;;;;;;;;22333:540:1:o;22878:583::-;;-1:-1:-1;;;;;23210:2:1;23202:6;23198:15;23187:9;23180:34;23262:2;23254:6;23250:15;23245:2;23234:9;23230:18;23223:43;;23302:6;23297:2;23286:9;23282:18;23275:34;23345:6;23340:2;23329:9;23325:18;23318:34;23389:3;23383;23372:9;23368:19;23361:32;23410:45;23450:3;23439:9;23435:19;23427:6;23410:45;:::i;:::-;23402:53;23109:352;-1:-1:-1;;;;;;;23109:352:1:o;23466:731::-;23647:2;23699:21;;;23672:18;;;23755:22;;;23466:731;;23834:6;23808:2;23793:18;;23466:731;23871:300;23885:6;23882:1;23879:13;23871:300;;;23960:6;23947:20;23980:31;24005:5;23980:31;:::i;:::-;-1:-1:-1;;;;;24036:54:1;24024:67;;24146:15;;;;24111:12;;;;23907:1;23900:9;23871:300;;;-1:-1:-1;24188:3:1;23627:570;-1:-1:-1;;;;;;23627:570:1:o;24202:605::-;24381:2;24433:21;;;24406:18;;;24489:22;;;24202:605;;24568:6;24542:2;24527:18;;24202:605;24605:176;24619:6;24616:1;24613:13;24605:176;;;24680:20;;24668:33;;24756:15;;;;24721:12;;;;24641:1;24634:9;24605:176;;24812:519;;25089:2;25078:9;25071:21;25115:73;25184:2;25173:9;25169:18;25161:6;25153;25115:73;:::i;:::-;25236:9;25228:6;25224:22;25219:2;25208:9;25204:18;25197:50;25264:61;25318:6;25310;25302;25264:61;:::i;25336:272::-;;25515:2;25504:9;25497:21;25535:67;25598:2;25587:9;25583:18;25575:6;25535:67;:::i;25613:487::-;;25870:2;25859:9;25852:21;25896:67;25959:2;25948:9;25944:18;25936:6;25896:67;:::i;:::-;26011:9;26003:6;25999:22;25994:2;25983:9;25979:18;25972:50;26039:55;26087:6;26079;26039:55;:::i;27135:401::-;27283:2;27268:18;;27316:1;27305:13;;27295:2;;-1:-1:-1;;;27349:1:1;27342:88;27453:4;27450:1;27443:15;27481:4;27478:1;27471:15;27295:2;27505:25;;;27250:286;:::o;27721:393::-;;27880:2;27869:9;27862:21;27919:6;27914:2;27903:9;27899:18;27892:34;27976:6;27968;27963:2;27952:9;27948:18;27935:48;28003:22;;;28027:2;27999:31;;;27992:45;;;;28098:2;28077:15;;;-1:-1:-1;;28073:29:1;28058:45;28054:54;;27852:262;-1:-1:-1;27852:262:1:o;28119:219::-;;28268:2;28257:9;28250:21;28288:44;28328:2;28317:9;28313:18;28305:6;28288:44;:::i;41045:290::-;;41222:6;41211:9;41204:25;41265:2;41260;41249:9;41245:18;41238:30;41285:44;41325:2;41314:9;41310:18;41302:6;41285:44;:::i;:::-;41277:52;41194:141;-1:-1:-1;;;;41194:141:1:o;41593:128::-;;41664:1;41660:6;41657:1;41654:13;41651:2;;;41670:18;;:::i;:::-;-1:-1:-1;41706:9:1;;41641:80::o;41726:204::-;;41800:4;41797:1;41793:12;41832:4;41829:1;41825:12;41867:3;41861:4;41857:14;41852:3;41849:23;41846:2;;;41875:18;;:::i;:::-;41911:13;;41772:158;-1:-1:-1;;;41772:158:1:o;41935:274::-;;42001:1;41991:2;;-1:-1:-1;;;42033:1:1;42026:88;42137:4;42134:1;42127:15;42165:4;42162:1;42155:15;41991:2;-1:-1:-1;42194:9:1;;41981:228::o;42214:168::-;;42320:1;42316;42312:6;42308:14;42305:1;42302:21;42297:1;42290:9;42283:17;42279:45;42276:2;;;42327:18;;:::i;:::-;-1:-1:-1;42367:9:1;;42266:116::o;42387:125::-;;42455:1;42452;42449:8;42446:2;;;42460:18;;:::i;:::-;-1:-1:-1;42497:9:1;;42436:76::o;42517:258::-;42589:1;42599:113;42613:6;42610:1;42607:13;42599:113;;;42689:11;;;42683:18;42670:11;;;42663:39;42635:2;42628:10;42599:113;;;42730:6;42727:1;42724:13;42721:2;;;42765:1;42756:6;42751:3;42747:16;42740:27;42721:2;;42570:205;;;:::o;42780:437::-;42865:1;42855:12;;42912:1;42902:12;;;42923:2;;42977:4;42969:6;42965:17;42955:27;;42923:2;43030;43022:6;43019:14;42999:18;42996:38;42993:2;;;-1:-1:-1;;;43064:1:1;43057:88;43168:4;43165:1;43158:15;43196:4;43193:1;43186:15;43222:249;43332:2;43313:13;;-1:-1:-1;;43309:27:1;43297:40;;43367:18;43352:34;;43388:22;;;43349:62;43346:2;;;43414:18;;:::i;:::-;43450:2;43443:22;-1:-1:-1;;43269:202:1:o;43476:135::-;;-1:-1:-1;;43536:17:1;;43533:2;;;43556:18;;:::i;:::-;-1:-1:-1;43603:1:1;43592:13;;43523:88::o;43616:184::-;-1:-1:-1;;;43665:1:1;43658:88;43765:4;43762:1;43755:15;43789:4;43786:1;43779:15;43805:184;-1:-1:-1;;;43854:1:1;43847:88;43954:4;43951:1;43944:15;43978:4;43975:1;43968:15;43994:185;;44071:1;44053:16;44050:23;44047:2;;;44121:1;44116:3;44111;44096:27;44152:10;44147:3;44143:20;44037:142;:::o;44184:671::-;;44265:4;44247:16;44244:26;44241:2;;;44273:5;;44241:2;44307;44301:9;-1:-1:-1;;44372:16:1;44368:25;;44365:1;44301:9;44344:50;44423:4;44417:11;44447:16;44482:18;44553:2;44546:4;44538:6;44534:17;44531:25;44526:2;44518:6;44515:14;44512:45;44509:2;;;44560:5;;;;;;;44509:2;44597:6;44591:4;44587:17;44576:28;;44633:3;44627:10;44660:2;44652:6;44649:14;44646:2;;;44666:5;;;;;;;;44646:2;44750;44731:16;44725:4;44721:27;44717:36;44710:4;44701:6;44696:3;44692:16;44688:27;44685:69;44682:2;;;44757:5;;;;;;;;44682:2;44773:57;44824:4;44815:6;44807;44803:19;44799:30;44793:4;44773:57;:::i;:::-;-1:-1:-1;44846:3:1;;-1:-1:-1;;;;;44231:624:1;:::o;44860:154::-;-1:-1:-1;;;;;44939:5:1;44935:54;44928:5;44925:65;44915:2;;45004:1;45001;44994:12;45019:118;45105:5;45098:13;45091:21;45084:5;45081:32;45071:2;;45127:1;45124;45117:12;45142:177;45227:66;45220:5;45216:78;45209:5;45206:89;45196:2;;45309:1;45306;45299:12

Swarm Source

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