Compare commits

..

1 Commits

Author SHA1 Message Date
84183d2b83 Add thread muting
Changelog-Added: Add thread muting
2023-04-13 11:42:56 +02:00
1419 changed files with 11372 additions and 95804 deletions

View File

@@ -5,7 +5,6 @@ on:
push:
branches:
- "master"
- "ci"
pull_request:
branches:
- "*"

3
.gitignore vendored
View File

@@ -1,8 +1,5 @@
xcuserdata
/.direnv
damus/TestingPrivate.swift
damus.xcodeproj/xcshareddata/xcbaselines
.DS_Store
TODO.bak
tags
build-git-hash.txt

View File

@@ -1,6 +0,0 @@
Terry Yiu <git@tyiu.xyz> <963907+tyiu@users.noreply.github.com>
Ben Weeks <ben.weeks@knowall.ai> <ben.weeks@outlook.com>
Suhail Saqan <suhail.saqan@gmail.com> <43693074+suhailsaqan@users.noreply.github.com>
cr0bar <cr0bar@cr0.bar> <cr0bar@users.noreply.github.com>
Swift <scoder1747@gmail.com> <120697811+scoder1747@users.noreply.github.com>
Daniel D'Aquino <daniel@daquino.me> <patches@damus.io>

View File

@@ -1,574 +1,3 @@
## [1.6-18] - 2023-09-21
### Added
- Add followed hashtags to your following list (Daniel DAquino)
- Add "Do not show #nsfw tagged posts" setting (Daniel DAquino)
- Hold tap to preview status URL (Jericho Hasselbush)
- Finnish translations (etrikaj)
### Changed
- Switch to nostrdb for @'s and user search (William Casarin)
- Use nostrdb for profiles (William Casarin)
- Updated relay view (ericholguin)
- Increase size of the hitbox on note ellipsis button (Daniel DAquino)
- Make carousel tab dots tappable (Bryan Montz)
- Move the "Follow you" badge into the profile header (Grimless)
### Fixed
- Fix text composer wrapping issue when mentioning npub (Daniel DAquino)
- Make blurred videos viewable by allowing blur to disappear once tapped (Daniel DAquino)
- Fix parsing issue with NIP-47 compliant NWC urls without double-slashes (Daniel DAquino)
- Fix padding of username next to pfp on some views (William Casarin)
- Fixes issue where username with multiple emojis would place cursor in strange position. (Jericho Hasselbush)
- Fixed audio in video playing twice (Bryan Montz)
- Fix crash when long pressing custom reactions (William Casarin)
- Fix random crashom due to old profile database (William Casarin)
[1.6-18]: https://github.com/damus-io/damus/releases/tag/v1.6-18
## [1.6-17] - 2023-08-23
### Added
- Add support for status URLs (William Casarin)
- Click music statuses to display in spotify (William Casarin)
- Add settings for disabling user statuses (William Casarin)
### Changed
- clear statuses if they only contain whitespace (William Casarin)
### Fixed
- Fix long status lines (William Casarin)
- Fix status events not expiring locally (William Casarin)
[1.6-17]: https://github.com/damus-io/damus/releases/tag/v1.6-17
## [1.6-16] - 2023-08-23
### Added
- Added live music statuses (William Casarin)
- Added generic user statuses (William Casarin)
### Fixed
- Avoid notification for zaps from muted profiles (tappu75e@duck.com)
- Fix text editing issues on characters added right after mention link (Daniel DAquino)
- Mute hellthreads everywhere (William Casarin)
[1.6-16]: https://github.com/damus-io/damus/releases/tag/v1.6-16
## [1.6-13] - 2023-08-18
### Fixed
- Fix bug where it would sometimes show -1 in replies (tappu75e@duck.com)
- Fix images and links occasionally appearing with escaped slashes (Daniel DAquino)
- Fixed nostrscript not working on smaller phones (William Casarin)
- Fix zaps sometimes not appearing (William Casarin)
- Fixed issue where reposts would sometimes repost the wrong thing (William Casarin)
- Fixed issue where sometimes there would be empty entries on your profile (William Casarin)
[1.6-13]: https://github.com/damus-io/damus/releases/tag/v1.6-13
## [1.6-11]: "Bugfix Sunday" - 2023-08-07
### Added
- Add close button to custom reactions (Suhail Saqan)
- Add ability to change order of custom reactions (Suhail Saqan)
- Adjustable font size (William Casarin)
### Changed
- Show renotes in Notes timeline (William Casarin)
### Fixed
- Ensure the person you're replying to is the first entry in the reply description (William Casarin)
- Don't cutoff text in notifications (William Casarin)
- Fix wikipedia url detection with parenthesis (William Casarin)
- Fixed old notifications always appearing on first start (William Casarin)
- Fix issue with slashes on relay urls causing relay connection problems (William Casarin)
- Fix rare crash triggered by local notifications (William Casarin)
- Fix crash when long-pressing reactions (William Casarin)
- Fixed nostr reporting decoding (William Casarin)
- Dismiss qr screen on scan (Suhail Saqan)
- Show QRCameraView regardless of same user (Suhail Saqan)
- Fix wiggle when long press reactions (Suhail Saqan)
- Fix reaction button breaking scrolling (Suhail Saqan)
- Fix crash when muting threads (Bryan Montz)
[1.6-11]: https://github.com/damus-io/damus/releases/tag/v1.6-11
## [1.6-8]: "nostrdb prep" 2023-08-03
### Added
- Suggested Users to Follow (Joel Klabo)
- Add support for multiple reactions (Suhail Saqan)
### Changed
- Improved memory usage and performance when processing events (William Casarin)
### Fixed
- Fixed disappearing text on iOS17 (cr0bar)
- Fix UTF support for hashtags (Daniel DAquino)
- Fix compilation error on test target in UserSearchCacheTests (Daniel DAquino)
- Fix nav crashing and buggyness (William Casarin)
- Allow relay logs to be opened in dev mode even if relay (Daniel D'Aquino)
- endless connection attempt loop after user removes relay (Bryan Montz)
[1.6-8]: https://github.com/damus-io/damus/releases/tag/v1.6-8
## 1.6 (7): "Less bad" - 2023-07-16
### Added
- Show nostr address username and support abbreviated _ usernames (William Casarin)
- Re-add nip05 badges to profiles (William Casarin)
- Add space when tagging users in posts if needed (William Casarin)
- Added padding under word count on longform account (William Casarin)
### Fixed
- Don't spam lnurls when validating zaps (William Casarin)
- Eliminate nostr address validation bandwidth on startup (William Casarin)
- Allow user to login to deleted profile (William Casarin)
- Fix issue where typing cc@bob would produce brokenb ccnostr:bob mention (William Casarin)
[1.6-7]: https://github.com/damus-io/damus/releases/tag/v1.6-7
## [1.6-6] - 2023-07-16
### Added
- New markdown renderer (William Casarin)
- Added feedback when user adds a relay that is already on the list (Daniel D'Aquino)
### Changed
- Hide nsec when logging in (cr0bar)
- Remove nip05 on events (William Casarin)
- Rename NIP05 to "nostr address" (William Casarin)
### Fixed
- Fixed issue where hashtags were leaking in DMs (William Casarin)
- Fix issue with emojis next to hashtags and urls (William Casarin)
- relay detail view is not immediately available after adding new relay (Bryan Montz)
- Fix nostr:nostr:... bugs (William Casarin)
[1.6-6]: https://github.com/damus-io/damus/releases/tag/v1.6-6
## [1.6-4] - 2023-07-13
### Added
- Add the ability to follow hashtags (William Casarin)
### Changed
- Remove note size restriction for longform events (William Casarin)
### Fixed
- Hide users and hashtags from home timeline when you unfollow (William Casarin)
- Fixed a bug where following a user might not work due to poor connectivity (William Casarin)
- Icon color for developer mode setting is incorrect in low-light mode (Bryan Montz)
- Fixed nav bar color on login, eula, and account creation (ericholguin)
### Removed
- Remove following Damus Will by default (William Casarin)
[1.6-4]: https://github.com/damus-io/damus/releases/tag/v1.6-4
## [1.6-3] - 2023-07-11
### Changed
- Start at top when reading longform events (William Casarin)
- Allow reposting and quote reposting multiple times (William Casarin)
### Fixed
- Show longform previews in notifications instead of the entire post (William Casarin)
- Fix padding on longform events (William Casarin)
- Fix action bar appearing on quoted longform previews (William Casarin)
[1.6-3]: https://github.com/damus-io/damus/releases/tag/v1.6-3
## [1.6-2] - 2023-07-11
### Added
- Add support for multilingual hashtags (cr0bar)
- Add r tag when mentioning a url (William Casarin)
- Add initial longform note support (William Casarin)
- Enable banner image editing (Joel Klabo)
- Add relay log in developer mode (Bryan Montz)
### Fixed
- Fix lag when creating large posts (William Casarin)
- Fix npub mentions failing to parse in some cases (William Casarin)
- Fix PostView initial string to skip mentioning self when on own profile (Terry Yiu)
- Fix freezing bug when tapping Developer settings menu (Terry Yiu)
- Fix potential fake profile zap attacks (William Casarin)
- Fix issue where malicious zappers can send fake zaps to another user's posts (William Casarin)
- Fix profile post button mentions (cr0bar)
- Fix icons on settings view (cr0bar)
- Fix Invalid Zap bug in reposts (William Casarin)
### Removed
- Remove old @ and & hex key mentions (William Casarin)
[1.6-2]: https://github.com/damus-io/damus/releases/tag/v1.6-2
## [1.6] - 2023-07-04
### Added
- Speed up user search (Terry Yiu)
- Add post button to profile pages (William Casarin)
- Add post button when logged in with private key and on own profile view (Terry Yiu)
### Changed
- Drop iOS15 support (Scott Penrose)
### Fixed
- Load more content on profile view (William Casarin)
- Fix reports to conform to NIP-56 (Terry Yiu)
- Fix profile navigation bugs from muted users list and relay list views (Terry Yiu)
- Fix navigation to translation settings view (Terry Yiu)
- Fixed all navigation issues (Scott Penrose)
- Disable post button when media upload in progress (Terry Yiu)
- Fix taps on mentions in note drafts to not redirect to other Nostr clients (Terry Yiu)
- Fix missing profile zap notification text (Terry Yiu)
[1.6]: https://github.com/damus-io/damus/releases/tag/v1.6
## [1.5-5] - 2023-06-24
### Fixed
- Remove note zaps to fit apples appstore guidelines
- Fix zap sheet popping (William Casarin)
- Fix CustomizeZapView from randomly disappearing (William Casarin)
- Fix "zapped your profile" strings to say "zapped you" (Terry Yiu)
- Fix reconnect loop issues on iOS17 (William Casarin)
- Fix some more thread jankiness (William Casarin)
- Fix spelling of Nostr to use Titlecase instead of lowercase (Terry Yiu)
- Rename all usages of the term Post as a noun to Note to conform to the Nostr spec (Terry Yiu)
- Fix text cutoff on login with npub (gladiusKatana)
- Fix hangs due to video player (William Casarin)
[1.5-5]: https://github.com/damus-io/damus/releases/tag/v1.5-5
## [1.5-2] - 2023-05-30
### Added
- Add new full-bleed video player (William Casarin)
- Add ability to show multiple posts per user in Universe (Ben Weeks)
- Custom iconography added for other areas of the app. (Ben Weeks)
- Custom iconography for the left navigation. (Ben Weeks)
- Custom iconography for the tab buttons. (Ben Weeks)
- Added dots under image carousel (Ben Weeks)
- Add profile caching (Bryan Montz)
- Add mention parsing and fine-grained text selection on description in ProfileView (Terry Yiu)
### Changed
- Redesign phase 1 (text, icons)
- Updated UI to use custom font (Ben Weeks)
### Fixed
- Fix side menu bug in landscape (OlegAba)
- Use "Follow me on nostr" text when looking at someone else's QR code (Ben Weeks)
- Fix issue where cursor dissapears when typing long message (gladiusKatana)
- Attempt fix for randomly broken animated gifs (William Casarin)
- Fix cursor jumping when pressing return (gladius)
- Fix side menu label size so that translations in longer languages fit without wrapping (Terry Yiu)
- Fix reaction notification title to be consistent with ReactionView (Terry Yiu)
- Fix nostr URL scheme to open properly even if there's already a different view open (Terry Yiu)
- Fix crash related to preloading events (Bryan Montz)
## v1.4.3 - 2023-05-08
### Added
- Add #zaps and #onlyzaps to custom hashtags (William Casarin)
- Add OnlyZaps mode: disable reactions, only zaps! (William Casarin)
- Add QR Code in profiles (ericholguin)
- Add confirmation alert when clearing all bookmarks (Swift)
- Add deep links for local notifications (Swift)
- Add friends filter to DMs (William Casarin)
- Add image metadata to image uploads (William Casarin)
- Add nokyctranslate translation option (symbsrcool)
- Add partial support for different repost variants (William Casarin)
- Add paste button to login (Suhail Saqan)
- Add q tag to quoted renotes (William Casarin)
- Add setting to hide reactions (Terry Yiu)
- Add thread muting (Terry Yiu)
- Add unmute option in profile view (Joshua Jiang)
- Add webp image support (William Casarin)
- Added event preloading when scrolling (William Casarin)
- Colorize friend icons (William Casarin)
- Friends filter for notifications (William Casarin)
- Preload images so they don't pop in (William Casarin)
- Preload profile pictures while scrolling (William Casarin)
- Preview media uploads when posting (Swift)
- Save keys when logging in and when creating new keypair (Bryan Montz)
- Show blurhash placeholders from image metadata (William Casarin)
- Top-level tab state restoration (Bryan Montz)
- You can now change the default zap type (William Casarin)
- new iconography (Roberto Agreda)
### Changed
- Add number formatting for sats entry and use selected zaps amount from picker as placeholder (Terry Yiu)
- Adjust attachment images placement when posting (Swift)
- Always check signatures of profile events (William Casarin)
- Ask permission before uploading media (Swift)
- Cached various UI elements so its not as laggy (William Casarin)
- Change 500 custom zap to 420 (William Casarin)
- Changed look of Repost and Quote buttons (ericholguin)
- Enable like button on OnlyZaps profiles for people who don't have OnlyZaps mode on (William Casarin)
- Load zaps instantly on events (William Casarin)
- New looks to the custom zaps view (ericholguin)
- Only show friends, not friend-of-friend in friend filter (William Casarin)
- Preload events when they are queued (William Casarin)
- Search hashtags automatically (William Casarin)
- Show DM message in local notification (William Casarin)
- replace Vault dependency with @KeychainStorage property wrapper (Bryan Montz)
### Fixed
- Dismiss bookmarks view when switching tabs (William Casarin)
- Do not allow non-numeric characters for sats amount and fix numeric entry for other number systems for all locales (Terry Yiu)
- Do not translate own notes if logged in with private key (Terry Yiu)
- Don't process blurhash if we already have image cached (William Casarin)
- Fix "translated from english" bugs (William Casarin)
- Fix Copy Link action does not dismiss ShareAction view (Bryan Montz)
- Fix auto-translations bug where languages in preferred language still gets translated (Terry Yiu)
- Fix bug where you could only mention users at the end of a post (Swift)
- Fix bug with reaction notifications referencing the wrong event (Terry Yiu)
- Fix buggy zap amounts and wallet selector settings (William Casarin)
- Fix camera not dismissing (Swift)
- Fix crash when loading DMs in the background (William Casarin)
- Fix crash when you have invalid relays in your relay list (William Casarin)
- Fix crash with LibreTranslate server setting selection and remove delisted vern server (Terry Yiu)
- Fix having to set onlyzaps mode every time on restart (William Casarin)
- Fix invalid DM author notifications (William Casarin)
- Fix issue where uploaded images were from someone else (Swift)
- Fix npub search fails on the first try (Bryan Montz)
- Fix parse mention without space in content (Joshua Jiang)
- Fix posts with no uploadedURLs always get two blank spaces at the end (Bryan Montz)
- Fix relay signal indicator, properly show how many relays you are connected to (William Casarin)
- Fix shuffling when choosing users to reply to (Joshua Jiang)
- Fix slow reconnection issues (Bryan Montz)
- Fix tap area when mentioning users (OlegAba)
- Fix thread incompatibility for clients that add more than one reply tag (William Casarin)
- Fix user notifications from old events immediately shown on install and login (Bryan Montz)
- Fix weird #\[0] artifacts appearing in posts (William Casarin)
- Fix wrong relative times on events (William Casarin)
- Fixed blurhash appearing behind loaded images when swiping on carousel (William Casarin)
- Fixed glitchy preview (William Casarin)
- Fixed preview elements popping in (William Casarin)
- Fixed repost turning green too early and not reposting sometimes (Swift)
- Home now dismisses reactions view (William Casarin)
- Load missing profiles from boosts on home view (Gísli Kristjánsson)
- Load missing profiles from boosts on profile view (Gísli Kristjánsson)
- Load profiles in hashtag searched (William Casarin)
- Made DMs less poppy (William Casarin)
- Preserve order of bookmarks when saving (William Casarin)
- Properly scroll DM view when keyboard is open (William Casarin)
- Saved Jack's soul. (Ben Weeks)
- Zap type selection on smaller phones (ericholguin)
[1.4.3-21]: https://github.com/damus-io/damus/releases/tag/v1.4.3-21
## [1.4.3-20] - 2023-05-04
### Added
- Add webp image support (William Casarin)
- Preload profile pictures while scrolling (William Casarin)
- Save keys when logging in and when creating new keypair (Bryan Montz)
- Top-level tab state restoration (Bryan Montz)
- Added event preloading when scrolling (William Casarin)
- Preload images so they don't pop in (William Casarin)
### Changed
- Preload events when they are queued (William Casarin)
- Search hashtags automatically (William Casarin)
- Cached various UI elements so its not as laggy (William Casarin)
### Fixed
- Don't process blurhash if we already have image cached (William Casarin)
- Home now dismisses reactions view (William Casarin)
- Fix auto-translations bug where languages in preferred language still gets translated (Terry Yiu)
- Fix wrong relative times on events (William Casarin)
- Load profiles in hashtag searched (William Casarin)
- Fix weird #\[0] artifacts appearing in posts (William Casarin)
- Fix "translated from english" bugs (Terry)
- Fix crash when loading DMs in the background (William Casarin)
- Fixed blurhash appearing behind loaded images when swiping on carousel (William Casarin)
- Fix camera not dismissing (Swift)
- Fix bug with reaction notifications referencing the wrong event (Terry Yiu)
- Fix Copy Link action does not dismiss ShareAction view (Bryan Montz)
- Saved Jack's soul. (Ben Weeks)
- Fixed preview elements popping in (William Casarin)
- Fixed glitchy preview (William Casarin)
[1.4.3-20]: https://github.com/damus-io/damus/releases/tag/v1.4.3-20
## [1.4.3-15] - 2023-04-29
### Added
- Add q tag to quoted renotes (William Casarin)
- Add confirmation alert when clearing all bookmarks (Swift)
- Show blurhash placeholders from image metadata (William Casarin)
- Add image metadata to image uploads (William Casarin)
### Changed
- Load zaps instantly on events (William Casarin)
### Fixed
- Fix thread incompatibility for clients that add more than one reply tag (amethyst, plebstr)
- Preserve order of bookmarks when saving (William Casarin)
- Fix crash when you have invalid relays in your relay list (William Casarin)
[1.4.3-14]: https://github.com/damus-io/damus/releases/tag/v1.4.3-14
## [1.4.3-10] - 2023-04-25
### Added
- Add paste button to login (Suhail Saqan)
- Add nokyctranslate translation option (symbsrcool)
- You can now change the default zap type (William Casarin)
- Add partial support for different repost variants (William Casarin)
### Changed
- Change 500 custom zap to 420 (William Casarin)
- New looks to the custom zaps view (ericholguin)
- Adjust attachment images placement when posting (Swift)
- Only show friends, not friend-of-friend in friend filter (William Casarin)
### Fixed
- Fix reposts on macos and ipad (William Casarin)
- Fix slow reconnection issues (Bryan Montz)
- Fix issue where uploaded images were from someone else (Swift)
- Fix crash with LibreTranslate server setting selection and remove delisted vern server (Terry Yiu)
- Fix buggy zap amounts and wallet selector settings (William Casarin)
[1.4.3-10]: https://github.com/damus-io/damus/releases/tag/v1.4.3-10
## [1.4.3-2] - 2023-04-17
### Added
- Add deep links for local notifications (Swift)
- Add thread muting (Terry Yiu)
- Preview media uploads when posting (Swift)
- Add QR Code in profiles (ericholguin)
### Changed
- Always check signatures of profile events (William Casarin)
- Ask permission before uploading media (Swift)
- Show DM message in local notification (William Casarin)
### Fixed
- Fixed repost turning green too early and not reposting sometimes (Swift)
- Fix shuffling when choosing users to reply to (Joshua Jiang)
- Do not translate own notes if logged in with private key (Terry Yiu)
- Load missing profiles from boosts on home view (Gísli Kristjánsson)
- Load missing profiles from boosts on profile view (Gísli Kristjánsson)
- Fix tap area when mentioning users (OlegAba)
- Fix invalid DM author notifications (William Casarin)
- Fix relay signal indicator, properly show how many relays you are connected to (William Casarin)
[1.4.3-2]: https://github.com/damus-io/damus/releases/tag/v1.4.3-2
## [1.4.2-2] - 2023-04-12
### Added
- Include #btc in custom #bitcoin hashtag (William Casarin)
- Make notification dots configurable (William Casarin)
### Changed
- Display follows in most recent to oldest (Luis Cabrera)
### Fixed
- Fix hitches caused by syncronous loading of cached images (William Casarin)
- Fix tabs sometimes not switching (William Casarin)
[1.4.2-2]: https://github.com/damus-io/damus/releases/tag/v1.4.2-2
## [1.4.1-8] - 2023-04-10
### Added
@@ -1558,5 +987,3 @@
[0.1.2]: https://github.com/damus-io/damus/releases/tag/v0.1.2

View File

@@ -1,13 +0,0 @@
all: nostrscript/primal.wasm
nostrscript/%.wasm: nostrscript/%.ts nostrscript/nostr.ts Makefile
asc $< --runtime stub --outFile $@ --optimize
tags:
find damus-c -name '*.c' -or -name '*.h' | xargs ctags
clean:
rm nostrscript/*.wasm
.PHONY: tags

View File

@@ -1,3 +1,4 @@
dependencies: [
.Package(url: "https://github.com/daltoniam/Starscream.git", majorVersion: 4),
.Package(url: "https://github.com/jb55/secp256k1.swift.git", branch: "main")
]

View File

@@ -92,30 +92,13 @@ damus implements the following [Nostr Implementation Possibilities][nips]
## Contributing
Contributors welcome! Start by examining known issues: https://github.com/damus-io/damus/issues.
Contributors welcome!
### Mailing lists
### Code
We have a few mailing lists that anyone can join to get involved in damus development:
[Email patches][git-send-email] to jb55@jb55.com are preferred, but I accept PRs on GitHub as well.
- [dev][dev-list] - development discussions
- [patches][patches-list] - code submission and review
- [product][product-list] - product discussions
- [design][design-list] - design discussions
[dev-list]: https://damus.io/list/dev
[patches-list]: https://damus.io/list/patches
[product-list]: https://damus.io/list/product
[design-list]: https://damus.io/list/design
### Contributing
See [docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md)
### Privacy
Your internet protocol (IP) address is exposed to the relays you connect to, and third party media hosters (e.g. nostr.build, imgur.com, giphy.com, youtube.com etc.) that render on Damus. If you want to improve your privacy, consider utilizing a service that masks your IP address (e.g. a VPN) from trackers online.
The relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.
[git-send-email]: http://git-send-email.io
### Translations

0
TODO
View File

View File

@@ -35,7 +35,7 @@ typedef struct mention_bech32_block {
struct nostr_bech32 bech32;
} mention_bech32_block_t;
typedef struct note_block {
typedef struct block {
enum block_type type;
union {
struct str_block str;
@@ -45,13 +45,12 @@ typedef struct note_block {
} block;
} block_t;
typedef struct note_blocks {
int words;
typedef struct blocks {
int num_blocks;
struct note_block *blocks;
struct block *blocks;
} blocks_t;
void blocks_init(struct note_blocks *blocks);
void blocks_free(struct note_blocks *blocks);
void blocks_init(struct blocks *blocks);
void blocks_free(struct blocks *blocks);
#endif /* block_h */

View File

@@ -1,123 +1,97 @@
//
// cursor.h
// damus
//
// Created by William Casarin on 2023-04-09.
//
#ifndef JB55_CURSOR_H
#define JB55_CURSOR_H
#ifndef cursor_h
#define cursor_h
#include "typedefs.h"
#include "varint.h"
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <string.h>
#include "bech32.h"
#define unlikely(x) __builtin_expect((x),0)
#define likely(x) __builtin_expect((x),1)
typedef unsigned char u8;
struct cursor {
unsigned char *start;
unsigned char *p;
unsigned char *end;
const u8 *p;
const u8 *start;
const u8 *end;
};
struct array {
struct cursor cur;
unsigned int elem_size;
};
static inline void reset_cursor(struct cursor *cursor)
{
cursor->p = cursor->start;
static inline int is_whitespace(char c) {
return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
}
static inline void wipe_cursor(struct cursor *cursor)
{
reset_cursor(cursor);
memset(cursor->start, 0, cursor->end - cursor->start);
static inline int is_boundary(char c) {
return !isalnum(c);
}
static inline void make_cursor(u8 *start, u8 *end, struct cursor *cursor)
{
cursor->start = start;
cursor->p = start;
cursor->end = end;
static inline int is_invalid_url_ending(char c) {
return c == '!' || c == '?' || c == ')' || c == '.' || c == ',' || c == ';';
}
static inline void make_array(struct array *a, u8* start, u8 *end, unsigned int elem_size)
{
make_cursor(start, end, &a->cur);
a->elem_size = elem_size;
static inline int is_bech32_character(char c) {
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || bech32_charset_rev[c] != -1;
}
static inline int cursor_eof(struct cursor *c)
static inline void make_cursor(struct cursor *c, const u8 *content, size_t len)
{
return c->p == c->end;
c->start = content;
c->end = content + len;
c->p = content;
}
static inline void *cursor_malloc(struct cursor *mem, unsigned long size)
{
void *ret;
if (mem->p + size > mem->end) {
return NULL;
}
ret = mem->p;
mem->p += size;
return ret;
}
static inline void *cursor_alloc(struct cursor *mem, unsigned long size)
{
void *ret;
if (!(ret = cursor_malloc(mem, size))) {
return 0;
}
memset(ret, 0, size);
return ret;
}
static inline int cursor_slice(struct cursor *mem, struct cursor *slice, size_t size)
{
u8 *p;
if (!(p = cursor_alloc(mem, size))) {
return 0;
}
make_cursor(p, mem->p, slice);
return 1;
}
static inline void copy_cursor(struct cursor *src, struct cursor *dest)
{
dest->start = src->start;
dest->p = src->p;
dest->end = src->end;
}
static inline int pull_byte(struct cursor *cursor, u8 *c)
{
if (unlikely(cursor->p >= cursor->end))
return 0;
*c = *cursor->p;
cursor->p++;
return 1;
}
static inline int parse_byte(struct cursor *cursor, u8 *c)
{
if (unlikely(cursor->p >= cursor->end))
return 0;
*c = *cursor->p;
//cursor->p++;
static inline int consume_until_boundary(struct cursor *cur) {
char c;
while (cur->p < cur->end) {
c = *cur->p;
if (is_boundary(c))
return 1;
cur->p++;
}
return 1;
}
static inline int consume_until_whitespace(struct cursor *cur, int or_end) {
char c;
int consumedAtLeastOne = 0;
while (cur->p < cur->end) {
c = *cur->p;
if (is_whitespace(c))
return consumedAtLeastOne;
cur->p++;
consumedAtLeastOne = 1;
}
return or_end;
}
static inline int consume_until_non_bech32_character(struct cursor *cur, int or_end) {
char c;
int consumedAtLeastOne = 0;
while (cur->p < cur->end) {
c = *cur->p;
if (!is_bech32_character(c))
return consumedAtLeastOne;
cur->p++;
consumedAtLeastOne = 1;
}
return or_end;
}
static inline int parse_char(struct cursor *cur, char c) {
if (cur->p >= cur->end)
return 0;
@@ -137,298 +111,31 @@ static inline int peek_char(struct cursor *cur, int ind) {
return *(cur->p + ind);
}
static inline int cursor_pull_c_str(struct cursor *cursor, const char **str)
{
*str = (const char*)cursor->p;
for (; cursor->p < cursor->end; cursor->p++) {
if (*cursor->p == 0) {
cursor->p++;
return 1;
}
}
return 0;
static int parse_digit(struct cursor *cur, int *digit) {
int c;
if ((c = peek_char(cur, 0)) == -1)
return 0;
c -= '0';
if (c >= 0 && c <= 9) {
*digit = c;
cur->p++;
return 1;
}
return 0;
}
static inline int cursor_push_byte(struct cursor *cursor, u8 c)
{
if (unlikely(cursor->p + 1 > cursor->end)) {
return 0;
}
*cursor->p = c;
cursor->p++;
return 1;
static inline int pull_byte(struct cursor *cur, u8 *byte) {
if (cur->p >= cur->end)
return 0;
*byte = *cur->p;
cur->p++;
return 1;
}
static inline int cursor_pull(struct cursor *cursor, u8 *data, int len)
{
if (unlikely(cursor->p + len > cursor->end)) {
return 0;
}
memcpy(data, cursor->p, len);
cursor->p += len;
return 1;
}
static inline int pull_data_into_cursor(struct cursor *cursor,
struct cursor *dest,
unsigned char **data,
int len)
{
int ok;
if (unlikely(dest->p + len > dest->end)) {
printf("not enough room in dest buffer\n");
return 0;
}
ok = cursor_pull(cursor, dest->p, len);
if (!ok) return 0;
*data = dest->p;
dest->p += len;
return 1;
}
static inline int cursor_dropn(struct cursor *cur, int size, int n)
{
if (n == 0)
return 1;
if (unlikely(cur->p - size*n < cur->start)) {
return 0;
}
cur->p -= size*n;
return 1;
}
static inline int cursor_drop(struct cursor *cur, int size)
{
return cursor_dropn(cur, size, 1);
}
static inline unsigned char *cursor_topn(struct cursor *cur, int len, int n)
{
n += 1;
if (unlikely(cur->p - len*n < cur->start)) {
return NULL;
}
return cur->p - len*n;
}
static inline unsigned char *cursor_top(struct cursor *cur, int len)
{
if (unlikely(cur->p - len < cur->start)) {
return NULL;
}
return cur->p - len;
}
static inline int cursor_top_int(struct cursor *cur, int *i)
{
u8 *p;
if (unlikely(!(p = cursor_top(cur, sizeof(*i))))) {
return 0;
}
*i = *((int*)p);
return 1;
}
static inline int cursor_pop(struct cursor *cur, u8 *data, int len)
{
if (unlikely(cur->p - len < cur->start)) {
return 0;
}
cur->p -= len;
memcpy(data, cur->p, len);
return 1;
}
static inline int cursor_push(struct cursor *cursor, u8 *data, int len)
{
if (unlikely(cursor->p + len >= cursor->end)) {
return 0;
}
if (cursor->p != data)
memcpy(cursor->p, data, len);
cursor->p += len;
return 1;
}
static inline int cursor_push_int(struct cursor *cursor, int i)
{
return cursor_push(cursor, (u8*)&i, sizeof(i));
}
static inline size_t cursor_count(struct cursor *cursor, size_t elem_size)
{
return (cursor->p - cursor->start)/elem_size;
}
/* TODO: push_varint */
static inline int push_varint(struct cursor *cursor, int n)
{
int ok, len;
unsigned char b;
len = 0;
while (1) {
b = (n & 0xFF) | 0x80;
n >>= 7;
if (n == 0) {
b &= 0x7F;
ok = cursor_push_byte(cursor, b);
len++;
if (!ok) return 0;
break;
}
ok = cursor_push_byte(cursor, b);
len++;
if (!ok) return 0;
}
return len;
}
/* TODO: pull_varint */
static inline int pull_varint(struct cursor *cursor, int *n)
{
int ok, i;
unsigned char b;
*n = 0;
for (i = 0;; i++) {
ok = pull_byte(cursor, &b);
if (!ok) return 0;
*n |= ((int)b & 0x7F) << (i * 7);
/* is_last */
if ((b & 0x80) == 0) {
return i+1;
}
if (i == 4) return 0;
}
return 0;
}
static inline int cursor_pull_int(struct cursor *cursor, int *i)
{
return cursor_pull(cursor, (u8*)i, sizeof(*i));
}
static inline int cursor_push_u32(struct cursor *cursor, uint32_t i) {
return cursor_push(cursor, (unsigned char*)&i, sizeof(i));
}
static inline int cursor_push_u16(struct cursor *cursor, u16 i)
{
return cursor_push(cursor, (u8*)&i, sizeof(i));
}
static inline void *index_cursor(struct cursor *cursor, unsigned int index, int elem_size)
{
u8 *p;
p = &cursor->start[elem_size * index];
if (unlikely(p >= cursor->end))
return NULL;
return (void*)p;
}
static inline int push_sized_str(struct cursor *cursor, const char *str, int len)
{
return cursor_push(cursor, (u8*)str, len);
}
static inline int cursor_push_str(struct cursor *cursor, const char *str)
{
return cursor_push(cursor, (u8*)str, (int)strlen(str));
}
static inline int cursor_push_c_str(struct cursor *cursor, const char *str)
{
return cursor_push_str(cursor, str) && cursor_push_byte(cursor, 0);
}
/* TODO: push varint size */
static inline int push_prefixed_str(struct cursor *cursor, const char *str)
{
int ok, len;
len = (int)strlen(str);
ok = push_varint(cursor, len);
if (!ok) return 0;
return push_sized_str(cursor, str, len);
}
static inline int pull_prefixed_str(struct cursor *cursor, struct cursor *dest_buf, const char **str)
{
int len, ok;
ok = pull_varint(cursor, &len);
if (!ok) return 0;
if (unlikely(dest_buf->p + len > dest_buf->end)) {
return 0;
}
ok = pull_data_into_cursor(cursor, dest_buf, (unsigned char**)str, len);
if (!ok) return 0;
ok = cursor_push_byte(dest_buf, 0);
return 1;
}
static inline int cursor_remaining_capacity(struct cursor *cursor)
{
return (int)(cursor->end - cursor->p);
}
#define max(a,b) ((a) > (b) ? (a) : (b))
static inline void cursor_print_around(struct cursor *cur, int range)
{
unsigned char *c;
printf("[%ld/%ld]\n", cur->p - cur->start, cur->end - cur->start);
c = max(cur->p - range, cur->start);
for (; c < cur->end && c < (cur->p + range); c++) {
printf("%02x", *c);
}
printf("\n");
c = max(cur->p - range, cur->start);
for (; c < cur->end && c < (cur->p + range); c++) {
if (c == cur->p) {
printf("^");
continue;
}
printf(" ");
}
printf("\n");
}
#undef max
static inline int pull_bytes(struct cursor *cur, int count, const u8 **bytes) {
if (cur->p + count > cur->end)
return 0;
@@ -461,206 +168,5 @@ static inline int parse_str(struct cursor *cur, const char *str) {
return 1;
}
static inline int is_whitespace(char c) {
return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
}
static inline int is_underscore(char c) {
return c == '_';
}
static inline int is_utf8_byte(u8 c) {
return c & 0x80;
}
static inline int parse_utf8_char(struct cursor *cursor, unsigned int *code_point, unsigned int *utf8_length)
{
u8 first_byte;
if (!parse_byte(cursor, &first_byte))
return 0; // Not enough data
// Determine the number of bytes in this UTF-8 character
int remaining_bytes = 0;
if (first_byte < 0x80) {
*code_point = first_byte;
return 1;
} else if ((first_byte & 0xE0) == 0xC0) {
remaining_bytes = 1;
*utf8_length = remaining_bytes + 1;
*code_point = first_byte & 0x1F;
} else if ((first_byte & 0xF0) == 0xE0) {
remaining_bytes = 2;
*utf8_length = remaining_bytes + 1;
*code_point = first_byte & 0x0F;
} else if ((first_byte & 0xF8) == 0xF0) {
remaining_bytes = 3;
*utf8_length = remaining_bytes + 1;
*code_point = first_byte & 0x07;
} else {
remaining_bytes = 0;
*utf8_length = 1; // Assume 1 byte length for unrecognized UTF-8 characters
// TODO: We need to gracefully handle unrecognized UTF-8 characters
printf("Invalid UTF-8 byte: %x\n", *code_point);
*code_point = ((first_byte & 0xF0) << 6); // Prevent testing as punctuation
return 0; // Invalid first byte
}
// Peek at remaining bytes
for (int i = 0; i < remaining_bytes; ++i) {
signed char next_byte;
if ((next_byte = peek_char(cursor, i+1)) == -1) {
*utf8_length = 1;
return 0; // Not enough data
}
// Debugging lines
//printf("Cursor: %s\n", cursor->p);
//printf("Codepoint: %x\n", *code_point);
//printf("Codepoint <<6: %x\n", ((*code_point << 6) | (next_byte & 0x3F)));
//printf("Remaining bytes: %x\n", remaining_bytes);
//printf("First byte: %x\n", first_byte);
//printf("Next byte: %x\n", next_byte);
//printf("Bitwise AND result: %x\n", (next_byte & 0xC0));
if ((next_byte & 0xC0) != 0x80) {
*utf8_length = 1;
return 0; // Invalid byte in sequence
}
*code_point = (*code_point << 6) | (next_byte & 0x3F);
}
return 1;
}
/**
* Checks if a given Unicode code point is a punctuation character
*
* @param codepoint The Unicode code point to check. @return true if the
* code point is a punctuation character, false otherwise.
*/
static inline int is_punctuation(unsigned int codepoint) {
// Check for underscore (underscore is not treated as punctuation)
if (is_underscore(codepoint))
return 0;
// Check for ASCII punctuation
if (ispunct(codepoint))
return 1;
// Check for Unicode punctuation exceptions (punctuation allowed in hashtags)
if (codepoint == 0x301C || codepoint == 0xFF5E) // Japanese Wave Dash / Tilde
return 0;
// Check for Unicode punctuation
// NOTE: We may need to adjust the codepoint ranges in the future,
// to include/exclude certain types of Unicode characters in hashtags.
// Unicode Blocks Reference: https://www.compart.com/en/unicode/block
return (
// Latin-1 Supplement No-Break Space (NBSP): U+00A0
(codepoint == 0x00A0) ||
// Latin-1 Supplement Punctuation: U+00A1 to U+00BF
(codepoint >= 0x00A1 && codepoint <= 0x00BF) ||
// General Punctuation: U+2000 to U+206F
(codepoint >= 0x2000 && codepoint <= 0x206F) ||
// Currency Symbols: U+20A0 to U+20CF
(codepoint >= 0x20A0 && codepoint <= 0x20CF) ||
// Supplemental Punctuation: U+2E00 to U+2E7F
(codepoint >= 0x2E00 && codepoint <= 0x2E7F) ||
// CJK Symbols and Punctuation: U+3000 to U+303F
(codepoint >= 0x3000 && codepoint <= 0x303F) ||
// Ideographic Description Characters: U+2FF0 to U+2FFF
(codepoint >= 0x2FF0 && codepoint <= 0x2FFF)
);
}
static inline int is_right_boundary(int c) {
return is_whitespace(c) || is_punctuation(c);
}
static inline int is_left_boundary(char c) {
return is_right_boundary(c) || is_utf8_byte(c);
}
static inline int is_alphanumeric(char c) {
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
}
static inline int consume_until_boundary(struct cursor *cur) {
unsigned int c;
unsigned int char_length = 1;
unsigned int *utf8_char_length = &char_length;
while (cur->p < cur->end) {
c = *cur->p;
*utf8_char_length = 1;
if (is_whitespace(c))
return 1;
// Need to check for UTF-8 characters, which can be multiple bytes long
if (is_utf8_byte(c)) {
if (!parse_utf8_char(cur, &c, utf8_char_length)) {
if (!is_right_boundary(c)){
// TODO: We should work towards handling all UTF-8 characters.
printf("Invalid UTF-8 code point: %x\n", c);
}
}
}
if (is_right_boundary(c))
return 1;
// Need to use a variable character byte length for UTF-8 (2-4 bytes)
if (cur->p + *utf8_char_length <= cur->end)
cur->p += *utf8_char_length;
else
cur->p++;
}
return 1;
}
static inline int consume_until_whitespace(struct cursor *cur, int or_end) {
char c;
int consumedAtLeastOne = 0;
while (cur->p < cur->end) {
c = *cur->p;
if (is_whitespace(c))
return consumedAtLeastOne;
cur->p++;
consumedAtLeastOne = 1;
}
return or_end;
}
static inline int consume_until_non_alphanumeric(struct cursor *cur, int or_end) {
char c;
int consumedAtLeastOne = 0;
while (cur->p < cur->end) {
c = *cur->p;
if (!is_alphanumeric(c))
return consumedAtLeastOne;
cur->p++;
consumedAtLeastOne = 1;
}
return or_end;
}
#endif
#endif /* cursor_h */

View File

@@ -5,9 +5,3 @@
#include "damus.h"
#include "bolt11.h"
#include "amount.h"
#include "nostr_bech32.h"
#include "wasm.h"
#include "nostrscript.h"
#include "nostrdb.h"
#include "lmdb.h"

View File

@@ -12,25 +12,9 @@
#include <stdlib.h>
#include <string.h>
static int parse_digit(struct cursor *cur, int *digit) {
int c;
if ((c = peek_char(cur, 0)) == -1)
return 0;
c -= '0';
if (c >= 0 && c <= 9) {
*digit = c;
cur->p++;
return 1;
}
return 0;
}
static int parse_mention_index(struct cursor *cur, struct note_block *block) {
static int parse_mention_index(struct cursor *cur, struct block *block) {
int d1, d2, d3, ind;
u8 *start = cur->p;
const u8 *start = cur->p;
if (!parse_str(cur, "#["))
return 0;
@@ -59,9 +43,9 @@ static int parse_mention_index(struct cursor *cur, struct note_block *block) {
return 1;
}
static int parse_hashtag(struct cursor *cur, struct note_block *block) {
static int parse_hashtag(struct cursor *cur, struct block *block) {
int c;
u8 *start = cur->p;
const u8 *start = cur->p;
if (!parse_char(cur, '#'))
return 0;
@@ -81,7 +65,7 @@ static int parse_hashtag(struct cursor *cur, struct note_block *block) {
return 1;
}
static int add_block(struct note_blocks *blocks, struct note_block block)
static int add_block(struct blocks *blocks, struct block block)
{
if (blocks->num_blocks + 1 >= MAX_BLOCKS)
return 0;
@@ -90,9 +74,9 @@ static int add_block(struct note_blocks *blocks, struct note_block block)
return 1;
}
static int add_text_block(struct note_blocks *blocks, const u8 *start, const u8 *end)
static int add_text_block(struct blocks *blocks, const u8 *start, const u8 *end)
{
struct note_block b;
struct block b;
if (start == end)
return 1;
@@ -104,71 +88,8 @@ static int add_text_block(struct note_blocks *blocks, const u8 *start, const u8
return add_block(blocks, b);
}
static int consume_url_fragment(struct cursor *cur)
{
int c;
if ((c = peek_char(cur, 0)) < 0)
return 1;
if (c != '#' && c != '?') {
return 1;
}
cur->p++;
return consume_until_whitespace(cur, 1);
}
static int consume_url_path(struct cursor *cur)
{
int c;
if ((c = peek_char(cur, 0)) < 0)
return 1;
if (c != '/') {
return 1;
}
while (cur->p < cur->end) {
c = *cur->p;
if (c == '?' || c == '#' || is_whitespace(c)) {
return 1;
}
cur->p++;
}
return 1;
}
static int consume_url_host(struct cursor *cur)
{
char c;
int count = 0;
while (cur->p < cur->end) {
c = *cur->p;
// TODO: handle IDNs
if (is_alphanumeric(c) || c == '.' || c == '-')
{
count++;
cur->p++;
continue;
}
return count != 0;
}
// this means the end of the URL hostname is the end of the buffer and we finished
return count != 0;
}
static int parse_url(struct cursor *cur, struct note_block *block) {
u8 *start = cur->p;
static int parse_url(struct cursor *cur, struct block *block) {
const u8 *start = cur->p;
if (!parse_str(cur, "http"))
return 0;
@@ -184,25 +105,15 @@ static int parse_url(struct cursor *cur, struct note_block *block) {
return 0;
}
}
if (!(consume_url_host(cur) &&
consume_url_path(cur) &&
consume_url_fragment(cur)))
{
if (!consume_until_whitespace(cur, 1)) {
cur->p = start;
return 0;
}
// smart parens
if (start - 1 >= 0 &&
start < cur->end &&
*(start - 1) == '(' &&
(cur->p - 1) < cur->end &&
*(cur->p - 1) == ')')
{
cur->p--;
}
// strip any unwanted characters
while(is_invalid_url_ending(peek_char(cur, -1))) cur->p--;
block->type = BLOCK_URL;
block->block.str.start = (const char *)start;
block->block.str.end = (const char *)cur->p;
@@ -210,8 +121,8 @@ static int parse_url(struct cursor *cur, struct note_block *block) {
return 1;
}
static int parse_invoice(struct cursor *cur, struct note_block *block) {
u8 *start, *end;
static int parse_invoice(struct cursor *cur, struct block *block) {
const u8 *start, *end;
char *fail;
struct bolt11 *bolt11;
// optional
@@ -250,12 +161,12 @@ static int parse_invoice(struct cursor *cur, struct note_block *block) {
}
static int parse_mention_bech32(struct cursor *cur, struct note_block *block) {
u8 *start = cur->p;
static int parse_mention_bech32(struct cursor *cur, struct block *block) {
const u8 *start = cur->p;
if (!parse_str(cur, "nostr:"))
return 0;
parse_char(cur, '@');
parse_str(cur, "nostr:");
block->block.str.start = (const char *)cur->p;
if (!parse_nostr_bech32(cur, &block->block.mention_bech32.bech32)) {
@@ -270,7 +181,7 @@ static int parse_mention_bech32(struct cursor *cur, struct note_block *block) {
return 1;
}
static int add_text_then_block(struct cursor *cur, struct note_blocks *blocks, struct note_block block, u8 **start, const u8 *pre_mention)
static int add_text_then_block(struct cursor *cur, struct blocks *blocks, struct block block, const u8 **start, const u8 *pre_mention)
{
if (!add_text_block(blocks, *start, pre_mention))
return 0;
@@ -283,28 +194,22 @@ static int add_text_then_block(struct cursor *cur, struct note_blocks *blocks, s
return 1;
}
int damus_parse_content(struct note_blocks *blocks, const char *content) {
int damus_parse_content(struct blocks *blocks, const char *content) {
int cp, c;
struct cursor cur;
struct note_block block;
u8 *start, *pre_mention;
struct block block;
const u8 *start, *pre_mention;
blocks->words = 0;
blocks->num_blocks = 0;
make_cursor((u8*)content, (u8*)content + strlen(content), &cur);
make_cursor(&cur, (const u8*)content, strlen(content));
start = cur.p;
while (cur.p < cur.end && blocks->num_blocks < MAX_BLOCKS) {
cp = peek_char(&cur, -1);
c = peek_char(&cur, 0);
// new word
if (is_whitespace(cp) && !is_whitespace(c)) {
blocks->words++;
}
pre_mention = cur.p;
if (cp == -1 || is_left_boundary(cp) || c == '#') {
if (cp == -1 || is_whitespace(cp)) {
if (c == '#' && (parse_mention_index(&cur, &block) || parse_hashtag(&cur, &block))) {
if (!add_text_then_block(&cur, blocks, block, &start, pre_mention))
return 0;
@@ -317,7 +222,7 @@ int damus_parse_content(struct note_blocks *blocks, const char *content) {
if (!add_text_then_block(&cur, blocks, block, &start, pre_mention))
return 0;
continue;
} else if ((c == 'n' || c == '@') && parse_mention_bech32(&cur, &block)) {
} else if (c == 'n' && parse_mention_bech32(&cur, &block)) {
if (!add_text_then_block(&cur, blocks, block, &start, pre_mention))
return 0;
continue;
@@ -335,12 +240,12 @@ int damus_parse_content(struct note_blocks *blocks, const char *content) {
return 1;
}
void blocks_init(struct note_blocks *blocks) {
blocks->blocks = malloc(sizeof(struct note_block) * MAX_BLOCKS);
void blocks_init(struct blocks *blocks) {
blocks->blocks = malloc(sizeof(struct block) * MAX_BLOCKS);
blocks->num_blocks = 0;
}
void blocks_free(struct note_blocks *blocks) {
void blocks_free(struct blocks *blocks) {
if (!blocks->blocks) {
return;
}

View File

@@ -9,10 +9,10 @@
#define damus_h
#include <stdio.h>
#include "nostr_bech32.h"
#include "block.h"
typedef unsigned char u8;
int damus_parse_content(struct note_blocks *blocks, const char *content);
int damus_parse_content(struct blocks *blocks, const char *content);
#endif /* damus_h */

View File

@@ -1,15 +0,0 @@
#ifndef PROTOVERSE_DEBUG_H
#define PROTOVERSE_DEBUG_H
#include <stdio.h>
#define unusual(...) fprintf(stderr, "UNUSUAL: " __VA_ARGS__)
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__)
#else
#define debug(...)
#endif
#endif /* PROTOVERSE_DEBUG_H */

View File

@@ -1,34 +0,0 @@
#include "error.h"
#include <stdlib.h>
#include <stdarg.h>
int note_error_(struct errors *errs_, struct cursor *p, const char *fmt, ...)
{
static char buf[512];
struct error err;
struct cursor *errs;
va_list ap;
errs = &errs_->cur;
if (errs_->enabled == 0)
return 0;
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
err.msg = buf;
err.pos = p ? (int)(p->p - p->start) : 0;
if (!cursor_push_error(errs, &err)) {
fprintf(stderr, "arena OOM when recording error, ");
fprintf(stderr, "errs->p at %ld, remaining %ld, strlen %ld\n",
errs->p - errs->start, errs->end - errs->p, strlen(buf));
}
return 0;
}

View File

@@ -1,33 +0,0 @@
#ifndef PROTOVERSE_ERROR_H
#define PROTOVERSE_ERROR_H
#include "cursor.h"
struct error {
int pos;
const char *msg;
};
struct errors {
struct cursor cur;
int enabled;
};
#define note_error(errs, p, fmt, ...) note_error_(errs, p, "%s: " fmt, __FUNCTION__, ##__VA_ARGS__)
static inline int cursor_push_error(struct cursor *cur, struct error *err)
{
return cursor_push_int(cur, err->pos) &&
cursor_push_c_str(cur, err->msg);
}
static inline int cursor_pull_error(struct cursor *cur, struct error *err)
{
return cursor_pull_int(cur, &err->pos) &&
cursor_pull_c_str(cur, &err->msg);
}
int note_error_(struct errors *errs, struct cursor *p, const char *fmt, ...);
#endif /* PROTOVERSE_ERROR_H */

View File

@@ -39,6 +39,15 @@ bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize)
return slen == 0 && bufsize == 0;
}
static char hexchar(unsigned int val)
{
if (val < 10)
return '0' + val;
if (val < 16)
return 'a' + val - 10;
abort();
}
bool hex_encode(const void *buf, size_t bufsize, char *dest, size_t destsize)
{
size_t i;

View File

@@ -26,7 +26,7 @@ bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize);
/**
* hex_encode - Create a nul-terminated hex string
* @buf: the buffer to read the data from
* @bufsize: the length of buf
* @bufsize: the length of @buf
* @dest: the string to fill
* @destsize: the max size of the string
*
@@ -70,15 +70,4 @@ static inline size_t hex_data_size(size_t strlen)
{
return strlen / 2;
}
static inline char hexchar(unsigned int val)
{
if (val < 10)
return '0' + val;
if (val < 16)
return 'a' + val - 10;
abort();
}
#endif /* CCAN_HEX_H */

View File

@@ -52,13 +52,9 @@
*/
#define unlikely(cond) __builtin_expect(!!(cond), 0)
#else
#ifndef likely
#define likely(cond) (!!(cond))
#endif
#ifndef unlikely
#define unlikely(cond) (!!(cond))
#endif
#endif
#else /* CCAN_LIKELY_DEBUG versions */
#include <ccan/str/str.h>

View File

@@ -91,9 +91,6 @@ static int parse_nostr_bech32_type(const char *prefix, enum nostr_bech32_type *t
} else if (strcmp(prefix, "npub") == 0) {
*type = NOSTR_BECH32_NPUB;
return 1;
} else if (strcmp(prefix, "nsec") == 0) {
*type = NOSTR_BECH32_NSEC;
return 1;
} else if (strcmp(prefix, "nprofile") == 0) {
*type = NOSTR_BECH32_NPROFILE;
return 1;
@@ -119,10 +116,6 @@ static int parse_nostr_bech32_npub(struct cursor *cur, struct bech32_npub *npub)
return pull_bytes(cur, 32, &npub->pubkey);
}
static int parse_nostr_bech32_nsec(struct cursor *cur, struct bech32_nsec *nsec) {
return pull_bytes(cur, 32, &nsec->nsec);
}
static int tlvs_to_relays(struct nostr_tlvs *tlvs, struct relays *relays) {
struct nostr_tlv *tlv;
struct str_block *str;
@@ -225,11 +218,11 @@ static int parse_nostr_bech32_nrelay(struct cursor *cur, struct bech32_nrelay *n
}
int parse_nostr_bech32(struct cursor *cur, struct nostr_bech32 *obj) {
u8 *start, *end;
const u8 *start, *end;
start = cur->p;
if (!consume_until_non_alphanumeric(cur, 1)) {
if (!consume_until_non_bech32_character(cur, 1)) {
cur->p = start;
return 0;
}
@@ -264,7 +257,7 @@ int parse_nostr_bech32(struct cursor *cur, struct nostr_bech32 *obj) {
}
struct cursor bcur;
make_cursor(obj->buffer, obj->buffer + obj->buflen, &bcur);
make_cursor(&bcur, obj->buffer, obj->buflen);
switch (obj->type) {
case NOSTR_BECH32_NOTE:
@@ -275,10 +268,6 @@ int parse_nostr_bech32(struct cursor *cur, struct nostr_bech32 *obj) {
if (!parse_nostr_bech32_npub(&bcur, &obj->data.npub))
goto fail;
break;
case NOSTR_BECH32_NSEC:
if (!parse_nostr_bech32_nsec(&bcur, &obj->data.nsec))
goto fail;
break;
case NOSTR_BECH32_NEVENT:
if (!parse_nostr_bech32_nevent(&bcur, &obj->data.nevent))
goto fail;

View File

@@ -26,7 +26,6 @@ enum nostr_bech32_type {
NOSTR_BECH32_NEVENT = 4,
NOSTR_BECH32_NRELAY = 5,
NOSTR_BECH32_NADDR = 6,
NOSTR_BECH32_NSEC = 7,
};
struct bech32_note {
@@ -37,10 +36,6 @@ struct bech32_npub {
const u8 *pubkey;
};
struct bech32_nsec {
const u8 *nsec;
};
struct bech32_nevent {
struct relays relays;
const u8 *event_id;
@@ -70,7 +65,6 @@ typedef struct nostr_bech32 {
union {
struct bech32_note note;
struct bech32_npub npub;
struct bech32_nsec nsec;
struct bech32_nevent nevent;
struct bech32_nprofile nprofile;
struct bech32_naddr naddr;

View File

@@ -1,42 +0,0 @@
#ifndef CURSOR_PARSER
#define CURSOR_PARSER
#include "cursor.h"
static int consume_bytes(struct cursor *cursor, const unsigned char *match, int len)
{
int i;
if (cursor->p + len > cursor->end) {
fprintf(stderr, "consume_bytes overflow\n");
return 0;
}
for (i = 0; i < len; i++) {
if (cursor->p[i] != match[i])
return 0;
}
cursor->p += len;
return 1;
}
static inline int consume_byte(struct cursor *cursor, unsigned char match)
{
if (unlikely(cursor->p >= cursor->end))
return 0;
if (*cursor->p != match)
return 0;
cursor->p++;
return 1;
}
static inline int consume_u32(struct cursor *cursor, unsigned int match)
{
return consume_bytes(cursor, (unsigned char*)&match, sizeof(match));
}
#endif /* CURSOR_PARSER */

View File

@@ -1,14 +0,0 @@
#ifndef PROTOVERSE_TYPEDEFS_H
#define PROTOVERSE_TYPEDEFS_H
#include <stdint.h>
typedef unsigned char u8;
typedef unsigned int u32;
typedef unsigned short u16;
typedef uint64_t u64;
typedef int64_t s64;
#endif /* PROTOVERSE_TYPEDEFS_H */

View File

@@ -1,14 +0,0 @@
#ifndef PROTOVERSE_VARINT_H
#define PROTOVERSE_VARINT_H
#define VARINT_MAX_LEN 9
#include <stddef.h>
#include <stdint.h>
size_t varint_put(unsigned char buf[VARINT_MAX_LEN], uint64_t v);
size_t varint_size(uint64_t v);
size_t varint_get(const unsigned char *p, size_t max, int64_t *val);
#endif /* PROTOVERSE_VARINT_H */

File diff suppressed because it is too large Load Diff

View File

@@ -1,850 +0,0 @@
#ifndef PROTOVERSE_WASM_H
#define PROTOVERSE_WASM_H
static const unsigned char WASM_MAGIC[] = {0,'a','s','m'};
#define WASM_VERSION 0x01
#define MAX_U32_LEB128_BYTES 5
#define MAX_U64_LEB128_BYTES 10
#define MAX_CUSTOM_SECTIONS 32
#define MAX_BUILTINS 64
#define BUILTIN_SUSPEND 42
#define FUNC_TYPE_TAG 0x60
#include "cursor.h"
#include "error.h"
#ifdef NOINLINE
#define INLINE __attribute__((noinline))
#else
#define INLINE inline
#endif
#define interp_error(p, fmt, ...) note_error(&((p)->errors), interp_codeptr(p), fmt, ##__VA_ARGS__)
#define parse_err(p, fmt, ...) note_error(&((p)->errs), &(p)->cur, fmt, ##__VA_ARGS__)
enum valtype {
val_i32 = 0x7F,
val_i64 = 0x7E,
val_f32 = 0x7D,
val_f64 = 0x7C,
val_ref_null = 0xD0,
val_ref_func = 0x70,
val_ref_extern = 0x6F,
};
enum const_instr {
ci_const_i32 = 0x41,
ci_const_i64 = 0x42,
ci_const_f32 = 0x43,
ci_const_f64 = 0x44,
ci_ref_null = 0xD0,
ci_ref_func = 0xD2,
ci_global_get = 0x23,
ci_end = 0x0B,
};
enum limit_type {
limit_min = 0x00,
limit_min_max = 0x01,
};
struct limits {
u32 min;
u32 max;
enum limit_type type;
};
enum section_tag {
section_custom,
section_type,
section_import,
section_function,
section_table,
section_memory,
section_global,
section_export,
section_start,
section_element,
section_code,
section_data,
section_data_count,
section_name,
num_sections,
};
enum name_subsection_tag {
name_subsection_module,
name_subsection_funcs,
name_subsection_locals,
num_name_subsections,
};
enum reftype {
funcref = 0x70,
externref = 0x6F,
};
struct resulttype {
unsigned char *valtypes; /* enum valtype */
u32 num_valtypes;
};
struct functype {
struct resulttype params;
struct resulttype result;
};
struct table {
enum reftype reftype;
struct limits limits;
};
struct tablesec {
struct table *tables;
u32 num_tables;
};
enum elem_mode {
elem_mode_passive,
elem_mode_active,
elem_mode_declarative,
};
struct expr {
u8 *code;
u32 code_len;
};
struct refval {
u32 addr;
};
struct table_inst {
struct refval *refs;
enum reftype reftype;
u32 num_refs;
};
struct numval {
union {
int i32;
u32 u32;
int64_t i64;
uint64_t u64;
float f32;
double f64;
};
};
struct val {
enum valtype type;
union {
struct numval num;
struct refval ref;
};
};
struct elem_inst {
struct val val;
u16 elem;
u16 init;
};
struct elem {
struct expr offset;
u32 tableidx;
struct expr *inits;
u32 num_inits;
enum elem_mode mode;
enum reftype reftype;
struct val val;
};
struct customsec {
const char *name;
unsigned char *data;
u32 data_len;
};
struct elemsec {
struct elem *elements;
u32 num_elements;
};
struct memsec {
struct limits *mems; /* memtype */
u32 num_mems;
};
struct funcsec {
u32 *type_indices;
u32 num_indices;
};
enum mut {
mut_const,
mut_var,
};
struct globaltype {
enum valtype valtype;
enum mut mut;
};
struct globalsec {
struct global *globals;
u32 num_globals;
};
struct typesec {
struct functype *functypes;
u32 num_functypes;
};
enum import_type {
import_func,
import_table,
import_mem,
import_global,
};
struct importdesc {
enum import_type type;
union {
u32 typeidx;
struct limits tabletype;
struct limits memtype;
struct globaltype globaltype;
};
};
struct import {
const char *module_name;
const char *name;
struct importdesc desc;
int resolved_builtin;
};
struct importsec {
struct import *imports;
u32 num_imports;
};
struct global {
struct globaltype type;
struct expr init;
struct val val;
};
struct local_def {
u32 num_types;
enum valtype type;
};
/* "code" */
struct wasm_func {
struct expr code;
struct local_def *local_defs;
u32 num_local_defs;
};
enum func_type {
func_type_wasm,
func_type_builtin,
};
struct func {
union {
struct wasm_func *wasm_func;
struct builtin *builtin;
};
u32 num_locals;
struct functype *functype;
enum func_type type;
const char *name;
u32 idx;
};
struct codesec {
struct wasm_func *funcs;
u32 num_funcs;
};
enum exportdesc {
export_func,
export_table,
export_mem,
export_global,
};
struct wexport {
const char *name;
u32 index;
enum exportdesc desc;
};
struct exportsec {
struct wexport *exports;
u32 num_exports;
};
struct nameassoc {
u32 index;
const char *name;
};
struct namemap {
struct nameassoc *names;
u32 num_names;
};
struct namesec {
const char *module_name;
struct namemap func_names;
int parsed;
};
struct wsection {
enum section_tag tag;
};
enum bulk_tag {
i_memory_copy = 10,
i_memory_fill = 11,
i_table_init = 12,
i_elem_drop = 13,
i_table_copy = 14,
i_table_grow = 15,
i_table_size = 16,
i_table_fill = 17,
};
enum instr_tag {
/* control instructions */
i_unreachable = 0x00,
i_nop = 0x01,
i_block = 0x02,
i_loop = 0x03,
i_if = 0x04,
i_else = 0x05,
i_end = 0x0B,
i_br = 0x0C,
i_br_if = 0x0D,
i_br_table = 0x0E,
i_return = 0x0F,
i_call = 0x10,
i_call_indirect = 0x11,
/* parametric instructions */
i_drop = 0x1A,
i_select = 0x1B,
i_selects = 0x1C,
/* variable instructions */
i_local_get = 0x20,
i_local_set = 0x21,
i_local_tee = 0x22,
i_global_get = 0x23,
i_global_set = 0x24,
i_table_get = 0x25,
i_table_set = 0x26,
/* memory instructions */
i_i32_load = 0x28,
i_i64_load = 0x29,
i_f32_load = 0x2A,
i_f64_load = 0x2B,
i_i32_load8_s = 0x2C,
i_i32_load8_u = 0x2D,
i_i32_load16_s = 0x2E,
i_i32_load16_u = 0x2F,
i_i64_load8_s = 0x30,
i_i64_load8_u = 0x31,
i_i64_load16_s = 0x32,
i_i64_load16_u = 0x33,
i_i64_load32_s = 0x34,
i_i64_load32_u = 0x35,
i_i32_store = 0x36,
i_i64_store = 0x37,
i_f32_store = 0x38,
i_f64_store = 0x39,
i_i32_store8 = 0x3A,
i_i32_store16 = 0x3B,
i_i64_store8 = 0x3C,
i_i64_store16 = 0x3D,
i_i64_store32 = 0x3E,
i_memory_size = 0x3F,
i_memory_grow = 0x40,
/* numeric instructions */
i_i32_const = 0x41,
i_i64_const = 0x42,
i_f32_const = 0x43,
i_f64_const = 0x44,
i_i32_eqz = 0x45,
i_i32_eq = 0x46,
i_i32_ne = 0x47,
i_i32_lt_s = 0x48,
i_i32_lt_u = 0x49,
i_i32_gt_s = 0x4A,
i_i32_gt_u = 0x4B,
i_i32_le_s = 0x4C,
i_i32_le_u = 0x4D,
i_i32_ge_s = 0x4E,
i_i32_ge_u = 0x4F,
i_i64_eqz = 0x50,
i_i64_eq = 0x51,
i_i64_ne = 0x52,
i_i64_lt_s = 0x53,
i_i64_lt_u = 0x54,
i_i64_gt_s = 0x55,
i_i64_gt_u = 0x56,
i_i64_le_s = 0x57,
i_i64_le_u = 0x58,
i_i64_ge_s = 0x59,
i_i64_ge_u = 0x5A,
i_f32_eq = 0x5B,
i_f32_ne = 0x5C,
i_f32_lt = 0x5D,
i_f32_gt = 0x5E,
i_f32_le = 0x5F,
i_f32_ge = 0x60,
i_f64_eq = 0x61,
i_f64_ne = 0x62,
i_f64_lt = 0x63,
i_f64_gt = 0x64,
i_f64_le = 0x65,
i_f64_ge = 0x66,
i_i32_clz = 0x67,
i_i32_ctz = 0x68,
i_i32_popcnt = 0x69,
i_i32_add = 0x6A,
i_i32_sub = 0x6B,
i_i32_mul = 0x6C,
i_i32_div_s = 0x6D,
i_i32_div_u = 0x6E,
i_i32_rem_s = 0x6F,
i_i32_rem_u = 0x70,
i_i32_and = 0x71,
i_i32_or = 0x72,
i_i32_xor = 0x73,
i_i32_shl = 0x74,
i_i32_shr_s = 0x75,
i_i32_shr_u = 0x76,
i_i32_rotl = 0x77,
i_i32_rotr = 0x78,
i_i64_clz = 0x79,
i_i64_ctz = 0x7A,
i_i64_popcnt = 0x7B,
i_i64_add = 0x7C,
i_i64_sub = 0x7D,
i_i64_mul = 0x7E,
i_i64_div_s = 0x7F,
i_i64_div_u = 0x80,
i_i64_rem_s = 0x81,
i_i64_rem_u = 0x82,
i_i64_and = 0x83,
i_i64_or = 0x84,
i_i64_xor = 0x85,
i_i64_shl = 0x86,
i_i64_shr_s = 0x87,
i_i64_shr_u = 0x88,
i_i64_rotl = 0x89,
i_i64_rotr = 0x8A,
i_f32_abs = 0x8b,
i_f32_neg = 0x8c,
i_f32_ceil = 0x8d,
i_f32_floor = 0x8e,
i_f32_trunc = 0x8f,
i_f32_nearest = 0x90,
i_f32_sqrt = 0x91,
i_f32_add = 0x92,
i_f32_sub = 0x93,
i_f32_mul = 0x94,
i_f32_div = 0x95,
i_f32_min = 0x96,
i_f32_max = 0x97,
i_f32_copysign = 0x98,
i_f64_abs = 0x99,
i_f64_neg = 0x9a,
i_f64_ceil = 0x9b,
i_f64_floor = 0x9c,
i_f64_trunc = 0x9d,
i_f64_nearest = 0x9e,
i_f64_sqrt = 0x9f,
i_f64_add = 0xa0,
i_f64_sub = 0xa1,
i_f64_mul = 0xa2,
i_f64_div = 0xa3,
i_f64_min = 0xa4,
i_f64_max = 0xa5,
i_f64_copysign = 0xa6,
i_i32_wrap_i64 = 0xa7,
i_i32_trunc_f32_s = 0xa8,
i_i32_trunc_f32_u = 0xa9,
i_i32_trunc_f64_s = 0xaa,
i_i32_trunc_f64_u = 0xab,
i_i64_extend_i32_s = 0xac,
i_i64_extend_i32_u = 0xad,
i_i64_trunc_f32_s = 0xae,
i_i64_trunc_f32_u = 0xaf,
i_i64_trunc_f64_s = 0xb0,
i_i64_trunc_f64_u = 0xb1,
i_f32_convert_i32_s = 0xb2,
i_f32_convert_i32_u = 0xb3,
i_f32_convert_i64_s = 0xb4,
i_f32_convert_i64_u = 0xb5,
i_f32_demote_f64 = 0xb6,
i_f64_convert_i32_s = 0xb7,
i_f64_convert_i32_u = 0xb8,
i_f64_convert_i64_s = 0xb9,
i_f64_convert_i64_u = 0xba,
i_f64_promote_f32 = 0xbb,
i_i32_reinterpret_f32 = 0xbc,
i_i64_reinterpret_f64 = 0xbd,
i_f32_reinterpret_i32 = 0xbe,
i_f64_reinterpret_i64 = 0xbf,
i_i32_extend8_s = 0xc0,
i_i32_extend16_s = 0xc1,
i_i64_extend8_s = 0xc2,
i_i64_extend16_s = 0xc3,
i_i64_extend32_s = 0xc4,
i_ref_null = 0xD0,
i_ref_is_null = 0xD1,
i_ref_func = 0xD2,
i_bulk_op = 0xFC,
/* TODO: more instrs */
};
enum blocktype_tag {
blocktype_empty,
blocktype_valtype,
blocktype_index,
};
struct blocktype {
enum blocktype_tag tag;
union {
enum valtype valtype;
int type_index;
};
};
struct instrs {
unsigned char *data;
u32 len;
};
struct block {
struct blocktype type;
struct expr instrs;
};
struct memarg {
u32 offset;
u32 align;
};
struct br_table {
u32 num_label_indices;
u32 label_indices[512];
u32 default_label;
};
struct call_indirect {
u32 tableidx;
u32 typeidx;
};
struct table_init {
u32 tableidx;
u32 elemidx;
};
struct table_copy {
u32 from;
u32 to;
};
struct bulk_op {
enum bulk_tag tag;
union {
struct table_init table_init;
struct table_copy table_copy;
u32 idx;
};
};
struct select_instr {
u8 *valtypes;
u32 num_valtypes;
};
struct instr {
enum instr_tag tag;
int pos;
union {
struct br_table br_table;
struct bulk_op bulk_op;
struct call_indirect call_indirect;
struct memarg memarg;
struct select_instr select;
struct block block;
struct expr else_block;
double f64;
float f32;
int i32;
u32 u32;
int64_t i64;
u64 u64;
unsigned char memidx;
enum reftype reftype;
};
};
enum datamode {
datamode_active,
datamode_passive,
};
struct wdata_active {
u32 mem_index;
struct expr offset_expr;
};
struct wdata {
struct wdata_active active;
u8 *bytes;
u32 bytes_len;
enum datamode mode;
};
struct datasec {
struct wdata *datas;
u32 num_datas;
};
struct startsec {
u32 start_fn;
};
struct module {
unsigned int parsed;
unsigned int custom_sections;
struct func *funcs;
u32 num_funcs;
struct customsec custom_section[MAX_CUSTOM_SECTIONS];
struct typesec type_section;
struct funcsec func_section;
struct importsec import_section;
struct exportsec export_section;
struct codesec code_section;
struct tablesec table_section;
struct memsec memory_section;
struct globalsec global_section;
struct startsec start_section;
struct elemsec element_section;
struct datasec data_section;
struct namesec name_section;
};
// make sure the struct is packed so that
struct label {
u32 instr_pos; // resolved status is stored in HOB of pos
u32 jump;
};
struct callframe {
struct cursor code;
struct val *locals;
struct func *func;
u16 prev_stack_items;
};
struct resolver {
u16 label;
u8 end_tag;
u8 start_tag;
};
struct global_inst {
struct val val;
};
struct module_inst {
struct table_inst *tables;
struct global_inst *globals;
struct elem_inst *elements;
u32 num_tables;
u32 num_globals;
u32 num_elements;
int start_fn;
unsigned char *globals_init;
};
struct wasi {
int argc;
const char **argv;
int environc;
const char **environ;
};
struct wasm_interp;
struct builtin {
const char *name;
int (*fn)(struct wasm_interp *);
int (*prepare_args)(struct wasm_interp *);
};
struct wasm_interp {
struct module *module;
struct module_inst module_inst;
struct wasi wasi;
void *context;
struct builtin builtins[MAX_BUILTINS];
int num_builtins;
int prev_resolvers, quitting;
struct errors errors; /* struct error */
size_t ops;
struct cursor callframes; /* struct callframe */
struct cursor stack; /* struct val */
struct cursor mem; /* u8/mixed */
struct cursor memory; /* memory pages (65536 blocks) */
struct cursor locals; /* struct val */
struct cursor labels; /* struct labels */
struct cursor num_labels;
// resolve stack for the current function. every time a control
// instruction is encountered, the label index is pushed. When an
// instruction is popped, we can resolve the label
struct cursor resolver_stack; /* struct resolver */
struct cursor resolver_offsets; /* int */
};
struct wasm_parser {
struct module module;
struct builtin *builtins;
u32 num_builtins;
struct cursor cur;
struct cursor mem;
struct errors errs;
};
int run_wasm(unsigned char *wasm, unsigned long len, int argc, const char **argv, char **env, int *retval);
int parse_wasm(struct wasm_parser *p);
int wasm_interp_init(struct wasm_interp *interp, struct module *module);
void wasm_parser_free(struct wasm_parser *parser);
void wasm_parser_init(struct wasm_parser *p, u8 *wasm, size_t wasm_len, size_t arena_size, struct builtin *, int num_builtins);
void wasm_interp_free(struct wasm_interp *interp);
int interp_wasm_module(struct wasm_interp *interp, int *retval);
int interp_wasm_module_resume(struct wasm_interp *interp, int *retval);
void print_error_backtrace(struct errors *errors);
void setup_wasi(struct wasm_interp *interp, int argc, const char **argv, char **env);
void print_callstack(struct wasm_interp *interp);
// builtin helpers
int get_params(struct wasm_interp *interp, struct val** vals, u32 num_vals);
int get_var_params(struct wasm_interp *interp, struct val** vals, u32 *num_vals);
u8 *interp_mem_ptr(struct wasm_interp *interp, u32 ptr, int size);
static INLINE struct callframe *top_callframe(struct cursor *cur)
{
return (struct callframe*)cursor_top(cur, sizeof(struct callframe));
}
static INLINE struct cursor *interp_codeptr(struct wasm_interp *interp)
{
struct callframe *frame;
if (unlikely(!(frame = top_callframe(&interp->callframes))))
return 0;
return &frame->code;
}
static INLINE int mem_ptr_str(struct wasm_interp *interp, u32 ptr,
const char **str)
{
// still technically unsafe if the string runs over the end of memory...
if (!(*str = (const char*)interp_mem_ptr(interp, ptr, 1))) {
return interp_error(interp, "int memptr");
}
return 1;
}
static INLINE int mem_ptr_i32(struct wasm_interp *interp, u32 ptr, int **i)
{
if (!(*i = (int*)interp_mem_ptr(interp, ptr, sizeof(int))))
return interp_error(interp, "int memptr");
return 1;
}
static INLINE int cursor_pushval(struct cursor *cur, struct val *val)
{
return cursor_push(cur, (u8*)val, sizeof(*val));
}
static INLINE int cursor_push_i32(struct cursor *stack, int i)
{
struct val val;
val.type = val_i32;
val.num.i32 = i;
return cursor_pushval(stack, &val);
}
static INLINE int stack_push_i32(struct wasm_interp *interp, int i)
{
return cursor_push_i32(&interp->stack, i);
}
static INLINE struct callframe *top_callframes(struct cursor *cur, int top)
{
return (struct callframe*)cursor_topn(cur, sizeof(struct callframe), top);
}
static INLINE int was_section_parsed(struct module *module,
enum section_tag section)
{
if (section == section_custom)
return module->custom_sections > 0;
return module->parsed & (1 << section);
}
#endif /* PROTOVERSE_WASM_H */

File diff suppressed because it is too large Load Diff

View File

@@ -1,14 +1,5 @@
{
"pins" : [
{
"identity" : "gsplayer",
"kind" : "remoteSourceControl",
"location" : "https://github.com/wxxsw/GSPlayer",
"state" : {
"revision" : "aa6dad7943d52f5207f7fcc2ad3e4274583443b8",
"version" : "0.2.26"
}
},
{
"identity" : "kingfisher",
"kind" : "remoteSourceControl",
@@ -27,11 +18,21 @@
}
},
{
"identity" : "swift-markdown-ui",
"identity" : "starscream",
"kind" : "remoteSourceControl",
"location" : "https://github.com/damus-io/swift-markdown-ui",
"location" : "https://github.com/daltoniam/Starscream",
"state" : {
"revision" : "76bb7971da7fbf429de1c84f1244adf657242fee"
"revision" : "df8d82047f6654d8e4b655d1b1525c64e1059d21",
"version" : "4.0.4"
}
},
{
"identity" : "vault",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SparrowTek/Vault",
"state" : {
"revision" : "87db56c3c8b6421c65b0745f73e08b0dc56f79d4",
"version" : "1.0.3"
}
}
],

View File

@@ -1,98 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
BuildableName = "damus.app"
BlueprintName = "damus"
ReferencedContainer = "container:damus.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4CE6DEF227F7A08200C66700"
BuildableName = "damusTests.xctest"
BlueprintName = "damusTests"
ReferencedContainer = "container:damus.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4CE6DEFC27F7A08200C66700"
BuildableName = "damusUITests.xctest"
BlueprintName = "damusUITests"
ReferencedContainer = "container:damus.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
BuildableName = "damus.app"
BlueprintName = "damus"
ReferencedContainer = "container:damus.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
BuildableName = "damus.app"
BlueprintName = "damus"
ReferencedContainer = "container:damus.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
LastUpgradeVersion = "1420"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -26,8 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xE3",
"green" : "0xD7",
"red" : "0xF7"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x20",
"green" : "0x13",
"red" : "0x61"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x63",
"green" : "0x11",
"red" : "0xF5"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x6E",
"green" : "0x20",
"red" : "0xF8"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xEE",
"green" : "0xE8",
"red" : "0xF7"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x35",
"green" : "0x04",
"red" : "0x8B"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x3D",
"green" : "0x07",
"red" : "0x9C"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x44",
"green" : "0x06",
"red" : "0xB2"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2D",
"green" : "0x05",
"red" : "0x75"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xD8",
"green" : "0xC2",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFA",
"green" : "0xFA",
"red" : "0xF9"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x24",
"green" : "0x22",
"red" : "0x20"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xE3",
"green" : "0xE1",
"red" : "0xDD"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2A",
"green" : "0x26",
"red" : "0x23"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x59",
"green" : "0x53",
"red" : "0x4A"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x85",
"green" : "0x7A",
"red" : "0x6A"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xE4",
"green" : "0xF1",
"red" : "0xD6"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x38",
"green" : "0x5C",
"red" : "0x12"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x5A",
"green" : "0xAB",
"red" : "0x04"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x64",
"green" : "0xBF",
"red" : "0x03"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF0",
"green" : "0xF7",
"red" : "0xE8"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1F",
"green" : "0x33",
"red" : "0x0A"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x34",
"green" : "0x64",
"red" : "0x02"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x3F",
"green" : "0x79",
"red" : "0x02"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1F",
"green" : "0x3C",
"red" : "0x01"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xE4",
"green" : "0xFF",
"red" : "0xAD"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xD1",
"green" : "0xEE",
"red" : "0xFE"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x12",
"green" : "0x43",
"red" : "0x5C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1C",
"green" : "0xAD",
"red" : "0xF9"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2C",
"green" : "0xB5",
"red" : "0xFC"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xE1",
"green" : "0xF4",
"red" : "0xFE"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x0A",
"green" : "0x25",
"red" : "0x33"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x06",
"green" : "0x85",
"red" : "0xC6"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x03",
"green" : "0x93",
"red" : "0xDD"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x04",
"green" : "0x6A",
"red" : "0x9F"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xCC",
"green" : "0xF5",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,23 +0,0 @@
{
"images": [
{
"filename": "alby.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "alby.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "alby.svg"
}
],
"info": {
"author": "xcode",
"version": 1
}
}

View File

@@ -1,11 +0,0 @@
<svg width="49" height="48" viewBox="0 0 49 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="3.59995" cy="3.59995" r="3.59995" transform="matrix(-1 0 0 1 13.832 9.96094)" fill="black"/>
<path d="M9.63215 13.0205L16.3521 19.7404" stroke="black" stroke-width="1.79997"/>
<circle cx="39.6317" cy="13.5609" r="3.59995" fill="black"/>
<path d="M40.2917 13.0205L33.5718 19.7404" stroke="black" stroke-width="1.79997"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.2538 35.0429C9.31357 34.1193 8.18436 32.045 8.56261 29.9297C10.1861 20.8506 16.9519 14.041 25.0517 14.041C33.1712 14.041 39.9502 20.8836 41.5526 29.9957C41.9253 32.1149 40.7869 34.1881 38.84 35.1043C34.6741 37.0648 30.0209 38.1606 25.1117 38.1606C20.1516 38.1606 15.4528 37.0419 11.2538 35.0429Z" fill="#FFDF6F"/>
<path d="M41.5526 29.9957L42.439 29.8398L41.5526 29.9957ZM38.84 35.1043L38.4568 34.29L38.84 35.1043ZM9.44855 30.0881C11.0173 21.3153 17.5017 14.941 25.0517 14.941V13.141C16.402 13.141 9.35492 20.3859 7.67668 29.7713L9.44855 30.0881ZM25.0517 14.941C32.62 14.941 39.1178 21.3464 40.6662 30.1516L42.439 29.8398C40.7826 20.4209 33.7225 13.141 25.0517 13.141V14.941ZM38.4568 34.29C34.4082 36.1952 29.8856 37.2607 25.1117 37.2607V39.0606C30.1561 39.0606 34.9399 37.9343 39.2232 35.9187L38.4568 34.29ZM25.1117 37.2607C20.2883 37.2607 15.7213 36.173 11.6407 34.2303L10.867 35.8556C15.1842 37.9108 20.015 39.0606 25.1117 39.0606V37.2607ZM40.6662 30.1516C40.965 31.8506 40.0553 33.5378 38.4568 34.29L39.2232 35.9187C41.5185 34.8385 42.8855 32.3791 42.439 29.8398L40.6662 30.1516ZM7.67668 29.7713C7.22342 32.306 8.57956 34.7666 10.867 35.8556L11.6407 34.2303C10.0476 33.4719 9.14529 31.784 9.44855 30.0881L7.67668 29.7713Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.7154 32.7862C13.1536 32.1501 12.2272 30.4884 12.7684 28.8913C14.4373 23.9658 19.3057 20.4014 25.0515 20.4014C30.7973 20.4014 35.6657 23.9658 37.3346 28.8913C37.8758 30.4884 36.9494 32.1501 35.3876 32.7862C32.1977 34.0853 28.7082 34.8012 25.0515 34.8012C21.3948 34.8012 17.9053 34.0853 14.7154 32.7862Z" fill="black"/>
<ellipse cx="29.1918" cy="28.0806" rx="2.99995" ry="2.39996" fill="white"/>
<ellipse cx="20.6037" cy="28.0816" rx="2.99995" ry="2.39996" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,28 +0,0 @@
<svg width="430" height="813" viewBox="0 0 430 813" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_f_1069_29012)">
<path d="M44.0811 256.851L186.315 111L276.203 223.574L244.02 388.295L69.9751 697.084L100.678 498.338L44.0811 256.851Z" fill="url(#paint0_linear_1069_29012)"/>
</g>
<g filter="url(#filter1_f_1069_29012)">
<path d="M116.509 587.348L206.677 479.401L230.746 273.265L266.666 231.183L367.424 396.975L281.292 659.008L266.665 801.413L66.889 763.694L116.509 587.348Z" fill="url(#paint1_linear_1069_29012)"/>
</g>
<defs>
<filter id="filter0_f_1069_29012" x="-66.6248" y="0.294121" width="453.534" height="807.496" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="55.3529" result="effect1_foregroundBlur_1069_29012"/>
</filter>
<filter id="filter1_f_1069_29012" x="-43.8172" y="120.477" width="521.947" height="791.642" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="55.3529" result="effect1_foregroundBlur_1069_29012"/>
</filter>
<linearGradient id="paint0_linear_1069_29012" x1="230.179" y1="166.577" x2="-67.7956" y2="310.108" gradientUnits="userSpaceOnUse">
<stop stop-color="#D34CD9"/>
<stop offset="1" stop-color="#4E4DF4"/>
</linearGradient>
<linearGradient id="paint1_linear_1069_29012" x1="139.483" y1="462.902" x2="377.854" y2="565.47" gradientUnits="userSpaceOnUse">
<stop stop-color="#0DE8FF"/>
<stop offset="1" stop-color="#641AAE"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,12 +0,0 @@
{
"images" : [
{
"filename" : "gradient.jpg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -1,6 +0,0 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "Fundrise.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "Fundrise.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "Fundrise.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.3111 8.87301C12.8205 9.2228 12.2201 9.42856 11.5716 9.42856C9.91471 9.42856 8.57157 8.08541 8.57157 6.42856C8.57157 4.7717 9.91471 3.42856 11.5716 3.42856C12.6456 3.42856 13.5877 3.99292 14.1177 4.84125M6.85728 18.9319H9.09467C9.38639 18.9319 9.67632 18.9666 9.95912 19.0359L12.3232 19.6105C12.8361 19.7354 13.3705 19.7475 13.8889 19.6469L16.5027 19.1384C17.1931 19.0039 17.8284 18.6732 18.3261 18.189L20.1755 16.39C20.7036 15.8772 20.7036 15.0449 20.1755 14.5312C19.7 14.0686 18.947 14.0166 18.4091 14.4088L16.2538 15.9813C15.9451 16.2069 15.5695 16.3284 15.1833 16.3284H13.102H14.4268C15.1735 16.3284 15.7783 15.74 15.7783 15.0136V14.7506C15.7783 14.1476 15.3564 13.6217 14.7551 13.4759L12.7104 12.9786C12.3776 12.8979 12.0368 12.8571 11.6942 12.8571C10.8673 12.8571 9.37033 13.5418 9.37033 13.5418L6.85728 14.5928M18.8573 7.2857C18.8573 8.94256 17.5141 10.2857 15.8573 10.2857C14.2004 10.2857 12.8573 8.94256 12.8573 7.2857C12.8573 5.62884 14.2004 4.2857 15.8573 4.2857C17.5141 4.2857 18.8573 5.62884 18.8573 7.2857ZM3.42871 14.2286V19.2C3.42871 19.6801 3.42871 19.9201 3.52213 20.1034C3.60431 20.2647 3.73544 20.3958 3.89672 20.478C4.08007 20.5714 4.3201 20.5714 4.80014 20.5714H5.48585C5.9659 20.5714 6.20592 20.5714 6.38927 20.478C6.55055 20.3958 6.68168 20.2647 6.76386 20.1034C6.85728 19.9201 6.85728 19.6801 6.85728 19.2V14.2286C6.85728 13.7485 6.85728 13.5085 6.76386 13.3251C6.68168 13.1638 6.55055 13.0328 6.38927 12.9506C6.20592 12.8571 5.9659 12.8571 5.48585 12.8571H4.80014C4.3201 12.8571 4.08007 12.8571 3.89672 12.9506C3.73544 13.0328 3.60431 13.1638 3.52213 13.3251C3.42871 13.5085 3.42871 13.7485 3.42871 14.2286Z" stroke="black" stroke-width="1.71429" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "GIF.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "GIF.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "GIF.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.14272 5.99999H18.857C19.3304 5.99999 19.7141 6.38375 19.7141 6.85713V17.1428C19.7141 17.6162 19.3304 18 18.857 18H5.14272C4.66933 18 4.28557 17.6162 4.28557 17.1428V6.85714C4.28557 6.38375 4.66933 5.99999 5.14272 5.99999ZM2.57129 6.85714C2.57129 5.43698 3.72256 4.28571 5.14272 4.28571H18.857C20.2772 4.28571 21.4284 5.43697 21.4284 6.85713V17.1428C21.4284 18.563 20.2772 19.7143 18.857 19.7143H5.14272C3.72256 19.7143 2.57129 18.563 2.57129 17.1428V6.85714ZM9.22631 11.2305C9.2052 11.1445 9.17192 11.069 9.12647 11.0041C9.08102 10.9375 9.0242 10.8815 8.95602 10.8361C8.88946 10.789 8.81153 10.7541 8.72225 10.7313C8.63459 10.707 8.538 10.6948 8.43248 10.6948C8.2052 10.6948 8.01121 10.7492 7.8505 10.858C7.69141 10.9667 7.56965 11.1234 7.48524 11.3279C7.40244 11.5325 7.36105 11.7792 7.36105 12.0682C7.36105 12.3604 7.40082 12.6104 7.48037 12.8182C7.55991 13.026 7.67842 13.1851 7.83589 13.2955C7.99335 13.4059 8.18897 13.4611 8.42274 13.4611C8.62891 13.4611 8.80017 13.431 8.93653 13.371C9.07452 13.3109 9.17761 13.2257 9.24579 13.1153C9.31024 13.0109 9.34423 12.8892 9.34775 12.75H8.44222V11.7857H10.6533V12.4773C10.6533 12.9318 10.5567 13.3206 10.3635 13.6437C10.1719 13.9651 9.90731 14.2119 9.56965 14.3839C9.23361 14.5544 8.84806 14.6396 8.413 14.6396C7.92761 14.6396 7.50147 14.5365 7.13459 14.3304C6.7677 14.1242 6.48118 13.8304 6.27501 13.4489C6.07046 13.0674 5.96819 12.6137 5.96819 12.0877C5.96819 11.6753 6.03069 11.3101 6.15569 10.9919C6.28231 10.6737 6.45764 10.4051 6.68166 10.1859C6.90569 9.96512 7.16462 9.79872 7.45845 9.68671C7.75228 9.57307 8.06722 9.51625 8.40326 9.51625C8.69871 9.51625 8.97306 9.55846 9.22631 9.64288C9.48118 9.72567 9.70602 9.84417 9.90082 9.99839C10.0972 10.151 10.2555 10.332 10.3757 10.5414C10.4958 10.7508 10.5688 10.9805 10.5948 11.2305H9.22631ZM13.3242 9.58443V14.5714H11.9703V9.58443H13.3242ZM14.6515 9.58443V14.5714H16.0054V12.6234H17.9437V11.5325H16.0054V10.6753H18.158V9.58443H14.6515Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "Key.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "Key.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "Key.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.5001 8.99999C17.3285 8.99999 18.0001 8.32841 18.0001 7.49997C18.0001 6.67154 17.3285 5.99996 16.5001 5.99996C15.6717 5.99996 15.0001 6.67154 15.0001 7.49997C15.0001 8.32841 15.6717 8.99999 16.5001 8.99999Z" fill="black"/>
<path d="M11.2501 18.0001V17.2501H12.7501C13.1643 17.2501 13.5001 16.9143 13.5001 16.5V15H15.0001C18.3138 15 21.0001 12.3137 21.0001 8.99999C21.0001 5.68625 18.3138 2.99994 15.0001 2.99994C11.6864 2.99994 9.00005 5.68625 9.00005 8.99999C9.00005 9.58815 9.0849 10.1576 9.24333 10.6961L3.43934 16.5C3.15804 16.7814 3 17.1629 3 17.5607V19.5001C3 20.3285 3.67158 21.0001 4.50001 21.0001H7.50004C8.32847 21.0001 9.00005 20.3285 9.00005 19.5001V18.7501H10.5001C10.9143 18.7501 11.2501 18.4143 11.2501 18.0001ZM10.5001 8.99999C10.5001 6.51469 12.5148 4.49995 15.0001 4.49995C17.4854 4.49995 19.5001 6.51469 19.5001 8.99999C19.5001 11.4853 17.4854 13.5 15.0001 13.5H12.7501C12.3359 13.5 12.0001 13.8358 12.0001 14.25V15.75H10.5001C10.0858 15.75 9.75005 16.0858 9.75005 16.5V17.2501H8.25004C7.83582 17.2501 7.50004 17.5858 7.50004 18.0001V19.5001H4.50001V17.5607L10.6335 11.4272C10.8436 11.2171 10.9099 10.9028 10.8025 10.6258C10.6074 10.1225 10.5001 9.57468 10.5001 8.99999Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "NFC.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "NFC.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "NFC.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,5 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.28787 16.8167C9.51778 17.0243 9.85483 17.0578 10.1227 16.9038C11.8035 15.9306 12.9285 14.0712 12.9285 11.9998C12.9285 9.9284 11.8057 8.06904 10.1227 7.09583C9.78117 6.89941 9.34367 7.01548 9.14725 7.35699C8.95082 7.69851 9.06689 8.136 9.4084 8.33243C10.6539 9.0534 11.4999 10.4462 11.4999 11.9998C11.4999 13.3703 10.8414 14.6158 9.83028 15.3859L6.26335 12.1828C5.96871 11.9194 5.51782 11.944 5.25443 12.2364C4.99104 12.5288 5.01559 12.9819 5.308 13.2453L9.28787 16.8167ZM5.14059 7.18289C4.91068 6.9753 4.57363 6.94182 4.30578 7.09583C2.62276 8.06904 1.5 9.9284 1.5 11.9998C1.5 14.0712 2.62276 15.9306 4.30578 16.9038C4.64729 17.1002 5.08479 16.9841 5.28121 16.6426C5.47764 16.3011 5.36157 15.8636 5.02005 15.6672C3.77453 14.9462 2.92856 13.5556 2.92856 11.9998C2.92856 10.6293 3.58703 9.38376 4.59818 8.61368L8.16511 11.8168C8.45975 12.0802 8.91064 12.0556 9.17403 11.7632C9.43742 11.4708 9.41287 11.0177 9.12046 10.7543L5.14059 7.18289Z" fill="black"/>
<path d="M18.6611 3.29748C19.0684 2.87729 19.7029 2.9049 20.0765 3.36339C23.9746 8.12351 23.9746 15.8766 20.0761 20.6367C19.8785 20.8784 19.6085 21 19.3386 21C19.0968 21 18.8508 20.9016 18.6611 20.703C18.2543 20.2825 18.2275 19.5705 18.6018 19.1135C21.8136 15.1901 21.8136 8.80995 18.6018 4.887C18.2275 4.42997 18.2543 3.7179 18.6611 3.29748Z" fill="black"/>
<path d="M15.2492 8.57679C14.8839 8.10992 14.9251 7.3993 15.3405 6.98915C15.7574 6.61884 16.3869 6.66571 16.7538 7.09007C18.8521 9.77599 18.8521 14.1424 16.7538 16.8259C16.5562 17.0794 16.2792 17.2083 16.0008 17.2083C15.7661 17.2083 15.5309 17.0738 15.3405 16.9285C14.9251 16.5183 14.884 15.8081 15.2492 15.3408C16.7071 13.4752 16.7071 10.4415 15.2492 8.57679Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "activity.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "activity.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "activity.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 11.9999H5.26711C5.70339 11.9999 6.08932 11.717 6.2207 11.301L8.7616 3.2548C8.83517 3.02184 9.16483 3.02184 9.2384 3.2548L14.7616 20.745C14.8352 20.9779 15.1648 20.9779 15.2384 20.745L17.7793 12.6987C17.9107 12.2827 18.2966 11.9999 18.7329 11.9999H22" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 447 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "add-bookmark.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "add-bookmark.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "add-bookmark.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 7C13 6.44772 12.5523 6 12 6C11.4477 6 11 6.44772 11 7H13ZM11 13C11 13.5523 11.4477 14 12 14C12.5523 14 13 13.5523 13 13H11ZM15 11C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9L15 11ZM9 9C8.44772 9 8 9.44771 8 10C8 10.5523 8.44772 11 9 11L9 9ZM16.47 20.1929L15.8888 21.0066L15.8888 21.0066L16.47 20.1929ZM12.93 17.6643L13.5112 16.8505L13.5112 16.8505L12.93 17.6643ZM11.07 17.6643L10.4888 16.8505L10.4888 16.8505L11.07 17.6643ZM7.52998 20.1929L6.94874 19.3791L6.94874 19.3791L7.52998 20.1929ZM12.2456 17.2595L12.4911 16.2901L12.4911 16.2901L12.2456 17.2595ZM11.7544 17.2595L11.5089 16.2901L11.5089 16.2901L11.7544 17.2595ZM5.20836 20.6678L6 20.0568L6 20.0568L5.20836 20.6678ZM5.96294 21.0561L5.92589 22.0554L5.92589 22.0554L5.96294 21.0561ZM18.7916 20.6678L18 20.0568L18 20.0568L18.7916 20.6678ZM18.0371 21.0561L18.0741 22.0554L18.0741 22.0554L18.0371 21.0561ZM18.891 3.54601L18 4L18 4L18.891 3.54601ZM18.454 3.10899L18.908 2.21799L18.908 2.21799L18.454 3.10899ZM5.10899 3.54601L4.21799 3.09202L4.21799 3.09202L5.10899 3.54601ZM5.54601 3.10899L5.09202 2.21799L5.09202 2.21799L5.54601 3.10899ZM11 7V13H13V7H11ZM15 9L9 9L9 11L15 11L15 9ZM18 4.6V18.8909H20V4.6H18ZM6 18.8909V4.6H4V18.8909H6ZM6.6 4H17.4V2H6.6V4ZM17.0513 19.3791L13.5112 16.8505L12.3487 18.478L15.8888 21.0066L17.0513 19.3791ZM10.4888 16.8505L6.94874 19.3791L8.11122 21.0066L11.6513 18.478L10.4888 16.8505ZM13.5112 16.8505C13.2454 16.6606 12.9003 16.3938 12.4911 16.2901L12 18.2289C11.956 18.2178 11.9466 18.2043 12.0065 18.2412C12.0771 18.2846 12.1705 18.3507 12.3487 18.478L13.5112 16.8505ZM11.6513 18.478C11.8295 18.3507 11.9229 18.2846 11.9935 18.2412C12.0534 18.2043 12.044 18.2178 12 18.2289L11.5089 16.2901C11.0997 16.3938 10.7546 16.6606 10.4888 16.8505L11.6513 18.478ZM12.4911 16.2901C12.1688 16.2085 11.8312 16.2085 11.5089 16.2901L12 18.2289H12L12.4911 16.2901ZM4 18.8909C4 19.3733 3.999 19.8046 4.0302 20.1459C4.06022 20.4742 4.1313 20.909 4.41673 21.2788L6 20.0568C6.07706 20.1567 6.04397 20.2053 6.02189 19.9638C6.001 19.7353 6 19.4131 6 18.8909H4ZM6.94874 19.3791C6.52379 19.6827 6.26104 19.8691 6.06296 19.9849C5.85365 20.1073 5.87396 20.0521 6 20.0568L5.92589 22.0554C6.39272 22.0727 6.7878 21.8779 7.07244 21.7115C7.3683 21.5385 7.71867 21.287 8.11122 21.0066L6.94874 19.3791ZM4.41673 21.2788C4.77954 21.7489 5.33249 22.0334 5.92589 22.0554L6 20.0568L6 20.0568L4.41673 21.2788ZM18 18.8909C18 19.4131 17.999 19.7353 17.9781 19.9638C17.956 20.2053 17.9229 20.1567 18 20.0568L19.5833 21.2788C19.8687 20.909 19.9398 20.4742 19.9698 20.1459C20.001 19.8046 20 19.3733 20 18.8909H18ZM15.8888 21.0066C16.2813 21.287 16.6317 21.5385 16.9276 21.7115C17.2122 21.8779 17.6073 22.0727 18.0741 22.0554L18 20.0568C18.126 20.0521 18.1463 20.1073 17.937 19.9849C17.739 19.8691 17.4762 19.6827 17.0513 19.3791L15.8888 21.0066ZM18 20.0568L18 20.0568L18.0741 22.0554C18.6675 22.0334 19.2205 21.7489 19.5833 21.2788L18 20.0568ZM20 4.6C20 4.33647 20.0008 4.07869 19.9831 3.86177C19.9644 3.63318 19.9203 3.36344 19.782 3.09202L18 4C17.9707 3.94249 17.9811 3.91972 17.9897 4.02463C17.9992 4.14122 18 4.30347 18 4.6H20ZM17.4 4C17.6965 4 17.8588 4.00078 17.9754 4.0103C18.0803 4.01887 18.0575 4.0293 18 4L18.908 2.21799C18.6366 2.07969 18.3668 2.03562 18.1382 2.01695C17.9213 1.99922 17.6635 2 17.4 2V4ZM19.782 3.09202C19.5903 2.71569 19.2843 2.40973 18.908 2.21799L18 4L18 4L19.782 3.09202ZM6 4.6C6 4.30347 6.00078 4.14122 6.0103 4.02463C6.01887 3.91972 6.0293 3.94249 6 4L4.21799 3.09202C4.07969 3.36344 4.03562 3.63318 4.01695 3.86177C3.99922 4.07869 4 4.33648 4 4.6H6ZM6.6 2C6.33647 2 6.07869 1.99922 5.86177 2.01695C5.63318 2.03562 5.36344 2.07969 5.09202 2.21799L6 4C5.94249 4.0293 5.91972 4.01887 6.02463 4.0103C6.14122 4.00078 6.30347 4 6.6 4V2ZM6 4L6 4L5.09202 2.21799C4.71569 2.40973 4.40973 2.71569 4.21799 3.09202L6 4Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "add-reaction.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "add-reaction.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "add-reaction.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,5 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.4986 9.5C10.4986 10.3284 9.939 11 9.24864 11C8.55828 11 7.99864 10.3284 7.99864 9.5C7.99864 8.67157 8.55828 8 9.24864 8C9.939 8 10.4986 8.67157 10.4986 9.5Z" fill="black"/>
<path d="M15.9986 9.5C15.9986 10.3284 15.439 11 14.7486 11C14.0583 11 13.4986 10.3284 13.4986 9.5C13.4986 8.67157 14.0583 8 14.7486 8C15.439 8 15.9986 8.67157 15.9986 9.5Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.9986 1C19.5509 1 19.9986 1.44772 19.9986 2V4H21.9986C22.5509 4 22.9986 4.44772 22.9986 5C22.9986 5.55228 22.5509 6 21.9986 6H19.9986V8C19.9986 8.55228 19.5509 9 18.9986 9C18.4464 9 17.9986 8.55228 17.9986 8V6H15.9986C15.4464 6 14.9986 5.55228 14.9986 5C14.9986 4.44772 15.4464 4 15.9986 4H17.9986V2C17.9986 1.44772 18.4464 1 18.9986 1ZM11.9926 2.94507C12.0533 3.494 11.6576 3.98826 11.1087 4.04902C7.11036 4.49161 4 7.88325 4 12C3.99999 16.4183 7.5817 20 12 20C16.1171 20 19.509 16.889 19.9511 12.8901C20.0118 12.3412 20.506 11.9454 21.0549 12.0061C21.6039 12.0667 21.9997 12.5609 21.939 13.1099C21.3862 18.1109 17.1479 22 12 22C6.47714 22 1.99998 17.5228 2 12C2 6.85256 5.88834 2.61466 10.8886 2.06116C11.4375 2.0004 11.9318 2.39614 11.9926 2.94507ZM8.46341 14.1213C8.85393 13.7308 9.4871 13.7308 9.87762 14.1213C11.0492 15.2929 12.9487 15.2929 14.1203 14.1213C14.5108 13.7308 15.1439 13.7308 15.5345 14.1213C15.925 14.5118 15.925 15.145 15.5345 15.5355C13.5818 17.4882 10.416 17.4882 8.46341 15.5355C8.07288 15.145 8.07288 14.5118 8.46341 14.1213Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "added-bookmark.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "added-bookmark.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "added-bookmark.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.47 20.1929L15.8888 21.0066L15.8888 21.0066L16.47 20.1929ZM12.93 17.6643L13.5112 16.8505L13.5112 16.8505L12.93 17.6643ZM11.07 17.6643L10.4888 16.8505L10.4888 16.8505L11.07 17.6643ZM7.52998 20.1929L6.94874 19.3791L6.94874 19.3791L7.52998 20.1929ZM12.2456 17.2595L12.4911 16.2901L12.4911 16.2901L12.2456 17.2595ZM11.7544 17.2595L11.5089 16.2901L11.5089 16.2901L11.7544 17.2595ZM5.20836 20.6678L6 20.0568L6 20.0568L5.20836 20.6678ZM5.96294 21.0561L5.92589 22.0554L5.92589 22.0554L5.96294 21.0561ZM18.7916 20.6678L18 20.0568L18 20.0568L18.7916 20.6678ZM18.0371 21.0561L18.0741 22.0554L18.0741 22.0554L18.0371 21.0561ZM18.891 3.54601L18 4L18 4L18.891 3.54601ZM18.454 3.10899L18.908 2.21799L18.908 2.21799L18.454 3.10899ZM5.10899 3.54601L4.21799 3.09202L4.21799 3.09202L5.10899 3.54601ZM5.54601 3.10899L5.09202 2.21799L5.09202 2.21799L5.54601 3.10899ZM10.2071 9.54289C9.81658 9.15237 9.18342 9.15237 8.79289 9.54289C8.40237 9.93342 8.40237 10.5666 8.79289 10.9571L10.2071 9.54289ZM11 11.75L10.2929 12.4571C10.6834 12.8476 11.3166 12.8476 11.7071 12.4571L11 11.75ZM15.2071 8.95711C15.5976 8.56658 15.5976 7.93342 15.2071 7.54289C14.8166 7.15237 14.1834 7.15237 13.7929 7.54289L15.2071 8.95711ZM18 4.6V18.8909H20V4.6H18ZM6 18.8909V4.6H4V18.8909H6ZM6.6 4H17.4V2H6.6V4ZM17.0513 19.3791L13.5112 16.8505L12.3487 18.478L15.8888 21.0066L17.0513 19.3791ZM10.4888 16.8505L6.94874 19.3791L8.11122 21.0066L11.6513 18.478L10.4888 16.8505ZM13.5112 16.8505C13.2454 16.6606 12.9003 16.3938 12.4911 16.2901L12 18.2289C11.956 18.2178 11.9466 18.2043 12.0065 18.2412C12.0771 18.2846 12.1705 18.3507 12.3487 18.478L13.5112 16.8505ZM11.6513 18.478C11.8295 18.3507 11.9229 18.2846 11.9935 18.2412C12.0534 18.2043 12.044 18.2178 12 18.2289L11.5089 16.2901C11.0997 16.3938 10.7546 16.6606 10.4888 16.8505L11.6513 18.478ZM12.4911 16.2901C12.1688 16.2085 11.8312 16.2085 11.5089 16.2901L12 18.2289H12L12.4911 16.2901ZM4 18.8909C4 19.3733 3.999 19.8046 4.0302 20.1459C4.06022 20.4742 4.1313 20.909 4.41673 21.2788L6 20.0568C6.07706 20.1567 6.04397 20.2053 6.02189 19.9638C6.001 19.7353 6 19.4131 6 18.8909H4ZM6.94874 19.3791C6.52379 19.6827 6.26104 19.8691 6.06296 19.9849C5.85365 20.1073 5.87396 20.0521 6 20.0568L5.92589 22.0554C6.39272 22.0727 6.7878 21.8779 7.07244 21.7115C7.3683 21.5385 7.71867 21.287 8.11122 21.0066L6.94874 19.3791ZM4.41673 21.2788C4.77954 21.7489 5.33249 22.0334 5.92589 22.0554L6 20.0568L6 20.0568L4.41673 21.2788ZM18 18.8909C18 19.4131 17.999 19.7353 17.9781 19.9638C17.956 20.2053 17.9229 20.1567 18 20.0568L19.5833 21.2788C19.8687 20.909 19.9398 20.4742 19.9698 20.1459C20.001 19.8046 20 19.3733 20 18.8909H18ZM15.8888 21.0066C16.2813 21.287 16.6317 21.5385 16.9276 21.7115C17.2122 21.8779 17.6073 22.0727 18.0741 22.0554L18 20.0568C18.126 20.0521 18.1463 20.1073 17.937 19.9849C17.739 19.8691 17.4762 19.6827 17.0513 19.3791L15.8888 21.0066ZM18 20.0568L18 20.0568L18.0741 22.0554C18.6675 22.0334 19.2205 21.7489 19.5833 21.2788L18 20.0568ZM20 4.6C20 4.33647 20.0008 4.07869 19.9831 3.86177C19.9644 3.63318 19.9203 3.36344 19.782 3.09202L18 4C17.9707 3.94249 17.9811 3.91972 17.9897 4.02463C17.9992 4.14122 18 4.30347 18 4.6H20ZM17.4 4C17.6965 4 17.8588 4.00078 17.9754 4.0103C18.0803 4.01887 18.0575 4.0293 18 4L18.908 2.21799C18.6366 2.07969 18.3668 2.03562 18.1382 2.01695C17.9213 1.99922 17.6635 2 17.4 2V4ZM19.782 3.09202C19.5903 2.71569 19.2843 2.40973 18.908 2.21799L18 4L18 4L19.782 3.09202ZM6 4.6C6 4.30347 6.00078 4.14122 6.0103 4.02463C6.01887 3.91972 6.0293 3.94249 6 4L4.21799 3.09202C4.07969 3.36344 4.03562 3.63318 4.01695 3.86177C3.99922 4.07869 4 4.33648 4 4.6H6ZM6.6 2C6.33647 2 6.07869 1.99922 5.86177 2.01695C5.63318 2.03562 5.36344 2.07969 5.09202 2.21799L6 4C5.94249 4.0293 5.91972 4.01887 6.02463 4.0103C6.14122 4.00078 6.30347 4 6.6 4V2ZM6 4L6 4L5.09202 2.21799C4.71569 2.40973 4.40973 2.71569 4.21799 3.09202L6 4ZM8.79289 10.9571L10.2929 12.4571L11.7071 11.0429L10.2071 9.54289L8.79289 10.9571ZM11.7071 12.4571L15.2071 8.95711L13.7929 7.54289L10.2929 11.0429L11.7071 12.4571Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-2-stars.fill.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-2-stars.fill.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-2-stars.fill.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 8C16 7.44772 15.5523 7 15 7C14.4477 7 14 7.44772 14 8C14 10.3085 13.4892 11.7424 12.6158 12.6158C11.7424 13.4892 10.3085 14 8 14C7.44772 14 7 14.4477 7 15C7 15.5523 7.44772 16 8 16C10.3085 16 11.7424 16.5108 12.6158 17.3842C13.4892 18.2576 14 19.6915 14 22C14 22.5523 14.4477 23 15 23C15.5523 23 16 22.5523 16 22C16 19.6915 16.5108 18.2576 17.3842 17.3842C18.2576 16.5108 19.6915 16 22 16C22.5523 16 23 15.5523 23 15C23 14.4477 22.5523 14 22 14C19.6915 14 18.2576 13.4892 17.3842 12.6158C16.5108 11.7424 16 10.3085 16 8Z" fill="black"/>
<path d="M7.5 2C7.5 1.44772 7.05228 1 6.5 1C5.94772 1 5.5 1.44772 5.5 2C5.5 3.44043 5.18016 4.24938 4.71477 4.71477C4.24938 5.18016 3.44043 5.5 2 5.5C1.44772 5.5 1 5.94772 1 6.5C1 7.05228 1.44772 7.5 2 7.5C3.44043 7.5 4.24938 7.81984 4.71477 8.28523C5.18016 8.75062 5.5 9.55957 5.5 11C5.5 11.5523 5.94772 12 6.5 12C7.05228 12 7.5 11.5523 7.5 11C7.5 9.55957 7.81984 8.75062 8.28523 8.28523C8.75062 7.81984 9.55957 7.5 11 7.5C11.5523 7.5 12 7.05228 12 6.5C12 5.94772 11.5523 5.5 11 5.5C9.55957 5.5 8.75062 5.18016 8.28523 4.71477C7.81984 4.24938 7.5 3.44043 7.5 2Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-2-stars.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-2-stars.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-2-stars.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M22 15C17.1389 15 15 17.1389 15 22C15 17.1389 12.8611 15 8 15C12.8611 15 15 12.8611 15 8C15 12.8611 17.1389 15 22 15Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 6.5C7.875 6.5 6.5 7.875 6.5 11C6.5 7.875 5.125 6.5 2 6.5C5.125 6.5 6.5 5.125 6.5 2C6.5 5.125 7.875 6.5 11 6.5Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 552 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-3-stars.fill.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-3-stars.fill.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-3-stars.fill.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,5 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14 8C14 7.44772 13.5523 7 13 7C12.4477 7 12 7.44772 12 8C12 10.3085 11.4892 11.7424 10.6158 12.6158C9.74243 13.4892 8.30848 14 6 14C5.44772 14 5 14.4477 5 15C5 15.5523 5.44772 16 6 16C8.30848 16 9.74243 16.5108 10.6158 17.3842C11.4892 18.2576 12 19.6915 12 22C12 22.5523 12.4477 23 13 23C13.5523 23 14 22.5523 14 22C14 19.6915 14.5108 18.2576 15.3842 17.3842C16.2576 16.5108 17.6915 16 20 16C20.5523 16 21 15.5523 21 15C21 14.4477 20.5523 14 20 14C17.6915 14 16.2576 13.4892 15.3842 12.6158C14.5108 11.7424 14 10.3085 14 8Z" fill="black"/>
<path d="M6 5.5C6 5.22386 5.77614 5 5.5 5C5.22386 5 5 5.22386 5 5.5C5 6.48063 4.78279 7.0726 4.4277 7.4277C4.0726 7.78279 3.48063 8 2.5 8C2.22386 8 2 8.22386 2 8.5C2 8.77614 2.22386 9 2.5 9C3.48063 9 4.0726 9.21721 4.4277 9.5723C4.78279 9.9274 5 10.5194 5 11.5C5 11.7761 5.22386 12 5.5 12C5.77614 12 6 11.7761 6 11.5C6 10.5194 6.21721 9.9274 6.5723 9.5723C6.9274 9.21721 7.51937 9 8.5 9C8.77614 9 9 8.77614 9 8.5C9 8.22386 8.77614 8 8.5 8C7.51937 8 6.9274 7.78279 6.5723 7.4277C6.21721 7.0726 6 6.48063 6 5.5Z" fill="black"/>
<path d="M11 1.5C11 1.22386 10.7761 1 10.5 1C10.2239 1 10 1.22386 10 1.5C10 2.13341 9.85918 2.47538 9.66728 2.66728C9.47538 2.85918 9.13341 3 8.5 3C8.22386 3 8 3.22386 8 3.5C8 3.77614 8.22386 4 8.5 4C9.13341 4 9.47538 4.14082 9.66728 4.33272C9.85918 4.52462 10 4.86659 10 5.5C10 5.77614 10.2239 6 10.5 6C10.7761 6 11 5.77614 11 5.5C11 4.86659 11.1408 4.52462 11.3327 4.33272C11.5246 4.14082 11.8666 4 12.5 4C12.7761 4 13 3.77614 13 3.5C13 3.22386 12.7761 3 12.5 3C11.8666 3 11.5246 2.85918 11.3327 2.66728C11.1408 2.47538 11 2.13341 11 1.5Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-3-stars.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-3-stars.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-3-stars.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,5 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 7C13.5523 7 14 7.44772 14 8C14 10.3085 14.5108 11.7424 15.3842 12.6158C16.2576 13.4892 17.6915 14 20 14C20.5523 14 21 14.4477 21 15C21 15.5523 20.5523 16 20 16C17.6915 16 16.2576 16.5108 15.3842 17.3842C14.5108 18.2576 14 19.6915 14 22C14 22.5523 13.5523 23 13 23C12.4477 23 12 22.5523 12 22C12 19.6915 11.4892 18.2576 10.6158 17.3842C9.74243 16.5108 8.30848 16 6 16C5.44772 16 5 15.5523 5 15C5 14.4477 5.44772 14 6 14C8.30848 14 9.74243 13.4892 10.6158 12.6158C11.4892 11.7424 12 10.3085 12 8C12 7.44772 12.4477 7 13 7ZM13 12.7334C12.7361 13.212 12.4147 13.6453 12.03 14.03C11.6453 14.4147 11.212 14.7361 10.7334 15C11.212 15.2639 11.6453 15.5853 12.03 15.97C12.4147 16.3547 12.7361 16.788 13 17.2666C13.2639 16.788 13.5853 16.3547 13.97 15.97C14.3547 15.5853 14.788 15.2639 15.2666 15C14.788 14.7361 14.3547 14.4147 13.97 14.03C13.5853 13.6453 13.2639 13.212 13 12.7334Z" fill="black"/>
<path d="M6 5.5C6 5.22386 5.77614 5 5.5 5C5.22386 5 5 5.22386 5 5.5C5 6.48063 4.78279 7.0726 4.4277 7.4277C4.0726 7.78279 3.48063 8 2.5 8C2.22386 8 2 8.22386 2 8.5C2 8.77614 2.22386 9 2.5 9C3.48063 9 4.0726 9.21721 4.4277 9.5723C4.78279 9.9274 5 10.5194 5 11.5C5 11.7761 5.22386 12 5.5 12C5.77614 12 6 11.7761 6 11.5C6 10.5194 6.21721 9.9274 6.5723 9.5723C6.9274 9.21721 7.51937 9 8.5 9C8.77614 9 9 8.77614 9 8.5C9 8.22386 8.77614 8 8.5 8C7.51937 8 6.9274 7.78279 6.5723 7.4277C6.21721 7.0726 6 6.48063 6 5.5Z" fill="black"/>
<path d="M11 1.5C11 1.22386 10.7761 1 10.5 1C10.2239 1 10 1.22386 10 1.5C10 2.13341 9.85918 2.47538 9.66728 2.66728C9.47538 2.85918 9.13341 3 8.5 3C8.22386 3 8 3.22386 8 3.5C8 3.77614 8.22386 4 8.5 4C9.13341 4 9.47538 4.14082 9.66728 4.33272C9.85918 4.52462 10 4.86659 10 5.5C10 5.77614 10.2239 6 10.5 6C10.7761 6 11 5.77614 11 5.5C11 4.86659 11.1408 4.52462 11.3327 4.33272C11.5246 4.14082 11.8666 4 12.5 4C12.7761 4 13 3.77614 13 3.5C13 3.22386 12.7761 3 12.5 3C11.8666 3 11.5246 2.85918 11.3327 2.66728C11.1408 2.47538 11 2.13341 11 1.5Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-avatar.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-avatar.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-avatar.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 5.00013C3 3.89556 3.89543 3.00013 5 3.00013H11C11.5523 3.00013 12 3.44785 12 4.00013C12 4.55241 11.5523 5.00013 11 5.00013H5V19.0001H7.10002C7.56329 16.7179 9.58104 15.0001 12 15.0001C14.419 15.0001 16.4367 16.7179 16.9 19.0001H19V13.0001C19 12.4478 19.4477 12.0001 20 12.0001C20.5523 12.0001 21 12.4478 21 13.0001V19.0001C21 20.1047 20.1046 21.0001 19 21.0001H5C3.89543 21.0001 3 20.1047 3 19.0001V5.00013ZM9.17071 19.0001H14.8293C14.4175 17.8349 13.3062 17.0001 12 17.0001C10.6938 17.0001 9.58254 17.8349 9.17071 19.0001ZM12 9.00013C11.1716 9.00013 10.5 9.6717 10.5 10.5001C10.5 11.3286 11.1716 12.0001 12 12.0001C12.8284 12.0001 13.5 11.3286 13.5 10.5001C13.5 9.6717 12.8284 9.00013 12 9.00013ZM8.5 10.5001C8.5 8.56713 10.067 7.00013 12 7.00013C13.933 7.00013 15.5 8.56713 15.5 10.5001C15.5 12.4331 13.933 14.0001 12 14.0001C10.067 14.0001 8.5 12.4331 8.5 10.5001Z" fill="black"/>
<path d="M18.9472 1.89456C18.763 1.52603 18.237 1.52603 18.0528 1.89456L17.0745 3.85106C17.0262 3.94782 16.9477 4.02628 16.8509 4.07467L14.8944 5.05292C14.5259 5.23718 14.5259 5.76308 14.8944 5.94734L16.8509 6.9256C16.9477 6.97398 17.0262 7.05244 17.0745 7.1492L18.0528 9.1057C18.237 9.47423 18.763 9.47423 18.9472 9.1057L19.9255 7.1492C19.9738 7.05244 20.0523 6.97398 20.1491 6.9256L22.1056 5.94734C22.4741 5.76308 22.4741 5.23718 22.1056 5.05292L20.1491 4.07467C20.0523 4.02628 19.9738 3.94782 19.9255 3.85106L18.9472 1.89456Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-image.fill.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-image.fill.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-image.fill.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 5C3 3.89543 3.89543 3 5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5ZM16.4142 19L9.41421 12C8.63317 11.219 7.36684 11.2189 6.58579 12L5 13.5858V5H19V19H16.4142Z" fill="black"/>
<path d="M13.5745 8.35093L14.0528 7.39443C14.237 7.0259 14.763 7.0259 14.9472 7.39443L15.4255 8.35093C15.4738 8.44769 15.5523 8.52615 15.6491 8.57454L16.6056 9.05279C16.9741 9.23705 16.9741 9.76295 16.6056 9.94721L15.6491 10.4255C15.5523 10.4738 15.4738 10.5523 15.4255 10.6491L14.9472 11.6056C14.763 11.9741 14.237 11.9741 14.0528 11.6056L13.5745 10.6491C13.5262 10.5523 13.4477 10.4738 13.3509 10.4255L12.3944 9.94721C12.0259 9.76295 12.0259 9.23705 12.3944 9.05279L13.3509 8.57454C13.4477 8.52615 13.5262 8.44769 13.5745 8.35093Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 928 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-image.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-image.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-image.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 5C3 3.89543 3.89543 3 5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5ZM19 5H5V13.5858L6.58579 12C7.36684 11.2189 8.63317 11.219 9.41421 12L16.4142 19H19V5ZM13.5858 19L8 13.4142L5 16.4142V19H13.5858Z" fill="black"/>
<path d="M13.5745 8.35093L14.0528 7.39443C14.237 7.0259 14.763 7.0259 14.9472 7.39443L15.4255 8.35093C15.4738 8.44769 15.5523 8.52615 15.6491 8.57454L16.6056 9.05279C16.9741 9.23705 16.9741 9.76295 16.6056 9.94721L15.6491 10.4255C15.5523 10.4738 15.4738 10.5523 15.4255 10.6491L14.9472 11.6056C14.763 11.9741 14.237 11.9741 14.0528 11.6056L13.5745 10.6491C13.5262 10.5523 13.4477 10.4738 13.3509 10.4255L12.3944 9.94721C12.0259 9.76295 12.0259 9.23705 12.3944 9.05279L13.3509 8.57454C13.4477 8.52615 13.5262 8.44769 13.5745 8.35093Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 965 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-star.fill.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-star.fill.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-star.fill.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 3C13 2.44772 12.5523 2 12 2C11.4477 2 11 2.44772 11 3C11 6.18838 10.331 8.25562 9.1178 9.53621C7.91616 10.8046 5.98995 11.5 3 11.5C2.44772 11.5 2 11.9477 2 12.5C2 13.0523 2.44772 13.5 3 13.5C5.98995 13.5 7.91616 14.1954 9.1178 15.4638C10.331 16.7444 11 18.8116 11 22C11 22.5523 11.4477 23 12 23C12.5523 23 13 22.5523 13 22C13 18.8116 13.669 16.7444 14.8822 15.4638C16.0838 14.1954 18.01 13.5 21 13.5C21.5523 13.5 22 13.0523 22 12.5C22 11.9477 21.5523 11.5 21 11.5C18.01 11.5 16.0838 10.8046 14.8822 9.53621C13.669 8.25562 13 6.18838 13 3Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 671 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-star.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-star.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-star.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M21 12.5C14.75 12.5 12 15.4028 12 22C12 15.4028 9.25 12.5 3 12.5C9.25 12.5 12 9.59722 12 3C12 9.59722 14.75 12.5 21 12.5Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 333 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-star2.fill.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-star2.fill.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-star2.fill.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.9578 2.71265C12.8309 2.28967 12.4416 2 12 2C11.5584 2 11.1691 2.28967 11.0422 2.71265C10.3228 5.11046 9.39036 6.82042 8.10539 8.10539C6.82042 9.39036 5.11046 10.3228 2.71265 11.0422C2.28967 11.1691 2 11.5584 2 12C2 12.4416 2.28967 12.8309 2.71265 12.9578C5.11046 13.6772 6.82042 14.6096 8.10539 15.8946C9.39036 17.1796 10.3228 18.8895 11.0422 21.2873C11.1691 21.7103 11.5584 22 12 22C12.4416 22 12.8309 21.7103 12.9578 21.2873C13.6772 18.8895 14.6096 17.1796 15.8946 15.8946C17.1796 14.6096 18.8895 13.6772 21.2873 12.9578C21.7103 12.8309 22 12.4416 22 12C22 11.5584 21.7103 11.1691 21.2873 11.0422C18.8895 10.3228 17.1796 9.39036 15.8946 8.10539C14.6096 6.82042 13.6772 5.11046 12.9578 2.71265Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 828 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-star2.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-star2.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-star2.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 12C8 10.5 10.5 8 12 3C13.5 8 16 10.5 21 12C16 13.5 13.5 16 12 21C10.5 16 8 13.5 3 12Z" stroke="black" stroke-width="2" stroke-linecap="square" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 284 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-text.fill.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-text.fill.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-text.fill.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,6 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z" fill="black"/>
<path d="M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z" fill="black"/>
<path d="M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z" fill="black"/>
<path d="M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 968 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "ai-text.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "ai-text.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "ai-text.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 18H7M4 12H9M4 6H20M17 10L18.5 13.5L22 15L18.5 16.5L17 20L15.5 16.5L12 15L15.5 13.5L17 10Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 287 B

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "airplay.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "airplay.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "airplay.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

View File

@@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.5 18C6.05228 18 6.5 17.5523 6.5 17C6.5 16.4477 6.05228 16 5.5 16V18ZM18.5 16C17.9477 16 17.5 16.4477 17.5 17C17.5 17.5523 17.9477 18 18.5 18V16ZM20.891 16.454L20 16L20 16L20.891 16.454ZM20.454 16.891L20.908 17.782L20.908 17.782L20.454 16.891ZM20.454 4.10899L20.908 3.21799L20.908 3.21799L20.454 4.10899ZM20.891 4.54601L20 5L20 5L20.891 4.54601ZM3.10899 4.54601L2.21799 4.09202L2.21799 4.09202L3.10899 4.54601ZM3.54601 4.10899L3.09202 3.21799L3.09202 3.21799L3.54601 4.10899ZM3.54601 16.891L4 16L4 16L3.54601 16.891ZM3.10899 16.454L2.21799 16.908L2.21799 16.908L3.10899 16.454ZM12 15L12.7809 14.3753C12.5911 14.1381 12.3038 14 12 14C11.6962 14 11.4089 14.1381 11.2191 14.3753L12 15ZM8 20L7.21913 19.3753C6.979 19.6755 6.93218 20.0867 7.0987 20.4332C7.26522 20.7797 7.61559 21 8 21V20ZM16 20V21C16.3844 21 16.7348 20.7797 16.9013 20.4332C17.0678 20.0867 17.021 19.6755 16.7809 19.3753L16 20ZM4.6 18H5.5V16H4.6V18ZM4 15.4V5.6H2V15.4H4ZM4.6 5H19.4V3H4.6V5ZM20 5.6V15.4H22V5.6H20ZM19.4 16H18.5V18H19.4V16ZM20 15.4C20 15.6965 19.9992 15.8588 19.9897 15.9754C19.9811 16.0803 19.9707 16.0575 20 16L21.782 16.908C21.9203 16.6366 21.9644 16.3668 21.9831 16.1382C22.0008 15.9213 22 15.6635 22 15.4H20ZM19.4 18C19.6635 18 19.9213 18.0008 20.1382 17.9831C20.3668 17.9644 20.6366 17.9203 20.908 17.782L20 16C20.0575 15.9707 20.0803 15.9811 19.9754 15.9897C19.8588 15.9992 19.6965 16 19.4 16V18ZM20 16L20 16L20.908 17.782C21.2843 17.5903 21.5903 17.2843 21.782 16.908L20 16ZM19.4 5C19.6965 5 19.8588 5.00078 19.9754 5.0103C20.0803 5.01887 20.0575 5.0293 20 5L20.908 3.21799C20.6366 3.07969 20.3668 3.03562 20.1382 3.01695C19.9213 2.99922 19.6635 3 19.4 3V5ZM22 5.6C22 5.33647 22.0008 5.07869 21.9831 4.86177C21.9644 4.63318 21.9203 4.36344 21.782 4.09202L20 5C19.9707 4.94249 19.9811 4.91972 19.9897 5.02463C19.9992 5.14122 20 5.30347 20 5.6H22ZM20 5L20 5L21.782 4.09202C21.5903 3.71569 21.2843 3.40973 20.908 3.21799L20 5ZM4 5.6C4 5.30347 4.00078 5.14122 4.0103 5.02463C4.01887 4.91972 4.0293 4.94249 4 5L2.21799 4.09202C2.07969 4.36344 2.03562 4.63318 2.01695 4.86177C1.99922 5.07869 2 5.33648 2 5.6H4ZM4.6 3C4.33647 3 4.07869 2.99922 3.86177 3.01695C3.63318 3.03562 3.36344 3.07969 3.09202 3.21799L4 5C3.94249 5.0293 3.91972 5.01887 4.02463 5.0103C4.14122 5.00078 4.30347 5 4.6 5V3ZM4 5L4 5L3.09202 3.21799C2.71569 3.40973 2.40973 3.71569 2.21799 4.09202L4 5ZM4.6 16C4.30347 16 4.14122 15.9992 4.02463 15.9897C3.91972 15.9811 3.94249 15.9707 4 16L3.09202 17.782C3.36344 17.9203 3.63318 17.9644 3.86177 17.9831C4.07869 18.0008 4.33647 18 4.6 18V16ZM2 15.4C2 15.6635 1.99922 15.9213 2.01695 16.1382C2.03562 16.3668 2.07969 16.6366 2.21799 16.908L4 16C4.0293 16.0575 4.01887 16.0803 4.0103 15.9754C4.00078 15.8588 4 15.6965 4 15.4H2ZM4 16L4 16L2.21799 16.908C2.40973 17.2843 2.71569 17.5903 3.09202 17.782L4 16ZM11.2191 14.3753L7.21913 19.3753L8.78087 20.6247L12.7809 15.6247L11.2191 14.3753ZM8 21H16V19H8V21ZM16.7809 19.3753L12.7809 14.3753L11.2191 15.6247L15.2191 20.6247L16.7809 19.3753Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,26 +0,0 @@
{
"images": [
{
"filename": "albums.svg",
"idiom": "universal",
"scale": "1x"
},
{
"idiom": "universal",
"scale": "2x",
"filename": "albums.svg"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "albums.svg"
}
],
"info": {
"author": "xcode",
"version": 1
},
"properties": {
"template-rendering-intent": "template"
}
}

Some files were not shown because too many files have changed in this diff Show More