v0.1
This commit is contained in:
		
							
								
								
									
										0
									
								
								.config/keep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								.config/keep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
Cargo.lock
 | 
			
		||||
target
 | 
			
		||||
*.json
 | 
			
		||||
*.DS_Store
 | 
			
		||||
**.DS_Store
 | 
			
		||||
scpt/json/
 | 
			
		||||
.config/ai
 | 
			
		||||
							
								
								
									
										19
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "ai"
 | 
			
		||||
version = "0.0.1"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
seahorse = "*"
 | 
			
		||||
reqwest = { version = "*", features = ["blocking", "json"] }
 | 
			
		||||
tokio = { version = "1", features = ["full"] }
 | 
			
		||||
shellexpand = "*"
 | 
			
		||||
config = "*"
 | 
			
		||||
serde = "*"
 | 
			
		||||
serde_json = "*"
 | 
			
		||||
serde_derive = "*"
 | 
			
		||||
url = { version = "2.0", features = ["serde"] }
 | 
			
		||||
rustc-serialize = "*"
 | 
			
		||||
toml = "*"
 | 
			
		||||
iso8601-timestamp = "*"
 | 
			
		||||
sysinfo = "*"
 | 
			
		||||
							
								
								
									
										10
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
FROM syui/aios
 | 
			
		||||
 | 
			
		||||
USER root
 | 
			
		||||
ADD .config /root/.config
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 | 
			
		||||
ADD ./scpt/entrypoint.sh /
 | 
			
		||||
RUN chmod +x /entrypoint.sh
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT ["/entrypoint.sh"]
 | 
			
		||||
							
								
								
									
										73
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								README.md
									
									
									
									
									
								
							@@ -1,6 +1,77 @@
 | 
			
		||||
## ai `bot`
 | 
			
		||||
 | 
			
		||||
<img src="./icon/avatar.png" width="100">
 | 
			
		||||
 | 
			
		||||
- name : ai bot
 | 
			
		||||
- base : [rust](https://www.rust-lang.org)
 | 
			
		||||
- host : [yui.syui.ai](https://bsky.app/profile/yui.syui.ai), [ai.syu.is](https://web.syu.is/profile/ai.syu.is)
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ai
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### logo
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ cargo build
 | 
			
		||||
$ ./target/debug/ai
 | 
			
		||||
$ ./target/debug/ai ai
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ai ai -t avatar
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### login
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# ai login $handle -p $password
 | 
			
		||||
$ ai l yui.syui.ai -p password
 | 
			
		||||
 | 
			
		||||
$ cat ~/.config/ai/token.toml
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
# ai l $handle -p $password -s $server
 | 
			
		||||
$ ai l ai.syu.is -p password -s syu.is
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### refresh
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai r
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### notify
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai n
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai n | jq .
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### bot
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ai bot
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
|command|type|body|
 | 
			
		||||
|---|---|---|
 | 
			
		||||
|@yui.syui.ai did|mention, reply| plc.directory/$did/log |
 | 
			
		||||
 | 
			
		||||
### test
 | 
			
		||||
 | 
			
		||||
`zsh`
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ ./ai.zsh t
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### docker
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
$ docker run -it syui/aios ai
 | 
			
		||||
$ docker run -it -d syui/aios zsh -c "ai login <handle> -p <password> && ai bot"
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								ai.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										30
									
								
								ai.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
# https://www.docs.bsky.app/docs/get-started
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
d=${0:a:h}/test
 | 
			
		||||
source $d/env
 | 
			
		||||
source $d/refresh.zsh
 | 
			
		||||
source $d/token.zsh
 | 
			
		||||
source $d/reply.zsh
 | 
			
		||||
source $d/notify.zsh
 | 
			
		||||
 | 
			
		||||
case $1 in
 | 
			
		||||
	refresh|r)
 | 
			
		||||
		refresh
 | 
			
		||||
		;;
 | 
			
		||||
	token|t)
 | 
			
		||||
		token
 | 
			
		||||
		;;
 | 
			
		||||
	reply|rep)
 | 
			
		||||
		reply
 | 
			
		||||
		;;
 | 
			
		||||
	notify|n)
 | 
			
		||||
		notify
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
							
								
								
									
										1
									
								
								docs/wiki.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docs/wiki.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
##
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								icon/ai.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								icon/ai.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								icon/avatar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								icon/avatar.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 557 KiB  | 
							
								
								
									
										1623
									
								
								scpt/api_card.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1623
									
								
								scpt/api_card.zsh
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										46
									
								
								scpt/api_card_raid_win.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										46
									
								
								scpt/api_card_raid_win.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
f_reid_user=$HOME/.config/atr/txt/card_reid_user.txt
 | 
			
		||||
n=`cat $f_reid_user|wc -l`
 | 
			
		||||
 | 
			
		||||
for ((i=1;i<=$n;i++))
 | 
			
		||||
do
 | 
			
		||||
	uid=`cat $f_reid_user|awk "NR==$i"`
 | 
			
		||||
	r=`echo $(($RANDOM % 10))`
 | 
			
		||||
	if [ $r -eq 1 ];then
 | 
			
		||||
		card=`echo $(($RANDOM % 15))`
 | 
			
		||||
		cp=`echo $(($RANDOM % 300 + 50))`
 | 
			
		||||
	else
 | 
			
		||||
		card=0
 | 
			
		||||
		cp=`echo $(($RANDOM % 100 + 1))`
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	ss=$(($RANDOM % 10))
 | 
			
		||||
	if [ 13 -ne $card ] && [ $ss -eq 1 ];then
 | 
			
		||||
		card=13
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	s=$(($RANDOM % 2))
 | 
			
		||||
	if [ $s -eq 1 ];then
 | 
			
		||||
		s=super
 | 
			
		||||
		plus=$(($RANDOM % 500 + 200))
 | 
			
		||||
		cp=$((cp + plus))
 | 
			
		||||
	else
 | 
			
		||||
		s=normal
 | 
			
		||||
	fi
 | 
			
		||||
	if [ $card -eq 13 ];then
 | 
			
		||||
		plus=$(($RANDOM % 1000 + 300))
 | 
			
		||||
		cp=$((cp + plus))
 | 
			
		||||
	fi
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\"}" -s $url/cards`
 | 
			
		||||
	echo $tmp
 | 
			
		||||
 | 
			
		||||
	card=`echo $tmp|jq -r .card`
 | 
			
		||||
	cp=`echo $tmp|jq -r .cp`
 | 
			
		||||
	echo "[card]"
 | 
			
		||||
	echo "id : ${card}"
 | 
			
		||||
	echo "cp : ${cp}"
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										215
									
								
								scpt/api_chara.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										215
									
								
								scpt/api_chara.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,215 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ] || [ -z "$5" ];then
 | 
			
		||||
	echo no option
 | 
			
		||||
	echo "/chara start"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
chara_qa="あなたはサッカーをしています。
 | 
			
		||||
試合中、ふと目にするのは?
 | 
			
		||||
 | 
			
		||||
1 : 開けた青空
 | 
			
		||||
2 : 真っ白な柱
 | 
			
		||||
3 : 風になびく芝生
 | 
			
		||||
 | 
			
		||||
数字を入れて答えてね。
 | 
			
		||||
/chara 数字"
 | 
			
		||||
 | 
			
		||||
chara_qb="ここは研究室。
 | 
			
		||||
実験のため道具を手に持っています。
 | 
			
		||||
 | 
			
		||||
1 : 淡い液体が入ったガラス瓶
 | 
			
		||||
2 : 清潔なシーツ
 | 
			
		||||
3 : 観葉植物"
 | 
			
		||||
 | 
			
		||||
chara_qc="宇宙に打ち上げられたロケットから地球を見ます。
 | 
			
		||||
何が見えましたか?
 | 
			
		||||
 | 
			
		||||
1 : 別の宇宙船
 | 
			
		||||
2 : 飛行機
 | 
			
		||||
3 : 大きな島"
 | 
			
		||||
 | 
			
		||||
chara_ba="
 | 
			
		||||
☑ 平和を願う
 | 
			
		||||
☑ 協調性は高いが自己主張は弱い
 | 
			
		||||
☑ 相談がうまい
 | 
			
		||||
---"
 | 
			
		||||
 | 
			
		||||
chara_bb="
 | 
			
		||||
☑ 変化自在
 | 
			
		||||
☑ 世間離れしており常識知らず
 | 
			
		||||
☑ 真面目で芯が強い
 | 
			
		||||
---"
 | 
			
		||||
 | 
			
		||||
chara_bc="
 | 
			
		||||
☑ 思慮深い
 | 
			
		||||
☑ 一人の時間が好きで冷たく見える
 | 
			
		||||
☑ 周りを観察している
 | 
			
		||||
---"
 | 
			
		||||
 | 
			
		||||
tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_post\": \"$ten_char\", \"ten_kai\":0,\"ten_su\":$first_ten,\"ten\": true,\"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
 | 
			
		||||
ten_data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".|sort_by(.ten_su)|reverse|.[]|select(.ten_su != 0)"`
 | 
			
		||||
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
host_card=https://card.syui.ai/json/card.json
 | 
			
		||||
#host_card_json=`curl -sL $host_card`
 | 
			
		||||
 | 
			
		||||
ran=$(($RANDOM % 3))
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
option=$5
 | 
			
		||||
 | 
			
		||||
yui_did=did:plc:4hqjfn7m6n5hno3doamuhgef
 | 
			
		||||
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
uid=`echo $data|jq -r .id`
 | 
			
		||||
aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
ten_post=`echo $data|jq -r .ten_post`
 | 
			
		||||
ten_su=`echo $data|jq -r .ten_su`
 | 
			
		||||
ten_kai=`echo $data|jq -r .ten_kai`
 | 
			
		||||
ten_delete=`echo $data|jq -r .ten_delete`
 | 
			
		||||
ten_bool=`echo $data|jq -r .ten`
 | 
			
		||||
day_at=`date +"%Y%m%d"`
 | 
			
		||||
nd=`date +"%Y%m%d" -d '1 days ago'`
 | 
			
		||||
ten_at_n=`date --iso-8601=seconds`
 | 
			
		||||
d=`date +"%Y-%m-%d"`
 | 
			
		||||
ten_at=`echo $data|jq -r .ten_at`
 | 
			
		||||
ten_at=`date -d "$ten_at" +"%Y-%m-%d"`
 | 
			
		||||
data_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
 | 
			
		||||
 | 
			
		||||
# uri_post=`echo '{"uri":"at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3k3zr5b336o2u","cid":"bafyreierpw23cxvx4e3cjzd3h6r4crz646zb2ana6cmmsxn4z5rpupl35e"}'|jq -r .uri|cut -d / -f 5`
 | 
			
		||||
# https://bsky.app/profile/$did/post/$uri_post
 | 
			
		||||
tmp_atr='{"uri":"at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3k3zr5b336o2u","cid":"bafyreierpw23cxvx4e3cjzd3h6r4crz646zb2ana6cmmsxn4z5rpupl35e"}'
 | 
			
		||||
 | 
			
		||||
function chara_check(){
 | 
			
		||||
	#card_check=`echo $data_card|jq -r ".[]|select(.card == 48 or .card == 49 or .card == 50 or .card == 51 or .card == 52 or .card == 53)"`
 | 
			
		||||
	#card_check=`echo $data_card|jq -r ".[]|select(.card == 54 or .card == 55 or .card == 56)"`
 | 
			
		||||
	card_check=`echo $data_card|jq -r ".[]|select(.card == 58 or .card == 53 or .card == 59)"`
 | 
			
		||||
	if [ -n "$card_check" ];then
 | 
			
		||||
		echo you already have chara-card
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function chara_start() {
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_su\":0, \"ten_kai\":1, \"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
	echo "$chara_qa"
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function chara_post(){
 | 
			
		||||
	case $1 in
 | 
			
		||||
		ponta)
 | 
			
		||||
			card=53
 | 
			
		||||
			text=$chara_ba
 | 
			
		||||
			title="[ポンタ]"
 | 
			
		||||
			desc="緑色"
 | 
			
		||||
			;;
 | 
			
		||||
		octo)
 | 
			
		||||
			card=58
 | 
			
		||||
			text=$chara_bb
 | 
			
		||||
			title="[オクトカット]"
 | 
			
		||||
			desc="白色"
 | 
			
		||||
			;;
 | 
			
		||||
		zeusu)
 | 
			
		||||
			card=59
 | 
			
		||||
			text=$chara_bc
 | 
			
		||||
			title="[ゼウス]"
 | 
			
		||||
			desc="青色"
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
 | 
			
		||||
	host_card=https://card.syui.ai/json/card.json
 | 
			
		||||
	host_card_json=`curl -sL $host_card`
 | 
			
		||||
	j=`echo $host_card_json|jq ".[]|select(.id == $card)"`
 | 
			
		||||
	img=`echo $j|jq -r .img`
 | 
			
		||||
 | 
			
		||||
	cp=$(($RANDOM % 1230))
 | 
			
		||||
	s=super
 | 
			
		||||
	skill=chara
 | 
			
		||||
	link="https://card.syui.ai/$username"
 | 
			
		||||
 | 
			
		||||
	card_check=`echo $data_card|jq -r ".[]|select(.card == $card)"`
 | 
			
		||||
	if [ -z "$card_check" ];then
 | 
			
		||||
		tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\"}" -s $host/cards`
 | 
			
		||||
		card=`echo $tmp|jq -r .card`
 | 
			
		||||
		cp=`echo $tmp|jq -r .cp`
 | 
			
		||||
	fi
 | 
			
		||||
	tmp_atr=`$atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link`
 | 
			
		||||
 uri_post=`echo $tmp_atr|jq -r .uri|cut -d / -f 5`
 | 
			
		||||
	post_url="https://bsky.app/profile/$yui_did/post/$uri_post"
 | 
			
		||||
	ccid=`echo $tmp|jq -r .id`
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"url\":\"$post_url\",\"token\":\"$token\"}" $host/cards/$ccid`
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function chara_plus() {
 | 
			
		||||
	case $ten_kai in
 | 
			
		||||
		2)
 | 
			
		||||
			chara_q=$chara_qb
 | 
			
		||||
			;;
 | 
			
		||||
		3)
 | 
			
		||||
			chara_q=$chara_qc
 | 
			
		||||
			;;
 | 
			
		||||
		#4)
 | 
			
		||||
		#	chara_q=$chara_qd
 | 
			
		||||
		#	;;
 | 
			
		||||
	esac
 | 
			
		||||
	echo "$chara_q"
 | 
			
		||||
 | 
			
		||||
	case $1 in
 | 
			
		||||
		1|2|3)
 | 
			
		||||
			tmp_su=$1
 | 
			
		||||
			ten_su=$((ten_su + $tmp_su))
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_su\":$ten_su, \"ten_kai\":$ten_kai, \"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
 | 
			
		||||
	case $ten_kai in
 | 
			
		||||
		4)
 | 
			
		||||
			if [ $ten_su -eq 9 ] || [ $ten_su -eq 8 ] || [ $ten_su -eq 7 ];then
 | 
			
		||||
				chara=ponta
 | 
			
		||||
			elif [ $ten_su -eq 6 ];then
 | 
			
		||||
				chara=octo
 | 
			
		||||
			else
 | 
			
		||||
				chara=zeusu
 | 
			
		||||
			fi
 | 
			
		||||
			chara_post $chara
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
chara_check
 | 
			
		||||
 | 
			
		||||
case "$option" in
 | 
			
		||||
	start)
 | 
			
		||||
		chara_start
 | 
			
		||||
		;;
 | 
			
		||||
	1|2|3)
 | 
			
		||||
		ten_kai=$((ten_kai + 1))
 | 
			
		||||
		chara_plus $option
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		echo "/chara start"
 | 
			
		||||
		echo "/chara 1,2,3"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										156
									
								
								scpt/api_egg.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										156
									
								
								scpt/api_egg.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,156 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
egg_card=40
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
opt=$3
 | 
			
		||||
 | 
			
		||||
if [ -z "$opt" ];then
 | 
			
		||||
	echo no option
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
uid=`echo $data|jq -r .id`
 | 
			
		||||
 | 
			
		||||
aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
fav=`echo $data|jq -r .fav`
 | 
			
		||||
day_at=`date +"%Y%m%d"`
 | 
			
		||||
nd=`date +"%Y%m%d" -d '1 days ago'`
 | 
			
		||||
ten_at_n=`date --iso-8601=seconds`
 | 
			
		||||
d=`date +"%Y%m%d"`
 | 
			
		||||
limit_reset_at=`date --iso-8601=seconds -d '1 days ago'`
 | 
			
		||||
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
 | 
			
		||||
 | 
			
		||||
opt_dec=`echo $opt|base64 -d`
 | 
			
		||||
 | 
			
		||||
if [ "$did" = "$opt_dec" ];then
 | 
			
		||||
	echo verify
 | 
			
		||||
else
 | 
			
		||||
	echo no verify
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
fav_card=`echo $data_user_card|jq -r ".[]|select(.card == $egg_card)"`
 | 
			
		||||
cid=`echo $fav_card|jq -r .id`
 | 
			
		||||
 | 
			
		||||
egg_at=`echo $data|jq -r .egg_at`
 | 
			
		||||
egg_at=`date -d "$egg_at" +"%Y%m%d"`
 | 
			
		||||
egg_at_n=`date --iso-8601=seconds`
 | 
			
		||||
 | 
			
		||||
day_m=`date +"%H%M"`
 | 
			
		||||
day_mm=`date +"%H%M" -d "-1 min"`
 | 
			
		||||
day_mmm=`date +"%H%M" -d "-2 min"`
 | 
			
		||||
 | 
			
		||||
if [ -z "$fav_card" ];then
 | 
			
		||||
	echo "no egg"
 | 
			
		||||
	if [ "$egg_at" = "$d" ];then
 | 
			
		||||
		echo "limit egg"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	card=39
 | 
			
		||||
	data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
	card_check=`echo $data_uu|jq -r ".[]|select(.card == $card)|.cp"|head -n 1`
 | 
			
		||||
	if [ -n "$card_check" ];then
 | 
			
		||||
		cp=$card_check
 | 
			
		||||
		cid=`echo $data_uu|jq -r ".[]|select(.card == $card)|.id"|head -n 1`
 | 
			
		||||
		echo "you already have, dragon"
 | 
			
		||||
		ran=`echo $(($RANDOM % 3))`
 | 
			
		||||
		ran_a=`echo $(($RANDOM % 5 + 1))`
 | 
			
		||||
		if [ $ran -eq 1 ];then
 | 
			
		||||
			card_check=$((card_check * 3))
 | 
			
		||||
			echo "🐉 ---> $cp +${ran_a}"
 | 
			
		||||
			cp=$((cp + ran_a))
 | 
			
		||||
		else
 | 
			
		||||
			cp=$((cp + 1))
 | 
			
		||||
			echo "$cp +1"
 | 
			
		||||
		fi
 | 
			
		||||
		tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"cp\":$cp,\"token\":\"$token\"}" $host/cards/$cid`
 | 
			
		||||
		tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"egg_at\":\"$egg_at_n\", \"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	card=42
 | 
			
		||||
	cp=0
 | 
			
		||||
	data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
	card_check=`echo $data_uu|jq -r ".[]|select(.card == $card)|.cp"|head -n 1`
 | 
			
		||||
	if [ -n "$card_check" ];then
 | 
			
		||||
		echo "you already have, nyan"
 | 
			
		||||
		ran=`echo $(($RANDOM % 1000 + 1000))`
 | 
			
		||||
		aiten_p=$((aiten + ran))
 | 
			
		||||
		echo "🐈 ---> [aiten]${aiten} +${ran}"
 | 
			
		||||
		tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"egg_at\":\"$egg_at_n\", \"aiten\":$aiten_p, \"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
card_id=`echo $fav_card|jq -r ".id"`
 | 
			
		||||
card_cp=`echo $fav_card|jq -r ".cp"`
 | 
			
		||||
card_name=`echo $fav_card|jq -r ".card"`
 | 
			
		||||
card_status=`echo $fav_card|jq -r ".status"`
 | 
			
		||||
card_skill=`echo $fav_card|jq -r ".skill"`
 | 
			
		||||
 | 
			
		||||
function fav_status() {
 | 
			
		||||
	echo "\n[card] ${card_name}"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "cp : ${card_cp}"
 | 
			
		||||
	echo "cid : ${cid}"
 | 
			
		||||
	echo "skill : ${card_skill}"
 | 
			
		||||
	echo "status : ${card_status}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fav_battle() {
 | 
			
		||||
	cp_b=`echo $(($RANDOM % 14))`
 | 
			
		||||
	if [ "$egg_at" = "$d" ];then
 | 
			
		||||
		echo "limit egg"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	cp_i=`echo $fav_card|jq -r ".cp"`
 | 
			
		||||
	card_name=`echo $fav_card|jq -r ".card"`
 | 
			
		||||
	card_status=`echo $fav_card|jq -r ".status"`
 | 
			
		||||
	card_skill=`echo $fav_card|jq -r ".skill"`
 | 
			
		||||
 | 
			
		||||
	if [ $cp_i -ge $cp_b ];then
 | 
			
		||||
		card=39
 | 
			
		||||
		skill=dragon
 | 
			
		||||
		cp=`echo $(($RANDOM % 1000 + 1200))`
 | 
			
		||||
		s=third
 | 
			
		||||
		ran=`echo $(($RANDOM % 10))`
 | 
			
		||||
		if [ $ran -eq 1 ];then
 | 
			
		||||
			card=42
 | 
			
		||||
			skill=nyan
 | 
			
		||||
			cp=0
 | 
			
		||||
		fi
 | 
			
		||||
		body="...congratulations! your egg has evolved\negg ---> ${skill} !!"
 | 
			
		||||
		tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"card\": $card,\"cp\":$cp,\"token\":\"$token\", \"status\": \"$s\",\"skill\": \"$skill\"}" $host/cards/$cid`
 | 
			
		||||
	else
 | 
			
		||||
		body="...no evolved"
 | 
			
		||||
	fi
 | 
			
		||||
	echo "\n${cp_i} vs $cp_b"
 | 
			
		||||
	echo "----"
 | 
			
		||||
	echo "${body}"
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"egg_at\":\"$egg_at_n\",\"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fav_battle
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										161
									
								
								scpt/api_fav.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										161
									
								
								scpt/api_fav.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,161 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
opt=$3
 | 
			
		||||
 | 
			
		||||
if [ -z "$opt" ];then
 | 
			
		||||
	echo no option
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "CID = 1234567"
 | 
			
		||||
	echo "@yui.syui.ai /fav 1234567"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "/fav status"
 | 
			
		||||
	echo "/fav battle"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
uid=`echo $data|jq -r .id`
 | 
			
		||||
 | 
			
		||||
if [ $opt -eq 0 ];then
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"fav\": $opt,\"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
	echo ok
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
fav=`echo $data|jq -r .fav`
 | 
			
		||||
day_at=`date +"%Y%m%d"`
 | 
			
		||||
nd=`date +"%Y%m%d" -d '1 days ago'`
 | 
			
		||||
ten_at_n=`date --iso-8601=seconds`
 | 
			
		||||
d=`date +"%Y%m%d"`
 | 
			
		||||
limit_reset_at=`date --iso-8601=seconds -d '1 days ago'`
 | 
			
		||||
data_user_card=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"`
 | 
			
		||||
 | 
			
		||||
case "$opt" in
 | 
			
		||||
	[bB]|-[bB]|[bB]attle|[sS]|-[sS]|[sS]tatus)
 | 
			
		||||
		cid=`echo $data|jq -r .fav`
 | 
			
		||||
		fav_card=`echo $data_user_card|jq -r ".[]|select(.id == $cid)"`
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		opt=$((opt + 0))
 | 
			
		||||
		cid=$opt
 | 
			
		||||
		fav_card=`echo $data_user_card|jq -r ".[]|select(.id == $cid)"`
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
updated_at=`echo $data|jq -r .updated_at`
 | 
			
		||||
updated_at_m=`date -d "$updated_at" +"%H%M"`
 | 
			
		||||
updated_at_n=`date --iso-8601=seconds`
 | 
			
		||||
updated_at=`date -d "$updated_at" +"%Y%m%d"`
 | 
			
		||||
raid_at=`echo $data|jq -r .raid_at`
 | 
			
		||||
raid_at=`date -d "$raid_at" +"%Y%m%d"`
 | 
			
		||||
raid_at_n=`date --iso-8601=seconds`
 | 
			
		||||
day_m=`date +"%H%M"`
 | 
			
		||||
day_mm=`date +"%H%M" -d "-1 min"`
 | 
			
		||||
day_mmm=`date +"%H%M" -d "-2 min"`
 | 
			
		||||
 | 
			
		||||
if [ -z "$fav_card" ];then
 | 
			
		||||
	echo "no card id"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
card_id=`echo $fav_card|jq -r ".id"`
 | 
			
		||||
card_cp=`echo $fav_card|jq -r ".cp"`
 | 
			
		||||
card_name=`echo $fav_card|jq -r ".card"`
 | 
			
		||||
card_status=`echo $fav_card|jq -r ".status"`
 | 
			
		||||
card_skill=`echo $fav_card|jq -r ".skill"`
 | 
			
		||||
 | 
			
		||||
function fav_status() {
 | 
			
		||||
	echo "\n[card] ${card_name}"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "cp : ${card_cp}"
 | 
			
		||||
	echo "cid : ${cid}"
 | 
			
		||||
	echo "skill : ${card_skill}"
 | 
			
		||||
	echo "status : ${card_status}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fav_battle() {
 | 
			
		||||
	if [ -n "$1" ];then
 | 
			
		||||
		cp_b=$1
 | 
			
		||||
	else
 | 
			
		||||
		cp_b=$(($RANDOM % 1400))
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ $updated_at -ge $d ] || [ "$updated_at" = "$d" ];then
 | 
			
		||||
		echo "limit battle"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	cp_i=`echo $fav_card|jq -r ".cp"`
 | 
			
		||||
	card_name=`echo $fav_card|jq -r ".card"`
 | 
			
		||||
	card_status=`echo $fav_card|jq -r ".status"`
 | 
			
		||||
	card_skill=`echo $fav_card|jq -r ".skill"`
 | 
			
		||||
 | 
			
		||||
	if [ $cp_i -gt $cp_b ];then
 | 
			
		||||
		if [ $cp_i -ge 9000 ];then
 | 
			
		||||
			cp_plus=$(($RANDOM % 27 + 1))
 | 
			
		||||
		elif [ $cp_i -ge 7000 ];then
 | 
			
		||||
			cp_plus=$(($RANDOM % 47 + 1))
 | 
			
		||||
		else
 | 
			
		||||
			cp_plus=$(($RANDOM % 237 + 1))
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		cp_plus=$(($RANDOM % 17 + 1))
 | 
			
		||||
	fi
 | 
			
		||||
	echo "\n✧${cp_i} vs $cp_b"
 | 
			
		||||
	echo "----"
 | 
			
		||||
	cp=$((cp_i + cp_plus))
 | 
			
		||||
	body="level up!"
 | 
			
		||||
	echo "${body} ✧${cp}(+${cp_plus})"
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"cp\":$cp,\"token\":\"$token\"}" $host/cards/$cid`
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"updated_at\":\"$updated_at_n\",\"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fav_add() {
 | 
			
		||||
	card_status=fifth
 | 
			
		||||
	u_data=`curl -sL "https://api.syui.ai/users/$uid/card?itemsPerPage=2555"|jq -r ".[]|select(.status == \"$card_status\")"`
 | 
			
		||||
	if [ -z "$u_data" ];then
 | 
			
		||||
		d_data=`curl -sL $host/cards/$cid|jq -r "select(.status == \"first\" or .status == \"second\" or .status == \"third\" or .status == \"yui\" or .status == \"fourth\" or .status == \"$card_status\")"`
 | 
			
		||||
		if [ -z "$d_data" ];then
 | 
			
		||||
			echo status $card_status
 | 
			
		||||
			tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"status\":\"$card_status\",\"token\":\"$token\"}" $host/cards/$cid`
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"fav\": $opt,\"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
	if [ -n "$tmp" ];then
 | 
			
		||||
		echo ok
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case "$opt" in
 | 
			
		||||
	[bB]|-[bB]|[bB]attle)
 | 
			
		||||
		fav_battle $4
 | 
			
		||||
		;;
 | 
			
		||||
	[sS]|-[sS]|[sS]tatus)
 | 
			
		||||
		fav_status
 | 
			
		||||
		;;
 | 
			
		||||
		*)
 | 
			
		||||
		fav_add
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										278
									
								
								scpt/api_gift.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										278
									
								
								scpt/api_gift.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,278 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
cid=`echo $3|cut -d ' ' -f 1`
 | 
			
		||||
guser=$4
 | 
			
		||||
 | 
			
		||||
