From 3d15ae40ad413da1fa810f984a4f7f2f1b7c07cd Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sun, 13 Sep 2020 18:52:49 +0100
Subject: [PATCH 01/67] Autogenerated hashtags entry on edit screen
---
daemon.py | 12 ++++++++++++
translations/ar.json | 3 ++-
translations/ca.json | 3 ++-
translations/cy.json | 3 ++-
translations/de.json | 3 ++-
translations/en.json | 3 ++-
translations/es.json | 3 ++-
translations/fr.json | 3 ++-
translations/ga.json | 3 ++-
translations/hi.json | 3 ++-
translations/it.json | 3 ++-
translations/ja.json | 3 ++-
translations/oc.json | 3 ++-
translations/pt.json | 3 ++-
translations/ru.json | 3 ++-
translations/zh.json | 3 ++-
webinterface.py | 16 ++++++++++++++++
17 files changed, 58 insertions(+), 15 deletions(-)
diff --git a/daemon.py b/daemon.py
index d3076d150..d40fb1e4e 100644
--- a/daemon.py
+++ b/daemon.py
@@ -3351,6 +3351,18 @@ class PubServer(BaseHTTPRequestHandler):
if os.path.isfile(switchFilename):
os.remove(switchFilename)
+ # autogenerated tags
+ autoTagsFilename = \
+ baseDir + '/accounts/' + \
+ nickname + '@' + domain + \
+ '/autotags.txt'
+ if fields.get('autoTags'):
+ with open(autoTagsFilename, 'w+') as autoTagsFile:
+ autoTagsFile.write(fields['autoTags'])
+ else:
+ if os.path.isfile(autoTagsFilename):
+ os.remove(autoTagsFilename)
+
# save blocked accounts list
blockedFilename = \
baseDir + '/accounts/' + \
diff --git a/translations/ar.json b/translations/ar.json
index 6faa4aa4a..2ba0ecc96 100644
--- a/translations/ar.json
+++ b/translations/ar.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "سياسة الوسطية أو قواعد السلوك",
"Edit event": "تحرير الحدث",
"Notify when posts are liked": "يخطر عندما يتم اعجاب المشاركات",
- "Don't show the Like button": "لا تظهر زر أعجبني"
+ "Don't show the Like button": "لا تظهر زر أعجبني",
+ "Autogenerated Hashtags": "علامات التجزئة المُنشأة تلقائيًا"
}
diff --git a/translations/ca.json b/translations/ca.json
index c59b79eb8..3093b203d 100644
--- a/translations/ca.json
+++ b/translations/ca.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Política de moderació o codi de conducta",
"Edit event": "Edita l’esdeveniment",
"Notify when posts are liked": "Notifiqueu-ho quan us agradin les publicacions",
- "Don't show the Like button": "No mostreu el botó M'agrada"
+ "Don't show the Like button": "No mostreu el botó M'agrada",
+ "Autogenerated Hashtags": "Hashtags autogenerats"
}
diff --git a/translations/cy.json b/translations/cy.json
index e77c7ecea..de7ac233f 100644
--- a/translations/cy.json
+++ b/translations/cy.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Polisi cymedroli neu god ymddygiad",
"Edit event": "Golygu digwyddiad",
"Notify when posts are liked": "Hysbysu pryd mae swyddi'n cael eu hoffi",
- "Don't show the Like button": "Peidiwch â dangos y botwm Hoffi"
+ "Don't show the Like button": "Peidiwch â dangos y botwm Hoffi",
+ "Autogenerated Hashtags": "Hashtags awtogeneiddiedig"
}
diff --git a/translations/de.json b/translations/de.json
index 957c54f6b..af8f4eac6 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Moderationsrichtlinie oder Verhaltenskodex",
"Edit event": "Ereignis bearbeiten",
"Notify when posts are liked": "Benachrichtigen, wenn Beiträge gefallen",
- "Don't show the Like button": "Zeigen Sie nicht die Schaltfläche \"Gefällt mir\" an"
+ "Don't show the Like button": "Zeigen Sie nicht die Schaltfläche \"Gefällt mir\" an",
+ "Autogenerated Hashtags": "Automatisch generierte Hashtags"
}
diff --git a/translations/en.json b/translations/en.json
index aaa545bc7..656f908f6 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Moderation policy or code of conduct",
"Edit event": "Edit event",
"Notify when posts are liked": "Notify when posts are liked",
- "Don't show the Like button": "Don't show the Like button"
+ "Don't show the Like button": "Don't show the Like button",
+ "Autogenerated Hashtags": "Autogenerated Hashtags"
}
diff --git a/translations/es.json b/translations/es.json
index 07d010a93..541d50e6f 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Política de moderación o código de conducta",
"Edit event": "Editar evento",
"Notify when posts are liked": "Notificar cuando les gusten las publicaciones",
- "Don't show the Like button": "No mostrar el botón Me gusta"
+ "Don't show the Like button": "No mostrar el botón Me gusta",
+ "Autogenerated Hashtags": "Hashtags autogenerados"
}
diff --git a/translations/fr.json b/translations/fr.json
index 2f85eecda..056847372 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Politique de modération ou code de conduite",
"Edit event": "Modifier l'événement",
"Notify when posts are liked": "Notifier lorsque les messages sont aimés",
- "Don't show the Like button": "Ne pas afficher le bouton J'aime"
+ "Don't show the Like button": "Ne pas afficher le bouton J'aime",
+ "Autogenerated Hashtags": "Hashtags générés automatiquement"
}
diff --git a/translations/ga.json b/translations/ga.json
index f758411f2..1d480f4f4 100644
--- a/translations/ga.json
+++ b/translations/ga.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Beartas modhnóireachta nó cód iompair",
"Edit event": "Cuir imeacht in eagar",
"Notify when posts are liked": "Cuir in iúl cathain is maith poist",
- "Don't show the Like button": "Ná taispeáin an cnaipe Cosúil"
+ "Don't show the Like button": "Ná taispeáin an cnaipe Cosúil",
+ "Autogenerated Hashtags": "Hashtags uathghinte"
}
diff --git a/translations/hi.json b/translations/hi.json
index 6da7225e2..63bb954f9 100644
--- a/translations/hi.json
+++ b/translations/hi.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "मॉडरेशन पॉलिसी या आचार संहिता",
"Edit event": "घटना संपादित करें",
"Notify when posts are liked": "पोस्ट पसंद आने पर सूचित करें",
- "Don't show the Like button": "लाइक बटन न दिखाएं"
+ "Don't show the Like button": "लाइक बटन न दिखाएं",
+ "Autogenerated Hashtags": "ऑटोजेनरेटेड हैशटैग"
}
diff --git a/translations/it.json b/translations/it.json
index 71952e1a6..977bc54d1 100644
--- a/translations/it.json
+++ b/translations/it.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Politica di moderazione o codice di condotta",
"Edit event": "Modifica evento",
"Notify when posts are liked": "Avvisa quando i post sono piaciuti",
- "Don't show the Like button": "Non mostrare il pulsante Mi piace"
+ "Don't show the Like button": "Non mostrare il pulsante Mi piace",
+ "Autogenerated Hashtags": "Hashtag generati automaticamente"
}
diff --git a/translations/ja.json b/translations/ja.json
index 384098456..2b4de68e8 100644
--- a/translations/ja.json
+++ b/translations/ja.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "モデレートポリシーまたは行動規範",
"Edit event": "イベントを編集",
"Notify when posts are liked": "投稿が高く評価されたときに通知する",
- "Don't show the Like button": "「いいね!」ボタンを表示しない"
+ "Don't show the Like button": "「いいね!」ボタンを表示しない",
+ "Autogenerated Hashtags": "自動生成されたハッシュタグ"
}
diff --git a/translations/oc.json b/translations/oc.json
index fae634148..4fba89d52 100644
--- a/translations/oc.json
+++ b/translations/oc.json
@@ -279,5 +279,6 @@
"Moderation policy or code of conduct": "Moderation policy or code of conduct",
"Edit event": "Edit event",
"Notify when posts are liked": "Notify when posts are liked",
- "Don't show the Like button": "Don't show the Like button"
+ "Don't show the Like button": "Don't show the Like button",
+ "Autogenerated Hashtags": "Autogenerated Hashtags"
}
diff --git a/translations/pt.json b/translations/pt.json
index 010df87da..bb91f5d9e 100644
--- a/translations/pt.json
+++ b/translations/pt.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Política de moderação ou código de conduta",
"Edit event": "Editar evento",
"Notify when posts are liked": "Notificar quando as postagens forem curtidas",
- "Don't show the Like button": "Não mostrar o botão Curtir"
+ "Don't show the Like button": "Não mostrar o botão Curtir",
+ "Autogenerated Hashtags": "Hashtags autogeradas"
}
diff --git a/translations/ru.json b/translations/ru.json
index f4742761f..a53389935 100644
--- a/translations/ru.json
+++ b/translations/ru.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "Политика модерации или кодекс поведения",
"Edit event": "Изменить мероприятие",
"Notify when posts are liked": "Уведомлять, когда публикации нравятся",
- "Don't show the Like button": "Не показывать кнопку \"Нравится\""
+ "Don't show the Like button": "Не показывать кнопку \"Нравится\"",
+ "Autogenerated Hashtags": "Автоматически сгенерированные хештеги"
}
diff --git a/translations/zh.json b/translations/zh.json
index 7c3fffd88..38caa60ed 100644
--- a/translations/zh.json
+++ b/translations/zh.json
@@ -283,5 +283,6 @@
"Moderation policy or code of conduct": "审核政策或行为准则",
"Edit event": "编辑活动",
"Notify when posts are liked": "通知喜欢的帖子",
- "Don't show the Like button": "不显示“赞”按钮"
+ "Don't show the Like button": "不显示“赞”按钮",
+ "Autogenerated Hashtags": "自动生成的标签"
}
diff --git a/webinterface.py b/webinterface.py
index 6a23e7aac..8bca08326 100644
--- a/webinterface.py
+++ b/webinterface.py
@@ -1167,6 +1167,14 @@ def htmlEditProfile(translate: {}, baseDir: str, path: str,
with open(switchFilename, 'r') as switchfile:
switchStr = switchfile.read()
+ autoTags = ''
+ autoTagsFilename = \
+ baseDir + '/accounts/' + \
+ nickname + '@' + domain + '/autotags.txt'
+ if os.path.isfile(autoTagsFilename):
+ with open(autoTagsFilename, 'r') as autoTagsFile:
+ autoTags = autoTagsFile.read()
+
blockedStr = ''
blockedFilename = \
baseDir + '/accounts/' + \
@@ -1507,6 +1515,14 @@ def htmlEditProfile(translate: {}, baseDir: str, path: str,
' \n'
+ editProfileForm += \
+ '
\n'
+ editProfileForm += '
\n'
+ editProfileForm += \
+ ' \n'
+
editProfileForm += \
'
\n'
From 74a6f286fcf3cc60fe07de4cd5b0970413e72294 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sun, 13 Sep 2020 19:56:41 +0100
Subject: [PATCH 02/67] Automatic content warnings
---
daemon.py | 12 ++++++++++++
posts.py | 37 +++++++++++++++++++++++++++++++++++++
translations/ar.json | 3 ++-
translations/ca.json | 3 ++-
translations/cy.json | 3 ++-
translations/de.json | 3 ++-
translations/en.json | 3 ++-
translations/es.json | 3 ++-
translations/fr.json | 3 ++-
translations/ga.json | 3 ++-
translations/hi.json | 3 ++-
translations/it.json | 3 ++-
translations/ja.json | 3 ++-
translations/oc.json | 3 ++-
translations/pt.json | 3 ++-
translations/ru.json | 3 ++-
translations/zh.json | 3 ++-
webinterface.py | 16 ++++++++++++++++
18 files changed, 95 insertions(+), 15 deletions(-)
diff --git a/daemon.py b/daemon.py
index d40fb1e4e..fe192e17b 100644
--- a/daemon.py
+++ b/daemon.py
@@ -3363,6 +3363,18 @@ class PubServer(BaseHTTPRequestHandler):
if os.path.isfile(autoTagsFilename):
os.remove(autoTagsFilename)
+ # autogenerated content warnings
+ autoCWFilename = \
+ baseDir + '/accounts/' + \
+ nickname + '@' + domain + \
+ '/autocw.txt'
+ if fields.get('autoCW'):
+ with open(autoCWFilename, 'w+') as autoCWFile:
+ autoCWFile.write(fields['autoCW'])
+ else:
+ if os.path.isfile(autoCWFilename):
+ os.remove(autoCWFilename)
+
# save blocked accounts list
blockedFilename = \
baseDir + '/accounts/' + \
diff --git a/posts.py b/posts.py
index 1d32205f7..3a594a811 100644
--- a/posts.py
+++ b/posts.py
@@ -668,6 +668,41 @@ def validContentWarning(cw: str) -> str:
return cw
+def loadAutoCW(baseDir: str, nickname: str, domain: str) -> []:
+ """Loads automatic CWs file and returns a list containing
+ the lines of the file
+ """
+ filename = baseDir + '/accounts/' + \
+ nickname + '@' + domain + '/autocw.txt'
+ if not os.path.isfile(filename):
+ return []
+ with open(filename, "r") as f:
+ return f.readlines()
+ return []
+
+
+def addAutoCW(baseDir: str, nickname: str, domain: str,
+ subject: str, content: str) -> str:
+ """Appends any automatic CW to the subject line
+ and returns the new subject line
+ """
+ newSubject = subject
+ autoCWList = loadAutoCW(baseDir, nickname, domain)
+ for cwRule in autoCWList:
+ if '->' not in cwRule:
+ continue
+ match = cwRule.split('->')[0].strip()
+ if match not in content:
+ continue
+ cwStr = cwRule.split('->')[1].strip()
+ if newSubject:
+ if cwStr not in newSubject:
+ newSubject += ', ' + cwStr
+ else:
+ newSubject = cwStr
+ return newSubject
+
+
def createPostBase(baseDir: str, nickname: str, domain: str, port: int,
toUrl: str, ccUrl: str, httpPrefix: str, content: str,
followersOnly: bool, saveToFile: bool, clientToServer: bool,
@@ -687,6 +722,8 @@ def createPostBase(baseDir: str, nickname: str, domain: str, port: int,
eventStatus=None, ticketUrl=None) -> {}:
"""Creates a message
"""
+ subject = addAutoCW(baseDir, nickname, domain, subject, content)
+
mentionedRecipients = \
getMentionedPeople(baseDir, httpPrefix, content, domain, False)
diff --git a/translations/ar.json b/translations/ar.json
index 2ba0ecc96..4cd299377 100644
--- a/translations/ar.json
+++ b/translations/ar.json
@@ -284,5 +284,6 @@
"Edit event": "تحرير الحدث",
"Notify when posts are liked": "يخطر عندما يتم اعجاب المشاركات",
"Don't show the Like button": "لا تظهر زر أعجبني",
- "Autogenerated Hashtags": "علامات التجزئة المُنشأة تلقائيًا"
+ "Autogenerated Hashtags": "علامات التجزئة المُنشأة تلقائيًا",
+ "Autogenerated Content Warnings": "تحذيرات المحتوى المُنشأ تلقائيًا"
}
diff --git a/translations/ca.json b/translations/ca.json
index 3093b203d..03496a1a1 100644
--- a/translations/ca.json
+++ b/translations/ca.json
@@ -284,5 +284,6 @@
"Edit event": "Edita l’esdeveniment",
"Notify when posts are liked": "Notifiqueu-ho quan us agradin les publicacions",
"Don't show the Like button": "No mostreu el botó M'agrada",
- "Autogenerated Hashtags": "Hashtags autogenerats"
+ "Autogenerated Hashtags": "Hashtags autogenerats",
+ "Autogenerated Content Warnings": "Advertiments de contingut autogenerats"
}
diff --git a/translations/cy.json b/translations/cy.json
index de7ac233f..a5a4d7b4d 100644
--- a/translations/cy.json
+++ b/translations/cy.json
@@ -284,5 +284,6 @@
"Edit event": "Golygu digwyddiad",
"Notify when posts are liked": "Hysbysu pryd mae swyddi'n cael eu hoffi",
"Don't show the Like button": "Peidiwch â dangos y botwm Hoffi",
- "Autogenerated Hashtags": "Hashtags awtogeneiddiedig"
+ "Autogenerated Hashtags": "Hashtags awtogeneiddiedig",
+ "Autogenerated Content Warnings": "Rhybuddion Cynnwys Autogenerated"
}
diff --git a/translations/de.json b/translations/de.json
index af8f4eac6..db919e842 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -284,5 +284,6 @@
"Edit event": "Ereignis bearbeiten",
"Notify when posts are liked": "Benachrichtigen, wenn Beiträge gefallen",
"Don't show the Like button": "Zeigen Sie nicht die Schaltfläche \"Gefällt mir\" an",
- "Autogenerated Hashtags": "Automatisch generierte Hashtags"
+ "Autogenerated Hashtags": "Automatisch generierte Hashtags",
+ "Autogenerated Content Warnings": "Warnungen vor automatisch generierten Inhalten"
}
diff --git a/translations/en.json b/translations/en.json
index 656f908f6..e55da2c5b 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -284,5 +284,6 @@
"Edit event": "Edit event",
"Notify when posts are liked": "Notify when posts are liked",
"Don't show the Like button": "Don't show the Like button",
- "Autogenerated Hashtags": "Autogenerated Hashtags"
+ "Autogenerated Hashtags": "Autogenerated Hashtags",
+ "Autogenerated Content Warnings": "Autogenerated Content Warnings"
}
diff --git a/translations/es.json b/translations/es.json
index 541d50e6f..31e0d4182 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -284,5 +284,6 @@
"Edit event": "Editar evento",
"Notify when posts are liked": "Notificar cuando les gusten las publicaciones",
"Don't show the Like button": "No mostrar el botón Me gusta",
- "Autogenerated Hashtags": "Hashtags autogenerados"
+ "Autogenerated Hashtags": "Hashtags autogenerados",
+ "Autogenerated Content Warnings": "Advertencias de contenido generado automáticamente"
}
diff --git a/translations/fr.json b/translations/fr.json
index 056847372..3e1f1228b 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -284,5 +284,6 @@
"Edit event": "Modifier l'événement",
"Notify when posts are liked": "Notifier lorsque les messages sont aimés",
"Don't show the Like button": "Ne pas afficher le bouton J'aime",
- "Autogenerated Hashtags": "Hashtags générés automatiquement"
+ "Autogenerated Hashtags": "Hashtags générés automatiquement",
+ "Autogenerated Content Warnings": "Avertissements de contenu générés automatiquement"
}
diff --git a/translations/ga.json b/translations/ga.json
index 1d480f4f4..b00dca076 100644
--- a/translations/ga.json
+++ b/translations/ga.json
@@ -284,5 +284,6 @@
"Edit event": "Cuir imeacht in eagar",
"Notify when posts are liked": "Cuir in iúl cathain is maith poist",
"Don't show the Like button": "Ná taispeáin an cnaipe Cosúil",
- "Autogenerated Hashtags": "Hashtags uathghinte"
+ "Autogenerated Hashtags": "Hashtags uathghinte",
+ "Autogenerated Content Warnings": "Rabhaidh Ábhar Uathghinte"
}
diff --git a/translations/hi.json b/translations/hi.json
index 63bb954f9..e7eb445cd 100644
--- a/translations/hi.json
+++ b/translations/hi.json
@@ -284,5 +284,6 @@
"Edit event": "घटना संपादित करें",
"Notify when posts are liked": "पोस्ट पसंद आने पर सूचित करें",
"Don't show the Like button": "लाइक बटन न दिखाएं",
- "Autogenerated Hashtags": "ऑटोजेनरेटेड हैशटैग"
+ "Autogenerated Hashtags": "ऑटोजेनरेटेड हैशटैग",
+ "Autogenerated Content Warnings": "स्वतः प्राप्त सामग्री चेतावनी"
}
diff --git a/translations/it.json b/translations/it.json
index 977bc54d1..d7b5f6738 100644
--- a/translations/it.json
+++ b/translations/it.json
@@ -284,5 +284,6 @@
"Edit event": "Modifica evento",
"Notify when posts are liked": "Avvisa quando i post sono piaciuti",
"Don't show the Like button": "Non mostrare il pulsante Mi piace",
- "Autogenerated Hashtags": "Hashtag generati automaticamente"
+ "Autogenerated Hashtags": "Hashtag generati automaticamente",
+ "Autogenerated Content Warnings": "Avvisi sui contenuti generati automaticamente"
}
diff --git a/translations/ja.json b/translations/ja.json
index 2b4de68e8..b5606b0d9 100644
--- a/translations/ja.json
+++ b/translations/ja.json
@@ -284,5 +284,6 @@
"Edit event": "イベントを編集",
"Notify when posts are liked": "投稿が高く評価されたときに通知する",
"Don't show the Like button": "「いいね!」ボタンを表示しない",
- "Autogenerated Hashtags": "自動生成されたハッシュタグ"
+ "Autogenerated Hashtags": "自動生成されたハッシュタグ",
+ "Autogenerated Content Warnings": "自動生成されたコンテンツの警告"
}
diff --git a/translations/oc.json b/translations/oc.json
index 4fba89d52..4afc6e95b 100644
--- a/translations/oc.json
+++ b/translations/oc.json
@@ -280,5 +280,6 @@
"Edit event": "Edit event",
"Notify when posts are liked": "Notify when posts are liked",
"Don't show the Like button": "Don't show the Like button",
- "Autogenerated Hashtags": "Autogenerated Hashtags"
+ "Autogenerated Hashtags": "Autogenerated Hashtags",
+ "Autogenerated Content Warnings": "Autogenerated Content Warnings"
}
diff --git a/translations/pt.json b/translations/pt.json
index bb91f5d9e..d61d5f067 100644
--- a/translations/pt.json
+++ b/translations/pt.json
@@ -284,5 +284,6 @@
"Edit event": "Editar evento",
"Notify when posts are liked": "Notificar quando as postagens forem curtidas",
"Don't show the Like button": "Não mostrar o botão Curtir",
- "Autogenerated Hashtags": "Hashtags autogeradas"
+ "Autogenerated Hashtags": "Hashtags autogeradas",
+ "Autogenerated Content Warnings": "Avisos de conteúdo gerado automaticamente"
}
diff --git a/translations/ru.json b/translations/ru.json
index a53389935..d7b9cda7d 100644
--- a/translations/ru.json
+++ b/translations/ru.json
@@ -284,5 +284,6 @@
"Edit event": "Изменить мероприятие",
"Notify when posts are liked": "Уведомлять, когда публикации нравятся",
"Don't show the Like button": "Не показывать кнопку \"Нравится\"",
- "Autogenerated Hashtags": "Автоматически сгенерированные хештеги"
+ "Autogenerated Hashtags": "Автоматически сгенерированные хештеги",
+ "Autogenerated Content Warnings": "Автоматические предупреждения о содержании"
}
diff --git a/translations/zh.json b/translations/zh.json
index 38caa60ed..4b957c8a5 100644
--- a/translations/zh.json
+++ b/translations/zh.json
@@ -284,5 +284,6 @@
"Edit event": "编辑活动",
"Notify when posts are liked": "通知喜欢的帖子",
"Don't show the Like button": "不显示“赞”按钮",
- "Autogenerated Hashtags": "自动生成的标签"
+ "Autogenerated Hashtags": "自动生成的标签",
+ "Autogenerated Content Warnings": "自动生成的内容警告"
}
diff --git a/webinterface.py b/webinterface.py
index 8bca08326..ea8668939 100644
--- a/webinterface.py
+++ b/webinterface.py
@@ -1175,6 +1175,14 @@ def htmlEditProfile(translate: {}, baseDir: str, path: str,
with open(autoTagsFilename, 'r') as autoTagsFile:
autoTags = autoTagsFile.read()
+ autoCW = ''
+ autoCWFilename = \
+ baseDir + '/accounts/' + \
+ nickname + '@' + domain + '/autocw.txt'
+ if os.path.isfile(autoCWFilename):
+ with open(autoCWFilename, 'r') as autoCWFile:
+ autoCW = autoCWFile.read()
+
blockedStr = ''
blockedFilename = \
baseDir + '/accounts/' + \
@@ -1523,6 +1531,14 @@ def htmlEditProfile(translate: {}, baseDir: str, path: str,
' \n'
+ editProfileForm += \
+ '
\n'
+ editProfileForm += '
\n'
+ editProfileForm += \
+ ' \n'
+
editProfileForm += \
'
\n'
From 21573b6ca7fa0ea3df84b0f0883c1fea90711b9b Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 10:33:42 +0100
Subject: [PATCH 03/67] Turn email style quotes into blockquotes
---
content.py | 21 +++++++++++++++++++++
tests.py | 26 ++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/content.py b/content.py
index 3f85eff5b..3db21aa92 100644
--- a/content.py
+++ b/content.py
@@ -14,6 +14,25 @@ from utils import fileLastModified
from utils import getLinkPrefixes
+def htmlReplaceEmailQuote(content: str) -> str:
+ """Replaces an email style quote "> Some quote" with html blockquote
+ """
+ if '>> ' not in content:
+ return content
+ contentStr = content.replace('', '')
+ contentLines = contentStr.split('
')
+ newContent = ''
+ for lineStr in contentLines:
+ if not lineStr:
+ continue
+ if '>> ' not in lineStr:
+ newContent += '' + lineStr + '
'
+ else:
+ lineStr = lineStr.replace('>> ', '>')
+ newContent += '' + lineStr + '
'
+ return newContent
+
+
def htmlReplaceQuoteMarks(content: str) -> str:
"""Replaces quotes with html formatting
"hello" becomes hello
@@ -612,6 +631,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str,
by matching against known following accounts
"""
if content.startswith(''):
+ content = htmlReplaceEmailQuote(content)
return htmlReplaceQuoteMarks(content)
maxWordLength = 40
content = content.replace('\r', '')
@@ -718,6 +738,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str,
if longWordsList:
content = removeLongWords(content, maxWordLength, longWordsList)
content = content.replace(' --linebreak-- ', '
')
+ content = htmlReplaceEmailQuote(content)
return '
' + htmlReplaceQuoteMarks(content) + '
'
diff --git a/tests.py b/tests.py
index 51b00cbd4..ecb58134a 100644
--- a/tests.py
+++ b/tests.py
@@ -68,6 +68,7 @@ from delete import sendDeleteViaServer
from inbox import jsonPostAllowsComments
from inbox import validInbox
from inbox import validInboxFilenames
+from content import htmlReplaceEmailQuote
from content import htmlReplaceQuoteMarks
from content import dangerousMarkup
from content import removeHtml
@@ -2124,8 +2125,33 @@ def testConstantTimeStringCheck():
assert timeDiffMicroseconds < 10
+def testReplaceEmailQuote():
+ print('testReplaceEmailQuote')
+ testStr='This content has no quote.
'
+ assert htmlReplaceEmailQuote(testStr) == testStr
+
+ testStr='This content has no quote.\nWith multiple\nlines
'
+ assert htmlReplaceEmailQuote(testStr) == testStr
+
+ testStr = "" + \
+ "@nickname " + \
+ "
> This is a quote
Some other text.
"
+ expectedStr = "" + \
+ "@nickname " + \
+ "
This is a quote
" + \
+ "Some other text.
"
+ resultStr = htmlReplaceEmailQuote(testStr)
+ if resultStr != expectedStr:
+ print('Result: ' + resultStr)
+ print('Expect: ' + expectedStr)
+ assert resultStr == expectedStr
+
+
def runAllTests():
print('Running tests...')
+ testReplaceEmailQuote()
testConstantTimeStringCheck()
testTranslations()
testValidContentWarning()
From 1df84519567600174f0adc45eb31ddf6a99b8ee8 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 10:41:44 +0100
Subject: [PATCH 04/67] Replace email style quote
---
tests.py | 5 +++--
webinterface.py | 2 ++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/tests.py b/tests.py
index ecb58134a..110c99be5 100644
--- a/tests.py
+++ b/tests.py
@@ -2127,10 +2127,11 @@ def testConstantTimeStringCheck():
def testReplaceEmailQuote():
print('testReplaceEmailQuote')
- testStr='This content has no quote.
'
+ testStr = 'This content has no quote.
'
assert htmlReplaceEmailQuote(testStr) == testStr
- testStr='This content has no quote.\nWith multiple\nlines
'
+ testStr = 'This content has no quote.
' + \
+ 'With multiple
lines
'
assert htmlReplaceEmailQuote(testStr) == testStr
testStr = "" + \
diff --git a/webinterface.py b/webinterface.py
index ea8668939..30907a2df 100644
--- a/webinterface.py
+++ b/webinterface.py
@@ -58,6 +58,7 @@ from bookmarks import bookmarkedByPerson
from announce import announcedByPerson
from blocking import isBlocked
from blocking import isBlockedHashtag
+from content import htmlReplaceEmailQuote
from content import htmlReplaceQuoteMarks
from content import removeTextFormatting
from content import switchWords
@@ -4761,6 +4762,7 @@ def individualPostAsHtml(allowDownloads: bool,
objectContent = removeTextFormatting(objectContent)
objectContent = \
switchWords(baseDir, nickname, domain, objectContent)
+ objectContent = htmlReplaceEmailQuote(objectContent)
objectContent = htmlReplaceQuoteMarks(objectContent)
else:
objectContent = \
From 93c74f3324a2f2c3da5c636480dbd771f5043c5c Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 11:06:46 +0100
Subject: [PATCH 05/67] Quote style
---
epicyon-profile.css | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index 43b9dd4e4..c25476d15 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -79,6 +79,30 @@ body, html {
font-size: var(--font-size);
}
+blockquote {
+ border-left: 10px solid;
+ margin: 1.5em 10px;
+ padding: 0.5em 10px;
+ quotes: "\201C""\201D""\2018""\2019";
+}
+blockquote:before {
+ content: open-quote;
+ font-size: 2em;
+ line-height: 0.1em;
+ margin-right: 0.25em;
+ vertical-align: -0.4em;
+}
+blockquote:after {
+ content: close-quote;
+ font-size: 2em;
+ line-height: 0.1em;
+ margin-left: 0.25em;
+ vertical-align: -0.4em;
+}
+blockquote p {
+ display: inline;
+}
+
.imageAnchor:focus img{
border: 2px solid var(--focus-color);
}
From f658cbeb3099fa80f7eb03f96b20d98d3aa5df17 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 11:08:59 +0100
Subject: [PATCH 06/67] Quote in bold
---
epicyon-profile.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index c25476d15..ec6cde6c0 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -83,6 +83,7 @@ blockquote {
border-left: 10px solid;
margin: 1.5em 10px;
padding: 0.5em 10px;
+ font-weight: bold;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote:before {
From 488ef5b34d136765d5ed0203e4e6f267da3370ca Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 11:25:12 +0100
Subject: [PATCH 07/67] Extra blockquote check
---
content.py | 8 +++++++-
tests.py | 10 ++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/content.py b/content.py
index 3db21aa92..8adf8adaf 100644
--- a/content.py
+++ b/content.py
@@ -26,9 +26,15 @@ def htmlReplaceEmailQuote(content: str) -> str:
if not lineStr:
continue
if '>> ' not in lineStr:
- newContent += '' + lineStr + '
'
+ if lineStr.startswith('> '):
+ lineStr = lineStr.replace('> ', '')
+ lineStr = lineStr.replace('>', '
')
+ newContent += '' + lineStr + '
'
+ else:
+ newContent += '' + lineStr + '
'
else:
lineStr = lineStr.replace('>> ', '>')
+ lineStr = lineStr.replace('>', '
')
newContent += '' + lineStr + '
'
return newContent
diff --git a/tests.py b/tests.py
index 110c99be5..95fd86f6b 100644
--- a/tests.py
+++ b/tests.py
@@ -2149,6 +2149,16 @@ def testReplaceEmailQuote():
print('Expect: ' + expectedStr)
assert resultStr == expectedStr
+ testStr = "Some text:
> first line->second line
" + \
+ "Some question?
"
+ expectedStr = "Some text:
first line-
" + \
+ "second line
Some question?
"
+ resultStr = htmlReplaceEmailQuote(testStr)
+ if resultStr != expectedStr:
+ print('Result: ' + resultStr)
+ print('Expect: ' + expectedStr)
+ assert resultStr == expectedStr
+
def runAllTests():
print('Running tests...')
From 08b6d14400d5f1eb3a2bf98df181d9787f7100e4 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 12:30:56 +0100
Subject: [PATCH 08/67] Style of quoted paragraphs
---
content.py | 6 ++++++
tests.py | 4 ++++
2 files changed, 10 insertions(+)
diff --git a/content.py b/content.py
index 8adf8adaf..5f74c6f46 100644
--- a/content.py
+++ b/content.py
@@ -17,6 +17,12 @@ from utils import getLinkPrefixes
def htmlReplaceEmailQuote(content: str) -> str:
"""Replaces an email style quote "> Some quote" with html blockquote
"""
+ # replace quote paragraph
+ if '"' in content:
+ if '"
' in content:
+ content = content.replace('"', '
')
+ content = content.replace('"', '
')
+ # replace email style quote
if '>> ' not in content:
return content
contentStr = content.replace('', '')
diff --git a/tests.py b/tests.py
index 95fd86f6b..abb35f43e 100644
--- a/tests.py
+++ b/tests.py
@@ -2134,6 +2134,10 @@ def testReplaceEmailQuote():
'
With multiple
lines
'
assert htmlReplaceEmailQuote(testStr) == testStr
+ testStr = '"This is a quoted paragraph."
'
+ assert htmlReplaceEmailQuote(testStr) == \
+ 'This is a quoted paragraph.
'
+
testStr = "" + \
"@nickname " + \
From f54c06c0c392238b7e5fa100552b95685a71434c Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 12:38:19 +0100
Subject: [PATCH 09/67] Quotes in italic
---
epicyon-profile.css | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index ec6cde6c0..af681cf91 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -80,10 +80,11 @@ body, html {
}
blockquote {
- border-left: 10px solid;
+ border-left: 10px;
margin: 1.5em 10px;
padding: 0.5em 10px;
font-weight: bold;
+ font-style: italic;
quotes: "\201C""\201D""\2018""\2019";
}
blockquote:before {
From ce1067d1a922c5b9953694390571cca68cda6a24 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 13:17:11 +0100
Subject: [PATCH 10/67] Replace quotes
---
content.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/content.py b/content.py
index 5f74c6f46..2fc754718 100644
--- a/content.py
+++ b/content.py
@@ -22,6 +22,10 @@ def htmlReplaceEmailQuote(content: str) -> str:
if '"
' in content:
content = content.replace('"', '
')
content = content.replace('"', '
')
+ if '>\u201c' in content:
+ if '\u201d<' in content:
+ content = content.replace('>\u201c', '>')
+ content = content.replace('\u201d<', '
<')
# replace email style quote
if '>> ' not in content:
return content
From 1052ea8a45b079b20a9d8ef887d7d74393d9ea13 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 13:52:22 +0100
Subject: [PATCH 11/67] Add italic font
---
epicyon-profile.css | 7 +++++++
theme.py | 13 ++++++++++---
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index af681cf91..bbf4af22a 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -59,6 +59,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/theme.py b/theme.py
index 6a7bd5377..4c157c1b5 100644
--- a/theme.py
+++ b/theme.py
@@ -68,7 +68,10 @@ def setCSSparam(css: str, param: str, value: str) -> str:
return css.replace(param, value)
# if the parameter begins with * then don't prepend --
if param.startswith('*'):
- searchStr = param.replace('*', '') + ':'
+ if param.startswith('**'):
+ searchStr = param.replace('**', '', 1) + ':'
+ else:
+ searchStr = param.replace('*', '') + ':'
else:
searchStr = '--' + param + ':'
if searchStr not in css:
@@ -276,6 +279,8 @@ def setThemeNight(baseDir: str):
setThemeInConfig(baseDir, name)
fontStr = \
"url('./fonts/solidaric.woff2') format('woff2')"
+ fontStrItalic = \
+ "url('./fonts/solidaric-italic.woff2') format('woff2')"
themeParams = {
"focus-color": "blue",
"font-size-button-mobile": "36px",
@@ -306,7 +311,8 @@ def setThemeNight(baseDir: str):
"event-color": "#7961ab",
"event-background": "#333",
"*font-family": "'solidaric'",
- "*src": fontStr
+ "*src": fontStr,
+ "**src": fontStrItalic
}
bgParams = {
"login": "jpg",
@@ -767,7 +773,8 @@ def setThemeSolidaric(baseDir: str):
"title-background": "#ccc",
"gallery-text-color": "black",
"*font-family": "'solidaric'",
- "*src": "url('./fonts/solidaric.woff2') format('woff2')"
+ "*src": "url('./fonts/solidaric.woff2') format('woff2')",
+ "**src": "url('./fonts/solidaric-italic.woff2') format('woff2')"
}
bgParams = {
"login": "jpg",
From c07a8192f92d4ca9c1c42788c5b3b6b0b7e26469 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 13:58:24 +0100
Subject: [PATCH 12/67] Add flag to replace once only
---
theme.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/theme.py b/theme.py
index 4c157c1b5..50c259a20 100644
--- a/theme.py
+++ b/theme.py
@@ -67,9 +67,11 @@ def setCSSparam(css: str, param: str, value: str) -> str:
if param.startswith('rgba('):
return css.replace(param, value)
# if the parameter begins with * then don't prepend --
+ onceOnly = False
if param.startswith('*'):
if param.startswith('**'):
- searchStr = param.replace('**', '', 1) + ':'
+ onceOnly = True
+ searchStr = param.replace('**', '') + ':'
else:
searchStr = param.replace('*', '') + ':'
else:
@@ -90,6 +92,8 @@ def setCSSparam(css: str, param: str, value: str) -> str:
searchStr + ' ' + value + ';' + sectionStr.split(';', 1)[1]
else:
newcss += searchStr + ' ' + sectionStr
+ if onceOnly:
+ break
return newcss.strip()
From a3b95e65a2f543cab44ca4aa3943ddfcc19d7e60 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 14:05:12 +0100
Subject: [PATCH 13/67] Replace once only
---
theme.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/theme.py b/theme.py
index 50c259a20..21262190b 100644
--- a/theme.py
+++ b/theme.py
@@ -78,7 +78,10 @@ def setCSSparam(css: str, param: str, value: str) -> str:
searchStr = '--' + param + ':'
if searchStr not in css:
return css
- s = css.split(searchStr)
+ if onceOnly:
+ s = css.split(searchStr, 1)
+ else:
+ s = css.split(searchStr)
newcss = ''
for sectionStr in s:
if not newcss:
@@ -92,8 +95,6 @@ def setCSSparam(css: str, param: str, value: str) -> str:
searchStr + ' ' + value + ';' + sectionStr.split(';', 1)[1]
else:
newcss += searchStr + ' ' + sectionStr
- if onceOnly:
- break
return newcss.strip()
From 1536d3b9c5a2f49d51f0e21a5e255d025b49d49f Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 14:09:20 +0100
Subject: [PATCH 14/67] Reduce margin
---
epicyon-profile.css | 1 -
1 file changed, 1 deletion(-)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index bbf4af22a..513fc1d39 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -105,7 +105,6 @@ blockquote:after {
content: close-quote;
font-size: 2em;
line-height: 0.1em;
- margin-left: 0.25em;
vertical-align: -0.4em;
}
blockquote p {
From 416c206aeae79028cb2f030e4ef73dc27831ea2e Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 14:14:09 +0100
Subject: [PATCH 15/67] Adjustable quote margin
---
epicyon-profile.css | 2 ++
theme.py | 2 ++
2 files changed, 4 insertions(+)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index 513fc1d39..f2e20ffd1 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -57,6 +57,7 @@
--icons-side: right;
--title-color: #999;
--focus-color: white;
+ --quote-right-margin: 0.25em;
}
@font-face {
@@ -105,6 +106,7 @@ blockquote:after {
content: close-quote;
font-size: 2em;
line-height: 0.1em;
+ margin-left: var(--quote-right-margin);
vertical-align: -0.4em;
}
blockquote p {
diff --git a/theme.py b/theme.py
index 21262190b..38d036b86 100644
--- a/theme.py
+++ b/theme.py
@@ -375,6 +375,7 @@ def setThemeStarlight(baseDir: str):
"place-color": "#ffc4bc",
"event-color": "#ffc4bc",
"image-corners": "2%",
+ "quote-right-margin": "0.25em",
"*font-family": "'bgrove'",
"*src": "url('fonts/bgrove.woff2') format('woff2')"
}
@@ -777,6 +778,7 @@ def setThemeSolidaric(baseDir: str):
"title-text": "#282c37",
"title-background": "#ccc",
"gallery-text-color": "black",
+ "quote-right-margin": "0",
"*font-family": "'solidaric'",
"*src": "url('./fonts/solidaric.woff2') format('woff2')",
"**src": "url('./fonts/solidaric-italic.woff2') format('woff2')"
From 1eb0f92014c0f25a645a0a064a3ae6e9c96735a4 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 14:16:55 +0100
Subject: [PATCH 16/67] Margins for solidaric font
---
theme.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/theme.py b/theme.py
index 38d036b86..f8da71616 100644
--- a/theme.py
+++ b/theme.py
@@ -315,6 +315,7 @@ def setThemeNight(baseDir: str):
"place-color": "#7961ab",
"event-color": "#7961ab",
"event-background": "#333",
+ "quote-right-margin": "0",
"*font-family": "'solidaric'",
"*src": fontStr,
"**src": fontStrItalic
@@ -430,6 +431,7 @@ def setThemeHenge(baseDir: str):
"event-background": "#333",
"timeline-border-radius": "20px",
"image-corners": "8%",
+ "quote-right-margin": "0.25em",
"*font-family": "'bgrove'",
"*src": "url('fonts/bgrove.woff2') format('woff2')"
}
From 4fcf5bd938cbb2c01802606ad96e68b4897d65aa Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 14:38:30 +0100
Subject: [PATCH 17/67] Increase night theme font brightness
---
theme.py | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/theme.py b/theme.py
index f8da71616..b0b46a86a 100644
--- a/theme.py
+++ b/theme.py
@@ -297,9 +297,9 @@ def setThemeNight(baseDir: str):
"main-bg-color": "#0f0d10",
"text-entry-background": "#0f0d10",
"link-bg-color": "#0f0d10",
- "main-fg-color": "#7961ab",
+ "main-fg-color": "#a961ab",
"main-bg-color-dm": "#0b0a0a",
- "border-color": "#7961ab",
+ "border-color": "#a961ab",
"main-bg-color-reply": "#0f0d10",
"main-bg-color-report": "#0f0d10",
"hashtag-vertical-spacing3": "100px",
@@ -308,12 +308,12 @@ def setThemeNight(baseDir: str):
"button-background": "#a961ab",
"button-selected": "#86579d",
"calendar-bg-color": "#0f0d10",
- "lines-color": "#7961ab",
- "day-number": "#7961ab",
+ "lines-color": "#a961ab",
+ "day-number": "#a961ab",
"day-number2": "#555",
- "time-color": "#7961ab",
- "place-color": "#7961ab",
- "event-color": "#7961ab",
+ "time-color": "#a961ab",
+ "place-color": "#a961ab",
+ "event-color": "#a961ab",
"event-background": "#333",
"quote-right-margin": "0",
"*font-family": "'solidaric'",
From 3c81eb205d2eb3c1b1f589ac7d8c28c2e1693ff1 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 14:51:00 +0100
Subject: [PATCH 18/67] Border color matches icons
---
theme.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/theme.py b/theme.py
index b0b46a86a..d04ed553d 100644
--- a/theme.py
+++ b/theme.py
@@ -299,7 +299,7 @@ def setThemeNight(baseDir: str):
"link-bg-color": "#0f0d10",
"main-fg-color": "#a961ab",
"main-bg-color-dm": "#0b0a0a",
- "border-color": "#a961ab",
+ "border-color": "#606984",
"main-bg-color-reply": "#0f0d10",
"main-bg-color-report": "#0f0d10",
"hashtag-vertical-spacing3": "100px",
From fbe75d5c62a6d0d442d5ed38038384a9d049bba7 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 15:00:49 +0100
Subject: [PATCH 19/67] Extra css font
---
epicyon-blog.css | 7 +++++++
epicyon-calendar.css | 7 +++++++
epicyon-follow.css | 7 +++++++
epicyon-login.css | 7 +++++++
epicyon-options.css | 7 +++++++
epicyon-search.css | 7 +++++++
epicyon-suspended.css | 7 +++++++
7 files changed, 49 insertions(+)
diff --git a/epicyon-blog.css b/epicyon-blog.css
index 46dfd30fc..1dc8e7aec 100644
--- a/epicyon-blog.css
+++ b/epicyon-blog.css
@@ -45,6 +45,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/epicyon-calendar.css b/epicyon-calendar.css
index 9c11fd0cb..8d369ec8f 100644
--- a/epicyon-calendar.css
+++ b/epicyon-calendar.css
@@ -16,6 +16,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/epicyon-follow.css b/epicyon-follow.css
index ed7aca1ed..1e255985d 100644
--- a/epicyon-follow.css
+++ b/epicyon-follow.css
@@ -33,6 +33,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/epicyon-login.css b/epicyon-login.css
index 1a02de7a6..19a2a040b 100644
--- a/epicyon-login.css
+++ b/epicyon-login.css
@@ -22,6 +22,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/epicyon-options.css b/epicyon-options.css
index 328a39ffc..73894aa84 100644
--- a/epicyon-options.css
+++ b/epicyon-options.css
@@ -35,6 +35,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/epicyon-search.css b/epicyon-search.css
index eda0516de..92ed3217e 100644
--- a/epicyon-search.css
+++ b/epicyon-search.css
@@ -35,6 +35,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
diff --git a/epicyon-suspended.css b/epicyon-suspended.css
index 03ddc7dc2..4a5d03304 100644
--- a/epicyon-suspended.css
+++ b/epicyon-suspended.css
@@ -22,6 +22,13 @@
--focus-color: white;
}
+@font-face {
+ font-family: 'Bedstead';
+ font-style: italic;
+ font-weight: normal;
+ font-display: block;
+ src: url('./fonts/bedstead.otf') format('opentype');
+}
@font-face {
font-family: 'Bedstead';
font-style: normal;
From a81c191b0060f2ece659367233fe41f0782990f3 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Mon, 14 Sep 2020 17:44:55 +0100
Subject: [PATCH 20/67] quote variable
---
epicyon-profile.css | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index f2e20ffd1..6aec94c30 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -58,6 +58,7 @@
--title-color: #999;
--focus-color: white;
--quote-right-margin: 0.25em;
+ --quote-font-weight: bold;
}
@font-face {
@@ -91,7 +92,7 @@ blockquote {
border-left: 10px;
margin: 1.5em 10px;
padding: 0.5em 10px;
- font-weight: bold;
+ font-weight: var(--quote-font-weight);
font-style: italic;
quotes: "\201C""\201D""\2018""\2019";
}
From ed0882fec90b756100bc693e4fb1fd4c4986c1a0 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Tue, 15 Sep 2020 09:50:38 +0100
Subject: [PATCH 21/67] Update letsencrypt server on sites
---
gemini/EN/install.gmi | 2 +-
website/EN/index.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/gemini/EN/install.gmi b/gemini/EN/install.gmi
index 0eb54ba71..6f0b419c7 100644
--- a/gemini/EN/install.gmi
+++ b/gemini/EN/install.gmi
@@ -158,7 +158,7 @@ Enable the site:
Forward port 443 from your internet router to your server. If you have dynamic DNS make sure its configured. Add a TLS certificate:
- certbot certonly -n --server https://acme-v01.api.letsencrypt.org/directory --standalone -d YOUR_DOMAIN --renew-by-default --agree-tos --email YOUR_EMAIL
+ certbot certonly -n --server https://acme-v02.api.letsencrypt.org/directory --standalone -d YOUR_DOMAIN --renew-by-default --agree-tos --email YOUR_EMAIL
Restart your web server:
diff --git a/website/EN/index.html b/website/EN/index.html
index 712b11ea1..fec431120 100644
--- a/website/EN/index.html
+++ b/website/EN/index.html
@@ -1444,7 +1444,7 @@
Forward port 443 from your internet router to your server. If you have dynamic DNS make sure its configured. Add a TLS certificate:
- certbot certonly -n --server https://acme-v01.api.letsencrypt.org/directory --standalone -d YOUR_DOMAIN --renew-by-default --agree-tos --email YOUR_EMAIL
+ certbot certonly -n --server https://acme-v02.api.letsencrypt.org/directory --standalone -d YOUR_DOMAIN --renew-by-default --agree-tos --email YOUR_EMAIL
Restart your web server:
From 99893e5e2386edd280c0b6b87d14b292dea98aec Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Tue, 15 Sep 2020 10:16:03 +0100
Subject: [PATCH 22/67] Don't insist on lowercase handle
---
follow.py | 6 +++---
person.py | 12 ++++++------
utils.py | 4 ++--
webfinger.py | 10 +++++-----
4 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/follow.py b/follow.py
index 6b764df37..ea3ac55b0 100644
--- a/follow.py
+++ b/follow.py
@@ -244,7 +244,7 @@ def clearFollows(baseDir: str, nickname: str, domain: str,
followFile='following.txt') -> None:
"""Removes all follows
"""
- handle = nickname.lower() + '@' + domain.lower()
+ handle = nickname + '@' + domain
if not os.path.isdir(baseDir + '/accounts'):
os.mkdir(baseDir + '/accounts')
if not os.path.isdir(baseDir + '/accounts/' + handle):
@@ -269,7 +269,7 @@ def getNoOfFollows(baseDir: str, nickname: str, domain: str,
# account holders
# if not authenticated:
# return 9999
- handle = nickname.lower() + '@' + domain.lower()
+ handle = nickname + '@' + domain
filename = baseDir + '/accounts/' + handle + '/' + followFile
if not os.path.isfile(filename):
return 0
@@ -378,7 +378,7 @@ def getFollowingFeed(baseDir: str, domain: str, port: int, path: str,
handleDomain = domain
if ':' in handleDomain:
handleDomain = domain.split(':')[0]
- handle = nickname.lower() + '@' + handleDomain.lower()
+ handle = nickname + '@' + handleDomain
filename = baseDir + '/accounts/' + handle + '/' + followFile + '.txt'
if not os.path.isfile(filename):
return following
diff --git a/person.py b/person.py
index b1fa69444..071f4beda 100644
--- a/person.py
+++ b/person.py
@@ -73,7 +73,7 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str,
if ':' not in domain:
fullDomain = domain + ':' + str(port)
- handle = nickname.lower() + '@' + domain.lower()
+ handle = nickname + '@' + domain
personFilename = baseDir + '/accounts/' + handle + '.json'
if not os.path.isfile(personFilename):
print('person definition not found: ' + personFilename)
@@ -210,7 +210,7 @@ def createPersonBase(baseDir: str, nickname: str, domain: str, port: int,
storeWebfingerEndpoint(nickname, domain, port,
baseDir, webfingerEndpoint)
- handle = nickname.lower() + '@' + domain.lower()
+ handle = nickname + '@' + domain
originalDomain = domain
if port:
if port != 80 and port != 443:
@@ -736,8 +736,8 @@ def setDisplayNickname(baseDir: str, nickname: str, domain: str,
displayName: str) -> bool:
if len(displayName) > 32:
return False
- handle = nickname.lower() + '@' + domain.lower()
- filename = baseDir + '/accounts/' + handle.lower() + '.json'
+ handle = nickname + '@' + domain
+ filename = baseDir + '/accounts/' + handle + '.json'
if not os.path.isfile(filename):
return False
@@ -752,8 +752,8 @@ def setDisplayNickname(baseDir: str, nickname: str, domain: str,
def setBio(baseDir: str, nickname: str, domain: str, bio: str) -> bool:
if len(bio) > 32:
return False
- handle = nickname.lower() + '@' + domain.lower()
- filename = baseDir + '/accounts/' + handle.lower() + '.json'
+ handle = nickname + '@' + domain
+ filename = baseDir + '/accounts/' + handle + '.json'
if not os.path.isfile(filename):
return False
diff --git a/utils.py b/utils.py
index 97fccaa8b..8a18c7534 100644
--- a/utils.py
+++ b/utils.py
@@ -327,9 +327,9 @@ def followPerson(baseDir: str, nickname: str, domain: str,
print('DEBUG: follow of domain ' + followDomain)
if ':' in domain:
- handle = nickname + '@' + domain.split(':')[0].lower()
+ handle = nickname + '@' + domain.split(':')[0]
else:
- handle = nickname + '@' + domain.lower()
+ handle = nickname + '@' + domain
if not os.path.isdir(baseDir + '/accounts/' + handle):
print('WARN: account for ' + handle + ' does not exist')
diff --git a/webfinger.py b/webfinger.py
index c1ecdfc1c..65b5666fc 100644
--- a/webfinger.py
+++ b/webfinger.py
@@ -121,11 +121,11 @@ def storeWebfingerEndpoint(nickname: str, domain: str, port: int,
wfSubdir = '/wfendpoints'
if not os.path.isdir(baseDir + wfSubdir):
os.mkdir(baseDir + wfSubdir)
- filename = baseDir + wfSubdir + '/' + handle.lower() + '.json'
+ filename = baseDir + wfSubdir + '/' + handle + '.json'
saveJson(wfJson, filename)
if nickname == 'inbox':
handle = originalDomain + '@' + domain
- filename = baseDir + wfSubdir + '/' + handle.lower() + '.json'
+ filename = baseDir + wfSubdir + '/' + handle + '.json'
saveJson(wfJson, filename)
return True
@@ -261,7 +261,7 @@ def webfingerLookup(path: str, baseDir: str,
if onionDomain in handle:
handle = handle.replace(onionDomain, domain)
onionify = True
- filename = baseDir + '/wfendpoints/' + handle.lower() + '.json'
+ filename = baseDir + '/wfendpoints/' + handle + '.json'
if debug:
print('DEBUG: WEBFINGER filename ' + filename)
if not os.path.isfile(filename):
@@ -339,7 +339,7 @@ def webfingerUpdate(baseDir: str, nickname: str, domain: str,
if not os.path.isdir(baseDir + wfSubdir):
return
- filename = baseDir + wfSubdir + '/' + handle.lower() + '.json'
+ filename = baseDir + wfSubdir + '/' + handle + '.json'
onionify = False
if onionDomain:
if onionDomain in handle:
@@ -352,7 +352,7 @@ def webfingerUpdate(baseDir: str, nickname: str, domain: str,
if not wfJson:
return
- actorFilename = baseDir + '/accounts/' + handle.lower() + '.json'
+ actorFilename = baseDir + '/accounts/' + handle + '.json'
actorJson = loadJson(actorFilename)
if not actorJson:
return
From 0737da1694d15895d00a5da091bf3b380f2b7bad Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Tue, 15 Sep 2020 10:30:38 +0100
Subject: [PATCH 23/67] More line spacing
---
epicyon-blog.css | 2 ++
epicyon-login.css | 2 ++
epicyon-profile.css | 2 ++
theme.py | 2 ++
4 files changed, 8 insertions(+)
diff --git a/epicyon-blog.css b/epicyon-blog.css
index 1dc8e7aec..3f595ed8b 100644
--- a/epicyon-blog.css
+++ b/epicyon-blog.css
@@ -43,6 +43,7 @@
--button-corner-radius: 15px;
--timeline-border-radius: 30px;
--focus-color: white;
+ --line-spacing: 100%;
}
@font-face {
@@ -70,6 +71,7 @@ body, html {
min-width: 950px;
margin: 0 auto;
font-size: var(--font-size);
+ line-height: var(--line-spacing);
}
a, u {
diff --git a/epicyon-login.css b/epicyon-login.css
index 19a2a040b..15f78545e 100644
--- a/epicyon-login.css
+++ b/epicyon-login.css
@@ -20,6 +20,7 @@
--button-selected: #666;
--form-border-radius: 30px;
--focus-color: white;
+ --line-spacing: 100%;
}
@font-face {
@@ -53,6 +54,7 @@ body, html {
min-width: 600px;
margin: 0 auto;
font-size: var(--font-size);
+ line-height: var(--line-spacing);
}
a, u {
diff --git a/epicyon-profile.css b/epicyon-profile.css
index 6aec94c30..3462fc0b5 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -59,6 +59,7 @@
--focus-color: white;
--quote-right-margin: 0.25em;
--quote-font-weight: bold;
+ --line-spacing: 100%;
}
@font-face {
@@ -86,6 +87,7 @@ body, html {
min-width: 950px;
margin: 0 auto;
font-size: var(--font-size);
+ line-height: var(--line-spacing);
}
blockquote {
diff --git a/theme.py b/theme.py
index d04ed553d..57e74fd1b 100644
--- a/theme.py
+++ b/theme.py
@@ -316,6 +316,7 @@ def setThemeNight(baseDir: str):
"event-color": "#a961ab",
"event-background": "#333",
"quote-right-margin": "0",
+ "line-spacing": "150%",
"*font-family": "'solidaric'",
"*src": fontStr,
"**src": fontStrItalic
@@ -781,6 +782,7 @@ def setThemeSolidaric(baseDir: str):
"title-background": "#ccc",
"gallery-text-color": "black",
"quote-right-margin": "0",
+ "line-spacing": "150%",
"*font-family": "'solidaric'",
"*src": "url('./fonts/solidaric.woff2') format('woff2')",
"**src": "url('./fonts/solidaric-italic.woff2') format('woff2')"
From 1da78a8abd3f968f58b536081c04ab0aca0d9c07 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Tue, 15 Sep 2020 10:37:07 +0100
Subject: [PATCH 24/67] Normal font weight for quotes but larger text size
---
epicyon-profile.css | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/epicyon-profile.css b/epicyon-profile.css
index 3462fc0b5..b43950627 100644
--- a/epicyon-profile.css
+++ b/epicyon-profile.css
@@ -58,7 +58,8 @@
--title-color: #999;
--focus-color: white;
--quote-right-margin: 0.25em;
- --quote-font-weight: bold;
+ --quote-font-weight: normal;
+ --quote-font-size: 120%;
--line-spacing: 100%;
}
@@ -96,6 +97,7 @@ blockquote {
padding: 0.5em 10px;
font-weight: var(--quote-font-weight);
font-style: italic;
+ font-size: var(--quote-font-size);
quotes: "\201C""\201D""\2018""\2019";
}
blockquote:before {
From b291619556b4de5e8d7518db93b5fb916b418d41 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Tue, 15 Sep 2020 17:57:00 +0100
Subject: [PATCH 25/67] Indymedia theme
---
Makefile | 1 +
img/banner_indymedia.png | Bin 0 -> 17053 bytes
img/icons/indymedia/add.png | Bin 0 -> 1359 bytes
img/icons/indymedia/bookmark.png | Bin 0 -> 2260 bytes
img/icons/indymedia/bookmark_inactive.png | Bin 0 -> 1387 bytes
img/icons/indymedia/calendar.png | Bin 0 -> 1357 bytes
img/icons/indymedia/calendar_notify.png | Bin 0 -> 1358 bytes
img/icons/indymedia/delete.png | Bin 0 -> 1422 bytes
img/icons/indymedia/dm.png | Bin 0 -> 1443 bytes
img/icons/indymedia/download.png | Bin 0 -> 1403 bytes
img/icons/indymedia/edit.png | Bin 0 -> 1430 bytes
img/icons/indymedia/like.png | Bin 0 -> 1428 bytes
img/icons/indymedia/like_inactive.png | Bin 0 -> 1428 bytes
img/icons/indymedia/mute.png | Bin 0 -> 1438 bytes
img/icons/indymedia/new.png | Bin 0 -> 1428 bytes
img/icons/indymedia/newpost.png | Bin 0 -> 1389 bytes
img/icons/indymedia/pagedown.png | Bin 0 -> 1506 bytes
img/icons/indymedia/pageup.png | Bin 0 -> 1504 bytes
img/icons/indymedia/person.png | Bin 0 -> 1412 bytes
img/icons/indymedia/prev.png | Bin 0 -> 1515 bytes
img/icons/indymedia/qrcode.png | Bin 0 -> 10970 bytes
img/icons/indymedia/repeat.png | Bin 0 -> 1458 bytes
img/icons/indymedia/repeat_inactive.png | Bin 0 -> 1470 bytes
img/icons/indymedia/reply.png | Bin 0 -> 1416 bytes
img/icons/indymedia/rss.png | Bin 0 -> 7095 bytes
img/icons/indymedia/rss3.png | Bin 0 -> 5439 bytes
img/icons/indymedia/scope_blog.png | Bin 0 -> 1459 bytes
img/icons/indymedia/scope_dm.png | Bin 0 -> 1442 bytes
img/icons/indymedia/scope_event.png | Bin 0 -> 1369 bytes
img/icons/indymedia/scope_followers.png | Bin 0 -> 1438 bytes
img/icons/indymedia/scope_public.png | Bin 0 -> 1468 bytes
img/icons/indymedia/scope_question.png | Bin 0 -> 1424 bytes
img/icons/indymedia/scope_reminder.png | Bin 0 -> 1498 bytes
img/icons/indymedia/scope_report.png | Bin 0 -> 1348 bytes
img/icons/indymedia/scope_share.png | Bin 0 -> 1631 bytes
img/icons/indymedia/scope_unlisted.png | Bin 0 -> 1440 bytes
img/icons/indymedia/search.png | Bin 0 -> 1461 bytes
img/icons/indymedia/showhide.png | Bin 0 -> 1429 bytes
img/icons/indymedia/unmute.png | Bin 0 -> 1376 bytes
img/image_indymedia.png | Bin 0 -> 31170 bytes
theme.py | 53 ++++++++++++++++++++--
translations/ar.json | 3 +-
translations/ca.json | 3 +-
translations/cy.json | 3 +-
translations/de.json | 3 +-
translations/en.json | 3 +-
translations/es.json | 3 +-
translations/fr.json | 3 +-
translations/ga.json | 3 +-
translations/hi.json | 3 +-
translations/it.json | 3 +-
translations/ja.json | 3 +-
translations/oc.json | 3 +-
translations/pt.json | 3 +-
translations/ru.json | 3 +-
translations/zh.json | 3 +-
56 files changed, 81 insertions(+), 18 deletions(-)
create mode 100644 img/banner_indymedia.png
create mode 100644 img/icons/indymedia/add.png
create mode 100644 img/icons/indymedia/bookmark.png
create mode 100644 img/icons/indymedia/bookmark_inactive.png
create mode 100644 img/icons/indymedia/calendar.png
create mode 100644 img/icons/indymedia/calendar_notify.png
create mode 100644 img/icons/indymedia/delete.png
create mode 100644 img/icons/indymedia/dm.png
create mode 100644 img/icons/indymedia/download.png
create mode 100644 img/icons/indymedia/edit.png
create mode 100644 img/icons/indymedia/like.png
create mode 100644 img/icons/indymedia/like_inactive.png
create mode 100644 img/icons/indymedia/mute.png
create mode 100644 img/icons/indymedia/new.png
create mode 100644 img/icons/indymedia/newpost.png
create mode 100644 img/icons/indymedia/pagedown.png
create mode 100644 img/icons/indymedia/pageup.png
create mode 100644 img/icons/indymedia/person.png
create mode 100644 img/icons/indymedia/prev.png
create mode 100644 img/icons/indymedia/qrcode.png
create mode 100644 img/icons/indymedia/repeat.png
create mode 100644 img/icons/indymedia/repeat_inactive.png
create mode 100644 img/icons/indymedia/reply.png
create mode 100644 img/icons/indymedia/rss.png
create mode 100644 img/icons/indymedia/rss3.png
create mode 100644 img/icons/indymedia/scope_blog.png
create mode 100644 img/icons/indymedia/scope_dm.png
create mode 100644 img/icons/indymedia/scope_event.png
create mode 100644 img/icons/indymedia/scope_followers.png
create mode 100644 img/icons/indymedia/scope_public.png
create mode 100644 img/icons/indymedia/scope_question.png
create mode 100644 img/icons/indymedia/scope_reminder.png
create mode 100644 img/icons/indymedia/scope_report.png
create mode 100644 img/icons/indymedia/scope_share.png
create mode 100644 img/icons/indymedia/scope_unlisted.png
create mode 100644 img/icons/indymedia/search.png
create mode 100644 img/icons/indymedia/showhide.png
create mode 100644 img/icons/indymedia/unmute.png
create mode 100644 img/image_indymedia.png
diff --git a/Makefile b/Makefile
index 6573ca38c..5420916ad 100644
--- a/Makefile
+++ b/Makefile
@@ -23,3 +23,4 @@ clean:
rm -f deploy/*~
rm -f translations/*~
rm -rf __pycache__
+ rm calendar.css blog.css epicyon.css follow.css login.css options.css search.css suspended.css
diff --git a/img/banner_indymedia.png b/img/banner_indymedia.png
new file mode 100644
index 0000000000000000000000000000000000000000..5658b806c6275d7312bf50b0dd2fc43a42b35132
GIT binary patch
literal 17053
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
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/add.png b/img/icons/indymedia/add.png
new file mode 100644
index 0000000000000000000000000000000000000000..67b9501c7d40728399bdae900284c6ff2c2ab5be
GIT binary patch
literal 1359
zcmV-V1+e;wP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KJmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*
z%uMo-hcd^21(xLd0o5JGpWkNq0~eK?LQ?Zwa*nuCNrfvq9?z@nnqu1ZzS1>>=NEf;
z3@}WBR?bJO*Zc~*e!OtUpySmZ{2F1u99;vqLs^j-o&KC8?0nkk$|RI=c5-ohPW9lk
zZFkE4anHuvpC0GXdJfNqWKgLq0txdFl8Bn+%0SM$;x4F36!S<7eUTWpiLOi_$jj&5
zZH&(Xy@-7G!e{j#y-(tEz3lQy%Y12s&X)tEUyHvbehMs)jQDlH^mg@y$g}&Lc#QcHFY#HF8AmgsDt$MtJ3iCH&psuaq!n
zTM|+9hgQgo*Sba;i`=R)3qWXI+;j_kmkWPz4yagxHE?u+kI7j6Fb^qA?p0baVi!$ebnd0Rp7T9Z7N$$sCNGS8TjvwCA#N
z=4Hm&1Q042`^ne-0<4r2>&KE~4OJCQs+!f*gBGn>a>|->w!99xYGTRMvYELRt1g~g
zJ-fMk@mjbD&Oj}>Sn*OytsE)>RrsoyUtu};kRu&>%26AZPfJZ(Zq~e&Ry%j;
zI3{}T*1eZr2Ze!?Vx*xX4;wzps1s{#%1l#do;H1!Ss&Ccs^67gphg!p-lWz%dr*Tl
znB6XD9Vfb&ffy$Oaa#nipm{NiPATysx0uDk*c8f0QWu-hX%Pd$G>CQ5gWU(YpW+tO
ze~KIb6S=U^{TJi{(0$MC3u=A+&b3YK+=WZiDA;|YAUp@Jv(+{aoLG!!oP)pDhWIZX
zydAwAy&b(By&b(By&e5O90~q_z(1bhFUhH(KRCTo=l}o#g=s@WP)S2WAaHVTW@&6?
z004NLeUUv#!$25@-=<1cDjn<~;t-)aSrC=ts8uLJg-|QB>R@u|A2ex5Qd}Gb*MfsT
zi&X~~XI&j!1wrr!#L3Y~(M3x9E-kc(@s8sj-uvE{yYB#@US^urH34Y4ZKe`&F_T>t
z1Fz^sh-M5UGP8_1NlLv<=St#9>yH
zRpN8vag#1c{K$2s$#0wsE(<&}Y^GE5#9?Bw(7{Rvv!baHPZLK}O{aVz(`1$N7H6$o
zWvzSi7Y1|s$}-n!4I_a?EJ1<@1yz(#hK(rgIw=-XbRPHc54nDcTnf2LVB}ap1sY`6
z5B>+gdu!#VCYwpYIMDs#I3J@xU>9iA9OwJkaT+Ip{~5T_+x|)&nE52V*483NKxiAd
zxNd989&ot>3_cmMDZ7%NmXOZ_?`QN)SzzE6=v!;{t#yvm2Ov$oO5Okmhrn2Yve!M{
z-P75(e`{L(`vIiya=UkkE*$^>00vM@R7GV40RNc)E2XXI00001bW%=J06^y0W&i*H
z32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rf2@en+3rokuGynhqIY~r8R4C75V4yEx
ze*k6he?Vu*|DYFx@jnnWfLsG&fLz26VtgQ#0oM*T@Bp2C0c2o=Av}2L1pv~>Q01S)
RKwSU;002ovPDHLkV1j5Ca8m#P
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/bookmark.png b/img/icons/indymedia/bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..095439bdea0dcbeb2bdcaac3538d9c518913076f
GIT binary patch
literal 2260
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
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/calendar.png b/img/icons/indymedia/calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..34e7300887e610d1392bcdbf5b80ea64ca72f824
GIT binary patch
literal 1357
zcmV-T1+w~yP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KJmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*
z%uMo-hcd^21(xLd0o5JGpWkNq0~eK?LQ?Zwa*nuCNrfvq9?z@nnqu1ZzS1>>=NEf;
z3@}WBR?bJO*Zc~*e!OtUpySmZ{2F1u99;vqLs^j-o&KC8?0nkk$|RI=c5-ohPW9lk
zZFkE4anCy~JDc?!o(;*MQda~L<{=~zHOrNOoOi`tP?IR;kr?_S6wt8vl?eoS`MkT0
z@mZi3k?&sktp20-NqnxCT|Q}m
zZYpo+{{5+5Kys@#zzCy~s-*m=dqJ4SmhD`#G2
zoJ|0slChtB?JvMeNwIz`Io42B(WI(bO+9GQnkA>KIcLl3kgFz^Of8$4Te0fm$!)
zyBDv8i{K2@l8Y5DrPRuyB2a~|iuo0mgAX~2**TI4MRNI`XjLql`MS)~3ufb>?Z)XPNau?V|c!`2}ipQR7W&&9etJScBQ^
zg4S`Oiy4SwAYHwwaY@H$&<^T3J4c*Z&Sdu@pS(!tx&
z+tJ(6+tJ(6+tJ(6|HF~s4+#7t8~y^sjGug!p`-8s00D(*LqkwWLqi~Na&Km7Y-Iod
zc$|HaJxIeq7>3`bN>wTy>>%P0p*mR*mEx#XC_;r$E41oha_Jv5X-HCB90k{cgFlN^
z2N!2u9b5%L@CU@n(Mi!oO8hP@w21MJ;~w7o-j}=Y0HI!Hn$mj?)JqO}$Fq00)P_Sb?(FJ>K2Z
z*|&ddTK)S0r0;UOcZe<>00006P)t-sS_J_AnE>927?1z}00DGTPE!Ct=GbNc000Sa
zNLh0L01ejw01ejxLMWSf00007bV*G`2jmG45FZ@T4{)*o0022jL_t(2&tqU1Y=HSc
z5P%r$AVvd>aRA16K!9=o|Nq}$2EzkB2BH~w45Wj0+y*kk{LTmqjll%~xC?B3=Mr(j
P00000NkvXXu0mjfA}x9p
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/calendar_notify.png b/img/icons/indymedia/calendar_notify.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e5790b617e2924157271375670076c0b6535b15
GIT binary patch
literal 1358
zcmV-U1+n^xP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KZlH4c^hW~Sl905rPiQ`~Cs&a!peqONM(>>=NEf;
z3@}WBR?bJO*Zc~*e!Ot6LC32-_%*_QIl2aJhq6{?boz6Uu=8oBE0R#g*~!K2In;yC
zw%sB7$35?`>}=L^cs3-1N?oy#Fb^S#s9CNEj#VM^qlMVE`I9N6w0nC!{BNp20mc3ph$I6{Bl?l!Wul#KZ|1|g~CCu5D
zL=^p@72@KR*9c>gTQz0@2+fO|Zh`M|;g3)GgH#1U-7-5qu*TzbaVUM{mTb;~d5ZSj
zLKLiD4j>WMRs=%=0x@F`P^M_iMg$!lfGQ$qNqm3+sd7hivcj-7L
zdhXV}mtF^jfswAYhdGr!;Eoa1zir=+-j3dm-j3dm-j3dm
z{{N0-;*SUX6B~X2iI$zWMTACD0004mX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$i
zQ^gM|73?75kfC<6P*lWGt5Adrp;l;
zlcSTOibnNH0Uhls^O8!K(hil#<9MI2T&o$`f@$13M7&RV(3n)l={4CM5cWvu?swklh8&O(yQY@rsKiw4-hjWURX9E0000vNklYH7;J#~
zKM;Tz>>x%1jBx
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KJmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*
z%uMo-hcd^21(xLd0o5JGpWkNq0~eK?LQ?Zwa*nuCNrfvq9?z@nnqu1ZzS1>>=NEf;
z3@}WBR?bJO*Zc~*e!OtUpySmZ{2F1u99;vqLs^j-o&KC8?0nkk$|RI=c5-ohPW9lk
zZFkE4anHuvpC0GXdJfNqWKgLq0txdFl8Bn+%0SM$;x4F36!S<7eGv+1RPvPx1bO+q
zyN&T#pcj$vUihs3qxVUCu9satX_+sL(D`zJ^lS0A#7}|ckrBTRnBK0w5P5c=bDUpS
zQ--4XT2V3F>TLCAhwMrAYZ=9GEBdxeLGf5)1M(hQJWv`HVo;fZ5_PIHY3#O9LyCz9
z8(QYZvTZKLg_|r+X%(7mpx4F0vhfH&mxLd=(2iSnyhe`5oiLRN&Iqsku!O%G{FM^s
zY)c}F{?H0}@mkkNW06}mW&sGzi<@qN?{eXfPwNLu6$Ew5?D)VMkJH7W^s%;Na~8}~
zwC5J0VEu9ci4a?n3<(Itj6Fb^qA?p0baVi!$ebnd0Rp7T9Z7N$$sCNGS8TjvwCA#N
z=4Hm&1Q6Ij*iXLp7ht8NSU;8=YpAMdQq`=c9<*r9l2g{4v*mTjRTE35md(tqSatE_
z>ep0QH48%AQh}$B71n4lDgQ0PKy{2ra`Qe9_&8I{S>#L
z{!`repU8!U?!O=xfbM&4Ur_7ocdl(>=Pq2DM#1hI1>re(ovpTc;KX7);~f0GHpGAF
z;O*$`=QRMJz#r2nAJ?P=<{t?K&wIQgj~o@DI6uiChY~N?_zzKm{6P
z*AM;&zk6%trzV?8!8p+U;y53pKwuYW)Ewvg*l`*sfd3h|(%b$@9hmtfz1G$uM?h#B
zxVUa>${ujJ0}MVHvMIZgpO%o%1Mg?_O<7>z7U)}R_N{e}(+40;y-MBy2Zz8|fwI><
z-rdvLw|{F|{rdr=?{d3$h%Oxf000J1OjJc<1pxn<0R8+<^#A|>0d!JMQvg8b*k%9#
z010qNS#tmYE+YT{E+YYWr9XB6000McNliruh3
z<|kqgvn!0)6&`2`2ULXxisAyY!T@QG2Udk
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/dm.png b/img/icons/indymedia/dm.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e40f56b46236265771d66ce9be736e7076c12da
GIT binary patch
literal 1443
zcmV;U1zh@xP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KJmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*
z%uMo-hcd^21(xLd0o5JGpWkNq0~eK?LQ?Zwa*nuCNrfvq9?z@nnqu1ZzS1>>=NEf;
z3@}WBR?bJO*Zc~*e!OtUpySmZ{2F1u99;vqLs^j-o&KC8?0nkk$|RI=c5-ohPW9lk
zZFkE4anCy~JDc?!o(;*MQda~L<{=~zHOrNOoOi`tP?IR;kr?_S9MG`bnLv=2&%4_g
zp9Ojm`R;|!>OXp)#OHe1<&&2A(g>X|2S~pbe@pxnSRNVi>wxL)>I;!)_c_P;bv0!u
zny(eL#irX0CLWMn_G=l%a4Y(@OF{8iV*~OYTRc!26=G1Cff9A9G->R%QA3J}2OC=E
z#mE0fe#QMRqjZVlSt-Z?7U**9iu&$l`}6h
z&L)6R$=FZ6_7`BKq*yx~7l7`2ZeLLA>vyhgV&^VgnnuCy8wKGxc%7}bdEmriJmVbvy*9*u>EP|?
z?da|3?da|3?da|3|KUjR2L%3+4SxZeJfC?i^Gg~400D(*LqkwWLqi~Na&Km7Y-Iod
zc$|HaJxIeq7>3`bN>wTy>>%P0p*mR*mEx#XC_;r$E41oha_Jv5X-HCB90k{cgFlN^
z2N!2u9b5%L@CU@n(Mi!oO8hP@w21MJ;~w7o-j}=Y0HI!Hn$mj?)JqO}$Fq00)P_Sb?(FJ>K2Z
z*|&ddTK)S0r0;UOcZe<>00006P)t-sV+8>JnE?I#PW1o)00DGTPE!Ct=GbNc000Sa
zNLh0L01ejw01ejxLMWSf00007bV*G`2jmG45Fi+iyq=c;0056kL_t(2&&|*=4#F@D
z1yD;YY`y_Lim%cmaDb{|VCPDadXe@7bSzTTw}9Ld^B_6g#mUk+a4HK-r6qd*m7W+;Tn1vs0!dkHO*5{T#EOqFtb9im&Mt~3ibtDgh`~yr58MOY-*t|ak54#jd;v?&i!}-pD3SmG002ovPDHLkV1n)bsOJCx
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/download.png b/img/icons/indymedia/download.png
new file mode 100644
index 0000000000000000000000000000000000000000..c666bad267e117e45e2f3341387f291a48dc0f01
GIT binary patch
literal 1403
zcmV->1%EP)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KJmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*
z%uMo-hcd^21(xLd0o5JGpWkNq0~eK?LQ?Zwa*nuCNrfvq9?z@nnqu1ZzS1>>=NEf;
z3@}WBR?bJO*Zc~*e!OtUpySmZ{2F1u99;vqLs^j-o&KC8?0nkk$|RI=c5-ohPW9lk
zZFkE4anCy~JDc?!o(;*MQda~L<{=~zHOrNOoOi`tP?IR;kr?_S9MGuHl?eoS`MkT0
z@mZi3k?&sktp20-NqnxCT|Q}aZ0PuWCOh}4wj8a0JdXkOfO3w)Oge|%a$SgIhXTV}@x)_9yQ4yBK^C7ZKgo}xXs
z5C!X(14x9}ieyMYAZF|V$`p;+h@hhbP(|h}i4PDURqjZVlSt-Z?7U**9iu&$l`}6h
z&L)6R$=FZ6_7`BKq*yx~7l7`2ZeLLA>vyhgV&^VgnnuCy8wKGxc%7}bdEmriJmVbvy*9*u>EP|?
z?da|3?da|3?da|3|KUjR2L%3+4SxZeLZ5kJ(gB7500D(*LqkwWLqi~Na&Km7Y-Iod
zc$|HaJxIeq7>3`bN>wTy>>%P0p*mR*mEx#XC_;r$E41oha_Jv5X-HCB90k{cgFlN^
z2N!2u9b5%L@CU@n(Mi!oO8hP@w21MJ;~w7o-j}=Y0HI!Hn$mj?)JqO}$Fq00)P_Sb?(FJ>K2Z
z*|&ddTK)S0r0;UOcZe<>00006P)t-sVg&&InE*DRolpP(00DGTPE!Ct=GbNc000Sa
zNLh0L01ejw01ejxLMWSf00007bV*G`2jmG45Fj%m0B6?#003u6L_t(2&&|-W4Zt7_
z1V9i4B_l8jqrqs5!U&WUh!2=gigb|@DPLV-y=5!)UVuNrVx~-(g*>4b(jMVZ1co30
zUEqNxa6mnaioom|DN47caS)*sz7ehxwh$&0Iz9jLb=M<&l>>{oZ7@veZr}g_002ov
JPDHLkV1l@TlW70|
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/edit.png b/img/icons/indymedia/edit.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3901fc97ac5009e2b2bbb1cb2c1a793b2479360
GIT binary patch
literal 1430
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
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/new.png b/img/icons/indymedia/new.png
new file mode 100644
index 0000000000000000000000000000000000000000..80f2fb6bab175acb07a4689372b5668ec3f7ebab
GIT binary patch
literal 1428
zcmV;F1#9|=P)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KHavUKHMgLhvmVhLL#Byk8sorPkg)S%r!$gJ_M?)E+heF3A7#5j
z_P3YiUfvM|zQdy-8C2?uiG+C|B#9;5ph`?0#3G8E0{
zj#^^V;e3tdtb{$C6_YRTWLDn$^^U7Oh!w%9?YwJTJLwV#(C9nYk6KE}mRHySaPu
zTDS=AKrOjg@lr~y94aQN@Kw>j!m{xuTiSHXn{B?8tu}0*mYTNQta&S~cJ9(~P4wKY
zdoR826n5Mcd)jr+yY0T0y$R6nFYphhP(UZiF}yQ#q%%q|x+
zuM?fjK#UWCxJ?4s&^(z%r<8b-o6KTi913Lwsgq6UG>HLW+KF}0&F+odZ*dFizr~Gz
zMJ`Nq|AJfqx{usGq1NZ`TwBDBQ#dt^g42gSl|A5%5!v6CFGnv&FGnv&FGnv&FGv5s
zBN_PP0sq8??`)QxIZ5MxSO5S4glR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsJ^o
zDi!P?;*gU{3cF`(uw2KYqcS!S3v@dokqrfqQECl0ZqtP-CSkDGKs;zzD49=~xe
zxGeC@keN=+6NiY!LK`b>%!;N)JVhKjK?bHEzVlG%9{7&FAU`Lm1VBe97O_)
zSb_u*3aTif3>#5eby6&(Xg}V;KjQi&aw+60fstbY6=;xMKlmT~?$*jrPIyUyIMDs#
zI3Hs`&o0oYInMX7<1|hH|1)rYT&7=AKjQ+6dk
zO(CBL-p}ZpvcS+S(7)#O*4)SG1CXY!k~hG?ArL80_IihR_qO-;@0n(QKcv%gyP$%n
zkpKVy22e~?MOFm>|NsBD?)ygo0004WQchCML1|K)j)t##*0YKJ^R`OE08Xg#2b>vA5HU7%K~nG?
zD2A*!7vMdTf*%nT{SiUYzCj9YLA&5k6oEGdylM8CHiHe(^DL)5s$wsB;EZ00000
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KJmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*
z%uMo-hcd^21(xLd0o5JGpWkNq0~eK?LQ?Zwa*nuCNrfvq9?z@nnqu1ZzS1>>=NEf;
z3@}WBR?bJO*Zc~*e!OtUpySmZ{2F1u99;vqLs^j-o&KC8?0nkk$|RI=c5-ohPW9lk
zZFkE4anCy~JDc?!o(;*MQda~L<{=~zHOrNOoOi`tP?IR;kr?_SDWFMme=7ue`MkT0
z@mZi3k?&sktp20-NqnxCT|Q}m
zZYuDWr)bYD
zM8W#y01_d#A{i18h#7l;GDTxHBIxJx~7l7`2ZeLLA>vyhgV&^VgnnuCy8wKGxc%7}bdEmriJmVbvy*9*u>EP|?
z?da|3?da|3?da|3|KUjR2L%3+4SxaP-=BVv<3`bN>wTy>>%P0p*mR*mEx#XC_;r$E41oha_Jv5X-HCB90k{cgFlN^
z2N!2u9b5%L@CU@n(Mi!oO8hP@w21MJ;~w7o-j}=Y0HI!Hn$mj?)JqO}$Fq00)P_Sb?(FJ>K2Z
z*|&ddTK)S0r0;UOcZe<>00006P)t-sS_J_AnE>927?1z}00DGTPE!Ct=GbNc000Sa
zNLh0L01ejw01ejxLMWSf00007bV*G`2jmG45F#z=IXE@|003D@L_t(2&tqU1bl^V_
zfM`Y#qXEcZ1~Co*8SEg&1Hz2oV8;3X|G$G7pa1_q4`%%N|KA>>rv4vP@%*1q#`(`s
v#^?J`#_#=5#=m-EETs(t?ss@-3@!iw;+K~fib+B`00000NkvXXu0mjf!UUCj
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/pagedown.png b/img/icons/indymedia/pagedown.png
new file mode 100644
index 0000000000000000000000000000000000000000..059eee161b3b5b0b2d3be8e498c7c8c328f8558a
GIT binary patch
literal 1506
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
S-0ZXf0000
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KHlH@21MgLjFECERfiREA(5wn9?{#-DbU0MB@
z>gcbDND~Guuq1ROXH^*g{5`{8xHt-jq~^Kg9C4+R3Rg@#-dEi{#kBi?1MEWlNIW@r?n<-~v1^C$=L#qxlk>$M};geC1dt9bRxhXD1E9cMG4=
zAde%LPxSJ0-16{wf%M0?H`5OuS$Z1g7mrMzHsVLD>z=dwoZ~)SO&Led=TMK6P}nGE
zzg80L*D{*nR?Ka;g61ffh8*j$#S5)bAqL_}i8@u9fySORYVa}fV8h7VShmc;qHvQ1
zJ*`HQ4dA;t5~Cqi1X7+e9A9YLE!$orhviP#$^>PESN^kwuWb5Nn{(9?Q8+b2H(*|6
z2sakF)nglo&^$ra9pFcMO~?aQfKYds9S5xOx>a0C-*QVfXu&?kco#QWzu#Yq5^O7+
zApwGzQBagA8nY20kPbkVqO&BvK!8-a!%0pe8EjAlFdguY(ca6-w;W$dkWk4ePG6-7
zSScy;$C4w5s){C6&1&jev}VaEpu%#tygs+p#FD9HGjl6eT|BvZc60aQwQv!9jkTa0
zi)l;NZ0QIU4<*AQBZxOz&v}Mt+sgue6e^v$3GlHd@Fh@dMkP>dMkP>dMo;0
zD-!$xf&VJQzpQP&Kj?6@U{3cF`(uw2KYqcS!S3v@dokqrfqQECl0ZqtP-CSkDGKs;zzD49=~xe
zxGeC@keN=+6NiY!LK`b>%!;N)JVhKjK?bHEzVlG%9{7&FAU`Lm1VBe97O_)
zSb_u*3aTif3>#5eby6&(Xg}V;KjQi&aw+60fstbY6=;xMKlmT~?$*jrPIyUyIMDs#
zI3Hs`&o0oYInMX7<1|hH|1)rYT&7=AKjQ+6dk
zO(CBL-p}ZpvcS+S(7)#O*4)SG1CXY!k~hG?ArL80_IihR_qO-;@0n(QKcv%gyP$%n
zkpKVy22e~?MPmg3|Cs>&{7&@%0004WQchC-n%gei%S
z4HE)Gf31D%Y-?RW0u#{MI}pGD4B!S5m&F=d`8_Yg|}!tKEA5(uU+6n+F(SgXf%P
RA*}!a002ovPDHLkV1gmoub=<`
literal 0
HcmV?d00001
diff --git a/img/icons/indymedia/qrcode.png b/img/icons/indymedia/qrcode.png
new file mode 100644
index 0000000000000000000000000000000000000000..933a2671c30e04e49ab597352d564514adcc992d
GIT binary patch
literal 10970
zcmV<0Dkas4P)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1q$mfX0G{O2m}62v#T96ryP9nA740-#ixRax%7
zK4W*=<&;E`1P};3m}dR&|7`Q0|NO^Vdj%6>E~%z;;a8}kx`rRhrN8uV+$Mj@uW&Bm
z-*2Cr=YqpW9)ElNXIkg}hR@^I1Nl5)`}^l6k26j=1Dy-^fSzx5_~G1F&OqMj=l1;D
z)bm^mFUvXquj;~iNPd0)cgWa`88M!B#w~CCg+B{#@cMtl{|SFOZ*h}7KL`2qm%TI3
zkKZ=$`RUuD-XM?a}$%#?N~vJM=mu`}O9x3!#Z3eEoXayS-=Gd+F+0
zNZ6@l&Z6$6$WOSjV<<0=CH&6#KjP;szbk$hEO9_$6VmMXJ&di^VYjypcG_mQUGn#^
z15*rcxs1P^8`yV#R(y8V4NnmS{