From ff48310ecd90d7f5a54cc487941be906ab2d78a7 Mon Sep 17 00:00:00 2001 From: Tony Li <tony.li@automattic.com> Date: Tue, 11 Mar 2025 11:57:06 +1300 Subject: [PATCH] Fix #21856: Support the 'Order' setting in pages list --- Modules/Package.swift | 2 +- .../xcshareddata/swiftpm/Package.resolved | 6 +- WordPress/Classes/Models/AbstractPost.h | 1 + WordPress/Classes/Models/AbstractPost.m | 1 + WordPress/Classes/Services/PostHelper.m | 1 + WordPress/Classes/Utility/PageTree.swift | 17 +- .../WordPress.xcdatamodeld/.xccurrentversion | 2 +- .../WordPress 155.xcdatamodel/contents | 883 ++++++++++++++++++ 8 files changed, 898 insertions(+), 15 deletions(-) create mode 100644 WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents diff --git a/Modules/Package.swift b/Modules/Package.swift index 02e73fbad4e3..4df8b818864f 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -45,7 +45,7 @@ let package = Package( .package(url: "https://github.com/wordpress-mobile/MediaEditor-iOS", branch: "task/spm-support"), .package(url: "https://github.com/wordpress-mobile/NSObject-SafeExpectations", from: "0.0.6"), .package(url: "https://github.com/wordpress-mobile/NSURL-IDN", branch: "trunk"), - .package(url: "https://github.com/wordpress-mobile/WordPressKit-iOS", branch: "wpios-edition"), + .package(url: "https://github.com/wordpress-mobile/WordPressKit-iOS", branch: "parse-page-order-property"), .package(url: "https://github.com/zendesk/support_sdk_ios", from: "8.0.3"), // We can't use wordpress-rs branches nor commits here. Only tags work. .package(url: "https://github.com/Automattic/wordpress-rs", revision: "alpha-20250127"), diff --git a/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved b/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved index 9b9551386cf0..daaa1a817a89 100644 --- a/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "b048f2348f14b6f12b4a4b8588355abe499af3f8f4e91cacc054e98187a7746c", + "originHash" : "22d0c1b3f7e39812921cdd883dd43d6502abbb0b8d294779f4db4f79c6ce80fb", "pins" : [ { "identity" : "alamofire", @@ -391,8 +391,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/wordpress-mobile/WordPressKit-iOS", "state" : { - "branch" : "wpios-edition", - "revision" : "ba542bae62a1d9b80b0baee44d610bfac55936ea" + "branch" : "parse-page-order-property", + "revision" : "7c2c1d0f2851eb6744376b4d61f03211826ed7f0" } }, { diff --git a/WordPress/Classes/Models/AbstractPost.h b/WordPress/Classes/Models/AbstractPost.h index 41ed30bc1b4d..6178226e463b 100644 --- a/WordPress/Classes/Models/AbstractPost.h +++ b/WordPress/Classes/Models/AbstractPost.h @@ -34,6 +34,7 @@ typedef NS_ENUM(NSUInteger, AbstractPostRemoteStatus) { @property (weak, readonly) AbstractPost *revision; @property (nonatomic, strong) NSSet *comments; @property (nonatomic, strong, nullable) Media *featuredImage; +@property (nonatomic, assign) NSInteger order; /// This array will contain a list of revision IDs. @property (nonatomic, strong, nullable) NSArray *revisions; diff --git a/WordPress/Classes/Models/AbstractPost.m b/WordPress/Classes/Models/AbstractPost.m index 55d68a55515b..966afe533af6 100644 --- a/WordPress/Classes/Models/AbstractPost.m +++ b/WordPress/Classes/Models/AbstractPost.m @@ -23,6 +23,7 @@ @implementation AbstractPost @dynamic autosaveModifiedDate; @dynamic autosaveIdentifier; @dynamic foreignID; +@dynamic order; @synthesize voiceContent; #pragma mark - Life Cycle Methods diff --git a/WordPress/Classes/Services/PostHelper.m b/WordPress/Classes/Services/PostHelper.m index e6b659aa0be4..fd85123cdc40 100644 --- a/WordPress/Classes/Services/PostHelper.m +++ b/WordPress/Classes/Services/PostHelper.m @@ -30,6 +30,7 @@ + (void)updatePost:(AbstractPost *)post withRemotePost:(RemotePost *)remotePost post.content = remotePost.content; post.status = remotePost.status; post.password = remotePost.password; + post.order = remotePost.order; if (remotePost.postThumbnailID != nil) { post.featuredImage = [Media existingOrStubMediaWithMediaID: remotePost.postThumbnailID inBlog:post.blog]; diff --git a/WordPress/Classes/Utility/PageTree.swift b/WordPress/Classes/Utility/PageTree.swift index 1c92e1613480..049cead400bd 100644 --- a/WordPress/Classes/Utility/PageTree.swift +++ b/WordPress/Classes/Utility/PageTree.swift @@ -2,10 +2,6 @@ final class PageTree { // A node in a tree, which of course is also a tree itself. private class TreeNode { - struct PageData { - var postID: NSNumber? - var parentID: NSNumber? - } let page: Page var children = [TreeNode]() var parentNode: TreeNode? @@ -16,7 +12,7 @@ final class PageTree { func dfsList() -> [Page] { var pages = [Page]() - _ = depthFirstSearch { level, node in + _ = depthFirstSearch(sortByPageOrder: true) { level, node in let page = node.page page.hierarchyIndex = level page.hasVisibleParent = node.parentNode != nil @@ -32,18 +28,19 @@ final class PageTree { /// a boolean value indicate whether the search should be stopped. /// - Returns: `true` if search has been stopped by the closure. @discardableResult - func depthFirstSearch(using closure: (Int, TreeNode) -> Bool) -> Bool { - depthFirstSearch(level: 0, using: closure) + func depthFirstSearch(sortByPageOrder: Bool, using closure: (Int, TreeNode) -> Bool) -> Bool { + depthFirstSearch(level: 0, sortByPageOrder: sortByPageOrder, using: closure) } - private func depthFirstSearch(level: Int, using closure: (Int, TreeNode) -> Bool) -> Bool { + private func depthFirstSearch(level: Int, sortByPageOrder: Bool, using closure: (Int, TreeNode) -> Bool) -> Bool { let shouldStop = closure(level, self) if shouldStop { return true } - for child in children { - let shouldStop = child.depthFirstSearch(level: level + 1, using: closure) + let pages = sortByPageOrder ? children.sorted(using: KeyPathComparator(\TreeNode.page.order)) : children + for child in pages { + let shouldStop = child.depthFirstSearch(level: level + 1, sortByPageOrder: sortByPageOrder, using: closure) if shouldStop { return true } diff --git a/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion b/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion index 3d6139808000..80f88276341c 100644 --- a/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion +++ b/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ <plist version="1.0"> <dict> <key>_XCCurrentVersionName</key> - <string>WordPress 154.xcdatamodel</string> + <string>WordPress 155.xcdatamodel</string> </dict> </plist> diff --git a/WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents b/WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents new file mode 100644 index 000000000000..b90e23b2197c --- /dev/null +++ b/WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents @@ -0,0 +1,883 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23605" systemVersion="24D70" minimumToolsVersion="Xcode 9.0" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> + <entity name="AbstractPost" representedClassName="AbstractPost" isAbstract="YES" parentEntity="BasePost"> + <attribute name="autosaveContent" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="autosaveExcerpt" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="autosaveIdentifier" optional="YES" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/> + <attribute name="autosaveModifiedDate" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="autosaveTitle" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="autoUploadAttemptsCount" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="confirmedChangesHash" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="confirmedChangesTimestamp" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateModified" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="foreignID" optional="YES" attributeType="UUID" usesScalarValueType="NO" syncable="YES"/> + <attribute name="metaIsLocal" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="metaPublishImmediately" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="NO" syncable="YES"/> + <attribute name="order" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="revisions" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="statusAfterSync" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="posts" inverseEntity="Blog" syncable="YES"/> + <relationship name="featuredImage" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Media" inverseName="featuredOnPosts" inverseEntity="Media" syncable="YES"/> + <relationship name="media" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Media" inverseName="posts" inverseEntity="Media" syncable="YES"/> + <relationship name="original" optional="YES" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="AbstractPost" inverseName="revision" inverseEntity="AbstractPost" syncable="YES"/> + <relationship name="revision" optional="YES" minCount="1" maxCount="1" deletionRule="Cascade" destinationEntity="AbstractPost" inverseName="original" inverseEntity="AbstractPost" syncable="YES"/> + <fetchIndex name="byDateModifiedIndex"> + <fetchIndexElement property="dateModified" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byBlogIndex"> + <fetchIndexElement property="blog" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byMediaIndex"> + <fetchIndexElement property="media" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byOriginalIndex"> + <fetchIndexElement property="original" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byRevisionIndex"> + <fetchIndexElement property="revision" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="Account" representedClassName="WPAccount" syncable="YES"> + <attribute name="avatarURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="dateCreated" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="displayName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="email" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="emailVerified" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="primaryBlogID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="userID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="username" attributeType="String" syncable="YES"/> + <attribute name="uuid" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blogs" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Blog" inverseName="account" inverseEntity="Blog" syncable="YES"/> + <relationship name="defaultBlog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="accountForDefaultBlog" inverseEntity="Blog" syncable="YES"/> + <relationship name="settings" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="AccountSettings" inverseName="account" inverseEntity="AccountSettings" syncable="YES"/> + <fetchIndex name="byBlogsIndex"> + <fetchIndexElement property="blogs" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="AccountSettings" representedClassName=".ManagedAccountSettings" syncable="YES"> + <attribute name="aboutMe" attributeType="String" syncable="YES"/> + <attribute name="blockEmailNotifications" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="displayName" attributeType="String" syncable="YES"/> + <attribute name="email" attributeType="String" syncable="YES"/> + <attribute name="emailPendingAddress" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="emailPendingChange" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="firstName" attributeType="String" syncable="YES"/> + <attribute name="language" attributeType="String" syncable="YES"/> + <attribute name="lastName" attributeType="String" syncable="YES"/> + <attribute name="primarySiteID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="tracksOptOut" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="twoStepEnabled" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="username" attributeType="String" syncable="YES"/> + <attribute name="usernameCanBeChanged" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="webAddress" attributeType="String" syncable="YES"/> + <relationship name="account" maxCount="1" deletionRule="Nullify" destinationEntity="Account" inverseName="settings" inverseEntity="Account" syncable="YES"/> + </entity> + <entity name="BasePost" representedClassName="BasePost" isAbstract="YES"> + <attribute name="author" optional="YES" attributeType="String"/> + <attribute name="authorAvatarURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="authorID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="content" optional="YES" attributeType="String"/> + <attribute name="date_created_gmt" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + <attribute name="mt_excerpt" optional="YES" attributeType="String"/> + <attribute name="password" optional="YES" attributeType="String"/> + <attribute name="pathForDisplayImage" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="permaLink" optional="YES" attributeType="String"/> + <attribute name="postID" optional="YES" attributeType="Integer 64" defaultValueString="-1" usesScalarValueType="NO"/> + <attribute name="postTitle" optional="YES" attributeType="String"/> + <attribute name="remoteStatusNumber" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="status" optional="YES" attributeType="String" defaultValueString="publish"/> + <attribute name="suggested_slug" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="wp_slug" optional="YES" attributeType="String"/> + <relationship name="comments" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Comment" inverseName="post" inverseEntity="Comment" syncable="YES"/> + <fetchIndex name="byAuthorIDIndex"> + <fetchIndexElement property="authorID" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="BlockedAuthor" representedClassName="BlockedAuthor" syncable="YES"> + <attribute name="accountID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="authorID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <fetchIndex name="byPropertyIndex"> + <fetchIndexElement property="accountID" type="Binary" order="ascending"/> + <fetchIndexElement property="authorID" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="BlockEditorSettingElement" representedClassName="BlockEditorSettingElement" syncable="YES"> + <attribute name="name" attributeType="String" syncable="YES"/> + <attribute name="order" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="slug" attributeType="String" syncable="YES"/> + <attribute name="type" attributeType="String" syncable="YES"/> + <attribute name="value" attributeType="String" syncable="YES"/> + <relationship name="settings" maxCount="1" deletionRule="Nullify" destinationEntity="BlockEditorSettings" inverseName="elements" inverseEntity="BlockEditorSettings" syncable="YES"/> + </entity> + <entity name="BlockEditorSettings" representedClassName="BlockEditorSettings" syncable="YES"> + <attribute name="checksum" attributeType="String" syncable="YES"/> + <attribute name="isFSETheme" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="lastUpdated" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="rawFeatures" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="rawStyles" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="blockEditorSettings" inverseEntity="Blog" syncable="YES"/> + <relationship name="elements" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="BlockEditorSettingElement" inverseName="settings" inverseEntity="BlockEditorSettingElement" syncable="YES"/> + </entity> + <entity name="BlockedSite" representedClassName="BlockedSite" syncable="YES"> + <attribute name="accountID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="blogID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <fetchIndex name="byBlogIDAndAccountIDIndex"> + <fetchIndexElement property="blogID" type="Binary" order="ascending"/> + <fetchIndexElement property="accountID" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="Blog" representedClassName="Blog"> + <attribute name="apiKey" optional="YES" attributeType="String"/> + <attribute name="blogID" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="capabilities" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="currentThemeId" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="hasDomainCredit" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="hasOlderPages" transient="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="NO"/> + <attribute name="hasOlderPosts" transient="YES" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="NO"/> + <attribute name="hasPaidPlan" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="icon" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="isActivated" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isAdmin" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isHostedAtWPcom" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isMultiAuthor" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="lastCommentsSync" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + <attribute name="lastPagesSync" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + <attribute name="lastPostsSync" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + <attribute name="lastUpdateWarning" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="lastUsed" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="mobileEditor" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="options" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData"/> + <attribute name="organizationID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="pinnedDate" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="planActiveFeatures" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" customClassName="[String]" syncable="YES"/> + <attribute name="planID" optional="YES" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/> + <attribute name="planTitle" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postFormats" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData"/> + <attribute name="quickStartTypeValue" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="quotaSpaceAllowed" optional="YES" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/> + <attribute name="quotaSpaceUsed" optional="YES" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/> + <attribute name="url" attributeType="String"/> + <attribute name="userID" optional="YES" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/> + <attribute name="username" optional="YES" attributeType="String"/> + <attribute name="visible" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="NO" syncable="YES"/> + <attribute name="webEditor" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="xmlrpc" attributeType="String"/> + <relationship name="account" optional="YES" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="Account" inverseName="blogs" inverseEntity="Account" syncable="YES"/> + <relationship name="accountForDefaultBlog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Account" inverseName="defaultBlog" inverseEntity="Account" syncable="YES"/> + <relationship name="authors" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="BlogAuthor" inverseName="blog" inverseEntity="BlogAuthor" syncable="YES"/> + <relationship name="blockEditorSettings" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="BlockEditorSettings" inverseName="blog" inverseEntity="BlockEditorSettings" syncable="YES"/> + <relationship name="categories" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Category" inverseName="blog" inverseEntity="Category"/> + <relationship name="comments" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Comment" inverseName="blog" inverseEntity="Comment"/> + <relationship name="connections" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PublicizeConnection" inverseName="blog" inverseEntity="PublicizeConnection" syncable="YES"/> + <relationship name="domains" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Domain" inverseName="blog" inverseEntity="Domain" syncable="YES"/> + <relationship name="inviteLinks" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="InviteLinks" inverseName="blog" inverseEntity="InviteLinks" syncable="YES"/> + <relationship name="media" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Media" inverseName="blog" inverseEntity="Media"/> + <relationship name="menuLocations" optional="YES" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="MenuLocation" inverseName="blog" inverseEntity="MenuLocation" syncable="YES"/> + <relationship name="menus" optional="YES" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="Menu" inverseName="blog" inverseEntity="Menu" syncable="YES"/> + <relationship name="pageTemplateCategories" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PageTemplateCategory" inverseName="blog" inverseEntity="PageTemplateCategory" syncable="YES"/> + <relationship name="posts" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="AbstractPost" inverseName="blog" inverseEntity="AbstractPost"/> + <relationship name="postTypes" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PostType" inverseName="blog" inverseEntity="PostType" syncable="YES"/> + <relationship name="publicizeInfo" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="PublicizeInfo" inverseName="blog" inverseEntity="PublicizeInfo"/> + <relationship name="quickStartTours" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="QuickStartTourState" inverseName="blog" inverseEntity="QuickStartTourState" syncable="YES"/> + <relationship name="roles" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Role" inverseName="blog" inverseEntity="Role" syncable="YES"/> + <relationship name="settings" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="BlogSettings" inverseName="blog" inverseEntity="BlogSettings" syncable="YES"/> + <relationship name="sharingButtons" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="SharingButton" inverseName="blog" inverseEntity="SharingButton" syncable="YES"/> + <relationship name="siteSuggestions" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="SiteSuggestion" inverseName="blog" inverseEntity="SiteSuggestion" syncable="YES"/> + <relationship name="tags" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PostTag" inverseName="blog" inverseEntity="PostTag"/> + <relationship name="themes" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Theme" inverseName="blog" inverseEntity="Theme" syncable="YES"/> + <relationship name="userSuggestions" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="UserSuggestion" inverseName="blog" inverseEntity="UserSuggestion" syncable="YES"/> + <fetchIndex name="byAccountIndex"> + <fetchIndexElement property="account" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byCategoriesIndex"> + <fetchIndexElement property="categories" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byCommentsIndex"> + <fetchIndexElement property="comments" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byMediaIndex"> + <fetchIndexElement property="media" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byPostsIndex"> + <fetchIndexElement property="posts" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="BlogAuthor" representedClassName="WordPress.BlogAuthor" syncable="YES"> + <attribute name="avatarURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="deletedFromBlog" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="displayName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="email" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="linkedUserID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="primaryBlogID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="userID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="username" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="authors" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="BloggingPrompt" representedClassName=".BloggingPrompt" syncable="YES"> + <attribute name="additionalPostTags" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" customClassName="[String]" syncable="YES"/> + <attribute name="answerCount" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="answered" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="attribution" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="date" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="displayAvatarURLs" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" customClassName="[URL]" syncable="YES"/> + <attribute name="promptID" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="siteID" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="text" attributeType="String" defaultValueString="" syncable="YES"/> + </entity> + <entity name="BloggingPromptSettings" representedClassName=".BloggingPromptSettings" syncable="YES"> + <attribute name="isPotentialBloggingSite" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="promptCardEnabled" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/> + <attribute name="promptRemindersEnabled" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="reminderTime" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="siteID" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <relationship name="reminderDays" maxCount="1" deletionRule="Cascade" destinationEntity="BloggingPromptSettingsReminderDays" inverseName="settings" inverseEntity="BloggingPromptSettingsReminderDays" syncable="YES"/> + </entity> + <entity name="BloggingPromptSettingsReminderDays" representedClassName=".BloggingPromptSettingsReminderDays" syncable="YES"> + <attribute name="friday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="monday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="saturday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="sunday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="thursday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="tuesday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="wednesday" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <relationship name="settings" maxCount="1" deletionRule="Cascade" destinationEntity="BloggingPromptSettings" inverseName="reminderDays" inverseEntity="BloggingPromptSettings" syncable="YES"/> + </entity> + <entity name="BlogSettings" representedClassName=".BlogSettings" syncable="YES"> + <attribute name="ampEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="ampSupported" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsAllowed" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsBlocklistKeys" optional="YES" attributeType="Transformable" valueTransformerName="SetValueTransformer" elementID="commentsBlacklistKeys" syncable="YES"/> + <attribute name="commentsCloseAutomatically" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsCloseAutomaticallyAfterDays" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsFromKnownUsersAllowlisted" optional="YES" attributeType="Boolean" usesScalarValueType="NO" elementID="commentsFromKnownUsersWhitelisted" syncable="YES"/> + <attribute name="commentsMaximumLinks" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsModerationKeys" optional="YES" attributeType="Transformable" valueTransformerName="SetValueTransformer" syncable="YES"/> + <attribute name="commentsPageSize" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsPagingEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsRequireManualModeration" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsRequireNameAndEmail" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsRequireRegistration" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsSortOrder" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsThreadingDepth" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsThreadingEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateFormat" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="defaultCategoryID" optional="YES" attributeType="Integer 32" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/> + <attribute name="defaultPostFormat" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="geolocationEnabled" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO"/> + <attribute name="gmtOffset" optional="YES" attributeType="Decimal" defaultValueString="0.0" syncable="YES"/> + <attribute name="iconMediaID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackBlockMaliciousLoginAttempts" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackLazyLoadImages" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackLoginAllowListedIPAddresses" optional="YES" attributeType="Transformable" valueTransformerName="SetValueTransformer" elementID="jetpackLoginWhiteListedIPAddresses" syncable="YES"/> + <attribute name="jetpackMonitorEmailNotifications" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackMonitorEnabled" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackMonitorPushNotifications" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackServeImagesFromOurServers" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackSSOEnabled" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackSSOMatchAccountsByEmail" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="jetpackSSORequireTwoStepAuthentication" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="languageID" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="pingbackInboundEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="pingbackOutboundEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="postsPerPage" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="privacy" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="relatedPostsAllowed" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="relatedPostsEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="relatedPostsShowHeadline" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="relatedPostsShowThumbnails" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sharingButtonStyle" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="sharingCommentLikesEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sharingDisabledLikes" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sharingDisabledReblogs" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sharingLabel" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="sharingTwitterName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="startOfWeek" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tagline" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="timeFormat" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="timezoneString" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="settings" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="Category" representedClassName="PostCategory"> + <attribute name="categoryID" attributeType="Integer 32" defaultValueString="-1" usesScalarValueType="YES"/> + <attribute name="categoryName" attributeType="String"/> + <attribute name="parentID" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/> + <relationship name="blog" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="categories" inverseEntity="Blog"/> + <relationship name="posts" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Post" inverseName="categories" inverseEntity="Post"/> + <fetchIndex name="byBlogIndex"> + <fetchIndexElement property="blog" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byPostsIndex"> + <fetchIndexElement property="posts" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="Comment" representedClassName="Comment"> + <attribute name="author" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="author_email" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="author_ip" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="author_url" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="authorAvatarURL" optional="YES" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="authorID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="canModerate" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="content" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="dateCreated" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + <attribute name="depth" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="hierarchy" optional="YES" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="isLiked" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="likeCount" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="link" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="parentID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="postID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="postTitle" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="rawContent" optional="YES" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="replyID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="status" optional="YES" attributeType="String" defaultValueString=""/> + <attribute name="type" optional="YES" attributeType="String" defaultValueString="comment"/> + <attribute name="visibleOnReader" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="comments" inverseEntity="Blog" syncable="YES"/> + <relationship name="post" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="BasePost" inverseName="comments" inverseEntity="BasePost" syncable="YES"/> + <fetchIndex name="byStatusIndex"> + <fetchIndexElement property="status" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="DiffAbstractValue" representedClassName="WordPress.DiffAbstractValue" isAbstract="YES" syncable="YES"> + <attribute name="diffOperation" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="diffType" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="index" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="value" optional="YES" attributeType="String" syncable="YES"/> + </entity> + <entity name="DiffContentValue" representedClassName="WordPress.DiffContentValue" parentEntity="DiffAbstractValue" syncable="YES"> + <relationship name="revisionDiff" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="RevisionDiff" inverseName="contentDiffs" inverseEntity="RevisionDiff" syncable="YES"/> + </entity> + <entity name="DiffTitleValue" representedClassName="WordPress.DiffTitleValue" parentEntity="DiffAbstractValue" syncable="YES"> + <relationship name="revisionDiff" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="RevisionDiff" inverseName="titleDiffs" inverseEntity="RevisionDiff" syncable="YES"/> + </entity> + <entity name="Domain" representedClassName=".ManagedDomain" syncable="YES"> + <attribute name="autoRenewalDate" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="autoRenewing" optional="YES" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/> + <attribute name="domainName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="domainType" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="expired" optional="YES" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/> + <attribute name="expiryDate" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="expirySoon" optional="YES" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/> + <attribute name="isPrimary" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="domains" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="InviteLinks" representedClassName="InviteLinks" syncable="YES"> + <attribute name="expiry" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="groupInvite" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/> + <attribute name="inviteDate" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="inviteKey" attributeType="String" syncable="YES"/> + <attribute name="isPending" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/> + <attribute name="link" attributeType="String" syncable="YES"/> + <attribute name="role" attributeType="String" syncable="YES"/> + <relationship name="blog" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="inviteLinks" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="LikeUser" representedClassName="LikeUser" syncable="YES"> + <attribute name="avatarUrl" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="bio" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="dateFetched" attributeType="Date" defaultDateTimeInterval="642123600" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateLiked" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateLikedString" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="displayName" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="likedCommentID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="likedPostID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="likedSiteID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="primaryBlogID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="userID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="username" attributeType="String" defaultValueString="" syncable="YES"/> + <relationship name="preferredBlog" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="LikeUserPreferredBlog" inverseName="user" inverseEntity="LikeUserPreferredBlog" syncable="YES"/> + </entity> + <entity name="LikeUserPreferredBlog" representedClassName="LikeUserPreferredBlog" syncable="YES"> + <attribute name="blogID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="blogName" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="blogUrl" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="iconUrl" attributeType="String" defaultValueString="" syncable="YES"/> + <relationship name="user" maxCount="1" deletionRule="Nullify" destinationEntity="LikeUser" inverseName="preferredBlog" inverseEntity="LikeUser" syncable="YES"/> + </entity> + <entity name="Media" representedClassName="Media"> + <attribute name="alt" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="autoUploadFailureCount" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="caption" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="creationDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/> + <attribute name="desc" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="error" optional="YES" attributeType="Transformable" valueTransformerName="NSErrorValueTransformer" syncable="YES"/> + <attribute name="filename" optional="YES" attributeType="String"/> + <attribute name="filesize" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="height" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="length" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="localThumbnailIdentifier" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="localThumbnailURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="localURL" optional="YES" attributeType="String"/> + <attribute name="mediaID" optional="YES" attributeType="Integer 32" usesScalarValueType="NO"/> + <attribute name="mediaTypeString" optional="YES" attributeType="String"/> + <attribute name="postID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="remoteLargeURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="remoteMediumURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="remoteStatusNumber" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO"/> + <attribute name="remoteThumbnailURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="remoteURL" optional="YES" attributeType="String"/> + <attribute name="shortcode" optional="YES" attributeType="String"/> + <attribute name="title" optional="YES" attributeType="String"/> + <attribute name="videopressGUID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="width" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <relationship name="blog" minCount="1" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="media" inverseEntity="Blog"/> + <relationship name="featuredOnPosts" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="AbstractPost" inverseName="featuredImage" inverseEntity="AbstractPost" syncable="YES"/> + <relationship name="posts" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="AbstractPost" inverseName="media" inverseEntity="AbstractPost"/> + <fetchIndex name="byBlogIndex"> + <fetchIndexElement property="blog" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byPostsIndex"> + <fetchIndexElement property="posts" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="Menu" representedClassName="Menu" syncable="YES"> + <attribute name="details" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="menuID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="menus" inverseEntity="Blog" syncable="YES"/> + <relationship name="items" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="MenuItem" inverseName="menu" inverseEntity="MenuItem" syncable="YES"/> + <relationship name="locations" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="MenuLocation" inverseName="menu" inverseEntity="MenuLocation" syncable="YES"/> + </entity> + <entity name="MenuItem" representedClassName="MenuItem" syncable="YES"> + <attribute name="classes" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="contentID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="details" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="itemID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="linkTarget" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="linkTitle" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="type" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="typeFamily" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="typeLabel" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="urlStr" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="children" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="MenuItem" inverseName="parent" inverseEntity="MenuItem" syncable="YES"/> + <relationship name="menu" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Menu" inverseName="items" inverseEntity="Menu" syncable="YES"/> + <relationship name="parent" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="MenuItem" inverseName="children" inverseEntity="MenuItem" syncable="YES"/> + </entity> + <entity name="MenuLocation" representedClassName="MenuLocation" syncable="YES"> + <attribute name="defaultState" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="details" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="menuLocations" inverseEntity="Blog" syncable="YES"/> + <relationship name="menu" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Menu" inverseName="locations" inverseEntity="Menu" syncable="YES"/> + </entity> + <entity name="Notification" representedClassName="Notification" syncable="YES"> + <attribute name="body" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="header" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="icon" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="meta" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="noticon" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="notificationHash" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="notificationId" optional="YES" attributeType="String" elementID="simperiumKey" syncable="YES"/> + <attribute name="read" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="subject" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="timestamp" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="title" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="type" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="url" optional="YES" attributeType="String" syncable="YES"/> + </entity> + <entity name="Page" representedClassName="Page" parentEntity="AbstractPost"> + <attribute name="parentID" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO"/> + <userInfo/> + </entity> + <entity name="PageTemplateCategory" representedClassName="PageTemplateCategory" syncable="YES"> + <attribute name="desc" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="emoji" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="ordinal" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="slug" attributeType="String" syncable="YES"/> + <attribute name="title" attributeType="String" syncable="YES"/> + <relationship name="blog" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="pageTemplateCategories" inverseEntity="Blog" syncable="YES"/> + <relationship name="layouts" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="PageTemplateLayout" inverseName="categories" inverseEntity="PageTemplateLayout" syncable="YES"/> + </entity> + <entity name="PageTemplateLayout" representedClassName="PageTemplateLayout" syncable="YES"> + <attribute name="content" attributeType="String" syncable="YES"/> + <attribute name="demoUrl" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="preview" attributeType="String" syncable="YES"/> + <attribute name="previewMobile" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="previewTablet" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="slug" attributeType="String" syncable="YES"/> + <attribute name="title" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="categories" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="PageTemplateCategory" inverseName="layouts" inverseEntity="PageTemplateCategory" syncable="YES"/> + </entity> + <entity name="Person" representedClassName=".ManagedPerson" syncable="YES"> + <attribute name="avatarURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="creationDate" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="displayName" attributeType="String" syncable="YES"/> + <attribute name="firstName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="isSuperAdmin" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="kind" optional="YES" attributeType="Integer 16" usesScalarValueType="NO" syncable="YES"/> + <attribute name="lastName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="linkedUserID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="role" attributeType="String" syncable="YES"/> + <attribute name="siteID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="userID" attributeType="Integer 64" usesScalarValueType="NO" syncable="YES"/> + <attribute name="username" attributeType="String" syncable="YES"/> + </entity> + <entity name="Plan" representedClassName=".Plan" syncable="YES"> + <attribute name="features" attributeType="String" syncable="YES"/> + <attribute name="groups" attributeType="String" syncable="YES"/> + <attribute name="icon" attributeType="String" syncable="YES"/> + <attribute name="name" attributeType="String" syncable="YES"/> + <attribute name="nonLocalizedShortname" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="order" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="products" attributeType="String" syncable="YES"/> + <attribute name="shortname" attributeType="String" syncable="YES"/> + <attribute name="summary" attributeType="String" syncable="YES"/> + <attribute name="supportName" attributeType="String" defaultValueString="" syncable="YES"/> + <attribute name="supportPriority" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="tagline" attributeType="String" syncable="YES"/> + </entity> + <entity name="PlanFeature" representedClassName=".PlanFeature" syncable="YES"> + <attribute name="slug" attributeType="String" syncable="YES"/> + <attribute name="summary" attributeType="String" syncable="YES"/> + <attribute name="title" attributeType="String" syncable="YES"/> + </entity> + <entity name="PlanGroup" representedClassName=".PlanGroup" syncable="YES"> + <attribute name="name" attributeType="String" syncable="YES"/> + <attribute name="order" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="slug" attributeType="String" syncable="YES"/> + </entity> + <entity name="Post" representedClassName="Post" parentEntity="AbstractPost"> + <attribute name="bloggingPromptID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="commentCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="disabledPublicizeConnections" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData"/> + <attribute name="isStickyPost" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="likeCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="postFormat" optional="YES" attributeType="String"/> + <attribute name="postType" attributeType="String" defaultValueString="post" syncable="YES"/> + <attribute name="publicID" optional="YES" attributeType="String"/> + <attribute name="publicizeMessage" optional="YES" attributeType="String"/> + <attribute name="publicizeMessageID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tags" optional="YES" attributeType="String"/> + <relationship name="categories" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Category" inverseName="posts" inverseEntity="Category"/> + <fetchIndex name="byCategoriesIndex"> + <fetchIndexElement property="categories" type="Binary" order="ascending"/> + </fetchIndex> + <userInfo/> + </entity> + <entity name="PostTag" representedClassName="PostTag"> + <attribute name="name" attributeType="String"/> + <attribute name="postCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="slug" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tagDescription" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tagID" optional="YES" attributeType="Integer 32" defaultValueString="-1" usesScalarValueType="NO"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="tags" inverseEntity="Blog" syncable="YES"/> + <userInfo/> + </entity> + <entity name="PostType" representedClassName="PostType" syncable="YES"> + <attribute name="apiQueryable" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="label" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="postTypes" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="PublicizeConnection" representedClassName="WordPress.PublicizeConnection" syncable="YES"> + <attribute name="connectionID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateExpires" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateIssued" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="externalDisplay" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="externalFollowerCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="externalID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="externalName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="externalProfilePicture" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="externalProfileURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="keyringConnectionID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="keyringConnectionUserID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="label" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="refreshURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="service" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="shared" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="siteID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="status" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="userID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="connections" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="PublicizeInfo" representedClassName=".PublicizeInfo" syncable="YES"> + <attribute name="sharedPostsCount" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="shareLimit" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="sharesRemaining" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="toBePublicizedCount" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="publicizeInfo" inverseEntity="Blog"/> + </entity> + <entity name="PublicizeService" representedClassName="WordPress.PublicizeService" syncable="YES"> + <attribute name="connectURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="detail" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="externalUsersOnly" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="icon" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="jetpackModuleRequired" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="jetpackSupport" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="label" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="multipleExternalUserIDSupport" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="order" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="serviceID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="status" optional="YES" attributeType="String" defaultValueString="ok" syncable="YES"/> + <attribute name="type" optional="YES" attributeType="String" syncable="YES"/> + </entity> + <entity name="QuickStartTourState" representedClassName="QuickStartTourState" syncable="YES"> + <attribute name="completed" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="skipped" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="tourID" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="quickStartTours" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="ReaderAbstractTopic" representedClassName="WordPress.ReaderAbstractTopic" isAbstract="YES" syncable="YES"> + <attribute name="algorithm" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="following" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="inUse" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="lastSynced" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="path" attributeType="String" syncable="YES"/> + <attribute name="showInMenu" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="title" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="type" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="posts" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="ReaderPost" inverseName="topic" inverseEntity="ReaderPost" syncable="YES"/> + <fetchIndex name="byInUseIndex"> + <fetchIndexElement property="inUse" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byPathIndex"> + <fetchIndexElement property="path" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="ReaderCard" representedClassName=".ReaderCard" syncable="YES"> + <attribute name="sortRank" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="post" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="ReaderPost" inverseName="card" inverseEntity="ReaderPost" syncable="YES"/> + <relationship name="sites" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="ReaderSiteTopic" inverseName="cards" inverseEntity="ReaderSiteTopic" syncable="YES"/> + <relationship name="topics" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="ReaderTagTopic" inverseName="cards" inverseEntity="ReaderTagTopic" syncable="YES"/> + </entity> + <entity name="ReaderCrossPostMeta" representedClassName="WordPress.ReaderCrossPostMeta" syncable="YES"> + <attribute name="commentURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="postURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="siteID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="siteURL" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="post" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="ReaderPost" inverseName="crossPostMeta" inverseEntity="ReaderPost" syncable="YES"/> + </entity> + <entity name="ReaderDefaultTopic" representedClassName="WordPress.ReaderDefaultTopic" parentEntity="ReaderAbstractTopic" syncable="YES"/> + <entity name="ReaderGapMarker" representedClassName="ReaderGapMarker" parentEntity="ReaderPost" syncable="YES"/> + <entity name="ReaderListTopic" representedClassName="WordPress.ReaderListTopic" parentEntity="ReaderAbstractTopic" syncable="YES"> + <attribute name="isOwner" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isPublic" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="listDescription" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="listID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="owner" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="slug" optional="YES" attributeType="String" syncable="YES"/> + </entity> + <entity name="ReaderPost" representedClassName="ReaderPost" parentEntity="BasePost" syncable="YES"> + <attribute name="authorDisplayName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="authorEmail" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="authorURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="blogDescription" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="blogName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="blogURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="canSubscribeComments" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="commentCount" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="commentsOpen" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="dateSynced" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="featuredImage" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="feedID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="feedItemID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="globalID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="inUse" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isBlogAtomic" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isBlogPrivate" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isExternal" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isFollowing" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isJetpack" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isLiked" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isLikesEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isReblogged" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isSavedForLater" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isSeen" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/> + <attribute name="isSeenSupported" attributeType="Boolean" defaultValueString="YES" usesScalarValueType="YES" syncable="YES"/> + <attribute name="isSharingEnabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isSiteBlocked" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isSubscribedComments" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="isWPCom" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="likeCount" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="organizationID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="postAvatar" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="primaryTag" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="primaryTagSlug" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="railcar" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="readingTime" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="receivesCommentNotifications" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/> + <attribute name="score" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="siteIconURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="siteID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sortDate" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sortRank" attributeType="Double" defaultValueString="0.0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="summary" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tags" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="wordCount" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="card" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="ReaderCard" inverseName="post" inverseEntity="ReaderCard" syncable="YES"/> + <relationship name="crossPostMeta" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="ReaderCrossPostMeta" inverseName="post" inverseEntity="ReaderCrossPostMeta" syncable="YES"/> + <relationship name="sourceAttribution" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="SourcePostAttribution" inverseName="post" inverseEntity="SourcePostAttribution" syncable="YES"/> + <relationship name="topic" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="ReaderAbstractTopic" inverseName="posts" inverseEntity="ReaderAbstractTopic" syncable="YES"/> + <fetchIndex name="byDateSyncedIndex"> + <fetchIndexElement property="dateSynced" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byGlobalIDIndex"> + <fetchIndexElement property="globalID" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byInUseIndex"> + <fetchIndexElement property="inUse" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="byIsSiteBlockedIndex"> + <fetchIndexElement property="isSiteBlocked" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="bySiteIDIndex"> + <fetchIndexElement property="siteID" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="bySortDateIndex"> + <fetchIndexElement property="sortDate" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="bySortRankIndex"> + <fetchIndexElement property="sortRank" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="ReaderSearchSuggestion" representedClassName="WordPress.ReaderSearchSuggestion" syncable="YES"> + <attribute name="date" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="searchPhrase" attributeType="String" syncable="YES"/> + <fetchIndex name="byDateIndex"> + <fetchIndexElement property="date" type="Binary" order="ascending"/> + </fetchIndex> + <fetchIndex name="bySearchPhraseIndex"> + <fetchIndexElement property="searchPhrase" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="ReaderSearchTopic" representedClassName="WordPress.ReaderSearchTopic" parentEntity="ReaderAbstractTopic" syncable="YES"/> + <entity name="ReaderSiteInfoSubscriptionEmail" representedClassName="WordPress.ReaderSiteInfoSubscriptionEmail" syncable="YES"> + <attribute name="postDeliveryFrequency" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="sendComments" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="sendPosts" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <relationship name="siteTopic" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="ReaderSiteTopic" inverseName="emailSubscription" inverseEntity="ReaderSiteTopic" syncable="YES"/> + </entity> + <entity name="ReaderSiteInfoSubscriptionPost" representedClassName="WordPress.ReaderSiteInfoSubscriptionPost" syncable="YES"> + <attribute name="sendPosts" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <relationship name="siteTopic" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="ReaderSiteTopic" inverseName="postSubscription" inverseEntity="ReaderSiteTopic" syncable="YES"/> + </entity> + <entity name="ReaderSiteTopic" representedClassName="WordPress.ReaderSiteTopic" parentEntity="ReaderAbstractTopic" syncable="YES"> + <attribute name="feedID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="feedURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="isJetpack" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isPrivate" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="isVisible" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="organizationID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="postCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="siteBlavatar" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="siteDescription" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="siteID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="siteURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="subscriberCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="unseenCount" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="cards" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="ReaderCard" inverseName="sites" inverseEntity="ReaderCard" syncable="YES"/> + <relationship name="emailSubscription" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="ReaderSiteInfoSubscriptionEmail" inverseName="siteTopic" inverseEntity="ReaderSiteInfoSubscriptionEmail" syncable="YES"/> + <relationship name="postSubscription" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="ReaderSiteInfoSubscriptionPost" inverseName="siteTopic" inverseEntity="ReaderSiteInfoSubscriptionPost" syncable="YES"/> + </entity> + <entity name="ReaderTagTopic" representedClassName="WordPress.ReaderTagTopic" parentEntity="ReaderAbstractTopic" syncable="YES"> + <attribute name="isRecommended" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="slug" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tagID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="cards" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="ReaderCard" inverseName="topics" inverseEntity="ReaderCard" syncable="YES"/> + </entity> + <entity name="ReaderTeamTopic" representedClassName="WordPress.ReaderTeamTopic" parentEntity="ReaderAbstractTopic" syncable="YES"> + <attribute name="organizationID" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="slug" optional="YES" attributeType="String" syncable="YES"/> + </entity> + <entity name="Revision" representedClassName="WordPress.Revision" syncable="YES"> + <attribute name="postAuthorId" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="postContent" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postDateGmt" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postExcerpt" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postId" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="postModifiedGmt" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postTitle" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="revisionId" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="siteId" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="diff" optional="YES" maxCount="1" deletionRule="Cascade" destinationEntity="RevisionDiff" inverseName="revision" inverseEntity="RevisionDiff" syncable="YES"/> + </entity> + <entity name="RevisionDiff" representedClassName="WordPress.RevisionDiff" syncable="YES"> + <attribute name="fromRevisionId" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="toRevisionId" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="totalAdditions" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="totalDeletions" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="contentDiffs" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="DiffContentValue" inverseName="revisionDiff" inverseEntity="DiffContentValue" syncable="YES"/> + <relationship name="revision" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Revision" inverseName="diff" inverseEntity="Revision" syncable="YES"/> + <relationship name="titleDiffs" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="DiffTitleValue" inverseName="revisionDiff" inverseEntity="DiffTitleValue" syncable="YES"/> + </entity> + <entity name="Role" representedClassName=".Role" syncable="YES"> + <attribute name="name" attributeType="String" syncable="YES"/> + <attribute name="order" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="slug" attributeType="String" syncable="YES"/> + <relationship name="blog" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="roles" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="SharingButton" representedClassName="WordPress.SharingButton" syncable="YES"> + <attribute name="buttonID" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="custom" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="enabled" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="order" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="shortname" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="visibility" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="sharingButtons" inverseEntity="Blog" syncable="YES"/> + <fetchIndex name="byOrderIndex"> + <fetchIndexElement property="order" type="Binary" order="ascending"/> + </fetchIndex> + </entity> + <entity name="SiteSuggestion" representedClassName="SiteSuggestion" syncable="YES"> + <attribute name="blavatarURL" optional="YES" attributeType="URI" syncable="YES"/> + <attribute name="siteURL" optional="YES" attributeType="URI" syncable="YES"/> + <attribute name="subdomain" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="title" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="siteSuggestions" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="SourcePostAttribution" representedClassName="SourcePostAttribution" syncable="YES"> + <attribute name="attributionType" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="authorName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="authorURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="avatarURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="blogID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="blogName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="blogURL" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="commentCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="likeCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="permalink" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="postID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <relationship name="post" maxCount="1" deletionRule="Nullify" destinationEntity="ReaderPost" inverseName="sourceAttribution" inverseEntity="ReaderPost" syncable="YES"/> + </entity> + <entity name="Theme" representedClassName="Theme" syncable="YES"> + <attribute name="author" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="authorUrl" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="custom" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="NO" syncable="YES"/> + <attribute name="demoUrl" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="details" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="launchDate" optional="YES" attributeType="Date" usesScalarValueType="NO" syncable="YES"/> + <attribute name="name" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="order" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="popularityRank" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="premium" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="previewUrl" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="price" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="purchased" optional="YES" attributeType="Boolean" usesScalarValueType="NO" syncable="YES"/> + <attribute name="screenshotUrl" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="stylesheet" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="tags" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" syncable="YES"/> + <attribute name="themeId" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="themeUrl" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="trendingRank" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/> + <attribute name="version" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="themes" inverseEntity="Blog" syncable="YES"/> + </entity> + <entity name="UserSuggestion" representedClassName="UserSuggestion" syncable="YES"> + <attribute name="displayName" optional="YES" attributeType="String" syncable="YES"/> + <attribute name="imageURL" optional="YES" attributeType="URI" syncable="YES"/> + <attribute name="userID" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/> + <attribute name="username" optional="YES" attributeType="String" syncable="YES"/> + <relationship name="blog" maxCount="1" deletionRule="Nullify" destinationEntity="Blog" inverseName="userSuggestions" inverseEntity="Blog" syncable="YES"/> + </entity> +</model> \ No newline at end of file