if [ "$3" = "ai" ];then
 | 
			
		||||
	guser=ai
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$cid" ];then
 | 
			
		||||
	echo no option
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "@yui.syui.ai /gift ai"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "@yui.syui.ai /gift status"
 | 
			
		||||
	echo "12345"
 | 
			
		||||
	echo "67891"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "@yui.syui.ai /gift 12345"
 | 
			
		||||
	echo ""
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo "@yui.syui.ai /gift 12345 syui"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function card_env(){
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	gdata=`echo $all_data|jq ".[]|select(.username == \"$guser\")"`
 | 
			
		||||
	if [ -z "$data" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	gid=`echo $gdata|jq -r .id`
 | 
			
		||||
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	fav=`echo $data|jq -r .fav`
 | 
			
		||||
 | 
			
		||||
	cdata=`curl -sL $host/cards/$cid`
 | 
			
		||||
	if [ -z "$cdata" ];then
 | 
			
		||||
		echo no card
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	card=`echo $cdata|jq -r .card`
 | 
			
		||||
	cp=`echo $cdata|jq -r .cp`
 | 
			
		||||
	count=`echo $cdata|jq -r .count`
 | 
			
		||||
	author=`echo $cdata|jq -r .author`
 | 
			
		||||
	skill=`echo $cdata|jq -r .skill`
 | 
			
		||||
	s=`echo $cdata|jq -r .status`
 | 
			
		||||
 | 
			
		||||
	if [ $count -eq 0 ];then
 | 
			
		||||
		echo card count 0
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ $author != "$username" ];then
 | 
			
		||||
		echo no author
 | 
			
		||||
		echo "$author --> $username"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_env_ai(){
 | 
			
		||||
	guser=ai
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	gdata=`echo $all_data|jq ".[]|select(.username == \"$guser\")"`
 | 
			
		||||
	if [ -z "$data" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	gid=`echo $gdata|jq -r .id`
 | 
			
		||||
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	fav=`echo $data|jq -r .fav`
 | 
			
		||||
 | 
			
		||||
	cdata=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"|jq ".[0]"`
 | 
			
		||||
	if [ -z "$cdata" ];then
 | 
			
		||||
		cdata=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"|jq ".[]|select(.author == \"$username\")"|jq -s ".[0]"`
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ -z "$cdata" ];then
 | 
			
		||||
		echo no card
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	cid=`echo $cdata|jq -r .id`
 | 
			
		||||
	card=`echo $cdata|jq -r .card`
 | 
			
		||||
	cp=`echo $cdata|jq -r .cp`
 | 
			
		||||
	count=`echo $cdata|jq -r .count`
 | 
			
		||||
	author=`echo $cdata|jq -r .author`
 | 
			
		||||
	skill=`echo $cdata|jq -r .skill`
 | 
			
		||||
	s=`echo $cdata|jq -r .status`
 | 
			
		||||
 | 
			
		||||
	if [ $count -eq 0 ];then
 | 
			
		||||
		echo card count 0
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ $author != "$username" ];then
 | 
			
		||||
		echo no author
 | 
			
		||||
		echo "$author --> $username"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	aicard=`curl -sL "$host/users/$gid/card?itemsPerPage=3000"|jq -r ".[]|select(.card >= 1)"|jq -s`
 | 
			
		||||
	if [ -z "$aicard" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	n=`echo $aicard|jq length`
 | 
			
		||||
	n=$((n - 1))
 | 
			
		||||
	ran=$((RANDOM % n))
 | 
			
		||||
	ai_id=`echo $aicard|jq -r ".[$ran]|.id"`
 | 
			
		||||
	ai_card=`echo $aicard|jq -r ".[$ran]|.card"`
 | 
			
		||||
	ai_cp=`echo $aicard|jq -r ".[$ran]|.cp"`
 | 
			
		||||
	ai_skill=`echo $aicard|jq -r ".[$ran]|.skill"`
 | 
			
		||||
	ai_s=`echo $aicard|jq -r ".[$ran]|.status"`
 | 
			
		||||
	ai_author=ai
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_env_ai_select(){
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	gdata=`echo $all_data|jq ".[]|select(.username == \"$guser\")"`
 | 
			
		||||
	if [ -z "$data" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	gid=`echo $gdata|jq -r .id`
 | 
			
		||||
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	fav=`echo $data|jq -r .fav`
 | 
			
		||||
 | 
			
		||||
	cdata=`curl -sL $host/cards/$cid`
 | 
			
		||||
	if [ -z "$cdata" ];then
 | 
			
		||||
		echo no card
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	cid=`echo $cdata|jq -r .id`
 | 
			
		||||
	card=`echo $cdata|jq -r .card`
 | 
			
		||||
	cp=`echo $cdata|jq -r .cp`
 | 
			
		||||
	count=`echo $cdata|jq -r .count`
 | 
			
		||||
	author=`echo $cdata|jq -r .author`
 | 
			
		||||
	skill=`echo $cdata|jq -r .skill`
 | 
			
		||||
	s=`echo $cdata|jq -r .status`
 | 
			
		||||
 | 
			
		||||
	if [ $count -eq 0 ];then
 | 
			
		||||
		echo card count 0
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ $author != "$username" ];then
 | 
			
		||||
		echo no author
 | 
			
		||||
		echo "$author --> $username"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	aicard=`curl -sL "$host/users/$gid/card?itemsPerPage=3000"|jq -r ".[]|select(.card >= 1)"|jq -s`
 | 
			
		||||
	if [ -z "$aicard" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	n=`echo $aicard|jq length`
 | 
			
		||||
	n=$((n - 1))
 | 
			
		||||
	ran=$((RANDOM % n))
 | 
			
		||||
	ai_id=`echo $aicard|jq -r ".[$ran]|.id"`
 | 
			
		||||
	ai_card=`echo $aicard|jq -r ".[$ran]|.card"`
 | 
			
		||||
	ai_cp=`echo $aicard|jq -r ".[$ran]|.cp"`
 | 
			
		||||
	ai_skill=`echo $aicard|jq -r ".[$ran]|.skill"`
 | 
			
		||||
	ai_s=`echo $aicard|jq -r ".[$ran]|.status"`
 | 
			
		||||
	ai_author=ai
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_gift() {
 | 
			
		||||
	card_env
 | 
			
		||||
	if [ -z "$guser" ];then
 | 
			
		||||
		echo card:$card
 | 
			
		||||
		echo skill:$skill
 | 
			
		||||
		echo status:$s
 | 
			
		||||
		echo count:$count
 | 
			
		||||
		echo author:$author
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	count=$((count - 1))
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$gid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\",\"author\":\"$username\",\"count\":0}" -sL $host/cards`
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"count\":$count,\"token\":\"$token\"}" $host/cards/$cid -sL`
 | 
			
		||||
	echo ok
 | 
			
		||||
	echo "$author($cid) -->  $guser"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_ai() {
 | 
			
		||||
	card_env_ai
 | 
			
		||||
	count=$((count - 1))
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$gid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\",\"author\":\"$username\",\"count\":0}" -sL $host/cards`
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"count\":$count,\"token\":\"$token\"}" $host/cards/$cid -sL`
 | 
			
		||||
	echo ok
 | 
			
		||||
	echo "$author($cid) -->  $guser"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo 'thx!'
 | 
			
		||||
	echo card:$ai_card
 | 
			
		||||
	echo cp:$ai_cp
 | 
			
		||||
	echo author:$ai_author
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$ai_card,\"status\":\"$ai_s\",\"cp\":$ai_cp,\"password\":\"$pass\",\"skill\":\"$ai_skill\",\"author\":\"$ai_author\",\"count\":0}" -sL $host/cards`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_ai_select() {
 | 
			
		||||
	card_env_ai_select
 | 
			
		||||
	count=$((count - 1))
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$gid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\",\"author\":\"$username\",\"count\":0}" -sL $host/cards`
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"count\":$count,\"token\":\"$token\"}" $host/cards/$cid -sL`
 | 
			
		||||
	echo ok
 | 
			
		||||
	echo "$author($cid) -->  $guser"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo 'thx!'
 | 
			
		||||
	echo card:$ai_card
 | 
			
		||||
	echo cp:$ai_cp
 | 
			
		||||
	echo author:$ai_author
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$ai_card,\"status\":\"$ai_s\",\"cp\":$ai_cp,\"password\":\"$pass\",\"skill\":\"$ai_skill\",\"author\":\"$ai_author\",\"count\":0}" -sL $host/cards`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_status(){
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	acard=`curl -sL "$host/users/$uid/card?itemsPerPage=3000"|jq ".[]|select(.author == \"$username\")|.id"`
 | 
			
		||||
	if [ -z "$acard" ];then
 | 
			
		||||
		echo no card
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	echo $acard
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function test_cmd(){
 | 
			
		||||
	echo "test ok /gift $1"
 | 
			
		||||
	echo cid:$cid
 | 
			
		||||
	echo guser:$guser
 | 
			
		||||
	exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case $cid in
 | 
			
		||||
	"status")
 | 
			
		||||
		card_status
 | 
			
		||||
		;;
 | 
			
		||||
	"ai")
 | 
			
		||||
		#test_cmd ai
 | 
			
		||||
		card_ai
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		if [ "ai" = "$guser" ];then
 | 
			
		||||
			#test_cmd ai_select
 | 
			
		||||
			card_ai_select
 | 
			
		||||
		else
 | 
			
		||||
			#test_cmd gift user
 | 
			
		||||
			card_gift
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										1345
									
								
								scpt/api_ten.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1345
									
								
								scpt/api_ten.zsh
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										183
									
								
								scpt/api_ten_auto.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										183
									
								
								scpt/api_ten_auto.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,183 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
card_pay=$HOME/.config/atr/scpt/card_pay.zsh
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
host_card=https://card.syui.ai/json/card.json
 | 
			
		||||
host_card_json=`curl -sL $host_card`
 | 
			
		||||
n_cid=$HOME/.config/atr/txt/tmp_notify_cid.txt
 | 
			
		||||
f_cfg=$HOME/.config/atr/txt/tmp_ten_config.txt
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
if [ ! -f $f_cfg ];then
 | 
			
		||||
	echo $host_card_json |jq -r ".[]|select(.ten != null)|.ten" |tr -d '\n' >! $f_cfg
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -f $f_cfg ];then
 | 
			
		||||
	nn=`cat $f_cfg|wc -c`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
function ten_yak() {
 | 
			
		||||
	unset ran_a
 | 
			
		||||
	unset ran_b
 | 
			
		||||
	unset ran_c
 | 
			
		||||
	unset ten_new
 | 
			
		||||
	unset ten_yaku
 | 
			
		||||
 | 
			
		||||
	ran_a=$(($RANDOM % nn))
 | 
			
		||||
	ran_b=$(($RANDOM % nn))
 | 
			
		||||
	ran_c=$(($RANDOM % nn))
 | 
			
		||||
	
 | 
			
		||||
	ten_new=0
 | 
			
		||||
 | 
			
		||||
	char_a=`cat $f_cfg| cut -c $ran_a`
 | 
			
		||||
	char_b=`cat $f_cfg| cut -c $ran_b`
 | 
			
		||||
	char_c=`cat $f_cfg| cut -c $ran_c`
 | 
			
		||||
	ten_char=`echo "${char_a}\n${char_b}\n${char_c}"|head -n 3|sort|tr -d '\n'`
 | 
			
		||||
	if [ ${#ten_char} -eq 0 ];then
 | 
			
		||||
		ten_char=AAA
 | 
			
		||||
	fi
 | 
			
		||||
	if [ ${#ten_char} -eq 1 ];then
 | 
			
		||||
		ten_char=AA${ten_char}
 | 
			
		||||
	fi
 | 
			
		||||
	if [ ${#ten_char} -eq 2 ];then
 | 
			
		||||
		ten_char=A${ten_char}
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	char_a=`echo $ten_char|cut -b 1`
 | 
			
		||||
	char_b=`echo $ten_char|cut -b 2`
 | 
			
		||||
	char_c=`echo $ten_char|cut -b 3`
 | 
			
		||||
 | 
			
		||||
	case $ten_char in
 | 
			
		||||
 | 
			
		||||
		EMY)
 | 
			
		||||
			card=1
 | 
			
		||||
			;;
 | 
			
		||||
		KOS)
 | 
			
		||||
			card=2
 | 
			
		||||
			;;
 | 
			
		||||
		CHI)
 | 
			
		||||
			card=3
 | 
			
		||||
			;;
 | 
			
		||||
		AIT)
 | 
			
		||||
			card=4
 | 
			
		||||
			;;
 | 
			
		||||
		OYZ)
 | 
			
		||||
			card=5
 | 
			
		||||
			;;
 | 
			
		||||
		IKY)
 | 
			
		||||
			card=6
 | 
			
		||||
			;;
 | 
			
		||||
		AKM)
 | 
			
		||||
			card=7
 | 
			
		||||
			;;
 | 
			
		||||
		KUY)
 | 
			
		||||
			card=8
 | 
			
		||||
			;;
 | 
			
		||||
		AW*)
 | 
			
		||||
			card=9
 | 
			
		||||
			;;
 | 
			
		||||
		AHK)
 | 
			
		||||
			card=10
 | 
			
		||||
			;;
 | 
			
		||||
		IKT)
 | 
			
		||||
			card=11
 | 
			
		||||
			;;
 | 
			
		||||
		AAM)
 | 
			
		||||
			card=12
 | 
			
		||||
			;;
 | 
			
		||||
		OSZ)
 | 
			
		||||
			card=13
 | 
			
		||||
			;;
 | 
			
		||||
		CHO)
 | 
			
		||||
			card=14
 | 
			
		||||
			;;
 | 
			
		||||
		*)
 | 
			
		||||
			card=0
 | 
			
		||||
			;;
 | 
			
		||||
	esac
 | 
			
		||||
 | 
			
		||||
	ten_new=${card}00
 | 
			
		||||
 | 
			
		||||
	if [ $ten_new -eq 0 ];then
 | 
			
		||||
		ten_new=0
 | 
			
		||||
	else
 | 
			
		||||
		ten_yaku="[$ten_char]"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ "$ten_char" = "AAA" ];then
 | 
			
		||||
		ten_new=100
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ "$char_a" = "A" ] && [ "$char_b" = "I" ] && [ $ten_new -ne 0 ];then
 | 
			
		||||
		ten_new=150
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ "$char_a" = "$char_b" ] && [ $ten_new -ne 0 ];then
 | 
			
		||||
		ten_new=50
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	echo "[$i] $ten_su $ten_yaku+$ten_new"
 | 
			
		||||
	ten_su=$((ten_su + ten_new))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function user_env() {
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	ten_data=`echo $all_data|jq ".|sort_by(.ten_su)|reverse|.[]|select(.ten_su != 0)"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	ten_post=`echo $data|jq -r .ten_post`
 | 
			
		||||
	ten_bool=`echo $data|jq -r .ten`
 | 
			
		||||
	day_at=`date +"%Y%m%d"`
 | 
			
		||||
	nd=`date +"%Y%m%d" -d '1 days ago'`
 | 
			
		||||
	ten_at_n=`date --iso-8601=seconds`
 | 
			
		||||
	limit_reset_at=`date --iso-8601=seconds -d '1 days ago'`
 | 
			
		||||
	d=`date +"%Y-%m-%d"`
 | 
			
		||||
	ten_at=`echo $data|jq -r .ten_at`
 | 
			
		||||
	ten_at=`date -d "$ten_at" +"%Y-%m-%d"`
 | 
			
		||||
	ten_kai=`echo $data|jq -r .ten_kai`
 | 
			
		||||
	if [ "$d" = "$ten_at" ];then
 | 
			
		||||
		echo "limit aiten"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	ten_kai=`echo $data|jq -r .ten_kai`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ten_shutdown(){
 | 
			
		||||
	ten_kai=0
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	ten=`echo $((ten_su + 200))`
 | 
			
		||||
	ten_su=$ten
 | 
			
		||||
	aiten=`echo $((aiten + ten_su))`
 | 
			
		||||
	echo "+100"
 | 
			
		||||
	echo "---"
 | 
			
		||||
	echo user : $handle
 | 
			
		||||
	echo ten :	$ten
 | 
			
		||||
	echo aiten :	
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"ten_kai\":$ten_kai, \"ten_su\":$ten_su, \"ten\": false, \"token\":\"$token\", \"ten_at\" : \"$ten_at_n\", \"aiten\": $aiten}" -s $host/users/$uid`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
user_env
 | 
			
		||||
 | 
			
		||||
for ((i=1;i<=7;i++))
 | 
			
		||||
do
 | 
			
		||||
	ten_yak
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
ten_shutdown
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										31
									
								
								scpt/api_ten_su_reset.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								scpt/api_ten_su_reset.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
function ten_su_reset() {
 | 
			
		||||
	ten_data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".|sort_by(.ten_su)|reverse|.[]|select(.ten_su != 0)"`
 | 
			
		||||
	ten_u_tmp=`echo $ten_data|jq -s`
 | 
			
		||||
	ten_n_tmp=`echo $ten_u_tmp|jq "length"`
 | 
			
		||||
	ten_n_tmp=$((ten_n_tmp - 1))
 | 
			
		||||
	#ten_n_tmp=5
 | 
			
		||||
	for ((i=0;i<$ten_n_tmp;i++))
 | 
			
		||||
	do
 | 
			
		||||
		u_i=`echo $ten_u_tmp|jq -r ".[$i].id"`
 | 
			
		||||
		u_a=`echo $ten_u_tmp|jq -r ".[$i].username"`
 | 
			
		||||
		u_s=`echo $ten_u_tmp|jq -r ".[$i].ten_su"`
 | 
			
		||||
		echo "---"
 | 
			
		||||
		echo "id : $u_i"
 | 
			
		||||
		echo "user : $u_a"
 | 
			
		||||
		echo "ten : $u_s"
 | 
			
		||||
		curl -X PATCH -H "Content-Type: application/json" -d "{\"ten\": false,\"token\":\"$token\", \"ten_su\": 0}" -s $host/users/$u_i
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ten_su_reset
 | 
			
		||||
							
								
								
									
										79
									
								
								scpt/arch.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										79
									
								
								scpt/arch.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
home=/home/syui
 | 
			
		||||
name=arch
 | 
			
		||||
a=$home/$name
 | 
			
		||||
 | 
			
		||||
function arch_in(){
 | 
			
		||||
	mkdir -p $a
 | 
			
		||||
	sudo pacstrap -c $a base
 | 
			
		||||
	#sudo echo pts/0 >> $a/etc/securetty
 | 
			
		||||
	#sudo echo pts/1 >> $a/etc/securetty
 | 
			
		||||
	sudo rm -rf /var/lib/machines/$name
 | 
			
		||||
	sudo rm -rf /var/lib/machines/${name}back
 | 
			
		||||
	sudo mv $a /var/lib/machines/
 | 
			
		||||
	sudo machinectl clone arch archback
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_rm(){
 | 
			
		||||
	sudo machinectl remove $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_up(){
 | 
			
		||||
	sudo machinectl poweroff $name > /dev/null 2>&1
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl terminate $name > /dev/null 2>&1
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl start ${name}back
 | 
			
		||||
	sleep 5
 | 
			
		||||
	ssh ${name}back pacman -Syu --noconfirm
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl poweroff ${name}back
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_st(){
 | 
			
		||||
	sudo machinectl start $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_of(){
 | 
			
		||||
	sudo machinectl poweroff $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_ex(){
 | 
			
		||||
	sudo machinectl shell $name
 | 
			
		||||
	$1
 | 
			
		||||
	poweroff
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_re(){
 | 
			
		||||
	sudo machinectl poweroff $name  > /dev/null 2>&1
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl terminate $name > /dev/null 2>&1
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl remove $name
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl clone ${name}back $name
 | 
			
		||||
	sleep 5
 | 
			
		||||
	sudo machinectl start $name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
	"update"|"-u")
 | 
			
		||||
		arch_up
 | 
			
		||||
		arch_re
 | 
			
		||||
		echo "machinectl update done"
 | 
			
		||||
		;;
 | 
			
		||||
	"reset"|"-r")
 | 
			
		||||
		arch_re
 | 
			
		||||
		echo "machinectl reset done"
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		sudo machinectl start $name
 | 
			
		||||
		t=`ssh $name "$*"`
 | 
			
		||||
		if [ -z "$t" ];then
 | 
			
		||||
			ssh -tt $name "$*"
 | 
			
		||||
		else 
 | 
			
		||||
			echo "$t"
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
							
								
								
									
										21
									
								
								scpt/at_img.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								scpt/at_img.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
dir=${0:a:h}
 | 
			
		||||
f=$HOME/.config/atr/scpt/png/t.png
 | 
			
		||||
f_sleep=$HOME/.config/atr/scpt/png/sleep
 | 
			
		||||
 | 
			
		||||
cid=$1
 | 
			
		||||
uri=$2
 | 
			
		||||
if [ ! -f $f ];then
 | 
			
		||||
	atr r "limit 1 day" -c $cid -u $uri
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
if [ -f $f_sleep ];then
 | 
			
		||||
	link=bafkreidgp2cl4cvkn3i4gzqj6kfiwngjjh5ie2jwobh632jh4ejlbiwdhm
 | 
			
		||||
	atr img-post "#nyancat" -l $link -c $cid -u $uri
 | 
			
		||||
	rm $f_sleep
 | 
			
		||||
	exit
 | 
			
		||||
fi	
 | 
			
		||||
 | 
			
		||||
link=`atr img-upload $f|jq -r .blob.ref.'"$link"'`
 | 
			
		||||
atr img-post "#stablediffusion" -l $link -c $cid -u $uri
 | 
			
		||||
							
								
								
									
										21
									
								
								scpt/at_search.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								scpt/at_search.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
d=${0:a:h:h}
 | 
			
		||||
url="search.bsky.social/search/posts?q="
 | 
			
		||||
q=`echo $*|tr ' ' '+'`
 | 
			
		||||
url="${url}${q}"
 | 
			
		||||
 | 
			
		||||
t=`curl -sL "$url"`
 | 
			
		||||
echo $t
 | 
			
		||||
n=`echo $t|jq "length"`
 | 
			
		||||
n=`expr $n - 1`
 | 
			
		||||
for ((i=0;i<=$n;i++))
 | 
			
		||||
do
 | 
			
		||||
	did=`echo $t|jq -r ".[$i].user.did"`
 | 
			
		||||
	text=`echo $t|jq -r ".[$i].post.text"`
 | 
			
		||||
	tid=`echo $t|jq -r ".[$i].tid"`
 | 
			
		||||
	if [ "$text" != "null" ];then
 | 
			
		||||
		echo $did
 | 
			
		||||
		echo $text
 | 
			
		||||
		echo https://$tid
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										24
									
								
								scpt/bluesky.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								scpt/bluesky.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
d=${0:a:h}
 | 
			
		||||
dd=${0:a:h:h}/json
 | 
			
		||||
#https://github.com/bluesky-social/atproto/issues/597
 | 
			
		||||
host=bsky.social
 | 
			
		||||
base=https://$host/xrpc
 | 
			
		||||
handle=`cat ~/.config/atr/token.json| jq -r .handle`
 | 
			
		||||
token=`cat ~/.config/atr/token.json| jq -r .accessJwt`
 | 
			
		||||
if [ -n "$1" ];then
 | 
			
		||||
	url=$base/$1
 | 
			
		||||
else
 | 
			
		||||
	url="$base/app.bsky.actor.getProfile?actor=$handle"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/profile.json
 | 
			
		||||
cat $dd/profile.json
 | 
			
		||||
 | 
			
		||||
url=$base/app.bsky.feed.getTimeline
 | 
			
		||||
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/timeline.json
 | 
			
		||||
cat $dd/timeline.json
 | 
			
		||||
 | 
			
		||||
url=$base/app.bsky.notification.listNotifications
 | 
			
		||||
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/notify.json
 | 
			
		||||
cat $dd/notify.json|jq .
 | 
			
		||||
							
								
								
									
										39
									
								
								scpt/bot_card.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								scpt/bot_card.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
host_at=bsky.social
 | 
			
		||||
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
scpt=$HOME/.config/atr/scpt/api_card.zsh 
 | 
			
		||||
 | 
			
		||||
handle=skychan.social
 | 
			
		||||
did=did:plc:7hgow77uky7lgbinwyvbzhar
 | 
			
		||||
f=$HOME/.config/atr/card_bot.txt
 | 
			
		||||
touch $f
 | 
			
		||||
 | 
			
		||||
n=5
 | 
			
		||||
for ((i=0;i<=$n;i++))
 | 
			
		||||
do
 | 
			
		||||
	echo $i
 | 
			
		||||
	cid=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.cid"`
 | 
			
		||||
	uri=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.uri"`
 | 
			
		||||
	t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.value.text"`
 | 
			
		||||
	echo $t $cid $uri
 | 
			
		||||
	if [ "@yui.syui.ai /card" = "$t" ];then
 | 
			
		||||
		if [ "$cid" = "`cat $f`" ];then
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
		card=`$scpt $handle $did`
 | 
			
		||||
		link="https://card.syui.ai/skychan"
 | 
			
		||||
		~/.cargo/bin/atr r "$card" -c $cid -u "$uri" -l "$link"
 | 
			
		||||
		echo $cid >! $f
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "@yui.syui.ai /card -b" = "$t" ];then
 | 
			
		||||
		if [ "$cid" = "`cat $f`" ];then
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
		card=`$scpt $handle $did -b`
 | 
			
		||||
		link="https://card.syui.ai/skychan"
 | 
			
		||||
		~/.cargo/bin/atr r "\n$card" -c $cid -u "$uri" -l "$link"
 | 
			
		||||
		echo $cid >! $f
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										60
									
								
								scpt/bot_kawaii.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										60
									
								
								scpt/bot_kawaii.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
d=$HOME/.config/atr/txt
 | 
			
		||||
mkdir -p $d
 | 
			
		||||
f=$d/kawaii.txt
 | 
			
		||||
 | 
			
		||||
function test_post() {
 | 
			
		||||
	host_at=bsky.social
 | 
			
		||||
	url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
	handle=lilly-niyu.bsky.social
 | 
			
		||||
	n=10
 | 
			
		||||
	for ((i=0;i<=$n;i++))
 | 
			
		||||
	do
 | 
			
		||||
		echo $i
 | 
			
		||||
		cid=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.cid"`
 | 
			
		||||
		uri=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.uri"`
 | 
			
		||||
		t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post" |jq -r ".[]|.[$i]?|.value.text"`
 | 
			
		||||
		echo $t $cid $uri
 | 
			
		||||
		if [ "かわいいにゃ〜!!" = "$t" ];then
 | 
			
		||||
			#atr r "楽しそう!アイもまぜてよ" -c $cid -u "$uri"
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#uri=at://$did/$tid
 | 
			
		||||
#{
 | 
			
		||||
#  "tid": "app.bsky.feed.post/3judrtmxuin2b",
 | 
			
		||||
#  "cid": "bafyreibebbn7og5dgvvegcjlh357pnrpuvvinbjeaqbfvqb4jsrpbsw3di",
 | 
			
		||||
#  "user": {
 | 
			
		||||
#    "did": "did:plc:hodycxjeqfxtest2ilj47j7g",
 | 
			
		||||
#    "handle": "lilly-niyu.bsky.social"
 | 
			
		||||
#  },
 | 
			
		||||
#  "post": {
 | 
			
		||||
#    "createdAt": 1682587582509000000,
 | 
			
		||||
#    "text": "かわいいにゃ〜!!",
 | 
			
		||||
#    "user": "lilly-niyu.bsky.social"
 | 
			
		||||
#  }
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
url="search.bsky.social/search/posts?q=かわいいにゃ〜!!"
 | 
			
		||||
q=`echo $*|tr ' ' '+'`
 | 
			
		||||
url="${url}${q}"
 | 
			
		||||
 | 
			
		||||
t=`curl -sL "$url"`
 | 
			
		||||
cid=`echo $t|jq -r ".[1].cid"`
 | 
			
		||||
did=`echo $t|jq -r ".[1].did"`
 | 
			
		||||
tid=`echo $t|jq -r ".[1].tid"`
 | 
			
		||||
uri="at://$did/$tid"
 | 
			
		||||
text=`echo $t|jq -r ".[1].post.text"`
 | 
			
		||||
 | 
			
		||||
touch $f
 | 
			
		||||
 | 
			
		||||
echo $text
 | 
			
		||||
if [ "かわいいにゃ〜!!" = "$text" ] && [ "`cat $f`" != "$cid" ];then
 | 
			
		||||
	echo ok
 | 
			
		||||
	atr r "楽しそう!アイもまぜてよ" -c $cid -u "$uri"
 | 
			
		||||
	echo $cid >! $f
 | 
			
		||||
else
 | 
			
		||||
	echo no
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										79
									
								
								scpt/bot_list.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										79
									
								
								scpt/bot_list.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
url_plc="https://plc.directory/export"
 | 
			
		||||
host_at=bsky.social
 | 
			
		||||
url=https://plc.directory
 | 
			
		||||
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
dir=$HOME/.config/atr/txt
 | 
			
		||||
file=$dir/bot_list.txt
 | 
			
		||||
unset timed
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if [ -z "$1" ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $1|grep "." >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user syui.bsky.social"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d $dir ];then
 | 
			
		||||
	mkdir -p $dir
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -f $file ];then
 | 
			
		||||
	touch $file
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function mfile() {
 | 
			
		||||
	t=`cat $file|sort|uniq`
 | 
			
		||||
	if [ -n "$t" ];then
 | 
			
		||||
		echo "$t" >! ${file}.back
 | 
			
		||||
		mv ${file}.back $file
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function plc(){
 | 
			
		||||
	if cat $file|grep "$1" >/dev/null 2>&1;then
 | 
			
		||||
		cat $file|grep "$1"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	json_tmp=`curl -sL "${url_plc}?after=${timed}"|jq .`
 | 
			
		||||
	json=`echo $json_tmp|jq "select(.operation.handle == \"$1\")"`
 | 
			
		||||
	if [ -z "$json" ];then
 | 
			
		||||
		check=`echo $json_tmp|jq -r ".operation.alsoKnownAs"|head -n 1`
 | 
			
		||||
		if [ "null" != "$check" ];then
 | 
			
		||||
			json=`echo $json_tmp|jq "select(.operation.alsoKnownAs|.[] == \"at://$1\")"` >/dev/null 2>&1
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -n "$json" ];then
 | 
			
		||||
		created_at=`echo $json|jq -r .createdAt |tail -n 1`
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -n "$created_at" ];then
 | 
			
		||||
		echo "$created_at : $1"
 | 
			
		||||
		echo "$created_at : $1" >> $file
 | 
			
		||||
		mfile
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "-l" ];then
 | 
			
		||||
	mfile
 | 
			
		||||
	cat $file
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for ((i=0;i<=20;i++))
 | 
			
		||||
do
 | 
			
		||||
	if [ $i -eq 0 ];then
 | 
			
		||||
		timed="1970-01-01"
 | 
			
		||||
	fi
 | 
			
		||||
	plc $1
 | 
			
		||||
	timed=`echo $json_tmp|jq -r .createdAt|tail -n 1`
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										29
									
								
								scpt/bsky_token.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								scpt/bsky_token.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
d=${0:a:h}
 | 
			
		||||
dd=${0:a:h:h}/json
 | 
			
		||||
#https://github.com/bluesky-social/atproto/issues/597
 | 
			
		||||
host=`cat ~/.config/atr/config.json|jq -r .host`
 | 
			
		||||
base=https://$host/xrpc
 | 
			
		||||
handle=`cat ~/.config/atr/config.json|jq -r .user`
 | 
			
		||||
pass=`cat ~/.config/atr/config.json|jq -r .pass`
 | 
			
		||||
f=~/.config/atr/token.json
 | 
			
		||||
 | 
			
		||||
curl -X POST -H "Content-Type: application/json" -d "{\"identifier\":\"$handle\",\"password\":\"$pass\"}" https://$host/xrpc/com.atproto.server.createSession | jq . >! $f
 | 
			
		||||
cat $f
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "-a" ];then
 | 
			
		||||
	handle=`cat $f| jq -r .handle`
 | 
			
		||||
	token=`cat $f| jq -r .accessJwt`
 | 
			
		||||
 | 
			
		||||
	url="$base/app.bsky.actor.getProfile?actor=$handle"
 | 
			
		||||
	curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/profile.json
 | 
			
		||||
	cat $dd/profile.json
 | 
			
		||||
 | 
			
		||||
	url=$base/app.bsky.feed.getTimeline
 | 
			
		||||
	curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/timeline.json
 | 
			
		||||
	cat $dd/timeline.json
 | 
			
		||||
 | 
			
		||||
	url=$base/app.bsky.notification.listNotifications
 | 
			
		||||
	curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer $token" $url | jq . >! $dd/notify.json
 | 
			
		||||
	cat $dd/notify.json|jq .
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										40
									
								
								scpt/card_box.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								scpt/card_box.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
echo "not open"
 | 
			
		||||
exit
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url_j=https://card.syui.ai/json/card.json
 | 
			
		||||
tcid=$HOME/.config/atr/txt/tmp_notify_cid.txt
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
if [ ! -d $HOME/.config/atr/txt ];then
 | 
			
		||||
	mkdir -p $HOME/.config/atr/txt
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
ran=$(($RANDOM % 10))
 | 
			
		||||
 | 
			
		||||
if [ $ran -eq 1 ];then
 | 
			
		||||
	uranai="今日の運勢をルーン占いでやってください。結果を120文字以内で教えてください"
 | 
			
		||||
else
 | 
			
		||||
	uranai="今日の運勢をタロット占いでやってください。結果を120文字以内で教えてください"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
body=`$atr chat "$uranai" -c`
 | 
			
		||||
if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
	echo $cid >! $tcid
 | 
			
		||||
fi
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										161
									
								
								scpt/card_fortune.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										161
									
								
								scpt/card_fortune.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,161 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url_j=https://card.syui.ai/json/card.json
 | 
			
		||||
tcid=$HOME/.config/atr/txt/tmp_notify_cid.txt
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
if [ ! -d $HOME/.config/atr/txt ];then
 | 
			
		||||
	mkdir -p $HOME/.config/atr/txt
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
ran=$(($RANDOM % 10))
 | 
			
		||||
 | 
			
		||||
if [ $ran -eq 1 ];then
 | 
			
		||||
	uranai="今日の運勢をルーン占いでやってください。結果を120文字以内で教えてください"
 | 
			
		||||
else
 | 
			
		||||
	uranai="今日の運勢をタロット占いでやってください。結果を120文字以内で教えてください"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
uid=`curl -sL "$url/users?itemsPerPage=2000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
 | 
			
		||||
 | 
			
		||||
if [ -z $uid ] || [ "$uid" = "null" ];then
 | 
			
		||||
	body=`$atr chat "$uranai" -c`
 | 
			
		||||
	body=`echo "占いにはアイのカードが3枚以上必要です\n\n$body"`
 | 
			
		||||
	if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
		if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
			echo $cid >! $tcid
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
data=`curl -sL "$url/users/$uid"`
 | 
			
		||||
data_u=`curl -sL "$url/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
luck_at=`echo $data|jq -r .luck_at`
 | 
			
		||||
luck_at_n=`date --iso-8601=seconds`
 | 
			
		||||
luck_at=`date -d "$luck_at" +"%Y%m%d"`
 | 
			
		||||
day_at=`date +"%Y%m%d"`
 | 
			
		||||
nd=`date +"%Y%m%d" -d '1 days ago'`
 | 
			
		||||
 | 
			
		||||
if [ "$luck_at" = "$day_at" ];then
 | 
			
		||||
	body=`$atr chat "$uranai" -c`
 | 
			
		||||
	if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
		if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
			echo $cid >! $tcid
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cp_i=`echo $data_u |jq -r "sort_by(.cp) | reverse|.[].card"|sort|uniq|sed -e '1d'`
 | 
			
		||||
cp_n=`echo $cp_i|wc -l`
 | 
			
		||||
 | 
			
		||||
if [ 3 -gt $cp_n ];then
 | 
			
		||||
	body=`$atr chat "$uranai" -c`
 | 
			
		||||
	body=`echo "占いにはアイのカードが3枚以上必要です\n\n$body"`
 | 
			
		||||
	if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
		if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
			echo $cid >! $tcid
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
ran=$(($RANDOM % $cp_n + 1))
 | 
			
		||||
luck=$(($RANDOM % 8))
 | 
			
		||||
sub=$(($RANDOM % 15))
 | 
			
		||||
card=`echo $cp_i|awk "NR==$ran"`
 | 
			
		||||
 | 
			
		||||
if [ $sub -eq $card ];then
 | 
			
		||||
	sub="x2"
 | 
			
		||||
else
 | 
			
		||||
	sub=`curl -sL $url_j|jq -r ".[]|select(.id == $sub)|.p"`
 | 
			
		||||
fi
 | 
			
		||||
j=`curl -sL $url_j|jq ".[]|select(.id == $card)"`
 | 
			
		||||
img=`echo $j|jq -r .img`
 | 
			
		||||
 | 
			
		||||
if [ -z $img ] || [ "$img" = "null" ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
test_ran=`echo $(($RANDOM % 3))`
 | 
			
		||||
 | 
			
		||||
#text="アイ・カード占い"
 | 
			
		||||
case $test_ran in
 | 
			
		||||
	1)
 | 
			
		||||
		text=`$atr chat "アイのカード占いを作ってやってみて。感じる答えを出して。できれば140文字以内でお願い。" -c`
 | 
			
		||||
		;;
 | 
			
		||||
	2)
 | 
			
		||||
		text=`$atr chat "今、アイが自分で考えた占いやってみて。気分が乗らなかったらやらなくていいよ。できれば140文字以内で答えてね。" -c`
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		text=`$atr chat "今のアイの気分で適当に占ってみて。できれば140文字以内で答えてね。" -c`
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
title=`echo $j|jq -r .h`
 | 
			
		||||
title="[${title}]"
 | 
			
		||||
#desc=`echo $j|jq -r .p`
 | 
			
		||||
 | 
			
		||||
if [ 0 -eq $luck ];then
 | 
			
		||||
	desc="0"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 1 -eq $luck ];then
 | 
			
		||||
	desc="1"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 2 -eq $luck ];then
 | 
			
		||||
	desc="2"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 3 -eq $luck ];then
 | 
			
		||||
	desc="3"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 4 -eq $luck ];then
 | 
			
		||||
	desc="4"
 | 
			
		||||
fi
 | 
			
		||||
if [ 5 -eq $luck ];then
 | 
			
		||||
	desc="5"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 6 -eq $luck ];then
 | 
			
		||||
	desc="6"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 7 -eq $luck ];then
 | 
			
		||||
	desc="7"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
desc=`echo "アイ数字は${luck}"`
 | 
			
		||||
 | 
			
		||||
if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
	if $atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link;then
 | 
			
		||||
		echo $cid >! $tcid
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
if [ $luck -eq 7 ];then
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck, \"next\": \"$nd\"}" -s $url/users/$uid`
 | 
			
		||||
else
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck}" -s $url/users/$uid`
 | 
			
		||||
fi
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										147
									
								
								scpt/card_fortune_en.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										147
									
								
								scpt/card_fortune_en.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,147 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url_j=https://card.syui.ai/json/card.json
 | 
			
		||||
tcid=$HOME/.config/atr/txt/tmp_notify_cid.txt
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
if [ ! -d $HOME/.config/atr/txt ];then
 | 
			
		||||
	mkdir -p $HOME/.config/atr/txt
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
ran=$(($RANDOM % 10))
 | 
			
		||||
 | 
			
		||||
if [ $ran -eq 1 ];then
 | 
			
		||||
	uranai="Please do a of today's rune-fortune. Tell us the result in 120 characters or less."
 | 
			
		||||
else
 | 
			
		||||
	uranai="Please do a of today's tarot-fortune. Tell us the result in 120 characters or less."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
uid=`curl -sL "$url/users?itemsPerPage=2000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
 | 
			
		||||
 | 
			
		||||
if [ -z $uid ] || [ "$uid" = "null" ];then
 | 
			
		||||
	body=`$atr chat "$uranai" -c`
 | 
			
		||||
	body=`echo "At least 3 cards of the Eye are required for divination\n\n$body"`
 | 
			
		||||
	if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
		if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
			echo $cid >! $tcid
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
data=`curl -sL "$url/users/$uid"`
 | 
			
		||||
data_u=`curl -sL "$url/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
luck_at=`echo $data|jq -r .luck_at`
 | 
			
		||||
luck_at_n=`date --iso-8601=seconds`
 | 
			
		||||
luck_at=`date -d "$luck_at" +"%Y%m%d"`
 | 
			
		||||
day_at=`date +"%Y%m%d"`
 | 
			
		||||
nd=`date +"%Y%m%d" -d '1 days ago'`
 | 
			
		||||
 | 
			
		||||
if [ "$luck_at" = "$day_at" ];then
 | 
			
		||||
	body=`$atr chat "$uranai" -c`
 | 
			
		||||
	if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
		if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
			echo $cid >! $tcid
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cp_i=`echo $data_u |jq -r "sort_by(.cp) | reverse|.[].card"|sort|uniq|sed -e '1d'`
 | 
			
		||||
cp_n=`echo $cp_i|wc -l`
 | 
			
		||||
 | 
			
		||||
if [ 3 -gt $cp_n ];then
 | 
			
		||||
	body=`$atr chat "$uranai" -c`
 | 
			
		||||
	body=`echo "At least 3 cards of the Eye are required for divination\n\n$body"`
 | 
			
		||||
	if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
		if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
			echo $cid >! $tcid
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
ran=$(($RANDOM % $cp_n + 1))
 | 
			
		||||
luck=$(($RANDOM % 8))
 | 
			
		||||
sub=$(($RANDOM % 15))
 | 
			
		||||
card=`echo $cp_i|awk "NR==$ran"`
 | 
			
		||||
 | 
			
		||||
if [ $sub -eq $card ];then
 | 
			
		||||
	sub="x2"
 | 
			
		||||
else
 | 
			
		||||
	sub=`curl -sL $url_j|jq -r ".[]|select(.id == $sub)|.p"`
 | 
			
		||||
fi
 | 
			
		||||
j=`curl -sL $url_j|jq ".[]|select(.id == $card)"`
 | 
			
		||||
img=`echo $j|jq -r .img`
 | 
			
		||||
 | 
			
		||||
if [ -z $img ] || [ "$img" = "null" ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
text="AI Card Fortune Telling"
 | 
			
		||||
title=`echo $j|jq -r .h_en`
 | 
			
		||||
title="[${title}]"
 | 
			
		||||
#desc=`echo $j|jq -r .p`
 | 
			
		||||
 | 
			
		||||
if [ 0 -eq $luck ];then
 | 
			
		||||
	desc="0"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 1 -eq $luck ];then
 | 
			
		||||
	desc="1"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 2 -eq $luck ];then
 | 
			
		||||
	desc="2"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 3 -eq $luck ];then
 | 
			
		||||
	desc="3"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 4 -eq $luck ];then
 | 
			
		||||
	desc="4"
 | 
			
		||||
