             """
     }
 
-    // swiftlint:disable cyclomatic_complexity
     public override func isEqual(_ object: Any?) -> Bool {
-    // swiftlint:enable cyclomatic_complexity
         guard let info = object as? EntitlementInfo else {
             return false
         }

        subscription: CustomerInfoResponse.Subscription,
        requestDate: Date?
    ) {
        self.entitlement = entitlement

        self.store = subscription.store
        self.expirationDate = subscription.expiresDate
        self.unsubscribeDetectedAt = subscription.unsubscribeDetectedAt
        self.billingIssueDetectedAt = subscription.billingIssuesDetectedAt
        self.identifier = identifier
        self.productIdentifier = entitlement.productIdentifier
        self.isSandbox = subscription.isSandbox

        self.isActive = Self.isDateActive(expirationDate: entitlement.expiresDate, forRequestDate: requestDate)
        self.periodType = subscription.periodType
        self.latestPurchaseDate = entitlement.purchaseDate
        self.originalPurchaseDate = subscription.originalPurchaseDate
        self.ownershipType = subscription.ownershipType
        self.willRenew = Self.willRenewWithExpirationDate(expirationDate: self.expirationDate,
                                                          store: self.store,
                                                          unsubscribeDetectedAt: self.unsubscribeDetectedAt,
                                                          billingIssueDetectedAt: self.billingIssueDetectedAt)
    }

}

 extension EntitlementInfo: RawDataContainer {

     // Docs inherited from protocol
     // swiftlint:disable missing_docs
     @objc
     public var rawData: [String: Any] {
         return self.entitlement.rawData
     }

 }

private extension EntitlementInfo {


    /**
     The entitlement identifier configured in the RevenueCat dashboard
     */
    @objc public var identifier: String { self.contents.identifier }

    /**
     True if the user has access to this entitlement
     */
    @objc public var isActive: Bool { self.contents.isActive }

    /**
     True if the underlying subscription is set to renew at the end of
     the billing period (``expirationDate``).
     */
    @objc public var willRenew: Bool { self.contents.willRenew }

    /**
     The last period type this entitlement was in
     Either: ``PeriodType/normal``, ``PeriodType/intro``, ``PeriodType/trial``
     */
    @objc public var periodType: PeriodType { self.contents.periodType }

    /**
     The latest purchase or renewal date for the entitlement.
     */
    @objc public var latestPurchaseDate: Date? { self.contents.latestPurchaseDate }

    /**
     The first date this entitlement was purchased
     */
    @objc public var originalPurchaseDate: Date? { self.contents.originalPurchaseDate }

    /**
     The expiration date for the entitlement, can be `nil` for lifetime access.
     If the ``periodType`` is ``PeriodType/trial``, this is the trial expiration date.
     */
    @objc public var expirationDate: Date? { self.contents.expirationDate }

    /**
     * The store where this entitlement was unlocked from either: ``Store/appStore``, ``Store/macAppStore``,
     * ``Store/playStore``, ``Store/stripe``, ``Store/promotional``, or ``Store/unknownStore``.
     */
    @objc public var store: Store { self.contents.store }

    /**
     The product identifier that unlocked this entitlement
     */
    @objc public var productIdentifier: String { self.contents.productIdentifier }

    /**
     False if this entitlement is unlocked via a production purchase
     */
    @objc public var isSandbox: Bool { self.contents.isSandbox }

    /**
     The date an unsubscribe was detected. Can be `nil`.

     - Note: Entitlement may still be active even if user has unsubscribed. Check the ``isActive`` property.
     */
    @objc public var unsubscribeDetectedAt: Date? { self.contents.unsubscribeDetectedAt }

    /**
     The date a billing issue was detected. Can be `nil` if there is no
