{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":688231698,"defaultBranch":"main","name":"collections","ownerLogin":"Certora","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-09-06T23:47:59.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/39188753?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1716495373.0","currentOid":""},"activityList":{"items":[{"before":"1bb0beb42993e5ed67b83491b83c8b156640fc6e","after":"01ac23af7abbec4d6fdfc9279986a8daaad01192","ref":"refs/heads/main","pushedAt":"2024-06-23T22:25:25.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Fix type safety issues in sorted collections (#15)\n\nThe treap-based collections are split into hashed and sorted variants.\nThe hashed collections are the most versatile; they'll work for any key\ntype. The sorted collections are specific to `Comparable` types, taking\nadvantage of the ordering to avoid having to deal with hash collisions.\n\nWe don't expose the notion of sorted vs hashed in the public API.\nInstead, we automatically create the correct collection type based on\nthe element type. This mostly works, but has some issues currently. Take\nthe following for example:\n\n```kotlin\ntreapSetOf(1, null)\n```\n\nThis is allowed statically (`treapSetOf` has no restrictions on the\nelement type), but currently throws a `NullPointerException` at runtime.\nThe reason is that the first element is `Comparable`, and so we create a\n`SortedTreapSet`, which is effecively a `TreapSet>` Then,\nwhen we add the `null`, we fail the runtime check that the element is a\n`Comparable`, because it is null.\n\nSimilarly, if we start with a `Comparable`, and then add a\nnon-`Comparable`, we also crash:\n\n```kotlin\ndata class Foo(a: Int)\ntreapSetOf(1, Foo(2)) \n```\n\nWhere we went wrong is in making `SortedTreapSet` a\n`TreapSet>`. Conceptually, `SortedTreapSet` should be a\nset of arbitrary values - _that just happens to only contain values that\nare `Comparable`_.\n\nWe fix this by removing the constraint from `SortedTreapSet` (and\n`SortedTreapMap`), and adding some runtime checks to switch to the\nhashed collections if a non-`Comparable` key is added.\n\nWe also allow `null` as a sorted key, which prevents the (quite\nexpensive) downgrade to the hashed collections just to get nullability.","shortMessageHtmlLink":"Fix type safety issues in sorted collections (#15)"}},{"before":"840d5eb1a37c86fac8b43fe93a9148553c305162","after":"1bb0beb42993e5ed67b83491b83c8b156640fc6e","ref":"refs/heads/main","pushedAt":"2024-05-23T20:14:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Fix NullPointerException in treapListOf(1).subString(1, 1) (and many other cases) (#16)","shortMessageHtmlLink":"Fix NullPointerException in treapListOf(1).subString(1, 1) (and many …"}},{"before":"04fb5d3e233b08aac172d8b08d0a38565bd4efb4","after":"840d5eb1a37c86fac8b43fe93a9148553c305162","ref":"refs/heads/main","pushedAt":"2024-05-21T16:28:35.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Some new performance features (#14)\n\nWhile doing some Prover performance work, I found the following to be\r\nuseful:\r\n\r\n- Add `mapReduce` and `parallelMapReduce` methods on `TreapSet,`\r\n`TreapMap`, and `TreapList`. These do what you think they do, and are\r\nuseful for the obvious reasons.\r\n\r\n- Allow `TreapMap.updateValues` (and `parallelUpdateValues`) to change\r\nthe type of the values. This makes a straightforward mapping of values\r\nto different types an O(N) operation instead of O(N log N).\r\n\r\nI also simplified the `TreapMap.updateEntry` signature a bit (it had\r\nsome extraneous nullability annotations).","shortMessageHtmlLink":"Some new performance features (#14)"}},{"before":"aac400193ed716e96b229ac87560bc1c13c1985a","after":"04fb5d3e233b08aac172d8b08d0a38565bd4efb4","ref":"refs/heads/main","pushedAt":"2024-02-17T00:20:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Add new methods for querying sorted treap maps (#13)\n\nAdds the following methods to `TreapMap`, with inspiration from the\r\nJDK's `TreeMap`:\r\n\r\n`firstKey`\r\n`firstEntry`\r\n`floorKey`\r\n`floorEntry`\r\n`lowerKey`\r\n`lowerEntry`\r\n\r\n`lastKey`\r\n`lastEntry`\r\n`ceilingKey`\r\n`ceilingEntry`\r\n`higherKey`\r\n`higherEntry`\r\n\r\nThese are implemented as extension methods so that they can be\r\nconstrained to only key types that implement `Comparable`. To allow this\r\nto be done safely, I've also changed `TreapMap`, _et al_, to be\r\n`sealed`, as they should have been all along.","shortMessageHtmlLink":"Add new methods for querying sorted treap maps (#13)"}},{"before":"315e3db7f61778a6604a70e0504854226d610300","after":"aac400193ed716e96b229ac87560bc1c13c1985a","ref":"refs/heads/main","pushedAt":"2024-02-09T15:26:25.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Update README.md","shortMessageHtmlLink":"Update README.md"}},{"before":"38f10b6b0953ee5bf9e91cb3fdf2b79b014dbcbe","after":"315e3db7f61778a6604a70e0504854226d610300","ref":"refs/heads/main","pushedAt":"2024-02-08T14:57:42.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Introduce TreapList (#12)\n\n`TreapList` is a Treap-based `PersistentList` implementation which\r\nsignificantly outperforms both `ArrayList` and the reference\r\n`PersistentList` implementation from `kotlinx.collections.immutable` for\r\nmost operations. Nearly every `PersistentList` operation has a log-time\r\nimplementation, including things like inserting one list in the middle\r\nof another list.\r\n\r\n`TreapList` is notably a rather efficient persistent Deque, with\r\nO(log(N)) insertion and removal at both ends of the list.\r\n\r\n## Design\r\n\r\n`TreapList` is organized as a Treap, with left/right being determined by\r\nthe order of the elements in the list, and with randomly-assigned node\r\npriorities to balance the tree. This is different from how we assign\r\npriorities in `TreapMap`/`TreapSet`, where we hash the element values to\r\nget the priority; because `TreapList` can contain multiple elements with\r\nthe same value, we must randomly assign priorities to ensure that, say,\r\na list of 1,000,000 entries with the same value won't just end up being\r\na linked list. If we randomly assigned priorities in the set/map\r\nimplementations, it would complicate unions, intersections, merges, etc.\r\n- but those operations do not apply to Lists, so random priorities are\r\nfine here.\r\n\r\nAlso unlike the set/map implementations, each `TreapList` node tracks\r\nthe size of the sublist represented by that node, enabling log-time\r\nindexing into the list.\r\n\r\n`TreapList` is a little like a probabilistically balanced\r\n[Rope](https://en.wikipedia.org/wiki/Rope_(data_structure)), but as an\r\narbitrary list.\r\n\r\n## Performance\r\n\r\nFor most operations, `TreapList` outperforms `ArrayList` (when used as\r\nan immutable list), as well as the reference `PersistentList`\r\nimplementation from `kotlinx.collections.immutable`. The most notable\r\nexception is the `get` operation, which for `ArrayList` is a simple\r\narray indexing operation:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/b6b1d85d-a2f7-44c5-b403-6495e816f87f)\r\n\r\n`TreapList` generally matches or beats `ArrayList` when adding a single\r\nelement to the end of the list (producing a new list), but is beaten by\r\n`kotlinx.collections.immutable`:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/8f073ef4-fb96-4472-8b02-f0a73929930a)\r\n\r\nHowever, for most other list operations, `TreapList` wins handily. For\r\nexample, insertion of a single item at the front of the list:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/b28fd2ac-8cfc-466e-9d21-1733746e93dd)\r\n\r\nReplacing the value at a given index:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/6020ae6a-d93b-4516-ac50-273dc3b40208)\r\n\r\nOr appending one list to another list:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/b0d66ed5-09d3-4781-97d4-c579b4ffea09)\r\n\r\nMore benchmarks are available; you can run `gradlew listBenchmark` to\r\nrun them all.\r\n\r\n## Memory Usage\r\n\r\nOne disadvantage of `TreapList` vs the alternatives is that a single\r\n`TreapList` of a given size is quite a lot larger than the equivalent\r\n`ArrayList` or `kotlinx.collections.immutable` list:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/f8b6f575-b237-4913-b46b-ce29909e0aea)\r\n\r\nHowever, `TreapList` is better able to re-use allocations between\r\n\"versions\" of a list. For example, consider the scenario where we add\r\none item at a time, in the middle of the list, retaining all\r\nintermediate results, and adding up the total size:\r\n\r\n\r\n![image](https://github.com/Certora/collections/assets/7407587/42cd6dd4-5433-44fe-a196-86bce863eb42)\r\n\r\nWe can see that in this extreme case, `TreapList` uses much less memory\r\nthan the other alternatives.\r\n\r\nReal heap usage will of course depend on how much the specific use case\r\nis able to take advantage of the increased allocation sharing.","shortMessageHtmlLink":"Introduce TreapList (#12)"}},{"before":"9ccf2b2876c950d08ff812ed2752615e711e36d3","after":null,"ref":"refs/tags/v0.1.2","pushedAt":"2024-01-12T21:12:27.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"9ccf2b2876c950d08ff812ed2752615e711e36d3","after":"38f10b6b0953ee5bf9e91cb3fdf2b79b014dbcbe","ref":"refs/heads/main","pushedAt":"2024-01-12T21:09:04.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Fix stack overflow in TreapMapBuilder.clear() (#11)\n\nWe were inheriting `clear` from `AbstractMutableMap`, which calls\r\n`entries.clear()`, which in turn calls `map.clear()`, which then calls\r\n`entries.clear()`...etc.","shortMessageHtmlLink":"Fix stack overflow in TreapMapBuilder.clear() (#11)"}},{"before":"946ba94a615e25a04587455e34be768450ff61c6","after":"9ccf2b2876c950d08ff812ed2752615e711e36d3","ref":"refs/heads/main","pushedAt":"2023-12-16T00:03:16.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Better diagnostics for map iteration while mutating (#10)\n\nIf one obtains a `MutableMap.Entry` from a mutable map / builder, and\nthen removes the underlying value from the map, we currently return\n`null` from the entry's `value` property, rather than throwing. Either\nbehavior is allowed by the `MutableMap.Entry` spec, which specifies\n`IllegalStateException` *or* undefined behavior in this case - but it's\nmuch easier to debug this if an exception is thrown.","shortMessageHtmlLink":"Better diagnostics for map iteration while mutating (#10)"}},{"before":"168df568c904726bc86222341bb0eabfd0d3f146","after":null,"ref":"refs/heads/eric/javadoc","pushedAt":"2023-12-02T00:21:36.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"e846dc679b913e9dbb53370ecfab4933ac4803c0","after":"946ba94a615e25a04587455e34be768450ff61c6","ref":"refs/heads/main","pushedAt":"2023-12-02T00:21:35.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Publish docs (#8)","shortMessageHtmlLink":"Publish docs (#8)"}},{"before":"2f4e7ceebc314e4dce1507dc3713297b0b3eb526","after":"168df568c904726bc86222341bb0eabfd0d3f146","ref":"refs/heads/eric/javadoc","pushedAt":"2023-12-02T00:18:26.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Merge remote-tracking branch 'origin/main' into eric/javadoc","shortMessageHtmlLink":"Merge remote-tracking branch 'origin/main' into eric/javadoc"}},{"before":"0d373733a69844c9ab3029ed77820aa39d404938","after":"2f4e7ceebc314e4dce1507dc3713297b0b3eb526","ref":"refs/heads/eric/javadoc","pushedAt":"2023-12-02T00:12:10.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"wip","shortMessageHtmlLink":"wip"}},{"before":null,"after":"df0169ac5f20a51e5b7bd1a75f5ac5c0799eaaac","ref":"refs/heads/mutableCollections","pushedAt":"2023-10-27T16:25:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Add mutable set/map implementations","shortMessageHtmlLink":"Add mutable set/map implementations"}},{"before":"63438462434385374d6b9a1bb2ba80c2345a5b83","after":null,"ref":"refs/heads/eric/benchmarks","pushedAt":"2023-10-27T13:46:24.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"55826f2767d12fd404edc38844e4f520886bfb31","after":"e846dc679b913e9dbb53370ecfab4933ac4803c0","ref":"refs/heads/main","pushedAt":"2023-10-27T13:46:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Add benchmarks (#9)\n\nThese are derived from the benchmarks for\r\n`kotlinx.collections.immutable`, with added benchmarks for\r\n`TreapSet`/`TreapMap`-specific functionality. There is also a routine to\r\ncompute the memory footprint of the various set/map implementations.","shortMessageHtmlLink":"Add benchmarks (#9)"}},{"before":null,"after":"63438462434385374d6b9a1bb2ba80c2345a5b83","ref":"refs/heads/eric/benchmarks","pushedAt":"2023-10-27T13:40:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Get hashTreap* involved","shortMessageHtmlLink":"Get hashTreap* involved"}},{"before":"351d4b6cfa584942d4e9b738f965b0a4b6f14628","after":"0d373733a69844c9ab3029ed77820aa39d404938","ref":"refs/heads/eric/javadoc","pushedAt":"2023-10-24T18:42:06.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Try another way","shortMessageHtmlLink":"Try another way"}},{"before":null,"after":"351d4b6cfa584942d4e9b738f965b0a4b6f14628","ref":"refs/heads/eric/javadoc","pushedAt":"2023-10-24T18:17:30.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"dokka","shortMessageHtmlLink":"dokka"}},{"before":"d52afa1991116b0d68f6035e8a5b73bd5e077b69","after":null,"ref":"refs/heads/eric/jitpack2","pushedAt":"2023-10-24T17:21:38.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"a89098d6e6dc94234886742705cc8a84e7fe6207","after":"55826f2767d12fd404edc38844e4f520886bfb31","ref":"refs/heads/main","pushedAt":"2023-10-24T17:21:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Remove rest of old packaging scheme (#7)","shortMessageHtmlLink":"Remove rest of old packaging scheme (#7)"}},{"before":"ab7dc011c2630c4fae8cb1b67701891439fe7abb","after":"d52afa1991116b0d68f6035e8a5b73bd5e077b69","ref":"refs/heads/eric/jitpack2","pushedAt":"2023-10-24T17:19:29.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Merge branch 'main' into eric/jitpack2","shortMessageHtmlLink":"Merge branch 'main' into eric/jitpack2"}},{"before":null,"after":"ab7dc011c2630c4fae8cb1b67701891439fe7abb","ref":"refs/heads/eric/jitpack2","pushedAt":"2023-10-24T17:06:33.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Remove rest of old packaging scheme","shortMessageHtmlLink":"Remove rest of old packaging scheme"}},{"before":"a89098d6e6dc94234886742705cc8a84e7fe6207","after":null,"ref":"refs/tags/0.1.0","pushedAt":"2023-10-24T16:08:42.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"9825771bb7efbcc9d2315c0466129a184e5b6ef4","after":null,"ref":"refs/tags/0.1.0","pushedAt":"2023-10-23T23:19:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"fc83d867a5d26ea506329deb5c7872995420d099","after":null,"ref":"refs/heads/jitpack","pushedAt":"2023-10-23T23:19:01.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"9825771bb7efbcc9d2315c0466129a184e5b6ef4","after":"a89098d6e6dc94234886742705cc8a84e7fe6207","ref":"refs/heads/main","pushedAt":"2023-10-23T23:19:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Settings for jitpack (#6)","shortMessageHtmlLink":"Settings for jitpack (#6)"}},{"before":"4e94b2f470236b4cd757708a4673eb99b15b528d","after":"fc83d867a5d26ea506329deb5c7872995420d099","ref":"refs/heads/jitpack","pushedAt":"2023-10-23T23:17:05.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"},"commit":{"message":"Merge branch 'main' into jitpack","shortMessageHtmlLink":"Merge branch 'main' into jitpack"}},{"before":"c84eaf6de949778f6f8f4d56b01aa029ad839ec0","after":null,"ref":"refs/tags/0.0.1","pushedAt":"2023-10-23T23:15:26.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}},{"before":"22127b4e52707f173a86f776a867bd87f9d204eb","after":null,"ref":"refs/tags/0.0.2","pushedAt":"2023-10-23T23:15:22.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ericeil","name":"Eric Eilebrecht","path":"/ericeil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7407587?s=80&v=4"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEbPT49gA","startCursor":null,"endCursor":null}},"title":"Activity · Certora/collections"}