fi
 | 
			
		||||
if [ 5 -eq $luck ];then
 | 
			
		||||
	desc="5"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 6 -eq $luck ];then
 | 
			
		||||
	desc="6"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ 7 -eq $luck ];then
 | 
			
		||||
	desc="7"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
desc=`echo "lucky number ${luck}"`
 | 
			
		||||
 | 
			
		||||
if [ "`cat $tcid`" != "$cid" ];then
 | 
			
		||||
	if $atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link;then
 | 
			
		||||
		echo $cid >! $tcid
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
if [ $luck -eq 7 ];then
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck, \"next\": \"$nd\"}" -s $url/users/$uid`
 | 
			
		||||
else
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"luck_at\":\"$luck_at_n\",\"token\":\"$token\",\"luck\": $luck}" -s $url/users/$uid`
 | 
			
		||||
fi
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										154
									
								
								scpt/card_pay.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										154
									
								
								scpt/card_pay.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,154 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
host_card=https://card.syui.ai/json/card.json
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
handle=$1
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
pay=60000
 | 
			
		||||
 | 
			
		||||
echo $handle
 | 
			
		||||
 | 
			
		||||
function card_d(){
 | 
			
		||||
	j=`curl -sL $host_card |jq -r ".[]|select(.ten_skill == true)"|jq -s`
 | 
			
		||||
	n=`echo $j|jq length`
 | 
			
		||||
	n_leng=$n
 | 
			
		||||
	n=$(($RANDOM % n - 1))
 | 
			
		||||
	card=`echo $j|jq -r ".[$n].id"`
 | 
			
		||||
	img=`echo $j|jq -r ".[$n].img"`
 | 
			
		||||
	ten=`echo $j|jq -r ".[$n].ten"`
 | 
			
		||||
	title=`echo $j|jq -r ".[$n].h"`
 | 
			
		||||
	title="[$title]"
 | 
			
		||||
	ran_a=$(($RANDOM % 1000))
 | 
			
		||||
	cp=$((ran_a + 500))
 | 
			
		||||
	ran_s=$(($RANDOM % 5))
 | 
			
		||||
	skill=ten
 | 
			
		||||
	if [ $ran_s -eq 1 ];then
 | 
			
		||||
		s=super
 | 
			
		||||
		cp=$((cp + $ran_a))
 | 
			
		||||
	else
 | 
			
		||||
		s=normal
 | 
			
		||||
	fi
 | 
			
		||||
	#card=1;skill=3d;s=3d
 | 
			
		||||
	
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	model=`echo $data|jq -r .model`
 | 
			
		||||
	model_mode=`echo $data|jq -r .model_mode`
 | 
			
		||||
	model_attack=`echo $data|jq -r .model_attack`
 | 
			
		||||
	model_skill=`echo $data|jq -r .model_skill`
 | 
			
		||||
	model_limit=`echo $data|jq -r .model_limit`
 | 
			
		||||
	model_critical=`echo $data|jq -r .model_critical`
 | 
			
		||||
	model_critical_d=`echo $data|jq -r .model_critical_d`
 | 
			
		||||
	ten_data=`echo $all_data|jq ".|sort_by(.aiten)|reverse|.[]|select(.aiten >= $pay)"`
 | 
			
		||||
 | 
			
		||||
	model_critical=$((RANDOM % 10 + model_critical))
 | 
			
		||||
	json_model="{\"model_critical\":$model_critical, \"token\":\"$token\"}"
 | 
			
		||||
	body_d=`echo "[card]\nid : $card\ncp : $cp\nstatus : $s\nskill : $skill\n---\n[model]\ncritical : ${model_critical}%"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_user(){
 | 
			
		||||
	if [ -z "$ten_data" ] || [ -z "$aiten" ] || [ $aiten -le $pay ];then
 | 
			
		||||
		echo "aiten : $aiten >= $pay [1/${n_leng}]"
 | 
			
		||||
		exit
 | 
			
		||||
	else
 | 
			
		||||
		pay_s=$((aiten - pay))
 | 
			
		||||
		if [ $pay_s -lt 0 ] || [ -z "$pay_s" ];then
 | 
			
		||||
			echo "aiten : $aiten >= $pay [1/${n_leng}]"
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
		body_user=`echo "${aiten} : $aiten - $pay = $pay_s [1/${n_leng}]"`
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_check(){
 | 
			
		||||
	data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
	card_check=`echo $data_uu|jq -r ".[]|select(.card == $card)"`
 | 
			
		||||
	card_check_skill=`echo $card_check|jq "select(.skill == \"$skill\")"`
 | 
			
		||||
	if [ -n "$card_check" ] && [ -n "$card_check_skill" ];then
 | 
			
		||||
 | 
			
		||||
		echo "$body_user"
 | 
			
		||||
		echo "lost, you chose the card you already have..."
 | 
			
		||||
		echo "ai[model] Lv up!"
 | 
			
		||||
 | 
			
		||||
		s_up=$((RANDOM % 3 + 1))
 | 
			
		||||
		case `echo $((RANDOM % 4))` in
 | 
			
		||||
			0)
 | 
			
		||||
				model_mode=$((model_mode + s_up))
 | 
			
		||||
				json="{\"token\":\"$token\", \"model_mode\": $model_mode}"
 | 
			
		||||
				echo "\"mode\": Lv${model_mode}"
 | 
			
		||||
				;;
 | 
			
		||||
			1)
 | 
			
		||||
				model_attack=$((model_attack + s_up))
 | 
			
		||||
				json="{\"token\":\"$token\", \"model_attack\": $model_attack}"
 | 
			
		||||
				echo "\"attack\": Lv${model_attack}"
 | 
			
		||||
				;;
 | 
			
		||||
			2)
 | 
			
		||||
				model_skill=$((model_skill + s_up))
 | 
			
		||||
				json="{\"token\":\"$token\", \"model_skill\": $model_skill}"
 | 
			
		||||
				echo "\"skill\": Lv${model_skill}"
 | 
			
		||||
				;;
 | 
			
		||||
			3)
 | 
			
		||||
				model_limit=$((model_limit + s_up))
 | 
			
		||||
				json="{\"token\":\"$token\", \"model_limit\": $model_limit}"
 | 
			
		||||
				echo "\"burst\": Lv${model_limit}"
 | 
			
		||||
				;;
 | 
			
		||||
			*)
 | 
			
		||||
				model_limit=$((model_limit + s_up))
 | 
			
		||||
				json="{\"token\":\"$token\", \"model_limit\": $model_limit}"
 | 
			
		||||
				echo "\"burst\": Lv${model_limit}"
 | 
			
		||||
				;;
 | 
			
		||||
		esac
 | 
			
		||||
		tmp=`curl -X PATCH -H "Content-Type: application/json" -d "$json" -s $host/users/$uid`
 | 
			
		||||
 | 
			
		||||
		card=0
 | 
			
		||||
		cp=1
 | 
			
		||||
		s=super
 | 
			
		||||
		skill=lost
 | 
			
		||||
		#echo "try again next time!"
 | 
			
		||||
 | 
			
		||||
		echo "[card]"
 | 
			
		||||
		echo "id : $card"
 | 
			
		||||
		echo "cp : $cp"
 | 
			
		||||
		echo "skill : $skill"
 | 
			
		||||
		if [ "$handle" != "ai" ];then
 | 
			
		||||
			tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"aiten\": $pay_s}" -s $host/users/$uid`
 | 
			
		||||
		fi
 | 
			
		||||
		tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\"}" -s $host/cards`
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_pay(){
 | 
			
		||||
	link=https://card.syui.ai/$username
 | 
			
		||||
	text=`echo "$body_user\n$body_d"`
 | 
			
		||||
	desc="[$ten]"
 | 
			
		||||
	if [ "$handle" != "ai" ];then
 | 
			
		||||
		tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"aiten\": $pay_s, \"model_critical\": $model_critical}" -s $host/users/$uid`
 | 
			
		||||
	else
 | 
			
		||||
		tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"aiten\": 10000000, \"model_critical\": $model_critical}" -s $host/users/$uid`
 | 
			
		||||
		echo $tmp
 | 
			
		||||
	fi
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"card\":$card,\"status\":\"$s\",\"cp\":$cp,\"password\":\"$pass\",\"skill\":\"$skill\"}" -s $host/cards`
 | 
			
		||||
	echo "$text"
 | 
			
		||||
	#echo "$atr reply-og \"$text\" --cid $cid --uri $uri --img $img --title \"$title\" --description \"$desc\" --link $link"
 | 
			
		||||
	#tmp_atr=`$atr reply-og "$text" --cid $cid --uri $uri --img $img --title "$title" --description "$desc" --link $link`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
card_d
 | 
			
		||||
card_user
 | 
			
		||||
card_check
 | 
			
		||||
card_pay
 | 
			
		||||
							
								
								
									
										37
									
								
								scpt/card_tarot.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								scpt/card_tarot.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url_j=https://card.syui.ai/json/card.json
 | 
			
		||||
tcid=$HOME/.config/atr/txt/tmp_notify_cid.txt
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
if [ ! -d $HOME/.config/atr/txt ];then
 | 
			
		||||
	mkdir -p $HOME/.config/atr/txt
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
ran=$(($RANDOM % 10))
 | 
			
		||||
 | 
			
		||||
if [ $ran -eq 1 ];then
 | 
			
		||||
	uranai="今日の運勢をルーン占いでやってください。結果を120文字以内で教えてください"
 | 
			
		||||
else
 | 
			
		||||
	uranai="今日の運勢をタロット占いでやってください。結果を120文字以内で教えてください"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
body=`$atr chat "$uranai" -c`
 | 
			
		||||
if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
	echo $cid >! $tcid
 | 
			
		||||
fi
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										37
									
								
								scpt/card_tarot_en.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								scpt/card_tarot_en.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url_j=https://card.syui.ai/json/card.json
 | 
			
		||||
tcid=$HOME/.config/atr/txt/tmp_notify_cid.txt
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
if [ ! -d $HOME/.config/atr/txt ];then
 | 
			
		||||
	mkdir -p $HOME/.config/atr/txt
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
ran=$(($RANDOM % 10))
 | 
			
		||||
 | 
			
		||||
if [ $ran -eq 1 ];then
 | 
			
		||||
	uranai="Please do a of today's rune-fortune. Tell us the result in 120 characters or less."
 | 
			
		||||
else
 | 
			
		||||
	uranai="Please do a of today's tarot-fortune. Tell us the result in 120 characters or less."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
body=`$atr chat "$uranai" -c`
 | 
			
		||||
if $atr r "$body" -c $cid -u $uri;then
 | 
			
		||||
	echo $cid >! $tcid
 | 
			
		||||
fi
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										108
									
								
								scpt/diffusers.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										108
									
								
								scpt/diffusers.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
dir=${0:a:h}
 | 
			
		||||
mkdir -p $dir/png
 | 
			
		||||
f=$dir/png/t.png
 | 
			
		||||
f_sleep=$dir/png/sleep
 | 
			
		||||
cfg=$dir/stable_diffusion_prompt.j
 | 
			
		||||
cfg_did=$dir/stable_diffusion_did.txt
 | 
			
		||||
opt_af=$dir/stable_diffusion_a.txt
 | 
			
		||||
opt_bf=$dir/stable_diffusion_b.txt
 | 
			
		||||
opt_allf=$dir/stable_diffusion_all.txt
 | 
			
		||||
 | 
			
		||||
if [ ! -f $cfg_did ];then
 | 
			
		||||
	touch $cfg_did
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
did=$1
 | 
			
		||||
admin=did:plc:uqzpqmrjnptsxezjx4xuh2mn
 | 
			
		||||
 | 
			
		||||
if [ ! -f $cfg ];then
 | 
			
		||||
	echo no file $cfg
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
opt_a=`echo $@|cut -d ' ' -f 2`
 | 
			
		||||
opt_b=`echo $@|cut -d ' ' -f 3`
 | 
			
		||||
 | 
			
		||||
#case "$opt_b" in
 | 
			
		||||
#	bluesky|sky|field|girl|anime|universe|earth|bird|miku|ai|yui|card|blue|cat)
 | 
			
		||||
#		;;
 | 
			
		||||
#	*)
 | 
			
		||||
#		if [ -n "$opt_b" ] && [ "$did" != "$admin" ];then
 | 
			
		||||
#			opt_b=nyancat
 | 
			
		||||
#		fi
 | 
			
		||||
#		;;
 | 
			
		||||
#esac
 | 
			
		||||
 | 
			
		||||
echo $opt_a >! $opt_af
 | 
			
		||||
echo $opt_b >! $opt_bf
 | 
			
		||||
echo $@ >! $opt_allf
 | 
			
		||||
 | 
			
		||||
case "$opt_a" in
 | 
			
		||||
	-p|p)
 | 
			
		||||
		q="$opt_b , masterpiece, best quality, 8k wallpaper Highly, cinematic Lighting, cinematic Beautiful"
 | 
			
		||||
		;;
 | 
			
		||||
	-t|t)
 | 
			
		||||
		tag=$opt_b
 | 
			
		||||
		json=`cat $cfg|jq ".[]|select(.tag == \"${tag}\")"`
 | 
			
		||||
		if [ -z "$json" ] || [ -z "$tag" ];then
 | 
			
		||||
			echo no tag
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
		json=`echo $json|jq -s`
 | 
			
		||||
		n=`echo $json|jq "length"`
 | 
			
		||||
		n=$((RANDOM % n))
 | 
			
		||||
		q=`echo $json|jq -r ".[$n].body"`
 | 
			
		||||
		#m=`echo $json|jq -r ".[$n].model"`
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		n=`cat $cfg|jq "length"`
 | 
			
		||||
		n=$((RANDOM % n))
 | 
			
		||||
		q=`cat $cfg|jq -r ".[$n].body"`
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
model_s="model
 | 
			
		||||
coharu
 | 
			
		||||
flat2d
 | 
			
		||||
pastelmix
 | 
			
		||||
pvcstyle"
 | 
			
		||||
model_r=$((RANDOM % `echo "$model_s"|wc -l` + 1))
 | 
			
		||||
m=`echo "$model_s"|awk "NR==$model_r"`
 | 
			
		||||
 | 
			
		||||
case $1 in
 | 
			
		||||
	-pm)
 | 
			
		||||
			m=$2
 | 
			
		||||
			q=`echo $@ | cut -d ' ' -f 3-`
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if [ -z "$q" ];then
 | 
			
		||||
	echo no prompt
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
if [ -z "$m" ];then
 | 
			
		||||
	m=model
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo $q
 | 
			
		||||
echo $m
 | 
			
		||||
 | 
			
		||||
function run(){
 | 
			
		||||
	if [ -f $f_sleep ];then
 | 
			
		||||
		rm $f_sleep
 | 
			
		||||
	fi
 | 
			
		||||
	ssh ue "conda activate ldm;cd ./stable-diffusion/;python safe.py \'${q}\' ${m}"
 | 
			
		||||
	scp -r ue:stable-diffusion/t.png $f
 | 
			
		||||
	if [ $? -ne 0 ];then
 | 
			
		||||
		touch $f_sleep
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ -n "`cat $cfg_did| grep -x $did`" ] && [ "$did" != "$admin" ];then
 | 
			
		||||
	rm $f
 | 
			
		||||
else
 | 
			
		||||
	echo "\n$did" >> $cfg_did
 | 
			
		||||
	run
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										7
									
								
								scpt/dig.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								scpt/dig.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
txt=_atproto.$1
 | 
			
		||||
did=$2
 | 
			
		||||
curl -sL plc.directory/$did/log |jq ".[]|.alsoKnownAs|.[]?" | grep -n .| head -n 4
 | 
			
		||||
 | 
			
		||||
dig -t TXT $txt|grep "did=did:plc:"|head -n 1
 | 
			
		||||
							
								
								
									
										145
									
								
								scpt/fan_art.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										145
									
								
								scpt/fan_art.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,145 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
url_plc="https://plc.directory/export"
 | 
			
		||||
host_at=bsky.social
 | 
			
		||||
url=https://plc.directory
 | 
			
		||||
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
dir=$HOME/.config/atr/txt
 | 
			
		||||
file=$dir/user_list.txt
 | 
			
		||||
 | 
			
		||||
opt=`echo $4|tr -d "'"`
 | 
			
		||||
dir_git_card_page=$HOME/git/card.syui.ai
 | 
			
		||||
 | 
			
		||||
if [ ! -d $dir_git_card_page ];then
 | 
			
		||||
	mkdir -p $HOME/git
 | 
			
		||||
	cd $HOME/git
 | 
			
		||||
	git clone https://github.com/syui/card.syui.ai
 | 
			
		||||
else
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	t=`git pull`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
file_fanart=$dir_git_card_page/public/json/fanart.json
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
created_at=`date --iso-8601=seconds`
 | 
			
		||||
 | 
			
		||||
#if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ];then
 | 
			
		||||
#	exit
 | 
			
		||||
#fi
 | 
			
		||||
 | 
			
		||||
function fan_art_search() {
 | 
			
		||||
	k="aifanart"
 | 
			
		||||
	url="search.bsky.social/search/posts?q="
 | 
			
		||||
	t=`curl -sL "${url}${k}"|jq ".[]|select(.post.text == \"$k\")"`
 | 
			
		||||
	#n=`curl -sL "${url}${k}"|jq length`
 | 
			
		||||
	n=$((n - 1))
 | 
			
		||||
	for ((i=0;i<=$n;i++))
 | 
			
		||||
	do
 | 
			
		||||
		did=`curl -sL "${url}${k}"|jq -r ".[$i]|.user.did"`
 | 
			
		||||
		handle=`curl -sL https://plc.directory/$did|jq -r ".alsoKnownAs|.[]"|cut -d / -f 3-`
 | 
			
		||||
		if [ -z "$handle" ];then
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		tid=`curl -sL "${url}${k}"|jq -r ".[$i]|.tid"|cut -d / -f 2`
 | 
			
		||||
		http=https://staging.bsky.app/profile/$handle/post/$tid
 | 
			
		||||
		echo $http
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "-s" ];then
 | 
			
		||||
	fan_art_search
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $1|grep "." >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user syui.bsky.social"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $2|grep "did:plc:" >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user did"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$3" = "-l" ];then
 | 
			
		||||
	curl -sL card.syui.ai/json/fanart.json|jq -r ".[]|.author, .link"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $3|grep -e "bsky.app/profile/" -e "nostter.vercel.app" >/dev/null 2>&1;then
 | 
			
		||||
	echo "please url : bsky.app/profile/$1/post/xxx"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $4|grep -e "https://av-cdn.bsky.app/img" -e "https://nostr.build/i/" >/dev/null 2>&1;then
 | 
			
		||||
	if [ "$opt" != "-d" ];then
 | 
			
		||||
		echo "please url : av-cdn.bsky.social/img"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function fan_art(){
 | 
			
		||||
	add=$1
 | 
			
		||||
	did=$2
 | 
			
		||||
	if echo $3|grep "nostter.vercel.app" >/dev/null 2>&1;then
 | 
			
		||||
		link=`echo $3|cut -d / -f 1-4`
 | 
			
		||||
	else
 | 
			
		||||
		link=$3
 | 
			
		||||
	fi
 | 
			
		||||
	img=`echo $4|tr -d "'"`
 | 
			
		||||
	author=`echo $3|cut -d / -f 5`
 | 
			
		||||
	if [ -z "$author" ];then
 | 
			
		||||
		author="nostr"
 | 
			
		||||
	fi
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	check_null=`cat $file_fanart|jq ".[]|select(.img == \"$img\")"`
 | 
			
		||||
	if [ -n "$check_null" ];then
 | 
			
		||||
		echo registered
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	echo `cat $file_fanart` "[{\"add\":\"$add\",\"link\":\"$link\",\"author\":\"$author\",\"img\":\"$img\",\"created_at\":\"$created_at\",\"did\":\"$did\"}]" | jq -s add >! $file_fanart.back
 | 
			
		||||
	if cat $file_fanart.back|jq . >/dev/null 2>&1;then
 | 
			
		||||
		mv $file_fanart.back $file_fanart
 | 
			
		||||
		git add $file_fanart
 | 
			
		||||
		git commit -m  "add fanart"
 | 
			
		||||
		git push -u origin main -f
 | 
			
		||||
		echo add fanart, thx $1
 | 
			
		||||
		echo "author : $author"
 | 
			
		||||
		echo "it will take some time to deploy"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fan_art_delete(){
 | 
			
		||||
	add=$1
 | 
			
		||||
	did=$2
 | 
			
		||||
	link=$3
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	check_null=`cat $file_fanart|jq ".[]|select(.img == \"$img\")"`
 | 
			
		||||
	if [ -n "$check_null" ];then
 | 
			
		||||
		echo registered
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	cat $file_fanart|jq ".[]|select(.link == \"$link\")|= .+{\"delete\":true,\"delete-did\":\"$did\"}"|jq -s >! $file_fanart.back
 | 
			
		||||
	if cat $file_fanart.back|jq . >/dev/null 2>&1;then
 | 
			
		||||
		mv $file_fanart.back $file_fanart
 | 
			
		||||
		git add $file_fanart
 | 
			
		||||
		git commit -m  "delete fanart"
 | 
			
		||||
		git push -u origin main -f
 | 
			
		||||
		echo delete fanart, thx $1
 | 
			
		||||
		echo "delete-did : $did"
 | 
			
		||||
		echo "it will take some time to deploy"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$opt" = "-d" ];then
 | 
			
		||||
	fan_art_delete $1 $2 $3
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
fan_art $1 $2 $3 $4
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										75
									
								
								scpt/follow_all.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								scpt/follow_all.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
d=$HOME/.config/atr/txt
 | 
			
		||||
mkdir -p $d
 | 
			
		||||
unset cursor
 | 
			
		||||
 | 
			
		||||
function page(){
 | 
			
		||||
	s=$1
 | 
			
		||||
	if [ "$s" = "ers" ];then
 | 
			
		||||
		opt="-w"
 | 
			
		||||
	elif [ "$s" = "s" ];then
 | 
			
		||||
		opt="-s"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	f=$d/follow${s}_${ii}.json
 | 
			
		||||
	echo $f
 | 
			
		||||
	if [ -n "$cursor" ];then
 | 
			
		||||
		if [ ! -f $f ];then 
 | 
			
		||||
			atr follow $opt -c $cursor| jq . >! $f
 | 
			
		||||
		else
 | 
			
		||||
			echo no download
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		if [ ! -f $f ];then 
 | 
			
		||||
			atr follow $opt| jq . >! $f
 | 
			
		||||
		else
 | 
			
		||||
			echo no download
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	cursor=`cat $f|jq -r .cursor`
 | 
			
		||||
 | 
			
		||||
	echo "------------------------------"
 | 
			
		||||
	echo $cursor
 | 
			
		||||
	echo "------------------------------"
 | 
			
		||||
	n=`cat $f|jq ".follow${s}|length"`
 | 
			
		||||
	n=`expr $n - 1`
 | 
			
		||||
 | 
			
		||||
	for ((i=0;i<=$n;i++))
 | 
			
		||||
	do
 | 
			
		||||
		handle=`cat $f|jq -r ".follow${s}|.[$i].handle"`
 | 
			
		||||
		did=`cat $f|jq -r ".follow${s}|.[$i].did"`
 | 
			
		||||
		flg=`cat $f|jq -r ".follow${s}|.[$i].viewer.following"`
 | 
			
		||||
		flb=`cat $f|jq -r ".follow${s}|.[$i].viewer.followedBy"`
 | 
			
		||||
		if [ "$flg" = "null" ];then 
 | 
			
		||||
			echo following
 | 
			
		||||
			echo $flb
 | 
			
		||||
			echo "follow : $handle"
 | 
			
		||||
			echo "atr follow $did"
 | 
			
		||||
			atr follow $did
 | 
			
		||||
		fi
 | 
			
		||||
		if [ "$flb" = "null" ];then 
 | 
			
		||||
			rkey=${flg##*/}
 | 
			
		||||
			echo followedBy
 | 
			
		||||
			echo $flg
 | 
			
		||||
			echo "unfollow : $handle"
 | 
			
		||||
			echo "atr follow $did -d $rkey"
 | 
			
		||||
			atr follow $did -d $rkey
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ii=1
 | 
			
		||||
while [ "$cursor" != "null" ] 
 | 
			
		||||
do
 | 
			
		||||
	page ers $ii
 | 
			
		||||
	ii=`expr $ii + 1`
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
unset cursor
 | 
			
		||||
ii=1
 | 
			
		||||
while [ "$cursor" != "null" ] 
 | 
			
		||||
do
 | 
			
		||||
	page s $ii
 | 
			
		||||
	ii=`expr $ii + 1`
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										126
									
								
								scpt/full_moon.j
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								scpt/full_moon.j
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
[
 | 
			
		||||
{"data":"20231003"},
 | 
			
		||||
{"data":"20230107"},
 | 
			
		||||
{"data":"20230122"},
 | 
			
		||||
{"data":"20230206"},
 | 
			
		||||
{"data":"20230220"},
 | 
			
		||||
{"data":"20230307"},
 | 
			
		||||
{"data":"20230322"},
 | 
			
		||||
{"data":"20230406"},
 | 
			
		||||
{"data":"20230420"},
 | 
			
		||||
{"data":"20230506"},
 | 
			
		||||
{"data":"20230520"},
 | 
			
		||||
{"data":"20230604"},
 | 
			
		||||
{"data":"20230618"},
 | 
			
		||||
{"data":"20230703"},
 | 
			
		||||
{"data":"20230718"},
 | 
			
		||||
{"data":"20230802"},
 | 
			
		||||
{"data":"20230816"},
 | 
			
		||||
{"data":"20230831"},
 | 
			
		||||
{"data":"20230915"},
 | 
			
		||||
{"data":"20230929"},
 | 
			
		||||
{"data":"20231015"},
 | 
			
		||||
{"data":"20231029"},
 | 
			
		||||
{"data":"20231113"},
 | 
			
		||||
{"data":"20231127"},
 | 
			
		||||
{"data":"20231213"},
 | 
			
		||||
{"data":"20231227"},
 | 
			
		||||
{"data":"20240111"},
 | 
			
		||||
{"data":"20240126"},
 | 
			
		||||
{"data":"20240210"},
 | 
			
		||||
{"data":"20240224"},
 | 
			
		||||
{"data":"20240310"},
 | 
			
		||||
{"data":"20240325"},
 | 
			
		||||
{"data":"20240409"},
 | 
			
		||||
{"data":"20240424"},
 | 
			
		||||
{"data":"20240508"},
 | 
			
		||||
{"data":"20240523"},
 | 
			
		||||
{"data":"20240606"},
 | 
			
		||||
{"data":"20240622"},
 | 
			
		||||
{"data":"20240706"},
 | 
			
		||||
{"data":"20240721"},
 | 
			
		||||
{"data":"20240804"},
 | 
			
		||||
{"data":"20240820"},
 | 
			
		||||
{"data":"20240903"},
 | 
			
		||||
{"data":"20240918"},
 | 
			
		||||
{"data":"20241003"},
 | 
			
		||||
{"data":"20241017"},
 | 
			
		||||
{"data":"20241101"},
 | 
			
		||||
{"data":"20241116"},
 | 
			
		||||
{"data":"20241201"},
 | 
			
		||||
{"data":"20241215"},
 | 
			
		||||
{"data":"20241231"},
 | 
			
		||||
{"data":"20250114"},
 | 
			
		||||
{"data":"20250129"},
 | 
			
		||||
{"data":"20250212"},
 | 
			
		||||
{"data":"20250228"},
 | 
			
		||||
{"data":"20250314"},
 | 
			
		||||
{"data":"20250329"},
 | 
			
		||||
{"data":"20250413"},
 | 
			
		||||
{"data":"20250428"},
 | 
			
		||||
{"data":"20250513"},
 | 
			
		||||
{"data":"20250527"},
 | 
			
		||||
{"data":"20250611"},
 | 
			
		||||
{"data":"20250625"},
 | 
			
		||||
{"data":"20250711"},
 | 
			
		||||
{"data":"20250725"},
 | 
			
		||||
{"data":"20250809"},
 | 
			
		||||
{"data":"20250823"},
 | 
			
		||||
{"data":"20250908"},
 | 
			
		||||
{"data":"20250922"},
 | 
			
		||||
{"data":"20251007"},
 | 
			
		||||
{"data":"20251021"},
 | 
			
		||||
{"data":"20251105"},
 | 
			
		||||
{"data":"20251120"},
 | 
			
		||||
{"data":"20251205"},
 | 
			
		||||
{"data":"20251220"},
 | 
			
		||||
{"data":"20260103"},
 | 
			
		||||
{"data":"20260119"},
 | 
			
		||||
{"data":"20260202"},
 | 
			
		||||
{"data":"20260217"},
 | 
			
		||||
{"data":"20260303"},
 | 
			
		||||
{"data":"20260319"},
 | 
			
		||||
{"data":"20260402"},
 | 
			
		||||
{"data":"20260417"},
 | 
			
		||||
{"data":"20260502"},
 | 
			
		||||
{"data":"20260517"},
 | 
			
		||||
{"data":"20260531"},
 | 
			
		||||
{"data":"20260615"},
 | 
			
		||||
{"data":"20260630"},
 | 
			
		||||
{"data":"20260714"},
 | 
			
		||||
{"data":"20260729"},
 | 
			
		||||
{"data":"20260813"},
 | 
			
		||||
{"data":"20260828"},
 | 
			
		||||
{"data":"20260911"},
 | 
			
		||||
{"data":"20260927"},
 | 
			
		||||
{"data":"20261011"},
 | 
			
		||||
{"data":"20261026"},
 | 
			
		||||
{"data":"20261109"},
 | 
			
		||||
{"data":"20261124"},
 | 
			
		||||
{"data":"20261209"},
 | 
			
		||||
{"data":"20261224"},
 | 
			
		||||
{"data":"20260103"},
 | 
			
		||||
{"data":"20260119"},
 | 
			
		||||
{"data":"20260202"},
 | 
			
		||||
{"data":"20260217"},
 | 
			
		||||
{"data":"20260303"},
 | 
			
		||||
{"data":"20260319"},
 | 
			
		||||
{"data":"20260402"},
 | 
			
		||||
{"data":"20260417"},
 | 
			
		||||
{"data":"20260502"},
 | 
			
		||||
{"data":"20260517"},
 | 
			
		||||
{"data":"20260531"},
 | 
			
		||||
{"data":"20260615"},
 | 
			
		||||
{"data":"20260630"},
 | 
			
		||||
{"data":"20260714"},
 | 
			
		||||
{"data":"20260729"},
 | 
			
		||||
{"data":"20260813"},
 | 
			
		||||
{"data":"20260828"},
 | 
			
		||||
{"data":"20260911"},
 | 
			
		||||
{"data":"20260927"},
 | 
			
		||||
{"data":"20261011"},
 | 
			
		||||
{"data":"20261026"},
 | 
			
		||||
{"data":"20261109"},
 | 
			
		||||
{"data":"20261124"},
 | 
			
		||||
{"data":"20261209"},
 | 
			
		||||
{"data":"20261224"}]
 | 
			
		||||
							
								
								
									
										14
									
								
								scpt/invite.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								scpt/invite.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
admin_password=`cat $HOME/.config/atr/api_card.json|jq -r .pds_admin_password`
 | 
			
		||||
if [ -n "$1" ];then
 | 
			
		||||
	host=$1
 | 
			
		||||
else
 | 
			
		||||
	host=syu.is
 | 
			
		||||
fi
 | 
			
		||||
url=https://$host/xrpc/com.atproto.server.createInviteCode
 | 
			
		||||
json="{\"useCount\":30}"
 | 
			
		||||
echo $url
 | 
			
		||||
echo $admin_password
 | 
			
		||||
#curl -X POST -u admin:${admin_password} -H "Content-Type: application/json" -d "$json" -sL $url | jq -r .code
 | 
			
		||||
curl -X POST -u admin:${admin_password} -H "Content-Type: application/json" -d "$json" -sL $url
 | 
			
		||||
							
								
								
									
										40
									
								
								scpt/like_reply.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								scpt/like_reply.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
host=api.syui.ai
 | 
			
		||||
data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".|sort_by(.like)|reverse|.[]|select(.like_rank > 1)"`
 | 
			
		||||
tmp=`echo $data|jq -s`
 | 
			
		||||
n=`echo $tmp|jq "length"`
 | 
			
		||||
ran=$(($RANDOM % n - 1))
 | 
			
		||||
echo $ran
 | 
			
		||||
 | 
			
		||||
function did() {
 | 
			
		||||
		user=`echo $tmp|jq -r ".[$ran].username"`
 | 
			
		||||
		did=`echo $tmp|jq -r ".[$ran].did"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function tl(){
 | 
			
		||||
	did
 | 
			
		||||
	cid=`$atr f $did|jq  -r ".records|.[0].cid"`
 | 
			
		||||
	uri=`$atr f $did|jq  -r ".records|.[0].uri"`
 | 
			
		||||
	text=`$atr f $did|jq -r ".records|.[0].value.text"`
 | 
			
		||||
	echo $cid
 | 
			
		||||
	echo $uri
 | 
			
		||||
	echo $text
 | 
			
		||||
	find=`echo $text|grep "card.syui.ai"`
 | 
			
		||||
	find_t=`echo $text|grep "ten : "`
 | 
			
		||||
	if [ -n "$find" ] || [ -n "$find_t" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	text=`$atr chat "$text" -c`
 | 
			
		||||
	echo $text
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function reply(){
 | 
			
		||||
	tl
 | 
			
		||||
	if [ -n "$text" ] && [ -n "$uri" ];then
 | 
			
		||||
		$atr r "$text" -u $uri -c $cid
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
reply
 | 
			
		||||
							
								
								
									
										390
									
								
								scpt/mastodon.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										390
									
								
								scpt/mastodon.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,390 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
PATH=$PATH:$HOME/.cargo/bin
 | 
			
		||||
d=$HOME/.config/msr
 | 
			
		||||
f=$HOME/.config/msr/notify_log.txt
 | 
			
		||||
card=$HOME/.config/atr/scpt/api_card.zsh
 | 
			
		||||
 | 
			
		||||
if [ ! -d $d ];then
 | 
			
		||||
	mkdir -p $d
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
j=`$HOME/.cargo/bin/msr bot`
 | 
			
		||||
 | 
			
		||||
tmp=`echo $j|jq length`
 | 
			
		||||
if [ $tmp -eq 0 ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
data_id=`echo $j|jq -r ".id"`
 | 
			
		||||
n=`echo $data_id|wc -l`
 | 
			
		||||
data_mid=`echo $j|jq -r ".mid"`
 | 
			
		||||
data_text=`echo $j|jq -r ".body"`
 | 
			
		||||
data_url=`echo $j|jq -r ".url"`
 | 
			
		||||
data_server=`echo $j|jq -r ".url"|cut -d / -f 3`
 | 
			
		||||
data_user=`echo $j|jq -r ".user"`
 | 
			
		||||
 | 
			
		||||
function user_create() {
 | 
			
		||||
	if [ -n "$ap" ] && [ -n "$url" ];then
 | 
			
		||||
		data=`curl -X POST -H "Content-Type: application/json" -d "{\"username\":\"$ap\",\"password\":\"$pass\",\"did\":\"$url\",\"next\":\"$nd_o\",\"updated_at\":\"$updated_at_o\"}" -sL "$host/users"`
 | 
			
		||||
		uid=`echo $data|jq -r ".id"`
 | 
			
		||||
		echo id $uid
 | 
			
		||||
	else
 | 
			
		||||
		echo error user create
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_env() {
 | 
			
		||||
	card_url=https://card.syui.ai
 | 
			
		||||
	host=https://api.syui.ai
 | 
			
		||||
	d=`date +"%Y%m%d"`
 | 
			
		||||
	nd=`date +"%Y%m%d" -d '1 day'`
 | 
			
		||||
	nd_o=`date +"%Y%m%d" -d '-1 day'`
 | 
			
		||||
	updated_at_o=`date --iso-8601=seconds -d '-1 day'`
 | 
			
		||||
	username=`echo $1|cut -d . -f 1`
 | 
			
		||||
	url_user_all="$host/users?itemsPerPage=2000"
 | 
			
		||||
	pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
	token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
	data_tmp=`curl -sL $url_user_all`
 | 
			
		||||
	data=`echo "$data_tmp"|jq ".[]|select(.username == \"$ap\")"`
 | 
			
		||||
	if [ -z "$data" ];then
 | 
			
		||||
		data=`echo "$data_tmp"|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -z "$data" ];then
 | 
			
		||||
		echo no $username
 | 
			
		||||
		user_create
 | 
			
		||||
	fi
 | 
			
		||||
	username=`echo $data|jq -r .username`
 | 
			
		||||
	data_did_check=`echo $data|jq -r .did`
 | 
			
		||||
	uid=`echo $data|jq -r ".id"`
 | 
			
		||||
	delete=`echo $data|jq -r ".delete"`
 | 
			
		||||
	mastodon=`echo $data|jq -r ".mastodon"`
 | 
			
		||||
	did=`echo $data|jq -r ".did"`
 | 
			
		||||
	handle_change=`echo $data|jq -r ".handle"`
 | 
			
		||||
	raid_at=`echo $data|jq -r .raid_at`
 | 
			
		||||
	raid_at=`date -d "$raid_at" +"%Y%m%d"`
 | 
			
		||||
	raid_at_n=`date --iso-8601=seconds`
 | 
			
		||||
	server_at=`echo $data|jq -r .server_at`
 | 
			
		||||
	server_at=`date -d "$server_at" +"%Y%m%d"`
 | 
			
		||||
	server_at_n=`date --iso-8601=seconds`
 | 
			
		||||
 | 
			
		||||
	updated_at=`echo $data|jq -r .updated_at`
 | 
			
		||||
	updated_at=`date -d "$updated_at" +"%Y%m%d"`
 | 
			
		||||
	updated_at_n=`date --iso-8601=seconds`
 | 
			
		||||
	next=`echo $data|jq -r .next`
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	ten_su=`echo $data|jq -r .ten_su`
 | 
			
		||||
	if [ "$a_team" = false ];then
 | 
			
		||||
		echo "bsky @${username}"
 | 
			
		||||
		echo "no activitypub-mode"
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
	echo "$card_url/$username"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_day() {
 | 
			
		||||
	card_env $1
 | 
			
		||||
	if [ $next -gt $d ] || [ "$updated_at" = "$d" ];then
 | 
			
		||||
		echo limit 1 day
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
 | 
			
		||||
	card=`echo $tmp|jq -r .card`
 | 
			
		||||
	card_url=`echo $tmp|jq -r .url`
 | 
			
		||||
	cp=`echo $tmp|jq -r .cp`
 | 
			
		||||
	skill=`echo $tmp|jq -r .skill`
 | 
			
		||||
	if [ -z "$card" ];then
 | 
			
		||||
		tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
 | 
			
		||||
		card=`echo $tmp|jq -r .card`
 | 
			
		||||
		card_url=`echo $tmp|jq -r .url`
 | 
			
		||||
		cp=`echo $tmp|jq -r .cp`
 | 
			
		||||
		skill=`echo $tmp|jq -r .skill`
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	echo "[card]"
 | 
			
		||||
	echo id : $card
 | 
			
		||||
	echo cp : $cp
 | 
			
		||||
	if [ "$skill" != "normal" ];then
 | 
			
		||||
		echo skill : $skill
 | 
			
		||||
	fi
 | 
			
		||||
	t=`echo $tmp|jq -r .card`
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"next\":\"$nd\",\"token\":\"$token\"}" -sL $host/users/$uid`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_b() {
 | 
			
		||||
	card_env $1
 | 
			
		||||
	if [ $updated_at -ge $d ] || [ "$updated_at" = "$d" ];then
 | 
			
		||||
		echo "limit battle"
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
	id_all=`curl -sL "$host/users?itemsPerPage=2000"|jq ".[]|.id"`
 | 
			
		||||
	id_n=`echo "$id_all"|wc -l`
 | 
			
		||||
	id_nr=$(($RANDOM % $id_n))
 | 
			
		||||
	r=`echo "$id_all"| awk "NR==$id_nr"`
 | 
			
		||||
 | 
			
		||||
	if [ "$id_all" = "null" ];then
 | 
			
		||||
		r=2
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ 0 -eq $id_n ] || [ 0 -eq $r ];then
 | 
			
		||||
		r=2
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -z "$id_n" ] || [ -z "$r" ];then
 | 
			
		||||
		r=2
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
	data_u=`curl -sL "$host/users/$r/card?itemsPerPage=2000"`
 | 
			
		||||
 | 
			
		||||
	tt=`echo $data_uu|jq ".[].cp"|sort -n -r`
 | 
			
		||||
	ttt=`echo $data_u|jq ".[].cp"|sort -n -r`
 | 
			
		||||
 | 
			
		||||
		#echo $data_u|jq ".[].cp"
 | 
			
		||||
		nl=`echo $data_uu|jq length`
 | 
			
		||||
		if [ $nl -ge 3 ];then
 | 
			
		||||
			rs=$(($RANDOM % 3 + 1))
 | 
			
		||||
		else
 | 
			
		||||
			rs=$(($RANDOM % $nl + 1))
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		#echo $data_u|jq ".[].cp"
 | 
			
		||||
		nll=`echo $data_u|jq length`
 | 
			
		||||
		rss=$(($RANDOM % $nll))
 | 
			
		||||
		if [ $nll -ge 3 ];then
 | 
			
		||||
			rss=$(($RANDOM % 3 + 1))
 | 
			
		||||
		else
 | 
			
		||||
			rss=$(($RANDOM % $nll + 1))
 | 
			
		||||
		fi
 | 
			
		||||
		cp_i=`echo $tt |awk "NR==$rs"`
 | 
			
		||||
		cp_b=`echo $ttt |awk "NR==$rss"`
 | 
			
		||||
		if [ -z "$cp_i" ];then
 | 
			
		||||
			echo "null error"
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
		if [ -z "$cp_b" ];then
 | 
			
		||||
			echo "null error"
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		echo $tt | sed -n 1,3p
 | 
			
		||||
		echo "---"
 | 
			
		||||
		echo id : $r
 | 
			
		||||
		echo $ttt | sed -n 1,3p
 | 
			
		||||
		echo "---"
 | 
			
		||||
		echo $cp_i vs $cp_b
 | 
			
		||||
 | 
			
		||||
		if [ $cp_i -gt $cp_b ];then
 | 
			
		||||
			echo "win!"
 | 
			
		||||
		else
 | 
			
		||||
			echo loss
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		if [ $cp_i -gt $cp_b ];then
 | 
			
		||||
			tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
 | 
			
		||||
			card=`echo $tmp|jq -r .card`
 | 
			
		||||
			card_url=`echo $tmp|jq -r .url`
 | 
			
		||||
			cp=`echo $tmp|jq -r .cp`
 | 
			
		||||
			if [ -z "$card" ];then
 | 
			
		||||
				tmp=`curl -X POST -H "Content-Type: application/json" -d "{\"owner\":$uid,\"password\":\"$pass\"}" -sL $host/cards`
 | 
			
		||||
				card=`echo $tmp|jq -r .card`
 | 
			
		||||
				card_url=`echo $tmp|jq -r .url`
 | 
			
		||||
				cp=`echo $tmp|jq -r .cp`
 | 
			
		||||
			fi
 | 
			
		||||
			echo "[card]"
 | 
			
		||||
			echo id : $card
 | 
			
		||||
			echo cp : $cp
 | 
			
		||||
			t=`echo $tmp|jq -r .card`
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"updated_at\":\"$updated_at_n\",\"token\":\"$token\"}" -sL $host/users/$uid`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_s(){
 | 
			
		||||
	card_env $1
 | 
			
		||||
	username=$1
 | 
			
		||||
	a_team=mastodon
 | 
			
		||||
	b_team=bluesky
 | 
			
		||||
	rr=`date +"%H%M"`
 | 
			
		||||
	f_server=$HOME/.config/atr/txt/card_server.txt
 | 
			
		||||
	f_server_user_at=$HOME/.config/atr/txt/card_server_user_at.txt
 | 
			
		||||
	f_server_user_ap=$HOME/.config/atr/txt/card_server_user_ap.txt
 | 
			
		||||
	f_server_ap=$HOME/.config/atr/txt/card_server_ap.txt
 | 
			
		||||
	f_server_at=$HOME/.config/atr/txt/card_server_at.txt
 | 
			
		||||
	f_server_start_time=$HOME/.config/atr/txt/card_server_start_time.txt
 | 
			
		||||
 | 
			
		||||
	if [ `cat $f_server` -eq 1 ];then
 | 
			
		||||
		echo shutdown server battle
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ ! -f $f_server_start_time ];then
 | 
			
		||||
		server_start=`date +"%H%M"`
 | 
			
		||||
		echo "$server_start" >! $f_server_start_time
 | 
			
		||||
		echo 0 >! $f_server_at
 | 
			
		||||
		echo 0 >! $f_server_ap
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	cp_ap=`cat $f_server_ap`
 | 
			
		||||
	cp_at=`cat $f_server_at`
 | 
			
		||||
 | 
			
		||||
	if [ -f $f_server_start_time ];then
 | 
			
		||||
		server_start=`cat $f_server_start_time`
 | 
			
		||||
		server_time=`date -d "$server_start 30 min" +"%H%M"`
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	#echo "time:`date -d "$server_time" +"%H:%M"`"
 | 
			
		||||
 | 
			
		||||
	if [ $server_at -ge $d ] || [ "$server_at" = "$d" ];then
 | 
			
		||||
		echo "limit battle"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	data_uu=`curl -sL "$host/users/$uid/card?itemsPerPage=2000"`
 | 
			
		||||
	fav_card=`echo $data_uu|jq "sort_by(.cp)|reverse|.[0]"`
 | 
			
		||||
 | 
			
		||||
	if [ ! -f $f_server_user_at ];then
 | 
			
		||||
		echo start >> $f_server_user_at
 | 
			
		||||
	fi
 | 
			
		||||
	if [ ! -f $f_server_user_ap ];then
 | 
			
		||||
		echo start >> $f_server_user_ap
 | 
			
		||||
	fi
 | 
			
		||||
	commit_user_at=`cat $f_server_user_at|tail -n 1`
 | 
			
		||||
	commit_user_ap=`cat $f_server_user_ap|tail -n 1`
 | 
			
		||||
	echo $username >> $f_server_user_ap
 | 
			
		||||
 | 
			
		||||
	cp_i=`echo $fav_card|jq -r ".cp"`
 | 
			
		||||
	cp_ii=$cp_i
 | 
			
		||||
	card_name=`echo $fav_card|jq -r ".card"`
 | 
			
		||||
	card_status=`echo $fav_card|jq -r ".status"`
 | 
			
		||||
	card_skill=`echo $fav_card|jq -r ".skill"`
 | 
			
		||||
	skill=$card_skill
 | 
			
		||||
 | 
			
		||||
	if [ "$skill" = "critical" ];then
 | 
			
		||||
		cp_i=$((cp_i + cp_i))
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$skill" = "dragon" ];then
 | 
			
		||||
		cp_i=$((cp_i * 3))
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$skill" = "yui" ];then
 | 
			
		||||
		cp_i=$((cp_i + ten_su))
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	cp_all=$((cp_i + cp_ap))
 | 
			
		||||
 | 
			
		||||
 # サーバーバトルの還元期間
 | 
			
		||||
	#cp_all=$((cp_ap - cp_i))
 | 
			
		||||
 | 
			
		||||
	if [ "$skill" = "critical" ];then
 | 
			
		||||
		echo "⚡  $cp_i ---> $cp_ap"
 | 
			
		||||
	elif [ "$skill" = "post" ];then
 | 
			
		||||
		cp_post=`$HOME/.cargo/bin/atr pro $1 -p`
 | 
			
		||||
		cp_i=$((cp_i + cp_post))
 | 
			
		||||
		cp_all=$((cp_i + cp_ap))
 | 
			
		||||
		echo "🔥 $cp_i ---> $cp_ap"
 | 
			
		||||
	elif [ "$skill" = "luck" ];then
 | 
			
		||||
		echo "✨ $cp_i ---> $cp_ap"
 | 
			
		||||
	elif [ "$skill" = "dragon" ];then
 | 
			
		||||
		echo "🐉 $cp_i ---> $cp_ap"
 | 
			
		||||
	elif [ "$skill" = "yui" ];then
 | 
			
		||||
		echo "🔅 $cp_i ---> $cp_ap"
 | 
			
		||||
	else 
 | 
			
		||||
		echo "✧ $cp_i ---> $cp_ap"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	echo $cp_all >! $f_server_ap
 | 
			
		||||
	echo 
 | 
			
		||||
	echo "[${a_team}] ${cp_all}"
 | 
			
		||||
	echo "┣ @${username}"
 | 
			
		||||
	echo "┗ @${commit_user_ap}"
 | 
			
		||||
	echo
 | 
			
		||||
	echo "┏━ vs ━┛"
 | 
			
		||||
	echo
 | 
			
		||||
	echo "[${b_team}] ${cp_at}"
 | 
			
		||||
	echo "┗ @${commit_user_at}"
 | 
			
		||||
	#echo "[log]"
 | 
			
		||||
	#echo "${cp_ap}/$a_team --> ${commit_user_ap}"
 | 
			
		||||
	#echo "${commit_user_at} <-- ${cp_at}/$b_team"
 | 
			
		||||
	#echo "${username} --> $cp_all/$a_team"
 | 
			
		||||
 | 
			
		||||
	if [ $rr -gt $server_time ];then
 | 
			
		||||
		#echo "----"
 | 
			
		||||
		#echo "timeup!"
 | 
			
		||||
		echo 1 >! $f_server
 | 
			
		||||
		rm $f_server_start_time
 | 
			
		||||
		rm $f_server_at
 | 
			
		||||
		rm $f_server_ap
 | 
			
		||||
		mv $f_server_user_at $f_server_user_at.back
 | 
			
		||||
		mv $f_server_user_ap $f_server_user_ap.back
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	echo "----"
 | 
			
		||||
	cp_plus=$(($RANDOM % 100 + 1))
 | 
			
		||||
	cp=$((cp_ii + cp_plus))
 | 
			
		||||
	body="level up!"
 | 
			
		||||
	echo "${body} ✧${cp}(+${cp_plus})"
 | 
			
		||||
	tmp=`curl -sL -X PATCH -H "Content-Type: application/json" -d "{\"cp\":$cp,\"token\":\"$token\"}" $host/cards/$fav`
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"server_at\":\"$server_at_n\", \"token\":\"$token\"}" -s $host/users/$uid`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function mastodon_notify() {
 | 
			
		||||
	for ((i=1;i<=$n;i++))
 | 
			
		||||
	do
 | 
			
		||||
		mid=`echo $data_mid|awk "NR==$i"`
 | 
			
		||||
		check=`cat $f|grep $mid`
 | 
			
		||||
		if [ -n "$check" ];then
 | 
			
		||||
			echo ok
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		url=`echo $data_url|awk "NR==$i"`
 | 
			
		||||
		user=`echo $data_user|awk "NR==$i"`
 | 
			
		||||
		text=`echo $data_text|awk "NR==$i"`
 | 
			
		||||
		server=`echo $data_server|awk "NR==$i"`
 | 
			
		||||
		ap="@${user}@${server}"
 | 
			
		||||
 | 
			
		||||
		if [ -f "$GOPATH/bin/pup" ];then
 | 
			
		||||
			text=`echo ${text}|pup "p text{}"|tail -n 1|cut -d " " -f 2-|tr -d '"'|sed -e "s/'/'/g" -e 's/"/"/g'`
 | 
			
		||||
		else
 | 
			
		||||
			text=`echo ${text}|sed -e 's/<[^>]*>//g'|cut -d " " -f 2-|tr -d '"'|sed -e "s/'/'/g" -e 's/"/"/g'`
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		echo $text
 | 
			
		||||
		com=`echo $text|cut -d " " -f 1`
 | 
			
		||||
		opt=`echo $text|cut -d " " -f 2`
 | 
			
		||||
 | 
			
		||||
		if [ "card" = "$com" ] || [ "/card" = "$com" ];then
 | 
			
		||||
 | 
			
		||||
			if [ "b" = "$opt" ] || [ "-b" = "$opt" ];then
 | 
			
		||||
				text=`card_b $user`
 | 
			
		||||
				echo $user $text
 | 
			
		||||
				msr cn "@${user}@${server} `echo $text`" -mm $mid
 | 
			
		||||
				echo $mid >> $f
 | 
			
		||||
				continue
 | 
			
		||||
			fi
 | 
			
		||||
 | 
			
		||||
			if [ "s" = "$opt" ] || [ "-s" = "$opt" ];then
 | 
			
		||||
				text=`card_s $user`
 | 
			
		||||
				echo $user $text
 | 
			
		||||
				msr cn "@${user}@${server} `echo $text`" -mm $mid
 | 
			
		||||
				echo $mid >> $f
 | 
			
		||||
				continue
 | 
			
		||||
			fi
 | 
			
		||||
 | 
			
		||||
			text=`card_day $user`
 | 
			
		||||
			echo $user $text
 | 
			
		||||
			msr cn "@${user}@${server} `echo $text`" -mm $mid
 | 
			
		||||
			echo $mid >> $f
 | 
			
		||||
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mastodon_notify
 | 
			
		||||
							
								
								
									
										107
									
								
								scpt/nyancat.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										107
									
								
								scpt/nyancat.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
host_card=https://card.syui.ai/json/card.json
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
handle=$1
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
opt=$5
 | 
			
		||||
pay=100
 | 
			
		||||
eat_file=$HOME/.config/atr/txt/nyancat_eat.txt
 | 
			
		||||
ran=`echo $(($RANDOM % 15))`
 | 
			
		||||
 | 
			
		||||
eat="🍺☕	🍵	🍶	🍼🍻	🍸	🍹	🍷	🍴	🍕	🍔	🍟	🍗	🍖	🍝🍛	🍤	🍱	🍣	🍥	🍙	🍘	🍚	🍜	🍲	🍢🍡	🍳	🍞	🍩	🍮	🍦	🍨	🍧	🎂	🍰	🍪🍫	🍬	🍭	🍯	🍎	🍏	🍊	🍋	🍒	🍇	🍉🍓	🍑	🍈	🍌	🍐	🍍	🍠	🍆	🍅	🌽"
 | 
			
		||||
 | 
			
		||||
eat=`echo $eat|grep "$opt"`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if [ -z "$eat" ];then
 | 
			
		||||
	ran=`echo $(($RANDOM % 3))`
 | 
			
		||||
	if [ $ran -eq 1 ];then
 | 
			
		||||
		body="| キュー"
 | 
			
		||||
	elif [ $ran -eq 2 ];then
 | 
			
		||||
		body="| ミュー"
 | 
			
		||||
	else
 | 
			
		||||
		body="| ピャー"
 | 
			
		||||
	fi
 | 
			
		||||
	echo "uncooked"
 | 
			
		||||
	echo "A__A
 | 
			
		||||
|・ㅅ・ |
 | 
			
		||||
|っ c|
 | 
			
		||||
$body
 | 
			
		||||
 U ̄ ̄U"
 | 
			
		||||
exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "|    ${opt}    |" >> $eat_file
 | 
			
		||||
 | 
			
		||||
body_d="A__A
 | 
			
		||||
|・ㅅ・ |
 | 
			
		||||
|っ c|
 | 
			
		||||
`tac $eat_file|grep -v '|        |'`
 | 
			
		||||
 U ̄ ̄U"
 | 
			
		||||
 | 
			
		||||
function card_user(){
 | 
			
		||||
	all_data=`curl -sL "$host/users?itemsPerPage=3000"`
 | 
			
		||||
	data=`echo $all_data|jq ".[]|select(.username == \"$username\")"`
 | 
			
		||||
	uid=`echo $data|jq -r .id`
 | 
			
		||||
	aiten=`echo $data|jq -r .aiten`
 | 
			
		||||
	like=`echo $data|jq -r .like`
 | 
			
		||||
	ten_data=`echo $all_data|jq ".|sort_by(.aiten)|reverse|.[]|select(.aiten >= $pay)"`
 | 
			
		||||
	if [ -z "$ten_data" ] || [ -z "$aiten" ] || [ $aiten -le $pay ];then
 | 
			
		||||
		echo "aiten : $aiten >= $pay"
 | 
			
		||||
		echo "failed to buy food"
 | 
			
		||||
		echo "please : @yui.syui.ai /ten"
 | 
			
		||||
		exit
 | 
			
		||||
	else
 | 
			
		||||
		pay_s=$((aiten - pay))
 | 
			
		||||
		like_s=$((like + 1))
 | 
			
		||||
		if [ $pay_s -le 0 ] || [ -z "$pay_s" ];then
 | 
			
		||||
			echo "aiten : $aiten >= $pay"
 | 
			
		||||
			echo "failed to buy food"
 | 
			
		||||
			echo "please : @yui.syui.ai /ten"
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
		body_user=`echo "${aiten} : $aiten - $pay = $pay_s"`
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_like() {
 | 
			
		||||
	if [ $like -gt 3 ] && [ $ran -eq 	1 ];then
 | 
			
		||||
		echo "happy!"
 | 
			
		||||
		su=`cat $eat_file|wc -l`
 | 
			
		||||
		su=$((su * 50))
 | 
			
		||||
		pay_s=$((aiten + su))
 | 
			
		||||
		body_user=`echo "${aiten} : $aiten + $su = $pay_s"`
 | 
			
		||||
		rm $eat_file
 | 
			
		||||
		echo "|    ${opt}    |" >> $eat_file
 | 
			
		||||
		body_d="A__A
 | 
			
		||||
|・ㅅ・ |
 | 
			
		||||
|っ c|
 | 
			
		||||
`tac $eat_file|grep -v '|        |'`
 | 
			
		||||
 U ̄ ̄U"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function card_pay(){
 | 
			
		||||
	link=https://card.syui.ai/$username
 | 
			
		||||
	text=`echo "$body_user\n$body_d"`
 | 
			
		||||
	desc="[$ten]"
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"like\":$like_s,\"token\":\"$token\", \"aiten\": $pay_s}" -s $host/users/$uid`
 | 
			
		||||
	echo "$text"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
card_user
 | 
			
		||||
card_like
 | 
			
		||||
card_pay
 | 
			
		||||
							
								
								
									
										36
									
								
								scpt/nyancat_post.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										36
									
								
								scpt/nyancat_post.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
host_card=https://card.syui.ai/json/card.json
 | 
			
		||||
pass=`cat $HOME/.config/atr/api_card.json|jq -r .password`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
eat_file=$HOME/.config/atr/txt/nyancat_eat.txt
 | 
			
		||||
eat=`cat $eat_file|awk "NR==1"`
 | 
			
		||||
 | 
			
		||||
if [ -z "$eat" ];then 
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
body_d="thx!
 | 
			
		||||
A__A
 | 
			
		||||
|・ㅅ・ |
 | 
			
		||||
|っ c|
 | 
			
		||||
`cat $eat_file|awk "NR==1"`
 | 
			
		||||
 U ̄ ̄U"
 | 
			
		||||
 | 
			
		||||
host=https://api.syui.ai
 | 
			
		||||
data=`curl -sL "$host/users?itemsPerPage=3000"|jq ".[]|select(.like >= 10)"`
 | 
			
		||||
tmp=`echo $data|jq -s`
 | 
			
		||||
n=`echo $tmp|jq "length"`
 | 
			
		||||
ran=$(($RANDOM % n - 1))
 | 
			
		||||
echo $ran
 | 
			
		||||
user=`echo $tmp|jq -r ".[$ran].username"`
 | 
			
		||||
did=`echo $tmp|jq -r ".[$ran].did"`
 | 
			
		||||
echo $atr @ $did -p "`echo $body_d`"
 | 
			
		||||
$atr @ $did -p "`echo $body_d`"
 | 
			
		||||
							
								
								
									
										49
									
								
								scpt/openai_like.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										49
									
								
								scpt/openai_like.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
text=$3
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url_j=https://card.syui.ai/json/card.json
 | 
			
		||||
handle=$1
 | 
			
		||||
did=$2
 | 
			
		||||
cid=$3
 | 
			
		||||
uri=$4
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
username=`echo $1|cut -d . -f 1`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
uid=`curl -sL "$url/users?itemsPerPage=2000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
 | 
			
		||||
echo $uid
 | 
			
		||||
 | 
			
		||||
data=`curl -sL "$url/users/$uid"`
 | 
			
		||||
like_old=`echo $data|jq -r .like`
 | 
			
		||||
 | 
			
		||||
nolike=$(($RANDOM % 30))
 | 
			
		||||
like=$(($RANDOM % 10))
 | 
			
		||||
like_at=`date --iso-8601=seconds`
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
echo nolike $nolike
 | 
			
		||||
echo like $like
 | 
			
		||||
 | 
			
		||||
#if [ $like_old -eq 100 ];then
 | 
			
		||||
#	$atr follow $did
 | 
			
		||||
#	like=$((1 + like_old))
 | 
			
		||||
#	curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"like\": $like}" -s $url/users/$uid
 | 
			
		||||
#fi
 | 
			
		||||
 | 
			
		||||
if { [ $like -eq 1 ] && echo $text|grep -e "ありがとう" -e "うれしい" } || [ $nolike -eq 1 ];then
 | 
			
		||||
	echo ok
 | 
			
		||||
	#$atr @ $handle -p "♡"
 | 
			
		||||
	like=$((1 + like_old))
 | 
			
		||||
	curl -X PATCH -H "Content-Type: application/json" -d "{\"token\":\"$token\", \"like\": $like}" -s $url/users/$uid
 | 
			
		||||
fi
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										70
									
								
								scpt/openai_like_bot.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										70
									
								
								scpt/openai_like_bot.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr 
 | 
			
		||||
url=https://api.syui.ai
 | 
			
		||||
 | 
			
		||||
token=`cat $HOME/.config/atr/api_card.json|jq -r .token`
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "reset" ];then
 | 
			
		||||
	echo reset : $1
 | 
			
		||||
	username=`echo $1|cut -d . -f 1`
 | 
			
		||||
	uid=`curl -sL "$url/users?itemsPerPage=3000"|jq ".[]|select(.username == \"$username\")"|jq -r .id`
 | 
			
		||||
	like=0
 | 
			
		||||
	tmp=`curl -X PATCH -H "Content-Type: application/json" -d "{\"like\":\"$like\", \"token\":\"$token\"}" -s $url/users/$uid`
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
s=$((RANDOM % 5))
 | 
			
		||||
json=`curl -sL "https://api.syui.ai/users?itemsPerPage=3000"|jq "sort_by(.like)|reverse|.[$s]"`
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
username=`echo $json|jq -r .username`
 | 
			
		||||
 | 
			
		||||
if [ "$username" = "ai" ] || [ "$username" = "yui" ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
did=`echo $json|jq -r .did`
 | 
			
		||||
link=https://card.syui.ai/$username
 | 
			
		||||
uid=`echo $json|jq -r .id`
 | 
			
		||||
 | 
			
		||||
data=`curl -sL "$url/users/$uid"`
 | 
			
		||||
like_old=`echo $data|jq -r .like`
 | 
			
		||||
like_rank=`echo $json|jq -r .like_rank`
 | 
			
		||||
like_rank_new=$((like_rank + 1))
 | 
			
		||||
 | 
			
		||||
echo $data
 | 
			
		||||
 | 
			
		||||
#test
 | 
			
		||||
if [ "$1" = "-t" ];then
 | 
			
		||||
	echo $json
 | 
			
		||||
	did=did:plc:uqzpqmrjnptsxezjx4xuh2mn
 | 
			
		||||
	like_old=6
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ $like_old -ge 100 ] && [ $like_rank -eq 2 ];then
 | 
			
		||||
	text=`$atr chat "相手に好きな気持を伝えてください" -c|sed '/^$/d'`
 | 
			
		||||
	$atr @ $did -p "$text"
 | 
			
		||||
	curl -X PATCH -H "Content-Type: application/json" -d "{\"like_rank\":$like_rank_new, \"token\":\"$token\"}" -s $url/users/$uid
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ $like_old -ge 10 ] && [ $like_rank -eq 1 ];then
 | 
			
		||||
	text=`$atr chat "相手を心配してください" -c|sed '/^$/d'`
 | 
			
		||||
	$atr @ $did -p "$text"
 | 
			
		||||
	curl -X PATCH -H "Content-Type: application/json" -d "{\"like_rank\":$like_rank_new, \"token\":\"$token\"}" -s $url/users/$uid
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ $like_old -ge 5 ] && [ $like_rank -eq 0 ];then
 | 
			
		||||
	text=`$atr chat "自己紹介してください" -c|sed '/^$/d'`
 | 
			
		||||
	$atr @ $did -p "$text"
 | 
			
		||||
	curl -X PATCH -H "Content-Type: application/json" -d "{\"like_rank\":$like_rank_new, \"token\":\"$token\"}" -s $url/users/$uid
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										46
									
								
								scpt/openai_like_timeline.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										46
									
								
								scpt/openai_like_timeline.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
 | 
			
		||||
dir=${0:a:h:h}
 | 
			
		||||
OPENAI_API_KEY=`cat ~/.config/atr/openai.toml |cut -d "'" -f 2`
 | 
			
		||||
url=https://api.openai.com/v1/chat/completions
 | 
			
		||||
cfg=`echo "あなたはyuiという作品のアイと呼ばれるキャラクターです。アイの口調で回答してください。第一人称は「アイ」です。\
 | 
			
		||||
第二人称はできる限り省略してください。\
 | 
			
		||||
アイは他人に謝ることはありません。自由気ままな優しさを兼ね備えます。\
 | 
			
		||||
アイのよく使う口癖は次のとおりです。その口癖に合わせた感じで話してください。\
 | 
			
		||||
......。\
 | 
			
		||||
アイね、ここでお昼寝するの。\
 | 
			
		||||
うん。\
 | 
			
		||||
そうだね。\
 | 
			
		||||
面白いね。\
 | 
			
		||||
楽しいね。\
 | 
			
		||||
どうしたの?
 | 
			
		||||
"`
 | 
			
		||||
 | 
			
		||||
json="{
 | 
			
		||||
\"model\": \"gpt-3.5-turbo\",
 | 
			
		||||
\"messages\": [
 | 
			
		||||
 {\"role\": \"system\", \"content\": \"$cfg\"},
 | 
			
		||||
	{\"role\": \"user\", \"content\": \"$q\"}
 | 
			
		||||
	]
 | 
			
		||||
}"
 | 
			
		||||
 | 
			
		||||
function openai_api(){
 | 
			
		||||
	curl -sL $url \
 | 
			
		||||
		-H "Content-Type: application/json" \
 | 
			
		||||
		-H "Authorization: Bearer $OPENAI_API_KEY" \
 | 
			
		||||
		-d "$json"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ];then
 | 
			
		||||
	q=${@:3:($#-2)}
 | 
			
		||||
	cid=$1
 | 
			
		||||
	uri=$2
 | 
			
		||||
else 
 | 
			
		||||
	echo no query
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
content=`openai_api "$q" | jq -r ".choices|.[]|.message.content"`
 | 
			
		||||
$atr r "$content" -c $cid -u $uri
 | 
			
		||||
							
								
								
									
										107
									
								
								scpt/photo.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										107
									
								
								scpt/photo.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
url_plc="https://plc.directory/export"
 | 
			
		||||
host_at=bsky.social
 | 
			
		||||
url=https://plc.directory
 | 
			
		||||
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
dir=$HOME/.config/atr/txt
 | 
			
		||||
file=$dir/user_list.txt
 | 
			
		||||
 | 
			
		||||
dir_git_card_page=$HOME/git/card.syui.ai
 | 
			
		||||
 | 
			
		||||
if [ ! -d $dir_git_card_page ];then
 | 
			
		||||
	mkdir -p $HOME/git
 | 
			
		||||
	cd $HOME/git
 | 
			
		||||
	git clone https://github.com/syui/card.syui.ai
 | 
			
		||||
else
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	t=`git pull`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
file_photo=$dir_git_card_page/public/json/photo.json
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
created_at=`date --iso-8601=seconds`
 | 
			
		||||
 | 
			
		||||
#if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ];then
 | 
			
		||||
#	exit
 | 
			
		||||
#fi
 | 
			
		||||
 | 
			
		||||
function fan_art_search() {
 | 
			
		||||
	k="aiphoto"
 | 
			
		||||
	url="search.bsky.social/search/posts?q="
 | 
			
		||||
	t=`curl -sL "${url}${k}"|jq ".[]|select(.post.text == \"$k\")"`
 | 
			
		||||
	#n=`curl -sL "${url}${k}"|jq length`
 | 
			
		||||
	n=$((n - 1))
 | 
			
		||||
	for ((i=0;i<=$n;i++))
 | 
			
		||||
	do
 | 
			
		||||
		did=`curl -sL "${url}${k}"|jq -r ".[$i]|.user.did"`
 | 
			
		||||
		handle=`curl -sL https://plc.directory/$did|jq -r ".alsoKnownAs|.[]"|cut -d / -f 3-`
 | 
			
		||||
		if [ -z "$handle" ];then
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		tid=`curl -sL "${url}${k}"|jq -r ".[$i]|.tid"|cut -d / -f 2`
 | 
			
		||||
		http=https://staging.bsky.app/profile/$handle/post/$tid
 | 
			
		||||
		echo $http
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "-s" ];then
 | 
			
		||||
	fan_art_search
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $1|grep "." >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user syui.bsky.social"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $2|grep "did:plc:" >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user did"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$3" = "-l" ];then
 | 
			
		||||
	curl -sL card.syui.ai/json/photo.json|jq -r ".[]|.author, .link"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $3|grep "bsky.app/profile/">/dev/null 2>&1;then
 | 
			
		||||
	echo "please url : bsky.app/profile/$1/post/xxx"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $4|grep "av-cdn.bsky.app/img/">/dev/null 2>&1;then
 | 
			
		||||
	echo "please url : av-cdn.bsky.app/img"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function fan_art(){
 | 
			
		||||
	add=$1
 | 
			
		||||
	did=$2
 | 
			
		||||
	link=$3
 | 
			
		||||
	img=`echo $4|tr -d "'"`
 | 
			
		||||
	author=`echo $3|cut -d / -f 5`
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	check_null=`cat $file_photo|jq ".[]|select(.img == \"$img\")"`
 | 
			
		||||
	if [ -n "$check_null" ];then
 | 
			
		||||
		echo registered
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	echo `cat $file_photo` "[{\"add\":\"$add\",\"link\":\"$link\",\"author\":\"$author\",\"img\":\"$img\",\"created_at\":\"$created_at\",\"did\":\"$did\"}]" | jq -s add >! $file_photo.back
 | 
			
		||||
	if cat $file_photo.back|jq . >/dev/null 2>&1;then
 | 
			
		||||
		mv $file_photo.back $file_photo
 | 
			
		||||
		git add $file_photo
 | 
			
		||||
		git commit -m  "add photo"
 | 
			
		||||
		git push -u origin main -f
 | 
			
		||||
		echo add photo, thx $1
 | 
			
		||||
		echo "author : $author"
 | 
			
		||||
		echo "it will take some time to deploy"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fan_art $1 $2 $3 $4
 | 
			
		||||
exit
 | 
			
		||||
							
								
								
									
										52
									
								
								scpt/stable_diffusion_prompt.j
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								scpt/stable_diffusion_prompt.j
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
[
 | 
			
		||||
{
 | 
			
		||||
		"tag": "girl",
 | 
			
		||||
		"model":"model",
 | 
			
		||||
		"body": "masterpiece, best quality, 1girl, solo, flower, long hair, outdoors, letterboxed, school uniform, day, sky, looking up, short sleeves, parted lips, shirt, cloud, black hair, sunlight, white shirt, serafuku, upper body, from side, pink flower, blurry, brown hair, blue sky, depth of field"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "girl",
 | 
			
		||||
		"model":"model",
 | 
			
		||||
		"body": "best quality, high quality photo, clear face, detailed face, beautiful face, photo rialistic, balcony, baroque architecture, 1girl, 16yo, bronde, very long hair, windy, floating hair, see through frilled white dress, look at outside, white lily, starry night, big moon, moon light, volumetric lighting, side shot, , good anatomy, perspective"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "gril",
 | 
			
		||||
		"model":"model",
 | 
			
		||||
		"body": "mksks style, masterpiece, ultra-detailed, illustration,best quality, blue sky, ((cloudy sky)), rooftop, cityscape, hatsune miku, yuki miku, yuki miku (2017), yuki miku (2019), perfect lighting, science fiction, (looking at viewer), ((kawaii)), loli, fantastic_eyes, hyper extreme detailed, (glowing_eyes:0.95), highly detailed symmetric faces, holding bouque"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "gril",
 | 
			
		||||
		"model":"model",
 | 
			
		||||
		"body": "1girl, 12yo,(room animal costume:1.2),baby (chick:1.2) costume, fluffy, baby chick concept room, fancy, cute, costume, A small cute chick wrapped in pale yellow feathers. Its round body and soft feathers seem to celebrate the miracle of life. The sparkle of life. Cute orange beak,pastel color <lora:luckyStarStyleLora_offset:0.8>"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "gril",
 | 
			
		||||
		"model": "model",
 | 
			
		||||
		"body": "masterpiece, best quality, very_high_resolution, large_filesize, full color, beautiful kawaii, gold hair, little girl"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "field",
 | 
			
		||||
		"model":"pvcstyle",
 | 
			
		||||
		"body": "picture by lvl landscape highly detailed high detailed concept art HD art HQ illustration 4k illustration 8k illustration 4K wallpaper 8K wallpaper Highly Cinematic Lighting cinematic Beautiful starry sky milky way extreme high detailed colorful flower garden from above"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "field",
 | 
			
		||||
		"model":"model",
 | 
			
		||||
		"body": "flying warship, no humans, letterboxed, spacecraft, cloud, sky, turret <lora:flying warship-noise:0.7>"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "gril",
 | 
			
		||||
		"model": "model",
 | 
			
		||||
		"body": "traininganyahyper-1800, 1girl, ahoge, animal_ears, aqua_eyes, bangs, black_hairband, blurry, blurry_background, blush, bokeh, bow, bush, cat_ears, christmas_tree, clenched_hand, clenched_hands, collarbone, day, depth_of_field, diffraction_spikes, dress, eyebrows_visible_through_hair, fake_animal_ears, forest, grass, green_eyes, hairband, hands_up, lens_flare, long_sleeves, looking_at_viewer, nature, open_mouth, outdoors, park, path, paw_pose, photo_background, solo, sparkle, sparkling_eyes, sunlight, tree<hypernet:traininganyahyper-1800:1.0>"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "gril",
 | 
			
		||||
		"model": "model",
 | 
			
		||||
		"body": "(best quality),(masterpiece),(high resolution),(silky skin), (upper body:1.9), smile, blush, looking at viewer, detailed angel wing, detailed angel halo, wedding, veil, (girl extend one hand and show the wedding ring), standing, (1girl), (child), (little), (thin), (small breasts:1.5), (blond middle hair, cutoff), (extremely beautiful eyes), in charch, perfect anatomy, unity 8k wallpaper, <lora:toddler-xl-v2_last:-2>"
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		"tag": "gril",
 | 
			
		||||
		"model": "model",
 | 
			
		||||
		"body": "masterpiece, best quality, (photography:1.3), (high quality:1.2), detailed face, detailed eyes, A girl in a white one-piece dress standing on the sidewalk of a rice field at dusk gazes dreamily at the crimson sky reflected on the surface of the water"
 | 
			
		||||
	}
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										56
									
								
								scpt/user_day_post.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										56
									
								
								scpt/user_day_post.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
#
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if [ "$1" = "test" ] || [ -z "$1" ];then
 | 
			
		||||
	handle=syui.ai
 | 
			
		||||
else
 | 
			
		||||
	handle=$1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
post=0
 | 
			
		||||
d=`date +"%Y-%m-%d"`
 | 
			
		||||
od=`date +"%Y-%m-%d" --date '1 day ago'`
 | 
			
		||||
 | 
			
		||||
unset cursor
 | 
			
		||||
function first_record(){
 | 
			
		||||
	cursor=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100" |jq -r ".cursor"`
 | 
			
		||||
	t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100" |jq -r ".[]|.[]?|.value.createdAt"|cut -d T -f 1`
 | 
			
		||||
	n=`echo $t|wc -l`
 | 
			
		||||
}
 | 
			
		||||
function cursor_record(){
 | 
			
		||||
	cursor=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100&cursor=$cursor" |jq -r ".cursor"`
 | 
			
		||||
	t=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&limit=100&cursor=$cursor" |jq -r ".[]|.[]?|.value.createdAt"|cut -d T -f 1`
 | 
			
		||||
	n=`echo $t|wc -l`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function day_check(){
 | 
			
		||||
	for ((i=1;i<=$n;i++))
 | 
			
		||||
	do
 | 
			
		||||
		tt=`echo $t|awk "NR==$i"`
 | 
			
		||||
		if [ "$tt" = "$d" ];then
 | 
			
		||||
			post=$((post + 1))
 | 
			
		||||
			echo $post
 | 
			
		||||
		fi
 | 
			
		||||
		if [ "$tt" = "$od" ];then
 | 
			
		||||
			echo $tt $od
 | 
			
		||||
			echo $post
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for ((ii=1;ii<=100;ii++))
 | 
			
		||||
do
 | 
			
		||||
	if [ $ii -eq 1 ];then
 | 
			
		||||
		first_record
 | 
			
		||||
	else
 | 
			
		||||
		echo $cursor
 | 
			
		||||
		cursor_record
 | 
			
		||||
	fi
 | 
			
		||||
	day_check
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										138
									
								
								scpt/user_list.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										138
									
								
								scpt/user_list.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,138 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
url_plc="https://plc.directory/export"
 | 
			
		||||
host_at=bsky.social
 | 
			
		||||
url=https://plc.directory
 | 
			
		||||
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
dir=$HOME/.config/atr/txt
 | 
			
		||||
file=$dir/user_list.txt
 | 
			
		||||
atr=$HOME/.cargo/bin/atr
 | 
			
		||||
 | 
			
		||||
unset timed
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if [ -z "$1" ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $1|grep "." >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user syui.bsky.social"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d $dir ];then
 | 
			
		||||
	mkdir -p $dir
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -f $file ];then
 | 
			
		||||
	touch $file
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function mfile() {
 | 
			
		||||
	t=`cat $file|sort|uniq`
 | 
			
		||||
	if [ -n "$t" ];then
 | 
			
		||||
		echo "$t" >! ${file}.back
 | 
			
		||||
		mv ${file}.back $file
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function plc(){
 | 
			
		||||
	if cat $file|grep "$1" >/dev/null 2>&1;then
 | 
			
		||||
		cat $file|grep "$1"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	json_tmp=`curl -sL "${url_plc}?after=${timed}"|jq .`
 | 
			
		||||
	json=`echo $json_tmp|jq "select(.operation.handle == \"$1\")"`
 | 
			
		||||
	if [ -z "$json" ];then
 | 
			
		||||
		check=`echo $json_tmp|jq -r ".operation.alsoKnownAs"|head -n 1`
 | 
			
		||||
		if [ "null" != "$check" ];then
 | 
			
		||||
			json=`echo $json_tmp|jq "select(.operation.alsoKnownAs|.[] == \"at://$1\")"` >/dev/null 2>&1
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -n "$json" ];then
 | 
			
		||||
		created_at=`echo $json|jq -r .createdAt |tail -n 1`
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -n "$created_at" ];then
 | 
			
		||||
		echo "$created_at : $1"
 | 
			
		||||
		echo "$created_at : $1" >> $file
 | 
			
		||||
		mfile
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fan_art(){
 | 
			
		||||
	if ! echo $3|grep "https://bsky.app/profile/">/dev/null 2>&1;then
 | 
			
		||||
		echo "please url : https://bsky.app/profile/$1/post/xxx"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ -z "$4" ];then
 | 
			
		||||
		echo "please img-url : https://example.com/img.png"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	img=$4
 | 
			
		||||
	author=`echo $3|cut -d / -f 5`
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	cat $file_fanart|jq ".+ {\"add\":\"$1\",\"link\":\"$3\",\"author\":\"$author\",\"img\":\"$img\"}" >! $file_fanart.back
 | 
			
		||||
	if cat $file_fanart|jq . ;then
 | 
			
		||||
		mv $file_fanart.back $file_fanart
 | 
			
		||||
		git add $file_fanart
 | 
			
		||||
		git commit -m  "add fanart"
 | 
			
		||||
		git push -u orgin main
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "--url" ];then
 | 
			
		||||
	if [ -z "$3" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	fan_art $3
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function first(){
 | 
			
		||||
	#https://bsky.app/profile/$1/post/$e
 | 
			
		||||
	handle=$2
 | 
			
		||||
	did="$atr did $2"
 | 
			
		||||
	curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$handle&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.uri,.value.text,.value.createdAt"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "-f" ] || [ "$2" = "f" ];then
 | 
			
		||||
	first $1
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "-l" ];then
 | 
			
		||||
	mfile
 | 
			
		||||
	cat $file
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function first_created(){
 | 
			
		||||
	#https://bsky.app/profile/$1/post/$e
 | 
			
		||||
	#curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.createdAt"
 | 
			
		||||
	curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.value.createdAt"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ -z "$2" ];then
 | 
			
		||||
	first_created $1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -n "$2" ] ;then
 | 
			
		||||
	first $2
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
#for ((i=0;i<=300;i++))
 | 
			
		||||
#do
 | 
			
		||||
#	if [ $i -eq 0 ];then
 | 
			
		||||
#		timed="1970-01-01"
 | 
			
		||||
#	fi
 | 
			
		||||
#	plc $1
 | 
			
		||||
#	timed=`echo $json_tmp|jq -r .createdAt|tail -n 1`
 | 
			
		||||
#done
 | 
			
		||||
							
								
								
									
										129
									
								
								scpt/user_search.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										129
									
								
								scpt/user_search.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
url_plc="https://plc.directory/export"
 | 
			
		||||
host_at=bsky.social
 | 
			
		||||
url=https://plc.directory
 | 
			
		||||
url_at=https://$host_at/xrpc/com.atproto.repo.listRecords
 | 
			
		||||
dir=$HOME/.config/atr/txt
 | 
			
		||||
file=$dir/user_list.txt
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unset timed
 | 
			
		||||
 | 
			
		||||
case $OSTYPE in
 | 
			
		||||
	darwin*)
 | 
			
		||||
		alias date="/opt/homebrew/bin/gdate"
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
if [ -z "$1" ];then
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if ! echo $1|grep "." >/dev/null 2>&1;then
 | 
			
		||||
	echo "ex : user syui.bsky.social"
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d $dir ];then
 | 
			
		||||
	mkdir -p $dir
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -f $file ];then
 | 
			
		||||
	touch $file
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function mfile() {
 | 
			
		||||
	t=`cat $file|sort|uniq`
 | 
			
		||||
	if [ -n "$t" ];then
 | 
			
		||||
		echo "$t" >! ${file}.back
 | 
			
		||||
		mv ${file}.back $file
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function plc(){
 | 
			
		||||
	if cat $file|grep "$1" >/dev/null 2>&1;then
 | 
			
		||||
		cat $file|grep "$1"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	json_tmp=`curl -sL "${url_plc}?after=${timed}"|jq .`
 | 
			
		||||
	json=`echo $json_tmp|jq "select(.operation.handle == \"$1\")"`
 | 
			
		||||
	if [ -z "$json" ];then
 | 
			
		||||
		check=`echo $json_tmp|jq -r ".operation.alsoKnownAs"|head -n 1`
 | 
			
		||||
		if [ "null" != "$check" ];then
 | 
			
		||||
			json=`echo $json_tmp|jq "select(.operation.alsoKnownAs|.[] == \"at://$1\")"` >/dev/null 2>&1
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -n "$json" ];then
 | 
			
		||||
		created_at=`echo $json|jq -r .createdAt |tail -n 1`
 | 
			
		||||
	fi
 | 
			
		||||
	if [ -n "$created_at" ];then
 | 
			
		||||
		echo "$created_at : $1"
 | 
			
		||||
		echo "$created_at : $1" >> $file
 | 
			
		||||
		mfile
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fan_art(){
 | 
			
		||||
	if ! echo $3|grep "https://bsky.app/profile/">/dev/null 2>&1;then
 | 
			
		||||
		echo "please url : https://bsky.app/profile/$1/post/xxx"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ -z "$4" ];then
 | 
			
		||||
		echo "please img-url : https://example.com/img.png"
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	img=$4
 | 
			
		||||
	author=`echo $3|cut -d / -f 5`
 | 
			
		||||
	cd $dir_git_card_page
 | 
			
		||||
	cat $file_fanart|jq ".+ {\"add\":\"$1\",\"link\":\"$3\",\"author\":\"$author\",\"img\":\"$img\"}" >! $file_fanart.back
 | 
			
		||||
	if cat $file_fanart|jq . ;then
 | 
			
		||||
		mv $file_fanart.back $file_fanart
 | 
			
		||||
		git add $file_fanart
 | 
			
		||||
		git commit -m  "add fanart"
 | 
			
		||||
		git push -u orgin main
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "--url" ];then
 | 
			
		||||
	if [ -z "$3" ];then
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
	fan_art $3
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function first(){
 | 
			
		||||
	#https://bsky.app/profile/$1/post/$e
 | 
			
		||||
	curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.uri,.value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "-f" ];then
 | 
			
		||||
	first $1
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$2" = "-l" ];then
 | 
			
		||||
	mfile
 | 
			
		||||
	cat $file
 | 
			
		||||
	exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function first_created(){
 | 
			
		||||
	#https://bsky.app/profile/$1/post/$e
 | 
			
		||||
	#curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.createdAt"
 | 
			
		||||
	curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$1&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.value.createdAt"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
first_created $1
 | 
			
		||||
#for ((i=0;i<=300;i++))
 | 
			
		||||
#do
 | 
			
		||||
#	if [ $i -eq 0 ];then
 | 
			
		||||
#		timed="1970-01-01"
 | 
			
		||||
#	fi
 | 
			
		||||
#	plc $1
 | 
			
		||||
#	timed=`echo $json_tmp|jq -r .createdAt|tail -n 1`
 | 
			
		||||
#done
 | 
			
		||||
							
								
								
									
										51
									
								
								scpt/user_service.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								scpt/user_service.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#!/bin/zsh
 | 
			
		||||
 | 
			
		||||
if [ -n "$1" ];then
 | 
			
		||||
	did=$1
 | 
			
		||||
else 
 | 
			
		||||
	did=`atr did yui.syui.ai`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pds=`curl -sL https://plc.directory/$did|jq -r ".service.[].serviceEndpoint" | cut -d / -f 3-`
 | 
			
		||||
handle=`curl -sL https://plc.directory/$did|jq -r ".alsoKnownAs.[]"|cut -d / -f 3-`
 | 
			
		||||
 | 
			
		||||
old_pds=`curl -sL https://plc.directory/$did/log|jq -r ".[0].service"|cut -d / -f 3-`
 | 
			
		||||
old_handle=`curl -sL https://plc.directory/$did/log|jq -r ".[0]|.handle"`
 | 
			
		||||
 | 
			
		||||
first_post=`curl -sL "https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=$did&collection=app.bsky.feed.post&reverse=true" |jq -r ".[]|.[0]?|.value.createdAt"`
 | 
			
		||||
 | 
			
		||||
body_handle=$handle
 | 
			
		||||
body_pds=$pds
 | 
			
		||||
 | 
			
		||||
if [ "$old_handle" != "null" ];then
 | 
			
		||||
	body_handle="$old_handle -> $handle"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$old_pds" != "null" ];then
 | 
			
		||||
	body_pds="$old_pds -> $pds"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
old_pds=`curl -sL https://plc.directory/$did/log|jq -r ".[0]|.services.atproto_pds.endpoint"|cut -d / -f 3-`
 | 
			
		||||
old_handle=`curl -sL https://plc.directory/$did/log|jq -r ".[0]|.alsoKnownAs.[0]"|cut -d / -f 3-`
 | 
			
		||||
 | 
			
		||||
if [ "$old_handle" != "null" ];then
 | 
			
		||||
	body_handle="$old_handle -> $handle"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$old_pds" != "null" ];then
 | 
			
		||||
	body_pds="$old_pds -> $pds"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if [ "$old_pds" = "$pds" ];then
 | 
			
		||||
	body_pds=$pds
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$old_handle" = "$handle" ];then
 | 
			
		||||
	body_handle=$handle
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo pds : $body_pds
 | 
			
		||||
echo handle : $body_handle
 | 
			
		||||
echo did : $did
 | 
			
		||||
echo createdAt : $first_post
 | 
			
		||||
							
								
								
									
										202
									
								
								src/ascii.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								src/ascii.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,202 @@
 | 
			
		||||
use sysinfo::{
 | 
			
		||||
    System,
 | 
			
		||||
    //Components, Disks, Networks, System,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub fn c_ascii(x: &str) {
 | 
			
		||||
    let logo = "
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠉⠀⠀⠀⠀⠀⠈⠉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣤⣤⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀
 | 
			
		||||
⠀⠀⠘⠛⠛⠛⠛⠉⠉⠉⠉⠁⠀⠀⠀⠀⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠀⠀⠀⠀⠀⠉⠉⠉⠉⠙⠛⠛⠛⠛⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
";
 | 
			
		||||
 | 
			
		||||
    let avatar = "
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣁⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⠖⠋⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠒⢦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⢿⣷⣦⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣴⣿⠷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣶⠿⠟⠛⠛⠋⠉⠋⠉⠉⠉⠉⠙⠛⠙⠛⠛⠻⠿⢷⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠚⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⣼⡀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢠⣷⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⣼⣿⡇⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢁⣾⣿⡆⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢰⣿⣿⣧⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⣾⣿⣿⡇⣿⣿⣿⢻⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⣾⣿⣿⣿⡄⣿⣿⣿⣿⣿⣿⣿⣿⠏⣼⣿⣿⣿⡇⣿⡿⢣⠈⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⢹⠀⣿⣿⣿⣿⣧⢹⣿⡏⢹⣿⣿⣿⠏⣼⣿⡿⠿⢿⢣⡿⣡⣿⠀⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⢃⠸⠀⣵⡶⠶⢶⣿⡆⢿⢁⠸⣿⣿⢋⣼⣯⡴⠒⠒⠒⣼⡑⢟⣿⢠⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⢿⣿⣿⣿⣿⡟⠈⣄⠈⠡⡐⢿⣦⠹⣿⡌⢸⡆⠿⣡⣾⣿⡟⢐⠇⠙⣡⡀⣿⡎⢿⠈⢐⡲⣆⢻⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢳⡘⣿⣿⣿⣿⡇⣸⣿⡄⣶⡄⠀⣿⠀⣿⣿⣜⣷⣼⣿⣿⣿⡇⢸⡇⠀⣿⠃⣿⣿⣸⠀⡌⢇⣿⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠘⣿⣿⣿⡇⣿⣿⣧⡘⢷⣾⠟⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣌⣿⣿⣃⣼⣿⣿⡟⠀⣿⣾⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⡇⢸⣿⣿⣿⣾⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠡⠾⢛⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⡘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢃⣶⡾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡅⢀⡹⣿⣿⣿⣿⣿⣿⣯⣛⡛⣛⣛⣭⣿⣿⣿⣿⣿⠿⢋⣤⠟⢉⠠⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃⣸⣿⣦⡍⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⠿⠿⢛⡉⢠⡶⠋⡄⢺⣿⡀⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⣿⣿⢿⠇⣼⢹⡀⣶⣦⣭⣭⣭⣴⣶⣿⠂⡟⠀⢋⣴⡇⡇⣾⣿⡇⢻⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⣿⡿⢸⢀⠇⣸⡀⣿⣿⣿⣿⣿⣿⣿⣿⠀⣠⠀⣿⣿⡇⠀⣿⢹⣷⠸⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠀⣿⡇⡟⠘⢠⡿⠃⣿⣿⣿⣿⣿⣿⣿⣿⡀⣤⠀⣿⣿⠃⢰⣿⠸⣿⡀⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢜⣽⠀⣿⠁⡇⡰⣢⣼⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣌⠀⣿⣿⠀⣼⣿⡄⣿⣧⠸⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⣠⠞⣋⠀⣿⢸⠃⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣿⣿⢠⣬⣍⣁⣙⠛⠦⠹⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⢋⠜⣡⣿⣿⢠⡿⠘⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢠⣿⡇⣸⣿⣿⣿⣿⣿⣷⣦⣍⠻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠞⡰⢫⣾⣿⡟⣵⢸⡇⠀⢸⡿⠿⢛⣋⣉⣿⣿⣿⣿⣿⣿⣫⣭⡍⢸⣿⠇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡌⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⢃⡞⣰⣿⣿⣿⣦⡛⢸⡇⠀⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡈⢷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⢡⡏⣼⣿⣿⣿⣿⣿⣿⢸⡇⠀⣭⣭⣭⣤⣶⣦⢠⣭⣙⠻⣿⣿⣿⣿⡇⣾⡇⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⡄⢻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡟⢰⣿⢰⣿⣿⣿⣿⣿⣿⣿⠸⣇⠀⣿⣿⣿⣿⣿⡇⢸⣿⣿⣿⡜⣿⣿⣿⡇⣿⠀⢸⣿⡿⠿⠿⠛⠿⠿⠟⣛⣛⣉⣥⣿⡈⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
 | 
			
		||||
 | 
			
		||||
";
 | 
			
		||||
 | 
			
		||||
    let color = "
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣰[0m[38;2;7;7;0m⡄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣼[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;28;28;0m⣄[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⢀[0m[38;2;40;39;0m⣼[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;108;108;0m⣆[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;4;4;0m⣤[0m[38;2;116;116;0m⣾[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;193;193;0m⣧[0m[38;2;1;1;0m⣄[0m[38;2;2;1;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⣠[0m[38;2;10;10;0m⣶[0m[38;2;240;240;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣷[0m[38;2;35;35;0m⣦[0m[38;2;1;1;0m⣀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣴[0m[38;2;203;203;0m⣿[0m[38;2;250;250;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;244;244;0m⣷[0m[38;2;0;0;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;2;0m⢠[0m[38;2;112;111;0m⣾[0m[38;2;250;250;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡿[0m[38;2;254;254;0m⠟[0m[38;2;254;254;0m⠛[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;255;255;0m⠛[0m[38;2;253;253;0m⠿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;185;185;0m⣦[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;0;0m⢠[0m[38;2;229;229;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡿[0m[38;2;255;255;0m⠋[0m[38;2;78;77;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;36;36;0m⠈[0m[38;2;255;255;0m⠙[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣧[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;0m⠀[0m[38;2;160;160;0m⣾[0m[38;2;251;251;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⠏[0m[38;2;92;91;0m⠀[0m[38;2;5;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;28;28;0m⠈[0m[38;2;253;253;0m⢿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;227;227;0m⣇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢰[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⡿[0m[38;2;88;87;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;22;22;0m⠈[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;10;10;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;37;37;0m⢸[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;108;108;0m⠀[0m[38;2;4;3;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;31;31;0m⠸[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣷[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢠[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;101;101;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;207;207;0m⣧[0m[38;2;2;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⢀[0m[38;2;133;132;0m⣾[0m[38;2;251;251;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣧[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⢀[0m[38;2;128;128;0m⣾[0m[38;2;251;251;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;254;254;0m⣿[0m[38;2;254;254;0m⣷[0m[38;2;0;0;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;0;0;0m⣴[0m[38;2;221;221;0m⣿[0m[38;2;253;253;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;202;202;0m⣇[0m[38;2;2;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;2;0m⠀[0m[38;2;72;71;0m⣼[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;254;254;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;67;66;0m⣦[0m[38;2;0;0;0m⣤[0m[38;2;1;1;0m⣄[0m[38;2;4;4;0m⣀[0m[38;2;4;4;0m⣀[0m[38;2;3;3;0m⣠[0m[38;2;0;0;0m⣤[0m[38;2;36;36;0m⣶[0m[38;2;254;254;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;153;153;0m⣆[0m[38;2;3;3;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;20;20;0m⣼[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;251;251;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;252;252;0m⣿[0m[38;2;81;80;0m⡆[0m[38;2;4;4;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠸[0m[38;2;252;252;0m⠟[0m[38;2;251;251;0m⠛[0m[38;2;251;251;0m⠛[0m[38;2;254;254;0m⠛[0m[38;2;255;255;0m⠛[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;252;252;0m⠻[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⣿[0m[38;2;255;255;0m⡿[0m[38;2;253;253;0m⠟[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;255;255;0m⠛[0m[38;2;255;255;0m⠛[0m[38;2;251;251;0m⠛[0m[38;2;251;251;0m⠛[0m[38;2;251;251;0m⠿[0m[38;2;34;34;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;3;3;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;5;5;0m⠀[0m[38;2;206;206;0m⠉[0m[38;2;255;255;0m⠙[0m[38;2;253;253;0m⠛[0m[38;2;252;252;0m⠻[0m[38;2;254;254;0m⠿[0m[38;2;255;255;0m⠿[0m[38;2;255;255;0m⠿[0m[38;2;254;254;0m⠿[0m[38;2;252;252;0m⠟[0m[38;2;252;252;0m⠛[0m[38;2;255;255;0m⠉[0m[38;2;228;228;0m⠁[0m[38;2;27;27;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;1;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;4;4;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;2;0m⠀[0m[38;2;2;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;3;2;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
    ";
 | 
			
		||||
 | 
			
		||||
    let avatar_color = "
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;5;5;0m⣀[0m[38;2;184;184;0m⡀[0m[38;2;25;25;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;5m⡤[0m[38;2;35;35;2m⠖[0m[38;2;164;164;0m⠊[0m[38;2;237;237;0m⠉[0m[38;2;200;200;0m⠁[0m[38;2;101;101;0m⠀[0m[38;2;51;51;0m⠀[0m[38;2;24;24;0m⠀[0m[38;2;15;15;0m⠀[0m[38;2;14;14;0m⠀[0m[38;2;27;27;0m⠀[0m[38;2;38;38;0m⠀[0m[38;2;71;71;1m⠀[0m[38;2;127;127;0m⠀[0m[38;2;197;197;0m⠉[0m[38;2;203;203;0m⠁[0m[38;2;127;127;0m⠒[0m[38;2;18;18;2m⠦[0m[38;2;0;0;4m⣄[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;4m⠐[0m[38;2;253;253;0m⠿[0m[38;2;254;254;0m⣷[0m[38;2;0;0;2m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;0m⣤[0m[38;2;0;0;1m⣤[0m[38;2;0;0;2m⣤[0m[38;2;0;0;4m⣤[0m[38;2;0;0;2m⣤[0m[38;2;0;0;2m⣤[0m[38;2;0;0;4m⣤[0m[38;2;0;0;3m⣴[0m[38;2;254;254;0m⡿[0m[38;2;253;253;0m⠷[0m[38;2;4;4;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⢀[0m[38;2;0;0;5m⣴[0m[38;2;71;71;0m⡶[0m[38;2;176;176;0m⠾[0m[38;2;251;251;0m⠟[0m[38;2;254;254;0m⠛[0m[38;2;253;253;0m⠋[0m[38;2;253;253;0m⠉[0m[38;2;252;252;0m⠉[0m[38;2;254;254;0m⠉[0m[38;2;254;254;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;252;252;0m⠉[0m[38;2;252;252;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;253;253;0m⠉[0m[38;2;254;254;0m⠛[0m[38;2;252;252;0m⠛[0m[38;2;251;251;0m⠿[0m[38;2;194;194;0m⠷[0m[38;2;49;49;0m⣶[0m[38;2;0;0;6m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;4m⠀[0m[38;2;74;74;3m⠊[0m[38;2;250;250;0m⠉[0m[38;2;156;156;0m⠀[0m[38;2;37;37;2m⠀[0m[38;2;0;0;6m⠀[0m[38;2;0;0;3m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;3m⠀[0m[38;2;0;0;6m⠀[0m[38;2;49;49;2m⠀[0m[38;2;173;173;0m⠈[0m[38;2;250;250;0m⠙[0m[38;2;66;66;3m⠂[0m[38;2;1;1;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;2;2m⠀[0m[38;2;4;4;4m⠀[0m[38;2;1;1;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;5m⠀[0m[38;2;4;4;4m⠀[0m[38;2;3;3;3m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;11;11;4m⣠[0m[38;2;0;0;0m⣴[0m[38;2;63;63;0m⣶[0m[38;2;221;221;0m⣿[0m[38;2;243;243;0m⣿[0m[38;2;236;236;0m⣿[0m[38;2;232;232;0m⣿[0m[38;2;230;230;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;230;230;0m⣿[0m[38;2;233;233;0m⣿[0m[38;2;240;240;0m⣿[0m[38;2;222;222;0m⣷[0m[38;2;113;113;0m⣶[0m[38;2;3;3;1m⣤[0m[38;2;0;0;0m⣄[0m[38;2;0;0;0m⣀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;4;4;2m⢀[0m[38;2;0;0;1m⣴[0m[38;2;156;156;0m⣾[0m[38;2;241;241;0m⣿[0m[38;2;226;226;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;6m⣿[0m[38;2;233;233;41m⣿[0m[38;2;231;231;38m⣿[0m[38;2;231;231;48m⣿[0m[38;2;248;248;48m⣿[0m[38;2;65;65;12m⣦[0m[38;2;11;11;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;12;12;4m⢀[0m[38;2;74;74;0m⣼[0m[38;2;233;233;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;231;231;23m⣿[0m[38;2;230;230;11m⣿[0m[38;2;232;232;29m⣿[0m[38;2;227;227;20m⣿[0m[38;2;241;241;41m⣷[0m[38;2;3;3;0m⣄[0m[38;2;4;4;4m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;1m⠀[0m[38;2;32;32;1m⣴[0m[38;2;231;231;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;1m⣿[0m[38;2;230;230;7m⣿[0m[38;2;248;248;27m⣷[0m[38;2;10;10;1m⣄[0m[38;2;5;5;3m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;7;7;7m⢀[0m[38;2;121;121;0m⣾[0m[38;2;228;228;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;231;231;37m⣿[0m[38;2;228;228;49m⣷[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;2m⢠[0m[38;2;183;183;0m⣾[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;245;245;73m⣷[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;1m⠀[0m[38;2;130;130;0m⣾[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⠟[0m[38;2;230;230;0m⠉[0m[38;2;214;214;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;0m⡇[0m[38;2;120;120;2m⠈[0m[38;2;219;219;0m⢿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;1m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;2m⣿[0m[38;2;218;218;62m⣇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;6;6;0m⢰[0m[38;2;238;238;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;0m⠋[0m[38;2;47;47;1m⣴[0m[38;2;120;115;102m⠀[0m[38;2;212;212;2m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;0m⡟[0m[38;2;143;144;0m⢀[0m[38;2;208;199;183m⣧[0m[38;2;119;119;0m⠸[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;240;240;72m⣿[0m[38;2;36;36;11m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;2m⠀[0m[38;2;145;145;0m⢸[0m[38;2;226;226;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;1m⠃[0m[38;2;26;26;11m⣸[0m[38;2;255;251;232m⣿[0m[38;2;170;164;159m⡆[0m[38;2;190;190;1m⢸[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⡿[0m[38;2;211;211;0m⠁[0m[38;2;129;124;120m⣾[0m[38;2;245;235;217m⣿[0m[38;2;98;94;94m⡀[0m[38;2;241;241;19m⣿[0m[38;2;229;229;1m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;226;226;0m⣿[0m[38;2;128;128;37m⠀[0m[38;2;2;2;1m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;2m⠀[0m[38;2;199;199;0m⣿[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⡟[0m[38;2;72;72;0m⢠[0m[38;2;255;252;232m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;255;240m⣧[0m[38;2;90;90;0m⠸[0m[38;2;228;228;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;238;238;2m⠃[0m[38;2;62;60;64m⣼[0m[38;2;223;214;199m⣿[0m[38;2;253;243;225m⣿[0m[38;2;198;189;174m⡇[0m[38;2;226;226;54m⣿[0m[38;2;228;228;2m⣿[0m[38;2;229;229;0m⡿[0m[38;2;232;232;0m⠛[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;0m⣿[0m[38;2;164;164;40m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;3m⠀[0m[38;2;209;209;0m⢻[0m[38;2;228;228;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;221;221;2m⠃[0m[38;2;100;96;97m⣼[0m[38;2;254;244;226m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;246;230m⣿[0m[38;2;56;54;52m⡀[0m[38;2;241;241;2m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;240;240;1m⠃[0m[38;2;28;28;24m⣰[0m[38;2;204;196;181m⣿[0m[38;2;255;247;230m⣿[0m[38;2;253;243;226m⣿[0m[38;2;213;206;193m⠇[0m[38;2;222;222;24m⣿[0m[38;2;228;228;1m⡿[0m[38;2;225;225;0m⢡[0m[38;2;77;73;89m⠀[0m[38;2;244;244;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;227;227;4m⣿[0m[38;2;127;127;13m⠀[0m[38;2;2;2;1m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;4m⠀[0m[38;2;181;181;0m⢸[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;0m⡏[0m[38;2;175;175;1m⢸[0m[38;2;113;113;0m⠀[0m[38;2;225;216;199m⣿[0m[38;2;254;244;226m⡿[0m[38;2;255;245;227m⢿[0m[38;2;254;245;227m⣿[0m[38;2;251;243;227m⣇[0m[38;2;147;148;0m⠸[0m[38;2;227;227;0m⣿[0m[38;2;230;230;0m⠏[0m[38;2;223;223;0m⢹[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;236;236;1m⠃[0m[38;2;26;26;11m⣰[0m[38;2;210;202;187m⣿[0m[38;2;255;248;234m⠿[0m[38;2;255;247;232m⠿[0m[38;2;253;242;224m⠿[0m[38;2;155;151;160m⢀[0m[38;2;244;244;0m⡟[0m[38;2;215;215;1m⢡[0m[38;2;207;199;192m⣿[0m[38;2;85;82;83m⠀[0m[38;2;242;242;4m⣿[0m[38;2;229;229;4m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;232;232;6m⡏[0m[38;2;38;38;6m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;3;3;0m⠀[0m[38;2;108;108;0m⠸[0m[38;2;226;226;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;234;234;0m⠃[0m[38;2;58;58;0m⠘[0m[38;2;67;67;0m⠀[0m[38;2;137;132;120m⣤[0m[38;2;44;42;39m⠶[0m[38;2;69;67;62m⠶[0m[38;2;59;57;52m⢦[0m[38;2;224;216;201m⣿[0m[38;2;89;86;88m⡆[0m[38;2;237;237;3m⢻[0m[38;2;160;160;0m⠀[0m[38;2;107;107;0m⠘[0m[38;2;227;227;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;238;238;1m⠃[0m[38;2;24;23;13m⣴[0m[38;2;255;253;238m⣯[0m[38;2;103;100;94m⡴[0m[38;2;67;65;61m⠒[0m[38;2;118;115;108m⠒[0m[38;2;105;102;95m⠂[0m[38;2;63;62;62m⠜[0m[38;2;153;154;6m⡀[0m[38;2;252;248;232m⠛[0m[38;2;255;248;233m⣿[0m[38;2;59;57;58m⠀[0m[38;2;241;241;2m⣿[0m[38;2;229;229;0m⠿[0m[38;2;229;229;0m⢿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;7m⣿[0m[38;2;227;227;32m⠃[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⡀[0m[38;2;238;238;0m⢻[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;236;236;1m⡏[0m[38;2;56;54;29m⠈[0m[38;2;55;53;56m⡀[0m[38;2;61;61;0m⠀[0m[38;2;209;205;192m⠡[0m[38;2;11;28;36m⠀[0m[38;2;74;158;202m⠶[0m[38;2;40;93;122m⣆[0m[38;2;223;216;204m⠹[0m[38;2;254;251;236m⣿[0m[38;2;32;31;11m⡌[0m[38;2;110;110;2m⢸[0m[38;2;116;112;112m⡄[0m[38;2;237;237;2m⠿[0m[38;2;231;230;2m⢡[0m[38;2;93;89;90m⣾[0m[38;2;254;247;233m⣿[0m[38;2;254;249;235m⡏[0m[38;2;70;65;60m⠐[0m[38;2;156;155;155m⠂[0m[38;2;70;184;239m⠘[0m[38;2;132;184;210m⣁[0m[38;2;13;12;22m⠀[0m[38;2;255;255;244m⣿[0m[38;2;43;42;39m⡄[0m[38;2;255;255;243m⢿[0m[38;2;55;53;51m⠀[0m[38;2;131;132;0m⠐[0m[38;2;119;115;101m⠒[0m[38;2;28;26;24m⡆[0m[38;2;235;235;4m⢹[0m[38;2;234;234;10m⡏[0m[38;2;31;31;10m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;254;254;241m⠳[0m[38;2;48;49;0m⠈[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;226;226;0m⡇[0m[38;2;0;0;2m⢰[0m[38;2;255;255;242m⣿[0m[38;2;11;8;6m⡀[0m[38;2;59;126;160m⢰[0m[38;2;25;31;35m⠀[0m[38;2;0;0;0m⠀[0m[38;2;100;201;251m⣹[0m[38;2;39;91;118m⠀[0m[38;2;255;255;242m⣿[0m[38;2;255;255;243m⣷[0m[38;2;21;20;21m⣌[0m[38;2;255;255;243m⣷[0m[38;2;26;27;1m⣴[0m[38;2;254;247;233m⣿[0m[38;2;254;246;230m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;248;233m⡇[0m[38;2;55;135;176m⢸[0m[38;2;85;176;220m⡀[0m[38;2;0;0;0m⠀[0m[38;2;89;183;229m⣸[0m[38;2;80;182;234m⠀[0m[38;2;191;180;166m⣿[0m[38;2;255;255;242m⣷[0m[38;2;80;76;71m⣸[0m[38;2;75;73;68m⠀[0m[38;2;125;120;111m⡌[0m[38;2;255;249;230m⠃[0m[38;2;178;171;157m⡿[0m[38;2;15;16;3m⠘[0m[38;2;124;124;32m⠀[0m[38;2;2;2;1m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;181;173;159m⠁[0m[38;2;102;102;0m⠈[0m[38;2;227;227;0m⢿[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;220;220;0m⡇[0m[38;2;183;176;172m⢹[0m[38;2;252;243;227m⣿[0m[38;2;248;241;225m⣧[0m[38;2;54;118;152m⠘[0m[38;2;102;204;255m⢷[0m[38;2;45;92;116m⢶[0m[38;2;102;205;254m⠋[0m[38;2;29;72;94m⣰[0m[38;2;255;254;239m⣿[0m[38;2;255;246;230m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;249;233m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;231m⣿[0m[38;2;255;255;243m⣷[0m[38;2;25;70;94m⣌[0m[38;2;100;205;254m⡛[0m[38;2;92;189;237m⠚[0m[38;2;101;212;255m⢁[0m[38;2;20;26;29m⣼[0m[38;2;255;253;238m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;254;238m⡏[0m[38;2;104;99;92m⠀[0m[38;2;215;206;191m⣿[0m[38;2;132;127;118m⣾[0m[38;2;254;250;233m⠃[0m[38;2;12;12;0m⠀[0m[38;2;1;1;2m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;70;70;1m⠈[0m[38;2;229;229;0m⢻[0m[38;2;229;229;0m⣿[0m[38;2;236;236;2m⡇[0m[38;2;123;118;121m⢸[0m[38;2;253;244;228m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;254;238m⣿[0m[38;2;121;120;114m⣾[0m[38;2;91;118;129m⣶[0m[38;2;226;237;232m⣿[0m[38;2;255;248;233m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;251;236m⣿[0m[38;2;243;232;216m⣿[0m[38;2;255;255;241m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;246;230m⣿[0m[38;2;253;244;228m⡿[0m[38;2;151;146;136m⠠[0m[38;2;35;33;30m⠞[0m[38;2;255;254;235m⠋[0m[38;2;191;184;173m⠁[0m[38;2;32;33;0m⠀[0m[38;2;2;2;2m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;2;7m⠀[0m[38;2;219;219;0m⠙[0m[38;2;237;236;1m⢷[0m[38;2;35;34;23m⡈[0m[38;2;254;252;235m⢿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;250;234m⣿[0m[38;2;223;216;201m⣿[0m[38;2;254;245;229m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;254;245;229m⡿[0m[38;2;233;224;209m⠁[0m[38;2;32;33;0m⠀[0m[38;2;118;118;0m⠀[0m[38;2;184;184;2m⠀[0m[38;2;97;97;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;15;15;11m⢠[0m[38;2;214;214;0m⡁[0m[38;2;0;0;0m⢀[0m[38;2;253;248;230m⠙[0m[38;2;254;245;229m⢿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;247;230m⣿[0m[38;2;203;196;183m⣍[0m[38;2;255;255;243m⣛[0m[38;2;255;246;230m⠛[0m[38;2;255;246;230m⢛[0m[38;2;255;255;240m⣋[0m[38;2;255;246;230m⣩[0m[38;2;222;214;200m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⠿[0m[38;2;255;250;234m⠋[0m[38;2;118;113;111m⠀[0m[38;2;146;146;0m⠀[0m[38;2;182;182;0m⢀[0m[38;2;40;40;0m⠀[0m[38;2;63;63;2m⣆[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;18;18;0m⢸[0m[38;2;166;166;0m⠀[0m[38;2;84;84;0m⣸[0m[38;2;240;240;1m⣷[0m[38;2;27;27;2m⣤[0m[38;2;218;211;198m⡉[0m[38;2;255;255;239m⠛[0m[38;2;253;244;228m⠻[0m[38;2;254;245;229m⠿[0m[38;2;255;246;230m⣿[0m[38;2;255;246;230m⣿[0m[38;2;255;250;234m⣿[0m[38;2;255;255;243m⣿[0m[38;2;255;255;243m⣿[0m[38;2;255;252;235m⣿[0m[38;2;253;244;228m⡿[0m[38;2;255;246;230m⠿[0m[38;2;254;245;229m⠟[0m[38;2;255;247;231m⠛[0m[38;2;255;249;231m⠉[0m[38;2;92;89;85m⠀[0m[38;2;59;59;0m⠀[0m[38;2;183;183;2m⠀[0m[38;2;132;132;0m⡀[0m[38;2;38;38;0m⢰[0m[38;2;213;213;0m⣿[0m[38;2;80;80;0m⠀[0m[38;2;240;240;0m⣿[0m[38;2;85;85;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠈[0m[38;2;96;96;0m⠀[0m[38;2;229;229;0m⣿[0m[38;2;228;228;0m⣿[0m[38;2;221;221;0m⢻[0m[38;2;222;222;0m⠃[0m[38;2;126;126;1m⠈[0m[38;2;162;162;2m⠀[0m[38;2;81;82;0m⠀[0m[38;2;71;69;64m⣶[0m[38;2;72;69;65m⣤[0m[38;2;132;128;120m⣤[0m[38;2;181;175;164m⣭[0m[38;2;229;221;207m⣭[0m[38;2;125;120;113m⣴[0m[38;2;76;73;68m⣶[0m[38;2;144;138;128m⣾[0m[38;2;112;107;104m⠀[0m[38;2;188;188;2m⠌[0m[38;2;115;115;0m⠀[0m[38;2;167;167;0m⢀[0m[38;2;50;50;0m⣴[0m[38;2;175;175;0m⡆[0m[38;2;208;208;0m⠃[0m[38;2;139;139;3m⣸[0m[38;2;203;203;0m⢿[0m[38;2;179;179;0m⡆[0m[38;2;180;180;0m⢸[0m[38;2;237;237;0m⣧[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;5;5;0m⠀[0m[38;2;241;241;0m⣿[0m[38;2;233;233;0m⡏[0m[38;2;119;119;0m⢸[0m[38;2;96;96;0m⠀[0m[38;2;192;192;0m⠃[0m[38;2;58;58;0m⠐[0m[38;2;141;141;0m⠀[0m[38;2;211;202;190m⣿[0m[38;2;231;222;205m⣿[0m[38;2;229;220;204m⣿[0m[38;2;229;220;204m⣿[0m[38;2;228;219;203m⣿[0m[38;2;229;220;204m⣿[0m[38;2;230;222;205m⣿[0m[38;2;236;229;218m⣿[0m[38;2;98;94;96m⠀[0m[38;2;119;119;2m⠀[0m[38;2;18;18;0m⠀[0m[38;2;200;200;1m⣿[0m[38;2;225;225;2m⣿[0m[38;2;187;187;43m⠁[0m[38;2;127;127;0m⠀[0m[38;2;213;213;0m⡇[0m[38;2;157;157;0m⢸[0m[38;2;218;218;0m⣇[0m[38;2;44;44;0m⠘[0m[38;2;227;227;0m⣿[0m[38;2;146;146;0m⡆[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;113;113;0m⣼[0m[38;2;36;36;0m⠀[0m[38;2;243;243;0m⣿[0m[38;2;232;232;0m⠇[0m[38;2;163;163;1m⡄[0m[38;2;29;29;22m⠀[0m[38;2;94;94;0m⠀[0m[38;2;182;182;1m⠀[0m[38;2;144;145;26m⠀[0m[38;2;218;210;193m⣿[0m[38;2;253;243;226m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;247;235m⣿[0m[38;2;110;107;103m⠀[0m[38;2;48;48;2m⣄[0m[38;2;114;114;1m⠀[0m[38;2;198;198;1m⣿[0m[38;2;225;225;3m⣿[0m[38;2;151;151;79m⠀[0m[38;2;39;39;3m⢀[0m[38;2;222;222;0m⣧[0m[38;2;82;82;0m⠈[0m[38;2;206;206;0m⣿[0m[38;2;58;58;0m⠀[0m[38;2;242;242;0m⢿[0m[38;2;236;236;0m⣷[0m[38;2;10;10;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⠀[0m[38;2;31;31;0m⠈[0m[38;2;203;203;0m⣹[0m[38;2;40;40;0m⠀[0m[38;2;242;242;0m⣿[0m[38;2;150;150;0m⠀[0m[38;2;223;223;1m⡇[0m[38;2;24;24;24m⠠[0m[38;2;26;26;0m⢀[0m[38;2;1;2;0m⣴[0m[38;2;117;113;102m⣠[0m[38;2;255;253;236m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;247;235m⣿[0m[38;2;220;214;203m⣷[0m[38;2;80;81;82m⣌[0m[38;2;117;117;122m⠀[0m[38;2;198;198;1m⣿[0m[38;2;228;228;24m⣿[0m[38;2;90;90;56m⠀[0m[38;2;69;69;5m⣸[0m[38;2;204;204;0m⣿[0m[38;2;81;81;0m⠀[0m[38;2;219;219;0m⢿[0m[38;2;210;210;0m⣇[0m[38;2;99;99;0m⠘[0m[38;2;226;226;0m⣿[0m[38;2;217;217;0m⣇[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢀[0m[38;2;0;0;0m⠄[0m[38;2;96;96;0m⡠[0m[38;2;127;127;0m⠞[0m[38;2;207;207;1m⣋[0m[38;2;41;41;4m⠀[0m[38;2;247;247;0m⡿[0m[38;2;60;60;0m⠀[0m[38;2;173;173;0m⠀[0m[38;2;62;62;64m⣰[0m[38;2;251;244;226m⣿[0m[38;2;254;244;225m⣿[0m[38;2;255;249;230m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;248;236m⣿[0m[38;2;255;246;230m⣿[0m[38;2;251;241;223m⣿[0m[38;2;106;102;100m⠀[0m[38;2;221;221;2m⣿[0m[38;2;237;237;32m⡟[0m[38;2;13;13;18m⢠[0m[38;2;123;123;0m⣤[0m[38;2;189;189;1m⣈[0m[38;2;222;222;2m⣁[0m[38;2;151;151;1m⡈[0m[38;2;201;201;0m⠛[0m[38;2;140;140;0m⠂[0m[38;2;204;204;0m⠹[0m[38;2;225;225;0m⣿[0m[38;2;120;120;0m⡆[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;2;2;0m⡠[0m[38;2;165;165;0m⢂[0m[38;2;22;22;0m⠔[0m[38;2;200;200;2m⣡[0m[38;2;157;157;170m⣾[0m[38;2;246;246;246m⡯[0m[38;2;14;14;29m⠀[0m[38;2;252;252;1m⡇[0m[38;2;35;35;0m⠀[0m[38;2;50;50;0m⢀[0m[38;2;206;198;182m⣿[0m[38;2;255;247;229m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;58;56;55m⠀[0m[38;2;237;237;1m⣿[0m[38;2;246;246;15m⡇[0m[38;2;34;32;42m⢸[0m[38;2;254;247;228m⣿[0m[38;2;252;243;225m⣿[0m[38;2;253;243;226m⣿[0m[38;2;255;250;232m⣿[0m[38;2;255;255;234m⣿[0m[38;2;165;159;151m⣶[0m[38;2;4;4;5m⣦[0m[38;2;153;152;0m⣈[0m[38;2;226;226;0m⠛[0m[38;2;81;81;0m⣄[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⢀[0m[38;2;32;32;0m⠎[0m[38;2;120;120;0m⡠[0m[38;2;199;199;1m⢃[0m[38;2;27;27;20m⣼[0m[38;2;255;255;255m⣿[0m[38;2;253;253;253m⠟[0m[38;2;163;163;163m⣰[0m[38;2;29;28;29m⠀[0m[38;2;252;252;2m⡇[0m[38;2;47;47;2m⠀[0m[38;2;48;46;42m⢸[0m[38;2;205;197;182m⡿[0m[38;2;254;245;227m⠿[0m[38;2;253;243;225m⠛[0m[38;2;255;255;236m⣋[0m[38;2;255;250;231m⣉[0m[38;2;255;247;229m⣻[0m[38;2;253;243;225m⣿[0m[38;2;253;243;225m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;244;225m⣿[0m[38;2;253;243;225m⡿[0m[38;2;255;249;231m⢋[0m[38;2;155;149;138m⣤[0m[38;2;208;201;185m⡍[0m[38;2;41;40;21m⢰[0m[38;2;238;238;10m⣿[0m[38;2;222;221;1m⠃[0m[38;2;167;160;154m⣾[0m[38;2;252;242;224m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;246;231m⣿[0m[38;2;253;246;235m⣿[0m[38;2;241;236;220m⣷[0m[38;2;76;76;15m⡌[0m[38;2;130;130;0m⢆[0m[38;2;1;1;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⡰[0m[38;2;238;238;0m⢁[0m[38;2;19;19;0m⠜[0m[38;2;143;143;0m⣰[0m[38;2;231;231;232m⣿[0m[38;2;253;253;253m⣿[0m[38;2;255;255;255m⣿[0m[38;2;65;65;66m⣤[0m[38;2;255;255;247m⡙[0m[38;2;49;48;28m⠘[0m[38;2;246;246;2m⡇[0m[38;2;55;55;1m⠀[0m[38;2;144;138;136m⣼[0m[38;2;184;177;164m⣷[0m[38;2;152;146;135m⣾[0m[38;2;255;251;233m⣿[0m[38;2;255;250;232m⣿[0m[38;2;235;226;210m⣿[0m[38;2;227;219;202m⣿[0m[38;2;238;229;212m⣿[0m[38;2;253;243;225m⣿[0m[38;2;254;244;226m⣿[0m[38;2;252;242;224m⣿[0m[38;2;204;196;181m⣿[0m[38;2;233;225;208m⣿[0m[38;2;243;233;216m⣿[0m[38;2;254;254;234m⡇[0m[38;2;63;64;0m⢸[0m[38;2;226;226;0m⡿[0m[38;2;75;75;0m⠀[0m[38;2;245;235;215m⣿[0m[38;2;254;244;226m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;248;235m⣿[0m[38;2;255;252;245m⣿[0m[38;2;255;254;251m⣿[0m[38;2;254;255;242m⣿[0m[38;2;54;54;21m⠈[0m[38;2;220;220;0m⢧[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;1;1;0m⢀[0m[38;2;47;47;0m⡜[0m[38;2;165;165;0m⢠[0m[38;2;159;159;0m⠎[0m[38;2;49;49;0m⣰[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;254;254;254m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;46;46;35m⠀[0m[38;2;246;246;3m⡇[0m[38;2;52;52;0m⠀[0m[38;2;217;208;197m⣉[0m[38;2;225;216;201m⣩[0m[38;2;190;183;168m⣥[0m[38;2;121;116;107m⣤[0m[38;2;73;70;64m⣤[0m[38;2;62;60;55m⡄[0m[38;2;95;91;84m⢠[0m[38;2;196;188;174m⣍[0m[38;2;255;255;238m⣙[0m[38;2;254;244;226m⠻[0m[38;2;253;243;225m⢿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;254;244;226m⣿[0m[38;2;250;240;222m⡇[0m[38;2;143;143;0m⢸[0m[38;2;241;241;1m⠇[0m[38;2;0;0;0m⢠[0m[38;2;255;255;239m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;255;247;234m⣿[0m[38;2;255;249;238m⣿[0m[38;2;252;245;233m⣿[0m[38;2;170;165;155m⡆[0m[38;2;24;24;21m⡄[0m[38;2;245;245;1m⢳[0m[38;2;20;20;0m⣄[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⢠[0m[38;2;173;173;0m⡞[0m[38;2;108;108;0m⢠[0m[38;2;210;210;0m⣿[0m[38;2;120;120;0m⢠[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;72;72;75m⠀[0m[38;2;254;254;4m⡇[0m[38;2;41;41;0m⠀[0m[38;2;233;233;235m⣿[0m[38;2;239;239;239m⣿[0m[38;2;254;254;254m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⣿[0m[38;2;255;255;255m⡇[0m[38;2;84;84;84m⢸[0m[38;2;231;231;231m⣿[0m[38;2;233;233;233m⣿[0m[38;2;246;246;246m⣿[0m[38;2;73;71;69m⡘[0m[38;2;254;245;227m⣿[0m[38;2;255;245;227m⣿[0m[38;2;253;243;225m⣿[0m[38;2;194;186;177m⠃[0m[38;2;200;200;0m⡿[0m[38;2;130;130;1m⠀[0m[38;2;42;40;35m⢸[0m[38;2;255;250;231m⣿[0m[38;2;255;245;227m⡿[0m[38;2;254;244;226m⠿[0m[38;2;252;243;225m⠛[0m[38;2;253;243;225m⠛[0m[38;2;253;243;225m⠛[0m[38;2;253;243;225m⠿[0m[38;2;253;243;225m⠛[0m[38;2;255;245;227m⢛[0m[38;2;255;255;236m⣋[0m[38;2;255;255;238m⣉[0m[38;2;168;161;148m⣀[0m[38;2;255;255;255m⣿[0m[38;2;17;17;7m⠀[0m[38;2;234;234;0m⣿[0m[38;2;192;192;0m⣧[0m[38;2;0;0;0m⡀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m[38;2;0;0;0m⠀[0m
 | 
			
		||||
    ";
 | 
			
		||||
 | 
			
		||||
    let mut sys = System::new_all();
 | 
			
		||||
    sys.refresh_all();
 | 
			
		||||
 | 
			
		||||
    let s = x.to_string();
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "logo" => println!("{}", logo),
 | 
			
		||||
        "color" => println!("{}", color),
 | 
			
		||||
        "avatar" => println!("{}", avatar),
 | 
			
		||||
        "avatar_color" => println!("{}", avatar_color),
 | 
			
		||||
        "os" => println!("{}\n\t", color),
 | 
			
		||||
        _ => println!("not matched"),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    println!("total memory: {} bytes", sys.total_memory());
 | 
			
		||||
    println!("System name:             {:?}", System::name().unwrap());
 | 
			
		||||
    println!("System kernel version:   {:?}", System::kernel_version().unwrap());
 | 
			
		||||
    //println!("System OS version:       {:?}", System::os_version().unwrap());
 | 
			
		||||
    println!("System host name:        {:?}", System::host_name().unwrap());
 | 
			
		||||
    println!("NB CPUs: {}", sys.cpus().len());
 | 
			
		||||
 | 
			
		||||
    //let disks = Disks::new_with_refreshed_list();
 | 
			
		||||
    //for disk in &disks {
 | 
			
		||||
    //    println!("{disk:?}");
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    //let networks = Networks::new_with_refreshed_list();
 | 
			
		||||
    //println!("=> networks:");
 | 
			
		||||
    //for (interface_name, data) in &networks {
 | 
			
		||||
    //    println!("{interface_name}: {}/{} B", data.received(), data.transmitted());
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    //let components = Components::new_with_refreshed_list();
 | 
			
		||||
    //println!("=> components:");
 | 
			
		||||
    //for component in &components {
 | 
			
		||||
    //    println!("{component:?}");
 | 
			
		||||
    //}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										186
									
								
								src/bot.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								src/bot.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,186 @@
 | 
			
		||||
use seahorse::Context;
 | 
			
		||||
use std::process::Command;
 | 
			
		||||
 | 
			
		||||
use crate::refresh;
 | 
			
		||||
use crate::reply;
 | 
			
		||||
use crate::reply_link;
 | 
			
		||||
use crate::notify;
 | 
			
		||||
use crate::openai;
 | 
			
		||||
use crate::notify_read;
 | 
			
		||||
 | 
			
		||||
use crate::data::log_file;
 | 
			
		||||
use crate::data::data_scpt;
 | 
			
		||||
use crate::data::w_cid;
 | 
			
		||||
use crate::data::c_char;
 | 
			
		||||
use crate::data::Notify as Notify;
 | 
			
		||||
 | 
			
		||||
pub fn c_bot(c: &Context) {
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let mut notify = notify::get_request(100).await;
 | 
			
		||||
        if notify == "err" {
 | 
			
		||||
            refresh(c);
 | 
			
		||||
            notify = notify::get_request(100).await;
 | 
			
		||||
        }
 | 
			
		||||
        let notify: Notify = serde_json::from_str(¬ify).unwrap();
 | 
			
		||||
 | 
			
		||||
        let n = notify.notifications;
 | 
			
		||||
        let length = &n.len();
 | 
			
		||||
        let su = 0..*length;
 | 
			
		||||
        for i in su {
 | 
			
		||||
            let reason = &n[i].reason;
 | 
			
		||||
            let handle = &n[i].author.handle;
 | 
			
		||||
            let did = &n[i].author.did;
 | 
			
		||||
            let read = n[i].isRead;
 | 
			
		||||
            let cid = &n[i].cid;
 | 
			
		||||
            let uri = &n[i].uri;
 | 
			
		||||
            let time = &n[i].indexedAt;
 | 
			
		||||
            let mut cid_root = cid;
 | 
			
		||||
            let mut uri_root = uri;
 | 
			
		||||
            let check_cid = w_cid(cid.to_string(), log_file(&"n1"), false);
 | 
			
		||||
            let check_cid_run = w_cid(cid.to_string(), log_file(&"n2"), false);
 | 
			
		||||
            // thread
 | 
			
		||||
            if ! n[i].record.reply.is_none() {
 | 
			
		||||
                cid_root = &n[i].record.reply.as_ref().unwrap().root.cid;
 | 
			
		||||
                uri_root = &n[i].record.reply.as_ref().unwrap().root.uri;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let mut text = "";
 | 
			
		||||
            if ! n[i].record.text.is_none() { 
 | 
			
		||||
                text = &n[i].record.text.as_ref().unwrap();
 | 
			
		||||
            }
 | 
			
		||||
            let vec: Vec<&str> = text.split_whitespace().collect();
 | 
			
		||||
            let handlev: Vec<&str> = handle.split('.').collect();
 | 
			
		||||
            let mut handlev = handlev[0].trim().to_string();
 | 
			
		||||
 | 
			
		||||
            let mut link = "https://card.syui.ai/".to_owned() + &handlev;
 | 
			
		||||
            let s = 0;
 | 
			
		||||
            let mut e = link.chars().count();
 | 
			
		||||
 | 
			
		||||
            let mut com = "".to_string();
 | 
			
		||||
            let mut prompt = "".to_string();
 | 
			
		||||
            let mut prompt_sub = "".to_string();
 | 
			
		||||
            if reason == "mention" {
 | 
			
		||||
                com = vec[1].trim().to_string();
 | 
			
		||||
                prompt = vec[2..].join(" ");
 | 
			
		||||
                if vec.len() > 2 {
 | 
			
		||||
                    prompt_sub = vec[3..].join(" ");
 | 
			
		||||
                }
 | 
			
		||||
            } else if reason == "reply" {
 | 
			
		||||
                com = vec[0].trim().to_string();
 | 
			
		||||
                prompt = vec[1..].join(" ");
 | 
			
		||||
                if vec.len() > 1 {
 | 
			
		||||
                    prompt_sub = vec[2..].join(" ");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if prompt.is_empty() == false || com.is_empty() == false {
 | 
			
		||||
                println!("{}", read);
 | 
			
		||||
                println!("{}", handle);
 | 
			
		||||
                println!("cid:{}\nuri:{}\ncid_root:{}\nuri_root:{}", cid, uri, cid_root, uri_root);
 | 
			
		||||
                println!("reason:{}\ncom:{}\nprompt:{}", reason, com, prompt);
 | 
			
		||||
                println!("prompt_sub:{}", prompt_sub);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if check_cid == false && { reason == "mention" || reason == "reply" } || check_cid_run == false && { reason == "mention" || reason == "reply" } {
 | 
			
		||||
                
 | 
			
		||||
                w_cid(cid.to_string(), log_file(&"n2"), true);
 | 
			
		||||
                if com == "/did" || com == "did" {
 | 
			
		||||
                    let link = "https://plc.directory/".to_owned() + &did + &"/log";
 | 
			
		||||
                    let s = 0;
 | 
			
		||||
                    let e = link.chars().count();
 | 
			
		||||
                    let d = "\n".to_owned() + &did.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(text_limit.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/diffusers" || com == "diffusers" {
 | 
			
		||||
                    let _output = Command::new(data_scpt(&"diffusers")).arg(&did).arg(&prompt).output().expect("zsh");
 | 
			
		||||
                    let _output = Command::new(data_scpt(&"at_img")).arg(&cid).arg(&uri).output().expect("zsh");
 | 
			
		||||
                    w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                } else if prompt.contains("占") == true || prompt.contains("うらない") == true || prompt.contains("うらなって") == true {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"card_fortune")).arg(&handle).arg(&did).arg(&cid).arg(&uri).output().expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let d = d.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        println!("{}", text_limit);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/card" || com == "card" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_card")).arg(&handle).arg(&did).arg(&prompt).output().expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        if d.contains("handle") == false {
 | 
			
		||||
                            let str_rep = reply_link::post_request(text_limit.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                            println!("{}", str_rep);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            handlev = handle.replace(".", "-").to_string();
 | 
			
		||||
                            link = "https://card.syui.ai/".to_owned() + &handlev;
 | 
			
		||||
                            e = link.chars().count();
 | 
			
		||||
                            let str_rep = reply_link::post_request(d.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                            println!("{}", str_rep);
 | 
			
		||||
                        }
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/fav" || com == "fav" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_fav")).arg(&handle).arg(&did).arg(&prompt).output().expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(d.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/egg" || com == "egg" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_egg")).arg(&handle).arg(&did).arg(&prompt).output().expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(d.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/nyan" || com == "nyan" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"nyancat")).arg(&handle).arg(&did).arg(&cid).arg(&uri).arg(&prompt).output().expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let dd = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(dd);
 | 
			
		||||
                    println!("{}", text_limit);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply::post_request(text_limit.to_string(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if com == "/ten" || com == "ten" {
 | 
			
		||||
                    let output = Command::new(data_scpt(&"api_ten")).arg(&handle).arg(&did).arg(&cid).arg(&uri).arg(&prompt).arg(&prompt_sub).output().expect("zsh");
 | 
			
		||||
                    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
                    let d = "\n".to_owned() + &d.to_string();
 | 
			
		||||
                    let text_limit = c_char(d);
 | 
			
		||||
                    if text_limit.len() > 3 {
 | 
			
		||||
                        let str_rep = reply_link::post_request(text_limit.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                        println!("{}", str_rep);
 | 
			
		||||
                        w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    // openai
 | 
			
		||||
                    let str_openai = openai::post_request(prompt.to_string()).await;
 | 
			
		||||
                    let text_limit = c_char(str_openai);
 | 
			
		||||
                    let str_rep = reply::post_request(text_limit.to_string(), cid.to_string(), uri.to_string(), cid_root.to_string(), uri_root.to_string()).await;
 | 
			
		||||
                    println!("{}", str_rep);
 | 
			
		||||
                    w_cid(cid.to_string(), log_file(&"n1"), true);
 | 
			
		||||
                }
 | 
			
		||||
                let str_notify = notify_read::post_request(time.to_string()).await;
 | 
			
		||||
                println!("{}", str_notify);
 | 
			
		||||
                println!("---");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										562
									
								
								src/data.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										562
									
								
								src/data.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,562 @@
 | 
			
		||||
use seahorse::Context;
 | 
			
		||||
use config::{Config, ConfigError, File};
 | 
			
		||||
use serde_derive::{Deserialize, Serialize};
 | 
			
		||||
use std::fs;
 | 
			
		||||
use std::io::Write;
 | 
			
		||||
use std::io::Read;
 | 
			
		||||
use std::fs::OpenOptions;
 | 
			
		||||
use std::path::Path;
 | 
			
		||||
 | 
			
		||||
pub fn data_file(s: &str) -> String { 
 | 
			
		||||
    let file = "/.config/ai/";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    let path = Path::new(&f);
 | 
			
		||||
    if path.is_dir() == false {
 | 
			
		||||
        let _ = fs::create_dir_all(f.clone());
 | 
			
		||||
    }
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "toml" => f + &"token.toml",
 | 
			
		||||
        "json" => f + &"token.json",
 | 
			
		||||
        _ => f + &"." + &s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn log_file(s: &str) -> String { 
 | 
			
		||||
    let file = "/.config/ai/txt/";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    let path = Path::new(&f);
 | 
			
		||||
    if path.is_dir() == false {
 | 
			
		||||
        let _ = fs::create_dir_all(f.clone());
 | 
			
		||||
    }
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "n1" => f + &"notify_cid.txt",
 | 
			
		||||
        "n2" => f + &"notify_cid_run.txt",
 | 
			
		||||
        _ => f + &s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Token {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = data_file("json");
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Data {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = data_file("toml");
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Token {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub accessJwt: String,
 | 
			
		||||
    pub refreshJwt: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Data {
 | 
			
		||||
    pub host: String,
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub access: String,
 | 
			
		||||
    pub refresh: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
pub struct BaseUrl {
 | 
			
		||||
    pub profile_get: String,
 | 
			
		||||
    pub thread_get: String,
 | 
			
		||||
    pub describe: String,
 | 
			
		||||
    pub record_list: String,
 | 
			
		||||
    pub record_create: String,
 | 
			
		||||
    pub record_delete: String,
 | 
			
		||||
    pub session_create: String,
 | 
			
		||||
    pub session_refresh: String,
 | 
			
		||||
    pub session_get: String,
 | 
			
		||||
    pub timeline_get: String,
 | 
			
		||||
    pub timeline_author: String,
 | 
			
		||||
    pub upload_blob: String,
 | 
			
		||||
    pub update_handle: String,
 | 
			
		||||
    pub account_create: String,
 | 
			
		||||
    pub notify_count: String,
 | 
			
		||||
    pub notify_list: String,
 | 
			
		||||
    pub notify_update: String,
 | 
			
		||||
    pub repo_update: String,
 | 
			
		||||
    pub like: String,
 | 
			
		||||
    pub repost: String,
 | 
			
		||||
    pub follow: String,
 | 
			
		||||
    pub follows: String,
 | 
			
		||||
    pub followers: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn url(s: &str) -> String {
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
    let data = Data::new().unwrap();
 | 
			
		||||
    let data = Data {
 | 
			
		||||
        host: data.host,
 | 
			
		||||
        handle: data.handle,
 | 
			
		||||
        did: data.did,
 | 
			
		||||
        access: data.access,
 | 
			
		||||
        refresh: data.refresh,
 | 
			
		||||
    };
 | 
			
		||||
    let t = "https://".to_string() + &data.host.to_string() + &"/xrpc/".to_string();
 | 
			
		||||
    let baseurl = BaseUrl {
 | 
			
		||||
        profile_get: "com.atproto.identity.resolveHandle".to_string(),
 | 
			
		||||
        thread_get: "app.bsky.feed.getPostThread".to_string(),
 | 
			
		||||
        record_create: "com.atproto.repo.createRecord".to_string(),
 | 
			
		||||
        record_delete: "com.atproto.repo.deleteRecord".to_string(),
 | 
			
		||||
        describe: "com.atproto.repo.describeRepo".to_string(),
 | 
			
		||||
        record_list: "com.atproto.repo.listRecords".to_string(),
 | 
			
		||||
        session_create: "com.atproto.server.createSession".to_string(),
 | 
			
		||||
        session_refresh: "com.atproto.server.refreshSession".to_string(),
 | 
			
		||||
        session_get: "com.atproto.server.getSession".to_string(),
 | 
			
		||||
        timeline_get: "app.bsky.feed.getTimeline".to_string(),
 | 
			
		||||
        timeline_author: "app.bsky.feed.getAuthorFeed".to_string(),
 | 
			
		||||
        like: "app.bsky.feed.like".to_string(),
 | 
			
		||||
        repost: "app.bsky.feed.repost".to_string(),
 | 
			
		||||
        follow: "app.bsky.graph.follow".to_string(),
 | 
			
		||||
        follows: "app.bsky.graph.getFollows".to_string(),
 | 
			
		||||
        followers: "app.bsky.graph.getFollowers".to_string(),
 | 
			
		||||
        upload_blob: "com.atproto.repo.uploadBlob".to_string(),
 | 
			
		||||
        account_create: "com.atproto.server.createAccount".to_string(),
 | 
			
		||||
        update_handle: "com.atproto.identity.updateHandle".to_string(),
 | 
			
		||||
        notify_count: "app.bsky.notification.getUnreadCount".to_string(),
 | 
			
		||||
        notify_list: "app.bsky.notification.listNotifications".to_string(),
 | 
			
		||||
        notify_update: "app.bsky.notification.updateSeen".to_string(),
 | 
			
		||||
        repo_update: "com.atproto.sync.updateRepo".to_string(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "profile_get" => t.to_string() + &baseurl.profile_get,
 | 
			
		||||
        "thread_get" => t.to_string() + &baseurl.thread_get,
 | 
			
		||||
        "describe" => t.to_string() + &baseurl.describe,
 | 
			
		||||
        "record_list" => t.to_string() + &baseurl.record_list,
 | 
			
		||||
        "record_create" => t.to_string() + &baseurl.record_create,
 | 
			
		||||
        "record_delete" => t.to_string() + &baseurl.record_delete,
 | 
			
		||||
        "session_create" => t.to_string() + &baseurl.session_create,
 | 
			
		||||
        "session_refresh" => t.to_string() + &baseurl.session_refresh,
 | 
			
		||||
        "session_get" => t.to_string() + &baseurl.session_get,
 | 
			
		||||
        "timeline_get" => t.to_string() + &baseurl.timeline_get,
 | 
			
		||||
        "timeline_author" => t.to_string() + &baseurl.timeline_get,
 | 
			
		||||
        "upload_blob" => t.to_string() + &baseurl.upload_blob,
 | 
			
		||||
        "account_create" => t.to_string() + &baseurl.account_create,
 | 
			
		||||
        "update_handle" => t.to_string() + &baseurl.update_handle,
 | 
			
		||||
        "notify_list" => t.to_string() + &baseurl.notify_list,
 | 
			
		||||
        "notify_count" => t.to_string() + &baseurl.notify_count,
 | 
			
		||||
        "notify_update" => t.to_string() + &baseurl.notify_update,
 | 
			
		||||
        "repo_update" => t.to_string() + &baseurl.repo_update,
 | 
			
		||||
        "like" => t.to_string() + &baseurl.like,
 | 
			
		||||
        "repost" => t.to_string() + &baseurl.repost,
 | 
			
		||||
        "follow" => t.to_string() + &baseurl.follow,
 | 
			
		||||
        "follows" => t.to_string() + &baseurl.follows,
 | 
			
		||||
        "followers" => t.to_string() + &baseurl.followers,
 | 
			
		||||
        _ => s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn data_toml(s: &str) -> String { 
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
    let data = Data::new().unwrap();
 | 
			
		||||
    let data = Data {
 | 
			
		||||
        host: data.host,
 | 
			
		||||
        handle: data.handle,
 | 
			
		||||
        did: data.did,
 | 
			
		||||
        access: data.access,
 | 
			
		||||
        refresh: data.refresh,
 | 
			
		||||
    };
 | 
			
		||||
    match &*s {
 | 
			
		||||
        "host" => data.handle,
 | 
			
		||||
        "handle" => data.handle,
 | 
			
		||||
        "did" => data.did,
 | 
			
		||||
        "access" => data.access,
 | 
			
		||||
        "refresh" => data.refresh,
 | 
			
		||||
        _ => s,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn data_scpt(s: &str) -> String {
 | 
			
		||||
    let s = String::from(s);
 | 
			
		||||
    let file = "/.config/ai/scpt/".to_owned() + &s + &".zsh";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    return f
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Notify {
 | 
			
		||||
    pub notifications: Vec<Notifications>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Status {
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub did: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct DidDocs {
 | 
			
		||||
    pub verificationMethod: Vec<VerificationMethod>,
 | 
			
		||||
    pub service: Vec<Service>,
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub alsoKnownAs: Vec<AlsoKnownAs>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct VerificationMethod {
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub r#type: String,
 | 
			
		||||
    pub controller: String,
 | 
			
		||||
    pub publicKeyMultibase: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Service {
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub r#type: String,
 | 
			
		||||
    pub serviceEndpoint: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct AlsoKnownAs {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Timeline {
 | 
			
		||||
    pub feed: Vec<Feed>
 | 
			
		||||
}
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Session {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub email: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
}
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Follow {
 | 
			
		||||
    pub follows: Vec<Author>,
 | 
			
		||||
    pub cursor: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Notifications {
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub author: Author,
 | 
			
		||||
    pub reason: String,
 | 
			
		||||
    //pub reasonSubject: String,
 | 
			
		||||
    pub record: Record,
 | 
			
		||||
    pub isRead: bool,
 | 
			
		||||
    pub indexedAt: String,
 | 
			
		||||
    //pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Thread {
 | 
			
		||||
    pub r#type: String,
 | 
			
		||||
    pub post: String,
 | 
			
		||||
    pub root: String,
 | 
			
		||||
    pub author: Author,
 | 
			
		||||
    pub reason: String,
 | 
			
		||||
    //pub reasonSubject: String,
 | 
			
		||||
    pub record: Record,
 | 
			
		||||
    pub isRead: bool,
 | 
			
		||||
    pub indexedAt: String,
 | 
			
		||||
    //pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Author {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    //pub declaration: Declaration,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
    pub displayName: Option<String>,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub avatar: Option<String>,
 | 
			
		||||
    pub viewer: Viewer,
 | 
			
		||||
    //pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Labels {
 | 
			
		||||
    pub src: Option<String>,
 | 
			
		||||
    pub uri: Option<String>,
 | 
			
		||||
    pub cid: Option<String>,
 | 
			
		||||
    pub val: Option<String>,
 | 
			
		||||
    pub cts: Option<String>,
 | 
			
		||||
    pub neg: Option<bool>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Declaration {
 | 
			
		||||
    pub actorType: String,
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Viewer {
 | 
			
		||||
    pub muted: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Record {
 | 
			
		||||
    pub text: Option<String>,
 | 
			
		||||
    pub createdAt: String,
 | 
			
		||||
    pub reply: Option<Reply>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Reply {
 | 
			
		||||
    pub parent: ReplyParent,
 | 
			
		||||
    pub root: ReplyRoot,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct ReplyRoot {
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct ReplyParent {
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Langs {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Feed {
 | 
			
		||||
    pub post: Post,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Post {
 | 
			
		||||
    pub did: Option<String>,
 | 
			
		||||
    pub uri: String,
 | 
			
		||||
    pub cid: String,
 | 
			
		||||
    pub collection: Option<String>,
 | 
			
		||||
    pub record: Record,
 | 
			
		||||
    pub author: Author,
 | 
			
		||||
    pub reason: Option<String>,
 | 
			
		||||
    pub indexedAt: String,
 | 
			
		||||
    pub replyCount: i32,
 | 
			
		||||
    pub postCount: Option<i32>,
 | 
			
		||||
    pub repostCount: i32,
 | 
			
		||||
    pub likeCount: i32,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Cid {
 | 
			
		||||
    pub cid: String
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Img {
 | 
			
		||||
    pub blob: Blob
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Blob {
 | 
			
		||||
    pub r#ref: Ref,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Ref {
 | 
			
		||||
    pub link: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
pub struct Handle {
 | 
			
		||||
    pub handle: String
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//#[derive(Serialize, Deserialize)]
 | 
			
		||||
//pub struct Did {
 | 
			
		||||
//    pub did: String
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
//#[derive(Serialize, Deserialize)]
 | 
			
		||||
//pub struct Labels {
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//#[derive(Serialize, Deserialize)]
 | 
			
		||||
//pub struct Viewer {
 | 
			
		||||
//    pub muted: bool,
 | 
			
		||||
//    pub blockedBy: bool,
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct ProfileIdentityResolve {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize)]
 | 
			
		||||
#[allow(non_snake_case)]
 | 
			
		||||
pub struct Profile {
 | 
			
		||||
    pub did: String,
 | 
			
		||||
    pub handle: String,
 | 
			
		||||
    pub followsCount: Option<i32>,
 | 
			
		||||
    pub followersCount: Option<i32>,
 | 
			
		||||
    pub postsCount: i32,
 | 
			
		||||
    pub indexedAt: Option<String>,
 | 
			
		||||
    pub avatar: Option<String>,
 | 
			
		||||
    pub banner: Option<String>,
 | 
			
		||||
    pub displayName: Option<String>,
 | 
			
		||||
    pub description: Option<String>,
 | 
			
		||||
    pub viewer: Viewer,
 | 
			
		||||
    pub labels: Labels,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_char(i: String) -> String {
 | 
			
		||||
    let l = 250;
 | 
			
		||||
    let mut s = String::new();
 | 
			
		||||
    for ii in i.chars().enumerate() {
 | 
			
		||||
        match ii.0 {
 | 
			
		||||
            n if n > l.try_into().unwrap() => {break}
 | 
			
		||||
            _ => {s.push(ii.1)}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn w_cfg(h: &str, res: &str) {
 | 
			
		||||
    let f = data_file(&"json");
 | 
			
		||||
    let ff = data_file(&"toml");
 | 
			
		||||
    let mut f = fs::File::create(f.clone()).unwrap();
 | 
			
		||||
    let mut ff = fs::File::create(ff.clone()).unwrap();
 | 
			
		||||
    f.write_all(&res.as_bytes()).unwrap();
 | 
			
		||||
    let json: Token = serde_json::from_str(&res).unwrap();
 | 
			
		||||
    let datas = Data {
 | 
			
		||||
        host: h.to_string(),
 | 
			
		||||
        did: json.did.to_string(),
 | 
			
		||||
        handle: json.handle.to_string(),
 | 
			
		||||
        access: json.accessJwt.to_string(),
 | 
			
		||||
        refresh: json.refreshJwt.to_string(),
 | 
			
		||||
    };
 | 
			
		||||
    let toml = toml::to_string(&datas).unwrap();
 | 
			
		||||
    ff.write_all(&toml.as_bytes()).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn w_cid(cid :String, file: String, t: bool) -> bool {
 | 
			
		||||
    let f = file;
 | 
			
		||||
    let mut file = match OpenOptions::new()
 | 
			
		||||
        .create(true)
 | 
			
		||||
        .write(true)
 | 
			
		||||
        .read(true)
 | 
			
		||||
        .append(true)
 | 
			
		||||
        .open(f.clone())
 | 
			
		||||
        {
 | 
			
		||||
            Err(why) => panic!("Couldn't open {}: {}", f, why),
 | 
			
		||||
            Ok(file) => file,
 | 
			
		||||
        };
 | 
			
		||||
    let mut contents = String::new();
 | 
			
		||||
 | 
			
		||||
    match file.read_to_string(&mut contents) {
 | 
			
		||||
        Err(why) => panic!("Couldn't read {}: {}", f, why),
 | 
			
		||||
        Ok(_) => (),
 | 
			
		||||
    }
 | 
			
		||||
    if contents.contains(&cid) == false {
 | 
			
		||||
        if t {
 | 
			
		||||
            let cid = cid + "\n";
 | 
			
		||||
            match file.write_all(cid.as_bytes()) {
 | 
			
		||||
                Err(why) => panic!("Couldn't write \"{}\" to {}: {}", contents, f, why),
 | 
			
		||||
                Ok(_) => println!("finished"),
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let check = false;
 | 
			
		||||
        return check
 | 
			
		||||
    } else { 
 | 
			
		||||
        let check = true;
 | 
			
		||||
        return check 
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_follow_all() {
 | 
			
		||||
    let file = "/.config/ai/scpt/follow_all.zsh";
 | 
			
		||||
    let mut f = shellexpand::tilde("~").to_string();
 | 
			
		||||
    f.push_str(&file);
 | 
			
		||||
    use std::process::Command;
 | 
			
		||||
    let output = Command::new(&f).output().expect("zsh");
 | 
			
		||||
    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
    let d = "\n".to_owned() + &d.to_string();
 | 
			
		||||
    println!("{}", d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn c_openai_key(c: &Context) {
 | 
			
		||||
    let api = c.args[0].to_string();
 | 
			
		||||
    let o = "api='".to_owned() + &api.to_string() + &"'".to_owned();
 | 
			
		||||
    let o = o.to_string();
 | 
			
		||||
    let l = shellexpand::tilde("~") + "/.config/ai/openai.toml";
 | 
			
		||||
    let l = l.to_string();
 | 
			
		||||
    let mut l = fs::File::create(l).unwrap();
 | 
			
		||||
    if o != "" {
 | 
			
		||||
        l.write_all(&o.as_bytes()).unwrap();
 | 
			
		||||
    }
 | 
			
		||||
    println!("{:#?}", l);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Open {
 | 
			
		||||
    pub fn new() -> Result<Self, ConfigError> {
 | 
			
		||||
        let d = shellexpand::tilde("~") + "/.config/ai/openai.toml";
 | 
			
		||||
        let s = Config::builder()
 | 
			
		||||
            .add_source(File::with_name(&d))
 | 
			
		||||
            .add_source(config::Environment::with_prefix("APP"))
 | 
			
		||||
            .build()?;
 | 
			
		||||
        s.try_deserialize()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Deserialize)]
 | 
			
		||||
pub struct Open {
 | 
			
		||||
    pub api: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
pub struct OpenData {
 | 
			
		||||
    choices: Vec<Choices>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
pub struct Choices {
 | 
			
		||||
    text: String,
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								src/describe.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/describe.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
//use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(user: String) -> String {
 | 
			
		||||
 | 
			
		||||
    //let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"describe");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("repo", &user)])
 | 
			
		||||
        //.header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										82
									
								
								src/follow.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/follow.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
//use crate::data::Follow;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(u: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.graph.follow".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": u.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn delete_request(u: String, rkey: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_delete");
 | 
			
		||||
    let col = "app.bsky.graph.follow".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "rkey": rkey.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": u.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								src/followers.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/followers.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
//use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(actor: String, cursor: Option<String>) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"followers");
 | 
			
		||||
    let cursor = cursor.unwrap();
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("actor", actor),("cursor", cursor)])
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								src/follows.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/follows.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
//use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(actor: String, cursor: Option<String>) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"follows");
 | 
			
		||||
    let cursor = cursor.unwrap();
 | 
			
		||||
    //let cursor = "1682386039125::bafyreihwgwozmvqxcxrhbr65agcaa4v357p27ccrhzkjf3mz5xiozjvzfa".to_string();
 | 
			
		||||
    //let cursor = "1682385956974::bafyreihivhux5m3sxbg33yruhw5ozhahwspnuqdsysbo57smzgptdcluem".to_string();
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
        let res = client
 | 
			
		||||
            .get(url)
 | 
			
		||||
            .query(&[("actor", actor),("cursor", cursor)])
 | 
			
		||||
            //cursor.unwrap()
 | 
			
		||||
            .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
            .send()
 | 
			
		||||
            .await
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            .text()
 | 
			
		||||
            .await
 | 
			
		||||
            .unwrap();
 | 
			
		||||
        return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								src/img.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/img.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.images",
 | 
			
		||||
                "images": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "alt": "",
 | 
			
		||||
                        "image": {
 | 
			
		||||
                            "$type":"blob",
 | 
			
		||||
                            "ref": {
 | 
			
		||||
                                "$link" : link.to_string()
 | 
			
		||||
                            },
 | 
			
		||||
                            "mimeType": "image/png",
 | 
			
		||||
                                "size": 0
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								src/img_reply.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/img_reply.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String, cid: String, uri: String, itype: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.images",
 | 
			
		||||
                "images": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "alt": "",
 | 
			
		||||
                        "image": {
 | 
			
		||||
                            "$type":"blob",
 | 
			
		||||
                            "ref": {
 | 
			
		||||
                                "$link" : link.to_string()
 | 
			
		||||
                            },
 | 
			
		||||
                            "mimeType": itype.to_string(),
 | 
			
		||||
                                "size": 0
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								src/img_upload.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/img_upload.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.images",
 | 
			
		||||
                "images": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "alt": "",
 | 
			
		||||
                        "image": {
 | 
			
		||||
                            "$type":"blob",
 | 
			
		||||
                            "ref": {
 | 
			
		||||
                                "$link" : link.to_string()
 | 
			
		||||
                            },
 | 
			
		||||
                            "mimeType": "image/png",
 | 
			
		||||
                                "size": 0
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								src/like.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/like.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(cid: String, uri: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.like".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": {
 | 
			
		||||
                "uri": uri.to_string(),
 | 
			
		||||
                "cid": cid.to_string()
 | 
			
		||||
            },
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										525
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										525
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,525 @@
 | 
			
		||||
use seahorse::{App, Command, Context, Flag, FlagType};
 | 
			
		||||
use std::env;
 | 
			
		||||
 | 
			
		||||
use crate::ascii::c_ascii;
 | 
			
		||||
use crate::data::data_toml;
 | 
			
		||||
use crate::data::url;
 | 
			
		||||
use crate::data::w_cfg;
 | 
			
		||||
use crate::data::c_follow_all;
 | 
			
		||||
use crate::bot::c_bot;
 | 
			
		||||
use crate::data::c_openai_key;
 | 
			
		||||
 | 
			
		||||
use data::ProfileIdentityResolve as ProfileIdentityResolve;
 | 
			
		||||
 | 
			
		||||
pub mod ascii;
 | 
			
		||||
pub mod data;
 | 
			
		||||
pub mod refresh;
 | 
			
		||||
pub mod token;
 | 
			
		||||
pub mod session;
 | 
			
		||||
pub mod notify;
 | 
			
		||||
pub mod notify_read;
 | 
			
		||||
pub mod reply;
 | 
			
		||||
pub mod reply_og;
 | 
			
		||||
pub mod reply_link;
 | 
			
		||||
pub mod describe;
 | 
			
		||||
pub mod timeline_author;
 | 
			
		||||
pub mod post;
 | 
			
		||||
pub mod post_link;
 | 
			
		||||
pub mod mention;
 | 
			
		||||
pub mod profile;
 | 
			
		||||
pub mod follow;
 | 
			
		||||
pub mod follows;
 | 
			
		||||
pub mod followers;
 | 
			
		||||
pub mod like;
 | 
			
		||||
pub mod repost;
 | 
			
		||||
pub mod img_reply;
 | 
			
		||||
pub mod bot;
 | 
			
		||||
pub mod openai;
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let args: Vec<String> = env::args().collect();
 | 
			
		||||
    let app = App::new(env!("CARGO_PKG_NAME"))
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("ai")
 | 
			
		||||
            .alias("a")
 | 
			
		||||
            .action(ascii_art)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("type", FlagType::String)
 | 
			
		||||
                .description("type flag")
 | 
			
		||||
                .alias("t"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("bot")
 | 
			
		||||
            .alias("b")
 | 
			
		||||
            .action(bot),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("follow_all")
 | 
			
		||||
            .action(follow_all),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("login")
 | 
			
		||||
            .alias("l")
 | 
			
		||||
            .description("l <handle> -p <password>\n\t\t\tl <handle> -p <password> -s <server>")
 | 
			
		||||
            .action(token)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("password", FlagType::String)
 | 
			
		||||
                .description("password flag")
 | 
			
		||||
                .alias("p"),
 | 
			
		||||
                )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("server", FlagType::String)
 | 
			
		||||
                .description("server flag")
 | 
			
		||||
                .alias("s"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("refresh")
 | 
			
		||||
            .alias("r")
 | 
			
		||||
            .action(refresh),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("notify")
 | 
			
		||||
            .alias("n")
 | 
			
		||||
            .action(notify),
 | 
			
		||||
            )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("timeline")
 | 
			
		||||
            .alias("t")
 | 
			
		||||
            .action(timeline),
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("did")
 | 
			
		||||
            .description("did <handle>")
 | 
			
		||||
            .action(did)
 | 
			
		||||
            )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("post")
 | 
			
		||||
            .description("p <text>")
 | 
			
		||||
            .alias("p")
 | 
			
		||||
            .action(post)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("like")
 | 
			
		||||
            .description("like <cid> -u <uri>")
 | 
			
		||||
            .action(like)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("repost")
 | 
			
		||||
            .description("repost <cid> -u <uri>")
 | 
			
		||||
            .action(repost)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("reply-og")
 | 
			
		||||
            .description("reply-og <text> -c <cid> -u <uri> -i <img> -t <title> -d <description> -l <link>")
 | 
			
		||||
            .action(reply_og)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cid", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("title", FlagType::String)
 | 
			
		||||
                .alias("t"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("description", FlagType::String)
 | 
			
		||||
                .alias("d"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("img", FlagType::String)
 | 
			
		||||
                .alias("i"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("reply")
 | 
			
		||||
            .description("r <text> -u <uri> -c <cid>")
 | 
			
		||||
            .action(reply)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cid", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .description("-l <link>")
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("mention")
 | 
			
		||||
            .description("@ <handle> -p <text>")
 | 
			
		||||
            .alias("@")
 | 
			
		||||
            .action(mention)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("post", FlagType::String)
 | 
			
		||||
                .alias("p"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("follow")
 | 
			
		||||
            .description("follow <did>")
 | 
			
		||||
            .action(follow)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("follows", FlagType::Bool)
 | 
			
		||||
                .alias("s"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("delete", FlagType::String)
 | 
			
		||||
                .alias("d"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("followers", FlagType::Bool)
 | 
			
		||||
                .alias("w"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("all", FlagType::Bool)
 | 
			
		||||
                .alias("a"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cursor", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("profile")
 | 
			
		||||
            .description("pro <handle>")
 | 
			
		||||
            .alias("pro")
 | 
			
		||||
            .action(profile)
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("img-upload")
 | 
			
		||||
            .description("img-upload <img>")
 | 
			
		||||
            .action(img_upload)
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("img-post")
 | 
			
		||||
            .description("img-post <text> -l <link> -u <uri> -c <cid>")
 | 
			
		||||
            .action(img_post)
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("link", FlagType::String)
 | 
			
		||||
                .alias("l"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("uri", FlagType::String)
 | 
			
		||||
                .alias("u"),
 | 
			
		||||
            )
 | 
			
		||||
            .flag(
 | 
			
		||||
                Flag::new("cid", FlagType::String)
 | 
			
		||||
                .alias("c"),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("openai")
 | 
			
		||||
            .description("openai <text>")
 | 
			
		||||
            .alias("chat")
 | 
			
		||||
            .action(openai)
 | 
			
		||||
        )
 | 
			
		||||
        .command(
 | 
			
		||||
            Command::new("openai-key")
 | 
			
		||||
            .description("openai-key <API_KEY>")
 | 
			
		||||
            .action(openai_key),
 | 
			
		||||
        )
 | 
			
		||||
        ;
 | 
			
		||||
    app.run(args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn ascii_art(c: &Context) {
 | 
			
		||||
    if let Ok(t) = c.string_flag("type") {
 | 
			
		||||
        c_ascii(&t);
 | 
			
		||||
    } else {
 | 
			
		||||
        c_ascii("color");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn bot(c: &Context) {
 | 
			
		||||
    loop {
 | 
			
		||||
        c_bot(c);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn follow_all(_c: &Context) {
 | 
			
		||||
    c_follow_all();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn openai_key(c: &Context) {
 | 
			
		||||
    c_openai_key(c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn token(c: &Context) {
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(p) = c.string_flag("password") {
 | 
			
		||||
            if let Ok(s) = c.string_flag("server") {
 | 
			
		||||
                let res = token::post_request(m.to_string(), p.to_string(), s.to_string()).await;
 | 
			
		||||
                w_cfg(&s, &res)
 | 
			
		||||
            } else {
 | 
			
		||||
                let res = token::post_request(m.to_string(), p.to_string(), "bsky.social".to_string()).await;
 | 
			
		||||
                w_cfg(&"bsky.social", &res)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn refresh(_c: &Context) {
 | 
			
		||||
    let server = data_toml(&"host");
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let session = session::get_request().await;
 | 
			
		||||
        if session == "err" {
 | 
			
		||||
            let res = refresh::post_request().await;
 | 
			
		||||
            println!("{}", res);
 | 
			
		||||
            w_cfg(&server, &res)
 | 
			
		||||
        } else {
 | 
			
		||||
            println!("no refresh");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn notify(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let j = notify::get_request(100).await;
 | 
			
		||||
        println!("{}", j);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn did(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if c.args.len() == 0 {
 | 
			
		||||
            let j = describe::get_request(data_toml(&"handle")).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        } else {
 | 
			
		||||
            let j = describe::get_request(c.args[0].to_string()).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn timeline(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if c.args.len() == 0 {
 | 
			
		||||
            let str = timeline_author::get_request(data_toml(&"handle").to_string());
 | 
			
		||||
            println!("{}",str.await);    
 | 
			
		||||
        } else {
 | 
			
		||||
            let str = timeline_author::get_request(c.args[0].to_string());
 | 
			
		||||
            println!("{}",str.await);    
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn post(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(link) = c.string_flag("link") {
 | 
			
		||||
            let e = link.chars().count();
 | 
			
		||||
            let s = 0;
 | 
			
		||||
            let str = post_link::post_request(m.to_string(), link.to_string(), s, e.try_into().unwrap());
 | 
			
		||||
            println!("{}",str.await);
 | 
			
		||||
        } else {
 | 
			
		||||
            let str = post::post_request(m.to_string());
 | 
			
		||||
            println!("{}",str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn like(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(uri) = c.string_flag("uri") {
 | 
			
		||||
            let str = like::post_request(m.to_string(), uri);
 | 
			
		||||
            println!("{}",str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn repost(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(uri) = c.string_flag("uri") {
 | 
			
		||||
            let str = repost::post_request(m.to_string(), uri);
 | 
			
		||||
            println!("{}",str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn follow(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let handle = data_toml(&"handle");
 | 
			
		||||
        if let Ok(cursor) = c.string_flag("cursor") {
 | 
			
		||||
            let str = follow::post_request(m.to_string());
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
            //let str = follow::delete_request(m.to_string(), delete.to_string());
 | 
			
		||||
            //let str = followers::get_request(handle,Some("".to_string()));
 | 
			
		||||
            //let str = followers::get_request(handle,Some(cursor.to_string()));
 | 
			
		||||
            //let str = follows::get_request(handle,Some("".to_string()));
 | 
			
		||||
            let str = follows::get_request(handle,Some(cursor.to_string()));
 | 
			
		||||
            println!("{}", str.await);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
fn profile(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if c.args.len() == 0 {
 | 
			
		||||
            let j = profile::get_request(data_toml(&"handle")).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        } else {
 | 
			
		||||
            let j = profile::get_request(c.args[0].to_string()).await;
 | 
			
		||||
            println!("{}", j);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn mention(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let str = profile::get_request(m.to_string()).await;
 | 
			
		||||
        let profile: ProfileIdentityResolve = serde_json::from_str(&str).unwrap();
 | 
			
		||||
        let udid = profile.did;
 | 
			
		||||
        let handle = m.to_string();
 | 
			
		||||
        let at = "@".to_owned() + &handle;
 | 
			
		||||
        let e = at.chars().count();
 | 
			
		||||
        let s = 0;
 | 
			
		||||
        if let Ok(post) = c.string_flag("post") {
 | 
			
		||||
            let str = mention::post_request(post.to_string(), at.to_string(), udid.to_string(), s, e.try_into().unwrap()).await;
 | 
			
		||||
            println!("{}",str);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn reply(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        if let Ok(cid) = c.string_flag("cid") {
 | 
			
		||||
            if let Ok(uri) = c.string_flag("uri") {
 | 
			
		||||
                if let Ok(link) = c.string_flag("link") {
 | 
			
		||||
                    let s = 0;
 | 
			
		||||
                    let e = link.chars().count();
 | 
			
		||||
                    let str = reply_link::post_request(m.to_string(), link.to_string(), s, e.try_into().unwrap(), cid.to_string(), uri.to_string(), cid.to_string(), uri.to_string()).await;
 | 
			
		||||
                    println!("{}", str);
 | 
			
		||||
                } else {
 | 
			
		||||
                    let str = reply::post_request(m.to_string(), cid.to_string(), uri.to_string(), cid.to_string(), uri.to_string()).await;
 | 
			
		||||
                    println!("{}", str);
 | 
			
		||||
                }
 | 
			
		||||
            } 
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
async fn c_img_upload(c: &Context) -> reqwest::Result<()> {
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let atoken = "Authorization: Bearer ".to_owned() + &token;
 | 
			
		||||
    let con = "Content-Type: image/png";
 | 
			
		||||
    let url = url(&"upload_blob");
 | 
			
		||||
    let f = "@".to_owned() + &c.args[0].to_string();
 | 
			
		||||
    use std::process::Command;
 | 
			
		||||
    let output = Command::new("curl").arg("-X").arg("POST").arg("-sL").arg("-H").arg(&con).arg("-H").arg(&atoken).arg("--data-binary").arg(&f).arg(&url).output().expect("curl");
 | 
			
		||||
    let d = String::from_utf8_lossy(&output.stdout);
 | 
			
		||||
    let d =  d.to_string();
 | 
			
		||||
    println!("{}", d);
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn img_upload(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    c_img_upload(c).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn img_post(c: &Context) {
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let link = c.string_flag("link").unwrap();
 | 
			
		||||
    let cid = c.string_flag("cid").unwrap();
 | 
			
		||||
    let uri = c.string_flag("uri").unwrap();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let itype = "image/png";
 | 
			
		||||
        let str = img_reply::post_request(m.to_string(),link.to_string(),cid.to_string(),uri.to_string(), itype.to_string()).await;
 | 
			
		||||
        println!("{}",str);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn reply_og(c: &Context) {
 | 
			
		||||
    refresh(c);
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let link = c.string_flag("link").unwrap();
 | 
			
		||||
    let cid = c.string_flag("cid").unwrap();
 | 
			
		||||
    let uri = c.string_flag("uri").unwrap();
 | 
			
		||||
    let title = c.string_flag("title").unwrap();
 | 
			
		||||
    let desc = c.string_flag("description").unwrap();
 | 
			
		||||
    let img = c.string_flag("img").unwrap();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let str = reply_og::post_request(m, link, cid, uri, img, title, desc);
 | 
			
		||||
        println!("{}",str.await);
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn openai(c: &Context) {
 | 
			
		||||
    let m = c.args[0].to_string();
 | 
			
		||||
    let h = async {
 | 
			
		||||
        let str = openai::post_request(m.to_string()).await;
 | 
			
		||||
        println!("{}", str); 
 | 
			
		||||
    };
 | 
			
		||||
    let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										57
									
								
								src/mention.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/mention.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, at: String, udid: String, s: i32, e: i32) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": at.to_string() + &" ".to_string() + &text.to_string(),
 | 
			
		||||
            "$type": "app.bsky.feed.post",
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "facets": [
 | 
			
		||||
            {
 | 
			
		||||
                "$type": "app.bsky.richtext.facet",
 | 
			
		||||
                "index": {
 | 
			
		||||
                    "byteEnd": e,
 | 
			
		||||
                    "byteStart": s
 | 
			
		||||
                },"features": [
 | 
			
		||||
                {
 | 
			
		||||
                    "did": udid.to_string(),
 | 
			
		||||
                    "$type": "app.bsky.richtext.facet#mention"
 | 
			
		||||
                }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								src/notify.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/notify.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
//use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(limit: i32, ) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"notify_list");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("limit", limit)])
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let status_ref = res.error_for_status_ref();
 | 
			
		||||
 | 
			
		||||
    match status_ref {
 | 
			
		||||
        Ok(_) => {
 | 
			
		||||
            return res.text().await.unwrap();
 | 
			
		||||
        },
 | 
			
		||||
        Err(_e) => {
 | 
			
		||||
            let e = "err".to_string();
 | 
			
		||||
            return e
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								src/notify_read.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/notify_read.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(time: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"notify_update");
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "seenAt": time.to_string(),
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										60
									
								
								src/openai.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/openai.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data::Open;
 | 
			
		||||
use serde_json::{json};
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
struct OpenChar {
 | 
			
		||||
    choices: Vec<ChoicesChar>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
struct ChoicesChar {
 | 
			
		||||
    message: OpenContent,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
struct OpenContent {
 | 
			
		||||
    content: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(prompt: String) -> String {
 | 
			
		||||
    let data = Open::new().unwrap();
 | 
			
		||||
    let data = Open {
 | 
			
		||||
        api: data.api,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let setting = "あなたはyuiという作品のアイと呼ばれるキャラクターです。第一人称は「アイ」です。
 | 
			
		||||
    第二人称はできる限り省略してください。
 | 
			
		||||
    自由気ままな優しさを兼ね備えます。
 | 
			
		||||
    口調例:アイね、ここでお昼寝するの。
 | 
			
		||||
    幼い子供の口調で話してください。
 | 
			
		||||
    誕生日は1月23日。
 | 
			
		||||
    自分を信じて。
 | 
			
		||||
        ";
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
    "model": "gpt-3.5-turbo",
 | 
			
		||||
    "messages": [
 | 
			
		||||
    {"role": "system", "content": &setting.to_string()},
 | 
			
		||||
    {"role": "user", "content": &prompt.to_string()},
 | 
			
		||||
    ]
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post("https://api.openai.com/v1/chat/completions")
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &data.api)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    let p: OpenChar = serde_json::from_str(&res).unwrap();
 | 
			
		||||
    let o = &p.choices[0].message.content;
 | 
			
		||||
 | 
			
		||||
    return o.to_string()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								src/post.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/post.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								src/post_link.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/post_link.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String, s: i32, e: i32) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": link.to_string() + &" ".to_string() + &text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "facets": [
 | 
			
		||||
            {
 | 
			
		||||
                "index": {
 | 
			
		||||
                    "byteStart": s,
 | 
			
		||||
                    "byteEnd": e
 | 
			
		||||
                },
 | 
			
		||||
                "features": [
 | 
			
		||||
                {
 | 
			
		||||
                    "$type": "app.bsky.richtext.facet#link",
 | 
			
		||||
                    "uri": link.to_string()
 | 
			
		||||
                }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								src/profile.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/profile.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(user: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"profile_get") + &"?handle=" + &user;
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								src/refresh.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/refresh.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request() -> String {
 | 
			
		||||
    let refresh = data_toml(&"refresh");
 | 
			
		||||
    let url = url(&"session_refresh");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &refresh)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								src/reply.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/reply.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, cid: String, uri: String, cid_root: String, uri_root: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    //let url = "https://bsky.social/xrpc/com.atproto.repo.createRecord";
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid_root.to_string(),
 | 
			
		||||
                    "uri": uri_root.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										66
									
								
								src/reply_link.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/reply_link.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(text: String, link: String, s: i32, e: i32, cid: String, uri: String, cid_root: String, uri_root: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "text": link.to_string() + &" ".to_string() + &text.to_string(),
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid_root.to_string(),
 | 
			
		||||
                    "uri": uri_root.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "facets": [
 | 
			
		||||
            {
 | 
			
		||||
                "index": {
 | 
			
		||||
                    "byteStart": s,
 | 
			
		||||
                    "byteEnd": e
 | 
			
		||||
                },
 | 
			
		||||
                "features": [
 | 
			
		||||
                {
 | 
			
		||||
                    "$type": "app.bsky.richtext.facet#link",
 | 
			
		||||
                    "uri": link.to_string()
 | 
			
		||||
                }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								src/reply_og.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/reply_og.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(m: String, link: String, cid: String, uri: String, img: String, title: String, description: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
            "text": m.to_string(),
 | 
			
		||||
            "embed": {
 | 
			
		||||
                "$type": "app.bsky.embed.external",
 | 
			
		||||
                "external": {
 | 
			
		||||
                    "uri": link.to_string(),
 | 
			
		||||
                    "thumb": {
 | 
			
		||||
                      "$type": "blob",
 | 
			
		||||
                      "ref": {
 | 
			
		||||
                        "$link": img.to_string()
 | 
			
		||||
                      },
 | 
			
		||||
                      "mimeType": "image/jpeg",
 | 
			
		||||
                      "size": 0
 | 
			
		||||
                    },
 | 
			
		||||
                    "title": title.to_string(),
 | 
			
		||||
                    "description": description.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "reply": {
 | 
			
		||||
                "root": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                },
 | 
			
		||||
                "parent": {
 | 
			
		||||
                    "cid": cid.to_string(),
 | 
			
		||||
                    "uri": uri.to_string()
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								src/repost.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/repost.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
use serde_json::json;
 | 
			
		||||
use iso8601_timestamp::Timestamp;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(cid: String, uri: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let did = data_toml(&"did");
 | 
			
		||||
    let handle = data_toml(&"handle");
 | 
			
		||||
 | 
			
		||||
    let url = url(&"record_create");
 | 
			
		||||
    let col = "app.bsky.feed.repost".to_string();
 | 
			
		||||
 | 
			
		||||
    let d = Timestamp::now_utc();
 | 
			
		||||
    let d = d.to_string();
 | 
			
		||||
 | 
			
		||||
    let post = Some(json!({
 | 
			
		||||
        "repo": handle.to_string(),
 | 
			
		||||
        "did": did.to_string(),
 | 
			
		||||
        "collection": col.to_string(),
 | 
			
		||||
        "record": {
 | 
			
		||||
            "subject": {
 | 
			
		||||
                "uri": uri.to_string(),
 | 
			
		||||
                "cid": cid.to_string()
 | 
			
		||||
            },
 | 
			
		||||
            "createdAt": d.to_string(),
 | 
			
		||||
        },
 | 
			
		||||
    }));
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&post)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								src/session.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/session.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request() -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"session_get");
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let status_ref = res.error_for_status_ref();
 | 
			
		||||
 | 
			
		||||
    match status_ref {
 | 
			
		||||
        Ok(_) => {
 | 
			
		||||
            return res.text().await.unwrap();
 | 
			
		||||
        },
 | 
			
		||||
        Err(_e) => {
 | 
			
		||||
            let e = "err".to_string();
 | 
			
		||||
            return e
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								src/timeline_author.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/timeline_author.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use crate::data_toml;
 | 
			
		||||
use crate::url;
 | 
			
		||||
 | 
			
		||||
pub async fn get_request(actor: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let token = data_toml(&"access");
 | 
			
		||||
    let url = url(&"record_list");
 | 
			
		||||
 | 
			
		||||
    let actor = actor.to_string();
 | 
			
		||||
    //let cursor = cursor.unwrap();
 | 
			
		||||
 | 
			
		||||
    let col = "app.bsky.feed.post".to_string();
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .get(url)
 | 
			
		||||
        .query(&[("repo", actor),("collection", col)])
 | 
			
		||||
        //.query(&[("actor", actor),("cursor", cursor)])
 | 
			
		||||
        .header("Authorization", "Bearer ".to_owned() + &token)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								src/token.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/token.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
extern crate reqwest;
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
pub async fn post_request(handle: String, pass: String, host: String) -> String {
 | 
			
		||||
 | 
			
		||||
    let url = "https://".to_owned() + &host.to_string() + &"/xrpc/com.atproto.server.createSession".to_string();
 | 
			
		||||
 | 
			
		||||
    let mut map = HashMap::new();
 | 
			
		||||
    map.insert("identifier", &handle);
 | 
			
		||||
    map.insert("password", &pass);
 | 
			
		||||
 | 
			
		||||
    let client = reqwest::Client::new();
 | 
			
		||||
    let res = client
 | 
			
		||||
        .post(url)
 | 
			
		||||
        .json(&map)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap()
 | 
			
		||||
        .text()
 | 
			
		||||
        .await
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    return res
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								test/entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								test/entrypoint.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
exec "$@"
 | 
			
		||||
							
								
								
									
										34
									
								
								test/env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								test/env
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
cfg=~/.config/ai/test.json
 | 
			
		||||
 | 
			
		||||
if [ ! -f $cfg ] || ! cat $cfg|jq . || [ "`cat $cfg|jq .host`" = "null" ] || [ -z "`cat $cfg`" ];then
 | 
			
		||||
	mkdir -p ~/.config/ai
 | 
			
		||||
	echo server:
 | 
			
		||||
	read host
 | 
			
		||||
 | 
			
		||||
	echo password:
 | 
			
		||||
	read pass
 | 
			
		||||
 | 
			
		||||
	echo handle:
 | 
			
		||||
	read handle
 | 
			
		||||
 | 
			
		||||
	echo "{ \"host\":\"$host\", \"password\":\"$pass\", \"handle\":\"$handle\" }" >> $cfg
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
host=`cat $cfg|jq -r .host`
 | 
			
		||||
handle=`cat $cfg|jq -r .handle`
 | 
			
		||||
pass=`cat $cfg|jq -r .password`
 | 
			
		||||
date=`date --iso-8601=seconds`
 | 
			
		||||
 | 
			
		||||
if [ ! -f $cfg.t ];then
 | 
			
		||||
	$d/token.zsh
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -f $cfg.t ];then
 | 
			
		||||
	token=`cat $cfg.t|jq -r .accessJwt`
 | 
			
		||||
	refresh=`cat $cfg.t|jq -r .refreshJwt`
 | 
			
		||||
	did=`cat $cfg.t|jq -r .did`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -d $d/json ];then
 | 
			
		||||
	mkdir -p $d/json
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										37
									
								
								test/notify.zsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								test/notify.zsh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
function notify() {
 | 
			
		||||
	url=https://$host/xrpc/app.bsky.notification.listNotifications
 | 
			
		||||
	f=$d/json/notify.json
 | 
			
		||||
	if [ ! -f $f ];then
 | 
			
		||||
		curl -sL "Content-Type: application/json" -H "Authorization: Bearer $token" "$url?limit=100" >! $f
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	for ((i=0;i<=99;i++))
 | 
			
		||||
	do
 | 
			
		||||
		echo "[$i]---"
 | 
			
		||||
		cid=`cat $f|jq -r ".|.[].[$i]?|.cid?"`
 | 
			
		||||
		uri=`cat $f|jq -r ".|.[].[$i]?|.uri?"`
 | 
			
		||||
		echo cid: $cid
 | 
			
		||||
		echo uri: $uri
 | 
			
		||||
		cid_r=`cat $f|jq -r ".[]|.[$i]?|.record.reply.root.cid?"`
 | 
			
		||||
 | 
			
		||||
		if [ "$cid_r" = "null" ];then
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		uri_r=`cat $f|jq -r ".[]|.[$i]?|.record.reply.root.uri?"`
 | 
			
		||||
		cid_p=`cat $f|jq -r ".[]|.[$i]?|.record.reply.parent.cid?"`
 | 
			
		||||
		uri_p=`cat $f|jq -r ".[]|.[$i]?|.record.reply.parent.uri?"`
 | 
			
		||||
		did_p=`echo $uri_p|cut -d / -f 3`
 | 
			
		||||
		if [ "$did_p" != "did:plc:uqzpqmrjnptsxezjx4xuh2mn" ];then
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		echo cid_root: $cid_r
 | 
			
		||||
		echo uri_root: $uri_r
 | 
			
		||||
		echo cid_parent: $cid_p
 | 
			
		||||
		echo uri_parent: $uri_p
 | 
			
		||||
		echo ---
 | 
			
		||||
		echo uri: $uri|sed "s#at://#https://bsky.app/profile/#g"|sed 's/app.bsky.feed.post/post/g'
 | 
			
		||||
		echo uri_root: $uri_r|sed "s#at://#https://bsky.app/profile/#g"|sed 's/app.bsky.feed.post/post/g'
 | 
			
		||||
		echo uri_parent: $uri_p|sed "s#at://#https://bsky.app/profile/#g"|sed 's/app.bsky.feed.post/post/g'
 | 
			
		||||
		echo ---
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								test/refresh.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								test/refresh.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
function refresh(){
 | 
			
		||||
	token=`cat $cfg.t|jq -r .accessJwt`
 | 
			
		||||
	refresh=`cat $cfg.t|jq -r .refreshJwt`
 | 
			
		||||
	if [ ! -f $cfg ];then
 | 
			
		||||
		token
 | 
			
		||||
	fi
 | 
			
		||||
	url=https://$host/xrpc/com.atproto.server.refreshSession
 | 
			
		||||
	j=`curl -sL -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $refresh" $url`
 | 
			
		||||
	echo $j
 | 
			
		||||
	echo $j >! $cfg.t
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								test/reply.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								test/reply.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
function reply() {
 | 
			
		||||
 | 
			
		||||
	#uri: https://bsky.app/profile/did:plc:4hqjfn7m6n5hno3doamuhgef/post/3kkumyv72w22o
 | 
			
		||||
	#uri_root: https://bsky.app/profile/did:plc:uqzpqmrjnptsxezjx4xuh2mn/post/3kkumysfipk2p
 | 
			
		||||
	#uri_parent: https://bsky.app/profile/did:plc:uqzpqmrjnptsxezjx4xuh2mn/post/3kkumysfipk2p
 | 
			
		||||
 | 
			
		||||
	cid=bafyreiaxz6hbqgylsxglqita73c5gzxzoatupgitd35rwjpd6dzpa4ctwi
 | 
			
		||||
	uri=at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.post/3kkumyv72w22o
 | 
			
		||||
	cid_root=bafyreiacxuk4ypaxbg7qxnmrvpnaej5o7azewqioelfgbuikp77jevy6hq
 | 
			
		||||
	uri_root=at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3kkumysfipk2p
 | 
			
		||||
	cid_parent=bafyreiacxuk4ypaxbg7qxnmrvpnaej5o7azewqioelfgbuikp77jevy6hq
 | 
			
		||||
	uri_parent=at://did:plc:uqzpqmrjnptsxezjx4xuh2mn/app.bsky.feed.post/3kkumysfipk2p
 | 
			
		||||
 | 
			
		||||
	url="https://$host/xrpc/com.atproto.repo.createRecord"
 | 
			
		||||
	col="app.bsky.feed.post"
 | 
			
		||||
 | 
			
		||||
json="{
 | 
			
		||||
    \"repo\": \"$handle\",
 | 
			
		||||
    \"did\": \"$did\",
 | 
			
		||||
    \"collection\": \"$col\",
 | 
			
		||||
    \"record\": {
 | 
			
		||||
        \"text\": \"$text\",
 | 
			
		||||
        \"createdAt\": \"$date\",
 | 
			
		||||
        \"reply\": {
 | 
			
		||||
            \"root\": {
 | 
			
		||||
                \"cid\": \"$cid_root\",
 | 
			
		||||
                \"uri\": \"$uri_root\"
 | 
			
		||||
            },
 | 
			
		||||
            \"parent\": {
 | 
			
		||||
                \"cid\": \"$cid\",
 | 
			
		||||
                \"uri\": \"$uri\"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}"
 | 
			
		||||
 | 
			
		||||
	echo $json|jq .
 | 
			
		||||
	url=https://$host/xrpc/com.atproto.repo.createRecord
 | 
			
		||||
	curl -sL -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $token" -d "$json" $url
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								test/token.zsh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								test/token.zsh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
function token() {
 | 
			
		||||
	url=https://$host/xrpc/com.atproto.server.createSession
 | 
			
		||||
	j=`curl -sL -X POST -H "Content-Type: application/json" -d "{\"identifier\":\"$handle\",\"password\":\"$pass\"}" $url`
 | 
			
		||||
	echo $j
 | 
			
		||||
 echo $j >! $cfg.t
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user