fedipod-server 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4184) hide show
  1. package/dist/handler.js +4 -0
  2. package/lib/core/publisher/index.mjs +3 -0
  3. package/lib/core/wire.mjs +10 -1
  4. package/lib/device/cli/commands/setup.mjs +6 -2
  5. package/lib/device/gateway-move.mjs +58 -0
  6. package/lib/device/migrate.mjs +3 -1
  7. package/lib/device/setup.mjs +67 -7
  8. package/lib/gateway/front-core.mjs +118 -19
  9. package/lib/gateway/gateway-core.mjs +15 -6
  10. package/lib/gateway/notices.mjs +84 -0
  11. package/lib/gateway/quiet.mjs +184 -0
  12. package/lib/pod/state.mjs +8 -7
  13. package/package.json +1 -1
  14. package/run-agent.mjs +19 -0
  15. package/web/admin/bar.css +44 -10
  16. package/web/admin/client/index.html +29 -2
  17. package/web/admin/gateway.js +22 -0
  18. package/web/admin/index.html +52 -12
  19. package/web/admin/notices-bar.js +90 -0
  20. package/web/admin/record.js +13 -1
  21. package/web/admin/setup/index.html +29 -2
  22. package/web/admin/upkeep.js +4 -5
  23. package/web/app/README.md +14 -10
  24. package/web/app/admin-facade.mjs +26 -10
  25. package/web/app/agent.mjs +58 -16
  26. package/web/app/boot.mjs +154 -92
  27. package/web/app/dist/boot.js +237 -418
  28. package/web/app/dist/boot.js.map +4 -4
  29. package/web/app/dist/sw.js +160 -55
  30. package/web/app/dist/sw.js.map +4 -4
  31. package/web/app/gateway-move.mjs +60 -0
  32. package/web/app/index.html +36 -46
  33. package/web/app/keys-browser.mjs +12 -15
  34. package/web/app/keystore.mjs +19 -36
  35. package/web/app/signup.mjs +172 -132
  36. package/web/app/sw-src.mjs +1 -1
  37. package/web/front/admin.html +3 -1
  38. package/web/front/notices.html +69 -0
  39. package/web/front/notices.js +107 -0
  40. package/web/app/index.html~ +0 -152
  41. package/web/app/site/_headers +0 -31
  42. package/web/app/site/_redirects +0 -39
  43. package/web/app/site/admin/actors.js +0 -145
  44. package/web/app/site/admin/bar.css +0 -92
  45. package/web/app/site/admin/bar.js +0 -99
  46. package/web/app/site/admin/client/client.js +0 -66
  47. package/web/app/site/admin/client/index.html +0 -61
  48. package/web/app/site/admin/client-phanpy/index.html +0 -61
  49. package/web/app/site/admin/client-pick.js +0 -79
  50. package/web/app/site/admin/common.js +0 -23
  51. package/web/app/site/admin/connections.js +0 -112
  52. package/web/app/site/admin/gateway.js +0 -111
  53. package/web/app/site/admin/group.js +0 -258
  54. package/web/app/site/admin/index.html +0 -582
  55. package/web/app/site/admin/oauth-signin.mjs +0 -37
  56. package/web/app/site/admin/record.js +0 -378
  57. package/web/app/site/admin/setup/index.html +0 -219
  58. package/web/app/site/admin/setup/setup.js +0 -326
  59. package/web/app/site/admin/tokens.css +0 -68
  60. package/web/app/site/admin/upkeep.js +0 -178
  61. package/web/app/site/admin/window.css +0 -55
  62. package/web/app/site/admin/window.js +0 -136
  63. package/web/app/site/app/404.html +0 -40
  64. package/web/app/site/app/_headers +0 -2
  65. package/web/app/site/app/apple-touch-icon.png +0 -0
  66. package/web/app/site/app/assets/ICONS-DIPJeU0C.js +0 -2
  67. package/web/app/site/app/assets/ICONS-DIPJeU0C.js.map +0 -1
  68. package/web/app/site/app/assets/ScheduledAtField-D-Abfo4J.js +0 -183
  69. package/web/app/site/app/assets/ScheduledAtField-D-Abfo4J.js.map +0 -1
  70. package/web/app/site/app/assets/Temml-CCjoacWt.woff2 +0 -0
  71. package/web/app/site/app/assets/__vite-browser-external-C7iut881.js +0 -2
  72. package/web/app/site/app/assets/__vite-browser-external-C7iut881.js.map +0 -1
  73. package/web/app/site/app/assets/boosts-carousel-BiOaNdMT.jpg +0 -0
  74. package/web/app/site/app/assets/catch-up-O5q5C75Z.png +0 -0
  75. package/web/app/site/app/assets/chunk-aKtaBQYM.js +0 -1
  76. package/web/app/site/app/assets/compose-CFEx7wb4.js +0 -2
  77. package/web/app/site/app/assets/compose-CFEx7wb4.js.map +0 -1
  78. package/web/app/site/app/assets/compose-ZJN5xSb4.js +0 -35
  79. package/web/app/site/app/assets/compose-ZJN5xSb4.js.map +0 -1
  80. package/web/app/site/app/assets/debug.module-YFQgwnIr.js +0 -52
  81. package/web/app/site/app/assets/debug.module-YFQgwnIr.js.map +0 -1
  82. package/web/app/site/app/assets/dom-p1YcJ5Rw.js +0 -2
  83. package/web/app/site/app/assets/dom-p1YcJ5Rw.js.map +0 -1
  84. package/web/app/site/app/assets/home-mobile-dark@2x-Dc-J8-SM.png +0 -0
  85. package/web/app/site/app/assets/home-mobile-light@2x-Bd3fod8m.png +0 -0
  86. package/web/app/site/app/assets/home-tablet-dark@2x-BgcNI8le.png +0 -0
  87. package/web/app/site/app/assets/home-tablet-light@2x-BW2RV9T6.png +0 -0
  88. package/web/app/site/app/assets/icons/add-circle-line-WD0mwORD.js +0 -1
  89. package/web/app/site/app/assets/icons/alert-line-CpFUMf9s.js +0 -1
  90. package/web/app/site/app/assets/icons/android-2-line-Bzxnrd3S.js +0 -1
  91. package/web/app/site/app/assets/icons/announcement-line-5nwaJFJm.js +0 -1
  92. package/web/app/site/app/assets/icons/arrow-down-circle-line-a7Id9-Iv.js +0 -1
  93. package/web/app/site/app/assets/icons/arrow-down-line-B8uzXzq6.js +0 -1
  94. package/web/app/site/app/assets/icons/arrow-left-line-CGrGT9C-.js +0 -1
  95. package/web/app/site/app/assets/icons/arrow-right-line-CE-HERfX.js +0 -1
  96. package/web/app/site/app/assets/icons/arrow-to-up-line-CvdQjmcy.js +0 -1
  97. package/web/app/site/app/assets/icons/arrow-up-circle-line-DEparSNF.js +0 -1
  98. package/web/app/site/app/assets/icons/arrow-up-line-C7yBeugc.js +0 -1
  99. package/web/app/site/app/assets/icons/arrows-right-line-BtbXmJGP.js +0 -1
  100. package/web/app/site/app/assets/icons/at-line-CF66Bznk.js +0 -1
  101. package/web/app/site/app/assets/icons/attachment-line-BY8It-l9.js +0 -1
  102. package/web/app/site/app/assets/icons/blockquote-line-BS6pU_hm.js +0 -1
  103. package/web/app/site/app/assets/icons/board-line-C0UWXyA6.js +0 -1
  104. package/web/app/site/app/assets/icons/bookmark-line-1CtX5JLF.js +0 -1
  105. package/web/app/site/app/assets/icons/building-5-line-Dd59MzbO.js +0 -1
  106. package/web/app/site/app/assets/icons/bus-2-line-6_dvA0GG.js +0 -1
  107. package/web/app/site/app/assets/icons/calendar-day-line-Crpl_fmu.js +0 -1
  108. package/web/app/site/app/assets/icons/calendar-month-line-vommts2C.js +0 -1
  109. package/web/app/site/app/assets/icons/calendar-time-add-line-BU_DTlQk.js +0 -1
  110. package/web/app/site/app/assets/icons/camera-line-Cv69MEei.js +0 -1
  111. package/web/app/site/app/assets/icons/celebrate-line-B8DvIoi0.js +0 -1
  112. package/web/app/site/app/assets/icons/chart-bar-line-FK-QOmtF.js +0 -1
  113. package/web/app/site/app/assets/icons/chart-line-line-BGcJAFWw.js +0 -1
  114. package/web/app/site/app/assets/icons/chat-3-line-YFK2-hwz.js +0 -1
  115. package/web/app/site/app/assets/icons/check-circle-line-DsAxFr5-.js +0 -1
  116. package/web/app/site/app/assets/icons/clipboard-line-BBp364gJ.js +0 -1
  117. package/web/app/site/app/assets/icons/close-circle-line-CICdiuGz.js +0 -1
  118. package/web/app/site/app/assets/icons/close-line-DYrFWcjv.js +0 -1
  119. package/web/app/site/app/assets/icons/cloud-line-tiQAbah8.js +0 -1
  120. package/web/app/site/app/assets/icons/code-line-fAl8iiV3.js +0 -1
  121. package/web/app/site/app/assets/icons/comment-2-line-CR3g7WeB.js +0 -1
  122. package/web/app/site/app/assets/icons/copy-2-line-CLW69yF5.js +0 -1
  123. package/web/app/site/app/assets/icons/delete-2-line-B8xmbr4n.js +0 -1
  124. package/web/app/site/app/assets/icons/document-3-line-DBGNhAg2.js +0 -1
  125. package/web/app/site/app/assets/icons/document-line-C7mb9sb7.js +0 -1
  126. package/web/app/site/app/assets/icons/down-line-BGqSSThd.js +0 -1
  127. package/web/app/site/app/assets/icons/edit-4-line-DcgGaEhx.js +0 -1
  128. package/web/app/site/app/assets/icons/emoji-2-line-D8YgnM-y.js +0 -1
  129. package/web/app/site/app/assets/icons/exit-line-Dc07BS-x.js +0 -1
  130. package/web/app/site/app/assets/icons/external-link-line-BvpSkmjO.js +0 -1
  131. package/web/app/site/app/assets/icons/eye-2-line-CiWXx-f_.js +0 -1
  132. package/web/app/site/app/assets/icons/eye-close-line-BgTaSJ4P.js +0 -1
  133. package/web/app/site/app/assets/icons/filter-2-line-B_mR2usy.js +0 -1
  134. package/web/app/site/app/assets/icons/filter-line-C_nm-3cU.js +0 -1
  135. package/web/app/site/app/assets/icons/flag-1-line-C2HB05I0.js +0 -1
  136. package/web/app/site/app/assets/icons/forbid-circle-line-D3LTT9yd.js +0 -1
  137. package/web/app/site/app/assets/icons/formula-line-DLrt2d6j.js +0 -1
  138. package/web/app/site/app/assets/icons/grid-line-CgUmEikf.js +0 -1
  139. package/web/app/site/app/assets/icons/group-line-C5fnX0wU.js +0 -1
  140. package/web/app/site/app/assets/icons/hand-finger-2-line-BGgxbuL9.js +0 -1
  141. package/web/app/site/app/assets/icons/hashtag-line-CyTEEXBb.js +0 -1
  142. package/web/app/site/app/assets/icons/heart-crack-line-BZddbO2C.js +0 -1
  143. package/web/app/site/app/assets/icons/heart-line-CJ7K47J4.js +0 -1
  144. package/web/app/site/app/assets/icons/history-2-line-kWWvFzqv.js +0 -1
  145. package/web/app/site/app/assets/icons/history-line-bGQiwbTH.js +0 -1
  146. package/web/app/site/app/assets/icons/home-3-line-fRU1zeLG.js +0 -1
  147. package/web/app/site/app/assets/icons/information-line-iNk6-sOY.js +0 -1
  148. package/web/app/site/app/assets/icons/keyboard-line-DsCyuQNz.js +0 -1
  149. package/web/app/site/app/assets/icons/layout-4-line-CZkOX52Z.js +0 -1
  150. package/web/app/site/app/assets/icons/layout-5-line-B_znt5wO.js +0 -1
  151. package/web/app/site/app/assets/icons/left-line-eUw0tya4.js +0 -1
  152. package/web/app/site/app/assets/icons/lightning-line-DaKoDdix.js +0 -1
  153. package/web/app/site/app/assets/icons/link-2-line-DCqLmMA7.js +0 -1
  154. package/web/app/site/app/assets/icons/list-check-line-BAxosBh9.js +0 -1
  155. package/web/app/site/app/assets/icons/lock-line-CPoaXeUW.js +0 -1
  156. package/web/app/site/app/assets/icons/mail-line-B0P8aa1L.js +0 -1
  157. package/web/app/site/app/assets/icons/moon-line-CEqNAToP.js +0 -1
  158. package/web/app/site/app/assets/icons/more-1-fill-Dw2e5xab.js +0 -1
  159. package/web/app/site/app/assets/icons/more-3-line-BIiVjYTz.js +0 -1
  160. package/web/app/site/app/assets/icons/notification-line-BZZq2Gtu.js +0 -1
  161. package/web/app/site/app/assets/icons/pencil-line-CKh8-A1v.js +0 -1
  162. package/web/app/site/app/assets/icons/photo-album-line-Bnfg2u40.js +0 -1
  163. package/web/app/site/app/assets/icons/pin-line-DpTolyhs.js +0 -1
  164. package/web/app/site/app/assets/icons/play-fill-B0-G_8lX.js +0 -1
  165. package/web/app/site/app/assets/icons/qrcode-2-line-B6SPCaHn.js +0 -1
  166. package/web/app/site/app/assets/icons/quill-pen-line-B6LUrnCP.js +0 -1
  167. package/web/app/site/app/assets/icons/quote-left-fill-hQZ1cj_6.js +0 -1
  168. package/web/app/site/app/assets/icons/radar-line-CKyroTth.js +0 -1
  169. package/web/app/site/app/assets/icons/react-line-CoIKhhtK.js +0 -1
  170. package/web/app/site/app/assets/icons/refresh-2-line-D0mTF97S.js +0 -1
  171. package/web/app/site/app/assets/icons/right-line-B3KWJaqc.js +0 -1
  172. package/web/app/site/app/assets/icons/rocket-line-4KZl537D.js +0 -1
  173. package/web/app/site/app/assets/icons/round-fill-C69NTrZ0.js +0 -1
  174. package/web/app/site/app/assets/icons/round-line-B9k_1uo-.js +0 -1
  175. package/web/app/site/app/assets/icons/route-line-B28ReHcE.js +0 -1
  176. package/web/app/site/app/assets/icons/rows-4-line-CrBniagM.js +0 -1
  177. package/web/app/site/app/assets/icons/scan-line-DSf74YdP.js +0 -1
  178. package/web/app/site/app/assets/icons/search-2-line-B6geIU1z.js +0 -1
  179. package/web/app/site/app/assets/icons/settings-3-line-azJwK47w.js +0 -1
  180. package/web/app/site/app/assets/icons/settings-6-line-C_5zc5YR.js +0 -1
  181. package/web/app/site/app/assets/icons/share-2-line-D5MxWjrm.js +0 -1
  182. package/web/app/site/app/assets/icons/share-forward-line-Cp61fZzZ.js +0 -1
  183. package/web/app/site/app/assets/icons/sparkles-2-line-DYYyXTaW.js +0 -1
  184. package/web/app/site/app/assets/icons/sparkles-line-C2hY1s6I.js +0 -1
  185. package/web/app/site/app/assets/icons/time-line-BF3eet1v.js +0 -1
  186. package/web/app/site/app/assets/icons/transfer-4-line-oisfvTBw.js +0 -1
  187. package/web/app/site/app/assets/icons/translate-line-BFWol2Ce.js +0 -1
  188. package/web/app/site/app/assets/icons/unlock-line-X_x5vwv3.js +0 -1
  189. package/web/app/site/app/assets/icons/upload-3-line-DgzwUJeW.js +0 -1
  190. package/web/app/site/app/assets/icons/user-4-line-BVSynZCp.js +0 -1
  191. package/web/app/site/app/assets/icons/user-add-2-line-BlGS5Q8q.js +0 -1
  192. package/web/app/site/app/assets/icons/user-add-line-BbXdHG4z.js +0 -1
  193. package/web/app/site/app/assets/icons/user-edit-line-BFAHOV0X.js +0 -1
  194. package/web/app/site/app/assets/icons/user-follow-line-BXux0wSd.js +0 -1
  195. package/web/app/site/app/assets/icons/user-star-line-DdYlpHLU.js +0 -1
  196. package/web/app/site/app/assets/icons/user-warning-line-Cj43j0_E.js +0 -1
  197. package/web/app/site/app/assets/icons/user-x-line-DIDgNlPH.js +0 -1
  198. package/web/app/site/app/assets/icons/volume-line-Bs390KQt.js +0 -1
  199. package/web/app/site/app/assets/icons/volume-mute-line-DzlzIqFZ.js +0 -1
  200. package/web/app/site/app/assets/icons/walk-line-yNXfB-md.js +0 -1
  201. package/web/app/site/app/assets/icons/world-2-line-CenkGIwj.js +0 -1
  202. package/web/app/site/app/assets/icons/zoom-in-line-CaENUphf.js +0 -1
  203. package/web/app/site/app/assets/icons/zoom-out-line-BDNk0EWo.js +0 -1
  204. package/web/app/site/app/assets/instances-BNPptnn-.json +0 -333
  205. package/web/app/site/app/assets/locales/ar-SA-CfheRbCu.js +0 -1
  206. package/web/app/site/app/assets/locales/ca-ES-DHRW86Tz.js +0 -1
  207. package/web/app/site/app/assets/locales/cs-CZ-CKoqEuA1.js +0 -1
  208. package/web/app/site/app/assets/locales/de-DE-ByRPMRFy.js +0 -1
  209. package/web/app/site/app/assets/locales/eo-UY-CPC7wLCS.js +0 -1
  210. package/web/app/site/app/assets/locales/es-ES-dJa0Fd9t.js +0 -1
  211. package/web/app/site/app/assets/locales/eu-ES-C3djlPR2.js +0 -1
  212. package/web/app/site/app/assets/locales/fa-IR-DTT490Ck.js +0 -1
  213. package/web/app/site/app/assets/locales/fi-FI-B23MCPuz.js +0 -1
  214. package/web/app/site/app/assets/locales/fr-FR-BcaQsO5C.js +0 -1
  215. package/web/app/site/app/assets/locales/gl-ES-BR-CVKBN.js +0 -1
  216. package/web/app/site/app/assets/locales/he-IL-CfheRbCu.js +0 -1
  217. package/web/app/site/app/assets/locales/hu-HU-CfheRbCu.js +0 -1
  218. package/web/app/site/app/assets/locales/it-IT-C1136UFV.js +0 -1
  219. package/web/app/site/app/assets/locales/ja-JP-CRZmRAhD.js +0 -1
  220. package/web/app/site/app/assets/locales/kab-Cz8xH_TT.js +0 -1
  221. package/web/app/site/app/assets/locales/ko-KR-CG9UiY4o.js +0 -1
  222. package/web/app/site/app/assets/locales/lt-LT-CJcI6sHZ.js +0 -1
  223. package/web/app/site/app/assets/locales/nb-NO-CfheRbCu.js +0 -1
  224. package/web/app/site/app/assets/locales/nl-NL-DxN4Yc1t.js +0 -1
  225. package/web/app/site/app/assets/locales/oc-FR-CfheRbCu.js +0 -1
  226. package/web/app/site/app/assets/locales/pl-PL-DkwGXf6P.js +0 -1
  227. package/web/app/site/app/assets/locales/pseudo-LOCALE-CQ4XxkQ0.js +0 -1
  228. package/web/app/site/app/assets/locales/pt-BR-nGL0HdFS.js +0 -1
  229. package/web/app/site/app/assets/locales/pt-PT-Cp17aj2z.js +0 -1
  230. package/web/app/site/app/assets/locales/ru-RU-0Y8cIoaK.js +0 -1
  231. package/web/app/site/app/assets/locales/th-TH-CfheRbCu.js +0 -1
  232. package/web/app/site/app/assets/locales/tok-CfheRbCu.js +0 -1
  233. package/web/app/site/app/assets/locales/tr-TR-CfheRbCu.js +0 -1
  234. package/web/app/site/app/assets/locales/uk-UA-C5E3dFBf.js +0 -1
  235. package/web/app/site/app/assets/locales/zh-CN-BHJi7_et.js +0 -1
  236. package/web/app/site/app/assets/locales/zh-TW-CfheRbCu.js +0 -1
  237. package/web/app/site/app/assets/main-BdqNbG-a.js +0 -26
  238. package/web/app/site/app/assets/main-BdqNbG-a.js.map +0 -1
  239. package/web/app/site/app/assets/mock-home-DGhR__He.js +0 -2
  240. package/web/app/site/app/assets/mock-home-DGhR__He.js.map +0 -1
  241. package/web/app/site/app/assets/multi-column-ROck0NVt.jpg +0 -0
  242. package/web/app/site/app/assets/multi-hashtag-timeline-DH5INVHi.jpg +0 -0
  243. package/web/app/site/app/assets/nested-comments-thread-hv59kZLc.jpg +0 -0
  244. package/web/app/site/app/assets/polyfill-force-H8sUkLGp.js +0 -2
  245. package/web/app/site/app/assets/polyfill-force-H8sUkLGp.js.map +0 -1
  246. package/web/app/site/app/assets/pwa-viewport-ogKbF51K.js +0 -20
  247. package/web/app/site/app/assets/pwa-viewport-ogKbF51K.js.map +0 -1
  248. package/web/app/site/app/assets/style-B1iLPTPR.css +0 -2
  249. package/web/app/site/app/assets/temml-DuyIQMei.js +0 -97
  250. package/web/app/site/app/assets/temml-DuyIQMei.js.map +0 -1
  251. package/web/app/site/app/assets/tinyld.light.node-DtbBhLYC.js +0 -2
  252. package/web/app/site/app/assets/tinyld.light.node-DtbBhLYC.js.map +0 -1
  253. package/web/app/site/app/assets/year-in-posts-B2lywqdx.png +0 -0
  254. package/web/app/site/app/assets/year-in-posts-DJv_star.js +0 -3
  255. package/web/app/site/app/assets/year-in-posts-DJv_star.js.map +0 -1
  256. package/web/app/site/app/compose/index.html +0 -23
  257. package/web/app/site/app/favicon.ico +0 -0
  258. package/web/app/site/app/index.html +0 -76
  259. package/web/app/site/app/logo-192.png +0 -0
  260. package/web/app/site/app/logo-512.png +0 -0
  261. package/web/app/site/app/logo-badge-72.png +0 -0
  262. package/web/app/site/app/logo-maskable-512.png +0 -0
  263. package/web/app/site/app/logo-monochrome-512.png +0 -0
  264. package/web/app/site/app/logo-monochrome-maskable-512.png +0 -0
  265. package/web/app/site/app/manifest.webmanifest +0 -1
  266. package/web/app/site/app/og-image-2.jpg +0 -0
  267. package/web/app/site/app/og-image.png +0 -0
  268. package/web/app/site/app/robots.txt +0 -2
  269. package/web/app/site/app/version.json +0 -1
  270. package/web/app/site/authorize_interaction.html +0 -59
  271. package/web/app/site/authorize_interaction.js +0 -69
  272. package/web/app/site/bb/bb.js +0 -1617
  273. package/web/app/site/bb/index.html +0 -300
  274. package/web/app/site/bb/markdown.mjs +0 -0
  275. package/web/app/site/bb/masto.mjs +0 -179
  276. package/web/app/site/bb/mine.mjs +0 -48
  277. package/web/app/site/bb/oidc-session.mjs +0 -6
  278. package/web/app/site/bb/pod.mjs +0 -340
  279. package/web/app/site/bb/private.mjs +0 -98
  280. package/web/app/site/bb/read.mjs +0 -296
  281. package/web/app/site/bb/seen.mjs +0 -64
  282. package/web/app/site/bb/solid-oidc-session.mjs +0 -233
  283. package/web/app/site/bb/tokens.css +0 -68
  284. package/web/app/site/boot.js +0 -34366
  285. package/web/app/site/build.json +0 -1
  286. package/web/app/site/demo/fedi-account.mjs +0 -346
  287. package/web/app/site/demo/fedi-login.mjs +0 -123
  288. package/web/app/site/demo/index.html +0 -94
  289. package/web/app/site/demo/oidc-session.mjs +0 -233
  290. package/web/app/site/demo/tokens.css +0 -68
  291. package/web/app/site/icons/forum.svg +0 -11
  292. package/web/app/site/icons/gateway.svg +0 -14
  293. package/web/app/site/icons/local.svg +0 -11
  294. package/web/app/site/index.html +0 -255
  295. package/web/app/site/sengi/3rdpartylicenses.txt +0 -832
  296. package/web/app/site/sengi/Roboto-Black.72f6fd218b59c42e804c.woff2 +0 -0
  297. package/web/app/site/sengi/Roboto-Black.fdd88b742a9f6304f05b.woff +0 -0
  298. package/web/app/site/sengi/Roboto-Bold.08cb8f79715774f9a628.woff +0 -0
  299. package/web/app/site/sengi/Roboto-Bold.f3a02e2578bee50e620e.woff2 +0 -0
  300. package/web/app/site/sengi/Roboto-Light.10ad0f861c0c58077340.woff +0 -0
  301. package/web/app/site/sengi/Roboto-Light.ed4b08d2702fa26acc32.woff2 +0 -0
  302. package/web/app/site/sengi/Roboto-Medium.50d01d3e6c994995bcaf.woff2 +0 -0
  303. package/web/app/site/sengi/Roboto-Medium.9a3bf7acae14d9b5ed5a.woff +0 -0
  304. package/web/app/site/sengi/Roboto-Regular.94dac78eee406a8c8f04.woff +0 -0
  305. package/web/app/site/sengi/Roboto-Regular.9feb0110b6dff9ee2b9e.woff2 +0 -0
  306. package/web/app/site/sengi/Roboto-Thin.46888f279ddb7baaf897.woff2 +0 -0
  307. package/web/app/site/sengi/Roboto-Thin.f09d9b5e8e8a5f3843c1.woff +0 -0
  308. package/web/app/site/sengi/arrow_1.bc5b1e3edc01f84c94d7.png +0 -0
  309. package/web/app/site/sengi/arrow_2.4ca4d04924079fc62d23.png +0 -0
  310. package/web/app/site/sengi/assets/audio/all-eyes-on-me.mp3 +0 -0
  311. package/web/app/site/sengi/assets/audio/appointed.mp3 +0 -0
  312. package/web/app/site/sengi/assets/audio/boop.mp3 +0 -0
  313. package/web/app/site/sengi/assets/audio/exquisite.mp3 +0 -0
  314. package/web/app/site/sengi/assets/docs/privacy.html +0 -20
  315. package/web/app/site/sengi/assets/emoji/64/0023-20e3.png +0 -0
  316. package/web/app/site/sengi/assets/emoji/64/0023.png +0 -0
  317. package/web/app/site/sengi/assets/emoji/64/002a-20e3.png +0 -0
  318. package/web/app/site/sengi/assets/emoji/64/002a.png +0 -0
  319. package/web/app/site/sengi/assets/emoji/64/0030-20e3.png +0 -0
  320. package/web/app/site/sengi/assets/emoji/64/0030.png +0 -0
  321. package/web/app/site/sengi/assets/emoji/64/0031-20e3.png +0 -0
  322. package/web/app/site/sengi/assets/emoji/64/0031.png +0 -0
  323. package/web/app/site/sengi/assets/emoji/64/0032-20e3.png +0 -0
  324. package/web/app/site/sengi/assets/emoji/64/0032.png +0 -0
  325. package/web/app/site/sengi/assets/emoji/64/0033-20e3.png +0 -0
  326. package/web/app/site/sengi/assets/emoji/64/0033.png +0 -0
  327. package/web/app/site/sengi/assets/emoji/64/0034-20e3.png +0 -0
  328. package/web/app/site/sengi/assets/emoji/64/0034.png +0 -0
  329. package/web/app/site/sengi/assets/emoji/64/0035-20e3.png +0 -0
  330. package/web/app/site/sengi/assets/emoji/64/0035.png +0 -0
  331. package/web/app/site/sengi/assets/emoji/64/0036-20e3.png +0 -0
  332. package/web/app/site/sengi/assets/emoji/64/0036.png +0 -0
  333. package/web/app/site/sengi/assets/emoji/64/0037-20e3.png +0 -0
  334. package/web/app/site/sengi/assets/emoji/64/0037.png +0 -0
  335. package/web/app/site/sengi/assets/emoji/64/0038-20e3.png +0 -0
  336. package/web/app/site/sengi/assets/emoji/64/0038.png +0 -0
  337. package/web/app/site/sengi/assets/emoji/64/0039-20e3.png +0 -0
  338. package/web/app/site/sengi/assets/emoji/64/0039.png +0 -0
  339. package/web/app/site/sengi/assets/emoji/64/00a9.png +0 -0
  340. package/web/app/site/sengi/assets/emoji/64/00ae.png +0 -0
  341. package/web/app/site/sengi/assets/emoji/64/1f004.png +0 -0
  342. package/web/app/site/sengi/assets/emoji/64/1f0cf.png +0 -0
  343. package/web/app/site/sengi/assets/emoji/64/1f170.png +0 -0
  344. package/web/app/site/sengi/assets/emoji/64/1f171.png +0 -0
  345. package/web/app/site/sengi/assets/emoji/64/1f17e.png +0 -0
  346. package/web/app/site/sengi/assets/emoji/64/1f17f.png +0 -0
  347. package/web/app/site/sengi/assets/emoji/64/1f18e.png +0 -0
  348. package/web/app/site/sengi/assets/emoji/64/1f191.png +0 -0
  349. package/web/app/site/sengi/assets/emoji/64/1f192.png +0 -0
  350. package/web/app/site/sengi/assets/emoji/64/1f193.png +0 -0
  351. package/web/app/site/sengi/assets/emoji/64/1f194.png +0 -0
  352. package/web/app/site/sengi/assets/emoji/64/1f195.png +0 -0
  353. package/web/app/site/sengi/assets/emoji/64/1f196.png +0 -0
  354. package/web/app/site/sengi/assets/emoji/64/1f197.png +0 -0
  355. package/web/app/site/sengi/assets/emoji/64/1f198.png +0 -0
  356. package/web/app/site/sengi/assets/emoji/64/1f199.png +0 -0
  357. package/web/app/site/sengi/assets/emoji/64/1f19a.png +0 -0
  358. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1e8.png +0 -0
  359. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1e9.png +0 -0
  360. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1ea.png +0 -0
  361. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1eb.png +0 -0
  362. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1ec.png +0 -0
  363. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1ee.png +0 -0
  364. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f1.png +0 -0
  365. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f2.png +0 -0
  366. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f4.png +0 -0
  367. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f6.png +0 -0
  368. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f7.png +0 -0
  369. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f8.png +0 -0
  370. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1f9.png +0 -0
  371. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1fa.png +0 -0
  372. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1fc.png +0 -0
  373. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1fd.png +0 -0
  374. package/web/app/site/sengi/assets/emoji/64/1f1e6-1f1ff.png +0 -0
  375. package/web/app/site/sengi/assets/emoji/64/1f1e6.png +0 -0
  376. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1e6.png +0 -0
  377. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1e7.png +0 -0
  378. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1e9.png +0 -0
  379. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1ea.png +0 -0
  380. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1eb.png +0 -0
  381. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1ec.png +0 -0
  382. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1ed.png +0 -0
  383. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1ee.png +0 -0
  384. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1ef.png +0 -0
  385. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f1.png +0 -0
  386. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f2.png +0 -0
  387. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f3.png +0 -0
  388. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f4.png +0 -0
  389. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f6.png +0 -0
  390. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f7.png +0 -0
  391. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f8.png +0 -0
  392. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1f9.png +0 -0
  393. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1fb.png +0 -0
  394. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1fc.png +0 -0
  395. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1fe.png +0 -0
  396. package/web/app/site/sengi/assets/emoji/64/1f1e7-1f1ff.png +0 -0
  397. package/web/app/site/sengi/assets/emoji/64/1f1e7.png +0 -0
  398. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1e6.png +0 -0
  399. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1e8.png +0 -0
  400. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1e9.png +0 -0
  401. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1eb.png +0 -0
  402. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1ec.png +0 -0
  403. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1ed.png +0 -0
  404. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1ee.png +0 -0
  405. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f0.png +0 -0
  406. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f1.png +0 -0
  407. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f2.png +0 -0
  408. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f3.png +0 -0
  409. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f4.png +0 -0
  410. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f5.png +0 -0
  411. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f6.png +0 -0
  412. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1f7.png +0 -0
  413. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1fa.png +0 -0
  414. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1fb.png +0 -0
  415. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1fc.png +0 -0
  416. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1fd.png +0 -0
  417. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1fe.png +0 -0
  418. package/web/app/site/sengi/assets/emoji/64/1f1e8-1f1ff.png +0 -0
  419. package/web/app/site/sengi/assets/emoji/64/1f1e8.png +0 -0
  420. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1ea.png +0 -0
  421. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1ec.png +0 -0
  422. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1ef.png +0 -0
  423. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1f0.png +0 -0
  424. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1f2.png +0 -0
  425. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1f4.png +0 -0
  426. package/web/app/site/sengi/assets/emoji/64/1f1e9-1f1ff.png +0 -0
  427. package/web/app/site/sengi/assets/emoji/64/1f1e9.png +0 -0
  428. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1e6.png +0 -0
  429. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1e8.png +0 -0
  430. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1ea.png +0 -0
  431. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1ec.png +0 -0
  432. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1ed.png +0 -0
  433. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1f7.png +0 -0
  434. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1f8.png +0 -0
  435. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1f9.png +0 -0
  436. package/web/app/site/sengi/assets/emoji/64/1f1ea-1f1fa.png +0 -0
  437. package/web/app/site/sengi/assets/emoji/64/1f1ea.png +0 -0
  438. package/web/app/site/sengi/assets/emoji/64/1f1eb-1f1ee.png +0 -0
  439. package/web/app/site/sengi/assets/emoji/64/1f1eb-1f1ef.png +0 -0
  440. package/web/app/site/sengi/assets/emoji/64/1f1eb-1f1f0.png +0 -0
  441. package/web/app/site/sengi/assets/emoji/64/1f1eb-1f1f2.png +0 -0
  442. package/web/app/site/sengi/assets/emoji/64/1f1eb-1f1f4.png +0 -0
  443. package/web/app/site/sengi/assets/emoji/64/1f1eb-1f1f7.png +0 -0
  444. package/web/app/site/sengi/assets/emoji/64/1f1eb.png +0 -0
  445. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1e6.png +0 -0
  446. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1e7.png +0 -0
  447. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1e9.png +0 -0
  448. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1ea.png +0 -0
  449. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1eb.png +0 -0
  450. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1ec.png +0 -0
  451. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1ed.png +0 -0
  452. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1ee.png +0 -0
  453. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f1.png +0 -0
  454. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f2.png +0 -0
  455. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f3.png +0 -0
  456. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f5.png +0 -0
  457. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f6.png +0 -0
  458. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f7.png +0 -0
  459. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f8.png +0 -0
  460. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1f9.png +0 -0
  461. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1fa.png +0 -0
  462. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1fc.png +0 -0
  463. package/web/app/site/sengi/assets/emoji/64/1f1ec-1f1fe.png +0 -0
  464. package/web/app/site/sengi/assets/emoji/64/1f1ec.png +0 -0
  465. package/web/app/site/sengi/assets/emoji/64/1f1ed-1f1f0.png +0 -0
  466. package/web/app/site/sengi/assets/emoji/64/1f1ed-1f1f2.png +0 -0
  467. package/web/app/site/sengi/assets/emoji/64/1f1ed-1f1f3.png +0 -0
  468. package/web/app/site/sengi/assets/emoji/64/1f1ed-1f1f7.png +0 -0
  469. package/web/app/site/sengi/assets/emoji/64/1f1ed-1f1f9.png +0 -0
  470. package/web/app/site/sengi/assets/emoji/64/1f1ed-1f1fa.png +0 -0
  471. package/web/app/site/sengi/assets/emoji/64/1f1ed.png +0 -0
  472. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1e8.png +0 -0
  473. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1e9.png +0 -0
  474. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1ea.png +0 -0
  475. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f1.png +0 -0
  476. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f2.png +0 -0
  477. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f3.png +0 -0
  478. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f4.png +0 -0
  479. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f6.png +0 -0
  480. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f7.png +0 -0
  481. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f8.png +0 -0
  482. package/web/app/site/sengi/assets/emoji/64/1f1ee-1f1f9.png +0 -0
  483. package/web/app/site/sengi/assets/emoji/64/1f1ee.png +0 -0
  484. package/web/app/site/sengi/assets/emoji/64/1f1ef-1f1ea.png +0 -0
  485. package/web/app/site/sengi/assets/emoji/64/1f1ef-1f1f2.png +0 -0
  486. package/web/app/site/sengi/assets/emoji/64/1f1ef-1f1f4.png +0 -0
  487. package/web/app/site/sengi/assets/emoji/64/1f1ef-1f1f5.png +0 -0
  488. package/web/app/site/sengi/assets/emoji/64/1f1ef.png +0 -0
  489. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1ea.png +0 -0
  490. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1ec.png +0 -0
  491. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1ed.png +0 -0
  492. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1ee.png +0 -0
  493. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1f2.png +0 -0
  494. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1f3.png +0 -0
  495. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1f5.png +0 -0
  496. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1f7.png +0 -0
  497. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1fc.png +0 -0
  498. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1fe.png +0 -0
  499. package/web/app/site/sengi/assets/emoji/64/1f1f0-1f1ff.png +0 -0
  500. package/web/app/site/sengi/assets/emoji/64/1f1f0.png +0 -0
  501. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1e6.png +0 -0
  502. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1e7.png +0 -0
  503. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1e8.png +0 -0
  504. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1ee.png +0 -0
  505. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1f0.png +0 -0
  506. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1f7.png +0 -0
  507. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1f8.png +0 -0
  508. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1f9.png +0 -0
  509. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1fa.png +0 -0
  510. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1fb.png +0 -0
  511. package/web/app/site/sengi/assets/emoji/64/1f1f1-1f1fe.png +0 -0
  512. package/web/app/site/sengi/assets/emoji/64/1f1f1.png +0 -0
  513. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1e6.png +0 -0
  514. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1e8.png +0 -0
  515. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1e9.png +0 -0
  516. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1ea.png +0 -0
  517. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1eb.png +0 -0
  518. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1ec.png +0 -0
  519. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1ed.png +0 -0
  520. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f0.png +0 -0
  521. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f1.png +0 -0
  522. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f2.png +0 -0
  523. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f3.png +0 -0
  524. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f4.png +0 -0
  525. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f5.png +0 -0
  526. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f6.png +0 -0
  527. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f7.png +0 -0
  528. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f8.png +0 -0
  529. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1f9.png +0 -0
  530. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1fa.png +0 -0
  531. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1fb.png +0 -0
  532. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1fc.png +0 -0
  533. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1fd.png +0 -0
  534. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1fe.png +0 -0
  535. package/web/app/site/sengi/assets/emoji/64/1f1f2-1f1ff.png +0 -0
  536. package/web/app/site/sengi/assets/emoji/64/1f1f2.png +0 -0
  537. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1e6.png +0 -0
  538. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1e8.png +0 -0
  539. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1ea.png +0 -0
  540. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1eb.png +0 -0
  541. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1ec.png +0 -0
  542. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1ee.png +0 -0
  543. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1f1.png +0 -0
  544. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1f4.png +0 -0
  545. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1f5.png +0 -0
  546. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1f7.png +0 -0
  547. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1fa.png +0 -0
  548. package/web/app/site/sengi/assets/emoji/64/1f1f3-1f1ff.png +0 -0
  549. package/web/app/site/sengi/assets/emoji/64/1f1f3.png +0 -0
  550. package/web/app/site/sengi/assets/emoji/64/1f1f4-1f1f2.png +0 -0
  551. package/web/app/site/sengi/assets/emoji/64/1f1f4.png +0 -0
  552. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1e6.png +0 -0
  553. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1ea.png +0 -0
  554. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1eb.png +0 -0
  555. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1ec.png +0 -0
  556. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1ed.png +0 -0
  557. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f0.png +0 -0
  558. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f1.png +0 -0
  559. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f2.png +0 -0
  560. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f3.png +0 -0
  561. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f7.png +0 -0
  562. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f8.png +0 -0
  563. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1f9.png +0 -0
  564. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1fc.png +0 -0
  565. package/web/app/site/sengi/assets/emoji/64/1f1f5-1f1fe.png +0 -0
  566. package/web/app/site/sengi/assets/emoji/64/1f1f5.png +0 -0
  567. package/web/app/site/sengi/assets/emoji/64/1f1f6-1f1e6.png +0 -0
  568. package/web/app/site/sengi/assets/emoji/64/1f1f6.png +0 -0
  569. package/web/app/site/sengi/assets/emoji/64/1f1f7-1f1ea.png +0 -0
  570. package/web/app/site/sengi/assets/emoji/64/1f1f7-1f1f4.png +0 -0
  571. package/web/app/site/sengi/assets/emoji/64/1f1f7-1f1f8.png +0 -0
  572. package/web/app/site/sengi/assets/emoji/64/1f1f7-1f1fa.png +0 -0
  573. package/web/app/site/sengi/assets/emoji/64/1f1f7-1f1fc.png +0 -0
  574. package/web/app/site/sengi/assets/emoji/64/1f1f7.png +0 -0
  575. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1e6.png +0 -0
  576. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1e7.png +0 -0
  577. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1e8.png +0 -0
  578. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1e9.png +0 -0
  579. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1ea.png +0 -0
  580. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1ec.png +0 -0
  581. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1ed.png +0 -0
  582. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1ee.png +0 -0
  583. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1ef.png +0 -0
  584. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f0.png +0 -0
  585. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f1.png +0 -0
  586. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f2.png +0 -0
  587. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f3.png +0 -0
  588. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f4.png +0 -0
  589. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f7.png +0 -0
  590. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f8.png +0 -0
  591. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1f9.png +0 -0
  592. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1fb.png +0 -0
  593. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1fd.png +0 -0
  594. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1fe.png +0 -0
  595. package/web/app/site/sengi/assets/emoji/64/1f1f8-1f1ff.png +0 -0
  596. package/web/app/site/sengi/assets/emoji/64/1f1f8.png +0 -0
  597. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1e6.png +0 -0
  598. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1e8.png +0 -0
  599. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1e9.png +0 -0
  600. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1eb.png +0 -0
  601. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1ec.png +0 -0
  602. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1ed.png +0 -0
  603. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1ef.png +0 -0
  604. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f0.png +0 -0
  605. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f1.png +0 -0
  606. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f2.png +0 -0
  607. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f3.png +0 -0
  608. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f4.png +0 -0
  609. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f7.png +0 -0
  610. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1f9.png +0 -0
  611. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1fb.png +0 -0
  612. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1fc.png +0 -0
  613. package/web/app/site/sengi/assets/emoji/64/1f1f9-1f1ff.png +0 -0
  614. package/web/app/site/sengi/assets/emoji/64/1f1f9.png +0 -0
  615. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1e6.png +0 -0
  616. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1ec.png +0 -0
  617. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1f2.png +0 -0
  618. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1f3.png +0 -0
  619. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1f8.png +0 -0
  620. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1fe.png +0 -0
  621. package/web/app/site/sengi/assets/emoji/64/1f1fa-1f1ff.png +0 -0
  622. package/web/app/site/sengi/assets/emoji/64/1f1fa.png +0 -0
  623. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1e6.png +0 -0
  624. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1e8.png +0 -0
  625. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1ea.png +0 -0
  626. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1ec.png +0 -0
  627. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1ee.png +0 -0
  628. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1f3.png +0 -0
  629. package/web/app/site/sengi/assets/emoji/64/1f1fb-1f1fa.png +0 -0
  630. package/web/app/site/sengi/assets/emoji/64/1f1fb.png +0 -0
  631. package/web/app/site/sengi/assets/emoji/64/1f1fc-1f1eb.png +0 -0
  632. package/web/app/site/sengi/assets/emoji/64/1f1fc-1f1f8.png +0 -0
  633. package/web/app/site/sengi/assets/emoji/64/1f1fc.png +0 -0
  634. package/web/app/site/sengi/assets/emoji/64/1f1fd-1f1f0.png +0 -0
  635. package/web/app/site/sengi/assets/emoji/64/1f1fd.png +0 -0
  636. package/web/app/site/sengi/assets/emoji/64/1f1fe-1f1ea.png +0 -0
  637. package/web/app/site/sengi/assets/emoji/64/1f1fe-1f1f9.png +0 -0
  638. package/web/app/site/sengi/assets/emoji/64/1f1fe.png +0 -0
  639. package/web/app/site/sengi/assets/emoji/64/1f1ff-1f1e6.png +0 -0
  640. package/web/app/site/sengi/assets/emoji/64/1f1ff-1f1f2.png +0 -0
  641. package/web/app/site/sengi/assets/emoji/64/1f1ff-1f1fc.png +0 -0
  642. package/web/app/site/sengi/assets/emoji/64/1f1ff.png +0 -0
  643. package/web/app/site/sengi/assets/emoji/64/1f201.png +0 -0
  644. package/web/app/site/sengi/assets/emoji/64/1f202.png +0 -0
  645. package/web/app/site/sengi/assets/emoji/64/1f21a.png +0 -0
  646. package/web/app/site/sengi/assets/emoji/64/1f22f.png +0 -0
  647. package/web/app/site/sengi/assets/emoji/64/1f232.png +0 -0
  648. package/web/app/site/sengi/assets/emoji/64/1f233.png +0 -0
  649. package/web/app/site/sengi/assets/emoji/64/1f234.png +0 -0
  650. package/web/app/site/sengi/assets/emoji/64/1f235.png +0 -0
  651. package/web/app/site/sengi/assets/emoji/64/1f236.png +0 -0
  652. package/web/app/site/sengi/assets/emoji/64/1f237.png +0 -0
  653. package/web/app/site/sengi/assets/emoji/64/1f238.png +0 -0
  654. package/web/app/site/sengi/assets/emoji/64/1f239.png +0 -0
  655. package/web/app/site/sengi/assets/emoji/64/1f23a.png +0 -0
  656. package/web/app/site/sengi/assets/emoji/64/1f250.png +0 -0
  657. package/web/app/site/sengi/assets/emoji/64/1f251.png +0 -0
  658. package/web/app/site/sengi/assets/emoji/64/1f300.png +0 -0
  659. package/web/app/site/sengi/assets/emoji/64/1f301.png +0 -0
  660. package/web/app/site/sengi/assets/emoji/64/1f302.png +0 -0
  661. package/web/app/site/sengi/assets/emoji/64/1f303.png +0 -0
  662. package/web/app/site/sengi/assets/emoji/64/1f304.png +0 -0
  663. package/web/app/site/sengi/assets/emoji/64/1f305.png +0 -0
  664. package/web/app/site/sengi/assets/emoji/64/1f306.png +0 -0
  665. package/web/app/site/sengi/assets/emoji/64/1f307.png +0 -0
  666. package/web/app/site/sengi/assets/emoji/64/1f308.png +0 -0
  667. package/web/app/site/sengi/assets/emoji/64/1f309.png +0 -0
  668. package/web/app/site/sengi/assets/emoji/64/1f30a.png +0 -0
  669. package/web/app/site/sengi/assets/emoji/64/1f30b.png +0 -0
  670. package/web/app/site/sengi/assets/emoji/64/1f30c.png +0 -0
  671. package/web/app/site/sengi/assets/emoji/64/1f30d.png +0 -0
  672. package/web/app/site/sengi/assets/emoji/64/1f30e.png +0 -0
  673. package/web/app/site/sengi/assets/emoji/64/1f30f.png +0 -0
  674. package/web/app/site/sengi/assets/emoji/64/1f310.png +0 -0
  675. package/web/app/site/sengi/assets/emoji/64/1f311.png +0 -0
  676. package/web/app/site/sengi/assets/emoji/64/1f312.png +0 -0
  677. package/web/app/site/sengi/assets/emoji/64/1f313.png +0 -0
  678. package/web/app/site/sengi/assets/emoji/64/1f314.png +0 -0
  679. package/web/app/site/sengi/assets/emoji/64/1f315.png +0 -0
  680. package/web/app/site/sengi/assets/emoji/64/1f316.png +0 -0
  681. package/web/app/site/sengi/assets/emoji/64/1f317.png +0 -0
  682. package/web/app/site/sengi/assets/emoji/64/1f318.png +0 -0
  683. package/web/app/site/sengi/assets/emoji/64/1f319.png +0 -0
  684. package/web/app/site/sengi/assets/emoji/64/1f31a.png +0 -0
  685. package/web/app/site/sengi/assets/emoji/64/1f31b.png +0 -0
  686. package/web/app/site/sengi/assets/emoji/64/1f31c.png +0 -0
  687. package/web/app/site/sengi/assets/emoji/64/1f31d.png +0 -0
  688. package/web/app/site/sengi/assets/emoji/64/1f31e.png +0 -0
  689. package/web/app/site/sengi/assets/emoji/64/1f31f.png +0 -0
  690. package/web/app/site/sengi/assets/emoji/64/1f320.png +0 -0
  691. package/web/app/site/sengi/assets/emoji/64/1f321.png +0 -0
  692. package/web/app/site/sengi/assets/emoji/64/1f324.png +0 -0
  693. package/web/app/site/sengi/assets/emoji/64/1f325.png +0 -0
  694. package/web/app/site/sengi/assets/emoji/64/1f326.png +0 -0
  695. package/web/app/site/sengi/assets/emoji/64/1f327.png +0 -0
  696. package/web/app/site/sengi/assets/emoji/64/1f328.png +0 -0
  697. package/web/app/site/sengi/assets/emoji/64/1f329.png +0 -0
  698. package/web/app/site/sengi/assets/emoji/64/1f32a.png +0 -0
  699. package/web/app/site/sengi/assets/emoji/64/1f32b.png +0 -0
  700. package/web/app/site/sengi/assets/emoji/64/1f32c.png +0 -0
  701. package/web/app/site/sengi/assets/emoji/64/1f32d.png +0 -0
  702. package/web/app/site/sengi/assets/emoji/64/1f32e.png +0 -0
  703. package/web/app/site/sengi/assets/emoji/64/1f32f.png +0 -0
  704. package/web/app/site/sengi/assets/emoji/64/1f330.png +0 -0
  705. package/web/app/site/sengi/assets/emoji/64/1f331.png +0 -0
  706. package/web/app/site/sengi/assets/emoji/64/1f332.png +0 -0
  707. package/web/app/site/sengi/assets/emoji/64/1f333.png +0 -0
  708. package/web/app/site/sengi/assets/emoji/64/1f334.png +0 -0
  709. package/web/app/site/sengi/assets/emoji/64/1f335.png +0 -0
  710. package/web/app/site/sengi/assets/emoji/64/1f336.png +0 -0
  711. package/web/app/site/sengi/assets/emoji/64/1f337.png +0 -0
  712. package/web/app/site/sengi/assets/emoji/64/1f338.png +0 -0
  713. package/web/app/site/sengi/assets/emoji/64/1f339.png +0 -0
  714. package/web/app/site/sengi/assets/emoji/64/1f33a.png +0 -0
  715. package/web/app/site/sengi/assets/emoji/64/1f33b.png +0 -0
  716. package/web/app/site/sengi/assets/emoji/64/1f33c.png +0 -0
  717. package/web/app/site/sengi/assets/emoji/64/1f33d.png +0 -0
  718. package/web/app/site/sengi/assets/emoji/64/1f33e.png +0 -0
  719. package/web/app/site/sengi/assets/emoji/64/1f33f.png +0 -0
  720. package/web/app/site/sengi/assets/emoji/64/1f340.png +0 -0
  721. package/web/app/site/sengi/assets/emoji/64/1f341.png +0 -0
  722. package/web/app/site/sengi/assets/emoji/64/1f342.png +0 -0
  723. package/web/app/site/sengi/assets/emoji/64/1f343.png +0 -0
  724. package/web/app/site/sengi/assets/emoji/64/1f344-1f7eb.png +0 -0
  725. package/web/app/site/sengi/assets/emoji/64/1f344.png +0 -0
  726. package/web/app/site/sengi/assets/emoji/64/1f345.png +0 -0
  727. package/web/app/site/sengi/assets/emoji/64/1f346.png +0 -0
  728. package/web/app/site/sengi/assets/emoji/64/1f347.png +0 -0
  729. package/web/app/site/sengi/assets/emoji/64/1f348.png +0 -0
  730. package/web/app/site/sengi/assets/emoji/64/1f349.png +0 -0
  731. package/web/app/site/sengi/assets/emoji/64/1f34a.png +0 -0
  732. package/web/app/site/sengi/assets/emoji/64/1f34b-1f7e9.png +0 -0
  733. package/web/app/site/sengi/assets/emoji/64/1f34b.png +0 -0
  734. package/web/app/site/sengi/assets/emoji/64/1f34c.png +0 -0
  735. package/web/app/site/sengi/assets/emoji/64/1f34d.png +0 -0
  736. package/web/app/site/sengi/assets/emoji/64/1f34e.png +0 -0
  737. package/web/app/site/sengi/assets/emoji/64/1f34f.png +0 -0
  738. package/web/app/site/sengi/assets/emoji/64/1f350.png +0 -0
  739. package/web/app/site/sengi/assets/emoji/64/1f351.png +0 -0
  740. package/web/app/site/sengi/assets/emoji/64/1f352.png +0 -0
  741. package/web/app/site/sengi/assets/emoji/64/1f353.png +0 -0
  742. package/web/app/site/sengi/assets/emoji/64/1f354.png +0 -0
  743. package/web/app/site/sengi/assets/emoji/64/1f355.png +0 -0
  744. package/web/app/site/sengi/assets/emoji/64/1f356.png +0 -0
  745. package/web/app/site/sengi/assets/emoji/64/1f357.png +0 -0
  746. package/web/app/site/sengi/assets/emoji/64/1f358.png +0 -0
  747. package/web/app/site/sengi/assets/emoji/64/1f359.png +0 -0
  748. package/web/app/site/sengi/assets/emoji/64/1f35a.png +0 -0
  749. package/web/app/site/sengi/assets/emoji/64/1f35b.png +0 -0
  750. package/web/app/site/sengi/assets/emoji/64/1f35c.png +0 -0
  751. package/web/app/site/sengi/assets/emoji/64/1f35d.png +0 -0
  752. package/web/app/site/sengi/assets/emoji/64/1f35e.png +0 -0
  753. package/web/app/site/sengi/assets/emoji/64/1f35f.png +0 -0
  754. package/web/app/site/sengi/assets/emoji/64/1f360.png +0 -0
  755. package/web/app/site/sengi/assets/emoji/64/1f361.png +0 -0
  756. package/web/app/site/sengi/assets/emoji/64/1f362.png +0 -0
  757. package/web/app/site/sengi/assets/emoji/64/1f363.png +0 -0
  758. package/web/app/site/sengi/assets/emoji/64/1f364.png +0 -0
  759. package/web/app/site/sengi/assets/emoji/64/1f365.png +0 -0
  760. package/web/app/site/sengi/assets/emoji/64/1f366.png +0 -0
  761. package/web/app/site/sengi/assets/emoji/64/1f367.png +0 -0
  762. package/web/app/site/sengi/assets/emoji/64/1f368.png +0 -0
  763. package/web/app/site/sengi/assets/emoji/64/1f369.png +0 -0
  764. package/web/app/site/sengi/assets/emoji/64/1f36a.png +0 -0
  765. package/web/app/site/sengi/assets/emoji/64/1f36b.png +0 -0
  766. package/web/app/site/sengi/assets/emoji/64/1f36c.png +0 -0
  767. package/web/app/site/sengi/assets/emoji/64/1f36d.png +0 -0
  768. package/web/app/site/sengi/assets/emoji/64/1f36e.png +0 -0
  769. package/web/app/site/sengi/assets/emoji/64/1f36f.png +0 -0
  770. package/web/app/site/sengi/assets/emoji/64/1f370.png +0 -0
  771. package/web/app/site/sengi/assets/emoji/64/1f371.png +0 -0
  772. package/web/app/site/sengi/assets/emoji/64/1f372.png +0 -0
  773. package/web/app/site/sengi/assets/emoji/64/1f373.png +0 -0
  774. package/web/app/site/sengi/assets/emoji/64/1f374.png +0 -0
  775. package/web/app/site/sengi/assets/emoji/64/1f375.png +0 -0
  776. package/web/app/site/sengi/assets/emoji/64/1f376.png +0 -0
  777. package/web/app/site/sengi/assets/emoji/64/1f377.png +0 -0
  778. package/web/app/site/sengi/assets/emoji/64/1f378.png +0 -0
  779. package/web/app/site/sengi/assets/emoji/64/1f379.png +0 -0
  780. package/web/app/site/sengi/assets/emoji/64/1f37a.png +0 -0
  781. package/web/app/site/sengi/assets/emoji/64/1f37b.png +0 -0
  782. package/web/app/site/sengi/assets/emoji/64/1f37c.png +0 -0
  783. package/web/app/site/sengi/assets/emoji/64/1f37d.png +0 -0
  784. package/web/app/site/sengi/assets/emoji/64/1f37e.png +0 -0
  785. package/web/app/site/sengi/assets/emoji/64/1f37f.png +0 -0
  786. package/web/app/site/sengi/assets/emoji/64/1f380.png +0 -0
  787. package/web/app/site/sengi/assets/emoji/64/1f381.png +0 -0
  788. package/web/app/site/sengi/assets/emoji/64/1f382.png +0 -0
  789. package/web/app/site/sengi/assets/emoji/64/1f383.png +0 -0
  790. package/web/app/site/sengi/assets/emoji/64/1f384.png +0 -0
  791. package/web/app/site/sengi/assets/emoji/64/1f385-1f3fb.png +0 -0
  792. package/web/app/site/sengi/assets/emoji/64/1f385-1f3fc.png +0 -0
  793. package/web/app/site/sengi/assets/emoji/64/1f385-1f3fd.png +0 -0
  794. package/web/app/site/sengi/assets/emoji/64/1f385-1f3fe.png +0 -0
  795. package/web/app/site/sengi/assets/emoji/64/1f385-1f3ff.png +0 -0
  796. package/web/app/site/sengi/assets/emoji/64/1f385.png +0 -0
  797. package/web/app/site/sengi/assets/emoji/64/1f386.png +0 -0
  798. package/web/app/site/sengi/assets/emoji/64/1f387.png +0 -0
  799. package/web/app/site/sengi/assets/emoji/64/1f388.png +0 -0
  800. package/web/app/site/sengi/assets/emoji/64/1f389.png +0 -0
  801. package/web/app/site/sengi/assets/emoji/64/1f38a.png +0 -0
  802. package/web/app/site/sengi/assets/emoji/64/1f38b.png +0 -0
  803. package/web/app/site/sengi/assets/emoji/64/1f38c.png +0 -0
  804. package/web/app/site/sengi/assets/emoji/64/1f38d.png +0 -0
  805. package/web/app/site/sengi/assets/emoji/64/1f38e.png +0 -0
  806. package/web/app/site/sengi/assets/emoji/64/1f38f.png +0 -0
  807. package/web/app/site/sengi/assets/emoji/64/1f390.png +0 -0
  808. package/web/app/site/sengi/assets/emoji/64/1f391.png +0 -0
  809. package/web/app/site/sengi/assets/emoji/64/1f392.png +0 -0
  810. package/web/app/site/sengi/assets/emoji/64/1f393.png +0 -0
  811. package/web/app/site/sengi/assets/emoji/64/1f396.png +0 -0
  812. package/web/app/site/sengi/assets/emoji/64/1f397.png +0 -0
  813. package/web/app/site/sengi/assets/emoji/64/1f399.png +0 -0
  814. package/web/app/site/sengi/assets/emoji/64/1f39a.png +0 -0
  815. package/web/app/site/sengi/assets/emoji/64/1f39b.png +0 -0
  816. package/web/app/site/sengi/assets/emoji/64/1f39e.png +0 -0
  817. package/web/app/site/sengi/assets/emoji/64/1f39f.png +0 -0
  818. package/web/app/site/sengi/assets/emoji/64/1f3a0.png +0 -0
  819. package/web/app/site/sengi/assets/emoji/64/1f3a1.png +0 -0
  820. package/web/app/site/sengi/assets/emoji/64/1f3a2.png +0 -0
  821. package/web/app/site/sengi/assets/emoji/64/1f3a3.png +0 -0
  822. package/web/app/site/sengi/assets/emoji/64/1f3a4.png +0 -0
  823. package/web/app/site/sengi/assets/emoji/64/1f3a5.png +0 -0
  824. package/web/app/site/sengi/assets/emoji/64/1f3a6.png +0 -0
  825. package/web/app/site/sengi/assets/emoji/64/1f3a7.png +0 -0
  826. package/web/app/site/sengi/assets/emoji/64/1f3a8.png +0 -0
  827. package/web/app/site/sengi/assets/emoji/64/1f3a9.png +0 -0
  828. package/web/app/site/sengi/assets/emoji/64/1f3aa.png +0 -0
  829. package/web/app/site/sengi/assets/emoji/64/1f3ab.png +0 -0
  830. package/web/app/site/sengi/assets/emoji/64/1f3ac.png +0 -0
  831. package/web/app/site/sengi/assets/emoji/64/1f3ad.png +0 -0
  832. package/web/app/site/sengi/assets/emoji/64/1f3ae.png +0 -0
  833. package/web/app/site/sengi/assets/emoji/64/1f3af.png +0 -0
  834. package/web/app/site/sengi/assets/emoji/64/1f3b0.png +0 -0
  835. package/web/app/site/sengi/assets/emoji/64/1f3b1.png +0 -0
  836. package/web/app/site/sengi/assets/emoji/64/1f3b2.png +0 -0
  837. package/web/app/site/sengi/assets/emoji/64/1f3b3.png +0 -0
  838. package/web/app/site/sengi/assets/emoji/64/1f3b4.png +0 -0
  839. package/web/app/site/sengi/assets/emoji/64/1f3b5.png +0 -0
  840. package/web/app/site/sengi/assets/emoji/64/1f3b6.png +0 -0
  841. package/web/app/site/sengi/assets/emoji/64/1f3b7.png +0 -0
  842. package/web/app/site/sengi/assets/emoji/64/1f3b8.png +0 -0
  843. package/web/app/site/sengi/assets/emoji/64/1f3b9.png +0 -0
  844. package/web/app/site/sengi/assets/emoji/64/1f3ba.png +0 -0
  845. package/web/app/site/sengi/assets/emoji/64/1f3bb.png +0 -0
  846. package/web/app/site/sengi/assets/emoji/64/1f3bc.png +0 -0
  847. package/web/app/site/sengi/assets/emoji/64/1f3bd.png +0 -0
  848. package/web/app/site/sengi/assets/emoji/64/1f3be.png +0 -0
  849. package/web/app/site/sengi/assets/emoji/64/1f3bf.png +0 -0
  850. package/web/app/site/sengi/assets/emoji/64/1f3c0.png +0 -0
  851. package/web/app/site/sengi/assets/emoji/64/1f3c1.png +0 -0
  852. package/web/app/site/sengi/assets/emoji/64/1f3c2-1f3fb.png +0 -0
  853. package/web/app/site/sengi/assets/emoji/64/1f3c2-1f3fc.png +0 -0
  854. package/web/app/site/sengi/assets/emoji/64/1f3c2-1f3fd.png +0 -0
  855. package/web/app/site/sengi/assets/emoji/64/1f3c2-1f3fe.png +0 -0
  856. package/web/app/site/sengi/assets/emoji/64/1f3c2-1f3ff.png +0 -0
  857. package/web/app/site/sengi/assets/emoji/64/1f3c2.png +0 -0
  858. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fb-2640-27a1.png +0 -0
  859. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fb-2640.png +0 -0
  860. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fb-2642-27a1.png +0 -0
  861. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fb-2642.png +0 -0
  862. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fb-27a1.png +0 -0
  863. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fb.png +0 -0
  864. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fc-2640-27a1.png +0 -0
  865. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fc-2640.png +0 -0
  866. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fc-2642-27a1.png +0 -0
  867. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fc-2642.png +0 -0
  868. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fc-27a1.png +0 -0
  869. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fc.png +0 -0
  870. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fd-2640-27a1.png +0 -0
  871. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fd-2640.png +0 -0
  872. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fd-2642-27a1.png +0 -0
  873. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fd-2642.png +0 -0
  874. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fd-27a1.png +0 -0
  875. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fd.png +0 -0
  876. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fe-2640-27a1.png +0 -0
  877. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fe-2640.png +0 -0
  878. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fe-2642-27a1.png +0 -0
  879. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fe-2642.png +0 -0
  880. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fe-27a1.png +0 -0
  881. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3fe.png +0 -0
  882. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3ff-2640-27a1.png +0 -0
  883. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3ff-2640.png +0 -0
  884. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3ff-2642-27a1.png +0 -0
  885. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3ff-2642.png +0 -0
  886. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3ff-27a1.png +0 -0
  887. package/web/app/site/sengi/assets/emoji/64/1f3c3-1f3ff.png +0 -0
  888. package/web/app/site/sengi/assets/emoji/64/1f3c3-2640-27a1.png +0 -0
  889. package/web/app/site/sengi/assets/emoji/64/1f3c3-2640.png +0 -0
  890. package/web/app/site/sengi/assets/emoji/64/1f3c3-2642-27a1.png +0 -0
  891. package/web/app/site/sengi/assets/emoji/64/1f3c3-2642.png +0 -0
  892. package/web/app/site/sengi/assets/emoji/64/1f3c3-27a1.png +0 -0
  893. package/web/app/site/sengi/assets/emoji/64/1f3c3.png +0 -0
  894. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fb-2640.png +0 -0
  895. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fb-2642.png +0 -0
  896. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fb.png +0 -0
  897. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fc-2640.png +0 -0
  898. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fc-2642.png +0 -0
  899. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fc.png +0 -0
  900. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fd-2640.png +0 -0
  901. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fd-2642.png +0 -0
  902. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fd.png +0 -0
  903. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fe-2640.png +0 -0
  904. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fe-2642.png +0 -0
  905. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3fe.png +0 -0
  906. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3ff-2640.png +0 -0
  907. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3ff-2642.png +0 -0
  908. package/web/app/site/sengi/assets/emoji/64/1f3c4-1f3ff.png +0 -0
  909. package/web/app/site/sengi/assets/emoji/64/1f3c4-2640.png +0 -0
  910. package/web/app/site/sengi/assets/emoji/64/1f3c4-2642.png +0 -0
  911. package/web/app/site/sengi/assets/emoji/64/1f3c4.png +0 -0
  912. package/web/app/site/sengi/assets/emoji/64/1f3c5.png +0 -0
  913. package/web/app/site/sengi/assets/emoji/64/1f3c6.png +0 -0
  914. package/web/app/site/sengi/assets/emoji/64/1f3c7-1f3fb.png +0 -0
  915. package/web/app/site/sengi/assets/emoji/64/1f3c7-1f3fc.png +0 -0
  916. package/web/app/site/sengi/assets/emoji/64/1f3c7-1f3fd.png +0 -0
  917. package/web/app/site/sengi/assets/emoji/64/1f3c7-1f3fe.png +0 -0
  918. package/web/app/site/sengi/assets/emoji/64/1f3c7-1f3ff.png +0 -0
  919. package/web/app/site/sengi/assets/emoji/64/1f3c7.png +0 -0
  920. package/web/app/site/sengi/assets/emoji/64/1f3c8.png +0 -0
  921. package/web/app/site/sengi/assets/emoji/64/1f3c9.png +0 -0
  922. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fb-2640.png +0 -0
  923. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fb-2642.png +0 -0
  924. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fb.png +0 -0
  925. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fc-2640.png +0 -0
  926. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fc-2642.png +0 -0
  927. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fc.png +0 -0
  928. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fd-2640.png +0 -0
  929. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fd-2642.png +0 -0
  930. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fd.png +0 -0
  931. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fe-2640.png +0 -0
  932. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fe-2642.png +0 -0
  933. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3fe.png +0 -0
  934. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3ff-2640.png +0 -0
  935. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3ff-2642.png +0 -0
  936. package/web/app/site/sengi/assets/emoji/64/1f3ca-1f3ff.png +0 -0
  937. package/web/app/site/sengi/assets/emoji/64/1f3ca-2640.png +0 -0
  938. package/web/app/site/sengi/assets/emoji/64/1f3ca-2642.png +0 -0
  939. package/web/app/site/sengi/assets/emoji/64/1f3ca.png +0 -0
  940. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fb-2640.png +0 -0
  941. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fb-2642.png +0 -0
  942. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fb.png +0 -0
  943. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fc-2640.png +0 -0
  944. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fc-2642.png +0 -0
  945. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fc.png +0 -0
  946. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fd-2640.png +0 -0
  947. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fd-2642.png +0 -0
  948. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fd.png +0 -0
  949. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fe-2640.png +0 -0
  950. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fe-2642.png +0 -0
  951. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3fe.png +0 -0
  952. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3ff-2640.png +0 -0
  953. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3ff-2642.png +0 -0
  954. package/web/app/site/sengi/assets/emoji/64/1f3cb-1f3ff.png +0 -0
  955. package/web/app/site/sengi/assets/emoji/64/1f3cb-2640.png +0 -0
  956. package/web/app/site/sengi/assets/emoji/64/1f3cb-2642.png +0 -0
  957. package/web/app/site/sengi/assets/emoji/64/1f3cb.png +0 -0
  958. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fb-2640.png +0 -0
  959. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fb-2642.png +0 -0
  960. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fb.png +0 -0
  961. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fc-2640.png +0 -0
  962. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fc-2642.png +0 -0
  963. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fc.png +0 -0
  964. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fd-2640.png +0 -0
  965. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fd-2642.png +0 -0
  966. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fd.png +0 -0
  967. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fe-2640.png +0 -0
  968. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fe-2642.png +0 -0
  969. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3fe.png +0 -0
  970. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3ff-2640.png +0 -0
  971. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3ff-2642.png +0 -0
  972. package/web/app/site/sengi/assets/emoji/64/1f3cc-1f3ff.png +0 -0
  973. package/web/app/site/sengi/assets/emoji/64/1f3cc-2640.png +0 -0
  974. package/web/app/site/sengi/assets/emoji/64/1f3cc-2642.png +0 -0
  975. package/web/app/site/sengi/assets/emoji/64/1f3cc.png +0 -0
  976. package/web/app/site/sengi/assets/emoji/64/1f3cd.png +0 -0
  977. package/web/app/site/sengi/assets/emoji/64/1f3ce.png +0 -0
  978. package/web/app/site/sengi/assets/emoji/64/1f3cf.png +0 -0
  979. package/web/app/site/sengi/assets/emoji/64/1f3d0.png +0 -0
  980. package/web/app/site/sengi/assets/emoji/64/1f3d1.png +0 -0
  981. package/web/app/site/sengi/assets/emoji/64/1f3d2.png +0 -0
  982. package/web/app/site/sengi/assets/emoji/64/1f3d3.png +0 -0
  983. package/web/app/site/sengi/assets/emoji/64/1f3d4.png +0 -0
  984. package/web/app/site/sengi/assets/emoji/64/1f3d5.png +0 -0
  985. package/web/app/site/sengi/assets/emoji/64/1f3d6.png +0 -0
  986. package/web/app/site/sengi/assets/emoji/64/1f3d7.png +0 -0
  987. package/web/app/site/sengi/assets/emoji/64/1f3d8.png +0 -0
  988. package/web/app/site/sengi/assets/emoji/64/1f3d9.png +0 -0
  989. package/web/app/site/sengi/assets/emoji/64/1f3da.png +0 -0
  990. package/web/app/site/sengi/assets/emoji/64/1f3db.png +0 -0
  991. package/web/app/site/sengi/assets/emoji/64/1f3dc.png +0 -0
  992. package/web/app/site/sengi/assets/emoji/64/1f3dd.png +0 -0
  993. package/web/app/site/sengi/assets/emoji/64/1f3de.png +0 -0
  994. package/web/app/site/sengi/assets/emoji/64/1f3df.png +0 -0
  995. package/web/app/site/sengi/assets/emoji/64/1f3e0.png +0 -0
  996. package/web/app/site/sengi/assets/emoji/64/1f3e1.png +0 -0
  997. package/web/app/site/sengi/assets/emoji/64/1f3e2.png +0 -0
  998. package/web/app/site/sengi/assets/emoji/64/1f3e3.png +0 -0
  999. package/web/app/site/sengi/assets/emoji/64/1f3e4.png +0 -0
  1000. package/web/app/site/sengi/assets/emoji/64/1f3e5.png +0 -0
  1001. package/web/app/site/sengi/assets/emoji/64/1f3e6.png +0 -0
  1002. package/web/app/site/sengi/assets/emoji/64/1f3e7.png +0 -0
  1003. package/web/app/site/sengi/assets/emoji/64/1f3e8.png +0 -0
  1004. package/web/app/site/sengi/assets/emoji/64/1f3e9.png +0 -0
  1005. package/web/app/site/sengi/assets/emoji/64/1f3ea.png +0 -0
  1006. package/web/app/site/sengi/assets/emoji/64/1f3eb.png +0 -0
  1007. package/web/app/site/sengi/assets/emoji/64/1f3ec.png +0 -0
  1008. package/web/app/site/sengi/assets/emoji/64/1f3ed.png +0 -0
  1009. package/web/app/site/sengi/assets/emoji/64/1f3ee.png +0 -0
  1010. package/web/app/site/sengi/assets/emoji/64/1f3ef.png +0 -0
  1011. package/web/app/site/sengi/assets/emoji/64/1f3f0.png +0 -0
  1012. package/web/app/site/sengi/assets/emoji/64/1f3f3-1f308.png +0 -0
  1013. package/web/app/site/sengi/assets/emoji/64/1f3f3-26a7.png +0 -0
  1014. package/web/app/site/sengi/assets/emoji/64/1f3f3.png +0 -0
  1015. package/web/app/site/sengi/assets/emoji/64/1f3f4-2620.png +0 -0
  1016. package/web/app/site/sengi/assets/emoji/64/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png +0 -0
  1017. package/web/app/site/sengi/assets/emoji/64/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png +0 -0
  1018. package/web/app/site/sengi/assets/emoji/64/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png +0 -0
  1019. package/web/app/site/sengi/assets/emoji/64/1f3f4.png +0 -0
  1020. package/web/app/site/sengi/assets/emoji/64/1f3f5.png +0 -0
  1021. package/web/app/site/sengi/assets/emoji/64/1f3f7.png +0 -0
  1022. package/web/app/site/sengi/assets/emoji/64/1f3f8.png +0 -0
  1023. package/web/app/site/sengi/assets/emoji/64/1f3f9.png +0 -0
  1024. package/web/app/site/sengi/assets/emoji/64/1f3fa.png +0 -0
  1025. package/web/app/site/sengi/assets/emoji/64/1f3fb.png +0 -0
  1026. package/web/app/site/sengi/assets/emoji/64/1f3fc.png +0 -0
  1027. package/web/app/site/sengi/assets/emoji/64/1f3fd.png +0 -0
  1028. package/web/app/site/sengi/assets/emoji/64/1f3fe.png +0 -0
  1029. package/web/app/site/sengi/assets/emoji/64/1f3ff.png +0 -0
  1030. package/web/app/site/sengi/assets/emoji/64/1f400.png +0 -0
  1031. package/web/app/site/sengi/assets/emoji/64/1f401.png +0 -0
  1032. package/web/app/site/sengi/assets/emoji/64/1f402.png +0 -0
  1033. package/web/app/site/sengi/assets/emoji/64/1f403.png +0 -0
  1034. package/web/app/site/sengi/assets/emoji/64/1f404.png +0 -0
  1035. package/web/app/site/sengi/assets/emoji/64/1f405.png +0 -0
  1036. package/web/app/site/sengi/assets/emoji/64/1f406.png +0 -0
  1037. package/web/app/site/sengi/assets/emoji/64/1f407.png +0 -0
  1038. package/web/app/site/sengi/assets/emoji/64/1f408-2b1b.png +0 -0
  1039. package/web/app/site/sengi/assets/emoji/64/1f408.png +0 -0
  1040. package/web/app/site/sengi/assets/emoji/64/1f409.png +0 -0
  1041. package/web/app/site/sengi/assets/emoji/64/1f40a.png +0 -0
  1042. package/web/app/site/sengi/assets/emoji/64/1f40b.png +0 -0
  1043. package/web/app/site/sengi/assets/emoji/64/1f40c.png +0 -0
  1044. package/web/app/site/sengi/assets/emoji/64/1f40d.png +0 -0
  1045. package/web/app/site/sengi/assets/emoji/64/1f40e.png +0 -0
  1046. package/web/app/site/sengi/assets/emoji/64/1f40f.png +0 -0
  1047. package/web/app/site/sengi/assets/emoji/64/1f410.png +0 -0
  1048. package/web/app/site/sengi/assets/emoji/64/1f411.png +0 -0
  1049. package/web/app/site/sengi/assets/emoji/64/1f412.png +0 -0
  1050. package/web/app/site/sengi/assets/emoji/64/1f413.png +0 -0
  1051. package/web/app/site/sengi/assets/emoji/64/1f414.png +0 -0
  1052. package/web/app/site/sengi/assets/emoji/64/1f415-1f9ba.png +0 -0
  1053. package/web/app/site/sengi/assets/emoji/64/1f415.png +0 -0
  1054. package/web/app/site/sengi/assets/emoji/64/1f416.png +0 -0
  1055. package/web/app/site/sengi/assets/emoji/64/1f417.png +0 -0
  1056. package/web/app/site/sengi/assets/emoji/64/1f418.png +0 -0
  1057. package/web/app/site/sengi/assets/emoji/64/1f419.png +0 -0
  1058. package/web/app/site/sengi/assets/emoji/64/1f41a.png +0 -0
  1059. package/web/app/site/sengi/assets/emoji/64/1f41b.png +0 -0
  1060. package/web/app/site/sengi/assets/emoji/64/1f41c.png +0 -0
  1061. package/web/app/site/sengi/assets/emoji/64/1f41d.png +0 -0
  1062. package/web/app/site/sengi/assets/emoji/64/1f41e.png +0 -0
  1063. package/web/app/site/sengi/assets/emoji/64/1f41f.png +0 -0
  1064. package/web/app/site/sengi/assets/emoji/64/1f420.png +0 -0
  1065. package/web/app/site/sengi/assets/emoji/64/1f421.png +0 -0
  1066. package/web/app/site/sengi/assets/emoji/64/1f422.png +0 -0
  1067. package/web/app/site/sengi/assets/emoji/64/1f423.png +0 -0
  1068. package/web/app/site/sengi/assets/emoji/64/1f424.png +0 -0
  1069. package/web/app/site/sengi/assets/emoji/64/1f425.png +0 -0
  1070. package/web/app/site/sengi/assets/emoji/64/1f426-1f525.png +0 -0
  1071. package/web/app/site/sengi/assets/emoji/64/1f426-2b1b.png +0 -0
  1072. package/web/app/site/sengi/assets/emoji/64/1f426.png +0 -0
  1073. package/web/app/site/sengi/assets/emoji/64/1f427.png +0 -0
  1074. package/web/app/site/sengi/assets/emoji/64/1f428.png +0 -0
  1075. package/web/app/site/sengi/assets/emoji/64/1f429.png +0 -0
  1076. package/web/app/site/sengi/assets/emoji/64/1f42a.png +0 -0
  1077. package/web/app/site/sengi/assets/emoji/64/1f42b.png +0 -0
  1078. package/web/app/site/sengi/assets/emoji/64/1f42c.png +0 -0
  1079. package/web/app/site/sengi/assets/emoji/64/1f42d.png +0 -0
  1080. package/web/app/site/sengi/assets/emoji/64/1f42e.png +0 -0
  1081. package/web/app/site/sengi/assets/emoji/64/1f42f.png +0 -0
  1082. package/web/app/site/sengi/assets/emoji/64/1f430.png +0 -0
  1083. package/web/app/site/sengi/assets/emoji/64/1f431.png +0 -0
  1084. package/web/app/site/sengi/assets/emoji/64/1f432.png +0 -0
  1085. package/web/app/site/sengi/assets/emoji/64/1f433.png +0 -0
  1086. package/web/app/site/sengi/assets/emoji/64/1f434.png +0 -0
  1087. package/web/app/site/sengi/assets/emoji/64/1f435.png +0 -0
  1088. package/web/app/site/sengi/assets/emoji/64/1f436.png +0 -0
  1089. package/web/app/site/sengi/assets/emoji/64/1f437.png +0 -0
  1090. package/web/app/site/sengi/assets/emoji/64/1f438.png +0 -0
  1091. package/web/app/site/sengi/assets/emoji/64/1f439.png +0 -0
  1092. package/web/app/site/sengi/assets/emoji/64/1f43a.png +0 -0
  1093. package/web/app/site/sengi/assets/emoji/64/1f43b-2744.png +0 -0
  1094. package/web/app/site/sengi/assets/emoji/64/1f43b.png +0 -0
  1095. package/web/app/site/sengi/assets/emoji/64/1f43c.png +0 -0
  1096. package/web/app/site/sengi/assets/emoji/64/1f43d.png +0 -0
  1097. package/web/app/site/sengi/assets/emoji/64/1f43e.png +0 -0
  1098. package/web/app/site/sengi/assets/emoji/64/1f43f.png +0 -0
  1099. package/web/app/site/sengi/assets/emoji/64/1f440.png +0 -0
  1100. package/web/app/site/sengi/assets/emoji/64/1f441-1f5e8.png +0 -0
  1101. package/web/app/site/sengi/assets/emoji/64/1f441.png +0 -0
  1102. package/web/app/site/sengi/assets/emoji/64/1f442-1f3fb.png +0 -0
  1103. package/web/app/site/sengi/assets/emoji/64/1f442-1f3fc.png +0 -0
  1104. package/web/app/site/sengi/assets/emoji/64/1f442-1f3fd.png +0 -0
  1105. package/web/app/site/sengi/assets/emoji/64/1f442-1f3fe.png +0 -0
  1106. package/web/app/site/sengi/assets/emoji/64/1f442-1f3ff.png +0 -0
  1107. package/web/app/site/sengi/assets/emoji/64/1f442.png +0 -0
  1108. package/web/app/site/sengi/assets/emoji/64/1f443-1f3fb.png +0 -0
  1109. package/web/app/site/sengi/assets/emoji/64/1f443-1f3fc.png +0 -0
  1110. package/web/app/site/sengi/assets/emoji/64/1f443-1f3fd.png +0 -0
  1111. package/web/app/site/sengi/assets/emoji/64/1f443-1f3fe.png +0 -0
  1112. package/web/app/site/sengi/assets/emoji/64/1f443-1f3ff.png +0 -0
  1113. package/web/app/site/sengi/assets/emoji/64/1f443.png +0 -0
  1114. package/web/app/site/sengi/assets/emoji/64/1f444.png +0 -0
  1115. package/web/app/site/sengi/assets/emoji/64/1f445.png +0 -0
  1116. package/web/app/site/sengi/assets/emoji/64/1f446-1f3fb.png +0 -0
  1117. package/web/app/site/sengi/assets/emoji/64/1f446-1f3fc.png +0 -0
  1118. package/web/app/site/sengi/assets/emoji/64/1f446-1f3fd.png +0 -0
  1119. package/web/app/site/sengi/assets/emoji/64/1f446-1f3fe.png +0 -0
  1120. package/web/app/site/sengi/assets/emoji/64/1f446-1f3ff.png +0 -0
  1121. package/web/app/site/sengi/assets/emoji/64/1f446.png +0 -0
  1122. package/web/app/site/sengi/assets/emoji/64/1f447-1f3fb.png +0 -0
  1123. package/web/app/site/sengi/assets/emoji/64/1f447-1f3fc.png +0 -0
  1124. package/web/app/site/sengi/assets/emoji/64/1f447-1f3fd.png +0 -0
  1125. package/web/app/site/sengi/assets/emoji/64/1f447-1f3fe.png +0 -0
  1126. package/web/app/site/sengi/assets/emoji/64/1f447-1f3ff.png +0 -0
  1127. package/web/app/site/sengi/assets/emoji/64/1f447.png +0 -0
  1128. package/web/app/site/sengi/assets/emoji/64/1f448-1f3fb.png +0 -0
  1129. package/web/app/site/sengi/assets/emoji/64/1f448-1f3fc.png +0 -0
  1130. package/web/app/site/sengi/assets/emoji/64/1f448-1f3fd.png +0 -0
  1131. package/web/app/site/sengi/assets/emoji/64/1f448-1f3fe.png +0 -0
  1132. package/web/app/site/sengi/assets/emoji/64/1f448-1f3ff.png +0 -0
  1133. package/web/app/site/sengi/assets/emoji/64/1f448.png +0 -0
  1134. package/web/app/site/sengi/assets/emoji/64/1f449-1f3fb.png +0 -0
  1135. package/web/app/site/sengi/assets/emoji/64/1f449-1f3fc.png +0 -0
  1136. package/web/app/site/sengi/assets/emoji/64/1f449-1f3fd.png +0 -0
  1137. package/web/app/site/sengi/assets/emoji/64/1f449-1f3fe.png +0 -0
  1138. package/web/app/site/sengi/assets/emoji/64/1f449-1f3ff.png +0 -0
  1139. package/web/app/site/sengi/assets/emoji/64/1f449.png +0 -0
  1140. package/web/app/site/sengi/assets/emoji/64/1f44a-1f3fb.png +0 -0
  1141. package/web/app/site/sengi/assets/emoji/64/1f44a-1f3fc.png +0 -0
  1142. package/web/app/site/sengi/assets/emoji/64/1f44a-1f3fd.png +0 -0
  1143. package/web/app/site/sengi/assets/emoji/64/1f44a-1f3fe.png +0 -0
  1144. package/web/app/site/sengi/assets/emoji/64/1f44a-1f3ff.png +0 -0
  1145. package/web/app/site/sengi/assets/emoji/64/1f44a.png +0 -0
  1146. package/web/app/site/sengi/assets/emoji/64/1f44b-1f3fb.png +0 -0
  1147. package/web/app/site/sengi/assets/emoji/64/1f44b-1f3fc.png +0 -0
  1148. package/web/app/site/sengi/assets/emoji/64/1f44b-1f3fd.png +0 -0
  1149. package/web/app/site/sengi/assets/emoji/64/1f44b-1f3fe.png +0 -0
  1150. package/web/app/site/sengi/assets/emoji/64/1f44b-1f3ff.png +0 -0
  1151. package/web/app/site/sengi/assets/emoji/64/1f44b.png +0 -0
  1152. package/web/app/site/sengi/assets/emoji/64/1f44c-1f3fb.png +0 -0
  1153. package/web/app/site/sengi/assets/emoji/64/1f44c-1f3fc.png +0 -0
  1154. package/web/app/site/sengi/assets/emoji/64/1f44c-1f3fd.png +0 -0
  1155. package/web/app/site/sengi/assets/emoji/64/1f44c-1f3fe.png +0 -0
  1156. package/web/app/site/sengi/assets/emoji/64/1f44c-1f3ff.png +0 -0
  1157. package/web/app/site/sengi/assets/emoji/64/1f44c.png +0 -0
  1158. package/web/app/site/sengi/assets/emoji/64/1f44d-1f3fb.png +0 -0
  1159. package/web/app/site/sengi/assets/emoji/64/1f44d-1f3fc.png +0 -0
  1160. package/web/app/site/sengi/assets/emoji/64/1f44d-1f3fd.png +0 -0
  1161. package/web/app/site/sengi/assets/emoji/64/1f44d-1f3fe.png +0 -0
  1162. package/web/app/site/sengi/assets/emoji/64/1f44d-1f3ff.png +0 -0
  1163. package/web/app/site/sengi/assets/emoji/64/1f44d.png +0 -0
  1164. package/web/app/site/sengi/assets/emoji/64/1f44e-1f3fb.png +0 -0
  1165. package/web/app/site/sengi/assets/emoji/64/1f44e-1f3fc.png +0 -0
  1166. package/web/app/site/sengi/assets/emoji/64/1f44e-1f3fd.png +0 -0
  1167. package/web/app/site/sengi/assets/emoji/64/1f44e-1f3fe.png +0 -0
  1168. package/web/app/site/sengi/assets/emoji/64/1f44e-1f3ff.png +0 -0
  1169. package/web/app/site/sengi/assets/emoji/64/1f44e.png +0 -0
  1170. package/web/app/site/sengi/assets/emoji/64/1f44f-1f3fb.png +0 -0
  1171. package/web/app/site/sengi/assets/emoji/64/1f44f-1f3fc.png +0 -0
  1172. package/web/app/site/sengi/assets/emoji/64/1f44f-1f3fd.png +0 -0
  1173. package/web/app/site/sengi/assets/emoji/64/1f44f-1f3fe.png +0 -0
  1174. package/web/app/site/sengi/assets/emoji/64/1f44f-1f3ff.png +0 -0
  1175. package/web/app/site/sengi/assets/emoji/64/1f44f.png +0 -0
  1176. package/web/app/site/sengi/assets/emoji/64/1f450-1f3fb.png +0 -0
  1177. package/web/app/site/sengi/assets/emoji/64/1f450-1f3fc.png +0 -0
  1178. package/web/app/site/sengi/assets/emoji/64/1f450-1f3fd.png +0 -0
  1179. package/web/app/site/sengi/assets/emoji/64/1f450-1f3fe.png +0 -0
  1180. package/web/app/site/sengi/assets/emoji/64/1f450-1f3ff.png +0 -0
  1181. package/web/app/site/sengi/assets/emoji/64/1f450.png +0 -0
  1182. package/web/app/site/sengi/assets/emoji/64/1f451.png +0 -0
  1183. package/web/app/site/sengi/assets/emoji/64/1f452.png +0 -0
  1184. package/web/app/site/sengi/assets/emoji/64/1f453.png +0 -0
  1185. package/web/app/site/sengi/assets/emoji/64/1f454.png +0 -0
  1186. package/web/app/site/sengi/assets/emoji/64/1f455.png +0 -0
  1187. package/web/app/site/sengi/assets/emoji/64/1f456.png +0 -0
  1188. package/web/app/site/sengi/assets/emoji/64/1f457.png +0 -0
  1189. package/web/app/site/sengi/assets/emoji/64/1f458.png +0 -0
  1190. package/web/app/site/sengi/assets/emoji/64/1f459.png +0 -0
  1191. package/web/app/site/sengi/assets/emoji/64/1f45a.png +0 -0
  1192. package/web/app/site/sengi/assets/emoji/64/1f45b.png +0 -0
  1193. package/web/app/site/sengi/assets/emoji/64/1f45c.png +0 -0
  1194. package/web/app/site/sengi/assets/emoji/64/1f45d.png +0 -0
  1195. package/web/app/site/sengi/assets/emoji/64/1f45e.png +0 -0
  1196. package/web/app/site/sengi/assets/emoji/64/1f45f.png +0 -0
  1197. package/web/app/site/sengi/assets/emoji/64/1f460.png +0 -0
  1198. package/web/app/site/sengi/assets/emoji/64/1f461.png +0 -0
  1199. package/web/app/site/sengi/assets/emoji/64/1f462.png +0 -0
  1200. package/web/app/site/sengi/assets/emoji/64/1f463.png +0 -0
  1201. package/web/app/site/sengi/assets/emoji/64/1f464.png +0 -0
  1202. package/web/app/site/sengi/assets/emoji/64/1f465.png +0 -0
  1203. package/web/app/site/sengi/assets/emoji/64/1f466-1f3fb.png +0 -0
  1204. package/web/app/site/sengi/assets/emoji/64/1f466-1f3fc.png +0 -0
  1205. package/web/app/site/sengi/assets/emoji/64/1f466-1f3fd.png +0 -0
  1206. package/web/app/site/sengi/assets/emoji/64/1f466-1f3fe.png +0 -0
  1207. package/web/app/site/sengi/assets/emoji/64/1f466-1f3ff.png +0 -0
  1208. package/web/app/site/sengi/assets/emoji/64/1f466.png +0 -0
  1209. package/web/app/site/sengi/assets/emoji/64/1f467-1f3fb.png +0 -0
  1210. package/web/app/site/sengi/assets/emoji/64/1f467-1f3fc.png +0 -0
  1211. package/web/app/site/sengi/assets/emoji/64/1f467-1f3fd.png +0 -0
  1212. package/web/app/site/sengi/assets/emoji/64/1f467-1f3fe.png +0 -0
  1213. package/web/app/site/sengi/assets/emoji/64/1f467-1f3ff.png +0 -0
  1214. package/web/app/site/sengi/assets/emoji/64/1f467.png +0 -0
  1215. package/web/app/site/sengi/assets/emoji/64/1f468-1f33e.png +0 -0
  1216. package/web/app/site/sengi/assets/emoji/64/1f468-1f373.png +0 -0
  1217. package/web/app/site/sengi/assets/emoji/64/1f468-1f37c.png +0 -0
  1218. package/web/app/site/sengi/assets/emoji/64/1f468-1f393.png +0 -0
  1219. package/web/app/site/sengi/assets/emoji/64/1f468-1f3a4.png +0 -0
  1220. package/web/app/site/sengi/assets/emoji/64/1f468-1f3a8.png +0 -0
  1221. package/web/app/site/sengi/assets/emoji/64/1f468-1f3eb.png +0 -0
  1222. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ed.png +0 -0
  1223. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f33e.png +0 -0
  1224. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f373.png +0 -0
  1225. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f37c.png +0 -0
  1226. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f393.png +0 -0
  1227. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f3a4.png +0 -0
  1228. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f3a8.png +0 -0
  1229. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f3eb.png +0 -0
  1230. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f3ed.png +0 -0
  1231. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f4bb.png +0 -0
  1232. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f4bc.png +0 -0
  1233. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f527.png +0 -0
  1234. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f52c.png +0 -0
  1235. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f680.png +0 -0
  1236. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f692.png +0 -0
  1237. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f91d-1f468-1f3fc.png +0 -0
  1238. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f91d-1f468-1f3fd.png +0 -0
  1239. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f91d-1f468-1f3fe.png +0 -0
  1240. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f91d-1f468-1f3ff.png +0 -0
  1241. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9af-27a1.png +0 -0
  1242. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9af.png +0 -0
  1243. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9b0.png +0 -0
  1244. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9b1.png +0 -0
  1245. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9b2.png +0 -0
  1246. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9b3.png +0 -0
  1247. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9bc-27a1.png +0 -0
  1248. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9bc.png +0 -0
  1249. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9bd-27a1.png +0 -0
  1250. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-1f9bd.png +0 -0
  1251. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2695.png +0 -0
  1252. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2696.png +0 -0
  1253. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2708.png +0 -0
  1254. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f468-1f3fb.png +0 -0
  1255. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f468-1f3fc.png +0 -0
  1256. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f468-1f3fd.png +0 -0
  1257. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f468-1f3fe.png +0 -0
  1258. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f468-1f3ff.png +0 -0
  1259. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f48b-1f468-1f3fb.png +0 -0
  1260. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f48b-1f468-1f3fc.png +0 -0
  1261. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f48b-1f468-1f3fd.png +0 -0
  1262. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f48b-1f468-1f3fe.png +0 -0
  1263. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb-2764-1f48b-1f468-1f3ff.png +0 -0
  1264. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fb.png +0 -0
  1265. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f33e.png +0 -0
  1266. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f373.png +0 -0
  1267. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f37c.png +0 -0
  1268. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f393.png +0 -0
  1269. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f3a4.png +0 -0
  1270. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f3a8.png +0 -0
  1271. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f3eb.png +0 -0
  1272. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f3ed.png +0 -0
  1273. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f4bb.png +0 -0
  1274. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f4bc.png +0 -0
  1275. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f527.png +0 -0
  1276. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f52c.png +0 -0
  1277. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f680.png +0 -0
  1278. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f692.png +0 -0
  1279. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f91d-1f468-1f3fb.png +0 -0
  1280. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f91d-1f468-1f3fd.png +0 -0
  1281. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f91d-1f468-1f3fe.png +0 -0
  1282. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f91d-1f468-1f3ff.png +0 -0
  1283. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9af-27a1.png +0 -0
  1284. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9af.png +0 -0
  1285. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9b0.png +0 -0
  1286. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9b1.png +0 -0
  1287. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9b2.png +0 -0
  1288. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9b3.png +0 -0
  1289. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9bc-27a1.png +0 -0
  1290. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9bc.png +0 -0
  1291. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9bd-27a1.png +0 -0
  1292. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-1f9bd.png +0 -0
  1293. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2695.png +0 -0
  1294. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2696.png +0 -0
  1295. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2708.png +0 -0
  1296. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f468-1f3fb.png +0 -0
  1297. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f468-1f3fc.png +0 -0
  1298. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f468-1f3fd.png +0 -0
  1299. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f468-1f3fe.png +0 -0
  1300. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f468-1f3ff.png +0 -0
  1301. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f48b-1f468-1f3fb.png +0 -0
  1302. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f48b-1f468-1f3fc.png +0 -0
  1303. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f48b-1f468-1f3fd.png +0 -0
  1304. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f48b-1f468-1f3fe.png +0 -0
  1305. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc-2764-1f48b-1f468-1f3ff.png +0 -0
  1306. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fc.png +0 -0
  1307. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f33e.png +0 -0
  1308. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f373.png +0 -0
  1309. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f37c.png +0 -0
  1310. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f393.png +0 -0
  1311. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f3a4.png +0 -0
  1312. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f3a8.png +0 -0
  1313. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f3eb.png +0 -0
  1314. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f3ed.png +0 -0
  1315. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f4bb.png +0 -0
  1316. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f4bc.png +0 -0
  1317. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f527.png +0 -0
  1318. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f52c.png +0 -0
  1319. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f680.png +0 -0
  1320. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f692.png +0 -0
  1321. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f91d-1f468-1f3fb.png +0 -0
  1322. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f91d-1f468-1f3fc.png +0 -0
  1323. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f91d-1f468-1f3fe.png +0 -0
  1324. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f91d-1f468-1f3ff.png +0 -0
  1325. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9af-27a1.png +0 -0
  1326. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9af.png +0 -0
  1327. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9b0.png +0 -0
  1328. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9b1.png +0 -0
  1329. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9b2.png +0 -0
  1330. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9b3.png +0 -0
  1331. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9bc-27a1.png +0 -0
  1332. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9bc.png +0 -0
  1333. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9bd-27a1.png +0 -0
  1334. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-1f9bd.png +0 -0
  1335. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2695.png +0 -0
  1336. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2696.png +0 -0
  1337. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2708.png +0 -0
  1338. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f468-1f3fb.png +0 -0
  1339. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f468-1f3fc.png +0 -0
  1340. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f468-1f3fd.png +0 -0
  1341. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f468-1f3fe.png +0 -0
  1342. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f468-1f3ff.png +0 -0
  1343. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f48b-1f468-1f3fb.png +0 -0
  1344. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f48b-1f468-1f3fc.png +0 -0
  1345. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f48b-1f468-1f3fd.png +0 -0
  1346. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f48b-1f468-1f3fe.png +0 -0
  1347. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd-2764-1f48b-1f468-1f3ff.png +0 -0
  1348. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fd.png +0 -0
  1349. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f33e.png +0 -0
  1350. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f373.png +0 -0
  1351. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f37c.png +0 -0
  1352. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f393.png +0 -0
  1353. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f3a4.png +0 -0
  1354. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f3a8.png +0 -0
  1355. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f3eb.png +0 -0
  1356. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f3ed.png +0 -0
  1357. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f4bb.png +0 -0
  1358. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f4bc.png +0 -0
  1359. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f527.png +0 -0
  1360. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f52c.png +0 -0
  1361. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f680.png +0 -0
  1362. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f692.png +0 -0
  1363. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f91d-1f468-1f3fb.png +0 -0
  1364. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f91d-1f468-1f3fc.png +0 -0
  1365. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f91d-1f468-1f3fd.png +0 -0
  1366. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f91d-1f468-1f3ff.png +0 -0
  1367. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9af-27a1.png +0 -0
  1368. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9af.png +0 -0
  1369. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9b0.png +0 -0
  1370. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9b1.png +0 -0
  1371. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9b2.png +0 -0
  1372. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9b3.png +0 -0
  1373. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9bc-27a1.png +0 -0
  1374. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9bc.png +0 -0
  1375. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9bd-27a1.png +0 -0
  1376. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-1f9bd.png +0 -0
  1377. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2695.png +0 -0
  1378. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2696.png +0 -0
  1379. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2708.png +0 -0
  1380. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f468-1f3fb.png +0 -0
  1381. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f468-1f3fc.png +0 -0
  1382. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f468-1f3fd.png +0 -0
  1383. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f468-1f3fe.png +0 -0
  1384. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f468-1f3ff.png +0 -0
  1385. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f48b-1f468-1f3fb.png +0 -0
  1386. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f48b-1f468-1f3fc.png +0 -0
  1387. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f48b-1f468-1f3fd.png +0 -0
  1388. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f48b-1f468-1f3fe.png +0 -0
  1389. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe-2764-1f48b-1f468-1f3ff.png +0 -0
  1390. package/web/app/site/sengi/assets/emoji/64/1f468-1f3fe.png +0 -0
  1391. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f33e.png +0 -0
  1392. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f373.png +0 -0
  1393. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f37c.png +0 -0
  1394. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f393.png +0 -0
  1395. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f3a4.png +0 -0
  1396. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f3a8.png +0 -0
  1397. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f3eb.png +0 -0
  1398. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f3ed.png +0 -0
  1399. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f4bb.png +0 -0
  1400. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f4bc.png +0 -0
  1401. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f527.png +0 -0
  1402. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f52c.png +0 -0
  1403. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f680.png +0 -0
  1404. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f692.png +0 -0
  1405. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f91d-1f468-1f3fb.png +0 -0
  1406. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f91d-1f468-1f3fc.png +0 -0
  1407. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f91d-1f468-1f3fd.png +0 -0
  1408. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f91d-1f468-1f3fe.png +0 -0
  1409. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9af-27a1.png +0 -0
  1410. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9af.png +0 -0
  1411. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9b0.png +0 -0
  1412. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9b1.png +0 -0
  1413. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9b2.png +0 -0
  1414. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9b3.png +0 -0
  1415. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9bc-27a1.png +0 -0
  1416. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9bc.png +0 -0
  1417. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9bd-27a1.png +0 -0
  1418. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-1f9bd.png +0 -0
  1419. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2695.png +0 -0
  1420. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2696.png +0 -0
  1421. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2708.png +0 -0
  1422. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f468-1f3fb.png +0 -0
  1423. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f468-1f3fc.png +0 -0
  1424. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f468-1f3fd.png +0 -0
  1425. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f468-1f3fe.png +0 -0
  1426. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f468-1f3ff.png +0 -0
  1427. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f48b-1f468-1f3fb.png +0 -0
  1428. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f48b-1f468-1f3fc.png +0 -0
  1429. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f48b-1f468-1f3fd.png +0 -0
  1430. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f48b-1f468-1f3fe.png +0 -0
  1431. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff-2764-1f48b-1f468-1f3ff.png +0 -0
  1432. package/web/app/site/sengi/assets/emoji/64/1f468-1f3ff.png +0 -0
  1433. package/web/app/site/sengi/assets/emoji/64/1f468-1f466-1f466.png +0 -0
  1434. package/web/app/site/sengi/assets/emoji/64/1f468-1f466.png +0 -0
  1435. package/web/app/site/sengi/assets/emoji/64/1f468-1f467-1f466.png +0 -0
  1436. package/web/app/site/sengi/assets/emoji/64/1f468-1f467-1f467.png +0 -0
  1437. package/web/app/site/sengi/assets/emoji/64/1f468-1f467.png +0 -0
  1438. package/web/app/site/sengi/assets/emoji/64/1f468-1f468-1f466-1f466.png +0 -0
  1439. package/web/app/site/sengi/assets/emoji/64/1f468-1f468-1f466.png +0 -0
  1440. package/web/app/site/sengi/assets/emoji/64/1f468-1f468-1f467-1f466.png +0 -0
  1441. package/web/app/site/sengi/assets/emoji/64/1f468-1f468-1f467-1f467.png +0 -0
  1442. package/web/app/site/sengi/assets/emoji/64/1f468-1f468-1f467.png +0 -0
  1443. package/web/app/site/sengi/assets/emoji/64/1f468-1f469-1f466-1f466.png +0 -0
  1444. package/web/app/site/sengi/assets/emoji/64/1f468-1f469-1f466.png +0 -0
  1445. package/web/app/site/sengi/assets/emoji/64/1f468-1f469-1f467-1f466.png +0 -0
  1446. package/web/app/site/sengi/assets/emoji/64/1f468-1f469-1f467-1f467.png +0 -0
  1447. package/web/app/site/sengi/assets/emoji/64/1f468-1f469-1f467.png +0 -0
  1448. package/web/app/site/sengi/assets/emoji/64/1f468-1f4bb.png +0 -0
  1449. package/web/app/site/sengi/assets/emoji/64/1f468-1f4bc.png +0 -0
  1450. package/web/app/site/sengi/assets/emoji/64/1f468-1f527.png +0 -0
  1451. package/web/app/site/sengi/assets/emoji/64/1f468-1f52c.png +0 -0
  1452. package/web/app/site/sengi/assets/emoji/64/1f468-1f680.png +0 -0
  1453. package/web/app/site/sengi/assets/emoji/64/1f468-1f692.png +0 -0
  1454. package/web/app/site/sengi/assets/emoji/64/1f468-1f9af-27a1.png +0 -0
  1455. package/web/app/site/sengi/assets/emoji/64/1f468-1f9af.png +0 -0
  1456. package/web/app/site/sengi/assets/emoji/64/1f468-1f9b0.png +0 -0
  1457. package/web/app/site/sengi/assets/emoji/64/1f468-1f9b1.png +0 -0
  1458. package/web/app/site/sengi/assets/emoji/64/1f468-1f9b2.png +0 -0
  1459. package/web/app/site/sengi/assets/emoji/64/1f468-1f9b3.png +0 -0
  1460. package/web/app/site/sengi/assets/emoji/64/1f468-1f9bc-27a1.png +0 -0
  1461. package/web/app/site/sengi/assets/emoji/64/1f468-1f9bc.png +0 -0
  1462. package/web/app/site/sengi/assets/emoji/64/1f468-1f9bd-27a1.png +0 -0
  1463. package/web/app/site/sengi/assets/emoji/64/1f468-1f9bd.png +0 -0
  1464. package/web/app/site/sengi/assets/emoji/64/1f468-2695.png +0 -0
  1465. package/web/app/site/sengi/assets/emoji/64/1f468-2696.png +0 -0
  1466. package/web/app/site/sengi/assets/emoji/64/1f468-2708.png +0 -0
  1467. package/web/app/site/sengi/assets/emoji/64/1f468-2764-1f468.png +0 -0
  1468. package/web/app/site/sengi/assets/emoji/64/1f468-2764-1f48b-1f468.png +0 -0
  1469. package/web/app/site/sengi/assets/emoji/64/1f468.png +0 -0
  1470. package/web/app/site/sengi/assets/emoji/64/1f469-1f33e.png +0 -0
  1471. package/web/app/site/sengi/assets/emoji/64/1f469-1f373.png +0 -0
  1472. package/web/app/site/sengi/assets/emoji/64/1f469-1f37c.png +0 -0
  1473. package/web/app/site/sengi/assets/emoji/64/1f469-1f393.png +0 -0
  1474. package/web/app/site/sengi/assets/emoji/64/1f469-1f3a4.png +0 -0
  1475. package/web/app/site/sengi/assets/emoji/64/1f469-1f3a8.png +0 -0
  1476. package/web/app/site/sengi/assets/emoji/64/1f469-1f3eb.png +0 -0
  1477. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ed.png +0 -0
  1478. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f33e.png +0 -0
  1479. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f373.png +0 -0
  1480. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f37c.png +0 -0
  1481. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f393.png +0 -0
  1482. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f3a4.png +0 -0
  1483. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f3a8.png +0 -0
  1484. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f3eb.png +0 -0
  1485. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f3ed.png +0 -0
  1486. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f4bb.png +0 -0
  1487. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f4bc.png +0 -0
  1488. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f527.png +0 -0
  1489. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f52c.png +0 -0
  1490. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f680.png +0 -0
  1491. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f692.png +0 -0
  1492. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f468-1f3fc.png +0 -0
  1493. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f468-1f3fd.png +0 -0
  1494. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f468-1f3fe.png +0 -0
  1495. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f468-1f3ff.png +0 -0
  1496. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f469-1f3fc.png +0 -0
  1497. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f469-1f3fd.png +0 -0
  1498. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f469-1f3fe.png +0 -0
  1499. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f91d-1f469-1f3ff.png +0 -0
  1500. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9af-27a1.png +0 -0
  1501. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9af.png +0 -0
  1502. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9b0.png +0 -0
  1503. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9b1.png +0 -0
  1504. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9b2.png +0 -0
  1505. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9b3.png +0 -0
  1506. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9bc-27a1.png +0 -0
  1507. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9bc.png +0 -0
  1508. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9bd-27a1.png +0 -0
  1509. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-1f9bd.png +0 -0
  1510. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2695.png +0 -0
  1511. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2696.png +0 -0
  1512. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2708.png +0 -0
  1513. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f468-1f3fb.png +0 -0
  1514. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f468-1f3fc.png +0 -0
  1515. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f468-1f3fd.png +0 -0
  1516. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f468-1f3fe.png +0 -0
  1517. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f468-1f3ff.png +0 -0
  1518. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f469-1f3fb.png +0 -0
  1519. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f469-1f3fc.png +0 -0
  1520. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f469-1f3fd.png +0 -0
  1521. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f469-1f3fe.png +0 -0
  1522. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f469-1f3ff.png +0 -0
  1523. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f468-1f3fb.png +0 -0
  1524. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f468-1f3fc.png +0 -0
  1525. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f468-1f3fd.png +0 -0
  1526. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f468-1f3fe.png +0 -0
  1527. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f468-1f3ff.png +0 -0
  1528. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f469-1f3fb.png +0 -0
  1529. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f469-1f3fc.png +0 -0
  1530. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f469-1f3fd.png +0 -0
  1531. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f469-1f3fe.png +0 -0
  1532. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb-2764-1f48b-1f469-1f3ff.png +0 -0
  1533. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fb.png +0 -0
  1534. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f33e.png +0 -0
  1535. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f373.png +0 -0
  1536. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f37c.png +0 -0
  1537. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f393.png +0 -0
  1538. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f3a4.png +0 -0
  1539. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f3a8.png +0 -0
  1540. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f3eb.png +0 -0
  1541. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f3ed.png +0 -0
  1542. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f4bb.png +0 -0
  1543. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f4bc.png +0 -0
  1544. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f527.png +0 -0
  1545. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f52c.png +0 -0
  1546. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f680.png +0 -0
  1547. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f692.png +0 -0
  1548. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f468-1f3fb.png +0 -0
  1549. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f468-1f3fd.png +0 -0
  1550. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f468-1f3fe.png +0 -0
  1551. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f468-1f3ff.png +0 -0
  1552. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f469-1f3fb.png +0 -0
  1553. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f469-1f3fd.png +0 -0
  1554. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f469-1f3fe.png +0 -0
  1555. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f91d-1f469-1f3ff.png +0 -0
  1556. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9af-27a1.png +0 -0
  1557. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9af.png +0 -0
  1558. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9b0.png +0 -0
  1559. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9b1.png +0 -0
  1560. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9b2.png +0 -0
  1561. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9b3.png +0 -0
  1562. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9bc-27a1.png +0 -0
  1563. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9bc.png +0 -0
  1564. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9bd-27a1.png +0 -0
  1565. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-1f9bd.png +0 -0
  1566. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2695.png +0 -0
  1567. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2696.png +0 -0
  1568. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2708.png +0 -0
  1569. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f468-1f3fb.png +0 -0
  1570. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f468-1f3fc.png +0 -0
  1571. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f468-1f3fd.png +0 -0
  1572. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f468-1f3fe.png +0 -0
  1573. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f468-1f3ff.png +0 -0
  1574. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f469-1f3fb.png +0 -0
  1575. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f469-1f3fc.png +0 -0
  1576. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f469-1f3fd.png +0 -0
  1577. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f469-1f3fe.png +0 -0
  1578. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f469-1f3ff.png +0 -0
  1579. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f468-1f3fb.png +0 -0
  1580. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f468-1f3fc.png +0 -0
  1581. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f468-1f3fd.png +0 -0
  1582. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f468-1f3fe.png +0 -0
  1583. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f468-1f3ff.png +0 -0
  1584. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f469-1f3fb.png +0 -0
  1585. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f469-1f3fc.png +0 -0
  1586. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f469-1f3fd.png +0 -0
  1587. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f469-1f3fe.png +0 -0
  1588. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc-2764-1f48b-1f469-1f3ff.png +0 -0
  1589. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fc.png +0 -0
  1590. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f33e.png +0 -0
  1591. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f373.png +0 -0
  1592. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f37c.png +0 -0
  1593. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f393.png +0 -0
  1594. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f3a4.png +0 -0
  1595. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f3a8.png +0 -0
  1596. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f3eb.png +0 -0
  1597. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f3ed.png +0 -0
  1598. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f4bb.png +0 -0
  1599. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f4bc.png +0 -0
  1600. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f527.png +0 -0
  1601. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f52c.png +0 -0
  1602. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f680.png +0 -0
  1603. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f692.png +0 -0
  1604. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f468-1f3fb.png +0 -0
  1605. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f468-1f3fc.png +0 -0
  1606. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f468-1f3fe.png +0 -0
  1607. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f468-1f3ff.png +0 -0
  1608. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f469-1f3fb.png +0 -0
  1609. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f469-1f3fc.png +0 -0
  1610. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f469-1f3fe.png +0 -0
  1611. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f91d-1f469-1f3ff.png +0 -0
  1612. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9af-27a1.png +0 -0
  1613. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9af.png +0 -0
  1614. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9b0.png +0 -0
  1615. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9b1.png +0 -0
  1616. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9b2.png +0 -0
  1617. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9b3.png +0 -0
  1618. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9bc-27a1.png +0 -0
  1619. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9bc.png +0 -0
  1620. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9bd-27a1.png +0 -0
  1621. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-1f9bd.png +0 -0
  1622. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2695.png +0 -0
  1623. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2696.png +0 -0
  1624. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2708.png +0 -0
  1625. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f468-1f3fb.png +0 -0
  1626. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f468-1f3fc.png +0 -0
  1627. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f468-1f3fd.png +0 -0
  1628. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f468-1f3fe.png +0 -0
  1629. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f468-1f3ff.png +0 -0
  1630. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f469-1f3fb.png +0 -0
  1631. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f469-1f3fc.png +0 -0
  1632. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f469-1f3fd.png +0 -0
  1633. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f469-1f3fe.png +0 -0
  1634. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f469-1f3ff.png +0 -0
  1635. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f468-1f3fb.png +0 -0
  1636. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f468-1f3fc.png +0 -0
  1637. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f468-1f3fd.png +0 -0
  1638. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f468-1f3fe.png +0 -0
  1639. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f468-1f3ff.png +0 -0
  1640. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f469-1f3fb.png +0 -0
  1641. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f469-1f3fc.png +0 -0
  1642. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f469-1f3fd.png +0 -0
  1643. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f469-1f3fe.png +0 -0
  1644. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd-2764-1f48b-1f469-1f3ff.png +0 -0
  1645. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fd.png +0 -0
  1646. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f33e.png +0 -0
  1647. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f373.png +0 -0
  1648. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f37c.png +0 -0
  1649. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f393.png +0 -0
  1650. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f3a4.png +0 -0
  1651. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f3a8.png +0 -0
  1652. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f3eb.png +0 -0
  1653. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f3ed.png +0 -0
  1654. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f4bb.png +0 -0
  1655. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f4bc.png +0 -0
  1656. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f527.png +0 -0
  1657. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f52c.png +0 -0
  1658. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f680.png +0 -0
  1659. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f692.png +0 -0
  1660. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f468-1f3fb.png +0 -0
  1661. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f468-1f3fc.png +0 -0
  1662. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f468-1f3fd.png +0 -0
  1663. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f468-1f3ff.png +0 -0
  1664. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f469-1f3fb.png +0 -0
  1665. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f469-1f3fc.png +0 -0
  1666. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f469-1f3fd.png +0 -0
  1667. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f91d-1f469-1f3ff.png +0 -0
  1668. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9af-27a1.png +0 -0
  1669. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9af.png +0 -0
  1670. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9b0.png +0 -0
  1671. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9b1.png +0 -0
  1672. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9b2.png +0 -0
  1673. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9b3.png +0 -0
  1674. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9bc-27a1.png +0 -0
  1675. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9bc.png +0 -0
  1676. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9bd-27a1.png +0 -0
  1677. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-1f9bd.png +0 -0
  1678. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2695.png +0 -0
  1679. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2696.png +0 -0
  1680. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2708.png +0 -0
  1681. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f468-1f3fb.png +0 -0
  1682. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f468-1f3fc.png +0 -0
  1683. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f468-1f3fd.png +0 -0
  1684. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f468-1f3fe.png +0 -0
  1685. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f468-1f3ff.png +0 -0
  1686. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f469-1f3fb.png +0 -0
  1687. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f469-1f3fc.png +0 -0
  1688. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f469-1f3fd.png +0 -0
  1689. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f469-1f3fe.png +0 -0
  1690. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f469-1f3ff.png +0 -0
  1691. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f468-1f3fb.png +0 -0
  1692. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f468-1f3fc.png +0 -0
  1693. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f468-1f3fd.png +0 -0
  1694. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f468-1f3fe.png +0 -0
  1695. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f468-1f3ff.png +0 -0
  1696. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f469-1f3fb.png +0 -0
  1697. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f469-1f3fc.png +0 -0
  1698. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f469-1f3fd.png +0 -0
  1699. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f469-1f3fe.png +0 -0
  1700. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe-2764-1f48b-1f469-1f3ff.png +0 -0
  1701. package/web/app/site/sengi/assets/emoji/64/1f469-1f3fe.png +0 -0
  1702. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f33e.png +0 -0
  1703. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f373.png +0 -0
  1704. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f37c.png +0 -0
  1705. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f393.png +0 -0
  1706. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f3a4.png +0 -0
  1707. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f3a8.png +0 -0
  1708. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f3eb.png +0 -0
  1709. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f3ed.png +0 -0
  1710. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f4bb.png +0 -0
  1711. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f4bc.png +0 -0
  1712. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f527.png +0 -0
  1713. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f52c.png +0 -0
  1714. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f680.png +0 -0
  1715. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f692.png +0 -0
  1716. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f468-1f3fb.png +0 -0
  1717. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f468-1f3fc.png +0 -0
  1718. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f468-1f3fd.png +0 -0
  1719. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f468-1f3fe.png +0 -0
  1720. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f469-1f3fb.png +0 -0
  1721. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f469-1f3fc.png +0 -0
  1722. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f469-1f3fd.png +0 -0
  1723. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f91d-1f469-1f3fe.png +0 -0
  1724. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9af-27a1.png +0 -0
  1725. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9af.png +0 -0
  1726. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9b0.png +0 -0
  1727. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9b1.png +0 -0
  1728. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9b2.png +0 -0
  1729. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9b3.png +0 -0
  1730. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9bc-27a1.png +0 -0
  1731. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9bc.png +0 -0
  1732. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9bd-27a1.png +0 -0
  1733. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-1f9bd.png +0 -0
  1734. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2695.png +0 -0
  1735. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2696.png +0 -0
  1736. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2708.png +0 -0
  1737. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f468-1f3fb.png +0 -0
  1738. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f468-1f3fc.png +0 -0
  1739. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f468-1f3fd.png +0 -0
  1740. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f468-1f3fe.png +0 -0
  1741. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f468-1f3ff.png +0 -0
  1742. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f469-1f3fb.png +0 -0
  1743. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f469-1f3fc.png +0 -0
  1744. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f469-1f3fd.png +0 -0
  1745. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f469-1f3fe.png +0 -0
  1746. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f469-1f3ff.png +0 -0
  1747. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f468-1f3fb.png +0 -0
  1748. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f468-1f3fc.png +0 -0
  1749. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f468-1f3fd.png +0 -0
  1750. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f468-1f3fe.png +0 -0
  1751. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f468-1f3ff.png +0 -0
  1752. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f469-1f3fb.png +0 -0
  1753. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f469-1f3fc.png +0 -0
  1754. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f469-1f3fd.png +0 -0
  1755. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f469-1f3fe.png +0 -0
  1756. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff-2764-1f48b-1f469-1f3ff.png +0 -0
  1757. package/web/app/site/sengi/assets/emoji/64/1f469-1f3ff.png +0 -0
  1758. package/web/app/site/sengi/assets/emoji/64/1f469-1f466-1f466.png +0 -0
  1759. package/web/app/site/sengi/assets/emoji/64/1f469-1f466.png +0 -0
  1760. package/web/app/site/sengi/assets/emoji/64/1f469-1f467-1f466.png +0 -0
  1761. package/web/app/site/sengi/assets/emoji/64/1f469-1f467-1f467.png +0 -0
  1762. package/web/app/site/sengi/assets/emoji/64/1f469-1f467.png +0 -0
  1763. package/web/app/site/sengi/assets/emoji/64/1f469-1f469-1f466-1f466.png +0 -0
  1764. package/web/app/site/sengi/assets/emoji/64/1f469-1f469-1f466.png +0 -0
  1765. package/web/app/site/sengi/assets/emoji/64/1f469-1f469-1f467-1f466.png +0 -0
  1766. package/web/app/site/sengi/assets/emoji/64/1f469-1f469-1f467-1f467.png +0 -0
  1767. package/web/app/site/sengi/assets/emoji/64/1f469-1f469-1f467.png +0 -0
  1768. package/web/app/site/sengi/assets/emoji/64/1f469-1f4bb.png +0 -0
  1769. package/web/app/site/sengi/assets/emoji/64/1f469-1f4bc.png +0 -0
  1770. package/web/app/site/sengi/assets/emoji/64/1f469-1f527.png +0 -0
  1771. package/web/app/site/sengi/assets/emoji/64/1f469-1f52c.png +0 -0
  1772. package/web/app/site/sengi/assets/emoji/64/1f469-1f680.png +0 -0
  1773. package/web/app/site/sengi/assets/emoji/64/1f469-1f692.png +0 -0
  1774. package/web/app/site/sengi/assets/emoji/64/1f469-1f9af-27a1.png +0 -0
  1775. package/web/app/site/sengi/assets/emoji/64/1f469-1f9af.png +0 -0
  1776. package/web/app/site/sengi/assets/emoji/64/1f469-1f9b0.png +0 -0
  1777. package/web/app/site/sengi/assets/emoji/64/1f469-1f9b1.png +0 -0
  1778. package/web/app/site/sengi/assets/emoji/64/1f469-1f9b2.png +0 -0
  1779. package/web/app/site/sengi/assets/emoji/64/1f469-1f9b3.png +0 -0
  1780. package/web/app/site/sengi/assets/emoji/64/1f469-1f9bc-27a1.png +0 -0
  1781. package/web/app/site/sengi/assets/emoji/64/1f469-1f9bc.png +0 -0
  1782. package/web/app/site/sengi/assets/emoji/64/1f469-1f9bd-27a1.png +0 -0
  1783. package/web/app/site/sengi/assets/emoji/64/1f469-1f9bd.png +0 -0
  1784. package/web/app/site/sengi/assets/emoji/64/1f469-2695.png +0 -0
  1785. package/web/app/site/sengi/assets/emoji/64/1f469-2696.png +0 -0
  1786. package/web/app/site/sengi/assets/emoji/64/1f469-2708.png +0 -0
  1787. package/web/app/site/sengi/assets/emoji/64/1f469-2764-1f468.png +0 -0
  1788. package/web/app/site/sengi/assets/emoji/64/1f469-2764-1f469.png +0 -0
  1789. package/web/app/site/sengi/assets/emoji/64/1f469-2764-1f48b-1f468.png +0 -0
  1790. package/web/app/site/sengi/assets/emoji/64/1f469-2764-1f48b-1f469.png +0 -0
  1791. package/web/app/site/sengi/assets/emoji/64/1f469.png +0 -0
  1792. package/web/app/site/sengi/assets/emoji/64/1f46a.png +0 -0
  1793. package/web/app/site/sengi/assets/emoji/64/1f46b-1f3fb.png +0 -0
  1794. package/web/app/site/sengi/assets/emoji/64/1f46b-1f3fc.png +0 -0
  1795. package/web/app/site/sengi/assets/emoji/64/1f46b-1f3fd.png +0 -0
  1796. package/web/app/site/sengi/assets/emoji/64/1f46b-1f3fe.png +0 -0
  1797. package/web/app/site/sengi/assets/emoji/64/1f46b-1f3ff.png +0 -0
  1798. package/web/app/site/sengi/assets/emoji/64/1f46b.png +0 -0
  1799. package/web/app/site/sengi/assets/emoji/64/1f46c-1f3fb.png +0 -0
  1800. package/web/app/site/sengi/assets/emoji/64/1f46c-1f3fc.png +0 -0
  1801. package/web/app/site/sengi/assets/emoji/64/1f46c-1f3fd.png +0 -0
  1802. package/web/app/site/sengi/assets/emoji/64/1f46c-1f3fe.png +0 -0
  1803. package/web/app/site/sengi/assets/emoji/64/1f46c-1f3ff.png +0 -0
  1804. package/web/app/site/sengi/assets/emoji/64/1f46c.png +0 -0
  1805. package/web/app/site/sengi/assets/emoji/64/1f46d-1f3fb.png +0 -0
  1806. package/web/app/site/sengi/assets/emoji/64/1f46d-1f3fc.png +0 -0
  1807. package/web/app/site/sengi/assets/emoji/64/1f46d-1f3fd.png +0 -0
  1808. package/web/app/site/sengi/assets/emoji/64/1f46d-1f3fe.png +0 -0
  1809. package/web/app/site/sengi/assets/emoji/64/1f46d-1f3ff.png +0 -0
  1810. package/web/app/site/sengi/assets/emoji/64/1f46d.png +0 -0
  1811. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fb-2640.png +0 -0
  1812. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fb-2642.png +0 -0
  1813. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fb.png +0 -0
  1814. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fc-2640.png +0 -0
  1815. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fc-2642.png +0 -0
  1816. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fc.png +0 -0
  1817. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fd-2640.png +0 -0
  1818. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fd-2642.png +0 -0
  1819. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fd.png +0 -0
  1820. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fe-2640.png +0 -0
  1821. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fe-2642.png +0 -0
  1822. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3fe.png +0 -0
  1823. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3ff-2640.png +0 -0
  1824. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3ff-2642.png +0 -0
  1825. package/web/app/site/sengi/assets/emoji/64/1f46e-1f3ff.png +0 -0
  1826. package/web/app/site/sengi/assets/emoji/64/1f46e-2640.png +0 -0
  1827. package/web/app/site/sengi/assets/emoji/64/1f46e-2642.png +0 -0
  1828. package/web/app/site/sengi/assets/emoji/64/1f46e.png +0 -0
  1829. package/web/app/site/sengi/assets/emoji/64/1f46f-2640.png +0 -0
  1830. package/web/app/site/sengi/assets/emoji/64/1f46f-2642.png +0 -0
  1831. package/web/app/site/sengi/assets/emoji/64/1f46f.png +0 -0
  1832. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fb-2640.png +0 -0
  1833. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fb-2642.png +0 -0
  1834. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fb.png +0 -0
  1835. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fc-2640.png +0 -0
  1836. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fc-2642.png +0 -0
  1837. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fc.png +0 -0
  1838. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fd-2640.png +0 -0
  1839. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fd-2642.png +0 -0
  1840. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fd.png +0 -0
  1841. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fe-2640.png +0 -0
  1842. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fe-2642.png +0 -0
  1843. package/web/app/site/sengi/assets/emoji/64/1f470-1f3fe.png +0 -0
  1844. package/web/app/site/sengi/assets/emoji/64/1f470-1f3ff-2640.png +0 -0
  1845. package/web/app/site/sengi/assets/emoji/64/1f470-1f3ff-2642.png +0 -0
  1846. package/web/app/site/sengi/assets/emoji/64/1f470-1f3ff.png +0 -0
  1847. package/web/app/site/sengi/assets/emoji/64/1f470-2640.png +0 -0
  1848. package/web/app/site/sengi/assets/emoji/64/1f470-2642.png +0 -0
  1849. package/web/app/site/sengi/assets/emoji/64/1f470.png +0 -0
  1850. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fb-2640.png +0 -0
  1851. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fb-2642.png +0 -0
  1852. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fb.png +0 -0
  1853. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fc-2640.png +0 -0
  1854. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fc-2642.png +0 -0
  1855. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fc.png +0 -0
  1856. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fd-2640.png +0 -0
  1857. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fd-2642.png +0 -0
  1858. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fd.png +0 -0
  1859. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fe-2640.png +0 -0
  1860. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fe-2642.png +0 -0
  1861. package/web/app/site/sengi/assets/emoji/64/1f471-1f3fe.png +0 -0
  1862. package/web/app/site/sengi/assets/emoji/64/1f471-1f3ff-2640.png +0 -0
  1863. package/web/app/site/sengi/assets/emoji/64/1f471-1f3ff-2642.png +0 -0
  1864. package/web/app/site/sengi/assets/emoji/64/1f471-1f3ff.png +0 -0
  1865. package/web/app/site/sengi/assets/emoji/64/1f471-2640.png +0 -0
  1866. package/web/app/site/sengi/assets/emoji/64/1f471-2642.png +0 -0
  1867. package/web/app/site/sengi/assets/emoji/64/1f471.png +0 -0
  1868. package/web/app/site/sengi/assets/emoji/64/1f472-1f3fb.png +0 -0
  1869. package/web/app/site/sengi/assets/emoji/64/1f472-1f3fc.png +0 -0
  1870. package/web/app/site/sengi/assets/emoji/64/1f472-1f3fd.png +0 -0
  1871. package/web/app/site/sengi/assets/emoji/64/1f472-1f3fe.png +0 -0
  1872. package/web/app/site/sengi/assets/emoji/64/1f472-1f3ff.png +0 -0
  1873. package/web/app/site/sengi/assets/emoji/64/1f472.png +0 -0
  1874. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fb-2640.png +0 -0
  1875. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fb-2642.png +0 -0
  1876. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fb.png +0 -0
  1877. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fc-2640.png +0 -0
  1878. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fc-2642.png +0 -0
  1879. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fc.png +0 -0
  1880. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fd-2640.png +0 -0
  1881. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fd-2642.png +0 -0
  1882. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fd.png +0 -0
  1883. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fe-2640.png +0 -0
  1884. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fe-2642.png +0 -0
  1885. package/web/app/site/sengi/assets/emoji/64/1f473-1f3fe.png +0 -0
  1886. package/web/app/site/sengi/assets/emoji/64/1f473-1f3ff-2640.png +0 -0
  1887. package/web/app/site/sengi/assets/emoji/64/1f473-1f3ff-2642.png +0 -0
  1888. package/web/app/site/sengi/assets/emoji/64/1f473-1f3ff.png +0 -0
  1889. package/web/app/site/sengi/assets/emoji/64/1f473-2640.png +0 -0
  1890. package/web/app/site/sengi/assets/emoji/64/1f473-2642.png +0 -0
  1891. package/web/app/site/sengi/assets/emoji/64/1f473.png +0 -0
  1892. package/web/app/site/sengi/assets/emoji/64/1f474-1f3fb.png +0 -0
  1893. package/web/app/site/sengi/assets/emoji/64/1f474-1f3fc.png +0 -0
  1894. package/web/app/site/sengi/assets/emoji/64/1f474-1f3fd.png +0 -0
  1895. package/web/app/site/sengi/assets/emoji/64/1f474-1f3fe.png +0 -0
  1896. package/web/app/site/sengi/assets/emoji/64/1f474-1f3ff.png +0 -0
  1897. package/web/app/site/sengi/assets/emoji/64/1f474.png +0 -0
  1898. package/web/app/site/sengi/assets/emoji/64/1f475-1f3fb.png +0 -0
  1899. package/web/app/site/sengi/assets/emoji/64/1f475-1f3fc.png +0 -0
  1900. package/web/app/site/sengi/assets/emoji/64/1f475-1f3fd.png +0 -0
  1901. package/web/app/site/sengi/assets/emoji/64/1f475-1f3fe.png +0 -0
  1902. package/web/app/site/sengi/assets/emoji/64/1f475-1f3ff.png +0 -0
  1903. package/web/app/site/sengi/assets/emoji/64/1f475.png +0 -0
  1904. package/web/app/site/sengi/assets/emoji/64/1f476-1f3fb.png +0 -0
  1905. package/web/app/site/sengi/assets/emoji/64/1f476-1f3fc.png +0 -0
  1906. package/web/app/site/sengi/assets/emoji/64/1f476-1f3fd.png +0 -0
  1907. package/web/app/site/sengi/assets/emoji/64/1f476-1f3fe.png +0 -0
  1908. package/web/app/site/sengi/assets/emoji/64/1f476-1f3ff.png +0 -0
  1909. package/web/app/site/sengi/assets/emoji/64/1f476.png +0 -0
  1910. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fb-2640.png +0 -0
  1911. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fb-2642.png +0 -0
  1912. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fb.png +0 -0
  1913. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fc-2640.png +0 -0
  1914. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fc-2642.png +0 -0
  1915. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fc.png +0 -0
  1916. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fd-2640.png +0 -0
  1917. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fd-2642.png +0 -0
  1918. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fd.png +0 -0
  1919. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fe-2640.png +0 -0
  1920. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fe-2642.png +0 -0
  1921. package/web/app/site/sengi/assets/emoji/64/1f477-1f3fe.png +0 -0
  1922. package/web/app/site/sengi/assets/emoji/64/1f477-1f3ff-2640.png +0 -0
  1923. package/web/app/site/sengi/assets/emoji/64/1f477-1f3ff-2642.png +0 -0
  1924. package/web/app/site/sengi/assets/emoji/64/1f477-1f3ff.png +0 -0
  1925. package/web/app/site/sengi/assets/emoji/64/1f477-2640.png +0 -0
  1926. package/web/app/site/sengi/assets/emoji/64/1f477-2642.png +0 -0
  1927. package/web/app/site/sengi/assets/emoji/64/1f477.png +0 -0
  1928. package/web/app/site/sengi/assets/emoji/64/1f478-1f3fb.png +0 -0
  1929. package/web/app/site/sengi/assets/emoji/64/1f478-1f3fc.png +0 -0
  1930. package/web/app/site/sengi/assets/emoji/64/1f478-1f3fd.png +0 -0
  1931. package/web/app/site/sengi/assets/emoji/64/1f478-1f3fe.png +0 -0
  1932. package/web/app/site/sengi/assets/emoji/64/1f478-1f3ff.png +0 -0
  1933. package/web/app/site/sengi/assets/emoji/64/1f478.png +0 -0
  1934. package/web/app/site/sengi/assets/emoji/64/1f479.png +0 -0
  1935. package/web/app/site/sengi/assets/emoji/64/1f47a.png +0 -0
  1936. package/web/app/site/sengi/assets/emoji/64/1f47b.png +0 -0
  1937. package/web/app/site/sengi/assets/emoji/64/1f47c-1f3fb.png +0 -0
  1938. package/web/app/site/sengi/assets/emoji/64/1f47c-1f3fc.png +0 -0
  1939. package/web/app/site/sengi/assets/emoji/64/1f47c-1f3fd.png +0 -0
  1940. package/web/app/site/sengi/assets/emoji/64/1f47c-1f3fe.png +0 -0
  1941. package/web/app/site/sengi/assets/emoji/64/1f47c-1f3ff.png +0 -0
  1942. package/web/app/site/sengi/assets/emoji/64/1f47c.png +0 -0
  1943. package/web/app/site/sengi/assets/emoji/64/1f47d.png +0 -0
  1944. package/web/app/site/sengi/assets/emoji/64/1f47e.png +0 -0
  1945. package/web/app/site/sengi/assets/emoji/64/1f47f.png +0 -0
  1946. package/web/app/site/sengi/assets/emoji/64/1f480.png +0 -0
  1947. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fb-2640.png +0 -0
  1948. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fb-2642.png +0 -0
  1949. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fb.png +0 -0
  1950. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fc-2640.png +0 -0
  1951. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fc-2642.png +0 -0
  1952. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fc.png +0 -0
  1953. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fd-2640.png +0 -0
  1954. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fd-2642.png +0 -0
  1955. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fd.png +0 -0
  1956. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fe-2640.png +0 -0
  1957. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fe-2642.png +0 -0
  1958. package/web/app/site/sengi/assets/emoji/64/1f481-1f3fe.png +0 -0
  1959. package/web/app/site/sengi/assets/emoji/64/1f481-1f3ff-2640.png +0 -0
  1960. package/web/app/site/sengi/assets/emoji/64/1f481-1f3ff-2642.png +0 -0
  1961. package/web/app/site/sengi/assets/emoji/64/1f481-1f3ff.png +0 -0
  1962. package/web/app/site/sengi/assets/emoji/64/1f481-2640.png +0 -0
  1963. package/web/app/site/sengi/assets/emoji/64/1f481-2642.png +0 -0
  1964. package/web/app/site/sengi/assets/emoji/64/1f481.png +0 -0
  1965. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fb-2640.png +0 -0
  1966. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fb-2642.png +0 -0
  1967. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fb.png +0 -0
  1968. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fc-2640.png +0 -0
  1969. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fc-2642.png +0 -0
  1970. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fc.png +0 -0
  1971. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fd-2640.png +0 -0
  1972. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fd-2642.png +0 -0
  1973. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fd.png +0 -0
  1974. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fe-2640.png +0 -0
  1975. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fe-2642.png +0 -0
  1976. package/web/app/site/sengi/assets/emoji/64/1f482-1f3fe.png +0 -0
  1977. package/web/app/site/sengi/assets/emoji/64/1f482-1f3ff-2640.png +0 -0
  1978. package/web/app/site/sengi/assets/emoji/64/1f482-1f3ff-2642.png +0 -0
  1979. package/web/app/site/sengi/assets/emoji/64/1f482-1f3ff.png +0 -0
  1980. package/web/app/site/sengi/assets/emoji/64/1f482-2640.png +0 -0
  1981. package/web/app/site/sengi/assets/emoji/64/1f482-2642.png +0 -0
  1982. package/web/app/site/sengi/assets/emoji/64/1f482.png +0 -0
  1983. package/web/app/site/sengi/assets/emoji/64/1f483-1f3fb.png +0 -0
  1984. package/web/app/site/sengi/assets/emoji/64/1f483-1f3fc.png +0 -0
  1985. package/web/app/site/sengi/assets/emoji/64/1f483-1f3fd.png +0 -0
  1986. package/web/app/site/sengi/assets/emoji/64/1f483-1f3fe.png +0 -0
  1987. package/web/app/site/sengi/assets/emoji/64/1f483-1f3ff.png +0 -0
  1988. package/web/app/site/sengi/assets/emoji/64/1f483.png +0 -0
  1989. package/web/app/site/sengi/assets/emoji/64/1f484.png +0 -0
  1990. package/web/app/site/sengi/assets/emoji/64/1f485-1f3fb.png +0 -0
  1991. package/web/app/site/sengi/assets/emoji/64/1f485-1f3fc.png +0 -0
  1992. package/web/app/site/sengi/assets/emoji/64/1f485-1f3fd.png +0 -0
  1993. package/web/app/site/sengi/assets/emoji/64/1f485-1f3fe.png +0 -0
  1994. package/web/app/site/sengi/assets/emoji/64/1f485-1f3ff.png +0 -0
  1995. package/web/app/site/sengi/assets/emoji/64/1f485.png +0 -0
  1996. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fb-2640.png +0 -0
  1997. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fb-2642.png +0 -0
  1998. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fb.png +0 -0
  1999. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fc-2640.png +0 -0
  2000. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fc-2642.png +0 -0
  2001. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fc.png +0 -0
  2002. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fd-2640.png +0 -0
  2003. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fd-2642.png +0 -0
  2004. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fd.png +0 -0
  2005. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fe-2640.png +0 -0
  2006. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fe-2642.png +0 -0
  2007. package/web/app/site/sengi/assets/emoji/64/1f486-1f3fe.png +0 -0
  2008. package/web/app/site/sengi/assets/emoji/64/1f486-1f3ff-2640.png +0 -0
  2009. package/web/app/site/sengi/assets/emoji/64/1f486-1f3ff-2642.png +0 -0
  2010. package/web/app/site/sengi/assets/emoji/64/1f486-1f3ff.png +0 -0
  2011. package/web/app/site/sengi/assets/emoji/64/1f486-2640.png +0 -0
  2012. package/web/app/site/sengi/assets/emoji/64/1f486-2642.png +0 -0
  2013. package/web/app/site/sengi/assets/emoji/64/1f486.png +0 -0
  2014. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fb-2640.png +0 -0
  2015. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fb-2642.png +0 -0
  2016. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fb.png +0 -0
  2017. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fc-2640.png +0 -0
  2018. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fc-2642.png +0 -0
  2019. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fc.png +0 -0
  2020. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fd-2640.png +0 -0
  2021. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fd-2642.png +0 -0
  2022. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fd.png +0 -0
  2023. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fe-2640.png +0 -0
  2024. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fe-2642.png +0 -0
  2025. package/web/app/site/sengi/assets/emoji/64/1f487-1f3fe.png +0 -0
  2026. package/web/app/site/sengi/assets/emoji/64/1f487-1f3ff-2640.png +0 -0
  2027. package/web/app/site/sengi/assets/emoji/64/1f487-1f3ff-2642.png +0 -0
  2028. package/web/app/site/sengi/assets/emoji/64/1f487-1f3ff.png +0 -0
  2029. package/web/app/site/sengi/assets/emoji/64/1f487-2640.png +0 -0
  2030. package/web/app/site/sengi/assets/emoji/64/1f487-2642.png +0 -0
  2031. package/web/app/site/sengi/assets/emoji/64/1f487.png +0 -0
  2032. package/web/app/site/sengi/assets/emoji/64/1f488.png +0 -0
  2033. package/web/app/site/sengi/assets/emoji/64/1f489.png +0 -0
  2034. package/web/app/site/sengi/assets/emoji/64/1f48a.png +0 -0
  2035. package/web/app/site/sengi/assets/emoji/64/1f48b.png +0 -0
  2036. package/web/app/site/sengi/assets/emoji/64/1f48c.png +0 -0
  2037. package/web/app/site/sengi/assets/emoji/64/1f48d.png +0 -0
  2038. package/web/app/site/sengi/assets/emoji/64/1f48e.png +0 -0
  2039. package/web/app/site/sengi/assets/emoji/64/1f48f-1f3fb.png +0 -0
  2040. package/web/app/site/sengi/assets/emoji/64/1f48f-1f3fc.png +0 -0
  2041. package/web/app/site/sengi/assets/emoji/64/1f48f-1f3fd.png +0 -0
  2042. package/web/app/site/sengi/assets/emoji/64/1f48f-1f3fe.png +0 -0
  2043. package/web/app/site/sengi/assets/emoji/64/1f48f-1f3ff.png +0 -0
  2044. package/web/app/site/sengi/assets/emoji/64/1f48f.png +0 -0
  2045. package/web/app/site/sengi/assets/emoji/64/1f490.png +0 -0
  2046. package/web/app/site/sengi/assets/emoji/64/1f491-1f3fb.png +0 -0
  2047. package/web/app/site/sengi/assets/emoji/64/1f491-1f3fc.png +0 -0
  2048. package/web/app/site/sengi/assets/emoji/64/1f491-1f3fd.png +0 -0
  2049. package/web/app/site/sengi/assets/emoji/64/1f491-1f3fe.png +0 -0
  2050. package/web/app/site/sengi/assets/emoji/64/1f491-1f3ff.png +0 -0
  2051. package/web/app/site/sengi/assets/emoji/64/1f491.png +0 -0
  2052. package/web/app/site/sengi/assets/emoji/64/1f492.png +0 -0
  2053. package/web/app/site/sengi/assets/emoji/64/1f493.png +0 -0
  2054. package/web/app/site/sengi/assets/emoji/64/1f494.png +0 -0
  2055. package/web/app/site/sengi/assets/emoji/64/1f495.png +0 -0
  2056. package/web/app/site/sengi/assets/emoji/64/1f496.png +0 -0
  2057. package/web/app/site/sengi/assets/emoji/64/1f497.png +0 -0
  2058. package/web/app/site/sengi/assets/emoji/64/1f498.png +0 -0
  2059. package/web/app/site/sengi/assets/emoji/64/1f499.png +0 -0
  2060. package/web/app/site/sengi/assets/emoji/64/1f49a.png +0 -0
  2061. package/web/app/site/sengi/assets/emoji/64/1f49b.png +0 -0
  2062. package/web/app/site/sengi/assets/emoji/64/1f49c.png +0 -0
  2063. package/web/app/site/sengi/assets/emoji/64/1f49d.png +0 -0
  2064. package/web/app/site/sengi/assets/emoji/64/1f49e.png +0 -0
  2065. package/web/app/site/sengi/assets/emoji/64/1f49f.png +0 -0
  2066. package/web/app/site/sengi/assets/emoji/64/1f4a0.png +0 -0
  2067. package/web/app/site/sengi/assets/emoji/64/1f4a1.png +0 -0
  2068. package/web/app/site/sengi/assets/emoji/64/1f4a2.png +0 -0
  2069. package/web/app/site/sengi/assets/emoji/64/1f4a3.png +0 -0
  2070. package/web/app/site/sengi/assets/emoji/64/1f4a4.png +0 -0
  2071. package/web/app/site/sengi/assets/emoji/64/1f4a5.png +0 -0
  2072. package/web/app/site/sengi/assets/emoji/64/1f4a6.png +0 -0
  2073. package/web/app/site/sengi/assets/emoji/64/1f4a7.png +0 -0
  2074. package/web/app/site/sengi/assets/emoji/64/1f4a8.png +0 -0
  2075. package/web/app/site/sengi/assets/emoji/64/1f4a9.png +0 -0
  2076. package/web/app/site/sengi/assets/emoji/64/1f4aa-1f3fb.png +0 -0
  2077. package/web/app/site/sengi/assets/emoji/64/1f4aa-1f3fc.png +0 -0
  2078. package/web/app/site/sengi/assets/emoji/64/1f4aa-1f3fd.png +0 -0
  2079. package/web/app/site/sengi/assets/emoji/64/1f4aa-1f3fe.png +0 -0
  2080. package/web/app/site/sengi/assets/emoji/64/1f4aa-1f3ff.png +0 -0
  2081. package/web/app/site/sengi/assets/emoji/64/1f4aa.png +0 -0
  2082. package/web/app/site/sengi/assets/emoji/64/1f4ab.png +0 -0
  2083. package/web/app/site/sengi/assets/emoji/64/1f4ac.png +0 -0
  2084. package/web/app/site/sengi/assets/emoji/64/1f4ad.png +0 -0
  2085. package/web/app/site/sengi/assets/emoji/64/1f4ae.png +0 -0
  2086. package/web/app/site/sengi/assets/emoji/64/1f4af.png +0 -0
  2087. package/web/app/site/sengi/assets/emoji/64/1f4b0.png +0 -0
  2088. package/web/app/site/sengi/assets/emoji/64/1f4b1.png +0 -0
  2089. package/web/app/site/sengi/assets/emoji/64/1f4b2.png +0 -0
  2090. package/web/app/site/sengi/assets/emoji/64/1f4b3.png +0 -0
  2091. package/web/app/site/sengi/assets/emoji/64/1f4b4.png +0 -0
  2092. package/web/app/site/sengi/assets/emoji/64/1f4b5.png +0 -0
  2093. package/web/app/site/sengi/assets/emoji/64/1f4b6.png +0 -0
  2094. package/web/app/site/sengi/assets/emoji/64/1f4b7.png +0 -0
  2095. package/web/app/site/sengi/assets/emoji/64/1f4b8.png +0 -0
  2096. package/web/app/site/sengi/assets/emoji/64/1f4b9.png +0 -0
  2097. package/web/app/site/sengi/assets/emoji/64/1f4ba.png +0 -0
  2098. package/web/app/site/sengi/assets/emoji/64/1f4bb.png +0 -0
  2099. package/web/app/site/sengi/assets/emoji/64/1f4bc.png +0 -0
  2100. package/web/app/site/sengi/assets/emoji/64/1f4bd.png +0 -0
  2101. package/web/app/site/sengi/assets/emoji/64/1f4be.png +0 -0
  2102. package/web/app/site/sengi/assets/emoji/64/1f4bf.png +0 -0
  2103. package/web/app/site/sengi/assets/emoji/64/1f4c0.png +0 -0
  2104. package/web/app/site/sengi/assets/emoji/64/1f4c1.png +0 -0
  2105. package/web/app/site/sengi/assets/emoji/64/1f4c2.png +0 -0
  2106. package/web/app/site/sengi/assets/emoji/64/1f4c3.png +0 -0
  2107. package/web/app/site/sengi/assets/emoji/64/1f4c4.png +0 -0
  2108. package/web/app/site/sengi/assets/emoji/64/1f4c5.png +0 -0
  2109. package/web/app/site/sengi/assets/emoji/64/1f4c6.png +0 -0
  2110. package/web/app/site/sengi/assets/emoji/64/1f4c7.png +0 -0
  2111. package/web/app/site/sengi/assets/emoji/64/1f4c8.png +0 -0
  2112. package/web/app/site/sengi/assets/emoji/64/1f4c9.png +0 -0
  2113. package/web/app/site/sengi/assets/emoji/64/1f4ca.png +0 -0
  2114. package/web/app/site/sengi/assets/emoji/64/1f4cb.png +0 -0
  2115. package/web/app/site/sengi/assets/emoji/64/1f4cc.png +0 -0
  2116. package/web/app/site/sengi/assets/emoji/64/1f4cd.png +0 -0
  2117. package/web/app/site/sengi/assets/emoji/64/1f4ce.png +0 -0
  2118. package/web/app/site/sengi/assets/emoji/64/1f4cf.png +0 -0
  2119. package/web/app/site/sengi/assets/emoji/64/1f4d0.png +0 -0
  2120. package/web/app/site/sengi/assets/emoji/64/1f4d1.png +0 -0
  2121. package/web/app/site/sengi/assets/emoji/64/1f4d2.png +0 -0
  2122. package/web/app/site/sengi/assets/emoji/64/1f4d3.png +0 -0
  2123. package/web/app/site/sengi/assets/emoji/64/1f4d4.png +0 -0
  2124. package/web/app/site/sengi/assets/emoji/64/1f4d5.png +0 -0
  2125. package/web/app/site/sengi/assets/emoji/64/1f4d6.png +0 -0
  2126. package/web/app/site/sengi/assets/emoji/64/1f4d7.png +0 -0
  2127. package/web/app/site/sengi/assets/emoji/64/1f4d8.png +0 -0
  2128. package/web/app/site/sengi/assets/emoji/64/1f4d9.png +0 -0
  2129. package/web/app/site/sengi/assets/emoji/64/1f4da.png +0 -0
  2130. package/web/app/site/sengi/assets/emoji/64/1f4db.png +0 -0
  2131. package/web/app/site/sengi/assets/emoji/64/1f4dc.png +0 -0
  2132. package/web/app/site/sengi/assets/emoji/64/1f4dd.png +0 -0
  2133. package/web/app/site/sengi/assets/emoji/64/1f4de.png +0 -0
  2134. package/web/app/site/sengi/assets/emoji/64/1f4df.png +0 -0
  2135. package/web/app/site/sengi/assets/emoji/64/1f4e0.png +0 -0
  2136. package/web/app/site/sengi/assets/emoji/64/1f4e1.png +0 -0
  2137. package/web/app/site/sengi/assets/emoji/64/1f4e2.png +0 -0
  2138. package/web/app/site/sengi/assets/emoji/64/1f4e3.png +0 -0
  2139. package/web/app/site/sengi/assets/emoji/64/1f4e4.png +0 -0
  2140. package/web/app/site/sengi/assets/emoji/64/1f4e5.png +0 -0
  2141. package/web/app/site/sengi/assets/emoji/64/1f4e6.png +0 -0
  2142. package/web/app/site/sengi/assets/emoji/64/1f4e7.png +0 -0
  2143. package/web/app/site/sengi/assets/emoji/64/1f4e8.png +0 -0
  2144. package/web/app/site/sengi/assets/emoji/64/1f4e9.png +0 -0
  2145. package/web/app/site/sengi/assets/emoji/64/1f4ea.png +0 -0
  2146. package/web/app/site/sengi/assets/emoji/64/1f4eb.png +0 -0
  2147. package/web/app/site/sengi/assets/emoji/64/1f4ec.png +0 -0
  2148. package/web/app/site/sengi/assets/emoji/64/1f4ed.png +0 -0
  2149. package/web/app/site/sengi/assets/emoji/64/1f4ee.png +0 -0
  2150. package/web/app/site/sengi/assets/emoji/64/1f4ef.png +0 -0
  2151. package/web/app/site/sengi/assets/emoji/64/1f4f0.png +0 -0
  2152. package/web/app/site/sengi/assets/emoji/64/1f4f1.png +0 -0
  2153. package/web/app/site/sengi/assets/emoji/64/1f4f2.png +0 -0
  2154. package/web/app/site/sengi/assets/emoji/64/1f4f3.png +0 -0
  2155. package/web/app/site/sengi/assets/emoji/64/1f4f4.png +0 -0
  2156. package/web/app/site/sengi/assets/emoji/64/1f4f5.png +0 -0
  2157. package/web/app/site/sengi/assets/emoji/64/1f4f6.png +0 -0
  2158. package/web/app/site/sengi/assets/emoji/64/1f4f7.png +0 -0
  2159. package/web/app/site/sengi/assets/emoji/64/1f4f8.png +0 -0
  2160. package/web/app/site/sengi/assets/emoji/64/1f4f9.png +0 -0
  2161. package/web/app/site/sengi/assets/emoji/64/1f4fa.png +0 -0
  2162. package/web/app/site/sengi/assets/emoji/64/1f4fb.png +0 -0
  2163. package/web/app/site/sengi/assets/emoji/64/1f4fc.png +0 -0
  2164. package/web/app/site/sengi/assets/emoji/64/1f4fd.png +0 -0
  2165. package/web/app/site/sengi/assets/emoji/64/1f4ff.png +0 -0
  2166. package/web/app/site/sengi/assets/emoji/64/1f500.png +0 -0
  2167. package/web/app/site/sengi/assets/emoji/64/1f501.png +0 -0
  2168. package/web/app/site/sengi/assets/emoji/64/1f502.png +0 -0
  2169. package/web/app/site/sengi/assets/emoji/64/1f503.png +0 -0
  2170. package/web/app/site/sengi/assets/emoji/64/1f504.png +0 -0
  2171. package/web/app/site/sengi/assets/emoji/64/1f505.png +0 -0
  2172. package/web/app/site/sengi/assets/emoji/64/1f506.png +0 -0
  2173. package/web/app/site/sengi/assets/emoji/64/1f507.png +0 -0
  2174. package/web/app/site/sengi/assets/emoji/64/1f508.png +0 -0
  2175. package/web/app/site/sengi/assets/emoji/64/1f509.png +0 -0
  2176. package/web/app/site/sengi/assets/emoji/64/1f50a.png +0 -0
  2177. package/web/app/site/sengi/assets/emoji/64/1f50b.png +0 -0
  2178. package/web/app/site/sengi/assets/emoji/64/1f50c.png +0 -0
  2179. package/web/app/site/sengi/assets/emoji/64/1f50d.png +0 -0
  2180. package/web/app/site/sengi/assets/emoji/64/1f50e.png +0 -0
  2181. package/web/app/site/sengi/assets/emoji/64/1f50f.png +0 -0
  2182. package/web/app/site/sengi/assets/emoji/64/1f510.png +0 -0
  2183. package/web/app/site/sengi/assets/emoji/64/1f511.png +0 -0
  2184. package/web/app/site/sengi/assets/emoji/64/1f512.png +0 -0
  2185. package/web/app/site/sengi/assets/emoji/64/1f513.png +0 -0
  2186. package/web/app/site/sengi/assets/emoji/64/1f514.png +0 -0
  2187. package/web/app/site/sengi/assets/emoji/64/1f515.png +0 -0
  2188. package/web/app/site/sengi/assets/emoji/64/1f516.png +0 -0
  2189. package/web/app/site/sengi/assets/emoji/64/1f517.png +0 -0
  2190. package/web/app/site/sengi/assets/emoji/64/1f518.png +0 -0
  2191. package/web/app/site/sengi/assets/emoji/64/1f519.png +0 -0
  2192. package/web/app/site/sengi/assets/emoji/64/1f51a.png +0 -0
  2193. package/web/app/site/sengi/assets/emoji/64/1f51b.png +0 -0
  2194. package/web/app/site/sengi/assets/emoji/64/1f51c.png +0 -0
  2195. package/web/app/site/sengi/assets/emoji/64/1f51d.png +0 -0
  2196. package/web/app/site/sengi/assets/emoji/64/1f51e.png +0 -0
  2197. package/web/app/site/sengi/assets/emoji/64/1f51f.png +0 -0
  2198. package/web/app/site/sengi/assets/emoji/64/1f520.png +0 -0
  2199. package/web/app/site/sengi/assets/emoji/64/1f521.png +0 -0
  2200. package/web/app/site/sengi/assets/emoji/64/1f522.png +0 -0
  2201. package/web/app/site/sengi/assets/emoji/64/1f523.png +0 -0
  2202. package/web/app/site/sengi/assets/emoji/64/1f524.png +0 -0
  2203. package/web/app/site/sengi/assets/emoji/64/1f525.png +0 -0
  2204. package/web/app/site/sengi/assets/emoji/64/1f526.png +0 -0
  2205. package/web/app/site/sengi/assets/emoji/64/1f527.png +0 -0
  2206. package/web/app/site/sengi/assets/emoji/64/1f528.png +0 -0
  2207. package/web/app/site/sengi/assets/emoji/64/1f529.png +0 -0
  2208. package/web/app/site/sengi/assets/emoji/64/1f52a.png +0 -0
  2209. package/web/app/site/sengi/assets/emoji/64/1f52b.png +0 -0
  2210. package/web/app/site/sengi/assets/emoji/64/1f52c.png +0 -0
  2211. package/web/app/site/sengi/assets/emoji/64/1f52d.png +0 -0
  2212. package/web/app/site/sengi/assets/emoji/64/1f52e.png +0 -0
  2213. package/web/app/site/sengi/assets/emoji/64/1f52f.png +0 -0
  2214. package/web/app/site/sengi/assets/emoji/64/1f530.png +0 -0
  2215. package/web/app/site/sengi/assets/emoji/64/1f531.png +0 -0
  2216. package/web/app/site/sengi/assets/emoji/64/1f532.png +0 -0
  2217. package/web/app/site/sengi/assets/emoji/64/1f533.png +0 -0
  2218. package/web/app/site/sengi/assets/emoji/64/1f534.png +0 -0
  2219. package/web/app/site/sengi/assets/emoji/64/1f535.png +0 -0
  2220. package/web/app/site/sengi/assets/emoji/64/1f536.png +0 -0
  2221. package/web/app/site/sengi/assets/emoji/64/1f537.png +0 -0
  2222. package/web/app/site/sengi/assets/emoji/64/1f538.png +0 -0
  2223. package/web/app/site/sengi/assets/emoji/64/1f539.png +0 -0
  2224. package/web/app/site/sengi/assets/emoji/64/1f53a.png +0 -0
  2225. package/web/app/site/sengi/assets/emoji/64/1f53b.png +0 -0
  2226. package/web/app/site/sengi/assets/emoji/64/1f53c.png +0 -0
  2227. package/web/app/site/sengi/assets/emoji/64/1f53d.png +0 -0
  2228. package/web/app/site/sengi/assets/emoji/64/1f549.png +0 -0
  2229. package/web/app/site/sengi/assets/emoji/64/1f54a.png +0 -0
  2230. package/web/app/site/sengi/assets/emoji/64/1f54b.png +0 -0
  2231. package/web/app/site/sengi/assets/emoji/64/1f54c.png +0 -0
  2232. package/web/app/site/sengi/assets/emoji/64/1f54d.png +0 -0
  2233. package/web/app/site/sengi/assets/emoji/64/1f54e.png +0 -0
  2234. package/web/app/site/sengi/assets/emoji/64/1f550.png +0 -0
  2235. package/web/app/site/sengi/assets/emoji/64/1f551.png +0 -0
  2236. package/web/app/site/sengi/assets/emoji/64/1f552.png +0 -0
  2237. package/web/app/site/sengi/assets/emoji/64/1f553.png +0 -0
  2238. package/web/app/site/sengi/assets/emoji/64/1f554.png +0 -0
  2239. package/web/app/site/sengi/assets/emoji/64/1f555.png +0 -0
  2240. package/web/app/site/sengi/assets/emoji/64/1f556.png +0 -0
  2241. package/web/app/site/sengi/assets/emoji/64/1f557.png +0 -0
  2242. package/web/app/site/sengi/assets/emoji/64/1f558.png +0 -0
  2243. package/web/app/site/sengi/assets/emoji/64/1f559.png +0 -0
  2244. package/web/app/site/sengi/assets/emoji/64/1f55a.png +0 -0
  2245. package/web/app/site/sengi/assets/emoji/64/1f55b.png +0 -0
  2246. package/web/app/site/sengi/assets/emoji/64/1f55c.png +0 -0
  2247. package/web/app/site/sengi/assets/emoji/64/1f55d.png +0 -0
  2248. package/web/app/site/sengi/assets/emoji/64/1f55e.png +0 -0
  2249. package/web/app/site/sengi/assets/emoji/64/1f55f.png +0 -0
  2250. package/web/app/site/sengi/assets/emoji/64/1f560.png +0 -0
  2251. package/web/app/site/sengi/assets/emoji/64/1f561.png +0 -0
  2252. package/web/app/site/sengi/assets/emoji/64/1f562.png +0 -0
  2253. package/web/app/site/sengi/assets/emoji/64/1f563.png +0 -0
  2254. package/web/app/site/sengi/assets/emoji/64/1f564.png +0 -0
  2255. package/web/app/site/sengi/assets/emoji/64/1f565.png +0 -0
  2256. package/web/app/site/sengi/assets/emoji/64/1f566.png +0 -0
  2257. package/web/app/site/sengi/assets/emoji/64/1f567.png +0 -0
  2258. package/web/app/site/sengi/assets/emoji/64/1f56f.png +0 -0
  2259. package/web/app/site/sengi/assets/emoji/64/1f570.png +0 -0
  2260. package/web/app/site/sengi/assets/emoji/64/1f573.png +0 -0
  2261. package/web/app/site/sengi/assets/emoji/64/1f574-1f3fb.png +0 -0
  2262. package/web/app/site/sengi/assets/emoji/64/1f574-1f3fc.png +0 -0
  2263. package/web/app/site/sengi/assets/emoji/64/1f574-1f3fd.png +0 -0
  2264. package/web/app/site/sengi/assets/emoji/64/1f574-1f3fe.png +0 -0
  2265. package/web/app/site/sengi/assets/emoji/64/1f574-1f3ff.png +0 -0
  2266. package/web/app/site/sengi/assets/emoji/64/1f574.png +0 -0
  2267. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fb-2640.png +0 -0
  2268. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fb-2642.png +0 -0
  2269. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fb.png +0 -0
  2270. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fc-2640.png +0 -0
  2271. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fc-2642.png +0 -0
  2272. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fc.png +0 -0
  2273. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fd-2640.png +0 -0
  2274. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fd-2642.png +0 -0
  2275. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fd.png +0 -0
  2276. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fe-2640.png +0 -0
  2277. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fe-2642.png +0 -0
  2278. package/web/app/site/sengi/assets/emoji/64/1f575-1f3fe.png +0 -0
  2279. package/web/app/site/sengi/assets/emoji/64/1f575-1f3ff-2640.png +0 -0
  2280. package/web/app/site/sengi/assets/emoji/64/1f575-1f3ff-2642.png +0 -0
  2281. package/web/app/site/sengi/assets/emoji/64/1f575-1f3ff.png +0 -0
  2282. package/web/app/site/sengi/assets/emoji/64/1f575-2640.png +0 -0
  2283. package/web/app/site/sengi/assets/emoji/64/1f575-2642.png +0 -0
  2284. package/web/app/site/sengi/assets/emoji/64/1f575.png +0 -0
  2285. package/web/app/site/sengi/assets/emoji/64/1f576.png +0 -0
  2286. package/web/app/site/sengi/assets/emoji/64/1f577.png +0 -0
  2287. package/web/app/site/sengi/assets/emoji/64/1f578.png +0 -0
  2288. package/web/app/site/sengi/assets/emoji/64/1f579.png +0 -0
  2289. package/web/app/site/sengi/assets/emoji/64/1f57a-1f3fb.png +0 -0
  2290. package/web/app/site/sengi/assets/emoji/64/1f57a-1f3fc.png +0 -0
  2291. package/web/app/site/sengi/assets/emoji/64/1f57a-1f3fd.png +0 -0
  2292. package/web/app/site/sengi/assets/emoji/64/1f57a-1f3fe.png +0 -0
  2293. package/web/app/site/sengi/assets/emoji/64/1f57a-1f3ff.png +0 -0
  2294. package/web/app/site/sengi/assets/emoji/64/1f57a.png +0 -0
  2295. package/web/app/site/sengi/assets/emoji/64/1f587.png +0 -0
  2296. package/web/app/site/sengi/assets/emoji/64/1f58a.png +0 -0
  2297. package/web/app/site/sengi/assets/emoji/64/1f58b.png +0 -0
  2298. package/web/app/site/sengi/assets/emoji/64/1f58c.png +0 -0
  2299. package/web/app/site/sengi/assets/emoji/64/1f58d.png +0 -0
  2300. package/web/app/site/sengi/assets/emoji/64/1f590-1f3fb.png +0 -0
  2301. package/web/app/site/sengi/assets/emoji/64/1f590-1f3fc.png +0 -0
  2302. package/web/app/site/sengi/assets/emoji/64/1f590-1f3fd.png +0 -0
  2303. package/web/app/site/sengi/assets/emoji/64/1f590-1f3fe.png +0 -0
  2304. package/web/app/site/sengi/assets/emoji/64/1f590-1f3ff.png +0 -0
  2305. package/web/app/site/sengi/assets/emoji/64/1f590.png +0 -0
  2306. package/web/app/site/sengi/assets/emoji/64/1f595-1f3fb.png +0 -0
  2307. package/web/app/site/sengi/assets/emoji/64/1f595-1f3fc.png +0 -0
  2308. package/web/app/site/sengi/assets/emoji/64/1f595-1f3fd.png +0 -0
  2309. package/web/app/site/sengi/assets/emoji/64/1f595-1f3fe.png +0 -0
  2310. package/web/app/site/sengi/assets/emoji/64/1f595-1f3ff.png +0 -0
  2311. package/web/app/site/sengi/assets/emoji/64/1f595.png +0 -0
  2312. package/web/app/site/sengi/assets/emoji/64/1f596-1f3fb.png +0 -0
  2313. package/web/app/site/sengi/assets/emoji/64/1f596-1f3fc.png +0 -0
  2314. package/web/app/site/sengi/assets/emoji/64/1f596-1f3fd.png +0 -0
  2315. package/web/app/site/sengi/assets/emoji/64/1f596-1f3fe.png +0 -0
  2316. package/web/app/site/sengi/assets/emoji/64/1f596-1f3ff.png +0 -0
  2317. package/web/app/site/sengi/assets/emoji/64/1f596.png +0 -0
  2318. package/web/app/site/sengi/assets/emoji/64/1f5a4.png +0 -0
  2319. package/web/app/site/sengi/assets/emoji/64/1f5a5.png +0 -0
  2320. package/web/app/site/sengi/assets/emoji/64/1f5a8.png +0 -0
  2321. package/web/app/site/sengi/assets/emoji/64/1f5b1.png +0 -0
  2322. package/web/app/site/sengi/assets/emoji/64/1f5b2.png +0 -0
  2323. package/web/app/site/sengi/assets/emoji/64/1f5bc.png +0 -0
  2324. package/web/app/site/sengi/assets/emoji/64/1f5c2.png +0 -0
  2325. package/web/app/site/sengi/assets/emoji/64/1f5c3.png +0 -0
  2326. package/web/app/site/sengi/assets/emoji/64/1f5c4.png +0 -0
  2327. package/web/app/site/sengi/assets/emoji/64/1f5d1.png +0 -0
  2328. package/web/app/site/sengi/assets/emoji/64/1f5d2.png +0 -0
  2329. package/web/app/site/sengi/assets/emoji/64/1f5d3.png +0 -0
  2330. package/web/app/site/sengi/assets/emoji/64/1f5dc.png +0 -0
  2331. package/web/app/site/sengi/assets/emoji/64/1f5dd.png +0 -0
  2332. package/web/app/site/sengi/assets/emoji/64/1f5de.png +0 -0
  2333. package/web/app/site/sengi/assets/emoji/64/1f5e1.png +0 -0
  2334. package/web/app/site/sengi/assets/emoji/64/1f5e3.png +0 -0
  2335. package/web/app/site/sengi/assets/emoji/64/1f5e8.png +0 -0
  2336. package/web/app/site/sengi/assets/emoji/64/1f5ef.png +0 -0
  2337. package/web/app/site/sengi/assets/emoji/64/1f5f3.png +0 -0
  2338. package/web/app/site/sengi/assets/emoji/64/1f5fa.png +0 -0
  2339. package/web/app/site/sengi/assets/emoji/64/1f5fb.png +0 -0
  2340. package/web/app/site/sengi/assets/emoji/64/1f5fc.png +0 -0
  2341. package/web/app/site/sengi/assets/emoji/64/1f5fd.png +0 -0
  2342. package/web/app/site/sengi/assets/emoji/64/1f5fe.png +0 -0
  2343. package/web/app/site/sengi/assets/emoji/64/1f5ff.png +0 -0
  2344. package/web/app/site/sengi/assets/emoji/64/1f600.png +0 -0
  2345. package/web/app/site/sengi/assets/emoji/64/1f601.png +0 -0
  2346. package/web/app/site/sengi/assets/emoji/64/1f602.png +0 -0
  2347. package/web/app/site/sengi/assets/emoji/64/1f603.png +0 -0
  2348. package/web/app/site/sengi/assets/emoji/64/1f604.png +0 -0
  2349. package/web/app/site/sengi/assets/emoji/64/1f605.png +0 -0
  2350. package/web/app/site/sengi/assets/emoji/64/1f606.png +0 -0
  2351. package/web/app/site/sengi/assets/emoji/64/1f607.png +0 -0
  2352. package/web/app/site/sengi/assets/emoji/64/1f608.png +0 -0
  2353. package/web/app/site/sengi/assets/emoji/64/1f609.png +0 -0
  2354. package/web/app/site/sengi/assets/emoji/64/1f60a.png +0 -0
  2355. package/web/app/site/sengi/assets/emoji/64/1f60b.png +0 -0
  2356. package/web/app/site/sengi/assets/emoji/64/1f60c.png +0 -0
  2357. package/web/app/site/sengi/assets/emoji/64/1f60d.png +0 -0
  2358. package/web/app/site/sengi/assets/emoji/64/1f60e.png +0 -0
  2359. package/web/app/site/sengi/assets/emoji/64/1f60f.png +0 -0
  2360. package/web/app/site/sengi/assets/emoji/64/1f610.png +0 -0
  2361. package/web/app/site/sengi/assets/emoji/64/1f611.png +0 -0
  2362. package/web/app/site/sengi/assets/emoji/64/1f612.png +0 -0
  2363. package/web/app/site/sengi/assets/emoji/64/1f613.png +0 -0
  2364. package/web/app/site/sengi/assets/emoji/64/1f614.png +0 -0
  2365. package/web/app/site/sengi/assets/emoji/64/1f615.png +0 -0
  2366. package/web/app/site/sengi/assets/emoji/64/1f616.png +0 -0
  2367. package/web/app/site/sengi/assets/emoji/64/1f617.png +0 -0
  2368. package/web/app/site/sengi/assets/emoji/64/1f618.png +0 -0
  2369. package/web/app/site/sengi/assets/emoji/64/1f619.png +0 -0
  2370. package/web/app/site/sengi/assets/emoji/64/1f61a.png +0 -0
  2371. package/web/app/site/sengi/assets/emoji/64/1f61b.png +0 -0
  2372. package/web/app/site/sengi/assets/emoji/64/1f61c.png +0 -0
  2373. package/web/app/site/sengi/assets/emoji/64/1f61d.png +0 -0
  2374. package/web/app/site/sengi/assets/emoji/64/1f61e.png +0 -0
  2375. package/web/app/site/sengi/assets/emoji/64/1f61f.png +0 -0
  2376. package/web/app/site/sengi/assets/emoji/64/1f620.png +0 -0
  2377. package/web/app/site/sengi/assets/emoji/64/1f621.png +0 -0
  2378. package/web/app/site/sengi/assets/emoji/64/1f622.png +0 -0
  2379. package/web/app/site/sengi/assets/emoji/64/1f623.png +0 -0
  2380. package/web/app/site/sengi/assets/emoji/64/1f624.png +0 -0
  2381. package/web/app/site/sengi/assets/emoji/64/1f625.png +0 -0
  2382. package/web/app/site/sengi/assets/emoji/64/1f626.png +0 -0
  2383. package/web/app/site/sengi/assets/emoji/64/1f627.png +0 -0
  2384. package/web/app/site/sengi/assets/emoji/64/1f628.png +0 -0
  2385. package/web/app/site/sengi/assets/emoji/64/1f629.png +0 -0
  2386. package/web/app/site/sengi/assets/emoji/64/1f62a.png +0 -0
  2387. package/web/app/site/sengi/assets/emoji/64/1f62b.png +0 -0
  2388. package/web/app/site/sengi/assets/emoji/64/1f62c.png +0 -0
  2389. package/web/app/site/sengi/assets/emoji/64/1f62d.png +0 -0
  2390. package/web/app/site/sengi/assets/emoji/64/1f62e-1f4a8.png +0 -0
  2391. package/web/app/site/sengi/assets/emoji/64/1f62e.png +0 -0
  2392. package/web/app/site/sengi/assets/emoji/64/1f62f.png +0 -0
  2393. package/web/app/site/sengi/assets/emoji/64/1f630.png +0 -0
  2394. package/web/app/site/sengi/assets/emoji/64/1f631.png +0 -0
  2395. package/web/app/site/sengi/assets/emoji/64/1f632.png +0 -0
  2396. package/web/app/site/sengi/assets/emoji/64/1f633.png +0 -0
  2397. package/web/app/site/sengi/assets/emoji/64/1f634.png +0 -0
  2398. package/web/app/site/sengi/assets/emoji/64/1f635-1f4ab.png +0 -0
  2399. package/web/app/site/sengi/assets/emoji/64/1f635.png +0 -0
  2400. package/web/app/site/sengi/assets/emoji/64/1f636-1f32b.png +0 -0
  2401. package/web/app/site/sengi/assets/emoji/64/1f636.png +0 -0
  2402. package/web/app/site/sengi/assets/emoji/64/1f637.png +0 -0
  2403. package/web/app/site/sengi/assets/emoji/64/1f638.png +0 -0
  2404. package/web/app/site/sengi/assets/emoji/64/1f639.png +0 -0
  2405. package/web/app/site/sengi/assets/emoji/64/1f63a.png +0 -0
  2406. package/web/app/site/sengi/assets/emoji/64/1f63b.png +0 -0
  2407. package/web/app/site/sengi/assets/emoji/64/1f63c.png +0 -0
  2408. package/web/app/site/sengi/assets/emoji/64/1f63d.png +0 -0
  2409. package/web/app/site/sengi/assets/emoji/64/1f63e.png +0 -0
  2410. package/web/app/site/sengi/assets/emoji/64/1f63f.png +0 -0
  2411. package/web/app/site/sengi/assets/emoji/64/1f640.png +0 -0
  2412. package/web/app/site/sengi/assets/emoji/64/1f641.png +0 -0
  2413. package/web/app/site/sengi/assets/emoji/64/1f642-2194.png +0 -0
  2414. package/web/app/site/sengi/assets/emoji/64/1f642-2195.png +0 -0
  2415. package/web/app/site/sengi/assets/emoji/64/1f642.png +0 -0
  2416. package/web/app/site/sengi/assets/emoji/64/1f643.png +0 -0
  2417. package/web/app/site/sengi/assets/emoji/64/1f644.png +0 -0
  2418. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fb-2640.png +0 -0
  2419. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fb-2642.png +0 -0
  2420. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fb.png +0 -0
  2421. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fc-2640.png +0 -0
  2422. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fc-2642.png +0 -0
  2423. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fc.png +0 -0
  2424. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fd-2640.png +0 -0
  2425. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fd-2642.png +0 -0
  2426. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fd.png +0 -0
  2427. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fe-2640.png +0 -0
  2428. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fe-2642.png +0 -0
  2429. package/web/app/site/sengi/assets/emoji/64/1f645-1f3fe.png +0 -0
  2430. package/web/app/site/sengi/assets/emoji/64/1f645-1f3ff-2640.png +0 -0
  2431. package/web/app/site/sengi/assets/emoji/64/1f645-1f3ff-2642.png +0 -0
  2432. package/web/app/site/sengi/assets/emoji/64/1f645-1f3ff.png +0 -0
  2433. package/web/app/site/sengi/assets/emoji/64/1f645-2640.png +0 -0
  2434. package/web/app/site/sengi/assets/emoji/64/1f645-2642.png +0 -0
  2435. package/web/app/site/sengi/assets/emoji/64/1f645.png +0 -0
  2436. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fb-2640.png +0 -0
  2437. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fb-2642.png +0 -0
  2438. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fb.png +0 -0
  2439. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fc-2640.png +0 -0
  2440. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fc-2642.png +0 -0
  2441. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fc.png +0 -0
  2442. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fd-2640.png +0 -0
  2443. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fd-2642.png +0 -0
  2444. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fd.png +0 -0
  2445. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fe-2640.png +0 -0
  2446. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fe-2642.png +0 -0
  2447. package/web/app/site/sengi/assets/emoji/64/1f646-1f3fe.png +0 -0
  2448. package/web/app/site/sengi/assets/emoji/64/1f646-1f3ff-2640.png +0 -0
  2449. package/web/app/site/sengi/assets/emoji/64/1f646-1f3ff-2642.png +0 -0
  2450. package/web/app/site/sengi/assets/emoji/64/1f646-1f3ff.png +0 -0
  2451. package/web/app/site/sengi/assets/emoji/64/1f646-2640.png +0 -0
  2452. package/web/app/site/sengi/assets/emoji/64/1f646-2642.png +0 -0
  2453. package/web/app/site/sengi/assets/emoji/64/1f646.png +0 -0
  2454. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fb-2640.png +0 -0
  2455. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fb-2642.png +0 -0
  2456. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fb.png +0 -0
  2457. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fc-2640.png +0 -0
  2458. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fc-2642.png +0 -0
  2459. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fc.png +0 -0
  2460. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fd-2640.png +0 -0
  2461. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fd-2642.png +0 -0
  2462. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fd.png +0 -0
  2463. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fe-2640.png +0 -0
  2464. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fe-2642.png +0 -0
  2465. package/web/app/site/sengi/assets/emoji/64/1f647-1f3fe.png +0 -0
  2466. package/web/app/site/sengi/assets/emoji/64/1f647-1f3ff-2640.png +0 -0
  2467. package/web/app/site/sengi/assets/emoji/64/1f647-1f3ff-2642.png +0 -0
  2468. package/web/app/site/sengi/assets/emoji/64/1f647-1f3ff.png +0 -0
  2469. package/web/app/site/sengi/assets/emoji/64/1f647-2640.png +0 -0
  2470. package/web/app/site/sengi/assets/emoji/64/1f647-2642.png +0 -0
  2471. package/web/app/site/sengi/assets/emoji/64/1f647.png +0 -0
  2472. package/web/app/site/sengi/assets/emoji/64/1f648.png +0 -0
  2473. package/web/app/site/sengi/assets/emoji/64/1f649.png +0 -0
  2474. package/web/app/site/sengi/assets/emoji/64/1f64a.png +0 -0
  2475. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fb-2640.png +0 -0
  2476. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fb-2642.png +0 -0
  2477. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fb.png +0 -0
  2478. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fc-2640.png +0 -0
  2479. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fc-2642.png +0 -0
  2480. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fc.png +0 -0
  2481. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fd-2640.png +0 -0
  2482. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fd-2642.png +0 -0
  2483. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fd.png +0 -0
  2484. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fe-2640.png +0 -0
  2485. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fe-2642.png +0 -0
  2486. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3fe.png +0 -0
  2487. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3ff-2640.png +0 -0
  2488. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3ff-2642.png +0 -0
  2489. package/web/app/site/sengi/assets/emoji/64/1f64b-1f3ff.png +0 -0
  2490. package/web/app/site/sengi/assets/emoji/64/1f64b-2640.png +0 -0
  2491. package/web/app/site/sengi/assets/emoji/64/1f64b-2642.png +0 -0
  2492. package/web/app/site/sengi/assets/emoji/64/1f64b.png +0 -0
  2493. package/web/app/site/sengi/assets/emoji/64/1f64c-1f3fb.png +0 -0
  2494. package/web/app/site/sengi/assets/emoji/64/1f64c-1f3fc.png +0 -0
  2495. package/web/app/site/sengi/assets/emoji/64/1f64c-1f3fd.png +0 -0
  2496. package/web/app/site/sengi/assets/emoji/64/1f64c-1f3fe.png +0 -0
  2497. package/web/app/site/sengi/assets/emoji/64/1f64c-1f3ff.png +0 -0
  2498. package/web/app/site/sengi/assets/emoji/64/1f64c.png +0 -0
  2499. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fb-2640.png +0 -0
  2500. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fb-2642.png +0 -0
  2501. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fb.png +0 -0
  2502. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fc-2640.png +0 -0
  2503. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fc-2642.png +0 -0
  2504. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fc.png +0 -0
  2505. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fd-2640.png +0 -0
  2506. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fd-2642.png +0 -0
  2507. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fd.png +0 -0
  2508. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fe-2640.png +0 -0
  2509. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fe-2642.png +0 -0
  2510. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3fe.png +0 -0
  2511. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3ff-2640.png +0 -0
  2512. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3ff-2642.png +0 -0
  2513. package/web/app/site/sengi/assets/emoji/64/1f64d-1f3ff.png +0 -0
  2514. package/web/app/site/sengi/assets/emoji/64/1f64d-2640.png +0 -0
  2515. package/web/app/site/sengi/assets/emoji/64/1f64d-2642.png +0 -0
  2516. package/web/app/site/sengi/assets/emoji/64/1f64d.png +0 -0
  2517. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fb-2640.png +0 -0
  2518. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fb-2642.png +0 -0
  2519. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fb.png +0 -0
  2520. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fc-2640.png +0 -0
  2521. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fc-2642.png +0 -0
  2522. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fc.png +0 -0
  2523. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fd-2640.png +0 -0
  2524. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fd-2642.png +0 -0
  2525. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fd.png +0 -0
  2526. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fe-2640.png +0 -0
  2527. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fe-2642.png +0 -0
  2528. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3fe.png +0 -0
  2529. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3ff-2640.png +0 -0
  2530. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3ff-2642.png +0 -0
  2531. package/web/app/site/sengi/assets/emoji/64/1f64e-1f3ff.png +0 -0
  2532. package/web/app/site/sengi/assets/emoji/64/1f64e-2640.png +0 -0
  2533. package/web/app/site/sengi/assets/emoji/64/1f64e-2642.png +0 -0
  2534. package/web/app/site/sengi/assets/emoji/64/1f64e.png +0 -0
  2535. package/web/app/site/sengi/assets/emoji/64/1f64f-1f3fb.png +0 -0
  2536. package/web/app/site/sengi/assets/emoji/64/1f64f-1f3fc.png +0 -0
  2537. package/web/app/site/sengi/assets/emoji/64/1f64f-1f3fd.png +0 -0
  2538. package/web/app/site/sengi/assets/emoji/64/1f64f-1f3fe.png +0 -0
  2539. package/web/app/site/sengi/assets/emoji/64/1f64f-1f3ff.png +0 -0
  2540. package/web/app/site/sengi/assets/emoji/64/1f64f.png +0 -0
  2541. package/web/app/site/sengi/assets/emoji/64/1f680.png +0 -0
  2542. package/web/app/site/sengi/assets/emoji/64/1f681.png +0 -0
  2543. package/web/app/site/sengi/assets/emoji/64/1f682.png +0 -0
  2544. package/web/app/site/sengi/assets/emoji/64/1f683.png +0 -0
  2545. package/web/app/site/sengi/assets/emoji/64/1f684.png +0 -0
  2546. package/web/app/site/sengi/assets/emoji/64/1f685.png +0 -0
  2547. package/web/app/site/sengi/assets/emoji/64/1f686.png +0 -0
  2548. package/web/app/site/sengi/assets/emoji/64/1f687.png +0 -0
  2549. package/web/app/site/sengi/assets/emoji/64/1f688.png +0 -0
  2550. package/web/app/site/sengi/assets/emoji/64/1f689.png +0 -0
  2551. package/web/app/site/sengi/assets/emoji/64/1f68a.png +0 -0
  2552. package/web/app/site/sengi/assets/emoji/64/1f68b.png +0 -0
  2553. package/web/app/site/sengi/assets/emoji/64/1f68c.png +0 -0
  2554. package/web/app/site/sengi/assets/emoji/64/1f68d.png +0 -0
  2555. package/web/app/site/sengi/assets/emoji/64/1f68e.png +0 -0
  2556. package/web/app/site/sengi/assets/emoji/64/1f68f.png +0 -0
  2557. package/web/app/site/sengi/assets/emoji/64/1f690.png +0 -0
  2558. package/web/app/site/sengi/assets/emoji/64/1f691.png +0 -0
  2559. package/web/app/site/sengi/assets/emoji/64/1f692.png +0 -0
  2560. package/web/app/site/sengi/assets/emoji/64/1f693.png +0 -0
  2561. package/web/app/site/sengi/assets/emoji/64/1f694.png +0 -0
  2562. package/web/app/site/sengi/assets/emoji/64/1f695.png +0 -0
  2563. package/web/app/site/sengi/assets/emoji/64/1f696.png +0 -0
  2564. package/web/app/site/sengi/assets/emoji/64/1f697.png +0 -0
  2565. package/web/app/site/sengi/assets/emoji/64/1f698.png +0 -0
  2566. package/web/app/site/sengi/assets/emoji/64/1f699.png +0 -0
  2567. package/web/app/site/sengi/assets/emoji/64/1f69a.png +0 -0
  2568. package/web/app/site/sengi/assets/emoji/64/1f69b.png +0 -0
  2569. package/web/app/site/sengi/assets/emoji/64/1f69c.png +0 -0
  2570. package/web/app/site/sengi/assets/emoji/64/1f69d.png +0 -0
  2571. package/web/app/site/sengi/assets/emoji/64/1f69e.png +0 -0
  2572. package/web/app/site/sengi/assets/emoji/64/1f69f.png +0 -0
  2573. package/web/app/site/sengi/assets/emoji/64/1f6a0.png +0 -0
  2574. package/web/app/site/sengi/assets/emoji/64/1f6a1.png +0 -0
  2575. package/web/app/site/sengi/assets/emoji/64/1f6a2.png +0 -0
  2576. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fb-2640.png +0 -0
  2577. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fb-2642.png +0 -0
  2578. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fb.png +0 -0
  2579. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fc-2640.png +0 -0
  2580. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fc-2642.png +0 -0
  2581. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fc.png +0 -0
  2582. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fd-2640.png +0 -0
  2583. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fd-2642.png +0 -0
  2584. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fd.png +0 -0
  2585. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fe-2640.png +0 -0
  2586. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fe-2642.png +0 -0
  2587. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3fe.png +0 -0
  2588. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3ff-2640.png +0 -0
  2589. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3ff-2642.png +0 -0
  2590. package/web/app/site/sengi/assets/emoji/64/1f6a3-1f3ff.png +0 -0
  2591. package/web/app/site/sengi/assets/emoji/64/1f6a3-2640.png +0 -0
  2592. package/web/app/site/sengi/assets/emoji/64/1f6a3-2642.png +0 -0
  2593. package/web/app/site/sengi/assets/emoji/64/1f6a3.png +0 -0
  2594. package/web/app/site/sengi/assets/emoji/64/1f6a4.png +0 -0
  2595. package/web/app/site/sengi/assets/emoji/64/1f6a5.png +0 -0
  2596. package/web/app/site/sengi/assets/emoji/64/1f6a6.png +0 -0
  2597. package/web/app/site/sengi/assets/emoji/64/1f6a7.png +0 -0
  2598. package/web/app/site/sengi/assets/emoji/64/1f6a8.png +0 -0
  2599. package/web/app/site/sengi/assets/emoji/64/1f6a9.png +0 -0
  2600. package/web/app/site/sengi/assets/emoji/64/1f6aa.png +0 -0
  2601. package/web/app/site/sengi/assets/emoji/64/1f6ab.png +0 -0
  2602. package/web/app/site/sengi/assets/emoji/64/1f6ac.png +0 -0
  2603. package/web/app/site/sengi/assets/emoji/64/1f6ad.png +0 -0
  2604. package/web/app/site/sengi/assets/emoji/64/1f6ae.png +0 -0
  2605. package/web/app/site/sengi/assets/emoji/64/1f6af.png +0 -0
  2606. package/web/app/site/sengi/assets/emoji/64/1f6b0.png +0 -0
  2607. package/web/app/site/sengi/assets/emoji/64/1f6b1.png +0 -0
  2608. package/web/app/site/sengi/assets/emoji/64/1f6b2.png +0 -0
  2609. package/web/app/site/sengi/assets/emoji/64/1f6b3.png +0 -0
  2610. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fb-2640.png +0 -0
  2611. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fb-2642.png +0 -0
  2612. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fb.png +0 -0
  2613. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fc-2640.png +0 -0
  2614. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fc-2642.png +0 -0
  2615. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fc.png +0 -0
  2616. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fd-2640.png +0 -0
  2617. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fd-2642.png +0 -0
  2618. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fd.png +0 -0
  2619. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fe-2640.png +0 -0
  2620. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fe-2642.png +0 -0
  2621. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3fe.png +0 -0
  2622. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3ff-2640.png +0 -0
  2623. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3ff-2642.png +0 -0
  2624. package/web/app/site/sengi/assets/emoji/64/1f6b4-1f3ff.png +0 -0
  2625. package/web/app/site/sengi/assets/emoji/64/1f6b4-2640.png +0 -0
  2626. package/web/app/site/sengi/assets/emoji/64/1f6b4-2642.png +0 -0
  2627. package/web/app/site/sengi/assets/emoji/64/1f6b4.png +0 -0
  2628. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fb-2640.png +0 -0
  2629. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fb-2642.png +0 -0
  2630. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fb.png +0 -0
  2631. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fc-2640.png +0 -0
  2632. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fc-2642.png +0 -0
  2633. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fc.png +0 -0
  2634. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fd-2640.png +0 -0
  2635. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fd-2642.png +0 -0
  2636. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fd.png +0 -0
  2637. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fe-2640.png +0 -0
  2638. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fe-2642.png +0 -0
  2639. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3fe.png +0 -0
  2640. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3ff-2640.png +0 -0
  2641. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3ff-2642.png +0 -0
  2642. package/web/app/site/sengi/assets/emoji/64/1f6b5-1f3ff.png +0 -0
  2643. package/web/app/site/sengi/assets/emoji/64/1f6b5-2640.png +0 -0
  2644. package/web/app/site/sengi/assets/emoji/64/1f6b5-2642.png +0 -0
  2645. package/web/app/site/sengi/assets/emoji/64/1f6b5.png +0 -0
  2646. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fb-2640-27a1.png +0 -0
  2647. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fb-2640.png +0 -0
  2648. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fb-2642-27a1.png +0 -0
  2649. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fb-2642.png +0 -0
  2650. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fb-27a1.png +0 -0
  2651. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fb.png +0 -0
  2652. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fc-2640-27a1.png +0 -0
  2653. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fc-2640.png +0 -0
  2654. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fc-2642-27a1.png +0 -0
  2655. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fc-2642.png +0 -0
  2656. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fc-27a1.png +0 -0
  2657. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fc.png +0 -0
  2658. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fd-2640-27a1.png +0 -0
  2659. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fd-2640.png +0 -0
  2660. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fd-2642-27a1.png +0 -0
  2661. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fd-2642.png +0 -0
  2662. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fd-27a1.png +0 -0
  2663. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fd.png +0 -0
  2664. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fe-2640-27a1.png +0 -0
  2665. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fe-2640.png +0 -0
  2666. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fe-2642-27a1.png +0 -0
  2667. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fe-2642.png +0 -0
  2668. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fe-27a1.png +0 -0
  2669. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3fe.png +0 -0
  2670. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3ff-2640-27a1.png +0 -0
  2671. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3ff-2640.png +0 -0
  2672. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3ff-2642-27a1.png +0 -0
  2673. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3ff-2642.png +0 -0
  2674. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3ff-27a1.png +0 -0
  2675. package/web/app/site/sengi/assets/emoji/64/1f6b6-1f3ff.png +0 -0
  2676. package/web/app/site/sengi/assets/emoji/64/1f6b6-2640-27a1.png +0 -0
  2677. package/web/app/site/sengi/assets/emoji/64/1f6b6-2640.png +0 -0
  2678. package/web/app/site/sengi/assets/emoji/64/1f6b6-2642-27a1.png +0 -0
  2679. package/web/app/site/sengi/assets/emoji/64/1f6b6-2642.png +0 -0
  2680. package/web/app/site/sengi/assets/emoji/64/1f6b6-27a1.png +0 -0
  2681. package/web/app/site/sengi/assets/emoji/64/1f6b6.png +0 -0
  2682. package/web/app/site/sengi/assets/emoji/64/1f6b7.png +0 -0
  2683. package/web/app/site/sengi/assets/emoji/64/1f6b8.png +0 -0
  2684. package/web/app/site/sengi/assets/emoji/64/1f6b9.png +0 -0
  2685. package/web/app/site/sengi/assets/emoji/64/1f6ba.png +0 -0
  2686. package/web/app/site/sengi/assets/emoji/64/1f6bb.png +0 -0
  2687. package/web/app/site/sengi/assets/emoji/64/1f6bc.png +0 -0
  2688. package/web/app/site/sengi/assets/emoji/64/1f6bd.png +0 -0
  2689. package/web/app/site/sengi/assets/emoji/64/1f6be.png +0 -0
  2690. package/web/app/site/sengi/assets/emoji/64/1f6bf.png +0 -0
  2691. package/web/app/site/sengi/assets/emoji/64/1f6c0-1f3fb.png +0 -0
  2692. package/web/app/site/sengi/assets/emoji/64/1f6c0-1f3fc.png +0 -0
  2693. package/web/app/site/sengi/assets/emoji/64/1f6c0-1f3fd.png +0 -0
  2694. package/web/app/site/sengi/assets/emoji/64/1f6c0-1f3fe.png +0 -0
  2695. package/web/app/site/sengi/assets/emoji/64/1f6c0-1f3ff.png +0 -0
  2696. package/web/app/site/sengi/assets/emoji/64/1f6c0.png +0 -0
  2697. package/web/app/site/sengi/assets/emoji/64/1f6c1.png +0 -0
  2698. package/web/app/site/sengi/assets/emoji/64/1f6c2.png +0 -0
  2699. package/web/app/site/sengi/assets/emoji/64/1f6c3.png +0 -0
  2700. package/web/app/site/sengi/assets/emoji/64/1f6c4.png +0 -0
  2701. package/web/app/site/sengi/assets/emoji/64/1f6c5.png +0 -0
  2702. package/web/app/site/sengi/assets/emoji/64/1f6cb.png +0 -0
  2703. package/web/app/site/sengi/assets/emoji/64/1f6cc-1f3fb.png +0 -0
  2704. package/web/app/site/sengi/assets/emoji/64/1f6cc-1f3fc.png +0 -0
  2705. package/web/app/site/sengi/assets/emoji/64/1f6cc-1f3fd.png +0 -0
  2706. package/web/app/site/sengi/assets/emoji/64/1f6cc-1f3fe.png +0 -0
  2707. package/web/app/site/sengi/assets/emoji/64/1f6cc-1f3ff.png +0 -0
  2708. package/web/app/site/sengi/assets/emoji/64/1f6cc.png +0 -0
  2709. package/web/app/site/sengi/assets/emoji/64/1f6cd.png +0 -0
  2710. package/web/app/site/sengi/assets/emoji/64/1f6ce.png +0 -0
  2711. package/web/app/site/sengi/assets/emoji/64/1f6cf.png +0 -0
  2712. package/web/app/site/sengi/assets/emoji/64/1f6d0.png +0 -0
  2713. package/web/app/site/sengi/assets/emoji/64/1f6d1.png +0 -0
  2714. package/web/app/site/sengi/assets/emoji/64/1f6d2.png +0 -0
  2715. package/web/app/site/sengi/assets/emoji/64/1f6d5.png +0 -0
  2716. package/web/app/site/sengi/assets/emoji/64/1f6d6.png +0 -0
  2717. package/web/app/site/sengi/assets/emoji/64/1f6d7.png +0 -0
  2718. package/web/app/site/sengi/assets/emoji/64/1f6dc.png +0 -0
  2719. package/web/app/site/sengi/assets/emoji/64/1f6dd.png +0 -0
  2720. package/web/app/site/sengi/assets/emoji/64/1f6de.png +0 -0
  2721. package/web/app/site/sengi/assets/emoji/64/1f6df.png +0 -0
  2722. package/web/app/site/sengi/assets/emoji/64/1f6e0.png +0 -0
  2723. package/web/app/site/sengi/assets/emoji/64/1f6e1.png +0 -0
  2724. package/web/app/site/sengi/assets/emoji/64/1f6e2.png +0 -0
  2725. package/web/app/site/sengi/assets/emoji/64/1f6e3.png +0 -0
  2726. package/web/app/site/sengi/assets/emoji/64/1f6e4.png +0 -0
  2727. package/web/app/site/sengi/assets/emoji/64/1f6e5.png +0 -0
  2728. package/web/app/site/sengi/assets/emoji/64/1f6e9.png +0 -0
  2729. package/web/app/site/sengi/assets/emoji/64/1f6eb.png +0 -0
  2730. package/web/app/site/sengi/assets/emoji/64/1f6ec.png +0 -0
  2731. package/web/app/site/sengi/assets/emoji/64/1f6f0.png +0 -0
  2732. package/web/app/site/sengi/assets/emoji/64/1f6f3.png +0 -0
  2733. package/web/app/site/sengi/assets/emoji/64/1f6f4.png +0 -0
  2734. package/web/app/site/sengi/assets/emoji/64/1f6f5.png +0 -0
  2735. package/web/app/site/sengi/assets/emoji/64/1f6f6.png +0 -0
  2736. package/web/app/site/sengi/assets/emoji/64/1f6f7.png +0 -0
  2737. package/web/app/site/sengi/assets/emoji/64/1f6f8.png +0 -0
  2738. package/web/app/site/sengi/assets/emoji/64/1f6f9.png +0 -0
  2739. package/web/app/site/sengi/assets/emoji/64/1f6fa.png +0 -0
  2740. package/web/app/site/sengi/assets/emoji/64/1f6fb.png +0 -0
  2741. package/web/app/site/sengi/assets/emoji/64/1f6fc.png +0 -0
  2742. package/web/app/site/sengi/assets/emoji/64/1f7e0.png +0 -0
  2743. package/web/app/site/sengi/assets/emoji/64/1f7e1.png +0 -0
  2744. package/web/app/site/sengi/assets/emoji/64/1f7e2.png +0 -0
  2745. package/web/app/site/sengi/assets/emoji/64/1f7e3.png +0 -0
  2746. package/web/app/site/sengi/assets/emoji/64/1f7e4.png +0 -0
  2747. package/web/app/site/sengi/assets/emoji/64/1f7e5.png +0 -0
  2748. package/web/app/site/sengi/assets/emoji/64/1f7e6.png +0 -0
  2749. package/web/app/site/sengi/assets/emoji/64/1f7e7.png +0 -0
  2750. package/web/app/site/sengi/assets/emoji/64/1f7e8.png +0 -0
  2751. package/web/app/site/sengi/assets/emoji/64/1f7e9.png +0 -0
  2752. package/web/app/site/sengi/assets/emoji/64/1f7ea.png +0 -0
  2753. package/web/app/site/sengi/assets/emoji/64/1f7eb.png +0 -0
  2754. package/web/app/site/sengi/assets/emoji/64/1f7f0.png +0 -0
  2755. package/web/app/site/sengi/assets/emoji/64/1f90c-1f3fb.png +0 -0
  2756. package/web/app/site/sengi/assets/emoji/64/1f90c-1f3fc.png +0 -0
  2757. package/web/app/site/sengi/assets/emoji/64/1f90c-1f3fd.png +0 -0
  2758. package/web/app/site/sengi/assets/emoji/64/1f90c-1f3fe.png +0 -0
  2759. package/web/app/site/sengi/assets/emoji/64/1f90c-1f3ff.png +0 -0
  2760. package/web/app/site/sengi/assets/emoji/64/1f90c.png +0 -0
  2761. package/web/app/site/sengi/assets/emoji/64/1f90d.png +0 -0
  2762. package/web/app/site/sengi/assets/emoji/64/1f90e.png +0 -0
  2763. package/web/app/site/sengi/assets/emoji/64/1f90f-1f3fb.png +0 -0
  2764. package/web/app/site/sengi/assets/emoji/64/1f90f-1f3fc.png +0 -0
  2765. package/web/app/site/sengi/assets/emoji/64/1f90f-1f3fd.png +0 -0
  2766. package/web/app/site/sengi/assets/emoji/64/1f90f-1f3fe.png +0 -0
  2767. package/web/app/site/sengi/assets/emoji/64/1f90f-1f3ff.png +0 -0
  2768. package/web/app/site/sengi/assets/emoji/64/1f90f.png +0 -0
  2769. package/web/app/site/sengi/assets/emoji/64/1f910.png +0 -0
  2770. package/web/app/site/sengi/assets/emoji/64/1f911.png +0 -0
  2771. package/web/app/site/sengi/assets/emoji/64/1f912.png +0 -0
  2772. package/web/app/site/sengi/assets/emoji/64/1f913.png +0 -0
  2773. package/web/app/site/sengi/assets/emoji/64/1f914.png +0 -0
  2774. package/web/app/site/sengi/assets/emoji/64/1f915.png +0 -0
  2775. package/web/app/site/sengi/assets/emoji/64/1f916.png +0 -0
  2776. package/web/app/site/sengi/assets/emoji/64/1f917.png +0 -0
  2777. package/web/app/site/sengi/assets/emoji/64/1f918-1f3fb.png +0 -0
  2778. package/web/app/site/sengi/assets/emoji/64/1f918-1f3fc.png +0 -0
  2779. package/web/app/site/sengi/assets/emoji/64/1f918-1f3fd.png +0 -0
  2780. package/web/app/site/sengi/assets/emoji/64/1f918-1f3fe.png +0 -0
  2781. package/web/app/site/sengi/assets/emoji/64/1f918-1f3ff.png +0 -0
  2782. package/web/app/site/sengi/assets/emoji/64/1f918.png +0 -0
  2783. package/web/app/site/sengi/assets/emoji/64/1f919-1f3fb.png +0 -0
  2784. package/web/app/site/sengi/assets/emoji/64/1f919-1f3fc.png +0 -0
  2785. package/web/app/site/sengi/assets/emoji/64/1f919-1f3fd.png +0 -0
  2786. package/web/app/site/sengi/assets/emoji/64/1f919-1f3fe.png +0 -0
  2787. package/web/app/site/sengi/assets/emoji/64/1f919-1f3ff.png +0 -0
  2788. package/web/app/site/sengi/assets/emoji/64/1f919.png +0 -0
  2789. package/web/app/site/sengi/assets/emoji/64/1f91a-1f3fb.png +0 -0
  2790. package/web/app/site/sengi/assets/emoji/64/1f91a-1f3fc.png +0 -0
  2791. package/web/app/site/sengi/assets/emoji/64/1f91a-1f3fd.png +0 -0
  2792. package/web/app/site/sengi/assets/emoji/64/1f91a-1f3fe.png +0 -0
  2793. package/web/app/site/sengi/assets/emoji/64/1f91a-1f3ff.png +0 -0
  2794. package/web/app/site/sengi/assets/emoji/64/1f91a.png +0 -0
  2795. package/web/app/site/sengi/assets/emoji/64/1f91b-1f3fb.png +0 -0
  2796. package/web/app/site/sengi/assets/emoji/64/1f91b-1f3fc.png +0 -0
  2797. package/web/app/site/sengi/assets/emoji/64/1f91b-1f3fd.png +0 -0
  2798. package/web/app/site/sengi/assets/emoji/64/1f91b-1f3fe.png +0 -0
  2799. package/web/app/site/sengi/assets/emoji/64/1f91b-1f3ff.png +0 -0
  2800. package/web/app/site/sengi/assets/emoji/64/1f91b.png +0 -0
  2801. package/web/app/site/sengi/assets/emoji/64/1f91c-1f3fb.png +0 -0
  2802. package/web/app/site/sengi/assets/emoji/64/1f91c-1f3fc.png +0 -0
  2803. package/web/app/site/sengi/assets/emoji/64/1f91c-1f3fd.png +0 -0
  2804. package/web/app/site/sengi/assets/emoji/64/1f91c-1f3fe.png +0 -0
  2805. package/web/app/site/sengi/assets/emoji/64/1f91c-1f3ff.png +0 -0
  2806. package/web/app/site/sengi/assets/emoji/64/1f91c.png +0 -0
  2807. package/web/app/site/sengi/assets/emoji/64/1f91d-1f3fb.png +0 -0
  2808. package/web/app/site/sengi/assets/emoji/64/1f91d-1f3fc.png +0 -0
  2809. package/web/app/site/sengi/assets/emoji/64/1f91d-1f3fd.png +0 -0
  2810. package/web/app/site/sengi/assets/emoji/64/1f91d-1f3fe.png +0 -0
  2811. package/web/app/site/sengi/assets/emoji/64/1f91d-1f3ff.png +0 -0
  2812. package/web/app/site/sengi/assets/emoji/64/1f91d.png +0 -0
  2813. package/web/app/site/sengi/assets/emoji/64/1f91e-1f3fb.png +0 -0
  2814. package/web/app/site/sengi/assets/emoji/64/1f91e-1f3fc.png +0 -0
  2815. package/web/app/site/sengi/assets/emoji/64/1f91e-1f3fd.png +0 -0
  2816. package/web/app/site/sengi/assets/emoji/64/1f91e-1f3fe.png +0 -0
  2817. package/web/app/site/sengi/assets/emoji/64/1f91e-1f3ff.png +0 -0
  2818. package/web/app/site/sengi/assets/emoji/64/1f91e.png +0 -0
  2819. package/web/app/site/sengi/assets/emoji/64/1f91f-1f3fb.png +0 -0
  2820. package/web/app/site/sengi/assets/emoji/64/1f91f-1f3fc.png +0 -0
  2821. package/web/app/site/sengi/assets/emoji/64/1f91f-1f3fd.png +0 -0
  2822. package/web/app/site/sengi/assets/emoji/64/1f91f-1f3fe.png +0 -0
  2823. package/web/app/site/sengi/assets/emoji/64/1f91f-1f3ff.png +0 -0
  2824. package/web/app/site/sengi/assets/emoji/64/1f91f.png +0 -0
  2825. package/web/app/site/sengi/assets/emoji/64/1f920.png +0 -0
  2826. package/web/app/site/sengi/assets/emoji/64/1f921.png +0 -0
  2827. package/web/app/site/sengi/assets/emoji/64/1f922.png +0 -0
  2828. package/web/app/site/sengi/assets/emoji/64/1f923.png +0 -0
  2829. package/web/app/site/sengi/assets/emoji/64/1f924.png +0 -0
  2830. package/web/app/site/sengi/assets/emoji/64/1f925.png +0 -0
  2831. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fb-2640.png +0 -0
  2832. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fb-2642.png +0 -0
  2833. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fb.png +0 -0
  2834. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fc-2640.png +0 -0
  2835. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fc-2642.png +0 -0
  2836. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fc.png +0 -0
  2837. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fd-2640.png +0 -0
  2838. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fd-2642.png +0 -0
  2839. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fd.png +0 -0
  2840. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fe-2640.png +0 -0
  2841. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fe-2642.png +0 -0
  2842. package/web/app/site/sengi/assets/emoji/64/1f926-1f3fe.png +0 -0
  2843. package/web/app/site/sengi/assets/emoji/64/1f926-1f3ff-2640.png +0 -0
  2844. package/web/app/site/sengi/assets/emoji/64/1f926-1f3ff-2642.png +0 -0
  2845. package/web/app/site/sengi/assets/emoji/64/1f926-1f3ff.png +0 -0
  2846. package/web/app/site/sengi/assets/emoji/64/1f926-2640.png +0 -0
  2847. package/web/app/site/sengi/assets/emoji/64/1f926-2642.png +0 -0
  2848. package/web/app/site/sengi/assets/emoji/64/1f926.png +0 -0
  2849. package/web/app/site/sengi/assets/emoji/64/1f927.png +0 -0
  2850. package/web/app/site/sengi/assets/emoji/64/1f928.png +0 -0
  2851. package/web/app/site/sengi/assets/emoji/64/1f929.png +0 -0
  2852. package/web/app/site/sengi/assets/emoji/64/1f92a.png +0 -0
  2853. package/web/app/site/sengi/assets/emoji/64/1f92b.png +0 -0
  2854. package/web/app/site/sengi/assets/emoji/64/1f92c.png +0 -0
  2855. package/web/app/site/sengi/assets/emoji/64/1f92d.png +0 -0
  2856. package/web/app/site/sengi/assets/emoji/64/1f92e.png +0 -0
  2857. package/web/app/site/sengi/assets/emoji/64/1f92f.png +0 -0
  2858. package/web/app/site/sengi/assets/emoji/64/1f930-1f3fb.png +0 -0
  2859. package/web/app/site/sengi/assets/emoji/64/1f930-1f3fc.png +0 -0
  2860. package/web/app/site/sengi/assets/emoji/64/1f930-1f3fd.png +0 -0
  2861. package/web/app/site/sengi/assets/emoji/64/1f930-1f3fe.png +0 -0
  2862. package/web/app/site/sengi/assets/emoji/64/1f930-1f3ff.png +0 -0
  2863. package/web/app/site/sengi/assets/emoji/64/1f930.png +0 -0
  2864. package/web/app/site/sengi/assets/emoji/64/1f931-1f3fb.png +0 -0
  2865. package/web/app/site/sengi/assets/emoji/64/1f931-1f3fc.png +0 -0
  2866. package/web/app/site/sengi/assets/emoji/64/1f931-1f3fd.png +0 -0
  2867. package/web/app/site/sengi/assets/emoji/64/1f931-1f3fe.png +0 -0
  2868. package/web/app/site/sengi/assets/emoji/64/1f931-1f3ff.png +0 -0
  2869. package/web/app/site/sengi/assets/emoji/64/1f931.png +0 -0
  2870. package/web/app/site/sengi/assets/emoji/64/1f932-1f3fb.png +0 -0
  2871. package/web/app/site/sengi/assets/emoji/64/1f932-1f3fc.png +0 -0
  2872. package/web/app/site/sengi/assets/emoji/64/1f932-1f3fd.png +0 -0
  2873. package/web/app/site/sengi/assets/emoji/64/1f932-1f3fe.png +0 -0
  2874. package/web/app/site/sengi/assets/emoji/64/1f932-1f3ff.png +0 -0
  2875. package/web/app/site/sengi/assets/emoji/64/1f932.png +0 -0
  2876. package/web/app/site/sengi/assets/emoji/64/1f933-1f3fb.png +0 -0
  2877. package/web/app/site/sengi/assets/emoji/64/1f933-1f3fc.png +0 -0
  2878. package/web/app/site/sengi/assets/emoji/64/1f933-1f3fd.png +0 -0
  2879. package/web/app/site/sengi/assets/emoji/64/1f933-1f3fe.png +0 -0
  2880. package/web/app/site/sengi/assets/emoji/64/1f933-1f3ff.png +0 -0
  2881. package/web/app/site/sengi/assets/emoji/64/1f933.png +0 -0
  2882. package/web/app/site/sengi/assets/emoji/64/1f934-1f3fb.png +0 -0
  2883. package/web/app/site/sengi/assets/emoji/64/1f934-1f3fc.png +0 -0
  2884. package/web/app/site/sengi/assets/emoji/64/1f934-1f3fd.png +0 -0
  2885. package/web/app/site/sengi/assets/emoji/64/1f934-1f3fe.png +0 -0
  2886. package/web/app/site/sengi/assets/emoji/64/1f934-1f3ff.png +0 -0
  2887. package/web/app/site/sengi/assets/emoji/64/1f934.png +0 -0
  2888. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fb-2640.png +0 -0
  2889. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fb-2642.png +0 -0
  2890. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fb.png +0 -0
  2891. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fc-2640.png +0 -0
  2892. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fc-2642.png +0 -0
  2893. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fc.png +0 -0
  2894. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fd-2640.png +0 -0
  2895. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fd-2642.png +0 -0
  2896. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fd.png +0 -0
  2897. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fe-2640.png +0 -0
  2898. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fe-2642.png +0 -0
  2899. package/web/app/site/sengi/assets/emoji/64/1f935-1f3fe.png +0 -0
  2900. package/web/app/site/sengi/assets/emoji/64/1f935-1f3ff-2640.png +0 -0
  2901. package/web/app/site/sengi/assets/emoji/64/1f935-1f3ff-2642.png +0 -0
  2902. package/web/app/site/sengi/assets/emoji/64/1f935-1f3ff.png +0 -0
  2903. package/web/app/site/sengi/assets/emoji/64/1f935-2640.png +0 -0
  2904. package/web/app/site/sengi/assets/emoji/64/1f935-2642.png +0 -0
  2905. package/web/app/site/sengi/assets/emoji/64/1f935.png +0 -0
  2906. package/web/app/site/sengi/assets/emoji/64/1f936-1f3fb.png +0 -0
  2907. package/web/app/site/sengi/assets/emoji/64/1f936-1f3fc.png +0 -0
  2908. package/web/app/site/sengi/assets/emoji/64/1f936-1f3fd.png +0 -0
  2909. package/web/app/site/sengi/assets/emoji/64/1f936-1f3fe.png +0 -0
  2910. package/web/app/site/sengi/assets/emoji/64/1f936-1f3ff.png +0 -0
  2911. package/web/app/site/sengi/assets/emoji/64/1f936.png +0 -0
  2912. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fb-2640.png +0 -0
  2913. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fb-2642.png +0 -0
  2914. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fb.png +0 -0
  2915. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fc-2640.png +0 -0
  2916. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fc-2642.png +0 -0
  2917. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fc.png +0 -0
  2918. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fd-2640.png +0 -0
  2919. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fd-2642.png +0 -0
  2920. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fd.png +0 -0
  2921. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fe-2640.png +0 -0
  2922. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fe-2642.png +0 -0
  2923. package/web/app/site/sengi/assets/emoji/64/1f937-1f3fe.png +0 -0
  2924. package/web/app/site/sengi/assets/emoji/64/1f937-1f3ff-2640.png +0 -0
  2925. package/web/app/site/sengi/assets/emoji/64/1f937-1f3ff-2642.png +0 -0
  2926. package/web/app/site/sengi/assets/emoji/64/1f937-1f3ff.png +0 -0
  2927. package/web/app/site/sengi/assets/emoji/64/1f937-2640.png +0 -0
  2928. package/web/app/site/sengi/assets/emoji/64/1f937-2642.png +0 -0
  2929. package/web/app/site/sengi/assets/emoji/64/1f937.png +0 -0
  2930. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fb-2640.png +0 -0
  2931. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fb-2642.png +0 -0
  2932. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fb.png +0 -0
  2933. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fc-2640.png +0 -0
  2934. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fc-2642.png +0 -0
  2935. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fc.png +0 -0
  2936. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fd-2640.png +0 -0
  2937. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fd-2642.png +0 -0
  2938. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fd.png +0 -0
  2939. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fe-2640.png +0 -0
  2940. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fe-2642.png +0 -0
  2941. package/web/app/site/sengi/assets/emoji/64/1f938-1f3fe.png +0 -0
  2942. package/web/app/site/sengi/assets/emoji/64/1f938-1f3ff-2640.png +0 -0
  2943. package/web/app/site/sengi/assets/emoji/64/1f938-1f3ff-2642.png +0 -0
  2944. package/web/app/site/sengi/assets/emoji/64/1f938-1f3ff.png +0 -0
  2945. package/web/app/site/sengi/assets/emoji/64/1f938-2640.png +0 -0
  2946. package/web/app/site/sengi/assets/emoji/64/1f938-2642.png +0 -0
  2947. package/web/app/site/sengi/assets/emoji/64/1f938.png +0 -0
  2948. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fb-2640.png +0 -0
  2949. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fb-2642.png +0 -0
  2950. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fb.png +0 -0
  2951. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fc-2640.png +0 -0
  2952. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fc-2642.png +0 -0
  2953. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fc.png +0 -0
  2954. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fd-2640.png +0 -0
  2955. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fd-2642.png +0 -0
  2956. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fd.png +0 -0
  2957. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fe-2640.png +0 -0
  2958. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fe-2642.png +0 -0
  2959. package/web/app/site/sengi/assets/emoji/64/1f939-1f3fe.png +0 -0
  2960. package/web/app/site/sengi/assets/emoji/64/1f939-1f3ff-2640.png +0 -0
  2961. package/web/app/site/sengi/assets/emoji/64/1f939-1f3ff-2642.png +0 -0
  2962. package/web/app/site/sengi/assets/emoji/64/1f939-1f3ff.png +0 -0
  2963. package/web/app/site/sengi/assets/emoji/64/1f939-2640.png +0 -0
  2964. package/web/app/site/sengi/assets/emoji/64/1f939-2642.png +0 -0
  2965. package/web/app/site/sengi/assets/emoji/64/1f939.png +0 -0
  2966. package/web/app/site/sengi/assets/emoji/64/1f93a.png +0 -0
  2967. package/web/app/site/sengi/assets/emoji/64/1f93c-2640.png +0 -0
  2968. package/web/app/site/sengi/assets/emoji/64/1f93c-2642.png +0 -0
  2969. package/web/app/site/sengi/assets/emoji/64/1f93c.png +0 -0
  2970. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fb-2640.png +0 -0
  2971. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fb-2642.png +0 -0
  2972. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fb.png +0 -0
  2973. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fc-2640.png +0 -0
  2974. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fc-2642.png +0 -0
  2975. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fc.png +0 -0
  2976. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fd-2640.png +0 -0
  2977. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fd-2642.png +0 -0
  2978. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fd.png +0 -0
  2979. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fe-2640.png +0 -0
  2980. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fe-2642.png +0 -0
  2981. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3fe.png +0 -0
  2982. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3ff-2640.png +0 -0
  2983. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3ff-2642.png +0 -0
  2984. package/web/app/site/sengi/assets/emoji/64/1f93d-1f3ff.png +0 -0
  2985. package/web/app/site/sengi/assets/emoji/64/1f93d-2640.png +0 -0
  2986. package/web/app/site/sengi/assets/emoji/64/1f93d-2642.png +0 -0
  2987. package/web/app/site/sengi/assets/emoji/64/1f93d.png +0 -0
  2988. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fb-2640.png +0 -0
  2989. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fb-2642.png +0 -0
  2990. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fb.png +0 -0
  2991. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fc-2640.png +0 -0
  2992. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fc-2642.png +0 -0
  2993. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fc.png +0 -0
  2994. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fd-2640.png +0 -0
  2995. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fd-2642.png +0 -0
  2996. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fd.png +0 -0
  2997. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fe-2640.png +0 -0
  2998. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fe-2642.png +0 -0
  2999. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3fe.png +0 -0
  3000. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3ff-2640.png +0 -0
  3001. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3ff-2642.png +0 -0
  3002. package/web/app/site/sengi/assets/emoji/64/1f93e-1f3ff.png +0 -0
  3003. package/web/app/site/sengi/assets/emoji/64/1f93e-2640.png +0 -0
  3004. package/web/app/site/sengi/assets/emoji/64/1f93e-2642.png +0 -0
  3005. package/web/app/site/sengi/assets/emoji/64/1f93e.png +0 -0
  3006. package/web/app/site/sengi/assets/emoji/64/1f93f.png +0 -0
  3007. package/web/app/site/sengi/assets/emoji/64/1f940.png +0 -0
  3008. package/web/app/site/sengi/assets/emoji/64/1f941.png +0 -0
  3009. package/web/app/site/sengi/assets/emoji/64/1f942.png +0 -0
  3010. package/web/app/site/sengi/assets/emoji/64/1f943.png +0 -0
  3011. package/web/app/site/sengi/assets/emoji/64/1f944.png +0 -0
  3012. package/web/app/site/sengi/assets/emoji/64/1f945.png +0 -0
  3013. package/web/app/site/sengi/assets/emoji/64/1f947.png +0 -0
  3014. package/web/app/site/sengi/assets/emoji/64/1f948.png +0 -0
  3015. package/web/app/site/sengi/assets/emoji/64/1f949.png +0 -0
  3016. package/web/app/site/sengi/assets/emoji/64/1f94a.png +0 -0
  3017. package/web/app/site/sengi/assets/emoji/64/1f94b.png +0 -0
  3018. package/web/app/site/sengi/assets/emoji/64/1f94c.png +0 -0
  3019. package/web/app/site/sengi/assets/emoji/64/1f94d.png +0 -0
  3020. package/web/app/site/sengi/assets/emoji/64/1f94e.png +0 -0
  3021. package/web/app/site/sengi/assets/emoji/64/1f94f.png +0 -0
  3022. package/web/app/site/sengi/assets/emoji/64/1f950.png +0 -0
  3023. package/web/app/site/sengi/assets/emoji/64/1f951.png +0 -0
  3024. package/web/app/site/sengi/assets/emoji/64/1f952.png +0 -0
  3025. package/web/app/site/sengi/assets/emoji/64/1f953.png +0 -0
  3026. package/web/app/site/sengi/assets/emoji/64/1f954.png +0 -0
  3027. package/web/app/site/sengi/assets/emoji/64/1f955.png +0 -0
  3028. package/web/app/site/sengi/assets/emoji/64/1f956.png +0 -0
  3029. package/web/app/site/sengi/assets/emoji/64/1f957.png +0 -0
  3030. package/web/app/site/sengi/assets/emoji/64/1f958.png +0 -0
  3031. package/web/app/site/sengi/assets/emoji/64/1f959.png +0 -0
  3032. package/web/app/site/sengi/assets/emoji/64/1f95a.png +0 -0
  3033. package/web/app/site/sengi/assets/emoji/64/1f95b.png +0 -0
  3034. package/web/app/site/sengi/assets/emoji/64/1f95c.png +0 -0
  3035. package/web/app/site/sengi/assets/emoji/64/1f95d.png +0 -0
  3036. package/web/app/site/sengi/assets/emoji/64/1f95e.png +0 -0
  3037. package/web/app/site/sengi/assets/emoji/64/1f95f.png +0 -0
  3038. package/web/app/site/sengi/assets/emoji/64/1f960.png +0 -0
  3039. package/web/app/site/sengi/assets/emoji/64/1f961.png +0 -0
  3040. package/web/app/site/sengi/assets/emoji/64/1f962.png +0 -0
  3041. package/web/app/site/sengi/assets/emoji/64/1f963.png +0 -0
  3042. package/web/app/site/sengi/assets/emoji/64/1f964.png +0 -0
  3043. package/web/app/site/sengi/assets/emoji/64/1f965.png +0 -0
  3044. package/web/app/site/sengi/assets/emoji/64/1f966.png +0 -0
  3045. package/web/app/site/sengi/assets/emoji/64/1f967.png +0 -0
  3046. package/web/app/site/sengi/assets/emoji/64/1f968.png +0 -0
  3047. package/web/app/site/sengi/assets/emoji/64/1f969.png +0 -0
  3048. package/web/app/site/sengi/assets/emoji/64/1f96a.png +0 -0
  3049. package/web/app/site/sengi/assets/emoji/64/1f96b.png +0 -0
  3050. package/web/app/site/sengi/assets/emoji/64/1f96c.png +0 -0
  3051. package/web/app/site/sengi/assets/emoji/64/1f96d.png +0 -0
  3052. package/web/app/site/sengi/assets/emoji/64/1f96e.png +0 -0
  3053. package/web/app/site/sengi/assets/emoji/64/1f96f.png +0 -0
  3054. package/web/app/site/sengi/assets/emoji/64/1f970.png +0 -0
  3055. package/web/app/site/sengi/assets/emoji/64/1f971.png +0 -0
  3056. package/web/app/site/sengi/assets/emoji/64/1f972.png +0 -0
  3057. package/web/app/site/sengi/assets/emoji/64/1f973.png +0 -0
  3058. package/web/app/site/sengi/assets/emoji/64/1f974.png +0 -0
  3059. package/web/app/site/sengi/assets/emoji/64/1f975.png +0 -0
  3060. package/web/app/site/sengi/assets/emoji/64/1f976.png +0 -0
  3061. package/web/app/site/sengi/assets/emoji/64/1f977-1f3fb.png +0 -0
  3062. package/web/app/site/sengi/assets/emoji/64/1f977-1f3fc.png +0 -0
  3063. package/web/app/site/sengi/assets/emoji/64/1f977-1f3fd.png +0 -0
  3064. package/web/app/site/sengi/assets/emoji/64/1f977-1f3fe.png +0 -0
  3065. package/web/app/site/sengi/assets/emoji/64/1f977-1f3ff.png +0 -0
  3066. package/web/app/site/sengi/assets/emoji/64/1f977.png +0 -0
  3067. package/web/app/site/sengi/assets/emoji/64/1f978.png +0 -0
  3068. package/web/app/site/sengi/assets/emoji/64/1f979.png +0 -0
  3069. package/web/app/site/sengi/assets/emoji/64/1f97a.png +0 -0
  3070. package/web/app/site/sengi/assets/emoji/64/1f97b.png +0 -0
  3071. package/web/app/site/sengi/assets/emoji/64/1f97c.png +0 -0
  3072. package/web/app/site/sengi/assets/emoji/64/1f97d.png +0 -0
  3073. package/web/app/site/sengi/assets/emoji/64/1f97e.png +0 -0
  3074. package/web/app/site/sengi/assets/emoji/64/1f97f.png +0 -0
  3075. package/web/app/site/sengi/assets/emoji/64/1f980.png +0 -0
  3076. package/web/app/site/sengi/assets/emoji/64/1f981.png +0 -0
  3077. package/web/app/site/sengi/assets/emoji/64/1f982.png +0 -0
  3078. package/web/app/site/sengi/assets/emoji/64/1f983.png +0 -0
  3079. package/web/app/site/sengi/assets/emoji/64/1f984.png +0 -0
  3080. package/web/app/site/sengi/assets/emoji/64/1f985.png +0 -0
  3081. package/web/app/site/sengi/assets/emoji/64/1f986.png +0 -0
  3082. package/web/app/site/sengi/assets/emoji/64/1f987.png +0 -0
  3083. package/web/app/site/sengi/assets/emoji/64/1f988.png +0 -0
  3084. package/web/app/site/sengi/assets/emoji/64/1f989.png +0 -0
  3085. package/web/app/site/sengi/assets/emoji/64/1f98a.png +0 -0
  3086. package/web/app/site/sengi/assets/emoji/64/1f98b.png +0 -0
  3087. package/web/app/site/sengi/assets/emoji/64/1f98c.png +0 -0
  3088. package/web/app/site/sengi/assets/emoji/64/1f98d.png +0 -0
  3089. package/web/app/site/sengi/assets/emoji/64/1f98e.png +0 -0
  3090. package/web/app/site/sengi/assets/emoji/64/1f98f.png +0 -0
  3091. package/web/app/site/sengi/assets/emoji/64/1f990.png +0 -0
  3092. package/web/app/site/sengi/assets/emoji/64/1f991.png +0 -0
  3093. package/web/app/site/sengi/assets/emoji/64/1f992.png +0 -0
  3094. package/web/app/site/sengi/assets/emoji/64/1f993.png +0 -0
  3095. package/web/app/site/sengi/assets/emoji/64/1f994.png +0 -0
  3096. package/web/app/site/sengi/assets/emoji/64/1f995.png +0 -0
  3097. package/web/app/site/sengi/assets/emoji/64/1f996.png +0 -0
  3098. package/web/app/site/sengi/assets/emoji/64/1f997.png +0 -0
  3099. package/web/app/site/sengi/assets/emoji/64/1f998.png +0 -0
  3100. package/web/app/site/sengi/assets/emoji/64/1f999.png +0 -0
  3101. package/web/app/site/sengi/assets/emoji/64/1f99a.png +0 -0
  3102. package/web/app/site/sengi/assets/emoji/64/1f99b.png +0 -0
  3103. package/web/app/site/sengi/assets/emoji/64/1f99c.png +0 -0
  3104. package/web/app/site/sengi/assets/emoji/64/1f99d.png +0 -0
  3105. package/web/app/site/sengi/assets/emoji/64/1f99e.png +0 -0
  3106. package/web/app/site/sengi/assets/emoji/64/1f99f.png +0 -0
  3107. package/web/app/site/sengi/assets/emoji/64/1f9a0.png +0 -0
  3108. package/web/app/site/sengi/assets/emoji/64/1f9a1.png +0 -0
  3109. package/web/app/site/sengi/assets/emoji/64/1f9a2.png +0 -0
  3110. package/web/app/site/sengi/assets/emoji/64/1f9a3.png +0 -0
  3111. package/web/app/site/sengi/assets/emoji/64/1f9a4.png +0 -0
  3112. package/web/app/site/sengi/assets/emoji/64/1f9a5.png +0 -0
  3113. package/web/app/site/sengi/assets/emoji/64/1f9a6.png +0 -0
  3114. package/web/app/site/sengi/assets/emoji/64/1f9a7.png +0 -0
  3115. package/web/app/site/sengi/assets/emoji/64/1f9a8.png +0 -0
  3116. package/web/app/site/sengi/assets/emoji/64/1f9a9.png +0 -0
  3117. package/web/app/site/sengi/assets/emoji/64/1f9aa.png +0 -0
  3118. package/web/app/site/sengi/assets/emoji/64/1f9ab.png +0 -0
  3119. package/web/app/site/sengi/assets/emoji/64/1f9ac.png +0 -0
  3120. package/web/app/site/sengi/assets/emoji/64/1f9ad.png +0 -0
  3121. package/web/app/site/sengi/assets/emoji/64/1f9ae.png +0 -0
  3122. package/web/app/site/sengi/assets/emoji/64/1f9af.png +0 -0
  3123. package/web/app/site/sengi/assets/emoji/64/1f9b0.png +0 -0
  3124. package/web/app/site/sengi/assets/emoji/64/1f9b1.png +0 -0
  3125. package/web/app/site/sengi/assets/emoji/64/1f9b2.png +0 -0
  3126. package/web/app/site/sengi/assets/emoji/64/1f9b3.png +0 -0
  3127. package/web/app/site/sengi/assets/emoji/64/1f9b4.png +0 -0
  3128. package/web/app/site/sengi/assets/emoji/64/1f9b5-1f3fb.png +0 -0
  3129. package/web/app/site/sengi/assets/emoji/64/1f9b5-1f3fc.png +0 -0
  3130. package/web/app/site/sengi/assets/emoji/64/1f9b5-1f3fd.png +0 -0
  3131. package/web/app/site/sengi/assets/emoji/64/1f9b5-1f3fe.png +0 -0
  3132. package/web/app/site/sengi/assets/emoji/64/1f9b5-1f3ff.png +0 -0
  3133. package/web/app/site/sengi/assets/emoji/64/1f9b5.png +0 -0
  3134. package/web/app/site/sengi/assets/emoji/64/1f9b6-1f3fb.png +0 -0
  3135. package/web/app/site/sengi/assets/emoji/64/1f9b6-1f3fc.png +0 -0
  3136. package/web/app/site/sengi/assets/emoji/64/1f9b6-1f3fd.png +0 -0
  3137. package/web/app/site/sengi/assets/emoji/64/1f9b6-1f3fe.png +0 -0
  3138. package/web/app/site/sengi/assets/emoji/64/1f9b6-1f3ff.png +0 -0
  3139. package/web/app/site/sengi/assets/emoji/64/1f9b6.png +0 -0
  3140. package/web/app/site/sengi/assets/emoji/64/1f9b7.png +0 -0
  3141. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fb-2640.png +0 -0
  3142. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fb-2642.png +0 -0
  3143. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fb.png +0 -0
  3144. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fc-2640.png +0 -0
  3145. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fc-2642.png +0 -0
  3146. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fc.png +0 -0
  3147. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fd-2640.png +0 -0
  3148. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fd-2642.png +0 -0
  3149. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fd.png +0 -0
  3150. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fe-2640.png +0 -0
  3151. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fe-2642.png +0 -0
  3152. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3fe.png +0 -0
  3153. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3ff-2640.png +0 -0
  3154. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3ff-2642.png +0 -0
  3155. package/web/app/site/sengi/assets/emoji/64/1f9b8-1f3ff.png +0 -0
  3156. package/web/app/site/sengi/assets/emoji/64/1f9b8-2640.png +0 -0
  3157. package/web/app/site/sengi/assets/emoji/64/1f9b8-2642.png +0 -0
  3158. package/web/app/site/sengi/assets/emoji/64/1f9b8.png +0 -0
  3159. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fb-2640.png +0 -0
  3160. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fb-2642.png +0 -0
  3161. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fb.png +0 -0
  3162. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fc-2640.png +0 -0
  3163. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fc-2642.png +0 -0
  3164. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fc.png +0 -0
  3165. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fd-2640.png +0 -0
  3166. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fd-2642.png +0 -0
  3167. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fd.png +0 -0
  3168. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fe-2640.png +0 -0
  3169. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fe-2642.png +0 -0
  3170. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3fe.png +0 -0
  3171. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3ff-2640.png +0 -0
  3172. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3ff-2642.png +0 -0
  3173. package/web/app/site/sengi/assets/emoji/64/1f9b9-1f3ff.png +0 -0
  3174. package/web/app/site/sengi/assets/emoji/64/1f9b9-2640.png +0 -0
  3175. package/web/app/site/sengi/assets/emoji/64/1f9b9-2642.png +0 -0
  3176. package/web/app/site/sengi/assets/emoji/64/1f9b9.png +0 -0
  3177. package/web/app/site/sengi/assets/emoji/64/1f9ba.png +0 -0
  3178. package/web/app/site/sengi/assets/emoji/64/1f9bb-1f3fb.png +0 -0
  3179. package/web/app/site/sengi/assets/emoji/64/1f9bb-1f3fc.png +0 -0
  3180. package/web/app/site/sengi/assets/emoji/64/1f9bb-1f3fd.png +0 -0
  3181. package/web/app/site/sengi/assets/emoji/64/1f9bb-1f3fe.png +0 -0
  3182. package/web/app/site/sengi/assets/emoji/64/1f9bb-1f3ff.png +0 -0
  3183. package/web/app/site/sengi/assets/emoji/64/1f9bb.png +0 -0
  3184. package/web/app/site/sengi/assets/emoji/64/1f9bc.png +0 -0
  3185. package/web/app/site/sengi/assets/emoji/64/1f9bd.png +0 -0
  3186. package/web/app/site/sengi/assets/emoji/64/1f9be.png +0 -0
  3187. package/web/app/site/sengi/assets/emoji/64/1f9bf.png +0 -0
  3188. package/web/app/site/sengi/assets/emoji/64/1f9c0.png +0 -0
  3189. package/web/app/site/sengi/assets/emoji/64/1f9c1.png +0 -0
  3190. package/web/app/site/sengi/assets/emoji/64/1f9c2.png +0 -0
  3191. package/web/app/site/sengi/assets/emoji/64/1f9c3.png +0 -0
  3192. package/web/app/site/sengi/assets/emoji/64/1f9c4.png +0 -0
  3193. package/web/app/site/sengi/assets/emoji/64/1f9c5.png +0 -0
  3194. package/web/app/site/sengi/assets/emoji/64/1f9c6.png +0 -0
  3195. package/web/app/site/sengi/assets/emoji/64/1f9c7.png +0 -0
  3196. package/web/app/site/sengi/assets/emoji/64/1f9c8.png +0 -0
  3197. package/web/app/site/sengi/assets/emoji/64/1f9c9.png +0 -0
  3198. package/web/app/site/sengi/assets/emoji/64/1f9ca.png +0 -0
  3199. package/web/app/site/sengi/assets/emoji/64/1f9cb.png +0 -0
  3200. package/web/app/site/sengi/assets/emoji/64/1f9cc.png +0 -0
  3201. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fb-2640.png +0 -0
  3202. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fb-2642.png +0 -0
  3203. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fb.png +0 -0
  3204. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fc-2640.png +0 -0
  3205. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fc-2642.png +0 -0
  3206. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fc.png +0 -0
  3207. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fd-2640.png +0 -0
  3208. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fd-2642.png +0 -0
  3209. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fd.png +0 -0
  3210. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fe-2640.png +0 -0
  3211. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fe-2642.png +0 -0
  3212. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3fe.png +0 -0
  3213. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3ff-2640.png +0 -0
  3214. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3ff-2642.png +0 -0
  3215. package/web/app/site/sengi/assets/emoji/64/1f9cd-1f3ff.png +0 -0
  3216. package/web/app/site/sengi/assets/emoji/64/1f9cd-2640.png +0 -0
  3217. package/web/app/site/sengi/assets/emoji/64/1f9cd-2642.png +0 -0
  3218. package/web/app/site/sengi/assets/emoji/64/1f9cd.png +0 -0
  3219. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fb-2640-27a1.png +0 -0
  3220. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fb-2640.png +0 -0
  3221. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fb-2642-27a1.png +0 -0
  3222. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fb-2642.png +0 -0
  3223. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fb-27a1.png +0 -0
  3224. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fb.png +0 -0
  3225. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fc-2640-27a1.png +0 -0
  3226. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fc-2640.png +0 -0
  3227. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fc-2642-27a1.png +0 -0
  3228. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fc-2642.png +0 -0
  3229. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fc-27a1.png +0 -0
  3230. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fc.png +0 -0
  3231. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fd-2640-27a1.png +0 -0
  3232. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fd-2640.png +0 -0
  3233. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fd-2642-27a1.png +0 -0
  3234. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fd-2642.png +0 -0
  3235. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fd-27a1.png +0 -0
  3236. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fd.png +0 -0
  3237. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fe-2640-27a1.png +0 -0
  3238. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fe-2640.png +0 -0
  3239. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fe-2642-27a1.png +0 -0
  3240. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fe-2642.png +0 -0
  3241. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fe-27a1.png +0 -0
  3242. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3fe.png +0 -0
  3243. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3ff-2640-27a1.png +0 -0
  3244. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3ff-2640.png +0 -0
  3245. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3ff-2642-27a1.png +0 -0
  3246. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3ff-2642.png +0 -0
  3247. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3ff-27a1.png +0 -0
  3248. package/web/app/site/sengi/assets/emoji/64/1f9ce-1f3ff.png +0 -0
  3249. package/web/app/site/sengi/assets/emoji/64/1f9ce-2640-27a1.png +0 -0
  3250. package/web/app/site/sengi/assets/emoji/64/1f9ce-2640.png +0 -0
  3251. package/web/app/site/sengi/assets/emoji/64/1f9ce-2642-27a1.png +0 -0
  3252. package/web/app/site/sengi/assets/emoji/64/1f9ce-2642.png +0 -0
  3253. package/web/app/site/sengi/assets/emoji/64/1f9ce-27a1.png +0 -0
  3254. package/web/app/site/sengi/assets/emoji/64/1f9ce.png +0 -0
  3255. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fb-2640.png +0 -0
  3256. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fb-2642.png +0 -0
  3257. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fb.png +0 -0
  3258. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fc-2640.png +0 -0
  3259. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fc-2642.png +0 -0
  3260. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fc.png +0 -0
  3261. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fd-2640.png +0 -0
  3262. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fd-2642.png +0 -0
  3263. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fd.png +0 -0
  3264. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fe-2640.png +0 -0
  3265. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fe-2642.png +0 -0
  3266. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3fe.png +0 -0
  3267. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3ff-2640.png +0 -0
  3268. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3ff-2642.png +0 -0
  3269. package/web/app/site/sengi/assets/emoji/64/1f9cf-1f3ff.png +0 -0
  3270. package/web/app/site/sengi/assets/emoji/64/1f9cf-2640.png +0 -0
  3271. package/web/app/site/sengi/assets/emoji/64/1f9cf-2642.png +0 -0
  3272. package/web/app/site/sengi/assets/emoji/64/1f9cf.png +0 -0
  3273. package/web/app/site/sengi/assets/emoji/64/1f9d0.png +0 -0
  3274. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f33e.png +0 -0
  3275. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f373.png +0 -0
  3276. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f37c.png +0 -0
  3277. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f384.png +0 -0
  3278. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f393.png +0 -0
  3279. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3a4.png +0 -0
  3280. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3a8.png +0 -0
  3281. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3eb.png +0 -0
  3282. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ed.png +0 -0
  3283. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f33e.png +0 -0
  3284. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f373.png +0 -0
  3285. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f37c.png +0 -0
  3286. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f384.png +0 -0
  3287. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f393.png +0 -0
  3288. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f3a4.png +0 -0
  3289. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f3a8.png +0 -0
  3290. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f3eb.png +0 -0
  3291. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f3ed.png +0 -0
  3292. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f4bb.png +0 -0
  3293. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f4bc.png +0 -0
  3294. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f527.png +0 -0
  3295. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f52c.png +0 -0
  3296. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f680.png +0 -0
  3297. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f692.png +0 -0
  3298. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f91d-1f9d1-1f3fb.png +0 -0
  3299. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f91d-1f9d1-1f3fc.png +0 -0
  3300. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f91d-1f9d1-1f3fd.png +0 -0
  3301. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f91d-1f9d1-1f3fe.png +0 -0
  3302. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f91d-1f9d1-1f3ff.png +0 -0
  3303. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9af-27a1.png +0 -0
  3304. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9af.png +0 -0
  3305. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9b0.png +0 -0
  3306. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9b1.png +0 -0
  3307. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9b2.png +0 -0
  3308. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9b3.png +0 -0
  3309. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9bc-27a1.png +0 -0
  3310. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9bc.png +0 -0
  3311. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9bd-27a1.png +0 -0
  3312. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-1f9bd.png +0 -0
  3313. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2695.png +0 -0
  3314. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2696.png +0 -0
  3315. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2708.png +0 -0
  3316. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f48b-1f9d1-1f3fc.png +0 -0
  3317. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f48b-1f9d1-1f3fd.png +0 -0
  3318. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f48b-1f9d1-1f3fe.png +0 -0
  3319. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f48b-1f9d1-1f3ff.png +0 -0
  3320. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f9d1-1f3fc.png +0 -0
  3321. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f9d1-1f3fd.png +0 -0
  3322. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f9d1-1f3fe.png +0 -0
  3323. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb-2764-1f9d1-1f3ff.png +0 -0
  3324. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fb.png +0 -0
  3325. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f33e.png +0 -0
  3326. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f373.png +0 -0
  3327. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f37c.png +0 -0
  3328. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f384.png +0 -0
  3329. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f393.png +0 -0
  3330. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f3a4.png +0 -0
  3331. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f3a8.png +0 -0
  3332. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f3eb.png +0 -0
  3333. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f3ed.png +0 -0
  3334. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f4bb.png +0 -0
  3335. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f4bc.png +0 -0
  3336. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f527.png +0 -0
  3337. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f52c.png +0 -0
  3338. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f680.png +0 -0
  3339. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f692.png +0 -0
  3340. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f91d-1f9d1-1f3fb.png +0 -0
  3341. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f91d-1f9d1-1f3fc.png +0 -0
  3342. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f91d-1f9d1-1f3fd.png +0 -0
  3343. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f91d-1f9d1-1f3fe.png +0 -0
  3344. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f91d-1f9d1-1f3ff.png +0 -0
  3345. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9af-27a1.png +0 -0
  3346. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9af.png +0 -0
  3347. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9b0.png +0 -0
  3348. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9b1.png +0 -0
  3349. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9b2.png +0 -0
  3350. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9b3.png +0 -0
  3351. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9bc-27a1.png +0 -0
  3352. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9bc.png +0 -0
  3353. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9bd-27a1.png +0 -0
  3354. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-1f9bd.png +0 -0
  3355. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2695.png +0 -0
  3356. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2696.png +0 -0
  3357. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2708.png +0 -0
  3358. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f48b-1f9d1-1f3fb.png +0 -0
  3359. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f48b-1f9d1-1f3fd.png +0 -0
  3360. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f48b-1f9d1-1f3fe.png +0 -0
  3361. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f48b-1f9d1-1f3ff.png +0 -0
  3362. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f9d1-1f3fb.png +0 -0
  3363. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f9d1-1f3fd.png +0 -0
  3364. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f9d1-1f3fe.png +0 -0
  3365. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc-2764-1f9d1-1f3ff.png +0 -0
  3366. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fc.png +0 -0
  3367. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f33e.png +0 -0
  3368. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f373.png +0 -0
  3369. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f37c.png +0 -0
  3370. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f384.png +0 -0
  3371. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f393.png +0 -0
  3372. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f3a4.png +0 -0
  3373. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f3a8.png +0 -0
  3374. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f3eb.png +0 -0
  3375. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f3ed.png +0 -0
  3376. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f4bb.png +0 -0
  3377. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f4bc.png +0 -0
  3378. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f527.png +0 -0
  3379. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f52c.png +0 -0
  3380. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f680.png +0 -0
  3381. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f692.png +0 -0
  3382. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f91d-1f9d1-1f3fb.png +0 -0
  3383. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f91d-1f9d1-1f3fc.png +0 -0
  3384. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f91d-1f9d1-1f3fd.png +0 -0
  3385. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f91d-1f9d1-1f3fe.png +0 -0
  3386. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f91d-1f9d1-1f3ff.png +0 -0
  3387. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9af-27a1.png +0 -0
  3388. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9af.png +0 -0
  3389. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9b0.png +0 -0
  3390. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9b1.png +0 -0
  3391. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9b2.png +0 -0
  3392. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9b3.png +0 -0
  3393. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9bc-27a1.png +0 -0
  3394. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9bc.png +0 -0
  3395. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9bd-27a1.png +0 -0
  3396. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-1f9bd.png +0 -0
  3397. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2695.png +0 -0
  3398. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2696.png +0 -0
  3399. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2708.png +0 -0
  3400. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f48b-1f9d1-1f3fb.png +0 -0
  3401. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f48b-1f9d1-1f3fc.png +0 -0
  3402. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f48b-1f9d1-1f3fe.png +0 -0
  3403. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f48b-1f9d1-1f3ff.png +0 -0
  3404. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f9d1-1f3fb.png +0 -0
  3405. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f9d1-1f3fc.png +0 -0
  3406. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f9d1-1f3fe.png +0 -0
  3407. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd-2764-1f9d1-1f3ff.png +0 -0
  3408. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fd.png +0 -0
  3409. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f33e.png +0 -0
  3410. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f373.png +0 -0
  3411. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f37c.png +0 -0
  3412. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f384.png +0 -0
  3413. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f393.png +0 -0
  3414. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f3a4.png +0 -0
  3415. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f3a8.png +0 -0
  3416. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f3eb.png +0 -0
  3417. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f3ed.png +0 -0
  3418. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f4bb.png +0 -0
  3419. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f4bc.png +0 -0
  3420. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f527.png +0 -0
  3421. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f52c.png +0 -0
  3422. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f680.png +0 -0
  3423. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f692.png +0 -0
  3424. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f91d-1f9d1-1f3fb.png +0 -0
  3425. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f91d-1f9d1-1f3fc.png +0 -0
  3426. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f91d-1f9d1-1f3fd.png +0 -0
  3427. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f91d-1f9d1-1f3fe.png +0 -0
  3428. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f91d-1f9d1-1f3ff.png +0 -0
  3429. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9af-27a1.png +0 -0
  3430. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9af.png +0 -0
  3431. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9b0.png +0 -0
  3432. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9b1.png +0 -0
  3433. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9b2.png +0 -0
  3434. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9b3.png +0 -0
  3435. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9bc-27a1.png +0 -0
  3436. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9bc.png +0 -0
  3437. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9bd-27a1.png +0 -0
  3438. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-1f9bd.png +0 -0
  3439. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2695.png +0 -0
  3440. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2696.png +0 -0
  3441. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2708.png +0 -0
  3442. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f48b-1f9d1-1f3fb.png +0 -0
  3443. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f48b-1f9d1-1f3fc.png +0 -0
  3444. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f48b-1f9d1-1f3fd.png +0 -0
  3445. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f48b-1f9d1-1f3ff.png +0 -0
  3446. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f9d1-1f3fb.png +0 -0
  3447. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f9d1-1f3fc.png +0 -0
  3448. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f9d1-1f3fd.png +0 -0
  3449. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe-2764-1f9d1-1f3ff.png +0 -0
  3450. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3fe.png +0 -0
  3451. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f33e.png +0 -0
  3452. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f373.png +0 -0
  3453. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f37c.png +0 -0
  3454. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f384.png +0 -0
  3455. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f393.png +0 -0
  3456. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f3a4.png +0 -0
  3457. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f3a8.png +0 -0
  3458. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f3eb.png +0 -0
  3459. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f3ed.png +0 -0
  3460. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f4bb.png +0 -0
  3461. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f4bc.png +0 -0
  3462. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f527.png +0 -0
  3463. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f52c.png +0 -0
  3464. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f680.png +0 -0
  3465. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f692.png +0 -0
  3466. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f91d-1f9d1-1f3fb.png +0 -0
  3467. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f91d-1f9d1-1f3fc.png +0 -0
  3468. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f91d-1f9d1-1f3fd.png +0 -0
  3469. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f91d-1f9d1-1f3fe.png +0 -0
  3470. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f91d-1f9d1-1f3ff.png +0 -0
  3471. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9af-27a1.png +0 -0
  3472. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9af.png +0 -0
  3473. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9b0.png +0 -0
  3474. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9b1.png +0 -0
  3475. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9b2.png +0 -0
  3476. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9b3.png +0 -0
  3477. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9bc-27a1.png +0 -0
  3478. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9bc.png +0 -0
  3479. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9bd-27a1.png +0 -0
  3480. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-1f9bd.png +0 -0
  3481. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2695.png +0 -0
  3482. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2696.png +0 -0
  3483. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2708.png +0 -0
  3484. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f48b-1f9d1-1f3fb.png +0 -0
  3485. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f48b-1f9d1-1f3fc.png +0 -0
  3486. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f48b-1f9d1-1f3fd.png +0 -0
  3487. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f48b-1f9d1-1f3fe.png +0 -0
  3488. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f9d1-1f3fb.png +0 -0
  3489. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f9d1-1f3fc.png +0 -0
  3490. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f9d1-1f3fd.png +0 -0
  3491. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff-2764-1f9d1-1f3fe.png +0 -0
  3492. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f3ff.png +0 -0
  3493. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f4bb.png +0 -0
  3494. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f4bc.png +0 -0
  3495. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f527.png +0 -0
  3496. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f52c.png +0 -0
  3497. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f680.png +0 -0
  3498. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f692.png +0 -0
  3499. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f91d-1f9d1.png +0 -0
  3500. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9af-27a1.png +0 -0
  3501. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9af.png +0 -0
  3502. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9b0.png +0 -0
  3503. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9b1.png +0 -0
  3504. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9b2.png +0 -0
  3505. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9b3.png +0 -0
  3506. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9bc-27a1.png +0 -0
  3507. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9bc.png +0 -0
  3508. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9bd-27a1.png +0 -0
  3509. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9bd.png +0 -0
  3510. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9d1-1f9d2-1f9d2.png +0 -0
  3511. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9d1-1f9d2.png +0 -0
  3512. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9d2-1f9d2.png +0 -0
  3513. package/web/app/site/sengi/assets/emoji/64/1f9d1-1f9d2.png +0 -0
  3514. package/web/app/site/sengi/assets/emoji/64/1f9d1-2695.png +0 -0
  3515. package/web/app/site/sengi/assets/emoji/64/1f9d1-2696.png +0 -0
  3516. package/web/app/site/sengi/assets/emoji/64/1f9d1-2708.png +0 -0
  3517. package/web/app/site/sengi/assets/emoji/64/1f9d1.png +0 -0
  3518. package/web/app/site/sengi/assets/emoji/64/1f9d2-1f3fb.png +0 -0
  3519. package/web/app/site/sengi/assets/emoji/64/1f9d2-1f3fc.png +0 -0
  3520. package/web/app/site/sengi/assets/emoji/64/1f9d2-1f3fd.png +0 -0
  3521. package/web/app/site/sengi/assets/emoji/64/1f9d2-1f3fe.png +0 -0
  3522. package/web/app/site/sengi/assets/emoji/64/1f9d2-1f3ff.png +0 -0
  3523. package/web/app/site/sengi/assets/emoji/64/1f9d2.png +0 -0
  3524. package/web/app/site/sengi/assets/emoji/64/1f9d3-1f3fb.png +0 -0
  3525. package/web/app/site/sengi/assets/emoji/64/1f9d3-1f3fc.png +0 -0
  3526. package/web/app/site/sengi/assets/emoji/64/1f9d3-1f3fd.png +0 -0
  3527. package/web/app/site/sengi/assets/emoji/64/1f9d3-1f3fe.png +0 -0
  3528. package/web/app/site/sengi/assets/emoji/64/1f9d3-1f3ff.png +0 -0
  3529. package/web/app/site/sengi/assets/emoji/64/1f9d3.png +0 -0
  3530. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fb-2640.png +0 -0
  3531. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fb-2642.png +0 -0
  3532. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fb.png +0 -0
  3533. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fc-2640.png +0 -0
  3534. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fc-2642.png +0 -0
  3535. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fc.png +0 -0
  3536. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fd-2640.png +0 -0
  3537. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fd-2642.png +0 -0
  3538. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fd.png +0 -0
  3539. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fe-2640.png +0 -0
  3540. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fe-2642.png +0 -0
  3541. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3fe.png +0 -0
  3542. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3ff-2640.png +0 -0
  3543. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3ff-2642.png +0 -0
  3544. package/web/app/site/sengi/assets/emoji/64/1f9d4-1f3ff.png +0 -0
  3545. package/web/app/site/sengi/assets/emoji/64/1f9d4-2640.png +0 -0
  3546. package/web/app/site/sengi/assets/emoji/64/1f9d4-2642.png +0 -0
  3547. package/web/app/site/sengi/assets/emoji/64/1f9d4.png +0 -0
  3548. package/web/app/site/sengi/assets/emoji/64/1f9d5-1f3fb.png +0 -0
  3549. package/web/app/site/sengi/assets/emoji/64/1f9d5-1f3fc.png +0 -0
  3550. package/web/app/site/sengi/assets/emoji/64/1f9d5-1f3fd.png +0 -0
  3551. package/web/app/site/sengi/assets/emoji/64/1f9d5-1f3fe.png +0 -0
  3552. package/web/app/site/sengi/assets/emoji/64/1f9d5-1f3ff.png +0 -0
  3553. package/web/app/site/sengi/assets/emoji/64/1f9d5.png +0 -0
  3554. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fb-2640.png +0 -0
  3555. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fb-2642.png +0 -0
  3556. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fb.png +0 -0
  3557. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fc-2640.png +0 -0
  3558. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fc-2642.png +0 -0
  3559. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fc.png +0 -0
  3560. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fd-2640.png +0 -0
  3561. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fd-2642.png +0 -0
  3562. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fd.png +0 -0
  3563. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fe-2640.png +0 -0
  3564. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fe-2642.png +0 -0
  3565. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3fe.png +0 -0
  3566. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3ff-2640.png +0 -0
  3567. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3ff-2642.png +0 -0
  3568. package/web/app/site/sengi/assets/emoji/64/1f9d6-1f3ff.png +0 -0
  3569. package/web/app/site/sengi/assets/emoji/64/1f9d6-2640.png +0 -0
  3570. package/web/app/site/sengi/assets/emoji/64/1f9d6-2642.png +0 -0
  3571. package/web/app/site/sengi/assets/emoji/64/1f9d6.png +0 -0
  3572. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fb-2640.png +0 -0
  3573. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fb-2642.png +0 -0
  3574. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fb.png +0 -0
  3575. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fc-2640.png +0 -0
  3576. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fc-2642.png +0 -0
  3577. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fc.png +0 -0
  3578. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fd-2640.png +0 -0
  3579. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fd-2642.png +0 -0
  3580. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fd.png +0 -0
  3581. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fe-2640.png +0 -0
  3582. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fe-2642.png +0 -0
  3583. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3fe.png +0 -0
  3584. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3ff-2640.png +0 -0
  3585. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3ff-2642.png +0 -0
  3586. package/web/app/site/sengi/assets/emoji/64/1f9d7-1f3ff.png +0 -0
  3587. package/web/app/site/sengi/assets/emoji/64/1f9d7-2640.png +0 -0
  3588. package/web/app/site/sengi/assets/emoji/64/1f9d7-2642.png +0 -0
  3589. package/web/app/site/sengi/assets/emoji/64/1f9d7.png +0 -0
  3590. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fb-2640.png +0 -0
  3591. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fb-2642.png +0 -0
  3592. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fb.png +0 -0
  3593. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fc-2640.png +0 -0
  3594. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fc-2642.png +0 -0
  3595. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fc.png +0 -0
  3596. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fd-2640.png +0 -0
  3597. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fd-2642.png +0 -0
  3598. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fd.png +0 -0
  3599. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fe-2640.png +0 -0
  3600. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fe-2642.png +0 -0
  3601. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3fe.png +0 -0
  3602. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3ff-2640.png +0 -0
  3603. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3ff-2642.png +0 -0
  3604. package/web/app/site/sengi/assets/emoji/64/1f9d8-1f3ff.png +0 -0
  3605. package/web/app/site/sengi/assets/emoji/64/1f9d8-2640.png +0 -0
  3606. package/web/app/site/sengi/assets/emoji/64/1f9d8-2642.png +0 -0
  3607. package/web/app/site/sengi/assets/emoji/64/1f9d8.png +0 -0
  3608. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fb-2640.png +0 -0
  3609. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fb-2642.png +0 -0
  3610. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fb.png +0 -0
  3611. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fc-2640.png +0 -0
  3612. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fc-2642.png +0 -0
  3613. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fc.png +0 -0
  3614. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fd-2640.png +0 -0
  3615. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fd-2642.png +0 -0
  3616. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fd.png +0 -0
  3617. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fe-2640.png +0 -0
  3618. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fe-2642.png +0 -0
  3619. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3fe.png +0 -0
  3620. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3ff-2640.png +0 -0
  3621. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3ff-2642.png +0 -0
  3622. package/web/app/site/sengi/assets/emoji/64/1f9d9-1f3ff.png +0 -0
  3623. package/web/app/site/sengi/assets/emoji/64/1f9d9-2640.png +0 -0
  3624. package/web/app/site/sengi/assets/emoji/64/1f9d9-2642.png +0 -0
  3625. package/web/app/site/sengi/assets/emoji/64/1f9d9.png +0 -0
  3626. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fb-2640.png +0 -0
  3627. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fb-2642.png +0 -0
  3628. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fb.png +0 -0
  3629. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fc-2640.png +0 -0
  3630. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fc-2642.png +0 -0
  3631. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fc.png +0 -0
  3632. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fd-2640.png +0 -0
  3633. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fd-2642.png +0 -0
  3634. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fd.png +0 -0
  3635. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fe-2640.png +0 -0
  3636. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fe-2642.png +0 -0
  3637. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3fe.png +0 -0
  3638. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3ff-2640.png +0 -0
  3639. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3ff-2642.png +0 -0
  3640. package/web/app/site/sengi/assets/emoji/64/1f9da-1f3ff.png +0 -0
  3641. package/web/app/site/sengi/assets/emoji/64/1f9da-2640.png +0 -0
  3642. package/web/app/site/sengi/assets/emoji/64/1f9da-2642.png +0 -0
  3643. package/web/app/site/sengi/assets/emoji/64/1f9da.png +0 -0
  3644. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fb-2640.png +0 -0
  3645. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fb-2642.png +0 -0
  3646. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fb.png +0 -0
  3647. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fc-2640.png +0 -0
  3648. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fc-2642.png +0 -0
  3649. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fc.png +0 -0
  3650. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fd-2640.png +0 -0
  3651. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fd-2642.png +0 -0
  3652. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fd.png +0 -0
  3653. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fe-2640.png +0 -0
  3654. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fe-2642.png +0 -0
  3655. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3fe.png +0 -0
  3656. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3ff-2640.png +0 -0
  3657. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3ff-2642.png +0 -0
  3658. package/web/app/site/sengi/assets/emoji/64/1f9db-1f3ff.png +0 -0
  3659. package/web/app/site/sengi/assets/emoji/64/1f9db-2640.png +0 -0
  3660. package/web/app/site/sengi/assets/emoji/64/1f9db-2642.png +0 -0
  3661. package/web/app/site/sengi/assets/emoji/64/1f9db.png +0 -0
  3662. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fb-2640.png +0 -0
  3663. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fb-2642.png +0 -0
  3664. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fb.png +0 -0
  3665. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fc-2640.png +0 -0
  3666. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fc-2642.png +0 -0
  3667. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fc.png +0 -0
  3668. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fd-2640.png +0 -0
  3669. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fd-2642.png +0 -0
  3670. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fd.png +0 -0
  3671. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fe-2640.png +0 -0
  3672. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fe-2642.png +0 -0
  3673. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3fe.png +0 -0
  3674. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3ff-2640.png +0 -0
  3675. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3ff-2642.png +0 -0
  3676. package/web/app/site/sengi/assets/emoji/64/1f9dc-1f3ff.png +0 -0
  3677. package/web/app/site/sengi/assets/emoji/64/1f9dc-2640.png +0 -0
  3678. package/web/app/site/sengi/assets/emoji/64/1f9dc-2642.png +0 -0
  3679. package/web/app/site/sengi/assets/emoji/64/1f9dc.png +0 -0
  3680. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fb-2640.png +0 -0
  3681. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fb-2642.png +0 -0
  3682. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fb.png +0 -0
  3683. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fc-2640.png +0 -0
  3684. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fc-2642.png +0 -0
  3685. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fc.png +0 -0
  3686. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fd-2640.png +0 -0
  3687. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fd-2642.png +0 -0
  3688. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fd.png +0 -0
  3689. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fe-2640.png +0 -0
  3690. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fe-2642.png +0 -0
  3691. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3fe.png +0 -0
  3692. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3ff-2640.png +0 -0
  3693. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3ff-2642.png +0 -0
  3694. package/web/app/site/sengi/assets/emoji/64/1f9dd-1f3ff.png +0 -0
  3695. package/web/app/site/sengi/assets/emoji/64/1f9dd-2640.png +0 -0
  3696. package/web/app/site/sengi/assets/emoji/64/1f9dd-2642.png +0 -0
  3697. package/web/app/site/sengi/assets/emoji/64/1f9dd.png +0 -0
  3698. package/web/app/site/sengi/assets/emoji/64/1f9de-2640.png +0 -0
  3699. package/web/app/site/sengi/assets/emoji/64/1f9de-2642.png +0 -0
  3700. package/web/app/site/sengi/assets/emoji/64/1f9de.png +0 -0
  3701. package/web/app/site/sengi/assets/emoji/64/1f9df-2640.png +0 -0
  3702. package/web/app/site/sengi/assets/emoji/64/1f9df-2642.png +0 -0
  3703. package/web/app/site/sengi/assets/emoji/64/1f9df.png +0 -0
  3704. package/web/app/site/sengi/assets/emoji/64/1f9e0.png +0 -0
  3705. package/web/app/site/sengi/assets/emoji/64/1f9e1.png +0 -0
  3706. package/web/app/site/sengi/assets/emoji/64/1f9e2.png +0 -0
  3707. package/web/app/site/sengi/assets/emoji/64/1f9e3.png +0 -0
  3708. package/web/app/site/sengi/assets/emoji/64/1f9e4.png +0 -0
  3709. package/web/app/site/sengi/assets/emoji/64/1f9e5.png +0 -0
  3710. package/web/app/site/sengi/assets/emoji/64/1f9e6.png +0 -0
  3711. package/web/app/site/sengi/assets/emoji/64/1f9e7.png +0 -0
  3712. package/web/app/site/sengi/assets/emoji/64/1f9e8.png +0 -0
  3713. package/web/app/site/sengi/assets/emoji/64/1f9e9.png +0 -0
  3714. package/web/app/site/sengi/assets/emoji/64/1f9ea.png +0 -0
  3715. package/web/app/site/sengi/assets/emoji/64/1f9eb.png +0 -0
  3716. package/web/app/site/sengi/assets/emoji/64/1f9ec.png +0 -0
  3717. package/web/app/site/sengi/assets/emoji/64/1f9ed.png +0 -0
  3718. package/web/app/site/sengi/assets/emoji/64/1f9ee.png +0 -0
  3719. package/web/app/site/sengi/assets/emoji/64/1f9ef.png +0 -0
  3720. package/web/app/site/sengi/assets/emoji/64/1f9f0.png +0 -0
  3721. package/web/app/site/sengi/assets/emoji/64/1f9f1.png +0 -0
  3722. package/web/app/site/sengi/assets/emoji/64/1f9f2.png +0 -0
  3723. package/web/app/site/sengi/assets/emoji/64/1f9f3.png +0 -0
  3724. package/web/app/site/sengi/assets/emoji/64/1f9f4.png +0 -0
  3725. package/web/app/site/sengi/assets/emoji/64/1f9f5.png +0 -0
  3726. package/web/app/site/sengi/assets/emoji/64/1f9f6.png +0 -0
  3727. package/web/app/site/sengi/assets/emoji/64/1f9f7.png +0 -0
  3728. package/web/app/site/sengi/assets/emoji/64/1f9f8.png +0 -0
  3729. package/web/app/site/sengi/assets/emoji/64/1f9f9.png +0 -0
  3730. package/web/app/site/sengi/assets/emoji/64/1f9fa.png +0 -0
  3731. package/web/app/site/sengi/assets/emoji/64/1f9fb.png +0 -0
  3732. package/web/app/site/sengi/assets/emoji/64/1f9fc.png +0 -0
  3733. package/web/app/site/sengi/assets/emoji/64/1f9fd.png +0 -0
  3734. package/web/app/site/sengi/assets/emoji/64/1f9fe.png +0 -0
  3735. package/web/app/site/sengi/assets/emoji/64/1f9ff.png +0 -0
  3736. package/web/app/site/sengi/assets/emoji/64/1fa70.png +0 -0
  3737. package/web/app/site/sengi/assets/emoji/64/1fa71.png +0 -0
  3738. package/web/app/site/sengi/assets/emoji/64/1fa72.png +0 -0
  3739. package/web/app/site/sengi/assets/emoji/64/1fa73.png +0 -0
  3740. package/web/app/site/sengi/assets/emoji/64/1fa74.png +0 -0
  3741. package/web/app/site/sengi/assets/emoji/64/1fa75.png +0 -0
  3742. package/web/app/site/sengi/assets/emoji/64/1fa76.png +0 -0
  3743. package/web/app/site/sengi/assets/emoji/64/1fa77.png +0 -0
  3744. package/web/app/site/sengi/assets/emoji/64/1fa78.png +0 -0
  3745. package/web/app/site/sengi/assets/emoji/64/1fa79.png +0 -0
  3746. package/web/app/site/sengi/assets/emoji/64/1fa7a.png +0 -0
  3747. package/web/app/site/sengi/assets/emoji/64/1fa7b.png +0 -0
  3748. package/web/app/site/sengi/assets/emoji/64/1fa7c.png +0 -0
  3749. package/web/app/site/sengi/assets/emoji/64/1fa80.png +0 -0
  3750. package/web/app/site/sengi/assets/emoji/64/1fa81.png +0 -0
  3751. package/web/app/site/sengi/assets/emoji/64/1fa82.png +0 -0
  3752. package/web/app/site/sengi/assets/emoji/64/1fa83.png +0 -0
  3753. package/web/app/site/sengi/assets/emoji/64/1fa84.png +0 -0
  3754. package/web/app/site/sengi/assets/emoji/64/1fa85.png +0 -0
  3755. package/web/app/site/sengi/assets/emoji/64/1fa86.png +0 -0
  3756. package/web/app/site/sengi/assets/emoji/64/1fa87.png +0 -0
  3757. package/web/app/site/sengi/assets/emoji/64/1fa88.png +0 -0
  3758. package/web/app/site/sengi/assets/emoji/64/1fa89.png +0 -0
  3759. package/web/app/site/sengi/assets/emoji/64/1fa8f.png +0 -0
  3760. package/web/app/site/sengi/assets/emoji/64/1fa90.png +0 -0
  3761. package/web/app/site/sengi/assets/emoji/64/1fa91.png +0 -0
  3762. package/web/app/site/sengi/assets/emoji/64/1fa92.png +0 -0
  3763. package/web/app/site/sengi/assets/emoji/64/1fa93.png +0 -0
  3764. package/web/app/site/sengi/assets/emoji/64/1fa94.png +0 -0
  3765. package/web/app/site/sengi/assets/emoji/64/1fa95.png +0 -0
  3766. package/web/app/site/sengi/assets/emoji/64/1fa96.png +0 -0
  3767. package/web/app/site/sengi/assets/emoji/64/1fa97.png +0 -0
  3768. package/web/app/site/sengi/assets/emoji/64/1fa98.png +0 -0
  3769. package/web/app/site/sengi/assets/emoji/64/1fa99.png +0 -0
  3770. package/web/app/site/sengi/assets/emoji/64/1fa9a.png +0 -0
  3771. package/web/app/site/sengi/assets/emoji/64/1fa9b.png +0 -0
  3772. package/web/app/site/sengi/assets/emoji/64/1fa9c.png +0 -0
  3773. package/web/app/site/sengi/assets/emoji/64/1fa9d.png +0 -0
  3774. package/web/app/site/sengi/assets/emoji/64/1fa9e.png +0 -0
  3775. package/web/app/site/sengi/assets/emoji/64/1fa9f.png +0 -0
  3776. package/web/app/site/sengi/assets/emoji/64/1faa0.png +0 -0
  3777. package/web/app/site/sengi/assets/emoji/64/1faa1.png +0 -0
  3778. package/web/app/site/sengi/assets/emoji/64/1faa2.png +0 -0
  3779. package/web/app/site/sengi/assets/emoji/64/1faa3.png +0 -0
  3780. package/web/app/site/sengi/assets/emoji/64/1faa4.png +0 -0
  3781. package/web/app/site/sengi/assets/emoji/64/1faa5.png +0 -0
  3782. package/web/app/site/sengi/assets/emoji/64/1faa6.png +0 -0
  3783. package/web/app/site/sengi/assets/emoji/64/1faa7.png +0 -0
  3784. package/web/app/site/sengi/assets/emoji/64/1faa8.png +0 -0
  3785. package/web/app/site/sengi/assets/emoji/64/1faa9.png +0 -0
  3786. package/web/app/site/sengi/assets/emoji/64/1faaa.png +0 -0
  3787. package/web/app/site/sengi/assets/emoji/64/1faab.png +0 -0
  3788. package/web/app/site/sengi/assets/emoji/64/1faac.png +0 -0
  3789. package/web/app/site/sengi/assets/emoji/64/1faad.png +0 -0
  3790. package/web/app/site/sengi/assets/emoji/64/1faae.png +0 -0
  3791. package/web/app/site/sengi/assets/emoji/64/1faaf.png +0 -0
  3792. package/web/app/site/sengi/assets/emoji/64/1fab0.png +0 -0
  3793. package/web/app/site/sengi/assets/emoji/64/1fab1.png +0 -0
  3794. package/web/app/site/sengi/assets/emoji/64/1fab2.png +0 -0
  3795. package/web/app/site/sengi/assets/emoji/64/1fab3.png +0 -0
  3796. package/web/app/site/sengi/assets/emoji/64/1fab4.png +0 -0
  3797. package/web/app/site/sengi/assets/emoji/64/1fab5.png +0 -0
  3798. package/web/app/site/sengi/assets/emoji/64/1fab6.png +0 -0
  3799. package/web/app/site/sengi/assets/emoji/64/1fab7.png +0 -0
  3800. package/web/app/site/sengi/assets/emoji/64/1fab8.png +0 -0
  3801. package/web/app/site/sengi/assets/emoji/64/1fab9.png +0 -0
  3802. package/web/app/site/sengi/assets/emoji/64/1faba.png +0 -0
  3803. package/web/app/site/sengi/assets/emoji/64/1fabb.png +0 -0
  3804. package/web/app/site/sengi/assets/emoji/64/1fabc.png +0 -0
  3805. package/web/app/site/sengi/assets/emoji/64/1fabd.png +0 -0
  3806. package/web/app/site/sengi/assets/emoji/64/1fabe.png +0 -0
  3807. package/web/app/site/sengi/assets/emoji/64/1fabf.png +0 -0
  3808. package/web/app/site/sengi/assets/emoji/64/1fac0.png +0 -0
  3809. package/web/app/site/sengi/assets/emoji/64/1fac1.png +0 -0
  3810. package/web/app/site/sengi/assets/emoji/64/1fac2.png +0 -0
  3811. package/web/app/site/sengi/assets/emoji/64/1fac3-1f3fb.png +0 -0
  3812. package/web/app/site/sengi/assets/emoji/64/1fac3-1f3fc.png +0 -0
  3813. package/web/app/site/sengi/assets/emoji/64/1fac3-1f3fd.png +0 -0
  3814. package/web/app/site/sengi/assets/emoji/64/1fac3-1f3fe.png +0 -0
  3815. package/web/app/site/sengi/assets/emoji/64/1fac3-1f3ff.png +0 -0
  3816. package/web/app/site/sengi/assets/emoji/64/1fac3.png +0 -0
  3817. package/web/app/site/sengi/assets/emoji/64/1fac4-1f3fb.png +0 -0
  3818. package/web/app/site/sengi/assets/emoji/64/1fac4-1f3fc.png +0 -0
  3819. package/web/app/site/sengi/assets/emoji/64/1fac4-1f3fd.png +0 -0
  3820. package/web/app/site/sengi/assets/emoji/64/1fac4-1f3fe.png +0 -0
  3821. package/web/app/site/sengi/assets/emoji/64/1fac4-1f3ff.png +0 -0
  3822. package/web/app/site/sengi/assets/emoji/64/1fac4.png +0 -0
  3823. package/web/app/site/sengi/assets/emoji/64/1fac5-1f3fb.png +0 -0
  3824. package/web/app/site/sengi/assets/emoji/64/1fac5-1f3fc.png +0 -0
  3825. package/web/app/site/sengi/assets/emoji/64/1fac5-1f3fd.png +0 -0
  3826. package/web/app/site/sengi/assets/emoji/64/1fac5-1f3fe.png +0 -0
  3827. package/web/app/site/sengi/assets/emoji/64/1fac5-1f3ff.png +0 -0
  3828. package/web/app/site/sengi/assets/emoji/64/1fac5.png +0 -0
  3829. package/web/app/site/sengi/assets/emoji/64/1fac6.png +0 -0
  3830. package/web/app/site/sengi/assets/emoji/64/1face.png +0 -0
  3831. package/web/app/site/sengi/assets/emoji/64/1facf.png +0 -0
  3832. package/web/app/site/sengi/assets/emoji/64/1fad0.png +0 -0
  3833. package/web/app/site/sengi/assets/emoji/64/1fad1.png +0 -0
  3834. package/web/app/site/sengi/assets/emoji/64/1fad2.png +0 -0
  3835. package/web/app/site/sengi/assets/emoji/64/1fad3.png +0 -0
  3836. package/web/app/site/sengi/assets/emoji/64/1fad4.png +0 -0
  3837. package/web/app/site/sengi/assets/emoji/64/1fad5.png +0 -0
  3838. package/web/app/site/sengi/assets/emoji/64/1fad6.png +0 -0
  3839. package/web/app/site/sengi/assets/emoji/64/1fad7.png +0 -0
  3840. package/web/app/site/sengi/assets/emoji/64/1fad8.png +0 -0
  3841. package/web/app/site/sengi/assets/emoji/64/1fad9.png +0 -0
  3842. package/web/app/site/sengi/assets/emoji/64/1fada.png +0 -0
  3843. package/web/app/site/sengi/assets/emoji/64/1fadb.png +0 -0
  3844. package/web/app/site/sengi/assets/emoji/64/1fadc.png +0 -0
  3845. package/web/app/site/sengi/assets/emoji/64/1fadf.png +0 -0
  3846. package/web/app/site/sengi/assets/emoji/64/1fae0.png +0 -0
  3847. package/web/app/site/sengi/assets/emoji/64/1fae1.png +0 -0
  3848. package/web/app/site/sengi/assets/emoji/64/1fae2.png +0 -0
  3849. package/web/app/site/sengi/assets/emoji/64/1fae3.png +0 -0
  3850. package/web/app/site/sengi/assets/emoji/64/1fae4.png +0 -0
  3851. package/web/app/site/sengi/assets/emoji/64/1fae5.png +0 -0
  3852. package/web/app/site/sengi/assets/emoji/64/1fae6.png +0 -0
  3853. package/web/app/site/sengi/assets/emoji/64/1fae7.png +0 -0
  3854. package/web/app/site/sengi/assets/emoji/64/1fae8.png +0 -0
  3855. package/web/app/site/sengi/assets/emoji/64/1fae9.png +0 -0
  3856. package/web/app/site/sengi/assets/emoji/64/1faf0-1f3fb.png +0 -0
  3857. package/web/app/site/sengi/assets/emoji/64/1faf0-1f3fc.png +0 -0
  3858. package/web/app/site/sengi/assets/emoji/64/1faf0-1f3fd.png +0 -0
  3859. package/web/app/site/sengi/assets/emoji/64/1faf0-1f3fe.png +0 -0
  3860. package/web/app/site/sengi/assets/emoji/64/1faf0-1f3ff.png +0 -0
  3861. package/web/app/site/sengi/assets/emoji/64/1faf0.png +0 -0
  3862. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fb-1faf2-1f3fc.png +0 -0
  3863. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fb-1faf2-1f3fd.png +0 -0
  3864. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fb-1faf2-1f3fe.png +0 -0
  3865. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fb-1faf2-1f3ff.png +0 -0
  3866. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fb.png +0 -0
  3867. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fc-1faf2-1f3fb.png +0 -0
  3868. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fc-1faf2-1f3fd.png +0 -0
  3869. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fc-1faf2-1f3fe.png +0 -0
  3870. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fc-1faf2-1f3ff.png +0 -0
  3871. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fc.png +0 -0
  3872. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fd-1faf2-1f3fb.png +0 -0
  3873. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fd-1faf2-1f3fc.png +0 -0
  3874. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fd-1faf2-1f3fe.png +0 -0
  3875. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fd-1faf2-1f3ff.png +0 -0
  3876. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fd.png +0 -0
  3877. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fe-1faf2-1f3fb.png +0 -0
  3878. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fe-1faf2-1f3fc.png +0 -0
  3879. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fe-1faf2-1f3fd.png +0 -0
  3880. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fe-1faf2-1f3ff.png +0 -0
  3881. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3fe.png +0 -0
  3882. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3ff-1faf2-1f3fb.png +0 -0
  3883. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3ff-1faf2-1f3fc.png +0 -0
  3884. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3ff-1faf2-1f3fd.png +0 -0
  3885. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3ff-1faf2-1f3fe.png +0 -0
  3886. package/web/app/site/sengi/assets/emoji/64/1faf1-1f3ff.png +0 -0
  3887. package/web/app/site/sengi/assets/emoji/64/1faf1.png +0 -0
  3888. package/web/app/site/sengi/assets/emoji/64/1faf2-1f3fb.png +0 -0
  3889. package/web/app/site/sengi/assets/emoji/64/1faf2-1f3fc.png +0 -0
  3890. package/web/app/site/sengi/assets/emoji/64/1faf2-1f3fd.png +0 -0
  3891. package/web/app/site/sengi/assets/emoji/64/1faf2-1f3fe.png +0 -0
  3892. package/web/app/site/sengi/assets/emoji/64/1faf2-1f3ff.png +0 -0
  3893. package/web/app/site/sengi/assets/emoji/64/1faf2.png +0 -0
  3894. package/web/app/site/sengi/assets/emoji/64/1faf3-1f3fb.png +0 -0
  3895. package/web/app/site/sengi/assets/emoji/64/1faf3-1f3fc.png +0 -0
  3896. package/web/app/site/sengi/assets/emoji/64/1faf3-1f3fd.png +0 -0
  3897. package/web/app/site/sengi/assets/emoji/64/1faf3-1f3fe.png +0 -0
  3898. package/web/app/site/sengi/assets/emoji/64/1faf3-1f3ff.png +0 -0
  3899. package/web/app/site/sengi/assets/emoji/64/1faf3.png +0 -0
  3900. package/web/app/site/sengi/assets/emoji/64/1faf4-1f3fb.png +0 -0
  3901. package/web/app/site/sengi/assets/emoji/64/1faf4-1f3fc.png +0 -0
  3902. package/web/app/site/sengi/assets/emoji/64/1faf4-1f3fd.png +0 -0
  3903. package/web/app/site/sengi/assets/emoji/64/1faf4-1f3fe.png +0 -0
  3904. package/web/app/site/sengi/assets/emoji/64/1faf4-1f3ff.png +0 -0
  3905. package/web/app/site/sengi/assets/emoji/64/1faf4.png +0 -0
  3906. package/web/app/site/sengi/assets/emoji/64/1faf5-1f3fb.png +0 -0
  3907. package/web/app/site/sengi/assets/emoji/64/1faf5-1f3fc.png +0 -0
  3908. package/web/app/site/sengi/assets/emoji/64/1faf5-1f3fd.png +0 -0
  3909. package/web/app/site/sengi/assets/emoji/64/1faf5-1f3fe.png +0 -0
  3910. package/web/app/site/sengi/assets/emoji/64/1faf5-1f3ff.png +0 -0
  3911. package/web/app/site/sengi/assets/emoji/64/1faf5.png +0 -0
  3912. package/web/app/site/sengi/assets/emoji/64/1faf6-1f3fb.png +0 -0
  3913. package/web/app/site/sengi/assets/emoji/64/1faf6-1f3fc.png +0 -0
  3914. package/web/app/site/sengi/assets/emoji/64/1faf6-1f3fd.png +0 -0
  3915. package/web/app/site/sengi/assets/emoji/64/1faf6-1f3fe.png +0 -0
  3916. package/web/app/site/sengi/assets/emoji/64/1faf6-1f3ff.png +0 -0
  3917. package/web/app/site/sengi/assets/emoji/64/1faf6.png +0 -0
  3918. package/web/app/site/sengi/assets/emoji/64/1faf7-1f3fb.png +0 -0
  3919. package/web/app/site/sengi/assets/emoji/64/1faf7-1f3fc.png +0 -0
  3920. package/web/app/site/sengi/assets/emoji/64/1faf7-1f3fd.png +0 -0
  3921. package/web/app/site/sengi/assets/emoji/64/1faf7-1f3fe.png +0 -0
  3922. package/web/app/site/sengi/assets/emoji/64/1faf7-1f3ff.png +0 -0
  3923. package/web/app/site/sengi/assets/emoji/64/1faf7.png +0 -0
  3924. package/web/app/site/sengi/assets/emoji/64/1faf8-1f3fb.png +0 -0
  3925. package/web/app/site/sengi/assets/emoji/64/1faf8-1f3fc.png +0 -0
  3926. package/web/app/site/sengi/assets/emoji/64/1faf8-1f3fd.png +0 -0
  3927. package/web/app/site/sengi/assets/emoji/64/1faf8-1f3fe.png +0 -0
  3928. package/web/app/site/sengi/assets/emoji/64/1faf8-1f3ff.png +0 -0
  3929. package/web/app/site/sengi/assets/emoji/64/1faf8.png +0 -0
  3930. package/web/app/site/sengi/assets/emoji/64/203c.png +0 -0
  3931. package/web/app/site/sengi/assets/emoji/64/2049.png +0 -0
  3932. package/web/app/site/sengi/assets/emoji/64/2122.png +0 -0
  3933. package/web/app/site/sengi/assets/emoji/64/2139.png +0 -0
  3934. package/web/app/site/sengi/assets/emoji/64/2194.png +0 -0
  3935. package/web/app/site/sengi/assets/emoji/64/2195.png +0 -0
  3936. package/web/app/site/sengi/assets/emoji/64/2196.png +0 -0
  3937. package/web/app/site/sengi/assets/emoji/64/2197.png +0 -0
  3938. package/web/app/site/sengi/assets/emoji/64/2198.png +0 -0
  3939. package/web/app/site/sengi/assets/emoji/64/2199.png +0 -0
  3940. package/web/app/site/sengi/assets/emoji/64/21a9.png +0 -0
  3941. package/web/app/site/sengi/assets/emoji/64/21aa.png +0 -0
  3942. package/web/app/site/sengi/assets/emoji/64/231a.png +0 -0
  3943. package/web/app/site/sengi/assets/emoji/64/231b.png +0 -0
  3944. package/web/app/site/sengi/assets/emoji/64/2328.png +0 -0
  3945. package/web/app/site/sengi/assets/emoji/64/23cf.png +0 -0
  3946. package/web/app/site/sengi/assets/emoji/64/23e9.png +0 -0
  3947. package/web/app/site/sengi/assets/emoji/64/23ea.png +0 -0
  3948. package/web/app/site/sengi/assets/emoji/64/23eb.png +0 -0
  3949. package/web/app/site/sengi/assets/emoji/64/23ec.png +0 -0
  3950. package/web/app/site/sengi/assets/emoji/64/23ed.png +0 -0
  3951. package/web/app/site/sengi/assets/emoji/64/23ee.png +0 -0
  3952. package/web/app/site/sengi/assets/emoji/64/23ef.png +0 -0
  3953. package/web/app/site/sengi/assets/emoji/64/23f0.png +0 -0
  3954. package/web/app/site/sengi/assets/emoji/64/23f1.png +0 -0
  3955. package/web/app/site/sengi/assets/emoji/64/23f2.png +0 -0
  3956. package/web/app/site/sengi/assets/emoji/64/23f3.png +0 -0
  3957. package/web/app/site/sengi/assets/emoji/64/23f8.png +0 -0
  3958. package/web/app/site/sengi/assets/emoji/64/23f9.png +0 -0
  3959. package/web/app/site/sengi/assets/emoji/64/23fa.png +0 -0
  3960. package/web/app/site/sengi/assets/emoji/64/24c2.png +0 -0
  3961. package/web/app/site/sengi/assets/emoji/64/25aa.png +0 -0
  3962. package/web/app/site/sengi/assets/emoji/64/25ab.png +0 -0
  3963. package/web/app/site/sengi/assets/emoji/64/25b6.png +0 -0
  3964. package/web/app/site/sengi/assets/emoji/64/25c0.png +0 -0
  3965. package/web/app/site/sengi/assets/emoji/64/25fb.png +0 -0
  3966. package/web/app/site/sengi/assets/emoji/64/25fc.png +0 -0
  3967. package/web/app/site/sengi/assets/emoji/64/25fd.png +0 -0
  3968. package/web/app/site/sengi/assets/emoji/64/25fe.png +0 -0
  3969. package/web/app/site/sengi/assets/emoji/64/2600.png +0 -0
  3970. package/web/app/site/sengi/assets/emoji/64/2601.png +0 -0
  3971. package/web/app/site/sengi/assets/emoji/64/2602.png +0 -0
  3972. package/web/app/site/sengi/assets/emoji/64/2603.png +0 -0
  3973. package/web/app/site/sengi/assets/emoji/64/2604.png +0 -0
  3974. package/web/app/site/sengi/assets/emoji/64/260e.png +0 -0
  3975. package/web/app/site/sengi/assets/emoji/64/2611.png +0 -0
  3976. package/web/app/site/sengi/assets/emoji/64/2614.png +0 -0
  3977. package/web/app/site/sengi/assets/emoji/64/2615.png +0 -0
  3978. package/web/app/site/sengi/assets/emoji/64/2618.png +0 -0
  3979. package/web/app/site/sengi/assets/emoji/64/261d-1f3fb.png +0 -0
  3980. package/web/app/site/sengi/assets/emoji/64/261d-1f3fc.png +0 -0
  3981. package/web/app/site/sengi/assets/emoji/64/261d-1f3fd.png +0 -0
  3982. package/web/app/site/sengi/assets/emoji/64/261d-1f3fe.png +0 -0
  3983. package/web/app/site/sengi/assets/emoji/64/261d-1f3ff.png +0 -0
  3984. package/web/app/site/sengi/assets/emoji/64/261d.png +0 -0
  3985. package/web/app/site/sengi/assets/emoji/64/2620.png +0 -0
  3986. package/web/app/site/sengi/assets/emoji/64/2622.png +0 -0
  3987. package/web/app/site/sengi/assets/emoji/64/2623.png +0 -0
  3988. package/web/app/site/sengi/assets/emoji/64/2626.png +0 -0
  3989. package/web/app/site/sengi/assets/emoji/64/262a.png +0 -0
  3990. package/web/app/site/sengi/assets/emoji/64/262e.png +0 -0
  3991. package/web/app/site/sengi/assets/emoji/64/262f.png +0 -0
  3992. package/web/app/site/sengi/assets/emoji/64/2638.png +0 -0
  3993. package/web/app/site/sengi/assets/emoji/64/2639.png +0 -0
  3994. package/web/app/site/sengi/assets/emoji/64/263a.png +0 -0
  3995. package/web/app/site/sengi/assets/emoji/64/2640.png +0 -0
  3996. package/web/app/site/sengi/assets/emoji/64/2642.png +0 -0
  3997. package/web/app/site/sengi/assets/emoji/64/2648.png +0 -0
  3998. package/web/app/site/sengi/assets/emoji/64/2649.png +0 -0
  3999. package/web/app/site/sengi/assets/emoji/64/264a.png +0 -0
  4000. package/web/app/site/sengi/assets/emoji/64/264b.png +0 -0
  4001. package/web/app/site/sengi/assets/emoji/64/264c.png +0 -0
  4002. package/web/app/site/sengi/assets/emoji/64/264d.png +0 -0
  4003. package/web/app/site/sengi/assets/emoji/64/264e.png +0 -0
  4004. package/web/app/site/sengi/assets/emoji/64/264f.png +0 -0
  4005. package/web/app/site/sengi/assets/emoji/64/2650.png +0 -0
  4006. package/web/app/site/sengi/assets/emoji/64/2651.png +0 -0
  4007. package/web/app/site/sengi/assets/emoji/64/2652.png +0 -0
  4008. package/web/app/site/sengi/assets/emoji/64/2653.png +0 -0
  4009. package/web/app/site/sengi/assets/emoji/64/265f.png +0 -0
  4010. package/web/app/site/sengi/assets/emoji/64/2660.png +0 -0
  4011. package/web/app/site/sengi/assets/emoji/64/2663.png +0 -0
  4012. package/web/app/site/sengi/assets/emoji/64/2665.png +0 -0
  4013. package/web/app/site/sengi/assets/emoji/64/2666.png +0 -0
  4014. package/web/app/site/sengi/assets/emoji/64/2668.png +0 -0
  4015. package/web/app/site/sengi/assets/emoji/64/267b.png +0 -0
  4016. package/web/app/site/sengi/assets/emoji/64/267e.png +0 -0
  4017. package/web/app/site/sengi/assets/emoji/64/267f.png +0 -0
  4018. package/web/app/site/sengi/assets/emoji/64/2692.png +0 -0
  4019. package/web/app/site/sengi/assets/emoji/64/2693.png +0 -0
  4020. package/web/app/site/sengi/assets/emoji/64/2694.png +0 -0
  4021. package/web/app/site/sengi/assets/emoji/64/2695.png +0 -0
  4022. package/web/app/site/sengi/assets/emoji/64/2696.png +0 -0
  4023. package/web/app/site/sengi/assets/emoji/64/2697.png +0 -0
  4024. package/web/app/site/sengi/assets/emoji/64/2699.png +0 -0
  4025. package/web/app/site/sengi/assets/emoji/64/269b.png +0 -0
  4026. package/web/app/site/sengi/assets/emoji/64/269c.png +0 -0
  4027. package/web/app/site/sengi/assets/emoji/64/26a0.png +0 -0
  4028. package/web/app/site/sengi/assets/emoji/64/26a1.png +0 -0
  4029. package/web/app/site/sengi/assets/emoji/64/26a7.png +0 -0
  4030. package/web/app/site/sengi/assets/emoji/64/26aa.png +0 -0
  4031. package/web/app/site/sengi/assets/emoji/64/26ab.png +0 -0
  4032. package/web/app/site/sengi/assets/emoji/64/26b0.png +0 -0
  4033. package/web/app/site/sengi/assets/emoji/64/26b1.png +0 -0
  4034. package/web/app/site/sengi/assets/emoji/64/26bd.png +0 -0
  4035. package/web/app/site/sengi/assets/emoji/64/26be.png +0 -0
  4036. package/web/app/site/sengi/assets/emoji/64/26c4.png +0 -0
  4037. package/web/app/site/sengi/assets/emoji/64/26c5.png +0 -0
  4038. package/web/app/site/sengi/assets/emoji/64/26c8.png +0 -0
  4039. package/web/app/site/sengi/assets/emoji/64/26ce.png +0 -0
  4040. package/web/app/site/sengi/assets/emoji/64/26cf.png +0 -0
  4041. package/web/app/site/sengi/assets/emoji/64/26d1.png +0 -0
  4042. package/web/app/site/sengi/assets/emoji/64/26d3-1f4a5.png +0 -0
  4043. package/web/app/site/sengi/assets/emoji/64/26d3.png +0 -0
  4044. package/web/app/site/sengi/assets/emoji/64/26d4.png +0 -0
  4045. package/web/app/site/sengi/assets/emoji/64/26e9.png +0 -0
  4046. package/web/app/site/sengi/assets/emoji/64/26ea.png +0 -0
  4047. package/web/app/site/sengi/assets/emoji/64/26f0.png +0 -0
  4048. package/web/app/site/sengi/assets/emoji/64/26f1.png +0 -0
  4049. package/web/app/site/sengi/assets/emoji/64/26f2.png +0 -0
  4050. package/web/app/site/sengi/assets/emoji/64/26f3.png +0 -0
  4051. package/web/app/site/sengi/assets/emoji/64/26f4.png +0 -0
  4052. package/web/app/site/sengi/assets/emoji/64/26f5.png +0 -0
  4053. package/web/app/site/sengi/assets/emoji/64/26f7.png +0 -0
  4054. package/web/app/site/sengi/assets/emoji/64/26f8.png +0 -0
  4055. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fb-2640.png +0 -0
  4056. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fb-2642.png +0 -0
  4057. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fb.png +0 -0
  4058. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fc-2640.png +0 -0
  4059. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fc-2642.png +0 -0
  4060. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fc.png +0 -0
  4061. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fd-2640.png +0 -0
  4062. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fd-2642.png +0 -0
  4063. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fd.png +0 -0
  4064. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fe-2640.png +0 -0
  4065. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fe-2642.png +0 -0
  4066. package/web/app/site/sengi/assets/emoji/64/26f9-1f3fe.png +0 -0
  4067. package/web/app/site/sengi/assets/emoji/64/26f9-1f3ff-2640.png +0 -0
  4068. package/web/app/site/sengi/assets/emoji/64/26f9-1f3ff-2642.png +0 -0
  4069. package/web/app/site/sengi/assets/emoji/64/26f9-1f3ff.png +0 -0
  4070. package/web/app/site/sengi/assets/emoji/64/26f9-2640.png +0 -0
  4071. package/web/app/site/sengi/assets/emoji/64/26f9-2642.png +0 -0
  4072. package/web/app/site/sengi/assets/emoji/64/26f9.png +0 -0
  4073. package/web/app/site/sengi/assets/emoji/64/26fa.png +0 -0
  4074. package/web/app/site/sengi/assets/emoji/64/26fd.png +0 -0
  4075. package/web/app/site/sengi/assets/emoji/64/2702.png +0 -0
  4076. package/web/app/site/sengi/assets/emoji/64/2705.png +0 -0
  4077. package/web/app/site/sengi/assets/emoji/64/2708.png +0 -0
  4078. package/web/app/site/sengi/assets/emoji/64/2709.png +0 -0
  4079. package/web/app/site/sengi/assets/emoji/64/270a-1f3fb.png +0 -0
  4080. package/web/app/site/sengi/assets/emoji/64/270a-1f3fc.png +0 -0
  4081. package/web/app/site/sengi/assets/emoji/64/270a-1f3fd.png +0 -0
  4082. package/web/app/site/sengi/assets/emoji/64/270a-1f3fe.png +0 -0
  4083. package/web/app/site/sengi/assets/emoji/64/270a-1f3ff.png +0 -0
  4084. package/web/app/site/sengi/assets/emoji/64/270a.png +0 -0
  4085. package/web/app/site/sengi/assets/emoji/64/270b-1f3fb.png +0 -0
  4086. package/web/app/site/sengi/assets/emoji/64/270b-1f3fc.png +0 -0
  4087. package/web/app/site/sengi/assets/emoji/64/270b-1f3fd.png +0 -0
  4088. package/web/app/site/sengi/assets/emoji/64/270b-1f3fe.png +0 -0
  4089. package/web/app/site/sengi/assets/emoji/64/270b-1f3ff.png +0 -0
  4090. package/web/app/site/sengi/assets/emoji/64/270b.png +0 -0
  4091. package/web/app/site/sengi/assets/emoji/64/270c-1f3fb.png +0 -0
  4092. package/web/app/site/sengi/assets/emoji/64/270c-1f3fc.png +0 -0
  4093. package/web/app/site/sengi/assets/emoji/64/270c-1f3fd.png +0 -0
  4094. package/web/app/site/sengi/assets/emoji/64/270c-1f3fe.png +0 -0
  4095. package/web/app/site/sengi/assets/emoji/64/270c-1f3ff.png +0 -0
  4096. package/web/app/site/sengi/assets/emoji/64/270c.png +0 -0
  4097. package/web/app/site/sengi/assets/emoji/64/270d-1f3fb.png +0 -0
  4098. package/web/app/site/sengi/assets/emoji/64/270d-1f3fc.png +0 -0
  4099. package/web/app/site/sengi/assets/emoji/64/270d-1f3fd.png +0 -0
  4100. package/web/app/site/sengi/assets/emoji/64/270d-1f3fe.png +0 -0
  4101. package/web/app/site/sengi/assets/emoji/64/270d-1f3ff.png +0 -0
  4102. package/web/app/site/sengi/assets/emoji/64/270d.png +0 -0
  4103. package/web/app/site/sengi/assets/emoji/64/270f.png +0 -0
  4104. package/web/app/site/sengi/assets/emoji/64/2712.png +0 -0
  4105. package/web/app/site/sengi/assets/emoji/64/2714.png +0 -0
  4106. package/web/app/site/sengi/assets/emoji/64/2716.png +0 -0
  4107. package/web/app/site/sengi/assets/emoji/64/271d.png +0 -0
  4108. package/web/app/site/sengi/assets/emoji/64/2721.png +0 -0
  4109. package/web/app/site/sengi/assets/emoji/64/2728.png +0 -0
  4110. package/web/app/site/sengi/assets/emoji/64/2733.png +0 -0
  4111. package/web/app/site/sengi/assets/emoji/64/2734.png +0 -0
  4112. package/web/app/site/sengi/assets/emoji/64/2744.png +0 -0
  4113. package/web/app/site/sengi/assets/emoji/64/2747.png +0 -0
  4114. package/web/app/site/sengi/assets/emoji/64/274c.png +0 -0
  4115. package/web/app/site/sengi/assets/emoji/64/274e.png +0 -0
  4116. package/web/app/site/sengi/assets/emoji/64/2753.png +0 -0
  4117. package/web/app/site/sengi/assets/emoji/64/2754.png +0 -0
  4118. package/web/app/site/sengi/assets/emoji/64/2755.png +0 -0
  4119. package/web/app/site/sengi/assets/emoji/64/2757.png +0 -0
  4120. package/web/app/site/sengi/assets/emoji/64/2763.png +0 -0
  4121. package/web/app/site/sengi/assets/emoji/64/2764-1f525.png +0 -0
  4122. package/web/app/site/sengi/assets/emoji/64/2764-1fa79.png +0 -0
  4123. package/web/app/site/sengi/assets/emoji/64/2764.png +0 -0
  4124. package/web/app/site/sengi/assets/emoji/64/2795.png +0 -0
  4125. package/web/app/site/sengi/assets/emoji/64/2796.png +0 -0
  4126. package/web/app/site/sengi/assets/emoji/64/2797.png +0 -0
  4127. package/web/app/site/sengi/assets/emoji/64/27a1.png +0 -0
  4128. package/web/app/site/sengi/assets/emoji/64/27b0.png +0 -0
  4129. package/web/app/site/sengi/assets/emoji/64/27bf.png +0 -0
  4130. package/web/app/site/sengi/assets/emoji/64/2934.png +0 -0
  4131. package/web/app/site/sengi/assets/emoji/64/2935.png +0 -0
  4132. package/web/app/site/sengi/assets/emoji/64/2b05.png +0 -0
  4133. package/web/app/site/sengi/assets/emoji/64/2b06.png +0 -0
  4134. package/web/app/site/sengi/assets/emoji/64/2b07.png +0 -0
  4135. package/web/app/site/sengi/assets/emoji/64/2b1b.png +0 -0
  4136. package/web/app/site/sengi/assets/emoji/64/2b1c.png +0 -0
  4137. package/web/app/site/sengi/assets/emoji/64/2b50.png +0 -0
  4138. package/web/app/site/sengi/assets/emoji/64/2b55.png +0 -0
  4139. package/web/app/site/sengi/assets/emoji/64/3030.png +0 -0
  4140. package/web/app/site/sengi/assets/emoji/64/303d.png +0 -0
  4141. package/web/app/site/sengi/assets/emoji/64/3297.png +0 -0
  4142. package/web/app/site/sengi/assets/emoji/64/3299.png +0 -0
  4143. package/web/app/site/sengi/assets/fonts/Black/Roboto-Black.woff +0 -0
  4144. package/web/app/site/sengi/assets/fonts/Black/Roboto-Black.woff2 +0 -0
  4145. package/web/app/site/sengi/assets/fonts/Bold/Roboto-Bold.woff +0 -0
  4146. package/web/app/site/sengi/assets/fonts/Bold/Roboto-Bold.woff2 +0 -0
  4147. package/web/app/site/sengi/assets/fonts/Light/Roboto-Light.woff +0 -0
  4148. package/web/app/site/sengi/assets/fonts/Light/Roboto-Light.woff2 +0 -0
  4149. package/web/app/site/sengi/assets/fonts/Medium/Roboto-Medium.woff +0 -0
  4150. package/web/app/site/sengi/assets/fonts/Medium/Roboto-Medium.woff2 +0 -0
  4151. package/web/app/site/sengi/assets/fonts/Regular/Roboto-Regular.woff +0 -0
  4152. package/web/app/site/sengi/assets/fonts/Regular/Roboto-Regular.woff2 +0 -0
  4153. package/web/app/site/sengi/assets/fonts/Thin/Roboto-Thin.woff +0 -0
  4154. package/web/app/site/sengi/assets/fonts/Thin/Roboto-Thin.woff2 +0 -0
  4155. package/web/app/site/sengi/assets/icons/icon-128x128.png +0 -0
  4156. package/web/app/site/sengi/assets/icons/icon-144x144.png +0 -0
  4157. package/web/app/site/sengi/assets/icons/icon-152x152.png +0 -0
  4158. package/web/app/site/sengi/assets/icons/icon-192x192.png +0 -0
  4159. package/web/app/site/sengi/assets/icons/icon-384x384.png +0 -0
  4160. package/web/app/site/sengi/assets/icons/icon-512x512.png +0 -0
  4161. package/web/app/site/sengi/assets/icons/icon-72x72.png +0 -0
  4162. package/web/app/site/sengi/assets/icons/icon-96x96.png +0 -0
  4163. package/web/app/site/sengi/assets/img/account.png +0 -0
  4164. package/web/app/site/sengi/assets/img/arrow_1.png +0 -0
  4165. package/web/app/site/sengi/assets/img/arrow_1_dark.png +0 -0
  4166. package/web/app/site/sengi/assets/img/arrow_2.png +0 -0
  4167. package/web/app/site/sengi/assets/img/arrow_2_dark.png +0 -0
  4168. package/web/app/site/sengi/assets/img/avatar-not-found.png +0 -0
  4169. package/web/app/site/sengi/assets/img/juche-background.jpg +0 -0
  4170. package/web/app/site/sengi/assets/img/labels.png +0 -0
  4171. package/web/app/site/sengi/assets/scss/modules/_fonts.scss +0 -48
  4172. package/web/app/site/sengi/assets/video/flashing.gif +0 -0
  4173. package/web/app/site/sengi/assets/video/flashing.mp4 +0 -0
  4174. package/web/app/site/sengi/assets/video/notification.mp4 +0 -0
  4175. package/web/app/site/sengi/favicon.ico +0 -0
  4176. package/web/app/site/sengi/index.html +0 -64
  4177. package/web/app/site/sengi/juche-background.5779872958c0aa8356d2.jpg +0 -0
  4178. package/web/app/site/sengi/main.1f5d89d26480c74fad14.js +0 -1
  4179. package/web/app/site/sengi/manifest.json +0 -51
  4180. package/web/app/site/sengi/polyfills.c1e766542f6691fc86da.js +0 -1
  4181. package/web/app/site/sengi/runtime.26209474bfa8dc87a77c.js +0 -1
  4182. package/web/app/site/sengi/styles.6f7454aa4cf8f2d23457.css +0 -6
  4183. package/web/app/site/sw.js +0 -72555
  4184. package/web/app/site/update.js +0 -66
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["K","D","I","U","V","ee","te","T","M","x","se","S","N","ce","z","J","w","window","_showToast","showToast","props","text","onClick","delay","rest","toast","className","destination","gravity","position","setTimeout","useInterval","fn","deps","immediate","savedCallback","useRef","useEffect","current","id","setInterval","clearInterval","unstable_batchedUpdates","useMemo","useState","useCallback","useLayoutEffect","useReducer","useContext","updateState","version","Fragment","l","b","i","y","P","C","haptics","WebHaptics","DTFLOCALE_CACHE_KEY","_getDtfLocale","cachedDtf","store","session","get","dtfLocale","Intl","DateTimeFormat","resolvedOptions","locale","set","getDtfLocale","mem","initLocales","newLocales","navigator","languages","includes","unshift","locales","createLocale","language","options","Locale","langPart","parts","split","fallbackLocale","region","pop","toString","lang","middle","length","join","reg","opts","appLocale","userRegion","loc","matchedLocale","localeMatch","replace","undefined","niceDateTime","date","dtfOpts","Date","hideTime","formatOpts","forceOpts","currentYear","getFullYear","year","month","day","hour","minute","i18n","DTF","format","dateText","openCompose","url","URL","parse","location","width","screenWidth","height","screenHeight","screen","left","Math","max","top","min","winUID","uid","random","newWin","open","__COMPOSE__","alert","_i18n","_","isSafari","test","userAgent","openOSK","fauxEl","document","createElement","style","opacity","body","appendChild","focus","removeChild","root","documentElement","getComputedStyle","defaultBoundingBoxPadding","safeAreaInsets","getSafeAreaInsets","safeAreaInsetTop","getPropertyValue","safeAreaInsetRight","safeAreaInsetBottom","safeAreaInsetLeft","parseInt","requestAnimationFrame","safeBoundingBoxPadding","paddings","map","v","str","CSS","supports","addEventListener","passive","TOAST_DURATION","showCompose","states","composerState","minimized","duration","template","PARAGRAPH_END_RE","LIST_ITEM_END_RE","MULTIPLE_LINE_BREAKS_RE","getHTMLText","html","preProcess","truncateLinks","innerHTML","content","brElements","querySelectorAll","replaceWith","invisibleElements","remove","ellipsisElements","append","textContent","childNodes","n","innerText","trim","statusPeek","status","spoilerText","poll","mediaAttachments","quote","hasQuote","quotedStatus","dom","reContainer","querySelector","o","multiple","title","m","image","gifv","video","audio","unknown","type","quotePeek","SIZES","xs","s","xl","xxl","INVALID_ID_CHARS_REGEX","Icon","icon","size","alt","class","loadIcon","isIconLoaded","useIconSprite","iconSize","iconBlock","ICONS","console","rotate","rtl","isArray","flip","sanitizedTitle","loaded","_jsx","children","role","titleID","transform","memo","prevProps","nextProps","Link","forwardRef","ref","routerLocation","useLocation","hash","to","restProps","parsedHash","origin","searchParams","searchParamsStr","Array","from","entries","key","value","encodeURIComponent","pathname","isActive","decodeURIComponent","href","e","currentTarget","parentNode","closest","stopPropagation","prevLocation","MenuLink","disabled","FocusableItem","closeMenu","detail","RelativeTimeFormat","isValidDate","isNaN","getTime","rtfFromNow","rtf","RTF","seconds","now","absSeconds","abs","floor","twitterFromNow","values","0","RelativeTime","datetime","renderCount","rerender","dateStr","dt","dateStyle","toISOString","toLocaleString","timeout","raf","rafRerender","scheduleRerender","clearTimeout","cancelAnimationFrame","SubMenu2","menuRef","itemRef","label","direction","shift","computedDirection","setComputedDirection","computedShift","setComputedShift","offsetWidth","innerWidth","SubMenu","instanceRef","itemProps","onPointerMove","pointerType","openMenu","onPointerLeave","useCloseWatcher","watcher","CloseWatcher","$modalContainer","getElementById","getBackdropThemeColor","Modal","onClose","modalRef","timer","focusElement","supportsCloseWatcher","escRef","useHotkeys","enabled","keydown","keyup","useKey","ignoreEventWhen","metaKey","ctrlKey","altKey","shiftKey","$deckContainers","page","tabIndex","forEach","$deckContainer","setAttribute","removeAttribute","$meta","metaColor","local","theme","backdropColor","colorScheme","matchMedia","node","inert","onFocus","target","isFocusable","xxxl","alphaCache","Map","canvas","OffscreenCanvas","ctx","getContext","willReadFrequently","imageSmoothingEnabled","scheduleTask","requestIdleCallback","MISSING_IMAGE_PATH_REGEX","Avatar","staticUrl","squircle","avatarRef","isMissing","_jsxs","srcset","media","src","loading","decoding","fetchPriority","crossOrigin","has","onError","onLoad","dataset","naturalWidth","nw","naturalHeight","nh","scale","sampleW","round","sampleH","drawImage","data","getImageData","threshold","alphaCount","hasAlpha","classList","add","IS_RTL","MutationObserver","mutations","mutation","dir","observer","observe","useWindowSize","setSize","handleResize","innerHeight","removeEventListener","Menu2","containerProps","_instanceRef","align","rtlAlign","isRTL","Menu","boundingBoxPadding","repositionFlag","unmountOnClose","MenuConfirm","subMenu","confirm","confirmLabel","menuItemClassName","menuFooter","menuExtras","openTrigger","overflow","gap","menuClassName","menuButton","MenuItem","cloneElement","getGifFirstFrame","gifUrl","buffer","response","fetch","arrayBuffer","gif","frames","dims","patch","imageData","ImageData","putImageData","blob","Promise","resolve","toBlob","createObjectURL","CustomEmoji","isLarger","fetchQueue","PQueue","concurrency","interval","intervalCap","throttledFetch","signal","args","SHORTCODES_REGEX","shortcodesRegexp","shortcodes","RegExp","resolvedEmojisCache","MAX_CACHE_SIZE","resolveEmojis","resolverURL","emojiTags","headers","accept","referrerPolicy","json","tag","filter","t","emojis","all","emoji","shortcode","name","mediaType","firstKey","keys","next","delete","error","renderEmojiText","allEmojis","elements","regex","index","staticEmoji","word","resolvedEmojis","setResolvedEmojis","setLoading","hasUnresolved","matches","some","match","slice","resolved","RolesTags","roles","accountId","accountUrl","hideSelf","isSelf","getCurrentAccountID","parsedAccountInstance","nameCollator","sensitivity","Collator","ACCT_REGEX","SPACES_REGEX","NON_ALPHA_NUMERIC_REGEX","NameText","account","instance","showAvatar","showAcct","short","external","useLingui","acct","avatar","avatarStatic","displayName","bot","username","acct1","acct2","api","trimmedUsername","toLowerCase","trimmedDisplayName","shortenedDisplayName","shortenedAlphaNumericDisplayName","hideUsername","compare","preventDefault","which","internalURL","showAccount","_Fragment","EmojiText","r","u","codeMappings","zh_HANT","mnMong","IntlDN","DisplayNames","notSameIncaseSensitive","s1","s2","_localeCode2Text","code","fallback","of","anotherText","yetAnotherText","translangLanguagesNative","translationTargetLanguages","Object","tl","localeTargetLanguages","getTranslateTargetLanguage","fromSettings","contentTranslationTargetLanguage","settings","NF","NumberFormat","BYTES_UNITS","prettyBytes","bytes","unitIndex","log2","unit","unitDisplay","maximumFractionDigits","supportsNativeQuote","getAPIVersions","mastodon","getPostQuoteApprovalPolicy","quoteApproval","currentUser","ESCAPE_REGEX","HTML_ESCAPE_MAP","HTML_ESCAPE_REGEX","escapeRegex","escapeHTML","char","emojifyText","emojiMap","pattern","sc","escapedShortcode","HTML_CHARS_REGEX","HTML_ENTITIES","c","fauxDiv","whitelistLinkClasses","LINK_REGEX","HTTP_LINK_REGEX","MENTION_REGEX","HASHTAG_REGEX","HASH_EMOJI_REGEX","CODE_BLOCK_REGEX","CODE_BLOCK_START_REGEX","CODE_BLOCK_END_REGEX","INLINE_CODE_REGEX","TWITTER_DOMAIN_REGEX","TWITTER_MENTION_REGEX","TWITTER_MENTION_CAPTURE_REGEX","CODE_INLINE_CAPTURE_REGEX","createDOM","isDocumentFragment","tpl","_enhanceContent","returnDOM","postEnhanceDOM","enhancedContent","hasLink","hasCodeBlock","noTargetBlankLinks","link","links","shortenLink","usernames","hasChildren","atSymbol","domain","d","push","hashSymbol","actualText","textNodes","extractTextNodes","nodeValue","blocks","p","block","pre","br","codeBlocks","paragraphs","nextParagraphs","currentBlock","nextElementSibling","tagName","codeText","replaceAll","rejectFilter","prevIndex","hashtagStuffedParagraphs","hashtagCount","nodeType","Node","TEXT_NODE","linkText","startsWith","imgs","img","getAttribute","setProperty","span","replaceChild","queueMicrotask","enhanceContent","defaultRejectFilterMap","fromEntries","defaultRejectFilter","nodeName","URL_PREFIX_REGEX","URL_DISPLAY_LENGTH","prefix","displayURL","suffix","rejectFilterMap","assign","reduce","acc","cur","walk","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","nextNode","FAMILIAR_FOLLOWERS_MAX_AGE","fetchFamiliarFollowers","currentID","masto","v1","accounts","familiarFollowers","memFetchFamiliarFollowers","pmem","expires","normalizeURL","parsed","sort","search","isSameURL","a","supportsHover","handleContentLinks","mentions","previewMode","statusURL","taggedCollections","kindaLargeRatio","showMediaModal","description","contains","prevText","previousSibling","textBeforeLinkIsAt","endsWith","textStartsWithAt","targetText","mention","find","textBeforeLinkIsHash","hashURL","unfurledLinks","hostname","containsDomain","showOpenLink","shortenNumber","num","notation","roundingMode","containPixelfed","notContainPixelfed","platformFeatures","containPleroma","containAkkoma","supportsCache","semverExtract","atSoftwareSlashMatch","feature","getCurrentInstance","softwareName","getCurrentNodeInfo","software","featureMatch","range","features","doesSoftwareMatch","satisfiesRange","satisfies","includePrerelease","loose","AccountBlock","skeleton","avatarSize","avatarDescription","useAvatarStatic","internal","showActivity","showStats","accountInstance","hideDisplayName","excludeRelationshipAttrs","relationship","hasRelationshipProp","_useLingui","currentInstance","currentAccountID","setFamiliarFollowers","statusesCount","lastStatusAt","fields","note","group","followersCount","createdAt","locked","verifiedField","f","verifiedAt","relationshipObj","excludedRelationship","hasRelationship","following","followedBy","requested","accountDomain","getDomain","sameCurrentInstance","rel","aborted","followers","_t","_Trans","follower","components","fetchRelationships","relationshipsMap","currentAccount","uniqueAccountIds","relationships","newRelationshipsMap","i18nDuration","supportsLanguageDetector","self","supportsBrowserTranslator","langDetector","availability","LanguageDetector","log","originalSource","detect","detectedSourceLanguage","groupLabel","groupCollapsed","targetLanguage","translatorCapabilities","translator","Translator","sourceLanguage","create","React.Component","React.createElement","React3","React3.useInsertionEffect","React3.useLayoutEffect","React3.useEffect","React3.useRef","React3.useCallback","TOP","shazamIDs","LazyShazam","containerRef","visibleStart","setVisibleStart","useOnInView","inView","hidden","onInView","rootMargin","trackVisibility","triggerOnce","skip","rect","getBoundingClientRect","bottom","sourceLanguages","sl","PHANPY_TRANSLANG_INSTANCES","TRANSLANG_INSTANCES","translationQueue","TRANSLATED_MAX_AGE","currentTranslangInstance","_translangTranslate","source","fetchCall","fetchPromise","method","priority","then","res","ok","provider","translated_text","pRetry","retries","onFailedAttempt","translangTranslate","throttledTranslangTranslate","throttledBrowserTranslate","TranslationBlock","targetLang","uiState","setUIState","pronunciationContent","setPronunciationContent","translatedContent","setTranslatedContent","setDetectedLang","detailsRef","abortControllerRef","sourceLangText","apiSourceLang","onTranslate","detectedLangText","pronunciation","mini","behavior","translate","AbortController","onChange","common","native","showCommon","detectedLang","Loader","abrupt","initDB","dbName","storeName","createStore","val","getMany","del","delMany","clear","drafts","catchup","yearInPosts","EditHistoryContext","createContext","supportsViewTransition","startViewTransition","EditHistoryProvider","statusID","editHistoryRef","editHistoryMode","setEditHistoryMode","editedAtIndex","_setEditedAtIndex","setEditedAtIndex","fetchEditHistory","history","statuses","$select","list","initEditHistory","exitEditHistory","FilterContext","_isFiltered","filtered","filterContext","appliedFilters","hasContext","context","expiresAt","filterAction","isHidden","action","every","isBlur","filterTitles","titles","titlesStr","isWarn","isFiltered","filteredItem","item","filterState","filteredItems","items","htmlContentLength","supportsTTS","speak","speechSynthesis","speaking","cancel","utterance","SpeechSynthesisUtterance","useThrottledResizeObserver","onResize","useThrottledCallback","useResizeObserver","useTruncated","onTruncated","prevTruncatedRef","box","scrollHeight","truncated","_height","maxHeight","computedHeight","toggle","public","unlisted","private","direct","visibilityText","ACCOUNT_ITEMS_LIMIT","ACCOUNT_ROTATION_INTERVAL","CollectionCard","collection","creatorAccount","showMeta","snapStates","useSnapshot","itemsCount","updatedAt","discoverable","sensitive","rotationSlot","selectedItems","offset","accountItems","Boolean","bgAccounts","creator","missingIDs","Set","concat","catch","visibleCount","overflowCount","relativeTime","LazyRender","as","Root","renderIfHasChildren","rootRef","Children","toArray","child","observerRef","entry","import","meta","env","DELIMITERS_REGEX","DELIMITERS_PATTERNS","cleanDOMForTemml","startRegex","START_DELIMITERS","walker","textNode","startMatch","endDelimiter","nodesToCombine","currentNode","foundEnd","combinedText","nextSibling","ELEMENT_NODE","MathBlock","contentRef","onRevert","lastIndex","hasLatexContent","mathRendered","setMathRendered","toggleMathRendering","temml","default","originalContentRefHTML","renderMathInElement","fences","annotate","throwOnError","errorCallback","err","hasMath","htmlChanged","isSsr","createRef","React","Component","PinchZoomComp","formatDuration","time","hours","minutes","padStart","dataAltLabel","AltBadge","showMediaAlt","MEDIA_CAPTION_LIMIT","MEDIA_CAPTION_LIMIT_LONGER","isMediaCaptionLong","caption","isStreamingVideoSupported","canPlayType","Media","showOriginal","autoAnimate","showCaption","allowLongerCaption","altIndex","checkAspectRatio","autoplay","blurhash","previewRemoteUrl","previewUrl","remoteUrl","mediaVTN","getSafeViewTransitionName","original","small","mediaURL","remoteMediaURL","hasPreviewDimensions","orientation","rgbAverageColor","getBlurHashAverageColor","videoRef","focalPosition","toFixed","mediaRef","onUpdate","make3dTransformValue","removeProperty","touchAction","pinchZoomEnabled","setPinchZoomEnabled","quickPinchZoomProps","draggableUnZoomed","inertiaFriction","tapZoomFactor","doubleTapToggleZoom","mediaLoadError","setMediaLoadError","Parent","remoteMediaURLObj","getURLObj","isVideoMaybe","isStreamingVideoMaybe","isAudioMaybe","isImage","isPreviewVideoMaybe","parentRef","imageSmallerThanParent","setImageSmallerThanParent","offsetHeight","smaller","maxAspectHeight","averageColorStyle","mediaStyles","aspectRatio","longDesc","showInlineDesc","Figure","postViewState","interceptOnClick","isOnPostPage","el","viewTransitioned","viewTransitionName","mediaElements","pause","backgroundImage","backgroundSize","mediaImage","objectPosition","$media","clientWidth","minDimension","displayNaturalHeight","almostSimilarHeight","$mediaParent","hasDuration","shortDuration","isGIF","loopable","formattedDuration","hoverAnimate","autoGIFAnimate","showProgress","videoURL","onMouseEnter","onMouseLeave","onBlur","dangerouslySetInnerHTML","poster","preload","playsinline","loop","muted","onTimeUpdate","container","percentage","currentTime","disablePictureInPicture","onLoadedMetadata","background","controls","controlsList","autoPlay","playsInline","safeName","inputString","oldProps","oldMedia","newMedia","newProps","MediaFirstContainer","postID","moreThanOne","carouselRef","currentIndex","setCurrentIndex","handleScroll","scrollLeft","scrollTo","MultipleMediaFigure","captionChildren","POLL_OPTIONS_BATCH_SIZE","Poll","readOnly","refresh","votePoll","visibleOptionsCount","setVisibleOptionsCount","loadMoreRef","expired","ownVotes","voted","votersCount","votesCount","expiresAtDate","pollVotesCount","roundPrecision","showResults","setShowResults","optionsHaveVoteCounts","resultsView","selectedOptions","setSelectedOptions","IntersectionObserver","isIntersecting","prev","disconnect","voteOptionsSelectionCount","showPollInfo","setShowPollInfo","option","optionVotesCount","ratio","minHeight","onSubmit","choices","isSelected","checked","1","HTTP_REGEX","PostContent","post","sKey","statusKey","quotes","statusQuotes","divRef","replaceChildren","cloneNode","originalURL","generateHTMLCode","level","accountURL","accountEmojis","editedAt","uniqueQuotes","q","arr","findIndex","q2","quoteStatusesHTML","createdAtDate","contentHTML","sourceMediaURL","previewMediaURL","sourceMediaURLObj","isVideo","isAudio","mediaHTML","htmlCode","PostEmbedModal","readonly","select","clipboard","writeText","download","TruncatedLink","FETCH_DELAY","BATCH_LIMIT","QuoteChainModal","statusId","posts","setPosts","nextPostID","setNextPostID","fetchQuoteChain","fetchCount","currentPostID","fullStatus","getStatus","quotedStatusId","cached","tabindex","_t2","onContextMenu","postEl","dispatchEvent","clientX","Status","showCommentCount","showQuoteCount","QuoteSettingsSheet","currentPolicy","selectedPolicy","setSelectedPolicy","quoteApprovalPolicy","formData","FormData","newStatus","interactionPolicy","update","quote_approval_policy","saveStatus","skipThreading","skipUnfurling","handleFormSubmit","LIMIT","QuotesModal","showMore","setShowMore","quotesIterator","firstLoad","loadQuotes","isFirstLoad","limit","done","clientY","StatusButton","count","extraCount","otherProps","buttonTitle","setButtonTitle","iconAlt","setIconAlt","Byline","authors","author","isCardPost","StatusCard","card","selfReferential","selfAuthor","providerName","providerUrl","authorName","authorUrl","imageDescription","embedUrl","publishedAt","hasText","cardStatusURL","setCardStatusURL","isMastodonLinkMaybe","abortController","unfurlMastodonLink","result","unfurlCollectionLink","abort","collections","hasIframeHTML","handleClick","unfurled","showEmbedModal","blurhashImage","setBlurhashImage","blurhashPixels","decodeBlurHash","h","createImageData","convertToBlob","toDataURL","isPost","videoID","videoid","nocookie","StatusCompact","statusReply","visibility","srKey","statusPeekText","getCurrentAccID","filterInfo","filterTitleStr","ANOTHER_HASHTAG_REGEX","collator","usage","isSameTag","extractTagsFromStatus","indexOf","tags","allLinks","StatusTags","tagsToShow","hashtagsInContent","ht","ThreadCountContext","ThreadIcon","ThreadBadge","showIcon","showText","total","hasIndex","hasTotal","SHOW_COMMENT_COUNT_LIMIT","INLINE_TRANSLATE_LIMIT","MAX_COLLECTIONS","accountQueue","fetchAccount","memFetchAccount","isIOS","ontouchstart","REACTIONS_LIMIT","getPollText","getPostText","maskCustomEmojis","maskURLs","hideInlineQuote","htmlTextOpts","emojisRegex","fullText","forgivingQSA","selectors","selector","getHTMLTextForDetectLang","isTranslateble","SIZE_CLASS","detectLang","langs","detectedLanguage","groupEnd","detectAll","readMoreText","DIFFERENT_LANG_CHECK","diffLangCheckCacheKey","checkDifferentLanguage","contentTranslationHideLanguages","cacheKey","different","quotePrivate","requestQuote","quoteManualReview","quoteFollowersOnly","quoteCannot","nobody","QUESTION_REGEX","DEV","ghost","inReplyToAccountId","ghostAccount","mediaFirst","authenticated","sameInstance","eStatus","_language","languageAutoDetected","detected","setLanguageAutoDetected","hasMediaAttachments","debugHover","allowFilters","FilteredStatus","showFollowedTags","quoted","inReplyToAccount","setInReplyToAccount","withinContext","mentionSelf","prefs","readingExpandMedia","showSpoilerMedia","enableCommentHint","FollowedTagsParent","statusFollowedTags","StatusParent","isSizeLarge","contentLength","forceTranslate","contentTranslation","enableTranslate","contentTranslationAutoInline","showEdited","setShowEdited","showEmbed","setShowEmbed","showQuoteSettings","setShowQuoteSettings","showQuotes","setShowQuotes","showQuoteChain","setShowQuoteChain","spoilerContentRef","mediaContainerRef","reloadPostContentCount","reloadPostContent","unauthInteractionErrorMessage","textWeight","createdDateText","isPublic","canBoost","quoteDisabled","quoteText","quoteMetaText","isMineAndPrivate","isQuoteAutomaticallyAccepted","isQuoteManuallyAccepted","isQuoteFollowersOnly","isMine","quoteMessages","postQuoteApprovalPolicy","replyStatus","replyMode","replyToStatus","mediaNoDesc","attachment","statusMonthsAgo","reblogged","favouriteStatus","favouritesCount","favourited","trigger","bookmarkStatus","bookmarked","bookmarkStatusNotify","differentLanguage","setDifferentLanguage","reblogIterator","favouriteIterator","fetchBoostedLikedByAccounts","reblogResults","favouriteResults","isQuotingMyPost","actionsRef","allMentions","tooManyMentions","mentionsCount","ReplyMenuContent","StatusMenuItems","replyModeMenuItems","quoteStatus","canQuote","showActionsBar","showGenericAccounts","showReactions","setForceTranslate","postText","onStatusLinkClick","editedDateText","nicePostURL","isPinnable","quoteApprovalPolicyMessages","editStatus","MenuDivider","reloadStatusPage","showReportModal","contextMenuRef","isContextMenuOpen","contextMenuProps","showContextMenu","bindLongPressContext","statusRef","setContextMenuProps","anchorPoint","setIsContextMenuOpen","captureEvent","cancelOnMovement","hotkeysEnabled","handler","activeStatus","spoilerButton","spoilerMediaButton","displayedMediaAttachments","showMultipleMediaCaptions","indices","attachments","inReplyToId","statusThreadNumber","showCommentHint","isThread","repliesCount","forceShowCommentCount","reblog","collectionsWithCard","tc","cardUrl","matchIndex","matched","others","nodeRef","rRef","fRef","dRef","xRef","qRef","selection","anchorNode","portal","favouriteStatusNotify","_pinned","quoteDomain","_deleted","anchorRef","visibilityIconsMap","showSpoiler","spoilersMedia","readingExpandSpoilers","newPoll","autoDetected","onMediaClick","QuoteStatuses","collapsed","fallbackQuote","quotesCount","emojiReactions","me","emojiReaction","isShortCode","reblogsCount","viewScroll","fetchStatusHistory","urlObj","revealableUnfulfilledStates","filterHidden","pending","deleted","unauthorized","rejected","revoked","blocked_account","blocked_domain","isStaticQuote","unfulfilledState","isRevealable","isRevealed","quoteKey","quotedAccount","quotedAccountAcct","message","unfulfilledText","revealedQuotes","ShallowQuote","state","QuoteStatus","editHistory","setEditHistory","weekday","second","isReblog","setShowPeek","bindLongPressPeek","statusPeekRef","ssKey","actualStatusID","isFollowedTags","_t3","MIN_SCHEDULED_AT","MAX_SCHEDULED_AT","ScheduledAtField","scheduledAt","setScheduledAt","minStr","setMinStr","setMaxStr","timezoneOffset","updateMinStr","updateMaxStr","intervalId","defaultValue","maxStr","required","getLocalTimezoneName","formatter","formatToParts"],"ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,63,64,65,66,67,68,74,91,92,94,97,104,112,113,114,115,116,117,118,125,126,127,133,141,142],"sources":["../../node_modules/toastify-js/src/toastify.js","../../node_modules/react-hotkeys-hook/dist/index.js","../../src/utils/show-toast.js","../../src/utils/useInterval.js","../../node_modules/@szhsin/react-menu/dist/esm/utils/utils.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useBEM.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/constants.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuContainer.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/submenuCtx.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItems.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/getNormalizedClientRect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/getPositionHelpers.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeArrowVertical.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeLeftorRight.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeArrowHorizontal.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeToporBottom.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/positionMenu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useIsomorphicLayoutEffect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useCombinedRef.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuList.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/ControlledMenu.mjs","../../node_modules/react-transition-state/dist/esm/internal.mjs","../../node_modules/react-transition-state/dist/esm/useTransitionState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMenuState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMenuStateAndFocus.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useClick.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/Menu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/withHovering.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMouseOver.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItemEffect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/SubMenu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItemState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuItem.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/FocusableItem.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuDivider.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuHeader.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuGroup.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuRadioGroup.mjs","../../node_modules/use-long-press/index.mjs","../../node_modules/web-haptics/dist/chunk-4NSAIXAB.mjs","../../src/utils/haptics.js","../../src/utils/dtf-locale.js","../../src/utils/date-time-format.js","../../src/utils/nice-date-time.js","../../src/utils/open-compose.js","../../src/utils/open-osk.js","../../src/utils/safe-bounding-box-padding.js","../../src/utils/show-compose.js","../../src/utils/getHTMLText.js","../../src/utils/status-peek.js","../../src/components/icon.jsx","../../src/components/link.jsx","../../src/components/menu-link.jsx","../../src/utils/relative-time-format.js","../../src/components/relative-time.jsx","../../src/components/submenu2.jsx","../../src/utils/useCloseWatcher.js","../../src/components/modal.jsx","../../src/components/avatar.jsx","../../src/utils/is-rtl.js","../../src/utils/useWindowSize.js","../../src/components/menu2.jsx","../../src/components/menu-confirm.jsx","../../node_modules/js-binary-schema-parser/lib/index.js","../../node_modules/js-binary-schema-parser/lib/parsers/uint8.js","../../node_modules/js-binary-schema-parser/lib/schemas/gif.js","../../node_modules/gifuct-js/lib/deinterlace.js","../../node_modules/gifuct-js/lib/lzw.js","../../node_modules/gifuct-js/lib/index.js","../../src/utils/get-gif-first-frame.js","../../src/components/custom-emoji.jsx","../../src/components/emoji-text.jsx","../../src/components/roles-tags.jsx","../../src/components/name-text.jsx","../../node_modules/use-debounce/dist/index.module.js","../../src/utils/localeCode2Text.js","../../src/utils/get-translate-target-language.js","../../src/utils/nf.js","../../src/utils/pretty-bytes.js","../../src/utils/quote-utils.js","../../src/utils/emojify-text.js","../../src/utils/escape-html.js","../../src/utils/enhance-content.js","../../src/utils/familiar-followers.js","../../src/utils/is-same-url.js","../../src/utils/handle-content-links.js","../../src/utils/shorten-number.js","../../src/utils/supports.js","../../src/components/account-block.jsx","../../src/utils/relationships.js","../../src/utils/i18n-duration.js","../../node_modules/is-network-error/index.js","../../node_modules/p-retry/index.js","../../src/utils/browser-translator.js","../../node_modules/react-intersection-observer/dist/index.mjs","../../src/components/lazy-shazam.jsx","../../src/components/translation-block.jsx","../../node_modules/idb-keyval/dist/index.js","../../src/utils/db.js","../../src/utils/edit-history-context.jsx","../../src/utils/filter-context.js","../../src/utils/filters.js","../../src/utils/html-content-length.js","../../src/utils/speech.js","../../node_modules/use-resize-observer/dist/bundle.esm.js","../../src/utils/useThrottledResizeObserver.js","../../src/utils/useTruncated.js","../../src/utils/visibility-icons-map.js","../../src/utils/visibility-text.jsx","../../src/components/collection-card.jsx","../../src/components/lazy-render.jsx","../../src/components/math-block.jsx","../../node_modules/fast-blurhash/index.js","../../node_modules/tslib/tslib.es6.mjs","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/styles.css.js","../../node_modules/react-quick-pinch-zoom/esm/utils.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/getOffsetBounds.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/component.js","../../node_modules/react-quick-pinch-zoom/esm/index.js","../../src/utils/format-duration.js","../../src/components/media.jsx","../../src/components/media-first-container.jsx","../../src/components/multiple-media-figure.jsx","../../src/components/poll.jsx","../../src/components/post-content.jsx","../../node_modules/html-prettify/src/utils/addIndentation.js","../../node_modules/html-prettify/src/utils/toLines.js","../../node_modules/html-prettify/src/index.js","../../src/components/post-embed-modal.jsx","../../src/components/quote-chain-modal.jsx","../../src/components/quote-settings-sheet.jsx","../../src/components/quotes-modal.jsx","../../src/components/status-button.jsx","../../node_modules/@justinribeiro/lite-youtube/lite-youtube.js","../../src/components/byline.jsx","../../src/components/status-card.jsx","../../src/components/status-compact.jsx","../../src/components/status-tags.jsx","../../src/utils/thread-count-context.js","../../src/components/thread-badge.jsx","../../src/components/status.jsx","../../node_modules/uid/single/index.mjs","../../node_modules/fuse.js/dist/fuse.mjs","../../src/components/ScheduledAtField.jsx"],"sourcesContent":["/*!\n * Toastify js 1.12.0\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n(function(root, factory) {\n if (typeof module === \"object\" && module.exports) {\n module.exports = factory();\n } else {\n root.Toastify = factory();\n }\n})(this, function(global) {\n // Object initialization\n var Toastify = function(options) {\n // Returning a new init object\n return new Toastify.lib.init(options);\n },\n // Library version\n version = \"1.12.0\";\n\n // Set the default global options\n Toastify.defaults = {\n oldestFirst: true,\n text: \"Toastify is awesome!\",\n node: undefined,\n duration: 3000,\n selector: undefined,\n callback: function () {\n },\n destination: undefined,\n newWindow: false,\n close: false,\n gravity: \"toastify-top\",\n positionLeft: false,\n position: '',\n backgroundColor: '',\n avatar: \"\",\n className: \"\",\n stopOnFocus: true,\n onClick: function () {\n },\n offset: {x: 0, y: 0},\n escapeMarkup: true,\n ariaLive: 'polite',\n style: {background: ''}\n };\n\n // Defining the prototype of the object\n Toastify.lib = Toastify.prototype = {\n toastify: version,\n\n constructor: Toastify,\n\n // Initializing the object with required parameters\n init: function(options) {\n // Verifying and validating the input object\n if (!options) {\n options = {};\n }\n\n // Creating the options object\n this.options = {};\n\n this.toastElement = null;\n\n // Validating the options\n this.options.text = options.text || Toastify.defaults.text; // Display message\n this.options.node = options.node || Toastify.defaults.node; // Display content as node\n this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify.defaults.duration; // Display duration\n this.options.selector = options.selector || Toastify.defaults.selector; // Parent selector\n this.options.callback = options.callback || Toastify.defaults.callback; // Callback after display\n this.options.destination = options.destination || Toastify.defaults.destination; // On-click destination\n this.options.newWindow = options.newWindow || Toastify.defaults.newWindow; // Open destination in new window\n this.options.close = options.close || Toastify.defaults.close; // Show toast close icon\n this.options.gravity = options.gravity === \"bottom\" ? \"toastify-bottom\" : Toastify.defaults.gravity; // toast position - top or bottom\n this.options.positionLeft = options.positionLeft || Toastify.defaults.positionLeft; // toast position - left or right\n this.options.position = options.position || Toastify.defaults.position; // toast position - left or right\n this.options.backgroundColor = options.backgroundColor || Toastify.defaults.backgroundColor; // toast background color\n this.options.avatar = options.avatar || Toastify.defaults.avatar; // img element src - url or a path\n this.options.className = options.className || Toastify.defaults.className; // additional class names for the toast\n this.options.stopOnFocus = options.stopOnFocus === undefined ? Toastify.defaults.stopOnFocus : options.stopOnFocus; // stop timeout on focus\n this.options.onClick = options.onClick || Toastify.defaults.onClick; // Callback after click\n this.options.offset = options.offset || Toastify.defaults.offset; // toast offset\n this.options.escapeMarkup = options.escapeMarkup !== undefined ? options.escapeMarkup : Toastify.defaults.escapeMarkup;\n this.options.ariaLive = options.ariaLive || Toastify.defaults.ariaLive;\n this.options.style = options.style || Toastify.defaults.style;\n if(options.backgroundColor) {\n this.options.style.background = options.backgroundColor;\n }\n\n // Returning the current object for chaining functions\n return this;\n },\n\n // Building the DOM element\n buildToast: function() {\n // Validating if the options are defined\n if (!this.options) {\n throw \"Toastify is not initialized\";\n }\n\n // Creating the DOM object\n var divElement = document.createElement(\"div\");\n divElement.className = \"toastify on \" + this.options.className;\n\n // Positioning toast to left or right or center\n if (!!this.options.position) {\n divElement.className += \" toastify-\" + this.options.position;\n } else {\n // To be depreciated in further versions\n if (this.options.positionLeft === true) {\n divElement.className += \" toastify-left\";\n console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.')\n } else {\n // Default position\n divElement.className += \" toastify-right\";\n }\n }\n\n // Assigning gravity of element\n divElement.className += \" \" + this.options.gravity;\n\n if (this.options.backgroundColor) {\n // This is being deprecated in favor of using the style HTML DOM property\n console.warn('DEPRECATION NOTICE: \"backgroundColor\" is being deprecated. Please use the \"style.background\" property.');\n }\n\n // Loop through our style object and apply styles to divElement\n for (var property in this.options.style) {\n divElement.style[property] = this.options.style[property];\n }\n\n // Announce the toast to screen readers\n if (this.options.ariaLive) {\n divElement.setAttribute('aria-live', this.options.ariaLive)\n }\n\n // Adding the toast message/node\n if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {\n // If we have a valid node, we insert it\n divElement.appendChild(this.options.node)\n } else {\n if (this.options.escapeMarkup) {\n divElement.innerText = this.options.text;\n } else {\n divElement.innerHTML = this.options.text;\n }\n\n if (this.options.avatar !== \"\") {\n var avatarElement = document.createElement(\"img\");\n avatarElement.src = this.options.avatar;\n\n avatarElement.className = \"toastify-avatar\";\n\n if (this.options.position == \"left\" || this.options.positionLeft === true) {\n // Adding close icon on the left of content\n divElement.appendChild(avatarElement);\n } else {\n // Adding close icon on the right of content\n divElement.insertAdjacentElement(\"afterbegin\", avatarElement);\n }\n }\n }\n\n // Adding a close icon to the toast\n if (this.options.close === true) {\n // Create a span for close element\n var closeElement = document.createElement(\"button\");\n closeElement.type = \"button\";\n closeElement.setAttribute(\"aria-label\", \"Close\");\n closeElement.className = \"toast-close\";\n closeElement.innerHTML = \"&#10006;\";\n\n // Triggering the removal of toast from DOM on close click\n closeElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.removeElement(this.toastElement);\n window.clearTimeout(this.toastElement.timeOutValue);\n }.bind(this)\n );\n\n //Calculating screen width\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Adding the close icon to the toast element\n // Display on the right if screen width is less than or equal to 360px\n if ((this.options.position == \"left\" || this.options.positionLeft === true) && width > 360) {\n // Adding close icon on the left of content\n divElement.insertAdjacentElement(\"afterbegin\", closeElement);\n } else {\n // Adding close icon on the right of content\n divElement.appendChild(closeElement);\n }\n }\n\n // Clear timeout while toast is focused\n if (this.options.stopOnFocus && this.options.duration > 0) {\n var self = this;\n // stop countdown\n divElement.addEventListener(\n \"mouseover\",\n function(event) {\n window.clearTimeout(divElement.timeOutValue);\n }\n )\n // add back the timeout\n divElement.addEventListener(\n \"mouseleave\",\n function() {\n divElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n self.removeElement(divElement);\n },\n self.options.duration\n )\n }\n )\n }\n\n // Adding an on-click destination path\n if (typeof this.options.destination !== \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n if (this.options.newWindow === true) {\n window.open(this.options.destination, \"_blank\");\n } else {\n window.location = this.options.destination;\n }\n }.bind(this)\n );\n }\n\n if (typeof this.options.onClick === \"function\" && typeof this.options.destination === \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.options.onClick();\n }.bind(this)\n );\n }\n\n // Adding offset\n if(typeof this.options.offset === \"object\") {\n\n var x = getAxisOffsetAValue(\"x\", this.options);\n var y = getAxisOffsetAValue(\"y\", this.options);\n\n var xOffset = this.options.position == \"left\" ? x : \"-\" + x;\n var yOffset = this.options.gravity == \"toastify-top\" ? y : \"-\" + y;\n\n divElement.style.transform = \"translate(\" + xOffset + \",\" + yOffset + \")\";\n\n }\n\n // Returning the generated element\n return divElement;\n },\n\n // Displaying the toast\n showToast: function() {\n // Creating the DOM object for the toast\n this.toastElement = this.buildToast();\n\n // Getting the root element to with the toast needs to be added\n var rootElement;\n if (typeof this.options.selector === \"string\") {\n rootElement = document.getElementById(this.options.selector);\n } else if (this.options.selector instanceof HTMLElement || (typeof ShadowRoot !== 'undefined' && this.options.selector instanceof ShadowRoot)) {\n rootElement = this.options.selector;\n } else {\n rootElement = document.body;\n }\n\n // Validating if root element is present in DOM\n if (!rootElement) {\n throw \"Root element is not defined\";\n }\n\n // Adding the DOM element\n var elementToInsert = Toastify.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild;\n rootElement.insertBefore(this.toastElement, elementToInsert);\n\n // Repositioning the toasts in case multiple toasts are present\n Toastify.reposition();\n\n if (this.options.duration > 0) {\n this.toastElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n this.removeElement(this.toastElement);\n }.bind(this),\n this.options.duration\n ); // Binding `this` for function invocation\n }\n\n // Supporting function chaining\n return this;\n },\n\n hideToast: function() {\n if (this.toastElement.timeOutValue) {\n clearTimeout(this.toastElement.timeOutValue);\n }\n this.removeElement(this.toastElement);\n },\n\n // Removing the element from the DOM\n removeElement: function(toastElement) {\n // Hiding the element\n // toastElement.classList.remove(\"on\");\n toastElement.className = toastElement.className.replace(\" on\", \"\");\n\n // Removing the element from DOM after transition end\n window.setTimeout(\n function() {\n // remove options node if any\n if (this.options.node && this.options.node.parentNode) {\n this.options.node.parentNode.removeChild(this.options.node);\n }\n\n // Remove the element from the DOM, only when the parent node was not removed before.\n if (toastElement.parentNode) {\n toastElement.parentNode.removeChild(toastElement);\n }\n\n // Calling the callback function\n this.options.callback.call(toastElement);\n\n // Repositioning the toasts again\n Toastify.reposition();\n }.bind(this),\n 400\n ); // Binding `this` for function invocation\n },\n };\n\n // Positioning the toasts on the DOM\n Toastify.reposition = function() {\n\n // Top margins with gravity\n var topLeftOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var topRightOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var offsetSize = {\n top: 15,\n bottom: 15,\n };\n\n // Get all toast messages on the DOM\n var allToasts = document.getElementsByClassName(\"toastify\");\n\n var classUsed;\n\n // Modifying the position of each toast element\n for (var i = 0; i < allToasts.length; i++) {\n // Getting the applied gravity\n if (containsClass(allToasts[i], \"toastify-top\") === true) {\n classUsed = \"toastify-top\";\n } else {\n classUsed = \"toastify-bottom\";\n }\n\n var height = allToasts[i].offsetHeight;\n classUsed = classUsed.substr(9, classUsed.length-1)\n // Spacing between toasts\n var offset = 15;\n\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Show toast in center if screen with less than or equal to 360px\n if (width <= 360) {\n // Setting the position\n allToasts[i].style[classUsed] = offsetSize[classUsed] + \"px\";\n\n offsetSize[classUsed] += height + offset;\n } else {\n if (containsClass(allToasts[i], \"toastify-left\") === true) {\n // Setting the position\n allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + \"px\";\n\n topLeftOffsetSize[classUsed] += height + offset;\n } else {\n // Setting the position\n allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + \"px\";\n\n topRightOffsetSize[classUsed] += height + offset;\n }\n }\n }\n\n // Supporting function chaining\n return this;\n };\n\n // Helper function to get offset.\n function getAxisOffsetAValue(axis, options) {\n\n if(options.offset[axis]) {\n if(isNaN(options.offset[axis])) {\n return options.offset[axis];\n }\n else {\n return options.offset[axis] + 'px';\n }\n }\n\n return '0px';\n\n }\n\n function containsClass(elem, yourClass) {\n if (!elem || typeof yourClass !== \"string\") {\n return false;\n } else if (\n elem.className &&\n elem.className\n .trim()\n .split(/\\s+/gi)\n .indexOf(yourClass) > -1\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n // Setting up the prototype for the init object\n Toastify.lib.init.prototype = Toastify.lib;\n\n // Returning the Toastify function to be assigned to the window object/module\n return Toastify;\n});\n","import { createContext as T, useContext as M, useState as A, useCallback as w, useRef as S, useLayoutEffect as z, useEffect as J } from \"react\";\nimport { jsx as b } from \"react/jsx-runtime\";\nconst j = [\"shift\", \"alt\", \"meta\", \"mod\", \"ctrl\", \"control\"], Q = {\n esc: \"escape\",\n return: \"enter\",\n left: \"arrowleft\",\n right: \"arrowright\",\n up: \"arrowup\",\n down: \"arrowdown\",\n ShiftLeft: \"shift\",\n ShiftRight: \"shift\",\n AltLeft: \"alt\",\n AltRight: \"alt\",\n MetaLeft: \"meta\",\n MetaRight: \"meta\",\n OSLeft: \"meta\",\n OSRight: \"meta\",\n ControlLeft: \"ctrl\",\n ControlRight: \"ctrl\"\n};\nfunction K(e) {\n return (Q[e.trim()] || e.trim()).toLowerCase().replace(/key|digit|numpad/, \"\");\n}\nfunction D(e) {\n return j.includes(e);\n}\nfunction H(e, r = \",\") {\n return e.toLowerCase().split(r);\n}\nfunction P(e, r = \"+\", o = \">\", i = !1, c, a) {\n let n = [], y = !1;\n e = e.trim(), e.includes(o) ? (y = !0, n = e.toLocaleLowerCase().split(o).map((f) => K(f))) : n = e.toLocaleLowerCase().split(r).map((f) => K(f));\n const u = {\n alt: n.includes(\"alt\"),\n ctrl: n.includes(\"ctrl\") || n.includes(\"control\"),\n shift: n.includes(\"shift\"),\n meta: n.includes(\"meta\"),\n mod: n.includes(\"mod\"),\n useKey: i\n }, l = n.filter((f) => !j.includes(f));\n return {\n ...u,\n keys: l,\n description: c,\n isSequence: y,\n hotkey: e,\n metadata: a\n };\n}\ntypeof document < \"u\" && (document.addEventListener(\"keydown\", (e) => {\n e.code !== void 0 && _([K(e.code)]);\n}), document.addEventListener(\"keyup\", (e) => {\n e.code !== void 0 && I([K(e.code)]);\n})), typeof window < \"u\" && (window.addEventListener(\"blur\", () => {\n L.clear();\n}), window.addEventListener(\"contextmenu\", () => {\n setTimeout(() => {\n L.clear();\n }, 0);\n}));\nconst L = /* @__PURE__ */ new Set();\nfunction R(e) {\n return Array.isArray(e);\n}\nfunction U(e, r = \",\") {\n return (R(e) ? e : e.split(r)).every((i) => L.has(i.trim().toLowerCase()));\n}\nfunction _(e) {\n const r = Array.isArray(e) ? e : [e];\n L.has(\"meta\") && L.forEach((o) => {\n D(o) || L.delete(o.toLowerCase());\n }), r.forEach((o) => {\n L.add(o.toLowerCase());\n });\n}\nfunction I(e) {\n const r = Array.isArray(e) ? e : [e];\n e === \"meta\" ? L.clear() : r.forEach((o) => {\n L.delete(o.toLowerCase());\n });\n}\nfunction V(e, r, o) {\n (typeof o == \"function\" && o(e, r) || o === !0) && e.preventDefault();\n}\nfunction X(e, r, o) {\n return typeof o == \"function\" ? o(e, r) : o === !0 || o === void 0;\n}\nconst Y = [\n \"input\",\n \"textarea\",\n \"select\",\n \"searchbox\",\n \"slider\",\n \"spinbutton\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"textbox\"\n];\nfunction Z(e) {\n return F(e, Y);\n}\nfunction F(e, r = !1) {\n const { target: o, composed: i } = e;\n let c, a;\n return ee(o) && i ? (c = e.composedPath()[0] && e.composedPath()[0].tagName, a = e.composedPath()[0] && e.composedPath()[0].role) : (c = o && o.tagName, a = o && o.role), R(r) ? !!(c && r && r.some((n) => n.toLowerCase() === c.toLowerCase() || n === a)) : !!(c && r && r);\n}\nfunction ee(e) {\n return !!e.tagName && !e.tagName.startsWith(\"-\") && e.tagName.includes(\"-\");\n}\nfunction te(e, r) {\n return e.length === 0 && r ? !1 : r ? e.some((o) => r.includes(o)) || e.includes(\"*\") : !0;\n}\nconst re = (e, r, o = !1) => {\n const { alt: i, meta: c, mod: a, shift: n, ctrl: y, keys: u, useKey: l } = r, { code: f, key: t, ctrlKey: d, metaKey: m, shiftKey: g, altKey: k } = e, p = K(f);\n if (l && u?.length === 1 && u.includes(t.toLowerCase()))\n return !0;\n if (!u?.includes(p) && ![\"ctrl\", \"control\", \"unknown\", \"meta\", \"alt\", \"shift\", \"os\"].includes(p))\n return !1;\n if (!o) {\n if (i !== k && p !== \"alt\" || n !== g && p !== \"shift\")\n return !1;\n if (a) {\n if (!m && !d)\n return !1;\n } else if (c !== m && p !== \"meta\" && p !== \"os\" || y !== d && p !== \"ctrl\" && p !== \"control\")\n return !1;\n }\n return u && u.length === 1 && u.includes(p) ? !0 : u && u.length > 0 ? u.includes(p) ? U(u) : !1 : !u || u.length === 0;\n}, $ = T(void 0), oe = () => M($);\nfunction ne({ addHotkey: e, removeHotkey: r, children: o }) {\n return /* @__PURE__ */ b($.Provider, { value: { addHotkey: e, removeHotkey: r }, children: o });\n}\nfunction x(e, r) {\n return e && r && typeof e == \"object\" && typeof r == \"object\" ? Object.keys(e).length === Object.keys(r).length && // @ts-expect-error TS7053\n Object.keys(e).reduce((o, i) => o && x(e[i], r[i]), !0) : e === r;\n}\nconst W = T({\n hotkeys: [],\n activeScopes: [],\n // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {\n },\n enableScope: () => {\n },\n disableScope: () => {\n }\n}), se = () => M(W), de = ({ initiallyActiveScopes: e = [\"*\"], children: r }) => {\n const [o, i] = A(e), [c, a] = A([]), n = w((t) => {\n i((d) => d.includes(\"*\") ? [t] : Array.from(/* @__PURE__ */ new Set([...d, t])));\n }, []), y = w((t) => {\n i((d) => d.filter((m) => m !== t));\n }, []), u = w((t) => {\n i((d) => d.includes(t) ? d.filter((m) => m !== t) : d.includes(\"*\") ? [t] : Array.from(/* @__PURE__ */ new Set([...d, t])));\n }, []), l = w((t) => {\n a((d) => [...d, t]);\n }, []), f = w((t) => {\n a((d) => d.filter((m) => !x(m, t)));\n }, []);\n return /* @__PURE__ */ b(\n W.Provider,\n {\n value: { activeScopes: o, hotkeys: c, enableScope: n, disableScope: y, toggleScope: u },\n children: /* @__PURE__ */ b(ne, { addHotkey: l, removeHotkey: f, children: r })\n }\n );\n};\nfunction ie(e) {\n const r = S(void 0);\n return x(r.current, e) || (r.current = e), r.current;\n}\nconst N = (e) => {\n e.stopPropagation(), e.preventDefault(), e.stopImmediatePropagation();\n}, ce = typeof window < \"u\" ? z : J;\nfunction fe(e, r, o, i) {\n const c = S(null), a = S(!1), n = Array.isArray(o) ? Array.isArray(i) ? void 0 : i : o, y = R(e) ? e.join(n?.delimiter) : e, u = Array.isArray(o) ? o : Array.isArray(i) ? i : void 0, l = w(r, u ?? []), f = S(l);\n u ? f.current = l : f.current = r;\n const t = ie(n), { activeScopes: d } = se(), m = oe();\n return ce(() => {\n if (t?.enabled === !1 || !te(d, t?.scopes))\n return;\n let g = [], k;\n const p = (s, B = !1) => {\n if (!(Z(s) && !F(s, t?.enableOnFormTags))) {\n if (c.current !== null) {\n const v = c.current.getRootNode();\n if ((v instanceof Document || v instanceof ShadowRoot) && v.activeElement !== c.current && !c.current.contains(v.activeElement)) {\n N(s);\n return;\n }\n }\n s.target?.isContentEditable && !t?.enableOnContentEditable || H(y, t?.delimiter).forEach((v) => {\n if (v.includes(t?.splitKey ?? \"+\") && v.includes(t?.sequenceSplitKey ?? \">\")) {\n console.warn(\n `Hotkey ${v} contains both ${t?.splitKey ?? \"+\"} and ${t?.sequenceSplitKey ?? \">\"} which is not supported.`\n );\n return;\n }\n const h = P(\n v,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n );\n if (h.isSequence) {\n k = setTimeout(() => {\n g = [];\n }, t?.sequenceTimeoutMs ?? 1e3);\n const C = h.useKey ? s.key : K(s.code);\n if (D(C.toLowerCase()))\n return;\n g.push(C);\n const G = h.keys?.[g.length - 1];\n if (C !== G) {\n g = [], k && clearTimeout(k);\n return;\n }\n g.length === h.keys?.length && (f.current(s, h), k && clearTimeout(k), g = []);\n } else if (re(s, h, t?.ignoreModifiers) || h.keys?.includes(\"*\")) {\n if (t?.ignoreEventWhen?.(s) || B && a.current)\n return;\n if (V(s, h, t?.preventDefault), !X(s, h, t?.enabled)) {\n N(s);\n return;\n }\n f.current(s, h), B || (a.current = !0);\n }\n });\n }\n }, O = (s) => {\n s.code !== void 0 && (_(K(s.code)), (t?.keydown === void 0 && t?.keyup !== !0 || t?.keydown) && p(s));\n }, q = (s) => {\n s.code !== void 0 && (I(K(s.code)), a.current = !1, t?.keyup && p(s, !0));\n }, E = c.current || n?.document || document;\n return E.addEventListener(\"keyup\", q, n?.eventListenerOptions), E.addEventListener(\"keydown\", O, n?.eventListenerOptions), m && H(y, t?.delimiter).forEach((s) => {\n m.addHotkey(\n P(\n s,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n )\n );\n }), () => {\n E.removeEventListener(\"keyup\", q, n?.eventListenerOptions), E.removeEventListener(\"keydown\", O, n?.eventListenerOptions), m && H(y, t?.delimiter).forEach((s) => {\n m.removeHotkey(\n P(\n s,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n )\n );\n }), g = [], k && clearTimeout(k);\n };\n }, [y, t, d]), c;\n}\nfunction le(e = !1) {\n const [r, o] = A(/* @__PURE__ */ new Set()), [i, c] = A(!1), a = w(\n (l) => {\n l.code !== void 0 && (l.preventDefault(), l.stopPropagation(), o((f) => {\n const t = new Set(f);\n return t.add(K(e ? l.key : l.code)), t;\n }));\n },\n [e]\n ), n = w(() => {\n typeof document < \"u\" && (document.removeEventListener(\"keydown\", a), c(!1));\n }, [a]), y = w(() => {\n o(/* @__PURE__ */ new Set()), typeof document < \"u\" && (n(), document.addEventListener(\"keydown\", a), c(!0));\n }, [a, n]), u = w(() => {\n o(/* @__PURE__ */ new Set());\n }, []);\n return [r, { start: y, stop: n, resetKeys: u, isRecording: i }];\n}\nexport {\n de as HotkeysProvider,\n U as isHotkeyPressed,\n fe as useHotkeys,\n se as useHotkeysContext,\n le as useRecordHotkeys\n};\n","import Toastify from 'toastify-js';\n\nwindow._showToast = showToast;\n\nfunction showToast(props) {\n if (typeof props === 'string') {\n props = { text: props };\n }\n const { onClick, delay, ...rest } = props;\n const toast = Toastify({\n className: `${onClick || props.destination ? 'shiny-pill' : ''}`,\n gravity: 'bottom',\n position: 'center',\n ...rest,\n onClick: () => {\n onClick?.(toast); // Pass in the object itself!\n },\n });\n if (delay) {\n setTimeout(() => {\n toast.showToast();\n }, delay);\n } else {\n toast.showToast();\n }\n return toast;\n}\n\nexport default showToast;\n","import { useEffect, useRef } from 'preact/hooks';\n\nfunction useInterval(fn, delay, deps, immediate) {\n const savedCallback = useRef(fn);\n useEffect(() => {\n savedCallback.current = fn;\n }, [fn, deps]);\n\n useEffect(() => {\n if (!immediate || delay === null || delay === false) return;\n savedCallback.current();\n }, [immediate]);\n\n useEffect(() => {\n if (delay === null || delay === false) return;\n const tick = () => savedCallback.current();\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n\nexport default useInterval;\n","import { unstable_batchedUpdates } from 'react-dom';\n\nconst isMenuOpen = state => !!state && state[0] === 'o';\nconst batchedUpdates = unstable_batchedUpdates;\nconst getTransition = (transition, name) => transition === true || !!(transition && transition[name]);\nconst safeCall = (fn, arg) => typeof fn === 'function' ? fn(arg) : fn;\nconst internalKey = '_szhsinMenu';\nconst getName = component => component[internalKey];\nconst defineName = (name, component) => Object.defineProperty(component, internalKey, {\n value: name\n});\nconst mergeProps = (target, source) => {\n source && Object.keys(source).forEach(key => {\n const targetProp = target[key];\n const sourceProp = source[key];\n if (typeof sourceProp === 'function' && targetProp) {\n target[key] = (...arg) => {\n sourceProp(...arg);\n targetProp(...arg);\n };\n } else {\n target[key] = sourceProp;\n }\n });\n return target;\n};\nconst parsePadding = paddingStr => {\n if (typeof paddingStr !== 'string') return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n const padding = paddingStr.trim().split(/\\s+/, 4).map(parseFloat);\n const top = !isNaN(padding[0]) ? padding[0] : 0;\n const right = !isNaN(padding[1]) ? padding[1] : top;\n return {\n top,\n right,\n bottom: !isNaN(padding[2]) ? padding[2] : top,\n left: !isNaN(padding[3]) ? padding[3] : right\n };\n};\nconst getScrollAncestor = node => {\n while (node) {\n node = node.parentNode;\n if (!node || node === document.body || !node.parentNode) return;\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle(node);\n if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) return node;\n }\n};\nfunction commonProps(isDisabled, isHovering) {\n return {\n 'aria-disabled': isDisabled || undefined,\n tabIndex: isHovering ? 0 : -1\n };\n}\nfunction indexOfNode(nodeList, node) {\n for (let i = 0; i < nodeList.length; i++) {\n if (nodeList[i] === node) return i;\n }\n return -1;\n}\n\nexport { batchedUpdates, commonProps, defineName, getName, getScrollAncestor, getTransition, indexOfNode, isMenuOpen, mergeProps, parsePadding, safeCall };\n","import { useMemo } from 'react';\n\nconst useBEM = ({\n block,\n element,\n modifiers,\n className\n}) => useMemo(() => {\n const blockElement = element ? `${block}__${element}` : block;\n let classString = blockElement;\n modifiers && Object.keys(modifiers).forEach(name => {\n const value = modifiers[name];\n if (value) classString += ` ${blockElement}--${value === true ? name : `${name}-${value}`}`;\n });\n let expandedClassName = typeof className === 'function' ? className(modifiers) : className;\n if (typeof expandedClassName === 'string') {\n expandedClassName = expandedClassName.trim();\n if (expandedClassName) classString += ` ${expandedClassName}`;\n }\n return classString;\n}, [block, element, modifiers, className]);\n\nexport { useBEM };\n","import { createContext } from 'react';\n\nconst menuContainerClass = 'szh-menu-container';\nconst menuClass = 'szh-menu';\nconst menuButtonClass = 'szh-menu-button';\nconst menuArrowClass = 'arrow';\nconst menuItemClass = 'item';\nconst menuDividerClass = 'divider';\nconst menuHeaderClass = 'header';\nconst menuGroupClass = 'group';\nconst subMenuClass = 'submenu';\nconst radioGroupClass = 'radio-group';\nconst HoverItemContext = /*#__PURE__*/createContext();\nconst MenuListItemContext = /*#__PURE__*/createContext({});\nconst MenuListContext = /*#__PURE__*/createContext({});\nconst EventHandlersContext = /*#__PURE__*/createContext({});\nconst RadioGroupContext = /*#__PURE__*/createContext({});\nconst SettingsContext = /*#__PURE__*/createContext({});\nconst Keys = /*#__PURE__*/Object.freeze({\n ENTER: 'Enter',\n ESC: 'Escape',\n SPACE: ' ',\n HOME: 'Home',\n END: 'End',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n DOWN: 'ArrowDown'\n});\nconst HoverActionTypes = /*#__PURE__*/Object.freeze({\n RESET: 0,\n SET: 1,\n UNSET: 2,\n INCREASE: 3,\n DECREASE: 4,\n FIRST: 5,\n LAST: 6,\n SET_INDEX: 7\n});\nconst CloseReason = /*#__PURE__*/Object.freeze({\n CLICK: 'click',\n CANCEL: 'cancel',\n BLUR: 'blur',\n SCROLL: 'scroll'\n});\nconst FocusPositions = /*#__PURE__*/Object.freeze({\n FIRST: 'first',\n LAST: 'last'\n});\nconst MenuStateMap = /*#__PURE__*/Object.freeze({\n entering: 'opening',\n entered: 'open',\n exiting: 'closing',\n exited: 'closed'\n});\nconst positionAbsolute = 'absolute';\nconst roleNone = 'none';\nconst roleMenuitem = 'menuitem';\nconst noScrollFocus = {\n preventScroll: true\n};\n\nexport { CloseReason, EventHandlersContext, FocusPositions, HoverActionTypes, HoverItemContext, Keys, MenuListContext, MenuListItemContext, MenuStateMap, RadioGroupContext, SettingsContext, menuArrowClass, menuButtonClass, menuClass, menuContainerClass, menuDividerClass, menuGroupClass, menuHeaderClass, menuItemClass, noScrollFocus, positionAbsolute, radioGroupClass, roleMenuitem, roleNone, subMenuClass };\n","import { useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { menuContainerClass, CloseReason, Keys } from '../utils/constants.mjs';\nimport { mergeProps, getTransition, safeCall } from '../utils/utils.mjs';\n\nconst MenuContainer = ({\n className,\n containerRef,\n containerProps,\n children,\n isOpen,\n theming,\n transition,\n onClose\n}) => {\n const itemTransition = getTransition(transition, 'item');\n const onKeyDown = ({\n key\n }) => {\n switch (key) {\n case Keys.ESC:\n safeCall(onClose, {\n key,\n reason: CloseReason.CANCEL\n });\n break;\n }\n };\n const onBlur = e => {\n if (isOpen && !e.currentTarget.contains(e.relatedTarget)) {\n safeCall(onClose, {\n reason: CloseReason.BLUR\n });\n }\n };\n return /*#__PURE__*/jsx(\"div\", {\n ...mergeProps({\n onKeyDown,\n onBlur\n }, containerProps),\n className: useBEM({\n block: menuContainerClass,\n modifiers: useMemo(() => ({\n theme: theming,\n itemTransition\n }), [theming, itemTransition]),\n className\n }),\n style: {\n position: 'absolute',\n ...containerProps?.style\n },\n ref: containerRef,\n children: children\n });\n};\n\nexport { MenuContainer };\n","const createSubmenuCtx = () => {\n let timer,\n count = 0;\n return {\n toggle: isOpen => {\n isOpen ? count++ : count--;\n count = Math.max(count, 0);\n },\n on: (closeDelay, pending, settled) => {\n if (count) {\n if (!timer) timer = setTimeout(() => {\n timer = 0;\n pending();\n }, closeDelay);\n } else {\n settled?.();\n }\n },\n off: () => {\n if (timer) {\n clearTimeout(timer);\n timer = 0;\n }\n }\n };\n};\n\nexport { createSubmenuCtx };\n","import { useState, useRef, useCallback } from 'react';\nimport { noScrollFocus, HoverActionTypes } from '../utils/constants.mjs';\nimport { indexOfNode } from '../utils/utils.mjs';\n\nconst useItems = menuRef => {\n const [hoverItem, setHoverItem] = useState();\n const stateRef = useRef({\n items: [],\n hoverIndex: -1,\n sorted: false\n });\n const mutableState = stateRef.current;\n const updateItems = useCallback((item, isMounted) => {\n const {\n items\n } = mutableState;\n if (!item) {\n mutableState.items = [];\n } else if (isMounted) {\n items.push(item);\n } else {\n const index = items.indexOf(item);\n if (index > -1) {\n items.splice(index, 1);\n if (item.contains(document.activeElement)) {\n menuRef.current.focus(noScrollFocus);\n setHoverItem();\n }\n }\n }\n mutableState.hoverIndex = -1;\n mutableState.sorted = false;\n }, [mutableState, menuRef]);\n const dispatch = useCallback((actionType, item, nextIndex) => {\n const {\n items,\n hoverIndex\n } = mutableState;\n const sortItems = () => {\n if (mutableState.sorted) return;\n const orderedNodes = menuRef.current.querySelectorAll('.szh-menu__item');\n items.sort((a, b) => indexOfNode(orderedNodes, a) - indexOfNode(orderedNodes, b));\n mutableState.sorted = true;\n };\n let index = -1,\n newItem = undefined;\n switch (actionType) {\n case HoverActionTypes.RESET:\n break;\n case HoverActionTypes.SET:\n newItem = item;\n break;\n case HoverActionTypes.UNSET:\n newItem = prevItem => prevItem === item ? undefined : prevItem;\n break;\n case HoverActionTypes.FIRST:\n sortItems();\n index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.LAST:\n sortItems();\n index = items.length - 1;\n newItem = items[index];\n break;\n case HoverActionTypes.SET_INDEX:\n sortItems();\n index = nextIndex;\n newItem = items[index];\n break;\n case HoverActionTypes.INCREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index++;\n if (index >= items.length) index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.DECREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index--;\n if (index < 0) index = items.length - 1;\n newItem = items[index];\n break;\n default:\n if (process.env.NODE_ENV !== 'production') throw new Error(`[React-Menu] Unknown hover action type: ${actionType}`);\n }\n if (!newItem) index = -1;\n setHoverItem(newItem);\n mutableState.hoverIndex = index;\n }, [menuRef, mutableState]);\n return {\n hoverItem,\n dispatch,\n updateItems\n };\n};\n\nexport { useItems };\n","const getNativeDimension = (transformed, untransformed) => Math.round(transformed) === untransformed ? transformed : untransformed;\nconst getNormalizedClientRect = element => {\n const rect = element.getBoundingClientRect();\n rect.width = getNativeDimension(rect.width, element.offsetWidth);\n rect.height = getNativeDimension(rect.height, element.offsetHeight);\n return rect;\n};\n\nexport { getNormalizedClientRect };\n","import { getNormalizedClientRect } from './getNormalizedClientRect.mjs';\nimport { parsePadding } from '../utils/utils.mjs';\n\nconst getPositionHelpers = (containerElt, menuElt, menuScroll, boundingBoxPadding) => {\n const menuRect = getNormalizedClientRect(menuElt);\n const containerRect = containerElt.getBoundingClientRect();\n const boundingRect = menuScroll === window ? {\n left: 0,\n top: 0,\n right: document.documentElement.clientWidth,\n bottom: window.innerHeight\n } : menuScroll.getBoundingClientRect();\n const padding = parsePadding(boundingBoxPadding);\n const getLeftOverflow = x => x + containerRect.left - boundingRect.left - padding.left;\n const getRightOverflow = x => x + containerRect.left + menuRect.width - boundingRect.right + padding.right;\n const getTopOverflow = y => y + containerRect.top - boundingRect.top - padding.top;\n const getBottomOverflow = y => y + containerRect.top + menuRect.height - boundingRect.bottom + padding.bottom;\n const confineHorizontally = x => {\n let leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n x -= leftOverflow;\n } else {\n const rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n x -= rightOverflow;\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) x -= leftOverflow;\n }\n }\n return x;\n };\n const confineVertically = y => {\n let topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n y -= topOverflow;\n } else {\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n y -= bottomOverflow;\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) y -= topOverflow;\n }\n }\n return y;\n };\n return {\n menuRect,\n containerRect,\n getLeftOverflow,\n getRightOverflow,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically\n };\n};\n\nexport { getPositionHelpers };\n","const placeArrowVertical = ({\n arrowRef,\n menuY,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let y = anchorRect.top - containerRect.top - menuY + anchorRect.height / 2;\n const offset = arrowRef.current.offsetHeight * 1.25;\n y = Math.max(offset, y);\n y = Math.min(y, menuRect.height - offset);\n return y;\n};\n\nexport { placeArrowVertical };\n","import { placeArrowVertical } from './placeArrowVertical.mjs';\n\nconst placeLeftorRight = ({\n anchorRect,\n containerRect,\n menuRect,\n placeLeftorRightY,\n placeLeftX,\n placeRightX,\n getLeftOverflow,\n getRightOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction;\n let y = placeLeftorRightY;\n if (position !== 'initial') {\n y = confineVertically(y);\n if (position === 'anchor') {\n y = Math.min(y, anchorRect.bottom - containerRect.top);\n y = Math.max(y, anchorRect.top - containerRect.top - menuRect.height);\n }\n }\n let x, leftOverflow, rightOverflow;\n if (computedDirection === 'left') {\n x = placeLeftX;\n if (position !== 'initial') {\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n rightOverflow = getRightOverflow(placeRightX);\n if (rightOverflow <= 0 || -leftOverflow > rightOverflow) {\n x = placeRightX;\n computedDirection = 'right';\n }\n }\n }\n } else {\n x = placeRightX;\n if (position !== 'initial') {\n rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n leftOverflow = getLeftOverflow(placeLeftX);\n if (leftOverflow >= 0 || -leftOverflow < rightOverflow) {\n x = placeLeftX;\n computedDirection = 'left';\n }\n }\n }\n }\n if (position === 'auto') x = confineHorizontally(x);\n const arrowY = arrow ? placeArrowVertical({\n menuY: y,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowY,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeLeftorRight };\n","const placeArrowHorizontal = ({\n arrowRef,\n menuX,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let x = anchorRect.left - containerRect.left - menuX + anchorRect.width / 2;\n const offset = arrowRef.current.offsetWidth * 1.25;\n x = Math.max(offset, x);\n x = Math.min(x, menuRect.width - offset);\n return x;\n};\n\nexport { placeArrowHorizontal };\n","import { placeArrowHorizontal } from './placeArrowHorizontal.mjs';\n\nconst placeToporBottom = ({\n anchorRect,\n containerRect,\n menuRect,\n placeToporBottomX,\n placeTopY,\n placeBottomY,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction === 'top' ? 'top' : 'bottom';\n let x = placeToporBottomX;\n if (position !== 'initial') {\n x = confineHorizontally(x);\n if (position === 'anchor') {\n x = Math.min(x, anchorRect.right - containerRect.left);\n x = Math.max(x, anchorRect.left - containerRect.left - menuRect.width);\n }\n }\n let y, topOverflow, bottomOverflow;\n if (computedDirection === 'top') {\n y = placeTopY;\n if (position !== 'initial') {\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n bottomOverflow = getBottomOverflow(placeBottomY);\n if (bottomOverflow <= 0 || -topOverflow > bottomOverflow) {\n y = placeBottomY;\n computedDirection = 'bottom';\n }\n }\n }\n } else {\n y = placeBottomY;\n if (position !== 'initial') {\n bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n topOverflow = getTopOverflow(placeTopY);\n if (topOverflow >= 0 || -topOverflow < bottomOverflow) {\n y = placeTopY;\n computedDirection = 'top';\n }\n }\n }\n }\n if (position === 'auto') y = confineVertically(y);\n const arrowX = arrow ? placeArrowHorizontal({\n menuX: x,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowX,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeToporBottom };\n","import { placeLeftorRight } from './placeLeftorRight.mjs';\nimport { placeToporBottom } from './placeToporBottom.mjs';\n\nconst positionMenu = ({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n}) => {\n const {\n menuRect,\n containerRect\n } = positionHelpers;\n const isHorizontal = direction === 'left' || direction === 'right';\n let horizontalOffset = isHorizontal ? gap : shift;\n let verticalOffset = isHorizontal ? shift : gap;\n if (arrow) {\n const arrowElt = arrowRef.current;\n if (isHorizontal) {\n horizontalOffset += arrowElt.offsetWidth;\n } else {\n verticalOffset += arrowElt.offsetHeight;\n }\n }\n const placeLeftX = anchorRect.left - containerRect.left - menuRect.width - horizontalOffset;\n const placeRightX = anchorRect.right - containerRect.left + horizontalOffset;\n const placeTopY = anchorRect.top - containerRect.top - menuRect.height - verticalOffset;\n const placeBottomY = anchorRect.bottom - containerRect.top + verticalOffset;\n let placeToporBottomX, placeLeftorRightY;\n if (align === 'end') {\n placeToporBottomX = anchorRect.right - containerRect.left - menuRect.width;\n placeLeftorRightY = anchorRect.bottom - containerRect.top - menuRect.height;\n } else if (align === 'center') {\n placeToporBottomX = anchorRect.left - containerRect.left - (menuRect.width - anchorRect.width) / 2;\n placeLeftorRightY = anchorRect.top - containerRect.top - (menuRect.height - anchorRect.height) / 2;\n } else {\n placeToporBottomX = anchorRect.left - containerRect.left;\n placeLeftorRightY = anchorRect.top - containerRect.top;\n }\n placeToporBottomX += horizontalOffset;\n placeLeftorRightY += verticalOffset;\n const options = {\n ...positionHelpers,\n anchorRect,\n placeLeftX,\n placeRightX,\n placeLeftorRightY,\n placeTopY,\n placeBottomY,\n placeToporBottomX,\n arrowRef,\n arrow,\n direction,\n position\n };\n switch (direction) {\n case 'left':\n case 'right':\n return placeLeftorRight(options);\n case 'top':\n case 'bottom':\n default:\n return placeToporBottom(options);\n }\n};\n\nexport { positionMenu };\n","import { useLayoutEffect, useEffect } from 'react';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect as useLayoutEffect };\n","import { useMemo } from 'react';\n\nfunction setRef(ref, instance) {\n typeof ref === 'function' ? ref(instance) : ref.current = instance;\n}\nconst useCombinedRef = (refA, refB) => useMemo(() => {\n if (!refA) return refB;\n if (!refB) return refA;\n return instance => {\n setRef(refA, instance);\n setRef(refB, instance);\n };\n}, [refA, refB]);\n\nexport { useCombinedRef };\n","import { useState, useReducer, useContext, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { flushSync } from 'react-dom';\nimport { MenuContainer } from './MenuContainer.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { createSubmenuCtx } from '../utils/submenuCtx.mjs';\nimport { SettingsContext, MenuListContext, HoverActionTypes, noScrollFocus, menuClass, menuArrowClass, positionAbsolute, MenuListItemContext, HoverItemContext, CloseReason, FocusPositions, Keys } from '../utils/constants.mjs';\nimport { useItems } from '../hooks/useItems.mjs';\nimport { getScrollAncestor, safeCall, mergeProps, commonProps, isMenuOpen, batchedUpdates, getTransition } from '../utils/utils.mjs';\nimport { getPositionHelpers } from '../positionUtils/getPositionHelpers.mjs';\nimport { positionMenu } from '../positionUtils/positionMenu.mjs';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst offScreen = -9999;\nconst MenuList = ({\n ariaLabel,\n menuClassName,\n menuStyle,\n arrow,\n arrowProps = {},\n anchorPoint,\n anchorRef,\n containerRef,\n containerProps,\n externalRef,\n parentScrollingRef,\n align = 'start',\n direction = 'bottom',\n position = 'auto',\n overflow = 'visible',\n setDownOverflow,\n repositionFlag,\n captureFocus = true,\n state,\n endTransition,\n isDisabled,\n menuItemFocus,\n gap = 0,\n shift = 0,\n children,\n onClose,\n focusProps: _1,\n ...restProps\n}) => {\n const [menuPosition, setMenuPosition] = useState({\n x: offScreen,\n y: offScreen\n });\n const [arrowPosition, setArrowPosition] = useState({});\n const [overflowData, setOverflowData] = useState();\n const [expandedDirection, setExpandedDirection] = useState(direction);\n const [submenuCtx] = useState(createSubmenuCtx);\n const [reposSubmenu, forceReposSubmenu] = useReducer(c => c + 1, 1);\n const {\n transition,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef,\n rootAnchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n submenuCtx: parentSubmenuCtx,\n reposSubmenu: reposFlag = repositionFlag\n } = useContext(MenuListContext);\n const menuRef = useRef();\n const arrowRef = useRef();\n const prevOpen = useRef(false);\n const {\n hoverItem,\n dispatch,\n updateItems\n } = useItems(menuRef);\n const isOpen = isMenuOpen(state);\n const openTransition = getTransition(transition, 'open');\n const closeTransition = getTransition(transition, 'close');\n const scrollNodes = scrollNodesRef.current;\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.HOME:\n dispatch(HoverActionTypes.FIRST);\n break;\n case Keys.END:\n dispatch(HoverActionTypes.LAST);\n break;\n case Keys.UP:\n dispatch(HoverActionTypes.DECREASE, hoverItem);\n break;\n case Keys.DOWN:\n dispatch(HoverActionTypes.INCREASE, hoverItem);\n break;\n case Keys.SPACE:\n if (e.target && e.target.className.indexOf(menuClass) !== -1) {\n e.preventDefault();\n }\n return;\n default:\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n };\n const onAnimationEnd = () => {\n if (state === 'closing') {\n setOverflowData();\n }\n safeCall(endTransition);\n };\n const onPointerMove = e => {\n e.stopPropagation();\n submenuCtx.on(submenuCloseDelay, () => {\n dispatch(HoverActionTypes.RESET);\n menuRef.current.focus(noScrollFocus);\n });\n };\n const onPointerLeave = e => {\n if (e.target === e.currentTarget) submenuCtx.off();\n };\n const handlePosition = useCallback(noOverflowCheck => {\n const menuElt = menuRef.current;\n const containerElt = containerRef.current;\n if (!menuElt || !containerElt) return;\n const anchorRect = anchorRef ? anchorRef.current?.getBoundingClientRect() : anchorPoint ? {\n left: anchorPoint.x,\n right: anchorPoint.x,\n top: anchorPoint.y,\n bottom: anchorPoint.y,\n width: 0,\n height: 0\n } : null;\n if (!anchorRect) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[React-Menu] Menu might not be positioned properly as one of the anchorRef or anchorPoint prop should be provided. If `anchorRef` is provided, the anchor must be mounted before menu is open.');\n }\n return;\n }\n if (!scrollNodes.menu) {\n scrollNodes.menu = (boundingBoxRef ? boundingBoxRef.current : getScrollAncestor(rootMenuRef.current)) || window;\n }\n const positionHelpers = getPositionHelpers(containerElt, menuElt, scrollNodes.menu, boundingBoxPadding);\n let {\n arrowX,\n arrowY,\n x,\n y,\n computedDirection\n } = positionMenu({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n });\n const {\n menuRect\n } = positionHelpers;\n const menuHeight = menuRect.height;\n if (!noOverflowCheck && overflow !== 'visible') {\n const {\n getTopOverflow,\n getBottomOverflow\n } = positionHelpers;\n let height, overflowAmt;\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n height = menuHeight - bottomOverflow;\n overflowAmt = bottomOverflow;\n } else {\n const topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n height = menuHeight + topOverflow;\n overflowAmt = 0 - topOverflow;\n if (height >= 0) y -= topOverflow;\n }\n }\n if (height >= 0) {\n setOverflowData({\n height,\n overflowAmt\n });\n }\n }\n if (arrow) setArrowPosition({\n x: arrowX,\n y: arrowY\n });\n setMenuPosition({\n x,\n y\n });\n setExpandedDirection(computedDirection);\n }, [arrow, align, boundingBoxPadding, direction, gap, shift, position, overflow, anchorPoint, anchorRef, containerRef, boundingBoxRef, rootMenuRef, scrollNodes]);\n useIsomorphicLayoutEffect(() => {\n if (isOpen) {\n handlePosition();\n if (prevOpen.current) forceReposSubmenu();\n }\n prevOpen.current = isOpen;\n }, [isOpen, handlePosition, reposFlag]);\n useIsomorphicLayoutEffect(() => {\n if (overflowData && !setDownOverflow) menuRef.current.scrollTop = 0;\n }, [overflowData, setDownOverflow]);\n useIsomorphicLayoutEffect(() => updateItems, [updateItems]);\n useEffect(() => {\n let {\n menu: menuScroll\n } = scrollNodes;\n if (!isOpen || !menuScroll) return;\n menuScroll = menuScroll.addEventListener ? menuScroll : window;\n if (!scrollNodes.anchors) {\n scrollNodes.anchors = [];\n let anchorScroll = getScrollAncestor(rootAnchorRef && rootAnchorRef.current);\n while (anchorScroll && anchorScroll !== menuScroll) {\n scrollNodes.anchors.push(anchorScroll);\n anchorScroll = getScrollAncestor(anchorScroll);\n }\n }\n let scroll = viewScroll;\n if (scrollNodes.anchors.length && scroll === 'initial') scroll = 'auto';\n if (scroll === 'initial') return;\n const handleScroll = () => {\n if (scroll === 'auto') {\n batchedUpdates(() => handlePosition(true));\n } else {\n safeCall(onClose, {\n reason: CloseReason.SCROLL\n });\n }\n };\n const scrollObservers = scrollNodes.anchors.concat(viewScroll !== 'initial' ? menuScroll : []);\n scrollObservers.forEach(o => o.addEventListener('scroll', handleScroll));\n return () => scrollObservers.forEach(o => o.removeEventListener('scroll', handleScroll));\n }, [rootAnchorRef, scrollNodes, isOpen, onClose, viewScroll, handlePosition]);\n const hasOverflow = !!overflowData && overflowData.overflowAmt > 0;\n useEffect(() => {\n if (hasOverflow || !isOpen || !parentScrollingRef) return;\n const handleScroll = () => batchedUpdates(handlePosition);\n const parentScroll = parentScrollingRef.current;\n parentScroll.addEventListener('scroll', handleScroll);\n return () => parentScroll.removeEventListener('scroll', handleScroll);\n }, [isOpen, hasOverflow, parentScrollingRef, handlePosition]);\n useEffect(() => {\n if (!isOpen || typeof ResizeObserver !== 'function' || reposition === 'initial') return;\n const targetList = [];\n const resizeObserver = new ResizeObserver(entries => entries.forEach(({\n target\n }) => {\n if (targetList.indexOf(target) < 0) {\n targetList.push(target);\n } else if (target.offsetWidth && target.offsetHeight) {\n flushSync(() => {\n handlePosition();\n forceReposSubmenu();\n });\n }\n }));\n const resizeObserverOptions = {\n box: 'border-box'\n };\n resizeObserver.observe(menuRef.current, resizeObserverOptions);\n const anchor = anchorRef?.current;\n anchor && resizeObserver.observe(anchor, resizeObserverOptions);\n return () => resizeObserver.disconnect();\n }, [isOpen, reposition, anchorRef, handlePosition]);\n useEffect(() => {\n if (!isOpen) {\n dispatch(HoverActionTypes.RESET);\n if (!closeTransition) setOverflowData();\n return;\n }\n const {\n position,\n alwaysUpdate\n } = menuItemFocus || {};\n const setItemFocus = () => {\n if (position === FocusPositions.FIRST) {\n dispatch(HoverActionTypes.FIRST);\n } else if (position === FocusPositions.LAST) {\n dispatch(HoverActionTypes.LAST);\n } else if (position >= -1) {\n dispatch(HoverActionTypes.SET_INDEX, undefined, position);\n }\n };\n if (alwaysUpdate) {\n setItemFocus();\n } else if (captureFocus) {\n const id = setTimeout(() => {\n const menuElt = menuRef.current;\n if (menuElt && !menuElt.contains(document.activeElement)) {\n menuElt.focus(noScrollFocus);\n setItemFocus();\n }\n }, openTransition ? 170 : 100);\n return () => clearTimeout(id);\n }\n }, [isOpen, openTransition, closeTransition, captureFocus, menuItemFocus, dispatch]);\n const itemContext = useMemo(() => ({\n isParentOpen: isOpen,\n submenuCtx,\n dispatch,\n updateItems\n }), [isOpen, submenuCtx, dispatch, updateItems]);\n let maxHeight, overflowAmt;\n if (overflowData) {\n setDownOverflow ? overflowAmt = overflowData.overflowAmt : maxHeight = overflowData.height;\n }\n const listContext = useMemo(() => ({\n reposSubmenu,\n submenuCtx,\n overflow,\n overflowAmt,\n parentMenuRef: menuRef,\n parentDir: expandedDirection\n }), [reposSubmenu, submenuCtx, overflow, overflowAmt, expandedDirection]);\n const overflowStyle = maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined;\n const modifiers = useMemo(() => ({\n state,\n align,\n dir: expandedDirection\n }), [state, align, expandedDirection]);\n const arrowModifiers = useMemo(() => ({\n dir: expandedDirection\n }), [expandedDirection]);\n const _arrowClassName = useBEM({\n block: menuClass,\n element: menuArrowClass,\n modifiers: arrowModifiers,\n className: arrowProps.className\n });\n const menu = /*#__PURE__*/jsxs(\"ul\", {\n role: \"menu\",\n \"aria-label\": ariaLabel,\n ...commonProps(isDisabled),\n ...mergeProps({\n onPointerEnter: parentSubmenuCtx?.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onAnimationEnd\n }, restProps),\n ref: useCombinedRef(externalRef, menuRef),\n className: useBEM({\n block: menuClass,\n modifiers,\n className: menuClassName\n }),\n style: {\n ...menuStyle,\n ...overflowStyle,\n margin: 0,\n display: state === 'closed' ? 'none' : undefined,\n position: positionAbsolute,\n left: menuPosition.x,\n top: menuPosition.y\n },\n children: [arrow && /*#__PURE__*/jsx(\"li\", {\n \"aria-hidden\": true,\n ...arrowProps,\n className: _arrowClassName,\n style: {\n display: 'block',\n position: positionAbsolute,\n left: arrowPosition.x,\n top: arrowPosition.y,\n ...arrowProps.style\n },\n ref: arrowRef\n }), /*#__PURE__*/jsx(MenuListContext.Provider, {\n value: listContext,\n children: /*#__PURE__*/jsx(MenuListItemContext.Provider, {\n value: itemContext,\n children: /*#__PURE__*/jsx(HoverItemContext.Provider, {\n value: hoverItem,\n children: safeCall(children, modifiers)\n })\n })\n })]\n });\n return containerProps ? /*#__PURE__*/jsx(MenuContainer, {\n ...containerProps,\n isOpen: isOpen,\n children: menu\n }) : menu;\n};\n\nexport { MenuList };\n","import { forwardRef, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.mjs';\nimport { jsx } from 'react/jsx-runtime';\nimport { safeCall } from '../utils/utils.mjs';\nimport { SettingsContext, EventHandlersContext, CloseReason, Keys } from '../utils/constants.mjs';\n\nconst ControlledMenu = /*#__PURE__*/forwardRef(function ControlledMenu({\n 'aria-label': ariaLabel,\n className,\n containerProps,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n reposition = 'auto',\n submenuOpenDelay = 300,\n submenuCloseDelay = 150,\n viewScroll = 'initial',\n portal,\n theming,\n onItemClick,\n ...restProps\n}, externalRef) {\n const containerRef = useRef(null);\n const scrollNodesRef = useRef({});\n const {\n anchorRef,\n state,\n onClose\n } = restProps;\n const settings = useMemo(() => ({\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef: containerRef,\n rootAnchorRef: anchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuOpenDelay,\n submenuCloseDelay\n }), [initialMounted, unmountOnClose, transition, transitionTimeout, anchorRef, boundingBoxRef, boundingBoxPadding, reposition, viewScroll, submenuOpenDelay, submenuCloseDelay]);\n const eventHandlers = useMemo(() => ({\n handleClick(event, isCheckorRadio) {\n if (!event.stopPropagation) safeCall(onItemClick, event);\n let keepOpen = event.keepOpen;\n if (keepOpen === undefined) {\n keepOpen = isCheckorRadio && event.key === Keys.SPACE;\n }\n if (!keepOpen) {\n safeCall(onClose, {\n value: event.value,\n key: event.key,\n reason: CloseReason.CLICK\n });\n }\n },\n handleClose(key) {\n safeCall(onClose, {\n key,\n reason: CloseReason.CLICK\n });\n }\n }), [onItemClick, onClose]);\n if (!state) return null;\n const menuList = /*#__PURE__*/jsx(SettingsContext.Provider, {\n value: settings,\n children: /*#__PURE__*/jsx(EventHandlersContext.Provider, {\n value: eventHandlers,\n children: /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ariaLabel: ariaLabel || 'Menu',\n externalRef: externalRef,\n containerRef: containerRef,\n containerProps: {\n className,\n containerRef,\n containerProps,\n theming,\n transition,\n onClose\n }\n })\n })\n });\n if (portal === true && typeof document !== 'undefined') {\n return /*#__PURE__*/createPortal(menuList, document.body);\n } else if (portal) {\n return portal.target ? /*#__PURE__*/createPortal(menuList, portal.target) : portal.stablePosition ? null : menuList;\n }\n return menuList;\n});\n\nexport { ControlledMenu };\n","const STATUS = [\n\t\"preEnter\",\n\t\"entering\",\n\t\"entered\",\n\t\"preExit\",\n\t\"exiting\",\n\t\"exited\",\n\t\"unmounted\"\n];\nconst getState = (status) => ({\n\t$: status,\n\tstatus: STATUS[status],\n\tisEnter: status < 3,\n\tisMounted: status !== 6,\n\tisResolved: status === 2 || status > 4\n});\nconst startOrEnd = (unmounted) => unmounted ? 6 : 5;\nconst getEndStatus = (status, unmountOnExit) => {\n\tswitch (status) {\n\t\tcase 1:\n\t\tcase 0: return 2;\n\t\tcase 4:\n\t\tcase 3: return startOrEnd(unmountOnExit);\n\t}\n};\nconst getTimeout = (timeout) => typeof timeout === \"object\" ? [timeout.enter, timeout.exit] : [timeout, timeout];\nconst nextTick = (callback, config) => {\n\tconfig.r = requestAnimationFrame(() => {\n\t\tconfig.r = requestAnimationFrame(callback);\n\t});\n};\n//#endregion\nexport { getEndStatus, getState, getTimeout, nextTick, startOrEnd };\n","import { getEndStatus, getState, getTimeout, nextTick, startOrEnd } from \"./internal.mjs\";\nimport { useCallback, useState } from \"react\";\n//#region src/useTransitionState.ts\nconst updateState = (status, setState, ref, onChange) => {\n\tclearTimeout(ref.t);\n\tcancelAnimationFrame(ref.r);\n\tconst state = getState(status);\n\tsetState(state);\n\tref.s = state;\n\tonChange?.({ current: state });\n};\nconst useTransitionState = ({ enter = true, exit = true, preEnter, preExit, timeout, initialEntered, mountOnEnter, unmountOnExit, onStateChange: onChange } = {}) => {\n\tconst [state, setState] = useState(() => getState(initialEntered ? 2 : startOrEnd(mountOnEnter)));\n\tconst [ref] = useState({\n\t\ts: state,\n\t\tr: 0\n\t});\n\tconst [enterTimeout, exitTimeout] = getTimeout(timeout);\n\tconst endTransition = useCallback(() => {\n\t\tconst status = getEndStatus(ref.s.$, unmountOnExit);\n\t\tif (status) updateState(status, setState, ref, onChange);\n\t}, [\n\t\tonChange,\n\t\tunmountOnExit,\n\t\tref\n\t]);\n\treturn [\n\t\tstate,\n\t\tuseCallback((toEnter) => {\n\t\t\tconst transitState = (status) => {\n\t\t\t\tupdateState(status, setState, ref, onChange);\n\t\t\t\tswitch (status) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tif (enterTimeout >= 0) ref.t = setTimeout(endTransition, enterTimeout);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tif (exitTimeout >= 0) ref.t = setTimeout(endTransition, exitTimeout);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tnextTick(() => transitState(status + 1), ref);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst enterStage = ref.s.isEnter;\n\t\t\tif (typeof toEnter !== \"boolean\") toEnter = !enterStage;\n\t\t\tif (toEnter) !enterStage && transitState(enter ? preEnter ? 0 : 1 : 2);\n\t\t\telse enterStage && transitState(exit ? preExit ? 3 : 4 : startOrEnd(unmountOnExit));\n\t\t}, [\n\t\t\tref,\n\t\t\tendTransition,\n\t\t\tonChange,\n\t\t\tenter,\n\t\t\texit,\n\t\t\tpreEnter,\n\t\t\tpreExit,\n\t\t\tenterTimeout,\n\t\t\texitTimeout,\n\t\t\tunmountOnExit\n\t\t]),\n\t\tendTransition\n\t];\n};\n//#endregion\nexport { useTransitionState };\n","import { useCallback } from 'react';\nimport { useTransitionState } from 'react-transition-state';\nimport { MenuStateMap } from '../utils/constants.mjs';\nimport { getTransition } from '../utils/utils.mjs';\n\nconst useMenuState = ({\n initialOpen,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout = 500,\n onMenuChange\n} = {}) => {\n const enter = getTransition(transition, 'open');\n const exit = getTransition(transition, 'close');\n const [{\n status\n }, toggleMenu, endTransition] = useTransitionState({\n initialEntered: initialOpen,\n mountOnEnter: !initialMounted,\n unmountOnExit: unmountOnClose,\n timeout: transitionTimeout,\n enter,\n exit,\n onStateChange: useCallback(({\n current: {\n isEnter,\n isResolved\n }\n }) => {\n if (!onMenuChange || isEnter && enter && isResolved || !isEnter && exit && isResolved) {\n return;\n }\n onMenuChange({\n open: isEnter\n });\n }, [onMenuChange, enter, exit])\n });\n return [{\n state: MenuStateMap[status],\n endTransition\n }, toggleMenu];\n};\n\nexport { useMenuState };\n","import { useState } from 'react';\nimport { useMenuState } from './useMenuState.mjs';\n\nconst useMenuStateAndFocus = options => {\n const [menuProps, toggleMenu] = useMenuState(options);\n const [menuItemFocus, setMenuItemFocus] = useState();\n const openMenu = (position, alwaysUpdate) => {\n setMenuItemFocus({\n position,\n alwaysUpdate\n });\n toggleMenu(true);\n };\n return [{\n menuItemFocus,\n ...menuProps\n }, toggleMenu, openMenu];\n};\n\nexport { useMenuStateAndFocus };\n","import { useState } from 'react';\n\nconst useClick = (state, onToggle) => {\n if (process.env.NODE_ENV !== 'production' && typeof onToggle !== 'function') {\n throw new Error('[React-Menu] useClick/useHover requires a function in the second parameter.');\n }\n const [skipOpen] = useState({});\n return {\n onMouseDown: () => {\n skipOpen.v = state && state !== 'closed';\n },\n onClick: e => skipOpen.v ? skipOpen.v = false : onToggle(true, e)\n };\n};\n\nexport { useClick };\n","import { forwardRef, useRef, useCallback, useImperativeHandle, Fragment, cloneElement, version } from 'react';\nimport { ControlledMenu } from './ControlledMenu.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.mjs';\nimport { useClick } from '../hooks/useClick.mjs';\nimport { FocusPositions, Keys } from '../utils/constants.mjs';\nimport { safeCall, mergeProps, isMenuOpen, getName } from '../utils/utils.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst isLegacyReact = parseInt(version) < 19;\nconst Menu = /*#__PURE__*/forwardRef(function Menu({\n 'aria-label': ariaLabel,\n captureFocus: _,\n initialOpen: _1,\n menuButton,\n instanceRef,\n onMenuChange,\n ...restProps\n}, externalRef) {\n const [stateProps, toggleMenu, openMenu] = useMenuStateAndFocus({\n ...restProps,\n onMenuChange\n });\n const {\n state\n } = stateProps;\n const isOpen = isMenuOpen(state);\n const buttonRef = useRef(null);\n const anchorProps = useClick(state, (_, e) => openMenu(!e.detail ? FocusPositions.FIRST : undefined));\n const handleClose = useCallback(e => {\n toggleMenu(false);\n if (e.key) buttonRef.current.focus();\n }, [toggleMenu]);\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.UP:\n openMenu(FocusPositions.LAST);\n break;\n case Keys.DOWN:\n openMenu(FocusPositions.FIRST);\n break;\n default:\n return;\n }\n e.preventDefault();\n };\n const button = safeCall(menuButton, {\n open: isOpen\n });\n if (!button || !button.type) throw new Error('Menu requires a menuButton prop.');\n const buttonProps = {\n ...mergeProps({\n onKeyDown,\n ...anchorProps\n }, button.props),\n ref: useCombinedRef(isLegacyReact ? button.ref : button.props.ref, buttonRef)\n };\n if (getName(button.type) === 'MenuButton') {\n buttonProps.isOpen = isOpen;\n }\n const renderButton = /*#__PURE__*/cloneElement(button, buttonProps);\n useImperativeHandle(instanceRef, () => ({\n openMenu,\n closeMenu: () => toggleMenu(false)\n }));\n return /*#__PURE__*/jsxs(Fragment, {\n children: [renderButton, /*#__PURE__*/jsx(ControlledMenu, {\n ...restProps,\n ...stateProps,\n \"aria-label\": ariaLabel || (typeof button.props.children === 'string' ? button.props.children : 'Menu'),\n anchorRef: buttonRef,\n ref: externalRef,\n onClose: handleClose\n })]\n });\n});\n\nexport { Menu };\n","import { forwardRef, useRef, useContext, memo } from 'react';\nimport { HoverItemContext } from './constants.mjs';\nimport { jsx } from 'react/jsx-runtime';\n\nconst withHovering = (name, WrappedComponent) => {\n const Component = /*#__PURE__*/memo(WrappedComponent);\n const WithHovering = /*#__PURE__*/forwardRef((props, ref) => {\n const itemRef = useRef(null);\n return /*#__PURE__*/jsx(Component, {\n ...props,\n itemRef: itemRef,\n externalRef: ref,\n isHovering: useContext(HoverItemContext) === itemRef.current\n });\n });\n WithHovering.displayName = `WithHovering(${name})`;\n return WithHovering;\n};\n\nexport { withHovering };\n","import { useState, useEffect } from 'react';\n\nconst useMouseOver = isHovering => {\n const [mouseOver, setMouseOver] = useState(false);\n useEffect(() => {\n !isHovering && setMouseOver(false);\n }, [isHovering]);\n return [mouseOver, () => !mouseOver && setMouseOver(true), () => setMouseOver(false)];\n};\n\nexport { useMouseOver };\n","import { useLayoutEffect as useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.mjs';\n\nconst useItemEffect = (isDisabled, itemRef, updateItems) => {\n useIsomorphicLayoutEffect(() => {\n if (process.env.NODE_ENV !== 'production' && !updateItems) {\n throw new Error(`[React-Menu] This menu item or submenu should be rendered under a menu: ${itemRef.current.outerHTML}`);\n }\n if (isDisabled) return;\n const item = itemRef.current;\n updateItems(item, true);\n return () => {\n updateItems(item);\n };\n }, [isDisabled, itemRef, updateItems]);\n};\n\nexport { useItemEffect };\n","import { useContext, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { SettingsContext, MenuListContext, MenuListItemContext, roleNone, roleMenuitem, menuClass, menuItemClass, subMenuClass, HoverActionTypes, Keys, FocusPositions } from '../utils/constants.mjs';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.mjs';\nimport { useMouseOver } from '../hooks/useMouseOver.mjs';\nimport { useItemEffect } from '../hooks/useItemEffect.mjs';\nimport { mergeProps, safeCall, commonProps, isMenuOpen, batchedUpdates } from '../utils/utils.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst SubMenu = /*#__PURE__*/withHovering('SubMenu', function SubMenu({\n 'aria-label': ariaLabel,\n className,\n disabled,\n direction,\n label,\n openTrigger,\n onMenuChange,\n isHovering,\n instanceRef,\n itemRef,\n captureFocus: _1,\n repositionFlag: _2,\n itemProps = {},\n portal = false,\n ...restProps\n}) {\n const settings = useContext(SettingsContext);\n const {\n rootMenuRef,\n submenuOpenDelay,\n submenuCloseDelay\n } = settings;\n const {\n parentMenuRef,\n parentDir,\n overflow: parentOverflow\n } = useContext(MenuListContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const isPortal = portal || parentOverflow !== 'visible';\n const [stateProps, toggleMenu, _openMenu] = useMenuStateAndFocus({\n ...settings,\n onMenuChange\n });\n const [mouseOver, mouseOverStart, mouseOverEnd] = useMouseOver(isHovering);\n const {\n state\n } = stateProps;\n const isDisabled = !!disabled;\n const isOpen = isMenuOpen(state);\n const containerRef = useRef(null);\n const [timerId] = useState({\n v: 0\n });\n const stopTimer = () => {\n submenuCtx.off();\n if (timerId.v) {\n clearTimeout(timerId.v);\n timerId.v = 0;\n }\n };\n const openMenu = (...args) => {\n stopTimer();\n setHover();\n !isDisabled && _openMenu(...args);\n };\n const setHover = () => !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n const delayOpen = delay => {\n setHover();\n if (!openTrigger) timerId.v = setTimeout(() => batchedUpdates(openMenu), Math.max(delay, 0));\n };\n const onPointerMove = e => {\n if (isDisabled) return;\n e.stopPropagation();\n mouseOverStart();\n if (timerId.v || isOpen) return;\n submenuCtx.on(submenuCloseDelay, () => delayOpen(submenuOpenDelay - submenuCloseDelay), () => delayOpen(submenuOpenDelay));\n };\n const onPointerLeave = () => {\n mouseOverEnd();\n stopTimer();\n if (!isOpen) dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n case Keys.RIGHT:\n openTrigger !== 'none' && openMenu(FocusPositions.FIRST);\n }\n };\n const onKeyDownOfRoot = e => {\n let handled = false;\n switch (e.key) {\n case Keys.LEFT:\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n handled = true;\n }\n break;\n case Keys.RIGHT:\n if (!isOpen) handled = true;\n break;\n }\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => submenuCtx.toggle(isOpen), [submenuCtx, isOpen]);\n useEffect(() => () => {\n clearTimeout(timerId.v);\n submenuCtx.toggle(false);\n }, [timerId, submenuCtx]);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n itemRef.current.focus();\n } else {\n toggleMenu(false);\n }\n }, [isHovering, isParentOpen, toggleMenu, itemRef]);\n useImperativeHandle(instanceRef, () => ({\n openMenu: (...args) => {\n isParentOpen && openMenu(...args);\n },\n closeMenu: () => {\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n }\n }\n }));\n const modifiers = useMemo(() => ({\n open: isOpen,\n hover: mouseOver || isHovering,\n disabled: isDisabled,\n submenu: true\n }), [isOpen, isHovering, isDisabled, mouseOver]);\n const {\n ref: externalItemRef,\n className: itemClassName,\n ...restItemProps\n } = itemProps;\n const mergedItemProps = mergeProps({\n onPointerEnter: submenuCtx.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onClick: () => openTrigger !== 'none' && openMenu()\n }, restItemProps);\n const getMenuList = () => {\n const menuList = /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ...stateProps,\n ariaLabel: ariaLabel || (typeof label === 'string' ? label : 'Submenu'),\n anchorRef: itemRef,\n containerRef: isPortal ? rootMenuRef : containerRef,\n direction: direction || (parentDir === 'right' || parentDir === 'left' ? parentDir : 'right'),\n parentScrollingRef: isPortal && parentMenuRef,\n isDisabled: isDisabled\n });\n const container = rootMenuRef.current;\n return isPortal && container ? /*#__PURE__*/createPortal(menuList, container) : menuList;\n };\n return /*#__PURE__*/jsxs(\"li\", {\n className: useBEM({\n block: menuClass,\n element: subMenuClass,\n className\n }),\n style: {\n position: 'relative'\n },\n role: roleNone,\n ref: containerRef,\n onKeyDown: onKeyDownOfRoot,\n children: [/*#__PURE__*/jsx(\"div\", {\n role: roleMenuitem,\n \"aria-haspopup\": true,\n \"aria-expanded\": isOpen,\n ...commonProps(isDisabled, isHovering),\n ...mergedItemProps,\n ref: useCombinedRef(externalItemRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className: itemClassName\n }),\n children: useMemo(() => safeCall(label, modifiers), [label, modifiers])\n }), state && getMenuList()]\n });\n});\n\nexport { SubMenu };\n","import { useContext, useEffect } from 'react';\nimport { useItemEffect } from './useItemEffect.mjs';\nimport { useMouseOver } from './useMouseOver.mjs';\nimport { SettingsContext, MenuListItemContext, HoverActionTypes } from '../utils/constants.mjs';\n\nconst useItemState = (itemRef, focusRef, isHovering, isDisabled) => {\n const [mouseOver, mouseOverStart, mouseOverEnd] = useMouseOver(isHovering);\n const {\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const setHover = () => {\n !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n };\n const unsetHover = () => {\n !isDisabled && dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onBlur = e => {\n if (isHovering && !e.currentTarget.contains(e.relatedTarget)) unsetHover();\n };\n const onPointerMove = e => {\n if (!isDisabled) {\n e.stopPropagation();\n mouseOverStart();\n submenuCtx.on(submenuCloseDelay, setHover, setHover);\n }\n };\n const onPointerLeave = (_, keepHover) => {\n mouseOverEnd();\n submenuCtx.off();\n !keepHover && unsetHover();\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n focusRef.current && focusRef.current.focus();\n }\n }, [focusRef, isHovering, isParentOpen]);\n return {\n mouseOver,\n setHover,\n onBlur,\n onPointerMove,\n onPointerLeave\n };\n};\n\nexport { useItemState };\n","import { useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { useItemState } from '../hooks/useItemState.mjs';\nimport { EventHandlersContext, RadioGroupContext, menuClass, menuItemClass, roleNone, roleMenuitem, Keys } from '../utils/constants.mjs';\nimport { mergeProps, safeCall, commonProps } from '../utils/utils.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst MenuItem = /*#__PURE__*/withHovering('MenuItem', function MenuItem({\n className,\n value,\n href,\n type,\n checked,\n disabled,\n children,\n onClick,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const {\n mouseOver,\n setHover,\n ...restStateProps\n } = useItemState(itemRef, itemRef, isHovering, isDisabled);\n const eventHandlers = useContext(EventHandlersContext);\n const radioGroup = useContext(RadioGroupContext);\n const isRadio = type === 'radio';\n const isCheckBox = type === 'checkbox';\n const isAnchor = !!href && !isDisabled && !isRadio && !isCheckBox;\n const isChecked = isRadio ? radioGroup.value === value : isCheckBox ? !!checked : false;\n const handleClick = e => {\n if (isDisabled) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n const event = {\n value,\n syntheticEvent: e\n };\n if (e.key !== undefined) event.key = e.key;\n if (isCheckBox) event.checked = !isChecked;\n if (isRadio) event.name = radioGroup.name;\n safeCall(onClick, event);\n if (isRadio) safeCall(radioGroup.onRadioChange, event);\n eventHandlers.handleClick(event, isCheckBox || isRadio);\n };\n const handleKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n isAnchor ? itemRef.current.click() : handleClick(e);\n }\n };\n const modifiers = useMemo(() => ({\n type,\n disabled: isDisabled,\n hover: mouseOver || isHovering,\n checked: isChecked,\n anchor: isAnchor\n }), [type, isDisabled, mouseOver, isHovering, isChecked, isAnchor]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerDown: setHover,\n onKeyDown: handleKeyDown,\n onClick: handleClick\n }, restProps);\n const menuItemProps = {\n role: isRadio ? 'menuitemradio' : isCheckBox ? 'menuitemcheckbox' : roleMenuitem,\n 'aria-checked': isRadio || isCheckBox ? isChecked : undefined,\n ...commonProps(isDisabled, isHovering),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: useMemo(() => safeCall(children, modifiers), [children, modifiers])\n };\n return isAnchor ? /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n children: /*#__PURE__*/jsx(\"a\", {\n href: href,\n ...menuItemProps\n })\n }) : /*#__PURE__*/jsx(\"li\", {\n ...menuItemProps\n });\n});\n\nexport { MenuItem };\n","import { useRef, useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { useItemState } from '../hooks/useItemState.mjs';\nimport { EventHandlersContext, roleMenuitem, menuClass, menuItemClass } from '../utils/constants.mjs';\nimport { safeCall, mergeProps, commonProps } from '../utils/utils.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst FocusableItem = /*#__PURE__*/withHovering('FocusableItem', function FocusableItem({\n className,\n disabled,\n children,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const ref = useRef(null);\n const {\n mouseOver,\n setHover,\n onPointerLeave,\n ...restStateProps\n } = useItemState(itemRef, ref, isHovering, isDisabled);\n const {\n handleClose\n } = useContext(EventHandlersContext);\n const modifiers = useMemo(() => ({\n disabled: isDisabled,\n hover: mouseOver || isHovering,\n focusable: true\n }), [isDisabled, isHovering, mouseOver]);\n const renderChildren = useMemo(() => safeCall(children, {\n ...modifiers,\n ref,\n closeMenu: handleClose\n }), [children, modifiers, handleClose]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerLeave: e => onPointerLeave(e, true),\n onFocus: setHover\n }, restProps);\n return /*#__PURE__*/jsx(\"li\", {\n role: roleMenuitem,\n ...commonProps(isDisabled),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: renderChildren\n });\n});\n\nexport { FocusableItem };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { menuClass, menuDividerClass } from '../utils/constants.mjs';\n\nconst MenuDivider = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuDivider({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: \"separator\",\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuDividerClass,\n className\n })\n });\n}));\n\nexport { MenuDivider };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { roleNone, menuClass, menuHeaderClass } from '../utils/constants.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\n\nconst MenuHeader = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuHeader({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuHeaderClass,\n className\n })\n });\n}));\n\nexport { MenuHeader };\n","import { forwardRef, useRef, useState, useContext } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { MenuListContext, menuClass, menuGroupClass } from '../utils/constants.mjs';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';\nimport { getNormalizedClientRect } from '../positionUtils/getNormalizedClientRect.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst MenuGroup = /*#__PURE__*/forwardRef(function MenuGroup({\n className,\n style,\n takeOverflow,\n ...restProps\n}, externalRef) {\n const ref = useRef(null);\n const [overflowStyle, setOverflowStyle] = useState();\n const {\n overflow,\n overflowAmt\n } = useContext(MenuListContext);\n useIsomorphicLayoutEffect(() => {\n let maxHeight;\n if (takeOverflow && overflowAmt >= 0) {\n maxHeight = getNormalizedClientRect(ref.current).height - overflowAmt;\n if (maxHeight < 0) maxHeight = 0;\n }\n setOverflowStyle(maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined);\n }, [takeOverflow, overflow, overflowAmt]);\n useIsomorphicLayoutEffect(() => {\n if (overflowStyle) ref.current.scrollTop = 0;\n }, [overflowStyle]);\n return /*#__PURE__*/jsx(\"div\", {\n ...restProps,\n ref: useCombinedRef(externalRef, ref),\n className: useBEM({\n block: menuClass,\n element: menuGroupClass,\n className\n }),\n style: {\n ...style,\n ...overflowStyle\n }\n });\n});\n\nexport { MenuGroup };\n","import { forwardRef, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { RadioGroupContext, roleNone, menuClass, radioGroupClass } from '../utils/constants.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\n\nconst MenuRadioGroup = /*#__PURE__*/forwardRef(function MenuRadioGroup({\n 'aria-label': ariaLabel,\n className,\n name,\n value,\n onRadioChange,\n ...restProps\n}, externalRef) {\n const contextValue = useMemo(() => ({\n name,\n value,\n onRadioChange\n }), [name, value, onRadioChange]);\n return /*#__PURE__*/jsx(RadioGroupContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n children: /*#__PURE__*/jsx(\"ul\", {\n role: \"group\",\n \"aria-label\": ariaLabel || name || 'Radio group',\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: radioGroupClass,\n className\n })\n })\n })\n });\n});\n\nexport { MenuRadioGroup };\n","import { useRef as i, useCallback as P, useEffect as C } from \"react\";\nvar f = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(f || {}), l = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(l || {});\nconst b = [\n \"mousedown\",\n \"mousemove\",\n \"mouseup\",\n \"mouseleave\",\n \"mouseout\"\n], q = [\n \"touchstart\",\n \"touchmove\",\n \"touchend\",\n \"touchcancel\"\n], z = [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointerleave\",\n \"pointerout\"\n];\nfunction G(e) {\n return typeof e == \"object\" && e !== null && \"pageX\" in e && typeof e.pageX == \"number\" && \"pageY\" in e && typeof e.pageY == \"number\";\n}\nfunction J(e) {\n var u;\n return b.includes((u = e == null ? void 0 : e.nativeEvent) == null ? void 0 : u.type);\n}\nfunction U(e) {\n var u;\n return q.includes((u = e == null ? void 0 : e.nativeEvent) == null ? void 0 : u.type) || \"touches\" in e;\n}\nfunction K(e) {\n const { nativeEvent: u } = e;\n return u ? z.includes(u == null ? void 0 : u.type) || \"pointerId\" in u : !1;\n}\nfunction D(e) {\n return J(e) || U(e) || K(e);\n}\nfunction A(e) {\n var s;\n const u = U(e) ? (s = e == null ? void 0 : e.touches) == null ? void 0 : s[0] : e;\n return G(u) ? {\n x: u.pageX,\n y: u.pageY\n } : null;\n}\nfunction N(e) {\n return {\n target: e.target,\n currentTarget: e.currentTarget,\n nativeEvent: e,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n persist: () => {\n }\n };\n}\nfunction V(e, {\n threshold: u = 400,\n captureEvent: s = !1,\n detect: R = f.Pointer,\n cancelOnMovement: p = !1,\n cancelOutsideElement: T = !0,\n filterEvents: M,\n onStart: m,\n onMove: w,\n onFinish: g,\n onCancel: h\n} = {}) {\n const L = i(!1), c = i(!1), H = i(), d = i(), B = i(e), a = i(null), y = P(\n (r) => (t) => {\n c.current || D(t) && (M !== void 0 && !M(t) || (s && t.persist(), m == null || m(t, { context: r }), a.current = A(t), c.current = !0, H.current = t.currentTarget, d.current = setTimeout(() => {\n B.current && (B.current(t, { context: r }), L.current = !0);\n }, u)));\n },\n [s, M, m, u]\n ), o = P(\n (r) => (t, n) => {\n D(t) && c.current && (a.current = null, s && t.persist(), L.current ? g == null || g(t, { context: r }) : c.current && (h == null || h(t, { context: r, reason: n ?? l.CancelledByRelease })), L.current = !1, c.current = !1, d.current !== void 0 && clearTimeout(d.current));\n },\n [s, g, h]\n ), E = P(\n (r) => (t) => {\n if (D(t) && (w == null || w(t, { context: r }), p !== !1 && a.current)) {\n const n = A(t);\n if (n) {\n const X = p === !0 ? 25 : p, Y = {\n x: Math.abs(n.x - a.current.x),\n y: Math.abs(n.y - a.current.y)\n };\n (Y.x > X || Y.y > X) && o(r)(t, l.CancelledByMovement);\n }\n }\n },\n [o, p, w]\n ), I = P(\n (r) => {\n if (e === null)\n return {};\n switch (R) {\n case f.Mouse: {\n const t = {\n onMouseDown: y(r),\n onMouseMove: E(r),\n onMouseUp: o(r)\n };\n return T && (t.onMouseLeave = (n) => {\n o(r)(n, l.CancelledOutsideElement);\n }), t;\n }\n case f.Touch:\n return {\n onTouchStart: y(r),\n onTouchMove: E(r),\n onTouchEnd: o(r)\n };\n case f.Pointer: {\n const t = {\n onPointerDown: y(r),\n onPointerMove: E(r),\n onPointerUp: o(r)\n };\n return T && (t.onPointerLeave = (n) => o(r)(n, l.CancelledOutsideElement)), t;\n }\n }\n },\n [e, o, T, R, E, y]\n );\n return C(() => {\n function r(t) {\n const n = N(t);\n o()(n);\n }\n return window.addEventListener(\"mouseup\", r), window.addEventListener(\"touchend\", r), window.addEventListener(\"pointerup\", r), () => {\n window.removeEventListener(\"mouseup\", r), window.removeEventListener(\"touchend\", r), window.removeEventListener(\"pointerup\", r);\n };\n }, [o]), C(\n () => () => {\n d.current !== void 0 && clearTimeout(d.current);\n },\n []\n ), C(() => {\n B.current = e;\n }, [e]), I;\n}\nexport {\n l as LongPressCallbackReason,\n f as LongPressEventType,\n V as useLongPress\n};\n","\"use client\";\nvar b={success:{pattern:[{duration:30,intensity:.5},{delay:60,duration:40,intensity:1}]},warning:{pattern:[{duration:40,intensity:.8},{delay:100,duration:40,intensity:.6}]},error:{pattern:[{duration:40,intensity:.9},{delay:40,duration:40,intensity:.9},{delay:40,duration:40,intensity:.9}]},light:{pattern:[{duration:15,intensity:.4}]},medium:{pattern:[{duration:25,intensity:.7}]},heavy:{pattern:[{duration:35,intensity:1}]},soft:{pattern:[{duration:40,intensity:.5}]},rigid:{pattern:[{duration:10,intensity:1}]},selection:{pattern:[{duration:8,intensity:.3}]},nudge:{pattern:[{duration:80,intensity:.8},{delay:80,duration:50,intensity:.3}]},buzz:{pattern:[{duration:1e3,intensity:1}]}};var g=16,x=184,m=1e3,p=20;function C(o){if(typeof o==\"number\")return{vibrations:[{duration:o}]};if(typeof o==\"string\"){let i=b[o];return i?{vibrations:i.pattern.map(t=>({...t}))}:(console.warn(`[web-haptics] Unknown preset: \"${o}\"`),null)}if(Array.isArray(o)){if(o.length===0)return{vibrations:[]};if(typeof o[0]==\"number\"){let i=o,t=[];for(let e=0;e<i.length;e+=2){let n=e>0?i[e-1]:0;t.push({...n>0&&{delay:n},duration:i[e]})}return{vibrations:t}}return{vibrations:o.map(i=>({...i}))}}return{vibrations:o.pattern.map(i=>({...i}))}}function w(o,i){if(i>=1)return[o];if(i<=0)return[];let t=Math.max(1,Math.round(p*i)),e=p-t,n=[],s=o;for(;s>=p;)n.push(t),n.push(e),s-=p;if(s>0){let a=Math.max(1,Math.round(s*i));n.push(a);let r=s-a;r>0&&n.push(r)}return n}function M(o,i){let t=[];for(let e=0;e<o.length;e++){let n=o[e],s=Math.max(0,Math.min(1,n.intensity??i)),a=n.delay??0;a>0&&(t.length>0&&t.length%2===0?t[t.length-1]+=a:(t.length===0&&t.push(0),t.push(a)));let r=w(n.duration,s);if(r.length===0){t.length>0&&t.length%2===0?t[t.length-1]+=n.duration:n.duration>0&&(t.push(0),t.push(n.duration));continue}for(let d of r)t.push(d)}return t}var I=0,v=class o{hapticLabel=null;domInitialized=!1;instanceId;debug;showSwitch;rafId=null;patternResolve=null;audioCtx=null;audioFilter=null;audioGain=null;audioBuffer=null;constructor(i){this.instanceId=++I,this.debug=i?.debug??!1,this.showSwitch=i?.showSwitch??!1}static isSupported=typeof navigator<\"u\"&&typeof navigator.vibrate==\"function\";async trigger(i=[{duration:25,intensity:.7}],t){let e=C(i);if(!e)return;let{vibrations:n}=e;if(n.length===0)return;let s=Math.max(0,Math.min(1,t?.intensity??.5));for(let a of n)if(a.duration>m&&(a.duration=m),!Number.isFinite(a.duration)||a.duration<0||a.delay!==void 0&&(!Number.isFinite(a.delay)||a.delay<0)){console.warn(\"[web-haptics] Invalid vibration values. Durations and delays must be finite non-negative numbers.\");return}if(o.isSupported&&navigator.vibrate(M(n,s)),!o.isSupported||this.debug){if(this.ensureDOM(),!this.hapticLabel)return;this.debug&&await this.ensureAudio(),this.stopPattern();let r=(n[0]?.delay??0)===0;if(r&&(this.hapticLabel.click(),this.debug&&this.audioCtx)){let d=Math.max(0,Math.min(1,n[0].intensity??s));this.playClick(d)}await this.runPattern(n,s,r)}}cancel(){this.stopPattern(),o.isSupported&&navigator.vibrate(0)}destroy(){this.stopPattern(),this.hapticLabel&&(this.hapticLabel.remove(),this.hapticLabel=null,this.domInitialized=!1),this.audioCtx&&(this.audioCtx.close(),this.audioCtx=null,this.audioFilter=null,this.audioGain=null,this.audioBuffer=null)}setDebug(i){this.debug=i,!i&&this.audioCtx&&(this.audioCtx.close(),this.audioCtx=null,this.audioFilter=null,this.audioGain=null,this.audioBuffer=null)}setShowSwitch(i){if(this.showSwitch=i,this.hapticLabel){let t=this.hapticLabel.querySelector(\"input\");this.hapticLabel.style.display=i?\"\":\"none\",t&&(t.style.display=i?\"\":\"none\")}}stopPattern(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.patternResolve?.(),this.patternResolve=null}runPattern(i,t,e){return new Promise(n=>{this.patternResolve=n;let s=[],a=0;for(let u of i){let c=Math.max(0,Math.min(1,u.intensity??t)),l=u.delay??0;l>0&&(a+=l,s.push({end:a,isOn:!1,intensity:0})),a+=u.duration,s.push({end:a,isOn:!0,intensity:c})}let r=a,d=0,h=-1,y=u=>{d===0&&(d=u);let c=u-d;if(c>=r){this.rafId=null,this.patternResolve=null,n();return}let l=s[0];for(let f of s)if(c<f.end){l=f;break}if(l.isOn){let f=g+(1-l.intensity)*x;h===-1?(h=u,e||(this.hapticLabel?.click(),this.debug&&this.audioCtx&&this.playClick(l.intensity),e=!0)):u-h>=f&&(this.hapticLabel?.click(),this.debug&&this.audioCtx&&this.playClick(l.intensity),h=u)}this.rafId=requestAnimationFrame(y)};this.rafId=requestAnimationFrame(y)})}playClick(i){if(!this.audioCtx||!this.audioFilter||!this.audioGain||!this.audioBuffer)return;let t=this.audioBuffer.getChannelData(0);for(let a=0;a<t.length;a++)t[a]=(Math.random()*2-1)*Math.exp(-a/25);this.audioGain.gain.value=.5*i;let e=2e3+i*2e3,n=1+(Math.random()-.5)*.3;this.audioFilter.frequency.value=e*n;let s=this.audioCtx.createBufferSource();s.buffer=this.audioBuffer,s.connect(this.audioFilter),s.onended=()=>s.disconnect(),s.start()}async ensureAudio(){if(!this.audioCtx&&typeof AudioContext<\"u\"){this.audioCtx=new AudioContext,this.audioFilter=this.audioCtx.createBiquadFilter(),this.audioFilter.type=\"bandpass\",this.audioFilter.frequency.value=4e3,this.audioFilter.Q.value=8,this.audioGain=this.audioCtx.createGain(),this.audioFilter.connect(this.audioGain),this.audioGain.connect(this.audioCtx.destination);let i=.004;this.audioBuffer=this.audioCtx.createBuffer(1,this.audioCtx.sampleRate*i,this.audioCtx.sampleRate);let t=this.audioBuffer.getChannelData(0);for(let e=0;e<t.length;e++)t[e]=(Math.random()*2-1)*Math.exp(-e/25)}this.audioCtx?.state===\"suspended\"&&await this.audioCtx.resume()}ensureDOM(){if(this.domInitialized||typeof document>\"u\")return;let i=`web-haptics-${this.instanceId}`,t=document.createElement(\"label\");t.setAttribute(\"for\",i),t.textContent=\"Haptic feedback\",t.style.position=\"fixed\",t.style.bottom=\"10px\",t.style.left=\"10px\",t.style.padding=\"5px 10px\",t.style.backgroundColor=\"rgba(0, 0, 0, 0.7)\",t.style.color=\"white\",t.style.fontFamily=\"sans-serif\",t.style.fontSize=\"14px\",t.style.borderRadius=\"4px\",t.style.zIndex=\"9999\",t.style.userSelect=\"none\",this.hapticLabel=t;let e=document.createElement(\"input\");e.type=\"checkbox\",e.setAttribute(\"switch\",\"\"),e.id=i,e.style.all=\"initial\",e.style.appearance=\"auto\",this.showSwitch||(t.style.display=\"none\",e.style.display=\"none\"),t.appendChild(e),document.body.appendChild(t),this.domInitialized=!0}};export{b as a,v as b};\n","import { WebHaptics } from 'web-haptics';\n\nconst haptics = new WebHaptics();\n\nexport default haptics;\n","import mem from './mem';\nimport store from './store';\n\nconst DTFLOCALE_CACHE_KEY = 'dtflocale';\n\nfunction _getDtfLocale() {\n try {\n const cachedDtf = store.session.get(DTFLOCALE_CACHE_KEY);\n if (cachedDtf) return cachedDtf;\n const dtfLocale = new Intl.DateTimeFormat().resolvedOptions().locale;\n store.session.set(DTFLOCALE_CACHE_KEY, dtfLocale);\n return dtfLocale;\n } catch (e) {\n return null;\n }\n}\nexport const getDtfLocale = mem(_getDtfLocale);\n\nexport function clearDtfLocaleCache() {\n store.session.del(DTFLOCALE_CACHE_KEY);\n}\n","import { clearDtfLocaleCache, getDtfLocale } from './dtf-locale';\nimport localeMatch from './locale-match';\nimport mem from './mem';\n\nfunction initLocales() {\n const newLocales = [...navigator.languages];\n const dtfLocale = getDtfLocale();\n if (dtfLocale && !newLocales.includes(dtfLocale)) {\n newLocales.unshift(dtfLocale);\n }\n return newLocales;\n}\n\nlet locales = initLocales();\n\n// For testing: refresh locales from current navigator state\nexport function refreshLocales() {\n clearDtfLocaleCache();\n locales = initLocales();\n}\n\nconst createLocale = mem((language, options = {}) => {\n try {\n return new Intl.Locale(language, options);\n } catch (e) {\n // Fallback to simple string splitting\n // May not work properly due to how complicated this is\n if (!language) return null;\n\n // https://www.w3.org/International/articles/language-tags/\n // Parts: language-extlang-script-region-variant-extension-privateuse\n const [langPart, ...parts] = language.split('-', 4);\n const regionPart = parts.pop() || null;\n const fallbackLocale = {\n language: langPart,\n region: regionPart,\n ...options,\n toString: () => {\n const lang = fallbackLocale.language;\n const middle = parts.length > 0 ? `-${parts.join('-')}-` : '-';\n const reg = fallbackLocale.region;\n return reg ? `${lang}${middle}${reg}` : lang;\n },\n };\n return fallbackLocale;\n }\n});\n\nconst _DateTimeFormat = (locale, opts) => {\n const options = opts;\n\n const appLocale = createLocale(locale);\n\n // Find first user locale with a region\n let userRegion = null;\n for (const loc of locales) {\n const region = createLocale(loc)?.region;\n if (region) {\n userRegion = region;\n break;\n }\n }\n\n const userRegionLocale =\n userRegion && appLocale && appLocale.region !== userRegion\n ? createLocale(appLocale.language, {\n ...appLocale,\n region: userRegion,\n })?.toString()\n : null;\n\n const matchedLocale = localeMatch(\n [userRegionLocale, locale, locale?.replace(/-[a-z]+$/i, '')],\n locales,\n locale,\n );\n\n try {\n return new Intl.DateTimeFormat(matchedLocale, options);\n } catch (e) {\n return new Intl.DateTimeFormat(undefined, options);\n }\n};\n\nconst DateTimeFormat = mem(_DateTimeFormat);\n\nexport default DateTimeFormat;\n","import { i18n } from '@lingui/core';\n\nimport DateTimeFormat from './date-time-format';\n\nfunction niceDateTime(date, dtfOpts) {\n if (!(date instanceof Date)) {\n date = new Date(date);\n }\n\n const { hideTime, formatOpts, forceOpts } = dtfOpts || {};\n const currentYear = new Date().getFullYear();\n const options = forceOpts || {\n // Show year if not current year\n year: date.getFullYear() === currentYear ? undefined : 'numeric',\n month: 'short',\n day: 'numeric',\n // Hide time if requested\n hour: hideTime ? undefined : 'numeric',\n minute: hideTime ? undefined : 'numeric',\n ...formatOpts,\n };\n\n const DTF = DateTimeFormat(i18n.locale, options);\n const dateText = DTF.format(date);\n return dateText;\n}\n\nexport default niceDateTime;\n","import { t } from '@lingui/core/macro';\n\nexport default function openCompose(opts) {\n const url = URL.parse('./compose/', window.location);\n const { width: screenWidth, height: screenHeight } = window.screen;\n const left = Math.max(0, (screenWidth - 600) / 2);\n const top = Math.max(0, (screenHeight - 450) / 2);\n const width = Math.min(screenWidth, 600);\n const height = Math.min(screenHeight, 450);\n const winUID = opts?.uid || Math.random();\n const newWin = window.open(\n url,\n 'compose' + winUID,\n `width=${width},height=${height},left=${left},top=${top}`,\n );\n\n if (newWin) {\n // if (masto) {\n // newWin.masto = masto;\n // }\n\n newWin.__COMPOSE__ = opts;\n } else {\n alert(t`Looks like your browser is blocking popups.`);\n }\n\n return newWin;\n}\n","const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\nexport default function openOSK() {\n if (isSafari) {\n const fauxEl = document.createElement('input');\n fauxEl.style.position = 'absolute';\n fauxEl.style.top = '0';\n fauxEl.style.left = '0';\n fauxEl.style.opacity = '0';\n document.body.appendChild(fauxEl);\n fauxEl.focus();\n setTimeout(() => {\n document.body.removeChild(fauxEl);\n }, 500);\n }\n}\n","const root = document.documentElement;\nconst style = getComputedStyle(root);\nconst defaultBoundingBoxPadding = 8;\n\nlet safeAreaInsets = [0, 0, 0, 0];\nfunction getSafeAreaInsets() {\n // Get safe area inset variables from root\n const safeAreaInsetTop = style.getPropertyValue('--sai-top');\n const safeAreaInsetRight = style.getPropertyValue('--sai-right');\n const safeAreaInsetBottom = style.getPropertyValue('--sai-bottom');\n const safeAreaInsetLeft = style.getPropertyValue('--sai-left');\n safeAreaInsets = [\n // top, right, bottom, left (clockwise)\n Math.max(0, parseInt(safeAreaInsetTop, 10)),\n Math.max(0, parseInt(safeAreaInsetRight, 10)),\n Math.max(0, parseInt(safeAreaInsetBottom, 10)),\n Math.max(0, parseInt(safeAreaInsetLeft, 10)),\n ];\n}\nrequestAnimationFrame(getSafeAreaInsets);\n\nfunction safeBoundingBoxPadding(paddings = []) {\n const str = safeAreaInsets\n .map((v, i) => (v || defaultBoundingBoxPadding) + (paddings[i] || 0))\n .join(' ');\n // console.log(str);\n return str;\n}\n\n// Update safe area insets when orientation or resize\nif (CSS.supports('top: env(safe-area-inset-top)')) {\n window.addEventListener('resize', getSafeAreaInsets, { passive: true });\n}\n\nexport default safeBoundingBoxPadding;\n","import { t } from '@lingui/core/macro';\n\nimport openOSK from './open-osk';\nimport showToast from './show-toast';\nimport states from './states';\n\nconst TOAST_DURATION = 5_000; // 5 seconds\n\nexport default function showCompose(opts) {\n if (!opts) opts = true;\n\n if (states.showCompose) {\n if (states.composerState.minimized) {\n showToast({\n duration: TOAST_DURATION,\n text: t`A draft post is currently minimized. Post or discard it before creating a new one.`,\n });\n } else {\n showToast({\n duration: TOAST_DURATION,\n text: t`A post is currently open. Post or discard it before creating a new one.`,\n });\n }\n return;\n }\n\n openOSK();\n states.showCompose = opts;\n}\n","const template = document.createElement('template');\n\n// Regex patterns for HTML text processing\nconst PARAGRAPH_END_RE = /<\\/p>/g;\nconst LIST_ITEM_END_RE = /<\\/li>/g;\nconst MULTIPLE_LINE_BREAKS_RE = /[\\r\\n]{3,}/g;\nfunction getHTMLText(html, opts) {\n if (!html) return '';\n const { preProcess, truncateLinks = true } = opts || {};\n\n template.innerHTML = html\n .replace(PARAGRAPH_END_RE, '</p>\\n\\n')\n .replace(LIST_ITEM_END_RE, '</li>\\n');\n\n const content = template.content;\n const brElements = content.querySelectorAll('br');\n for (let i = 0; i < brElements.length; i++) {\n brElements[i].replaceWith('\\n');\n }\n\n preProcess?.(content);\n\n if (truncateLinks) {\n // MASTODON-SPECIFIC classes\n // Remove .invisible\n const invisibleElements = content.querySelectorAll('.invisible');\n for (let i = 0; i < invisibleElements.length; i++) {\n invisibleElements[i].remove();\n }\n // Add … at end of .ellipsis\n const ellipsisElements = content.querySelectorAll('.ellipsis');\n for (let i = 0; i < ellipsisElements.length; i++) {\n ellipsisElements[i].append('…');\n }\n }\n\n // Collect innerText from all child nodes since DocumentFragment doesn't have innerText\n let textContent = '';\n for (let i = 0; i < content.childNodes.length; i++) {\n const n = content.childNodes[i];\n textContent += n.innerText || n.textContent || '';\n }\n\n return textContent.replace(MULTIPLE_LINE_BREAKS_RE, '\\n\\n').trim();\n}\n\nexport default getHTMLText;\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n const { spoilerText, content, poll, mediaAttachments, quote } = status;\n let text = '';\n // Don't need supportsNativeQuote because checking quotedStatus ID is enough\n const hasQuote = !!quote?.quotedStatus?.id;\n if (spoilerText?.trim()) {\n text += spoilerText;\n } else {\n text += getHTMLText(content, {\n preProcess: (dom) => {\n if (hasQuote) {\n const reContainer = dom.querySelector('.quote-inline');\n if (reContainer) {\n reContainer.remove();\n }\n }\n },\n });\n }\n text = text.trim();\n if (poll?.options?.length) {\n text += `\\n\\n📊:\\n${poll.options\n .map((o) => `${poll.multiple ? '▪️' : '•'} ${o.title}`)\n .join('\\n')}`;\n }\n if (mediaAttachments?.length) {\n text +=\n ' ' +\n mediaAttachments\n .map(\n (m) =>\n ({\n image: '🖼️',\n gifv: '🎞️',\n video: '📹',\n audio: '🎵',\n unknown: '',\n })[m.type] || '',\n )\n .join('');\n }\n if (hasQuote) {\n const quotePeek = statusPeek(quote.quotedStatus);\n text += `\\n\\n❝\\n${quotePeek}\\n❞`;\n }\n return text;\n}\n\nexport default statusPeek;\n","import { memo } from 'preact/compat';\nimport { useEffect } from 'preact/hooks';\n\nimport { ICON_NAMESPACE, useIconSprite } from './icon-sprite-manager';\nimport { ICONS } from './ICONS';\n\nconst SIZES = {\n xs: 8,\n s: 12,\n m: 16,\n l: 20,\n xl: 24,\n xxl: 32,\n};\n\nconst INVALID_ID_CHARS_REGEX = /[^a-zA-Z0-9]/g;\n\nfunction Icon({\n icon,\n size = 'm',\n alt,\n title,\n class: className = '',\n style = {},\n}) {\n title = title || alt;\n const { loadIcon, isIconLoaded } = useIconSprite();\n\n if (!icon) return null;\n\n const iconSize = SIZES[size];\n let iconBlock = ICONS[icon];\n if (!iconBlock) {\n console.warn(`Icon ${icon} not found`);\n return null;\n }\n\n let rotate,\n flip,\n rtl = false;\n if (Array.isArray(iconBlock)) {\n [iconBlock, rotate, flip] = iconBlock;\n } else if (typeof iconBlock === 'object') {\n ({ rotate, flip, rtl } = iconBlock);\n iconBlock = iconBlock.module;\n }\n\n const sanitizedTitle = title?.replace(INVALID_ID_CHARS_REGEX, '-');\n const titleID = `${ICON_NAMESPACE}-title-${icon}-${sanitizedTitle}`;\n\n useEffect(() => {\n if (!isIconLoaded(icon)) {\n loadIcon(icon);\n }\n }, [icon]);\n\n const loaded = isIconLoaded(icon);\n\n return (\n <span\n class={`icon ${className} ${rtl ? 'rtl-flip' : ''}`}\n style={{\n width: `${iconSize}px`,\n height: `${iconSize}px`,\n ...style,\n }}\n data-icon={icon}\n title={loaded ? undefined : title || undefined}\n >\n {loaded && (\n <svg\n width={iconSize}\n height={iconSize}\n role={title ? 'img' : 'presentation'}\n aria-labelledby={title ? titleID : undefined}\n style={{\n transform: `${rotate ? `rotate(${rotate})` : ''} ${\n flip ? `scaleX(-1)` : ''\n }`,\n }}\n >\n {title ? <title id={titleID}>{title}</title> : null}\n <use href={`#${ICON_NAMESPACE}-${icon}`} />\n </svg>\n )}\n </span>\n );\n}\n\nexport default memo(Icon, (prevProps, nextProps) => {\n return (\n prevProps.icon === nextProps.icon &&\n prevProps.title === nextProps.title &&\n prevProps.alt === nextProps.alt &&\n prevProps.size === nextProps.size\n );\n});\n","import { forwardRef } from 'preact/compat';\nimport { useLocation } from 'react-router-dom';\n\nimport states from '../utils/states';\n\n/* NOTES\n =====\n Initially this uses <NavLink> from react-router-dom, but it doesn't work:\n 1. It interferes with nested <a> inside <a> and it's difficult to preventDefault/stopPropagation from the nested <a>\n 2. isActive doesn't work properly with the weird routes that's set up in this app, due to the faux \"location\" to make the modals work and prevent unmounting\n 3. Not using <Link state/> because it modifies history.state that *persists* across page reloads. I don't need that, so using valtio's states instead.\n*/\n\nconst Link = forwardRef((props, ref) => {\n let routerLocation;\n try {\n routerLocation = useLocation();\n } catch (e) {}\n let hash = (location.hash || '').replace(/^#/, '').trim();\n if (hash === '') hash = '/';\n const { to, ...restProps } = props;\n\n // Handle encodeURIComponent of searchParams values\n if (!!hash && hash !== '/' && hash.includes('?')) {\n const parsedHash = URL.parse(hash, location.origin); // Fake base URL\n if (parsedHash?.searchParams?.size) {\n const searchParamsStr = Array.from(parsedHash.searchParams.entries())\n .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n .join('&');\n hash = parsedHash.pathname + '?' + searchParamsStr;\n }\n }\n\n const isActive = hash === to || decodeURIComponent(hash) === to;\n return (\n <a\n ref={ref}\n href={`#${to}`}\n {...restProps}\n class={`${props.class || ''} ${isActive ? 'is-active' : ''}`}\n onClick={(e) => {\n if (e.currentTarget?.parentNode?.closest('a')) {\n // If this <a> is nested inside another <a>\n e.stopPropagation();\n }\n if (routerLocation) states.prevLocation = routerLocation;\n props.onClick?.(e);\n }}\n />\n );\n});\n\nexport default Link;\n","import { FocusableItem } from '@szhsin/react-menu';\n\nimport Link from './link';\n\nfunction MenuLink(props) {\n const { className, disabled, ...restProps } = props;\n return (\n <FocusableItem className={className} disabled={disabled}>\n {({ ref, closeMenu }) => (\n <Link\n {...restProps}\n ref={ref}\n onClick={({ detail }) =>\n closeMenu(detail === 0 ? 'Enter' : undefined)\n }\n />\n )}\n </FocusableItem>\n );\n}\n\nexport default MenuLink;\n","import mem from './mem.js';\n\nexport default mem(\n (locale) => new Intl.RelativeTimeFormat(locale || undefined),\n);\n","import { i18n } from '@lingui/core';\nimport { t } from '@lingui/core/macro';\nimport { useEffect, useMemo, useReducer } from 'preact/hooks';\n\nimport DateTimeFormat from '../utils/date-time-format';\nimport RTF from '../utils/relative-time-format';\n\nfunction isValidDate(value) {\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n } else {\n const date = new Date(value);\n return !isNaN(date.getTime());\n }\n}\n\nconst minute = 60;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst rtfFromNow = (date) => {\n // date = Date object\n const rtf = RTF(i18n.locale);\n const seconds = (date.getTime() - Date.now()) / 1000;\n const absSeconds = Math.abs(seconds);\n if (absSeconds < minute) {\n return rtf.format(Math.floor(seconds), 'second');\n } else if (absSeconds < hour) {\n return rtf.format(Math.floor(seconds / minute), 'minute');\n } else if (absSeconds < day) {\n return rtf.format(Math.floor(seconds / hour), 'hour');\n } else if (absSeconds < 30 * day) {\n return rtf.format(Math.floor(seconds / day), 'day');\n } else if (absSeconds < 365 * day) {\n return rtf.format(Math.floor(seconds / day / 30), 'month');\n } else {\n return rtf.format(Math.floor(seconds / day / 365), 'year');\n }\n};\n\nconst twitterFromNow = (date) => {\n // date = Date object\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n return t({\n comment: 'Relative time in seconds, as short as possible',\n message: `${seconds < 1 ? 1 : Math.floor(seconds)}s`,\n });\n } else if (seconds < hour) {\n return t({\n comment: 'Relative time in minutes, as short as possible',\n message: `${Math.floor(seconds / minute)}m`,\n });\n } else {\n return t({\n comment: 'Relative time in hours, as short as possible',\n message: `${Math.floor(seconds / hour)}h`,\n });\n }\n};\n\nexport default function RelativeTime({ datetime, format }) {\n if (!datetime) return null;\n const [renderCount, rerender] = useReducer((x) => x + 1, 0);\n const date = useMemo(() => new Date(datetime), [datetime]);\n const [dateStr, dt, title] = useMemo(() => {\n if (!isValidDate(date))\n return ['' + (typeof datetime === 'string' ? datetime : ''), '', ''];\n let str;\n if (format === 'micro') {\n // If date <= 1 day ago or day is within this year\n const now = new Date();\n const dayDiff = (now.getTime() - date.getTime()) / 1000 / day;\n if (dayDiff <= 1) {\n str = twitterFromNow(date);\n } else {\n const sameYear = now.getFullYear() === date.getFullYear();\n if (sameYear) {\n str = DateTimeFormat(i18n.locale, {\n year: undefined,\n month: 'short',\n day: 'numeric',\n }).format(date);\n } else {\n str = DateTimeFormat(i18n.locale, {\n dateStyle: 'short',\n }).format(date);\n }\n }\n }\n if (!str) str = rtfFromNow(date);\n return [str, date.toISOString(), date.toLocaleString()];\n }, [date, format, renderCount]);\n\n useEffect(() => {\n if (!isValidDate(date)) return;\n let timeout;\n let raf;\n function rafRerender() {\n raf = requestAnimationFrame(() => {\n rerender();\n scheduleRerender();\n });\n }\n function scheduleRerender() {\n // If less than 1 minute, rerender every 10s\n // If less than 1 hour rerender every 1m\n // Else, don't need to rerender\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n timeout = setTimeout(rafRerender, 10_000);\n } else if (seconds < hour) {\n timeout = setTimeout(rafRerender, 60_000);\n }\n }\n scheduleRerender();\n return () => {\n clearTimeout(timeout);\n cancelAnimationFrame(raf);\n };\n }, []);\n\n return (\n <time datetime={dt} title={title}>\n {dateStr}\n </time>\n );\n}\n","import { SubMenu } from '@szhsin/react-menu';\nimport { useLayoutEffect, useRef, useState } from 'preact/hooks';\n\nexport default function SubMenu2(props) {\n const menuRef = useRef();\n const itemRef = useRef();\n const { label, direction, shift, ...restProps } = props;\n const [computedDirection, setComputedDirection] = useState(direction);\n const [computedShift, setComputedShift] = useState(shift);\n\n // If menu item width is >50% of viewport, use bottom direction\n useLayoutEffect(() => {\n if (itemRef.current) {\n const width = itemRef.current.offsetWidth;\n const viewportWidth = window.innerWidth;\n if (width > viewportWidth * 0.5) {\n setComputedDirection('bottom');\n setComputedShift(shift || 8);\n } else {\n setComputedDirection(direction);\n setComputedShift(shift);\n }\n }\n }, [direction, shift]);\n\n return (\n <SubMenu\n {...restProps}\n direction={computedDirection}\n shift={computedShift}\n label={label}\n instanceRef={menuRef}\n // Test fix for bug; submenus not opening on Android\n itemProps={{\n ref: itemRef,\n onPointerMove: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n onPointerLeave: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n ...props.itemProps,\n }}\n />\n );\n}\n","import { useEffect } from 'preact/hooks';\n\n// NOTE: The order of initialized close watchers is important\n// Last one will intercept first if there are multiple/nested close watchers\n// So if this hook reruns, the previous close watcher will be destroyed, the new one will be created and the order will change\nfunction useCloseWatcher(fn, deps = []) {\n if (!fn || typeof fn !== 'function') return;\n useEffect(() => {\n console.log('useCloseWatcher');\n const watcher = new CloseWatcher();\n watcher.addEventListener('close', fn);\n return () => {\n watcher.destroy();\n };\n }, deps);\n}\n\nexport default window.CloseWatcher ? useCloseWatcher : () => {};\n","import './modal.css';\n\nimport { createPortal } from 'preact/compat';\nimport { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport store from '../utils/store';\nimport useCloseWatcher from '../utils/useCloseWatcher';\n\nconst $modalContainer = document.getElementById('modal-container');\n\nfunction getBackdropThemeColor() {\n return getComputedStyle(document.documentElement).getPropertyValue(\n '--backdrop-theme-color',\n );\n}\n\nfunction Modal({ children, onClose, onClick, class: className, minimized }) {\n if (!children) return null;\n\n const modalRef = useRef();\n useEffect(() => {\n let timer = setTimeout(() => {\n const focusElement = modalRef.current?.querySelector('[tabindex=\"-1\"]');\n if (focusElement) {\n focusElement.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const supportsCloseWatcher = window.CloseWatcher;\n const escRef = useHotkeys(\n 'esc',\n () => {\n setTimeout(() => {\n onClose?.();\n }, 0);\n },\n {\n enabled: !supportsCloseWatcher && !!onClose,\n // Using keyup and setTimeout above\n // This will run \"later\" to prevent clash with esc handlers from other components\n keydown: false,\n keyup: true,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n [onClose],\n );\n useCloseWatcher(onClose, [onClose]);\n\n useEffect(() => {\n const $deckContainers = document.querySelectorAll('.deck-container');\n if (minimized) {\n // Similar to focusDeck in focus-deck.jsx\n // Focus last deck\n const page = $deckContainers[$deckContainers.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n page.focus();\n }\n } else {\n if (children) {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.setAttribute('inert', '');\n });\n } else {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n }\n }\n return () => {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n };\n }, [children, minimized]);\n\n const $meta = useRef();\n const metaColor = useRef();\n useLayoutEffect(() => {\n if (children && !minimized) {\n const theme = store.local.get('theme');\n if (theme) {\n const backdropColor = getBackdropThemeColor();\n console.log({ backdropColor });\n $meta.current = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta.current) {\n metaColor.current = $meta.current.content;\n $meta.current.content = backdropColor;\n }\n document.documentElement.style.setProperty(\n '--meta-theme-color',\n backdropColor,\n );\n } else {\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n const backdropColor = getBackdropThemeColor();\n console.log({ backdropColor });\n $meta.current = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta.current) {\n metaColor.current = $meta.current.content;\n $meta.current.content = backdropColor;\n }\n document.documentElement.style.setProperty(\n '--meta-theme-color',\n backdropColor,\n );\n }\n } else {\n // Reset meta color\n if ($meta.current && metaColor.current) {\n $meta.current.content = metaColor.current;\n }\n document.documentElement.style.removeProperty('--meta-theme-color');\n }\n return () => {\n // Reset meta color\n if ($meta.current && metaColor.current) {\n $meta.current.content = metaColor.current;\n }\n document.documentElement.style.removeProperty('--meta-theme-color');\n };\n }, [children, minimized]);\n\n const Modal = (\n <div\n ref={(node) => {\n modalRef.current = node;\n escRef.current = node?.querySelector?.('[tabindex=\"-1\"]') || node;\n }}\n className={className}\n onClick={(e) => {\n onClick?.(e);\n if (e.target === e.currentTarget) {\n onClose?.(e);\n }\n }}\n tabIndex={minimized ? 0 : '-1'}\n inert={minimized}\n onFocus={(e) => {\n try {\n if (e.target === e.currentTarget) {\n const focusElement =\n modalRef.current?.querySelector('[tabindex=\"-1\"]');\n const isFocusable =\n !!focusElement &&\n getComputedStyle(focusElement)?.pointerEvents !== 'none';\n if (focusElement && isFocusable) {\n focusElement.focus();\n }\n }\n } catch (err) {\n console.error(err);\n }\n }}\n >\n {children}\n </div>\n );\n\n return createPortal(Modal, $modalContainer);\n\n // return createPortal(children, $modalContainer);\n}\n\nexport default Modal;\n","import './avatar.css';\n\nimport { memo } from 'preact/compat';\nimport { useRef } from 'preact/hooks';\n\nconst SIZES = {\n s: 16,\n m: 20,\n l: 24,\n xl: 32,\n xxl: 50,\n xxxl: 64,\n};\n\nconst alphaCache = new Map();\n\nconst canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\nconst ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n});\nctx.imageSmoothingEnabled = false;\n\nconst scheduleTask =\n typeof requestIdleCallback === 'function'\n ? (fn) => requestIdleCallback(fn, { timeout: 500 })\n : (fn) => setTimeout(fn, 1);\n\nconst MISSING_IMAGE_PATH_REGEX = /missing\\.png$/;\n\nfunction Avatar({ url, staticUrl, size, alt = '', squircle, ...props }) {\n if (!url) {\n url = staticUrl;\n staticUrl = undefined;\n }\n size = SIZES[size] || size || SIZES.m;\n const avatarRef = useRef();\n const isMissing = MISSING_IMAGE_PATH_REGEX.test(url);\n return (\n <picture\n ref={avatarRef}\n class={`avatar ${squircle ? 'squircle' : ''} ${\n alphaCache.get(url) ? 'has-alpha' : ''\n }`}\n style={{\n width: size,\n height: size,\n }}\n title={alt}\n {...props}\n >\n {!!staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n {!!url && (\n <img\n src={url}\n width={size}\n height={size}\n alt={alt}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n crossOrigin={\n !alphaCache.has(url) && !isMissing ? 'anonymous' : undefined\n }\n onError={(e) => {\n if (e.target.crossOrigin) {\n e.target.crossOrigin = null;\n e.target.src = url;\n }\n }}\n onLoad={(e) => {\n if (avatarRef.current) avatarRef.current.dataset.loaded = true;\n if (alphaCache.has(url)) return;\n if (isMissing) return;\n scheduleTask(() => {\n try {\n // Check if image has alpha channel\n // Sample at reduced resolution to avoid processing large images\n const { naturalWidth: nw, naturalHeight: nh } = e.target;\n const scale = Math.min(1, SIZES.xxxl / Math.max(nw, nh));\n const sampleW = Math.max(1, Math.round(nw * scale));\n const sampleH = Math.max(1, Math.round(nh * scale));\n if (canvas.width !== sampleW) canvas.width = sampleW;\n if (canvas.height !== sampleH) canvas.height = sampleH;\n ctx.drawImage(e.target, 0, 0, sampleW, sampleH);\n const { data } = ctx.getImageData(0, 0, sampleW, sampleH);\n // Early-exit loop: stop once 10% of pixels have alpha <= 128\n const totalPixels = data.length / 4;\n const threshold = totalPixels * 0.1;\n let alphaCount = 0;\n for (let i = 3; i < data.length; i += 4) {\n if (data[i] <= 128 && ++alphaCount > threshold) break;\n }\n const hasAlpha = alphaCount > threshold;\n if (hasAlpha) {\n avatarRef.current?.classList.add('has-alpha');\n }\n alphaCache.set(url, hasAlpha);\n } catch (e) {\n // Silent fail\n alphaCache.set(url, false);\n }\n });\n }}\n />\n )}\n </picture>\n );\n}\n\nexport default memo(Avatar);\n","let IS_RTL = false;\n\n// Use MutationObserver to detect RTL\nconst observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes') {\n const { dir } = mutation.target;\n if (dir === 'rtl') {\n IS_RTL = true;\n } else {\n IS_RTL = false;\n }\n console.log({ IS_RTL });\n // Fire custom event 'dirchange' on document\n // document.dispatchEvent(new Event('dirchange'));\n }\n });\n});\nobserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n});\n\nexport default function isRTL() {\n return IS_RTL;\n // return document.documentElement.dir === 'rtl';\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useWindowSize() {\n const [size, setSize] = useState({\n width: null,\n height: null,\n });\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n handleResize();\n window.addEventListener('resize', handleResize, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n}\n","import { Menu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport useWindowSize from '../utils/useWindowSize';\n\n// It's like Menu but with sensible defaults, bug fixes and improvements.\nfunction Menu2(props) {\n const { containerProps, instanceRef: _instanceRef, align } = props;\n const size = useWindowSize();\n const instanceRef = _instanceRef?.current ? _instanceRef : useRef();\n\n // Values: start, end, center\n // Note: don't mess with 'center'\n const rtlAlign = isRTL()\n ? align === 'end'\n ? 'start'\n : align === 'start'\n ? 'end'\n : align\n : align;\n\n return (\n <Menu\n boundingBoxPadding={safeBoundingBoxPadding()}\n repositionFlag={`${size.width}x${size.height}`}\n unmountOnClose\n {...props}\n align={rtlAlign}\n instanceRef={instanceRef}\n containerProps={{\n onClick: (e) => {\n if (e.target === e.currentTarget) {\n instanceRef.current?.closeMenu?.();\n }\n containerProps?.onClick?.(e);\n },\n ...containerProps,\n }}\n />\n );\n}\n\nexport default Menu2;\n","import { MenuItem } from '@szhsin/react-menu';\nimport { cloneElement } from 'preact';\n\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction MenuConfirm({\n subMenu = false,\n confirm = true,\n confirmLabel,\n menuItemClassName,\n menuFooter,\n menuExtras,\n ...props\n}) {\n const { children, onClick, ...restProps } = props;\n if (!confirm) {\n if (subMenu) return <MenuItem {...props} />;\n if (onClick) {\n return cloneElement(children, {\n onClick,\n });\n }\n return children;\n }\n const Parent = subMenu ? SubMenu2 : Menu2;\n return (\n <Parent\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n {...restProps}\n menuButton={subMenu ? undefined : children}\n label={subMenu ? children : undefined}\n >\n <MenuItem className={menuItemClassName} onClick={onClick}>\n {confirmLabel}\n </MenuItem>\n {menuExtras}\n {menuFooter}\n </Parent>\n );\n}\n\nexport default MenuConfirm;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.loop = exports.conditional = exports.parse = void 0;\n\nvar parse = function parse(stream, schema) {\n var result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : result;\n\n if (Array.isArray(schema)) {\n schema.forEach(function (partSchema) {\n return parse(stream, partSchema, result, parent);\n });\n } else if (typeof schema === 'function') {\n schema(stream, result, parent, parse);\n } else {\n var key = Object.keys(schema)[0];\n\n if (Array.isArray(schema[key])) {\n parent[key] = {};\n parse(stream, schema[key], result, parent[key]);\n } else {\n parent[key] = schema[key](stream, result, parent, parse);\n }\n }\n\n return result;\n};\n\nexports.parse = parse;\n\nvar conditional = function conditional(schema, conditionFunc) {\n return function (stream, result, parent, parse) {\n if (conditionFunc(stream, result, parent)) {\n parse(stream, schema, result, parent);\n }\n };\n};\n\nexports.conditional = conditional;\n\nvar loop = function loop(schema, continueFunc) {\n return function (stream, result, parent, parse) {\n var arr = [];\n var lastStreamPos = stream.pos;\n\n while (continueFunc(stream, result, parent)) {\n var newParent = {};\n parse(stream, schema, result, newParent); // cases when whole file is parsed but no termination is there and stream position is not getting updated as well\n // it falls into infinite recursion, null check to avoid the same\n\n if (stream.pos === lastStreamPos) {\n break;\n }\n\n lastStreamPos = stream.pos;\n arr.push(newParent);\n }\n\n return arr;\n };\n};\n\nexports.loop = loop;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.readBits = exports.readArray = exports.readUnsigned = exports.readString = exports.peekBytes = exports.readBytes = exports.peekByte = exports.readByte = exports.buildStream = void 0;\n\n// Default stream and parsers for Uint8TypedArray data type\nvar buildStream = function buildStream(uint8Data) {\n return {\n data: uint8Data,\n pos: 0\n };\n};\n\nexports.buildStream = buildStream;\n\nvar readByte = function readByte() {\n return function (stream) {\n return stream.data[stream.pos++];\n };\n};\n\nexports.readByte = readByte;\n\nvar peekByte = function peekByte() {\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return function (stream) {\n return stream.data[stream.pos + offset];\n };\n};\n\nexports.peekByte = peekByte;\n\nvar readBytes = function readBytes(length) {\n return function (stream) {\n return stream.data.subarray(stream.pos, stream.pos += length);\n };\n};\n\nexports.readBytes = readBytes;\n\nvar peekBytes = function peekBytes(length) {\n return function (stream) {\n return stream.data.subarray(stream.pos, stream.pos + length);\n };\n};\n\nexports.peekBytes = peekBytes;\n\nvar readString = function readString(length) {\n return function (stream) {\n return Array.from(readBytes(length)(stream)).map(function (value) {\n return String.fromCharCode(value);\n }).join('');\n };\n};\n\nexports.readString = readString;\n\nvar readUnsigned = function readUnsigned(littleEndian) {\n return function (stream) {\n var bytes = readBytes(2)(stream);\n return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];\n };\n};\n\nexports.readUnsigned = readUnsigned;\n\nvar readArray = function readArray(byteSize, totalOrFunc) {\n return function (stream, result, parent) {\n var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;\n var parser = readBytes(byteSize);\n var arr = new Array(total);\n\n for (var i = 0; i < total; i++) {\n arr[i] = parser(stream);\n }\n\n return arr;\n };\n};\n\nexports.readArray = readArray;\n\nvar subBitsTotal = function subBitsTotal(bits, startIndex, length) {\n var result = 0;\n\n for (var i = 0; i < length; i++) {\n result += bits[startIndex + i] && Math.pow(2, length - i - 1);\n }\n\n return result;\n};\n\nvar readBits = function readBits(schema) {\n return function (stream) {\n var _byte = readByte()(stream); // convert the byte to bit array\n\n\n var bits = new Array(8);\n\n for (var i = 0; i < 8; i++) {\n bits[7 - i] = !!(_byte & 1 << i);\n } // convert the bit array to values based on the schema\n\n\n return Object.keys(schema).reduce(function (res, key) {\n var def = schema[key];\n\n if (def.length) {\n res[key] = subBitsTotal(bits, def.index, def.length);\n } else {\n res[key] = bits[def.index];\n }\n\n return res;\n }, {});\n };\n};\n\nexports.readBits = readBits;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _ = require(\"../\");\n\nvar _uint = require(\"../parsers/uint8\");\n\n// a set of 0x00 terminated subblocks\nvar subBlocksSchema = {\n blocks: function blocks(stream) {\n var terminator = 0x00;\n var chunks = [];\n var streamSize = stream.data.length;\n var total = 0;\n\n for (var size = (0, _uint.readByte)()(stream); size !== terminator; size = (0, _uint.readByte)()(stream)) {\n // size becomes undefined for some case when file is corrupted and terminator is not proper \n // null check to avoid recursion\n if (!size) break; // catch corrupted files with no terminator\n\n if (stream.pos + size >= streamSize) {\n var availableSize = streamSize - stream.pos;\n chunks.push((0, _uint.readBytes)(availableSize)(stream));\n total += availableSize;\n break;\n }\n\n chunks.push((0, _uint.readBytes)(size)(stream));\n total += size;\n }\n\n var result = new Uint8Array(total);\n var offset = 0;\n\n for (var i = 0; i < chunks.length; i++) {\n result.set(chunks[i], offset);\n offset += chunks[i].length;\n }\n\n return result;\n }\n}; // global control extension\n\nvar gceSchema = (0, _.conditional)({\n gce: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n byteSize: (0, _uint.readByte)()\n }, {\n extras: (0, _uint.readBits)({\n future: {\n index: 0,\n length: 3\n },\n disposal: {\n index: 3,\n length: 3\n },\n userInput: {\n index: 6\n },\n transparentColorGiven: {\n index: 7\n }\n })\n }, {\n delay: (0, _uint.readUnsigned)(true)\n }, {\n transparentColorIndex: (0, _uint.readByte)()\n }, {\n terminator: (0, _uint.readByte)()\n }]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xf9;\n}); // image pipeline block\n\nvar imageSchema = (0, _.conditional)({\n image: [{\n code: (0, _uint.readByte)()\n }, {\n descriptor: [{\n left: (0, _uint.readUnsigned)(true)\n }, {\n top: (0, _uint.readUnsigned)(true)\n }, {\n width: (0, _uint.readUnsigned)(true)\n }, {\n height: (0, _uint.readUnsigned)(true)\n }, {\n lct: (0, _uint.readBits)({\n exists: {\n index: 0\n },\n interlaced: {\n index: 1\n },\n sort: {\n index: 2\n },\n future: {\n index: 3,\n length: 2\n },\n size: {\n index: 5,\n length: 3\n }\n })\n }]\n }, (0, _.conditional)({\n lct: (0, _uint.readArray)(3, function (stream, result, parent) {\n return Math.pow(2, parent.descriptor.lct.size + 1);\n })\n }, function (stream, result, parent) {\n return parent.descriptor.lct.exists;\n }), {\n data: [{\n minCodeSize: (0, _uint.readByte)()\n }, subBlocksSchema]\n }]\n}, function (stream) {\n return (0, _uint.peekByte)()(stream) === 0x2c;\n}); // plain text block\n\nvar textSchema = (0, _.conditional)({\n text: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n blockSize: (0, _uint.readByte)()\n }, {\n preData: function preData(stream, result, parent) {\n return (0, _uint.readBytes)(parent.text.blockSize)(stream);\n }\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0x01;\n}); // application block\n\nvar applicationSchema = (0, _.conditional)({\n application: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n blockSize: (0, _uint.readByte)()\n }, {\n id: function id(stream, result, parent) {\n return (0, _uint.readString)(parent.blockSize)(stream);\n }\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xff;\n}); // comment block\n\nvar commentSchema = (0, _.conditional)({\n comment: [{\n codes: (0, _uint.readBytes)(2)\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xfe;\n});\nvar schema = [{\n header: [{\n signature: (0, _uint.readString)(3)\n }, {\n version: (0, _uint.readString)(3)\n }]\n}, {\n lsd: [{\n width: (0, _uint.readUnsigned)(true)\n }, {\n height: (0, _uint.readUnsigned)(true)\n }, {\n gct: (0, _uint.readBits)({\n exists: {\n index: 0\n },\n resolution: {\n index: 1,\n length: 3\n },\n sort: {\n index: 4\n },\n size: {\n index: 5,\n length: 3\n }\n })\n }, {\n backgroundColorIndex: (0, _uint.readByte)()\n }, {\n pixelAspectRatio: (0, _uint.readByte)()\n }]\n}, (0, _.conditional)({\n gct: (0, _uint.readArray)(3, function (stream, result) {\n return Math.pow(2, result.lsd.gct.size + 1);\n })\n}, function (stream, result) {\n return result.lsd.gct.exists;\n}), // content frames\n{\n frames: (0, _.loop)([gceSchema, applicationSchema, commentSchema, imageSchema, textSchema], function (stream) {\n var nextCode = (0, _uint.peekByte)()(stream); // rather than check for a terminator, we should check for the existence\n // of an ext or image block to avoid infinite loops\n //var terminator = 0x3B;\n //return nextCode !== terminator;\n\n return nextCode === 0x21 || nextCode === 0x2c;\n })\n}];\nvar _default = schema;\nexports[\"default\"] = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deinterlace = void 0;\n\n/**\r\n * Deinterlace function from https://github.com/shachaf/jsgif\r\n */\nvar deinterlace = function deinterlace(pixels, width) {\n var newPixels = new Array(pixels.length);\n var rows = pixels.length / width;\n\n var cpRow = function cpRow(toRow, fromRow) {\n var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n }; // See appendix E.\n\n\n var offsets = [0, 4, 2, 1];\n var steps = [8, 8, 4, 2];\n var fromRow = 0;\n\n for (var pass = 0; pass < 4; pass++) {\n for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n\n return newPixels;\n};\n\nexports.deinterlace = deinterlace;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.lzw = void 0;\n\n/**\r\n * javascript port of java LZW decompression\r\n * Original java author url: https://gist.github.com/devunwired/4479231\r\n */\nvar lzw = function lzw(minCodeSize, data, pixelCount) {\n var MAX_STACK_SIZE = 4096;\n var nullCode = -1;\n var npix = pixelCount;\n var available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, i, datum, data_size, first, top, bi, pi;\n var dstPixels = new Array(pixelCount);\n var prefix = new Array(MAX_STACK_SIZE);\n var suffix = new Array(MAX_STACK_SIZE);\n var pixelStack = new Array(MAX_STACK_SIZE + 1); // Initialize GIF data stream decoder.\n\n data_size = minCodeSize;\n clear = 1 << data_size;\n end_of_information = clear + 1;\n available = clear + 2;\n old_code = nullCode;\n code_size = data_size + 1;\n code_mask = (1 << code_size) - 1;\n\n for (code = 0; code < clear; code++) {\n prefix[code] = 0;\n suffix[code] = code;\n } // Decode GIF pixel stream.\n\n\n var datum, bits, count, first, top, pi, bi;\n datum = bits = count = first = top = pi = bi = 0;\n\n for (i = 0; i < npix;) {\n if (top === 0) {\n if (bits < code_size) {\n // get the next byte\n datum += data[bi] << bits;\n bits += 8;\n bi++;\n continue;\n } // Get the next code.\n\n\n code = datum & code_mask;\n datum >>= code_size;\n bits -= code_size; // Interpret the code\n\n if (code > available || code == end_of_information) {\n break;\n }\n\n if (code == clear) {\n // Reset decoder.\n code_size = data_size + 1;\n code_mask = (1 << code_size) - 1;\n available = clear + 2;\n old_code = nullCode;\n continue;\n }\n\n if (old_code == nullCode) {\n pixelStack[top++] = suffix[code];\n old_code = code;\n first = code;\n continue;\n }\n\n in_code = code;\n\n if (code == available) {\n pixelStack[top++] = first;\n code = old_code;\n }\n\n while (code > clear) {\n pixelStack[top++] = suffix[code];\n code = prefix[code];\n }\n\n first = suffix[code] & 0xff;\n pixelStack[top++] = first; // add a new string to the table, but only if space is available\n // if not, just continue with current table until a clear code is found\n // (deferred clear code implementation as per GIF spec)\n\n if (available < MAX_STACK_SIZE) {\n prefix[available] = old_code;\n suffix[available] = first;\n available++;\n\n if ((available & code_mask) === 0 && available < MAX_STACK_SIZE) {\n code_size++;\n code_mask += available;\n }\n }\n\n old_code = in_code;\n } // Pop a pixel off the pixel stack.\n\n\n top--;\n dstPixels[pi++] = pixelStack[top];\n i++;\n }\n\n for (i = pi; i < npix; i++) {\n dstPixels[i] = 0; // clear missing pixels\n }\n\n return dstPixels;\n};\n\nexports.lzw = lzw;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.decompressFrames = exports.decompressFrame = exports.parseGIF = void 0;\n\nvar _gif = _interopRequireDefault(require(\"js-binary-schema-parser/lib/schemas/gif\"));\n\nvar _jsBinarySchemaParser = require(\"js-binary-schema-parser\");\n\nvar _uint = require(\"js-binary-schema-parser/lib/parsers/uint8\");\n\nvar _deinterlace = require(\"./deinterlace\");\n\nvar _lzw = require(\"./lzw\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar parseGIF = function parseGIF(arrayBuffer) {\n var byteData = new Uint8Array(arrayBuffer);\n return (0, _jsBinarySchemaParser.parse)((0, _uint.buildStream)(byteData), _gif[\"default\"]);\n};\n\nexports.parseGIF = parseGIF;\n\nvar generatePatch = function generatePatch(image) {\n var totalPixels = image.pixels.length;\n var patchData = new Uint8ClampedArray(totalPixels * 4);\n\n for (var i = 0; i < totalPixels; i++) {\n var pos = i * 4;\n var colorIndex = image.pixels[i];\n var color = image.colorTable[colorIndex] || [0, 0, 0];\n patchData[pos] = color[0];\n patchData[pos + 1] = color[1];\n patchData[pos + 2] = color[2];\n patchData[pos + 3] = colorIndex !== image.transparentIndex ? 255 : 0;\n }\n\n return patchData;\n};\n\nvar decompressFrame = function decompressFrame(frame, gct, buildImagePatch) {\n if (!frame.image) {\n console.warn('gif frame does not have associated image.');\n return;\n }\n\n var image = frame.image; // get the number of pixels\n\n var totalPixels = image.descriptor.width * image.descriptor.height; // do lzw decompression\n\n var pixels = (0, _lzw.lzw)(image.data.minCodeSize, image.data.blocks, totalPixels); // deal with interlacing if necessary\n\n if (image.descriptor.lct.interlaced) {\n pixels = (0, _deinterlace.deinterlace)(pixels, image.descriptor.width);\n }\n\n var resultImage = {\n pixels: pixels,\n dims: {\n top: frame.image.descriptor.top,\n left: frame.image.descriptor.left,\n width: frame.image.descriptor.width,\n height: frame.image.descriptor.height\n }\n }; // color table\n\n if (image.descriptor.lct && image.descriptor.lct.exists) {\n resultImage.colorTable = image.lct;\n } else {\n resultImage.colorTable = gct;\n } // add per frame relevant gce information\n\n\n if (frame.gce) {\n resultImage.delay = (frame.gce.delay || 10) * 10; // convert to ms\n\n resultImage.disposalType = frame.gce.extras.disposal; // transparency\n\n if (frame.gce.extras.transparentColorGiven) {\n resultImage.transparentIndex = frame.gce.transparentColorIndex;\n }\n } // create canvas usable imagedata if desired\n\n\n if (buildImagePatch) {\n resultImage.patch = generatePatch(resultImage);\n }\n\n return resultImage;\n};\n\nexports.decompressFrame = decompressFrame;\n\nvar decompressFrames = function decompressFrames(parsedGif, buildImagePatches) {\n return parsedGif.frames.filter(function (f) {\n return f.image;\n }).map(function (f) {\n return decompressFrame(f, parsedGif.gct, buildImagePatches);\n });\n};\n\nexports.decompressFrames = decompressFrames;","import { decompressFrames, parseGIF } from 'gifuct-js';\n\nexport async function getGifFirstFrame(gifUrl) {\n try {\n const response = await fetch(gifUrl);\n const buffer = await response.arrayBuffer();\n\n const gif = parseGIF(buffer);\n const frames = decompressFrames(gif, true);\n\n if (!frames?.length) return null;\n\n const { dims, patch } = frames[0];\n const { width, height } = dims;\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n const imageData = new ImageData(patch, width, height);\n ctx.putImageData(imageData, 0, 0);\n\n const blob = await new Promise((resolve) => {\n canvas.toBlob(resolve, 'image/png');\n });\n\n return URL.createObjectURL(blob);\n } catch (e) {\n return null;\n }\n}\n","export default function CustomEmoji({ staticUrl, alt, url }) {\n return (\n <picture>\n {staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n <img\n key={alt || url}\n src={url}\n alt={alt}\n class=\"shortcode-emoji emoji\"\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n onLoad={(e) => {\n try {\n e.target.dataset.isLarger =\n e.target.naturalWidth > e.target.width * 2 ||\n e.target.naturalHeight > e.target.height * 2;\n } catch (e) {}\n }}\n />\n </picture>\n );\n}\n","import PQueue from 'p-queue';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport { getGifFirstFrame } from '../utils/get-gif-first-frame';\nimport mem from '../utils/mem';\n\nimport CustomEmoji from './custom-emoji';\n\nconst fetchQueue = new PQueue({\n concurrency: 2,\n interval: 1000,\n intervalCap: 2,\n});\n\nconst throttledFetch = (signal, ...args) =>\n fetchQueue.add(() => fetch(...args), { signal });\n\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\n\nconst shortcodesRegexp = mem((shortcodes) => {\n return new RegExp(`:(${shortcodes.join('|')}):`, 'g');\n});\n\nconst resolvedEmojisCache = new Map();\nconst MAX_CACHE_SIZE = 30;\n\nconst resolveEmojis = async (resolverURL) => {\n if (resolvedEmojisCache.has(resolverURL)) {\n return resolvedEmojisCache.get(resolverURL);\n }\n\n try {\n const response = await throttledFetch(null, resolverURL, {\n headers: { accept: 'application/activity+json' },\n referrerPolicy: 'no-referrer',\n });\n\n const data = await response.json();\n const emojiTags = data.tag?.filter((t) => t.type === 'Emoji') || [];\n\n const emojis = emojiTags.length\n ? await Promise.all(\n emojiTags.map(async (t) => {\n const emoji = {\n shortcode: t.name.replace(/^:|:$/g, ''),\n url: t.icon.url,\n };\n if (t.icon?.mediaType === 'image/gif') {\n const staticUrl = await getGifFirstFrame(emoji.url);\n if (staticUrl) emoji.staticUrl = staticUrl;\n }\n return emoji;\n }),\n )\n : [];\n\n if (resolvedEmojisCache.size >= MAX_CACHE_SIZE) {\n const firstKey = resolvedEmojisCache.keys().next().value;\n resolvedEmojisCache.delete(firstKey);\n }\n\n resolvedEmojisCache.set(resolverURL, emojis);\n return emojis;\n } catch (error) {\n console.error('Failed to resolve emojis:', error);\n return [];\n }\n};\n\nconst renderEmojiText = mem((text, allEmojis, staticEmoji) => {\n if (!text) return '';\n if (!text.includes(':')) return text;\n if (!allEmojis.length) return text;\n\n const regex = shortcodesRegexp(allEmojis.map((e) => e.shortcode));\n const elements = text.split(regex).map((word, index) => {\n const emoji = allEmojis.find((e) => e.shortcode === word);\n\n if (emoji) {\n const { url, staticUrl } = emoji;\n return (\n <CustomEmoji\n key={`${word}-${index}`}\n staticUrl={staticEmoji ? undefined : staticUrl}\n url={staticEmoji ? staticUrl || url : url}\n alt={word}\n />\n );\n }\n\n return word;\n });\n\n return elements;\n});\n\nfunction EmojiText({ text, emojis = [], staticEmoji, resolverURL }) {\n const [resolvedEmojis, setResolvedEmojis] = useState(\n () => resolvedEmojisCache.get(resolverURL) || [],\n );\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!resolverURL || !text?.includes(':')) return;\n\n const matches = text.match(SHORTCODES_REGEX);\n if (!matches) return;\n\n const hasUnresolved = matches.some((match) => {\n const shortcode = match.slice(1, -1);\n return !emojis.some((e) => e.shortcode === shortcode);\n });\n if (!hasUnresolved) return;\n\n if (resolvedEmojisCache.has(resolverURL)) return;\n\n setLoading(true);\n\n (async () => {\n const emojis = await resolveEmojis(resolverURL);\n setResolvedEmojis(emojis);\n setLoading(false);\n })();\n }, [resolverURL, text, emojis?.length]);\n\n if (!text) return '';\n if (!text.includes(':')) return text;\n\n if (resolverURL && loading) {\n return text.replace(SHORTCODES_REGEX, '');\n }\n\n const allEmojis = [\n ...resolvedEmojis.filter(\n (resolved) =>\n !emojis.some((emoji) => emoji.shortcode === resolved.shortcode),\n ),\n ...emojis,\n ];\n\n return renderEmojiText(text, allEmojis, staticEmoji);\n}\n\nexport default EmojiText;\n","import getDomain from '../utils/get-domain';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nfunction RolesTags({ roles, accountId, accountUrl, hideSelf = false }) {\n if (!roles?.length) return null;\n\n const isSelf = accountId && accountId === getCurrentAccountID();\n if (!accountId && hideSelf) {\n console.warn('accountId is required if hideSelf is true');\n }\n if (hideSelf && isSelf) return null;\n\n const parsedAccountInstance = getDomain(accountUrl);\n\n return roles?.map((role) => (\n <>\n {' '}\n <span class=\"tag collapsed tag-role\">\n {role.name}\n {!!parsedAccountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">{parsedAccountInstance}</span>\n </>\n )}\n </span>\n </>\n ));\n}\n\nexport default RolesTags;\n","import './name-text.css';\n\nimport { useLingui } from '@lingui/react';\n\nimport { api } from '../utils/api';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport RolesTags from './roles-tags';\n\nconst nameCollator = mem((locale) => {\n const options = {\n sensitivity: 'base',\n };\n try {\n return new Intl.Collator(locale || undefined, options);\n } catch (e) {\n return new Intl.Collator(undefined, options);\n }\n});\n\nconst ACCT_REGEX = /([^@]+)(@.+)/i;\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\nconst SPACES_REGEX = /\\s+/g;\nconst NON_ALPHA_NUMERIC_REGEX = /[^a-z0-9@\\.]/gi;\n\nfunction NameText({\n account,\n instance,\n showAvatar,\n showAcct,\n short,\n external,\n onClick,\n}) {\n const { i18n } = useLingui();\n if (!account) return null;\n const {\n acct,\n avatar,\n avatarStatic,\n id,\n url,\n displayName,\n emojis,\n bot,\n username,\n roles,\n } = account;\n const [_, acct1, acct2] = acct.match(ACCT_REGEX) || [, acct];\n\n if (!instance) instance = api().instance;\n\n const trimmedUsername = username.toLowerCase().trim();\n const trimmedDisplayName = (displayName || '').toLowerCase().trim();\n const shortenedDisplayName = trimmedDisplayName\n .replace(SHORTCODES_REGEX, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1\n .replace(SPACES_REGEX, ''); // E.g. \"My name\" === \"myname\"\n const shortenedAlphaNumericDisplayName = shortenedDisplayName.replace(\n NON_ALPHA_NUMERIC_REGEX,\n '',\n ); // Remove non-alphanumeric characters\n\n const hideUsername =\n (!short &&\n (trimmedUsername === trimmedDisplayName ||\n trimmedUsername === shortenedDisplayName ||\n trimmedUsername === shortenedAlphaNumericDisplayName ||\n nameCollator(i18n.locale).compare(\n trimmedUsername,\n shortenedDisplayName,\n ) === 0)) ||\n shortenedAlphaNumericDisplayName === acct.toLowerCase();\n\n return (\n <a\n class={`name-text ${showAcct ? 'show-acct' : ''} ${short ? 'short' : ''}`}\n href={url}\n target={external ? '_blank' : null}\n title={\n displayName\n ? `${displayName} (${acct2 ? '' : '@'}${acct})`\n : `${acct2 ? '' : '@'}${acct}`\n }\n onClick={(e) => {\n if (external) return;\n if (e.shiftKey) return; // Save link? 🤷‍♂️\n e.preventDefault();\n e.stopPropagation();\n if (onClick) return onClick(e);\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.which === 2) {\n const internalURL = `#/${instance}/a/${id}`;\n window.open(internalURL, '_blank');\n return;\n }\n states.showAccount = {\n account,\n instance,\n };\n }}\n >\n {showAvatar && (\n <>\n <Avatar url={avatarStatic || avatar} squircle={bot} />{' '}\n </>\n )}\n {displayName && !short ? (\n <>\n <b dir=\"auto\">\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={account.url}\n staticEmoji\n />\n </b>\n {!showAcct && !hideUsername && (\n <>\n {' '}\n <i class=\"bidi-isolate\">@{username}</i>\n <RolesTags\n roles={roles}\n accountId={id}\n accountUrl={url}\n hideSelf\n />\n </>\n )}\n </>\n ) : short ? (\n <i>{username}</i>\n ) : (\n <b>{username}</b>\n )}\n {showAcct && (\n <>\n <br />\n <i class=\"bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n {!!acct2 && <span class=\"ib\">{acct2}</span>}\n </i>\n <RolesTags roles={roles} accountUrl={url} />\n </>\n )}\n </a>\n );\n}\n\nexport default NameText;\n","import{useRef as r,useMemo as n,useEffect as t,useState as e,useCallback as u}from\"react\";function c(e,u,c,i){var l=this,a=r(null),o=r(0),f=r(0),v=r(null),d=r([]),s=r(),m=r(),h=r(e),g=r(!0),x=r(),E=r();h.current=e;var b=\"undefined\"!=typeof window,p=!u&&0!==u&&b;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var y=!!(c=c||{}).leading,w=!(\"trailing\"in c)||!!c.trailing,T=!!c.flushOnExit&&w,O=\"maxWait\"in c,F=\"debounceOnServer\"in c&&!!c.debounceOnServer,L=O?Math.max(+c.maxWait||0,u):null,A=n(function(){var r=function(r){var n=d.current,t=s.current;return d.current=s.current=null,o.current=r,f.current=f.current||r,m.current=h.current.apply(t,n)},n=function(r,n){p&&cancelAnimationFrame(v.current),v.current=p?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||O&&r-o.current>=L},e=function(n){return v.current=null,w&&d.current?r(n):(d.current=s.current=null,m.current)},c=function r(){var c=Date.now();if(y&&f.current===o.current&&A(),t(c))return e(c);if(g.current){var i=u-(c-a.current),l=O?Math.min(i,L-(c-o.current)):i;n(r,l)}},A=function(){i&&i({})},D=function(){if(b||F){var e,i=Date.now(),f=t(i);if(d.current=[].slice.call(arguments),s.current=l,a.current=i,T&&!x.current&&(x.current=function(){var r;\"hidden\"===(null==(r=globalThis.document)?void 0:r.visibilityState)&&E.current.flush()},null==(e=globalThis.document)||null==e.addEventListener||e.addEventListener(\"visibilitychange\",x.current)),f){if(!v.current&&g.current)return o.current=a.current,n(c,u),y?r(a.current):m.current;if(O)return n(c,u),r(a.current)}return v.current||n(c,u),m.current}};return D.cancel=function(){var r=v.current;r&&(p?cancelAnimationFrame(v.current):clearTimeout(v.current)),o.current=0,d.current=a.current=s.current=v.current=null,r&&i&&i({})},D.isPending=function(){return!!v.current},D.flush=function(){return v.current?e(Date.now()):m.current},D},[y,O,u,L,w,T,p,b,F,i]);return E.current=A,t(function(){return g.current=!0,function(){var r;T&&E.current.flush(),x.current&&(null==(r=globalThis.document)||null==r.removeEventListener||r.removeEventListener(\"visibilitychange\",x.current),x.current=null),g.current=!1}},[T]),A}function i(r,n){return r===n}function l(n,t,l){var a=l&&l.equalityFn||i,o=r(n),f=e({})[1],v=c(u(function(r){o.current=r,f({})},[f]),t,l,f),d=r(n);return a(d.current,n)||(v(n),d.current=n),[o.current,v]}function a(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing,l=e.flushOnExit;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i,flushOnExit:void 0!==l&&l})}export{l as useDebounce,c as useDebouncedCallback,a as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { i18n } from '@lingui/core';\n\nimport translangLanguagesNative from '../data/translang-languages-native';\n\nimport mem from './mem';\n\n// Some codes are not supported by Intl.DisplayNames\n// These are mapped to other codes as fallback\nconst codeMappings = {\n 'zh-YUE': 'YUE',\n zh_HANT: 'zh-Hant',\n mnMong: 'mn-Mong',\n};\n\nconst IntlDN = mem(\n (locale) =>\n new Intl.DisplayNames(locale || undefined, {\n type: 'language',\n }),\n);\n\nfunction notSameIncaseSensitive(s1, s2) {\n if (!s1 || !s2) return s1 !== s2;\n return s1.toLowerCase() !== s2.toLowerCase();\n}\n\nfunction _localeCode2Text(code) {\n let locale;\n let fallback;\n if (typeof code === 'object') {\n ({ code, locale, fallback } = code);\n }\n try {\n const text = IntlDN(locale || i18n.locale).of(code);\n if (notSameIncaseSensitive(text, code)) return text;\n if (!fallback) {\n const anotherText = IntlDN(code).of(code);\n if (notSameIncaseSensitive(anotherText, code)) return anotherText;\n const yetAnotherText = translangLanguagesNative?.[locale];\n if (notSameIncaseSensitive(yetAnotherText, code)) return yetAnotherText;\n }\n return fallback || '';\n } catch (e) {\n if (codeMappings[code]) {\n try {\n const text = IntlDN(codeMappings[locale] || locale || i18n.locale).of(\n codeMappings[code],\n );\n if (notSameIncaseSensitive(text, codeMappings[code])) return text;\n return fallback || '';\n } catch (e2) {\n console.warn(code, e2);\n }\n }\n return fallback || '';\n }\n}\n\nexport default mem(_localeCode2Text);\n","import languages from '../data/translang-languages';\n\nimport { getDtfLocale } from './dtf-locale';\nimport localeMatch from './locale-match';\nimport states from './states';\n\nconst translationTargetLanguages = Object.entries(languages.tl).map(\n ([code, { name }]) => ({\n code,\n name,\n }),\n);\n\nconst locales = [...navigator.languages];\nconst dtfLocale = getDtfLocale();\nif (dtfLocale && !locales.includes(dtfLocale)) {\n locales.unshift(dtfLocale);\n}\n\nconst localeTargetLanguages = () =>\n localeMatch(\n locales,\n translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match`\n 'en',\n );\n\nfunction getTranslateTargetLanguage(fromSettings = false) {\n if (fromSettings) {\n const { contentTranslationTargetLanguage } = states.settings;\n if (contentTranslationTargetLanguage) {\n return contentTranslationTargetLanguage;\n }\n }\n return localeTargetLanguages();\n}\n\nexport default getTranslateTargetLanguage;\n","import mem from './mem';\n\nconst NF = mem((locale, options) => {\n try {\n return new Intl.NumberFormat(locale || undefined, options);\n } catch (e) {\n return new Intl.NumberFormat(undefined, options);\n }\n});\n\nexport default NF;\n","import { i18n } from '@lingui/core';\n\nimport NF from './nf';\n\n// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers\nconst BYTES_UNITS = [\n 'byte',\n 'kilobyte',\n 'megabyte',\n 'gigabyte',\n 'terabyte',\n 'petabyte',\n];\nexport default function prettyBytes(bytes) {\n const unitIndex = Math.min(\n Math.floor(Math.log2(bytes) / 10),\n BYTES_UNITS.length - 1,\n );\n const value = bytes / 1024 ** unitIndex;\n return NF(i18n.locale, {\n style: 'unit',\n unit: BYTES_UNITS[unitIndex],\n unitDisplay: 'narrow',\n maximumFractionDigits: 0,\n }).format(value);\n}\n","import { getAPIVersions } from './store-utils';\n\nexport function supportsNativeQuote() {\n return getAPIVersions()?.mastodon >= 7;\n}\n\nexport function getPostQuoteApprovalPolicy(quoteApproval) {\n return quoteApproval?.[quoteApproval?.currentUser]?.[0] || 'nobody';\n}\n","const ESCAPE_REGEX = /[.*+?^${}()|[\\]\\\\]/g;\nconst HTML_ESCAPE_MAP = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;',\n};\nconst HTML_ESCAPE_REGEX = /[&\"<>]/g;\n\nfunction escapeRegex(str) {\n return str.replace(ESCAPE_REGEX, '\\\\$&');\n}\n\nfunction escapeHTML(str) {\n return str.replace(HTML_ESCAPE_REGEX, (char) => HTML_ESCAPE_MAP[char]);\n}\n\nfunction emojifyText(text, emojis = []) {\n if (!text) return '';\n if (!emojis.length) return text;\n if (!text.includes(':')) return text;\n\n // Deduplicate emojis by shortcode and filter out invalid entries\n const emojiMap = new Map();\n for (let i = 0; i < emojis.length; i++) {\n const emoji = emojis[i];\n if (emoji?.shortcode && emoji?.url) {\n emojiMap.set(emoji.shortcode, emoji);\n }\n }\n\n if (emojiMap.size === 0) return text;\n\n const shortcodes = Array.from(emojiMap.keys());\n const pattern = shortcodes.map((sc) => `:${escapeRegex(sc)}:`).join('|');\n const regex = new RegExp(pattern, 'g');\n\n return text.replace(regex, (match) => {\n const shortcode = match.slice(1, -1);\n const emoji = emojiMap.get(shortcode);\n\n if (!emoji) return match;\n\n const { staticUrl, url } = emoji;\n const escapedShortcode = escapeHTML(match);\n\n const sourceTag = staticUrl\n ? `<source srcset=\"${staticUrl}\" media=\"(prefers-reduced-motion: reduce)\"></source>`\n : '';\n\n return `<picture>${sourceTag}<img class=\"shortcode-emoji emoji\" src=\"${url}\" alt=\"${escapedShortcode}\" title=\"${shortcode}\" width=\"16\" height=\"16\" loading=\"lazy\" decoding=\"async\" fetchPriority=\"low\" onload=\"try { this.dataset.isLarger = this.naturalWidth > (this.width * 2) || this.naturalHeight > (this.height * 2) } catch (e) {}\" /></picture>`;\n });\n}\n\nexport default emojifyText;\n","const HTML_CHARS_REGEX = /[&<>\"']/g;\nconst HTML_ENTITIES = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&apos;',\n};\n\nexport default function escapeHTML(text) {\n return text.replace(HTML_CHARS_REGEX, (c) => HTML_ENTITIES[c]);\n}\n","import emojifyText from './emojify-text';\nimport escapeHTML from './escape-html';\nimport mem from './mem';\n\nconst fauxDiv = document.createElement('div');\nconst whitelistLinkClasses = ['u-url', 'mention', 'hashtag'];\n\nconst LINK_REGEX = /<a/i;\nconst HTTP_LINK_REGEX = /^https?:\\/\\//i;\nconst MENTION_REGEX = /^[@@][^@@]+(@[^@@]+)?$/;\nconst HASHTAG_REGEX = /^[##][^##]+$/;\nconst HASH_EMOJI_REGEX = /^#️⃣/;\nconst CODE_BLOCK_REGEX = /^```[^]+```$/;\nconst CODE_BLOCK_START_REGEX = /^```/;\nconst CODE_BLOCK_END_REGEX = /```$/;\nconst INLINE_CODE_REGEX = /`[^`]+`/;\nconst TWITTER_DOMAIN_REGEX = /(twitter|x)\\.com/i;\nconst TWITTER_MENTION_REGEX = /@[a-zA-Z0-9_]+@(twitter|x)\\.com/;\nconst TWITTER_MENTION_CAPTURE_REGEX = /(@([a-zA-Z0-9_]+)@(twitter|x)\\.com)/g;\nconst CODE_INLINE_CAPTURE_REGEX = /(`[^]+?`)/g;\n\nfunction createDOM(html, isDocumentFragment) {\n if (isDocumentFragment) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n } else {\n const tpl = document.createElement('div');\n tpl.innerHTML = html;\n return tpl;\n }\n}\n\nfunction _enhanceContent(content, opts = {}) {\n if (!content) return '';\n const { emojis, returnDOM, postEnhanceDOM = () => {} } = opts;\n let enhancedContent = content;\n // const dom = document.createElement('div');\n // dom.innerHTML = enhancedContent;\n const dom = createDOM(enhancedContent, returnDOM);\n const hasLink = LINK_REGEX.test(enhancedContent);\n const hasCodeBlock = enhancedContent.includes('```');\n\n if (hasLink) {\n // Add target=\"_blank\" to all links with no target=\"_blank\"\n // E.g. `note` in `account`\n const noTargetBlankLinks = dom.querySelectorAll('a:not([target=\"_blank\"])');\n for (const link of noTargetBlankLinks) {\n link.setAttribute('target', '_blank');\n }\n\n // Remove all classes except `u-url`, `mention`, `hashtag`\n const links = dom.querySelectorAll('a[class]');\n for (const link of links) {\n for (const c of link.classList) {\n if (!whitelistLinkClasses.includes(c)) {\n link.classList.remove(c);\n }\n }\n }\n }\n\n // Add 'has-url-text' to all links that contains a url\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n for (const link of links) {\n if (HTTP_LINK_REGEX.test(link.textContent.trim())) {\n link.classList.add('has-url-text');\n shortenLink(link);\n }\n }\n }\n\n // Spanify un-spanned mentions\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n const usernames = [];\n for (const link of links) {\n const text = link.innerText.trim();\n const hasChildren = link.querySelector('*');\n // If text looks like @username@domain, then it's a mention\n if (MENTION_REGEX.test(text)) {\n // Only show @username\n const atSymbol = text[0]; // Preserve the original @ or @\n const [_, username, domain] = text.split(/[@@]/);\n if (!hasChildren) {\n if (\n !usernames.some(([u]) => u === username) ||\n usernames.some(([u, d]) => u === username && d === domain)\n ) {\n link.innerHTML = `${atSymbol}<span>${username}</span>`;\n usernames.push([username, domain]);\n } else {\n link.innerHTML = `${atSymbol}<span>${username}@${domain}</span>`;\n }\n }\n link.classList.add('mention');\n }\n // If text looks like #hashtag, then it's a hashtag\n if (HASHTAG_REGEX.test(text)) {\n const hashSymbol = text[0]; // Preserve the original # or #\n if (!hasChildren) {\n link.innerHTML = `${hashSymbol}<span>${text.slice(1)}</span>`;\n } else {\n // Special case for #️⃣\n if (HASH_EMOJI_REGEX.test(text)) {\n // <span> contains half-char of #️⃣\n const actualText = text.replace(HASH_EMOJI_REGEX, '');\n link.innerHTML = `#️⃣<span>${actualText}</span>`;\n }\n }\n link.classList.add('mention', 'hashtag');\n }\n }\n }\n\n // EMOJIS\n // ======\n // Convert :shortcode: to <img />\n let textNodes;\n if (enhancedContent.includes(':') && emojis?.length) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n html = emojifyText(html, emojis);\n fauxDiv.innerHTML = html;\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // CODE BLOCKS\n // ===========\n // Convert ```code``` to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const blocks = [...dom.querySelectorAll('p')].filter((p) =>\n CODE_BLOCK_REGEX.test(p.innerText.trim()),\n );\n for (const block of blocks) {\n const pre = document.createElement('pre');\n // Replace <br /> with newlines\n for (const br of block.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n pre.innerHTML = `<code>${block.innerHTML.trim()}</code>`;\n block.replaceWith(pre);\n }\n }\n\n // Convert multi-paragraph code blocks to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const paragraphs = [...dom.querySelectorAll('p')];\n // Filter out paragraphs with ``` in beginning only\n const codeBlocks = paragraphs.filter((p) =>\n CODE_BLOCK_START_REGEX.test(p.innerText),\n );\n // For each codeBlocks, get all paragraphs until the last paragraph with ``` at the end only\n for (const block of codeBlocks) {\n const nextParagraphs = [block];\n let hasCodeBlock = false;\n let currentBlock = block;\n while (currentBlock.nextElementSibling) {\n const next = currentBlock.nextElementSibling;\n if (next && next.tagName === 'P') {\n if (CODE_BLOCK_END_REGEX.test(next.innerText)) {\n nextParagraphs.push(next);\n hasCodeBlock = true;\n break;\n } else {\n nextParagraphs.push(next);\n }\n } else {\n break;\n }\n currentBlock = next;\n }\n if (hasCodeBlock) {\n const pre = document.createElement('pre');\n for (const p of nextParagraphs) {\n // Replace <br /> with newlines\n for (const br of p.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n }\n const codeText = nextParagraphs.map((p) => p.innerHTML).join('\\n\\n');\n pre.innerHTML = `<code tabindex=\"0\">${codeText}</code>`;\n block.replaceWith(pre);\n for (const p of nextParagraphs) {\n p.remove();\n }\n }\n }\n }\n\n // INLINE CODE\n // ===========\n // Convert `code` to <code>code</code>\n if (enhancedContent.includes('`')) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (INLINE_CODE_REGEX.test(html)) {\n html = html.replaceAll(CODE_INLINE_CAPTURE_REGEX, '<code>$1</code>');\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // TWITTER USERNAMES\n // =================\n // Convert @username@twitter.com to <a href=\"https://twitter.com/username\">@username@twitter.com</a>\n if (TWITTER_DOMAIN_REGEX.test(enhancedContent)) {\n textNodes = extractTextNodes(dom, {\n rejectFilter: ['A'],\n });\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (TWITTER_MENTION_REGEX.test(html)) {\n html = html.replaceAll(\n TWITTER_MENTION_CAPTURE_REGEX,\n '<a href=\"https://twitter.com/$2\" rel=\"nofollow noopener\" target=\"_blank\">$1</a>',\n );\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // HASHTAG STUFFING\n // ================\n // Get the <p> that contains a lot of hashtags, add a class to it\n if (enhancedContent.includes('#') || enhancedContent.includes('#')) {\n let prevIndex = null;\n const hashtagStuffedParagraphs = [...dom.querySelectorAll('p')].filter(\n (p, index) => {\n let hashtagCount = 0;\n for (let i = 0; i < p.childNodes.length; i++) {\n const node = p.childNodes[i];\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent.trim();\n if (text !== '') {\n return false;\n }\n } else if (node.tagName === 'BR') {\n // Ignore <br />\n } else if (node.tagName === 'A') {\n const linkText = node.textContent.trim();\n if (\n !linkText ||\n !(linkText.startsWith('#') || linkText.startsWith('#'))\n ) {\n return false;\n } else {\n hashtagCount++;\n }\n } else {\n return false;\n }\n }\n // Only consider \"stuffing\" if:\n // - there are more than 3 hashtags\n // - there are more than 1 hashtag in adjacent paragraphs\n if (hashtagCount > 3) {\n prevIndex = index;\n return true;\n }\n if (hashtagCount > 1 && prevIndex && index === prevIndex + 1) {\n prevIndex = index;\n return true;\n }\n },\n );\n if (hashtagStuffedParagraphs?.length) {\n for (const p of hashtagStuffedParagraphs) {\n p.classList.add('hashtag-stuffing');\n p.title = p.innerText;\n }\n }\n }\n\n // ADD ASPECT RATIO TO ALL IMAGES\n if (enhancedContent.includes('<img')) {\n const imgs = dom.querySelectorAll('img');\n for (let i = 0; i < imgs.length; i++) {\n const img = imgs[i];\n const width = img.getAttribute('width') || img.naturalWidth;\n const height = img.getAttribute('height') || img.naturalHeight;\n if (width && height) {\n img.style.setProperty('--original-aspect-ratio', `${width}/${height}`);\n }\n }\n }\n\n // FIX CLOAK MODE FOR SAFARI\n // Workaround for Safari so that `text-decoration-thickness` works\n // Wrap child text nodes in spans\n for (const node of dom.childNodes) {\n if (node.nodeType === Node.TEXT_NODE && node.textContent.trim?.()) {\n const span = document.createElement('span');\n span.textContent = node.textContent;\n dom.replaceChild(span, node);\n }\n }\n\n if (postEnhanceDOM) {\n queueMicrotask(() => postEnhanceDOM(dom));\n // postEnhanceDOM(dom); // mutate dom\n }\n\n return returnDOM ? dom : dom.innerHTML;\n}\nconst enhanceContent = mem(_enhanceContent);\n\nconst defaultRejectFilter = [\n // Document metadata\n 'STYLE',\n // Image and multimedia\n 'IMG',\n 'VIDEO',\n 'AUDIO',\n 'AREA',\n 'MAP',\n 'TRACK',\n // Embedded content\n 'EMBED',\n 'IFRAME',\n 'OBJECT',\n 'PICTURE',\n 'PORTAL',\n 'SOURCE',\n // SVG and MathML\n 'SVG',\n 'MATH',\n // Scripting\n 'CANVAS',\n 'NOSCRIPT',\n 'SCRIPT',\n // Forms\n 'INPUT',\n 'OPTION',\n 'TEXTAREA',\n // Web Components\n 'SLOT',\n 'TEMPLATE',\n];\nconst defaultRejectFilterMap = Object.fromEntries(\n defaultRejectFilter.map((nodeName) => [nodeName, true]),\n);\n\nconst URL_PREFIX_REGEX = /^(https?:\\/\\/(www\\.)?|xmpp:)/;\nconst URL_DISPLAY_LENGTH = 30;\n// Similar to https://github.com/mastodon/mastodon/blob/1666b1955992e16f4605b414c6563ca25b3a3f18/app/lib/text_formatter.rb#L54-L69\nfunction shortenLink(link) {\n if (!link || link.querySelector?.('*')) {\n return;\n }\n try {\n const url = link.innerText.trim();\n const prefix = (url.match(URL_PREFIX_REGEX) || [])[0] || '';\n if (!prefix) return;\n const displayURL = url.slice(\n prefix.length,\n prefix.length + URL_DISPLAY_LENGTH,\n );\n const suffix = url.slice(prefix.length + URL_DISPLAY_LENGTH);\n const cutoff = url.slice(prefix.length).length > URL_DISPLAY_LENGTH;\n link.innerHTML = `<span class=\"invisible\">${prefix}</span><span class=${\n cutoff ? 'ellipsis' : ''\n }>${displayURL}</span><span class=\"invisible\">${suffix}</span>`;\n } catch (e) {}\n}\n\nfunction extractTextNodes(dom, opts = {}) {\n const textNodes = [];\n const rejectFilterMap = Object.assign(\n {},\n defaultRejectFilterMap,\n opts.rejectFilter?.reduce((acc, cur) => {\n acc[cur] = true;\n return acc;\n }, {}),\n );\n const walk = document.createTreeWalker(\n dom,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode(node) {\n if (rejectFilterMap[node.parentNode.nodeName]) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n },\n false,\n );\n let node;\n while ((node = walk.nextNode())) {\n textNodes.push(node);\n }\n return textNodes;\n}\n\nexport default enhanceContent;\n","import { api } from './api';\nimport pmem from './pmem';\n\nconst FAMILIAR_FOLLOWERS_MAX_AGE = 1000 * 60 * 10; // 10 mins\n\nfunction fetchFamiliarFollowers(currentID) {\n const { masto } = api();\n return masto.v1.accounts.familiarFollowers.fetch({\n id: [currentID],\n });\n}\n\nexport const memFetchFamiliarFollowers = pmem(fetchFamiliarFollowers, {\n expires: FAMILIAR_FOLLOWERS_MAX_AGE,\n});\n","function normalizeURL(url) {\n const parsed = URL.parse(url);\n if (!parsed) return url;\n const origin = parsed.origin;\n const pathname = parsed.pathname.replace(/\\/$/, '') || '/';\n parsed.searchParams.sort();\n return origin + pathname + parsed.search;\n}\n\nexport default function isSameURL(a, b) {\n if (!a || !b) return false;\n if (a === b) return true;\n return normalizeURL(a) === normalizeURL(b);\n}\n","import isSameURL from './is-same-url';\nimport states from './states';\n\nconst supportsHover = window.matchMedia('(hover: hover)').matches;\n\nfunction handleContentLinks(opts) {\n const {\n mentions = [],\n instance,\n previewMode,\n statusURL,\n taggedCollections = [],\n } = opts || {};\n return (e) => {\n // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n return;\n }\n\n let { target } = e;\n\n // Experiment opening custom emoji in a modal\n // TODO: Rename this function because it's not just for links\n if (target.closest('.shortcode-emoji')) {\n const { naturalWidth, naturalHeight, width, height } = target;\n const kindaLargeRatio = 2;\n const kindaLarge =\n naturalWidth > width * kindaLargeRatio ||\n naturalHeight > height * kindaLargeRatio;\n if (kindaLarge) {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: target.src,\n description: target.title || target.alt,\n },\n ],\n };\n return;\n }\n }\n\n target = target.closest('a');\n if (!target) return;\n // Only handle links inside, not itself or anything outside\n if (!e.currentTarget.contains(target)) return;\n\n const { href } = target;\n\n const prevText = target.previousSibling?.textContent;\n const textBeforeLinkIsAt =\n prevText?.endsWith('@') || prevText?.endsWith('@');\n const textStartsWithAt =\n target.innerText.startsWith('@') || target.innerText.startsWith('@');\n if (\n ((target.classList.contains('u-url') ||\n target.classList.contains('mention')) &&\n textStartsWithAt) ||\n (textBeforeLinkIsAt && !textStartsWithAt)\n ) {\n const targetText = (\n target.querySelector('span') || target\n ).innerText.trim();\n const username = targetText.replace(/^[@@]/, '');\n // Only fallback to acct/username check if url doesn't match\n const mention =\n mentions.find((mention) => mention.url === href) ||\n mentions.find(\n (mention) =>\n mention.acct === username || mention.username === username,\n );\n console.warn('MENTION', mention, href);\n if (mention) {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: mention.acct,\n instance,\n };\n return;\n } else if (!/^http/i.test(targetText)) {\n console.log('mention not found', targetText);\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: href,\n instance,\n };\n return;\n }\n } else if (!previewMode) {\n const textBeforeLinkIsHash =\n prevText?.endsWith('#') || prevText?.endsWith('#');\n if (target.classList.contains('hashtag') || textBeforeLinkIsHash) {\n e.preventDefault();\n e.stopPropagation();\n const tag = target.innerText.replace(/^[##]/, '').trim();\n const hashURL = instance ? `#/${instance}/t/${tag}` : `#/t/${tag}`;\n console.log({ hashURL });\n location.hash = hashURL;\n return;\n }\n\n const matchedCollection = taggedCollections.find((c) =>\n isSameURL(c.url, href),\n );\n if (matchedCollection?.id) {\n e.preventDefault();\n e.stopPropagation();\n location.hash = `#/${instance ? `${instance}/` : ''}c/${matchedCollection.id}`;\n return;\n }\n\n if (states.unfurledLinks[href]?.url && statusURL !== href) {\n // If unfurled AND not self-referential\n e.preventDefault();\n e.stopPropagation();\n states.prevLocation = {\n pathname: location.hash.replace(/^#/, ''),\n };\n location.hash = `#${states.unfurledLinks[href].url}`;\n return;\n }\n }\n\n try {\n const urlObj = URL.parse(href);\n const domain = urlObj.hostname.replace(/^www\\./i, '');\n const containsDomain = target.innerText\n .toLowerCase()\n .includes(domain.toLowerCase());\n // Only show this on non-hover devices (touch-only)\n // Assuming that hover-supported = there's a statusbar to see the URL\n // Non-hover devices don't have statusbar, so we show this\n if (!containsDomain && !supportsHover) {\n e.preventDefault();\n e.stopPropagation();\n const linkText = target.innerText.trim();\n states.showOpenLink = {\n url: href,\n linkText,\n };\n }\n } catch (e) {}\n };\n}\n\nexport default handleContentLinks;\n","import { i18n } from '@lingui/core';\n\nimport NF from './nf';\n\nexport default function shortenNumber(num) {\n try {\n return NF(i18n.locale, {\n notation: 'compact',\n roundingMode: 'floor',\n }).format(num);\n } catch (e) {\n return num;\n }\n}\n","import { satisfies } from 'compare-versions';\n\nimport features from '../data/features.json';\n\nimport { getCurrentInstance, getCurrentNodeInfo } from './store-utils';\n\n// Non-semver(?) UA string detection\nconst containPixelfed = /pixelfed/i;\nconst notContainPixelfed = /^(?!.*pixelfed).*$/i;\nconst containPleroma = /pleroma/i;\nconst containAkkoma = /akkoma/i;\nconst containGTS = /gotosocial/i;\nconst platformFeatures = {\n '@mastodon/lists': notContainPixelfed,\n '@mastodon/filters': notContainPixelfed,\n '@mastodon/mentions': notContainPixelfed,\n '@mastodon/trending-hashtags': notContainPixelfed,\n '@mastodon/trending-links': notContainPixelfed,\n '@mastodon/post-bookmark': notContainPixelfed,\n '@mastodon/post-edit': notContainPixelfed,\n '@mastodon/profile-edit': notContainPixelfed,\n '@mastodon/profile-private-note': notContainPixelfed,\n '@mastodon/pinned-posts': notContainPixelfed,\n '@pixelfed/trending': containPixelfed,\n '@pixelfed/home-include-reblogs': containPixelfed,\n '@pixelfed/global-feed': containPixelfed,\n '@pleroma/local-visibility-post': containPleroma,\n '@akkoma/local-visibility-post': containAkkoma,\n};\n\nconst supportsCache = {};\n\nconst semverExtract = /^\\d+\\.\\d+(\\.\\d+)?/;\nconst atSoftwareSlashMatch = /^@([a-z]+)\\//i;\n\nfunction supports(feature) {\n try {\n let { version, domain } = getCurrentInstance();\n let softwareName = getCurrentNodeInfo()?.software?.name || 'mastodon';\n\n if (softwareName === 'hometown') {\n // Hometown is a Mastodon fork and inherits its features\n softwareName = 'mastodon';\n }\n\n const key = `${domain}-${feature}`;\n if (supportsCache[key]) return supportsCache[key];\n\n if (platformFeatures[feature]) {\n return (supportsCache[key] = platformFeatures[feature].test(version));\n }\n\n const featureMatch = feature.match(atSoftwareSlashMatch);\n if (!featureMatch) {\n // Only software match, e.g. supports('@mastodon')\n const software = feature.replace(/^@/, '');\n return (supportsCache[key] = softwareName === software);\n }\n\n const range = features[feature];\n if (!range) return false;\n\n // '@mastodon/blah' => 'mastodon'\n const featureSoftware = featureMatch[1];\n\n const doesSoftwareMatch = featureSoftware === softwareName.toLowerCase();\n let satisfiesRange = satisfies(version, range, {\n includePrerelease: true,\n loose: true,\n });\n if (!satisfiesRange) {\n try {\n // E.g. \"4.2.1 (compatible; Iceshrimp 2023.12.14-dev-046d237af)\" is invalid semver 😅\n // This regex extracts numbers with dots out and tries again\n // Hopefully this doesn't break anything\n satisfiesRange = satisfies(version.match(semverExtract)?.[0], range, {\n includePrerelease: true,\n loose: false,\n });\n } catch (e) {\n // Ignore\n }\n }\n return (supportsCache[key] = doesSoftwareMatch && satisfiesRange);\n } catch (e) {\n return false;\n }\n}\n\nexport default supports;\n","import './account-block.css';\n\nimport { ph } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\n\n// import { useNavigate } from 'react-router-dom';\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport { memFetchFamiliarFollowers } from '../utils/familiar-followers';\nimport getDomain from '../utils/get-domain';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RolesTags from './roles-tags';\n\nfunction AccountBlock(props) {\n const {\n skeleton,\n account,\n avatarSize = 'xl',\n avatarDescription,\n useAvatarStatic = false,\n instance,\n external,\n internal,\n onClick,\n showActivity = false,\n showStats = false,\n accountInstance,\n hideDisplayName = false,\n excludeRelationshipAttrs = [],\n } = props;\n const relationship = props.relationship;\n // FOR DEBUGGING\n // const relationship = {\n // id: 'fake',\n // following: false,\n // followedBy: false,\n // requested: false,\n // };\n const hasRelationshipProp = 'relationship' in props;\n\n const { t } = useLingui();\n const { instance: currentInstance } = api();\n const currentAccountID = getCurrentAccountID();\n const [familiarFollowers, setFamiliarFollowers] = useState([]);\n if (skeleton) {\n return (\n <div class=\"account-block skeleton\">\n <Avatar size={avatarSize} />\n <span>\n <b>████████</b>\n <br />\n <span class=\"account-block-acct\">██████</span>\n </span>\n </div>\n );\n }\n\n if (!account) {\n return null;\n }\n\n // const navigate = useNavigate();\n\n const {\n id,\n acct,\n avatar,\n avatarStatic,\n displayName,\n username,\n emojis,\n url,\n statusesCount,\n lastStatusAt,\n bot,\n fields,\n note,\n group,\n followersCount,\n createdAt,\n locked,\n roles,\n } = account;\n let [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct];\n if (accountInstance) {\n acct2 = `@${accountInstance}`;\n }\n\n const verifiedField = fields?.find((f) => !!f.verifiedAt && !!f.value);\n\n const relationshipObj = relationship || {};\n const excludedRelationship = {};\n for (const r in relationshipObj) {\n if (!excludeRelationshipAttrs.includes(r)) {\n excludedRelationship[r] = relationshipObj[r];\n }\n }\n const hasRelationship =\n excludedRelationship.following ||\n excludedRelationship.followedBy ||\n excludedRelationship.requested;\n\n const accountDomain = getDomain(url);\n const sameCurrentInstance = (instance || accountDomain) === currentInstance;\n useEffect(() => {\n if (!showStats || !id || !currentAccountID || id === currentAccountID)\n return;\n if (!sameCurrentInstance) return;\n if (hasRelationshipProp && !relationship) return;\n const rel = relationship || {};\n if (rel.following || rel.followedBy || rel.requested) return;\n let aborted = false;\n (async () => {\n try {\n const followers = await memFetchFamiliarFollowers(id);\n if (aborted) return;\n setFamiliarFollowers(followers[0]?.accounts || []);\n } catch (e) {\n console.error(e);\n }\n })();\n return () => {\n aborted = true;\n };\n }, [\n showStats,\n id,\n currentAccountID,\n sameCurrentInstance,\n hasRelationshipProp,\n relationship,\n ]);\n\n return (\n <a\n class=\"account-block\"\n href={url}\n target={external ? '_blank' : null}\n title={acct2 ? acct : `@${acct}`}\n onClick={(e) => {\n if (external) return;\n e.preventDefault();\n if (onClick) return onClick(e);\n if (internal) {\n // navigate(`/${instance}/a/${id}`);\n location.hash = `/${instance}/a/${id}`;\n } else {\n states.showAccount = {\n account,\n instance,\n };\n }\n }}\n >\n <div class=\"avatar-container\">\n <Avatar\n url={useAvatarStatic ? avatarStatic : avatar || avatarStatic}\n staticUrl={useAvatarStatic ? undefined : avatarStatic}\n size={avatarSize}\n squircle={bot}\n alt={avatarDescription || ''}\n />\n </div>\n <span class=\"account-block-content\">\n {!hideDisplayName && (\n <>\n {displayName ? (\n <b>\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={url}\n />\n </b>\n ) : (\n <b>{username}</b>\n )}\n </>\n )}{' '}\n <span class=\"account-block-acct bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n <wbr />\n {acct2}\n {locked && (\n <>\n {' '}\n <Icon icon=\"lock\" size=\"s\" alt={t`Locked`} />\n </>\n )}\n </span>\n <RolesTags roles={roles} accountUrl={url} />\n {showActivity && (\n <div class=\"account-block-stats\">\n <Trans>Posts: {shortenNumber(statusesCount)}</Trans>\n {!!lastStatusAt && (\n <>\n {' '}\n &middot;{' '}\n <span class=\"ib\">\n <Trans>\n Last active:{' '}\n {ph({\n date: niceDateTime(lastStatusAt, {\n hideTime: true,\n }),\n })}\n </Trans>\n </span>\n </>\n )}\n </div>\n )}\n {showStats && (\n <div class=\"account-block-stats\">\n {bot && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n </span>\n </>\n )}\n {!!group && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"group\" /> <Trans>Group</Trans>\n </span>\n </>\n )}\n {hasRelationship && (\n <div key={relationship.id} class=\"shazam-container-horizontal\">\n <div class=\"shazam-container-inner\">\n {excludedRelationship.following &&\n excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Mutual</Trans>\n </span>\n ) : excludedRelationship.requested ? (\n <span class=\"tag minimal\">\n <Trans>Requested</Trans>\n </span>\n ) : excludedRelationship.following ? (\n <span class=\"tag minimal\">\n <Trans>Following</Trans>\n </span>\n ) : excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Follows you</Trans>\n </span>\n ) : null}\n </div>\n </div>\n )}\n {((!hasRelationship && !!familiarFollowers?.length) ||\n !!followersCount) && (\n <span class=\"shazam-container-horizontal\">\n <span class=\"shazam-container-inner\">\n {!hasRelationship && !!familiarFollowers?.length && (\n <span class=\"stats-avatars-bunch\">\n {familiarFollowers.slice(0, 3).map((follower) => (\n <Avatar\n url={follower.avatarStatic}\n size=\"s\"\n alt={`${follower.displayName} @${follower.acct}`}\n squircle={follower.bot}\n key={follower.id}\n />\n ))}\n </span>\n )}{' '}\n {!!followersCount && (\n <span class=\"ib\">\n <Plural\n value={followersCount}\n one={\n <Trans>\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n follower\n </Trans>\n }\n other={\n <Trans>\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n followers\n </Trans>\n }\n />\n </span>\n )}\n </span>\n </span>\n )}\n {!!verifiedField && (\n <span class=\"verified-field\">\n <Icon icon=\"check-circle\" size=\"s\" alt={t`Verified`} />{' '}\n <span\n dangerouslySetInnerHTML={{\n __html: enhanceContent(verifiedField.value, { emojis }),\n }}\n />\n </span>\n )}\n {!bot &&\n !group &&\n !hasRelationship &&\n !familiarFollowers?.length &&\n !followersCount &&\n !verifiedField &&\n !!createdAt && (\n <span class=\"created-at\">\n <Trans>\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </Trans>\n </span>\n )}\n </div>\n )}\n </span>\n </a>\n );\n}\n\nexport default AccountBlock;\n","import { api } from './api';\nimport { getCurrentAccountID } from './store-utils';\n\nexport async function fetchRelationships(accounts, relationshipsMap = {}) {\n if (!accounts?.length) return;\n const { masto } = api();\n\n const currentAccount = getCurrentAccountID();\n const uniqueAccountIds = accounts.reduce((acc, a) => {\n // 1. Ignore duplicate accounts\n // 2. Ignore accounts that are already inside relationshipsMap\n // 3. Ignore currently logged in account\n if (\n !acc.includes(a.id) &&\n !relationshipsMap[a.id] &&\n a.id !== currentAccount\n ) {\n acc.push(a.id);\n }\n return acc;\n }, []);\n if (!uniqueAccountIds.length) return null;\n\n try {\n const relationships = await masto.v1.accounts.relationships.fetch({\n id: uniqueAccountIds,\n });\n const newRelationshipsMap = relationships.reduce((acc, r) => {\n acc[r.id] = r;\n return acc;\n }, {});\n return newRelationshipsMap;\n } catch (e) {\n console.error(e);\n // It's okay to fail\n return null;\n }\n}\n","import { i18n } from '@lingui/core';\n\nimport NF from './nf';\n\nexport default function i18nDuration(duration, unit) {\n return () =>\n NF(i18n.locale, {\n style: 'unit',\n unit,\n unitDisplay: 'long',\n }).format(duration);\n}\n","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n\t' A network error occurred.', // Bun (WebKit)\n\t'Network connection lost', // Cloudflare Workers (fetch)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\tconst {message, stack} = error;\n\n\t// Safari 17+ has generic message but no stack for network errors\n\tif (message === 'Load failed' || (message.startsWith('Load failed (') && message.endsWith(')'))) {\n\t\treturn stack === undefined\n\t\t\t// Sentry adds its own stack trace to the fetch error, so also check for that\n\t\t\t|| '__sentry_captured__' in error;\n\t}\n\n\t// Deno network errors start with specific text\n\tif (message.startsWith('error sending request for url')) {\n\t\treturn true;\n\t}\n\n\t// Chrome: exact \"Failed to fetch\" or with hostname: \"Failed to fetch (example.com)\"\n\tif (message === 'Failed to fetch' || (message.startsWith('Failed to fetch (') && message.endsWith(')'))) {\n\t\treturn true;\n\t}\n\n\t// Standard network error messages\n\treturn errorMessages.has(message);\n}\n","import isNetworkError from 'is-network-error';\n\nfunction validateRetries(retries) {\n\tif (typeof retries === 'number') {\n\t\tif (retries < 0) {\n\t\t\tthrow new TypeError('Expected `retries` to be a non-negative number.');\n\t\t}\n\n\t\tif (Number.isNaN(retries)) {\n\t\t\tthrow new TypeError('Expected `retries` to be a valid number or Infinity, got NaN.');\n\t\t}\n\t} else if (retries !== undefined) {\n\t\tthrow new TypeError('Expected `retries` to be a number or Infinity.');\n\t}\n}\n\nfunction validateNumberOption(name, value, {min = 0, allowInfinity = false} = {}) {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (typeof value !== 'number' || Number.isNaN(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a number${allowInfinity ? ' or Infinity' : ''}.`);\n\t}\n\n\tif (!allowInfinity && !Number.isFinite(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a finite number.`);\n\t}\n\n\tif (value < min) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be \\u2265 ${min}.`);\n\t}\n}\n\nfunction validateFunctionOption(name, value) {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (typeof value !== 'function') {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a function.`);\n\t}\n}\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nfunction calculateDelay(retriesConsumed, options) {\n\tconst attempt = Math.max(1, retriesConsumed + 1);\n\tconst random = options.randomize ? (Math.random() + 1) : 1;\n\n\tlet timeout = Math.round(random * options.minTimeout * (options.factor ** (attempt - 1)));\n\ttimeout = Math.min(timeout, options.maxTimeout);\n\n\treturn timeout;\n}\n\nfunction calculateRemainingTime(start, max) {\n\tif (!Number.isFinite(max)) {\n\t\treturn max;\n\t}\n\n\treturn max - (performance.now() - start);\n}\n\nasync function delayForRetry(delay, options) {\n\tif (delay <= 0) {\n\t\treturn;\n\t}\n\n\tawait new Promise((resolve, reject) => {\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeoutToken);\n\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\treject(options.signal.reason);\n\t\t};\n\n\t\tconst timeoutToken = setTimeout(() => {\n\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\tresolve();\n\t\t}, delay);\n\n\t\tif (options.unref) {\n\t\t\ttimeoutToken.unref?.();\n\t\t}\n\n\t\toptions.signal?.addEventListener('abort', onAbort, {once: true});\n\t});\n}\n\nasync function onAttemptFailure({error, attemptNumber, retriesConsumed, startTime, options}) {\n\tconst normalizedError = error instanceof Error\n\t\t? error\n\t\t: new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\n\tif (normalizedError instanceof AbortError) {\n\t\tthrow normalizedError.originalError;\n\t}\n\n\tconst retriesLeft = Number.isFinite(options.retries)\n\t\t? Math.max(0, options.retries - retriesConsumed)\n\t\t: options.retries;\n\n\tconst maxRetryTime = options.maxRetryTime ?? Number.POSITIVE_INFINITY;\n\tconst delayTime = calculateDelay(retriesConsumed, options);\n\tconst remainingTimeBeforeCallbacks = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTimeBeforeCallbacks <= 0) {\n\t\tconst context = Object.freeze({\n\t\t\terror: normalizedError,\n\t\t\tattemptNumber,\n\t\t\tretriesLeft,\n\t\t\tretriesConsumed,\n\t\t\tretryDelay: 0,\n\t\t});\n\n\t\tawait options.onFailedAttempt(context);\n\n\t\tthrow normalizedError;\n\t}\n\n\tconst consumeRetryContext = Object.freeze({\n\t\terror: normalizedError,\n\t\tattemptNumber,\n\t\tretriesLeft,\n\t\tretriesConsumed,\n\t\tretryDelay: retriesLeft > 0 ? delayTime : 0,\n\t});\n\n\tconst consumeRetry = await options.shouldConsumeRetry(consumeRetryContext);\n\tconst effectiveDelay = consumeRetry && retriesLeft > 0 ? delayTime : 0;\n\tconst context = Object.freeze({\n\t\terror: normalizedError,\n\t\tattemptNumber,\n\t\tretriesLeft,\n\t\tretriesConsumed,\n\t\tretryDelay: effectiveDelay,\n\t});\n\n\tawait options.onFailedAttempt(context);\n\n\tif (calculateRemainingTime(startTime, maxRetryTime) <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tconst remainingTime = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTime <= 0 || retriesLeft <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (normalizedError instanceof TypeError && !isNetworkError(normalizedError)) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (!await options.shouldRetry(context)) {\n\t\tthrow normalizedError;\n\t}\n\n\tconst remainingTimeAfterShouldRetry = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTimeAfterShouldRetry <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (!consumeRetry) {\n\t\toptions.signal?.throwIfAborted();\n\t\treturn false;\n\t}\n\n\tconst finalDelay = Math.min(effectiveDelay, remainingTimeAfterShouldRetry);\n\n\toptions.signal?.throwIfAborted();\n\n\tawait delayForRetry(finalDelay, options);\n\n\toptions.signal?.throwIfAborted();\n\n\treturn true;\n}\n\nexport default async function pRetry(input, options = {}) {\n\toptions = {...options};\n\n\tvalidateRetries(options.retries);\n\n\tif (Object.hasOwn(options, 'forever')) {\n\t\tthrow new Error('The `forever` option is no longer supported. For many use-cases, you can set `retries: Infinity` instead.');\n\t}\n\n\toptions.retries ??= 10;\n\toptions.factor ??= 2;\n\toptions.minTimeout ??= 1000;\n\toptions.maxTimeout ??= Number.POSITIVE_INFINITY;\n\toptions.maxRetryTime ??= Number.POSITIVE_INFINITY;\n\toptions.randomize ??= false;\n\toptions.onFailedAttempt ??= () => {};\n\toptions.shouldRetry ??= () => true;\n\toptions.shouldConsumeRetry ??= () => true;\n\n\t// Validate numeric options and normalize edge cases\n\tvalidateFunctionOption('onFailedAttempt', options.onFailedAttempt);\n\tvalidateFunctionOption('shouldRetry', options.shouldRetry);\n\tvalidateFunctionOption('shouldConsumeRetry', options.shouldConsumeRetry);\n\tvalidateNumberOption('factor', options.factor, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('minTimeout', options.minTimeout, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('maxTimeout', options.maxTimeout, {min: 0, allowInfinity: true});\n\tvalidateNumberOption('maxRetryTime', options.maxRetryTime, {min: 0, allowInfinity: true});\n\n\t// Treat non-positive factor as 1 to avoid zero backoff or negative behavior\n\tif (!(options.factor > 0)) {\n\t\toptions.factor = 1;\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tlet attemptNumber = 0;\n\tlet retriesConsumed = 0;\n\tconst startTime = performance.now();\n\n\twhile (Number.isFinite(options.retries) ? retriesConsumed <= options.retries : true) {\n\t\tattemptNumber++;\n\n\t\ttry {\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\tconst result = await input(attemptNumber);\n\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (await onAttemptFailure({\n\t\t\t\terror,\n\t\t\t\tattemptNumber,\n\t\t\t\tretriesConsumed,\n\t\t\t\tstartTime,\n\t\t\t\toptions,\n\t\t\t})) {\n\t\t\t\tretriesConsumed++;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Should not reach here, but in case it does, throw an error\n\tthrow new Error('Retry attempts exhausted without throwing an error.');\n}\n\nexport function makeRetriable(function_, options) {\n\treturn function (...arguments_) {\n\t\treturn pRetry(() => function_.apply(this, arguments_), options);\n\t};\n}\n","const supportsLanguageDetector = 'LanguageDetector' in self;\nexport const supportsBrowserTranslator =\n supportsLanguageDetector && 'Translator' in self;\n\n// https://developer.chrome.com/docs/ai/language-detection\nexport let langDetector;\nif (supportsLanguageDetector) {\n (async () => {\n try {\n const availability = await LanguageDetector.availability();\n if (availability === 'unavailable') {\n console.log('🎺 Language detector is unavailable');\n // The language detector isn't usable.\n return;\n }\n if (availability === 'available') {\n console.log('🎺 Language detector is available');\n // The language detector can immediately be used.\n langDetector = await LanguageDetector.create();\n } else {\n console.log(`🎺 Language detector is ${availability}`);\n // The language detector can be used after model download.\n langDetector = await LanguageDetector.create({\n monitor(m) {\n m.addEventListener('downloadprogress', (e) => {\n console.log(\n `🎺 Language detector: Downloaded ${e.loaded * 100}%`,\n );\n });\n },\n });\n await langDetector.ready;\n }\n } catch (e) {\n console.error(e);\n }\n })();\n}\n\n// https://developer.chrome.com/docs/ai/translator-api\nexport const translate = async (text, source, target) => {\n let detectedSourceLanguage;\n const originalSource = source;\n if (source === 'auto') {\n if (!langDetector?.detect) {\n return {\n error: 'No language detector',\n };\n }\n try {\n const results = await langDetector.detect(text);\n source = results[0].detectedLanguage;\n detectedSourceLanguage = source;\n } catch (e) {\n console.warn(e);\n return {\n error: e,\n };\n }\n }\n const groupLabel = `💬 BROWSER TRANSLATE ${text}`;\n console.groupCollapsed(groupLabel);\n console.log(originalSource, detectedSourceLanguage, target);\n try {\n const translatorCapabilities = await Translator.availability({\n sourceLanguage: source,\n targetLanguage: target,\n });\n // Note: Translator.availability() returns 'unavailable', 'downloadable', 'downloading', or 'available'.\n if (translatorCapabilities === 'unavailable') {\n console.groupEnd(groupLabel);\n return {\n error: `Unsupported language pair: ${source} -> ${target}`,\n };\n }\n let translator;\n if (translatorCapabilities === 'available') {\n translator = await Translator.create({\n sourceLanguage: source,\n targetLanguage: target,\n });\n } else {\n translator = await Translator.create({\n sourceLanguage: source,\n targetLanguage: target,\n monitor(m) {\n m.addEventListener('downloadprogress', (e) => {\n console.log(\n `Translate ${source} -> ${target}: Downloaded ${e.loaded * 100}%`,\n );\n });\n },\n });\n await translator.ready;\n }\n\n const content = await translator.translate(text);\n console.log(content);\n console.groupEnd(groupLabel);\n\n return {\n content,\n detectedSourceLanguage,\n provider: 'browser',\n };\n } catch (e) {\n console.groupEnd(groupLabel);\n console.error(e);\n return {\n error: e,\n };\n }\n};\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a2;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n [...(_a2 = elements.get(entry.target)) != null ? _a2 : []].forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"lastInView\");\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n this.lastInView = this.props.initialInView;\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n const previousInView = this.lastInView;\n this.lastInView = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n this.lastInView = props.initialInView;\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n if (this.lastInView === void 0) {\n this.lastInView = this.props.initialInView;\n }\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a2;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const lastInViewRef = React2.useRef(initialInView);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (lastInViewRef.current === void 0) {\n lastInViewRef.current = initialInView;\n }\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a2 = state.entry) == null ? void 0 : _a2.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n lastInViewRef.current = initialInView;\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\n// src/useOnInView.tsx\nimport * as React3 from \"react\";\nvar _a, _b;\nvar useSyncEffect = (_b = (_a = \"useInsertionEffect\" in React3 ? React3.useInsertionEffect : void 0) != null ? _a : React3.useLayoutEffect) != null ? _b : React3.useEffect;\nvar useOnInView = (onIntersectionChange, {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n} = {}) => {\n const onIntersectionChangeRef = React3.useRef(onIntersectionChange);\n const observedElementRef = React3.useRef(null);\n const observerCleanupRef = React3.useRef(void 0);\n const lastInViewRef = React3.useRef(void 0);\n useSyncEffect(() => {\n onIntersectionChangeRef.current = onIntersectionChange;\n }, [onIntersectionChange]);\n return React3.useCallback(\n (element) => {\n const cleanupExisting = () => {\n if (observerCleanupRef.current) {\n const cleanup = observerCleanupRef.current;\n observerCleanupRef.current = void 0;\n cleanup();\n }\n };\n if (element === observedElementRef.current) {\n return observerCleanupRef.current;\n }\n if (!element || skip) {\n cleanupExisting();\n observedElementRef.current = null;\n lastInViewRef.current = void 0;\n return;\n }\n cleanupExisting();\n observedElementRef.current = element;\n let destroyed = false;\n const destroyObserver = observe(\n element,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n onIntersectionChangeRef.current(\n inView,\n entry\n );\n if (triggerOnce && inView) {\n stopObserving();\n }\n },\n {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay\n }\n );\n function stopObserving() {\n if (destroyed) return;\n destroyed = true;\n destroyObserver();\n observedElementRef.current = null;\n observerCleanupRef.current = void 0;\n lastInViewRef.current = void 0;\n }\n observerCleanupRef.current = stopObserving;\n return observerCleanupRef.current;\n },\n [\n Array.isArray(threshold) ? threshold.toString() : threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n ]\n );\n};\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView,\n useOnInView\n};\n//# sourceMappingURL=index.mjs.map","/*\n Rendered but hidden. Only show when visible\n*/\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useOnInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nconst shazamIDs = {};\n\nexport default function LazyShazam({ id, children }) {\n const containerRef = useRef();\n const [visibleStart, setVisibleStart] = useState(!!shazamIDs[id]);\n\n const onInView = useCallback(\n (inView) => {\n if (inView && containerRef.current) {\n containerRef.current.hidden = false;\n if (id) shazamIDs[id] = true;\n }\n },\n [id],\n );\n\n const ref = useOnInView(onInView, {\n rootMargin: `-${TOP}px 0px 0px 0px`,\n trackVisibility: true,\n delay: 1000,\n triggerOnce: true,\n skip: visibleStart,\n });\n\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n if (rect.bottom > TOP) {\n if (rect.top < window.innerHeight) {\n containerRef.current.hidden = false;\n } else {\n setVisibleStart(true);\n }\n if (id) shazamIDs[id] = true;\n }\n }, []);\n\n if (visibleStart) return children;\n\n return (\n <div ref={containerRef} class=\"shazam-container no-animation\" hidden>\n <div ref={ref} class=\"shazam-container-inner\">\n {children}\n </div>\n </div>\n );\n}\n","import './translation-block.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport PQueue from 'p-queue';\nimport pRetry from 'p-retry';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport languages from '../data/translang-languages';\nimport {\n translate as browserTranslate,\n supportsBrowserTranslator,\n} from '../utils/browser-translator';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport pmem from '../utils/pmem';\n\nimport Icon from './icon';\nimport LazyShazam from './lazy-shazam';\nimport Loader from './loader';\n\nconst sourceLanguages = Object.entries(languages.sl).map(([code, name]) => ({\n code,\n name,\n}));\n\nconst { PHANPY_TRANSLANG_INSTANCES } = import.meta.env;\nconst TRANSLANG_INSTANCES = PHANPY_TRANSLANG_INSTANCES\n ? PHANPY_TRANSLANG_INSTANCES.split(/\\s+/)\n : [];\n\nconst translationQueue = new PQueue({\n concurrency: 1,\n interval: 2000,\n intervalCap: 1,\n});\n\nconst TRANSLATED_MAX_AGE = 1000 * 60 * 60; // 1 hour\nlet currentTranslangInstance = 0;\n\nfunction _translangTranslate(text, source, target) {\n console.log('TRANSLATE', text, source, target);\n const fetchCall = () => {\n let instance = TRANSLANG_INSTANCES[currentTranslangInstance];\n const tooLong = text.length > 2000;\n let fetchPromise;\n if (tooLong) {\n // POST\n fetchPromise = fetch(`https://${instance}/api/v1/translate`, {\n method: 'POST',\n priority: 'low',\n referrerPolicy: 'no-referrer',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sl: source,\n tl: target,\n text,\n }),\n });\n } else {\n // GET\n fetchPromise = fetch(\n `https://${instance}/api/v1/translate?sl=${encodeURIComponent(\n source,\n )}&tl=${encodeURIComponent(target)}&text=${encodeURIComponent(text)}`,\n {\n priority: 'low',\n referrerPolicy: 'no-referrer',\n },\n );\n }\n return fetchPromise\n .then((res) => {\n if (!res.ok) throw new Error(res.statusText);\n return res.json();\n })\n .then((res) => {\n return {\n provider: 'translang',\n content: res.translated_text,\n detectedSourceLanguage: res.detected_language,\n pronunciation: res.pronunciation,\n };\n });\n };\n return pRetry(fetchCall, {\n retries: 3,\n onFailedAttempt: (e) => {\n currentTranslangInstance =\n (currentTranslangInstance + 1) % TRANSLANG_INSTANCES.length;\n console.log(\n 'Retrying translation with another instance',\n currentTranslangInstance,\n );\n },\n });\n}\nconst translangTranslate = pmem(_translangTranslate, {\n expires: TRANSLATED_MAX_AGE,\n});\nconst throttledTranslangTranslate = pmem(\n ({ signal, text, source, target }) =>\n translationQueue.add(() => translangTranslate(text, source, target), {\n signal,\n }),\n {\n // I know, this is double-layered memoization\n expires: TRANSLATED_MAX_AGE,\n },\n);\n\nconst throttledBrowserTranslate = ({ text, source, target, signal }) =>\n translationQueue.add(() => browserTranslate(text, source, target), {\n signal,\n });\n\nfunction TranslationBlock({\n forceTranslate,\n sourceLanguage,\n onTranslate,\n text = '',\n mini,\n autoDetected,\n}) {\n const { t } = useLingui();\n const targetLang = getTranslateTargetLanguage(true);\n const [uiState, setUIState] = useState('default');\n const [pronunciationContent, setPronunciationContent] = useState(null);\n const [translatedContent, setTranslatedContent] = useState(null);\n const [detectedLang, setDetectedLang] = useState(null);\n const detailsRef = useRef();\n const abortControllerRef = useRef();\n\n const sourceLangText = sourceLanguage\n ? localeCode2Text(sourceLanguage)\n : null;\n const targetLangText = localeCode2Text(targetLang);\n const apiSourceLang = useRef('auto');\n\n if (!onTranslate) {\n onTranslate = async ({ text, source, target, signal }) => {\n if (supportsBrowserTranslator) {\n const result = await throttledBrowserTranslate({\n text,\n source,\n target,\n signal,\n });\n if (result && !result.error) {\n return result;\n }\n }\n return mini\n ? await throttledTranslangTranslate({ signal, text, source, target })\n : await translangTranslate(text, source, target);\n };\n }\n\n const translate = async () => {\n setUIState('loading');\n try {\n const { content, detectedSourceLanguage, provider, error, ...props } =\n await onTranslate({\n text,\n source: apiSourceLang.current,\n target: targetLang,\n signal: abortControllerRef.current?.signal,\n });\n if (content) {\n if (detectedSourceLanguage) {\n const detectedLangText = localeCode2Text(detectedSourceLanguage);\n setDetectedLang(detectedLangText);\n }\n if (provider === 'translang') {\n const pronunciation = props?.pronunciation;\n if (pronunciation) {\n setPronunciationContent(pronunciation);\n }\n }\n setTranslatedContent(content);\n setUIState('default');\n if (!mini && content.trim() !== text.trim() && detailsRef.current) {\n detailsRef.current.open = true;\n detailsRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n } else {\n if (error) console.error(error);\n setUIState('error');\n }\n } catch (e) {\n if (e.name !== 'AbortError') {\n console.error(e);\n setUIState('error');\n }\n }\n };\n\n useEffect(() => {\n if (forceTranslate) {\n translate();\n }\n }, [forceTranslate]);\n\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n return () => {\n abortControllerRef.current.abort();\n };\n }, []);\n\n if (mini) {\n if (\n !!translatedContent &&\n translatedContent.trim() !== text.trim() &&\n detectedLang !== targetLangText\n ) {\n return (\n <LazyShazam>\n <div class=\"status-translation-block-mini\">\n <Icon\n icon=\"translate\"\n alt={t`Auto-translated from ${sourceLangText}`}\n />\n <output\n lang={targetLang}\n dir=\"auto\"\n title={pronunciationContent || ''}\n >\n {translatedContent}\n </output>\n </div>\n </LazyShazam>\n );\n }\n return null;\n }\n\n return (\n <div\n class=\"status-translation-block\"\n onClick={(e) => {\n e.preventDefault();\n }}\n >\n <details ref={detailsRef}>\n <summary>\n <button\n type=\"button\"\n class={uiState === 'loading' ? 'loading-mask' : ''}\n onClick={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n detailsRef.current.open = !detailsRef.current.open;\n if (uiState === 'loading') return;\n if (!translatedContent) translate();\n }}\n >\n <Icon icon=\"translate\" />{' '}\n <span>\n {uiState === 'loading'\n ? t`Translating…`\n : sourceLanguage && sourceLangText && !detectedLang\n ? autoDetected\n ? t`Translate from ${sourceLangText} (auto-detected)`\n : t`Translate from ${sourceLangText}`\n : t`Translate`}\n </span>\n </button>\n </summary>\n <div class=\"translated-block\">\n <div class=\"translation-info insignificant\">\n <select\n class=\"translated-source-select\"\n disabled={uiState === 'loading'}\n onChange={(e) => {\n apiSourceLang.current = e.target.value;\n translate();\n }}\n >\n {sourceLanguages.map((l) => {\n const common = localeCode2Text({\n code: l.code,\n fallback: l.name,\n });\n const native = localeCode2Text({\n code: l.code,\n locale: l.code,\n });\n const showCommon = native && common !== native;\n return (\n <option value={l.code}>\n {l.code === 'auto'\n ? t`Auto (${detectedLang ?? '…'})`\n : showCommon\n ? `${native} - ${common}`\n : common}\n </option>\n );\n })}\n </select>{' '}\n <span>→ {targetLangText}</span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n </div>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to translate</Trans>\n </p>\n ) : (\n !!translatedContent && (\n <>\n <output class=\"translated-content\" lang={targetLang} dir=\"auto\">\n {translatedContent}\n </output>\n {!!pronunciationContent && (\n <output\n class=\"translated-pronunciation-content\"\n tabIndex={-1}\n onClick={(e) => {\n e.target.classList.toggle('expand');\n }}\n >\n {pronunciationContent}\n </output>\n )}\n </>\n )\n )}\n </div>\n </details>\n </div>\n );\n}\n\nexport default TRANSLANG_INSTANCES?.length ? TranslationBlock : () => null;\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n let dbp;\n const getDB = () => {\n if (dbp)\n return dbp;\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n dbp = promisifyRequest(request);\n dbp.then((db) => {\n // It seems like Safari sometimes likes to just close the connection.\n // It's supposed to fire this event when that happens. Let's hope it does!\n db.onclose = () => (dbp = undefined);\n }, () => { });\n return dbp;\n };\n return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n const req = store.get(key);\n req.onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n req.onerror = () => reject(req.error);\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import {\n clear,\n createStore,\n del,\n delMany,\n get,\n getMany,\n keys,\n set,\n} from 'idb-keyval';\n\nfunction initDB(dbName, storeName) {\n const store = createStore(dbName, storeName);\n return {\n set: (key, val) => set(key, val, store),\n get: (key) => get(key, store),\n getMany: (keys) => getMany(keys, store),\n del: (key) => del(key, store),\n delMany: (keys) => delMany(keys, store),\n clear: () => clear(store),\n keys: () => keys(store),\n };\n}\n\nexport default {\n drafts: initDB('drafts-db', 'drafts-store'),\n catchup: initDB('catchup-db', 'catchup-store'),\n yearInPosts: initDB('year-in-posts-db', 'year-in-posts-store'),\n};\n","import { createContext } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nconst EditHistoryContext = createContext({});\n\nconst supportsViewTransition = !!document.startViewTransition;\n\nexport function EditHistoryProvider({ children, statusID }) {\n const editHistoryRef = useRef([]);\n const [editHistoryMode, setEditHistoryMode] = useState(false);\n // 0 is latest\n const [editedAtIndex, _setEditedAtIndex] = useState(0);\n\n // setEditedAtIndex, with View Transitions API\n function setEditedAtIndex(i) {\n if (i === editedAtIndex) return;\n if (supportsViewTransition) {\n document.startViewTransition(() => {\n _setEditedAtIndex(i);\n });\n } else {\n _setEditedAtIndex(i);\n }\n }\n\n async function fetchEditHistory() {\n const { masto } = api();\n const history = await masto.v1.statuses.$select(statusID).history.list();\n // sort latest first\n history.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt));\n editHistoryRef.current = history;\n }\n\n async function initEditHistory() {\n console.log('initEditHistory', statusID);\n try {\n await fetchEditHistory();\n setEditHistoryMode(true);\n setEditedAtIndex(0);\n } catch (e) {\n console.error(e);\n setEditHistoryMode(false);\n }\n }\n\n function exitEditHistory() {\n editHistoryRef.current = [];\n setEditHistoryMode(false);\n setEditedAtIndex(0);\n }\n\n function prevEditedAt() {\n setEditedAtIndex((i) => Math.min(i + 1, editHistoryRef.current.length - 1));\n }\n\n function nextEditedAt() {\n setEditedAtIndex((i) => Math.max(i - 1, 0));\n }\n\n return (\n <EditHistoryContext.Provider\n value={{\n editHistoryRef,\n initEditHistory,\n exitEditHistory,\n editHistoryMode,\n editedAtIndex,\n prevEditedAt,\n nextEditedAt,\n }}\n >\n {children}\n </EditHistoryContext.Provider>\n );\n}\n\nexport function useEditHistory() {\n return useContext(EditHistoryContext);\n}\n","import { createContext } from 'preact';\n\nconst FilterContext = createContext();\nexport default FilterContext;\n","import mem from './mem';\nimport { getCurrentAccountID } from './store-utils';\n\nfunction _isFiltered(filtered, filterContext) {\n if (!filtered?.length) return false;\n const appliedFilters = filtered.filter((f) => {\n const { filter } = f;\n const hasContext = filter.context.includes(filterContext);\n if (!hasContext) return false;\n if (!filter.expiresAt) return hasContext;\n return Date.parse(filter.expiresAt) > Date.now();\n });\n if (!appliedFilters.length) return false;\n const isHidden = appliedFilters.some((f) => f.filter.filterAction === 'hide');\n if (isHidden)\n return {\n action: 'hide',\n };\n const isBlur = appliedFilters.every((f) => f.filter.filterAction === 'blur');\n if (isBlur) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'blur',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n // const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n const isWarn = appliedFilters.some((f) => !!f.filter.filterAction);\n // Re: spec; unknown values for filter_action should be treated as warn.\n if (isWarn) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'warn',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n return false;\n}\nexport const isFiltered = mem(_isFiltered);\n\nexport function filteredItem(item, filterContext, currentAccountID) {\n const { filtered } = item;\n if (!filtered?.length) return true;\n const isSelf = currentAccountID && item.account?.id === currentAccountID;\n if (isSelf) return true;\n const filterState = isFiltered(filtered, filterContext);\n if (!filterState) return true;\n if (filterState.action === 'hide') return false;\n // item._filtered = filterState;\n return true;\n}\nexport function filteredItems(items, filterContext) {\n if (!items?.length) return [];\n if (!filterContext) return items;\n const currentAccountID = getCurrentAccountID();\n return items.filter((item) =>\n filteredItem(item, filterContext, currentAccountID),\n );\n}\n","const template = document.createElement('template');\nexport default function htmlContentLength(html) {\n if (!html) return 0;\n template.innerHTML = html;\n // .invisible spans for links\n // e.g. <span class=\"invisible\">https://</span>mastodon.social\n const invisibleElements = template.content.querySelectorAll('.invisible');\n for (let i = 0; i < invisibleElements.length; i++) {\n invisibleElements[i].remove();\n }\n // Collect innerText from all child nodes since DocumentFragment doesn't have innerText\n let textContent = '';\n for (let i = 0; i < template.content.childNodes.length; i++) {\n const n = template.content.childNodes[i];\n textContent += n.innerText || n.textContent || '';\n }\n return textContent.length;\n}\n","export const supportsTTS = 'speechSynthesis' in window;\n\nexport function speak(text, lang) {\n if (!supportsTTS) return;\n try {\n if (speechSynthesis.speaking) {\n speechSynthesis.cancel();\n }\n const utterance = new SpeechSynthesisUtterance(text);\n if (lang) utterance.lang = lang;\n speechSynthesis.speak(utterance);\n } catch (e) {\n alert(e);\n }\n}\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react';\n\n// This could've been more streamlined with internal state instead of abusing\n// refs to such extent, but then composing hooks and components could not opt out of unnecessary renders.\nfunction useResolvedElement(subscriber, refOrElement) {\n var lastReportRef = useRef(null);\n var refOrElementRef = useRef(null);\n refOrElementRef.current = refOrElement;\n var cbElementRef = useRef(null); // Calling re-evaluation after each render without using a dep array,\n // as the ref object's current value could've changed since the last render.\n\n useEffect(function () {\n evaluateSubscription();\n });\n var evaluateSubscription = useCallback(function () {\n var cbElement = cbElementRef.current;\n var refOrElement = refOrElementRef.current; // Ugly ternary. But smaller than an if-else block.\n\n var element = cbElement ? cbElement : refOrElement ? refOrElement instanceof Element ? refOrElement : refOrElement.current : null;\n\n if (lastReportRef.current && lastReportRef.current.element === element && lastReportRef.current.subscriber === subscriber) {\n return;\n }\n\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n }\n\n lastReportRef.current = {\n element: element,\n subscriber: subscriber,\n // Only calling the subscriber, if there's an actual element to report.\n // Setting cleanup to undefined unless a subscriber returns one, as an existing cleanup function would've been just called.\n cleanup: element ? subscriber(element) : undefined\n };\n }, [subscriber]); // making sure we call the cleanup function on unmount\n\n useEffect(function () {\n return function () {\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n lastReportRef.current = null;\n }\n };\n }, []);\n return useCallback(function (element) {\n cbElementRef.current = element;\n evaluateSubscription();\n }, [evaluateSubscription]);\n}\n\n// We're only using the first element of the size sequences, until future versions of the spec solidify on how\n// exactly it'll be used for fragments in multi-column scenarios:\n// From the spec:\n// > The box size properties are exposed as FrozenArray in order to support elements that have multiple fragments,\n// > which occur in multi-column scenarios. However the current definitions of content rect and border box do not\n// > mention how those boxes are affected by multi-column layout. In this spec, there will only be a single\n// > ResizeObserverSize returned in the FrozenArray, which will correspond to the dimensions of the first column.\n// > A future version of this spec will extend the returned FrozenArray to contain the per-fragment size information.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface)\n//\n// Also, testing these new box options revealed that in both Chrome and FF everything is returned in the callback,\n// regardless of the \"box\" option.\n// The spec states the following on this:\n// > This does not have any impact on which box dimensions are returned to the defined callback when the event\n// > is fired, it solely defines which box the author wishes to observe layout changes on.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// I'm not exactly clear on what this means, especially when you consider a later section stating the following:\n// > This section is non-normative. An author may desire to observe more than one CSS box.\n// > In this case, author will need to use multiple ResizeObservers.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// Which is clearly not how current browser implementations behave, and seems to contradict the previous quote.\n// For this reason I decided to only return the requested size,\n// even though it seems we have access to results for all box types.\n// This also means that we get to keep the current api, being able to return a simple { width, height } pair,\n// regardless of box option.\nfunction extractSize(entry, boxProp, sizeType) {\n if (!entry[boxProp]) {\n if (boxProp === \"contentBoxSize\") {\n // The dimensions in `contentBoxSize` and `contentRect` are equivalent according to the spec.\n // See the 6th step in the description for the RO algorithm:\n // https://drafts.csswg.org/resize-observer/#create-and-populate-resizeobserverentry-h\n // > Set this.contentRect to logical this.contentBoxSize given target and observedBox of \"content-box\".\n // In real browser implementations of course these objects differ, but the width/height values should be equivalent.\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n\n return undefined;\n } // A couple bytes smaller than calling Array.isArray() and just as effective here.\n\n\n return entry[boxProp][0] ? entry[boxProp][0][sizeType] : // TS complains about this, because the RO entry type follows the spec and does not reflect Firefox's current\n // behaviour of returning objects instead of arrays for `borderBoxSize` and `contentBoxSize`.\n // @ts-ignore\n entry[boxProp][sizeType];\n}\n\nfunction useResizeObserver(opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n // Saving the callback as a ref. With this, I don't need to put onResize in the\n // effect dep array, and just passing in an anonymous function without memoising\n // will not reinstantiate the hook's ResizeObserver.\n var onResize = opts.onResize;\n var onResizeRef = useRef(undefined);\n onResizeRef.current = onResize;\n var round = opts.round || Math.round; // Using a single instance throughout the hook's lifetime\n\n var resizeObserverRef = useRef();\n\n var _useState = useState({\n width: undefined,\n height: undefined\n }),\n size = _useState[0],\n setSize = _useState[1]; // In certain edge cases the RO might want to report a size change just after\n // the component unmounted.\n\n\n var didUnmount = useRef(false);\n useEffect(function () {\n didUnmount.current = false;\n return function () {\n didUnmount.current = true;\n };\n }, []); // Using a ref to track the previous width / height to avoid unnecessary renders.\n\n var previous = useRef({\n width: undefined,\n height: undefined\n }); // This block is kinda like a useEffect, only it's called whenever a new\n // element could be resolved based on the ref option. It also has a cleanup\n // function.\n\n var refCallback = useResolvedElement(useCallback(function (element) {\n // We only use a single Resize Observer instance, and we're instantiating it on demand, only once there's something to observe.\n // This instance is also recreated when the `box` option changes, so that a new observation is fired if there was a previously observed element with a different box option.\n if (!resizeObserverRef.current || resizeObserverRef.current.box !== opts.box || resizeObserverRef.current.round !== round) {\n resizeObserverRef.current = {\n box: opts.box,\n round: round,\n instance: new ResizeObserver(function (entries) {\n var entry = entries[0];\n var boxProp = opts.box === \"border-box\" ? \"borderBoxSize\" : opts.box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n var reportedWidth = extractSize(entry, boxProp, \"inlineSize\");\n var reportedHeight = extractSize(entry, boxProp, \"blockSize\");\n var newWidth = reportedWidth ? round(reportedWidth) : undefined;\n var newHeight = reportedHeight ? round(reportedHeight) : undefined;\n\n if (previous.current.width !== newWidth || previous.current.height !== newHeight) {\n var newSize = {\n width: newWidth,\n height: newHeight\n };\n previous.current.width = newWidth;\n previous.current.height = newHeight;\n\n if (onResizeRef.current) {\n onResizeRef.current(newSize);\n } else {\n if (!didUnmount.current) {\n setSize(newSize);\n }\n }\n }\n })\n };\n }\n\n resizeObserverRef.current.instance.observe(element, {\n box: opts.box\n });\n return function () {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.instance.unobserve(element);\n }\n };\n }, [opts.box, round]), opts.ref);\n return useMemo(function () {\n return {\n ref: refCallback,\n width: size.width,\n height: size.height\n };\n }, [refCallback, size.width, size.height]);\n}\n\nexport { useResizeObserver as default };\n","import { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useThrottledResizeObserver(opts = {}) {\n const onResize = useThrottledCallback(opts.onResize, 300);\n return useResizeObserver({\n ...opts,\n onResize,\n });\n}\n","import { useRef } from 'preact/hooks';\n\nimport useThrottledResizeObserver from './useThrottledResizeObserver';\n\nexport default function useTruncated({\n className = 'truncated',\n onTruncated,\n} = {}) {\n const ref = useRef();\n const prevTruncatedRef = useRef();\n const onResize = ({ height }) => {\n if (ref.current) {\n const { scrollHeight } = ref.current;\n let truncated = scrollHeight > height;\n if (truncated) {\n const { height: _height, maxHeight } = getComputedStyle(ref.current);\n const computedHeight = parseInt(maxHeight || _height, 10);\n truncated = scrollHeight > computedHeight;\n }\n ref.current.classList.toggle(className, truncated);\n if (\n prevTruncatedRef.current !== truncated &&\n typeof onTruncated === 'function'\n ) {\n prevTruncatedRef.current = truncated;\n onTruncated(truncated);\n }\n }\n };\n useThrottledResizeObserver({\n ref,\n box: 'border-box',\n onResize,\n });\n return ref;\n}\n","export default {\n public: 'earth',\n unlisted: 'moon',\n private: 'lock',\n direct: 'message',\n local: 'building',\n};\n","import { msg } from '@lingui/core/macro';\n\nconst visibilityText = {\n public: msg`Public`,\n local: msg`Local`,\n unlisted: msg`Quiet public`,\n private: msg`Followers`,\n direct: msg`Private mention`,\n};\n\nexport default visibilityText;\n","import './collection-card.css';\n\nimport { ph } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nconst ACCOUNT_ITEMS_LIMIT = 5;\nconst ACCOUNT_ROTATION_INTERVAL = 300_000; // 5 min in ms\n\nfunction CollectionCard({\n collection,\n instance,\n creatorAccount,\n size,\n showMeta,\n}) {\n const snapStates = useSnapshot(states);\n const { i18n } = useLingui();\n const {\n id,\n name,\n description,\n url,\n items = [],\n itemsCount,\n accountId,\n language,\n updatedAt,\n discoverable,\n sensitive,\n } = collection;\n\n // Rotate start index by 1 every interval when items exceed the limit\n const rotationSlot = Math.floor(Date.now() / ACCOUNT_ROTATION_INTERVAL);\n const selectedItems = useMemo(() => {\n if (items.length > ACCOUNT_ITEMS_LIMIT) {\n const offset = rotationSlot % items.length;\n return [...items.slice(offset), ...items.slice(0, offset)].slice(\n 0,\n ACCOUNT_ITEMS_LIMIT,\n );\n }\n return items;\n }, [rotationSlot, items]);\n\n // Resolve up to ACCOUNT_ITEMS_LIMIT accounts from items\n const accountItems = selectedItems\n .slice(0, ACCOUNT_ITEMS_LIMIT)\n .map((item) => snapStates.accounts[item.accountId])\n .filter(Boolean);\n\n // Background shows first and last account avatars (or just one if there's only one)\n const bgAccounts =\n accountItems.length === 1\n ? [accountItems[0]]\n : [accountItems[0], accountItems[accountItems.length - 1]];\n\n // Resolve creator account\n const creator = creatorAccount || snapStates.accounts[accountId];\n\n // Fetch missing accounts\n useEffect(() => {\n let aborted = false;\n const { masto } = api({ instance });\n\n const missingIDs = [\n ...new Set(\n selectedItems\n .slice(0, ACCOUNT_ITEMS_LIMIT)\n .map((item) => item.accountId)\n .concat(!creatorAccount ? accountId : [])\n .filter(Boolean),\n ),\n ].filter((id) => !states.accounts[id]);\n\n if (missingIDs.length > 0) {\n masto.v1.accounts\n .fetch({ id: missingIDs })\n .then((accounts) => {\n if (!aborted) {\n for (const account of accounts) {\n states.accounts[account.id] = account;\n }\n }\n })\n .catch(() => {});\n }\n\n return () => {\n aborted = true;\n };\n }, [selectedItems, instance]);\n\n const visibleCount = Math.min(selectedItems.length, ACCOUNT_ITEMS_LIMIT);\n const overflowCount = (itemsCount || items.length) - ACCOUNT_ITEMS_LIMIT;\n\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noopener\"\n class={`collection-card ${sensitive ? 'sensitive' : ''} ${size === 'l' ? 'large' : ''}`}\n lang={language || undefined}\n onClick={(e) => {\n if (!id) return;\n // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n location.hash = `#${instance ? `/${instance}` : ''}/c/${id}`;\n }}\n >\n {!sensitive && accountItems.length > 0 && (\n <div class=\"collection-card-bg\" aria-hidden=\"true\">\n {bgAccounts.map((a) => (\n <img\n key={a.id}\n src={a.avatarStatic || a.avatar}\n alt=\"\"\n decoding=\"async\"\n loading=\"lazy\"\n />\n ))}\n </div>\n )}\n {items.length > 0 && (\n <div class=\"collection-accounts\">\n {sensitive ? (\n <>\n {Array.from({ length: visibleCount }, (_, i) => (\n <div key={i} class=\"avatar-placeholder\">\n {i === 0 && <Icon icon=\"alert\" />}\n </div>\n ))}\n </>\n ) : (\n Array.from({ length: visibleCount }, (_, i) => {\n const account = snapStates.accounts[selectedItems[i].accountId];\n return account ? (\n <Avatar\n key={account.id}\n url={account.avatarStatic || account.avatar}\n size=\"l\"\n alt={account.displayName || account.username || ''}\n squircle={account.bot}\n />\n ) : (\n <div key={selectedItems[i].accountId} class=\"avatar-spacer\" />\n );\n })\n )}\n {overflowCount > 0 && (\n <span class=\"account-overflow-count\">+{overflowCount}</span>\n )}\n </div>\n )}\n <div class=\"meta-container\">\n <p class=\"title\" dir=\"auto\">\n {name}\n </p>\n {!!description && (\n <p class=\"meta\" dir=\"auto\">\n {description}\n </p>\n )}\n {!!creator && (\n <p class=\"meta\" lang={i18n.locale} dir=\"auto\">\n <Trans>\n Collection by{' '}\n <span class=\"bidi-isolate\">\n @{ph({ username: creator.acct })}\n </span>\n </Trans>\n </p>\n )}\n {showMeta && (\n <p class=\"meta\" dir=\"auto\">\n {updatedAt && (\n <Trans>\n Last updated:{' '}\n <RelativeTime\n _t=\"relativeTime\"\n datetime={updatedAt}\n format=\"micro\"\n />\n </Trans>\n )}\n {discoverable === false && (\n <>\n {updatedAt && ' · '}\n <Trans>Unlisted</Trans>\n </>\n )}\n </p>\n )}\n </div>\n </a>\n );\n}\n\nexport default CollectionCard;\n","import { Children } from 'preact/compat';\nimport { useRef, useMemo } from 'preact/hooks';\nimport { useOnInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nexport default function LazyRender({\n as: Root = 'div',\n id,\n class: className,\n children,\n renderIfHasChildren = true,\n ...props\n}) {\n const rootRef = useRef(null);\n\n const hasChildren = useMemo(\n () => Children.toArray(children).filter((child) => !!child).length > 0,\n [children],\n );\n\n const observerRef = useOnInView(\n (inView, entry) => {\n if (!rootRef.current) return;\n const node = rootRef.current;\n if (inView) {\n console.log('💥', { id, root: node });\n node.classList.remove('hidden');\n } else if (entry.boundingClientRect.bottom <= TOP) {\n // Element is above the fold (already scrolled past)\n if (hasChildren && renderIfHasChildren) {\n // Don't need to observe if has children\n observerRef(null);\n // Debugging\n if (import.meta.env.DEV) {\n node.dataset.rectBottom = entry.boundingClientRect.bottom;\n }\n } else {\n node.classList.add('hidden');\n }\n }\n },\n {\n rootMargin: `-${TOP}px 0px 0px 0px`,\n triggerOnce: true,\n skip: !hasChildren,\n },\n );\n\n return (\n <Root\n {...props}\n ref={(node) => {\n rootRef.current = node;\n observerRef(node);\n }}\n class={`lazy-render ${className || ''}`}\n >\n {children}\n </Root>\n );\n}\n","import 'temml/dist/Temml-Local.css';\n\nimport { useLingui } from '@lingui/react/macro';\nimport { useCallback, useState } from 'preact/hooks';\n\nimport showToast from '../utils/show-toast';\n\nimport Icon from './icon';\n\n// Follow https://mathstodon.xyz/about\n// > You can use LaTeX in toots here! Use \\( and \\) for inline, and \\[ and \\] for display mode.\nconst DELIMITERS_PATTERNS = [\n // '\\\\$\\\\$[\\\\s\\\\S]*?\\\\$\\\\$', // $$...$$\n '\\\\\\\\\\\\[[\\\\s\\\\S]*?\\\\\\\\\\\\]', // \\[...\\]\n '\\\\\\\\\\\\([\\\\s\\\\S]*?\\\\\\\\\\\\)', // \\(...\\)\n // '\\\\\\\\begin\\\\{(?:equation\\\\*?|align\\\\*?|alignat\\\\*?|gather\\\\*?|CD)\\\\}[\\\\s\\\\S]*?\\\\\\\\end\\\\{(?:equation\\\\*?|align\\\\*?|alignat\\\\*?|gather\\\\*?|CD)\\\\}', // AMS environments\n // '\\\\\\\\(?:ref|eqref)\\\\{[^}]*\\\\}', // \\ref{...}, \\eqref{...}\n];\nconst DELIMITERS_REGEX = new RegExp(DELIMITERS_PATTERNS.join('|'), 'g');\n\nfunction cleanDOMForTemml(dom) {\n // Define start and end delimiter patterns\n const START_DELIMITERS = ['\\\\\\\\\\\\[', '\\\\\\\\\\\\(']; // \\[ and \\(\n const startRegex = new RegExp(`(${START_DELIMITERS.join('|')})`);\n\n // Walk through all text nodes\n const walker = document.createTreeWalker(dom, NodeFilter.SHOW_TEXT);\n const textNodes = [];\n let node;\n while ((node = walker.nextNode())) {\n textNodes.push(node);\n }\n\n for (const textNode of textNodes) {\n const text = textNode.textContent;\n const startMatch = text.match(startRegex);\n\n if (!startMatch) continue; // No start delimiter in this text node\n\n // Find the matching end delimiter\n const startDelimiter = startMatch[0];\n const endDelimiter = startDelimiter === '\\\\[' ? '\\\\]' : '\\\\)';\n\n // Collect nodes from start delimiter until end delimiter\n const nodesToCombine = [textNode];\n let currentNode = textNode;\n let foundEnd = false;\n let combinedText = text;\n\n // Check if end delimiter is in the same text node\n if (text.includes(endDelimiter)) {\n foundEnd = true;\n } else {\n // Look through sibling nodes\n while (currentNode.nextSibling && !foundEnd) {\n const nextSibling = currentNode.nextSibling;\n\n if (nextSibling.nodeType === Node.TEXT_NODE) {\n nodesToCombine.push(nextSibling);\n combinedText += nextSibling.textContent;\n if (nextSibling.textContent.includes(endDelimiter)) {\n foundEnd = true;\n }\n } else if (\n nextSibling.nodeType === Node.ELEMENT_NODE &&\n nextSibling.tagName === 'BR'\n ) {\n nodesToCombine.push(nextSibling);\n combinedText += '\\n';\n } else {\n // Found a non-BR element, stop and don't process\n break;\n }\n\n currentNode = nextSibling;\n }\n }\n\n // Only process if we found the end delimiter and have nodes to combine\n if (foundEnd && nodesToCombine.length > 1) {\n // Replace the first text node with combined text\n textNode.textContent = combinedText;\n\n // Remove the other nodes\n for (let i = 1; i < nodesToCombine.length; i++) {\n nodesToCombine[i].remove();\n }\n }\n }\n}\n\nconst MathBlock = ({ content, contentRef, onRevert }) => {\n DELIMITERS_REGEX.lastIndex = 0; // Reset index to prevent g trap\n const hasLatexContent = DELIMITERS_REGEX.test(content);\n\n if (!hasLatexContent) return null;\n\n const { t } = useLingui();\n const [mathRendered, setMathRendered] = useState(false);\n const toggleMathRendering = useCallback(\n async (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (mathRendered) {\n // Revert to original content by refreshing PostContent\n setMathRendered(false);\n onRevert();\n } else {\n // Render math\n try {\n // This needs global because the codebase inside temml is calling a function from global.temml 🤦‍♂️\n const temml =\n window.temml || (window.temml = (await import('temml'))?.default);\n\n cleanDOMForTemml(contentRef.current);\n const originalContentRefHTML = contentRef.current.innerHTML;\n temml.renderMathInElement(contentRef.current, {\n fences: '(', // This should sync with DELIMITERS_REGEX\n annotate: true,\n throwOnError: true,\n errorCallback: (err) => {\n console.warn('Failed to render LaTeX:', err);\n },\n });\n\n const hasMath = contentRef.current.querySelector('math');\n const htmlChanged =\n contentRef.current.innerHTML !== originalContentRefHTML;\n if (hasMath && htmlChanged) {\n setMathRendered(true);\n } else {\n showToast(t`Unable to format math`);\n setMathRendered(false);\n onRevert(); // Revert because DOM modified by cleanDOMForTemml\n }\n } catch (e) {\n console.error('Failed to LaTeX:', e);\n }\n }\n },\n [mathRendered],\n );\n\n return (\n <div class=\"math-block\">\n <Icon icon=\"formula\" size=\"s\" /> <span>{t`Math expressions found.`}</span>{' '}\n <button type=\"button\" class=\"light small\" onClick={toggleMathRendering}>\n {mathRendered\n ? t({\n comment:\n 'Action to switch from rendered math back to raw (LaTeX) markup',\n message: 'Show markup',\n })\n : t({\n comment:\n 'Action to render math expressions from raw (LaTeX) markup',\n message: 'Format math',\n })}\n </button>\n </div>\n );\n};\n\nexport default MathBlock;\n","const chars =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~';\nconst decode83 = (str, start, end) => {\n let value = 0;\n while (start < end) {\n value = value * 83 + chars.indexOf(str[start++]);\n }\n return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\n\nconst d = 3294.6;\nconst e = 269.025;\nconst sRGBToLinear = (value) =>\n value > 10.31475 ? pow(value / e + 0.052132, 2.4) : value / d;\n\nconst linearTosRGB = (v) =>\n ~~(v > 0.00001227 ? e * pow(v, 0.416666) - 13.025 : v * d + 1);\n\n// linear -> sRGB is by far the hottest part of decoding (3 conversions per\n// output pixel). The curve only depends on the linear value, so it is sampled\n// once over [0, 1] at module load into a lookup table and reused for every\n// pixel. Values outside [0, 1] clamp to the 0/255 ends like the exact formula.\nconst LUT_SIZE = 4096;\nconst sRGBLookup = new Uint8ClampedArray(LUT_SIZE + 1);\nfor (let i = 0; i <= LUT_SIZE; i++) {\n sRGBLookup[i] = linearTosRGB(i / LUT_SIZE);\n}\nconst fastLinearTosRGB = (v) =>\n v <= 0 ? 0 : v >= 1 ? 255 : sRGBLookup[(v * LUT_SIZE + 0.5) | 0];\n\nconst signSqr = (x) => (x < 0 ? -1 : 1) * x * x;\n\n/**\n * Fast approximate cosine implementation\n * Based on FTrig https://github.com/netcell/FTrig\n */\nconst fastCos = (x) => {\n for (x += PI / 2; x > PI; ) {\n x -= PI * 2;\n }\n const cos = 1.27323954 * x - 0.405284735 * signSqr(x);\n return 0.225 * (signSqr(cos) - cos) + cos;\n};\n\n/**\n * Extracts average color from BlurHash image\n * @param {string} blurHash BlurHash image string\n * @returns {[number, number, number]}\n */\nexport function getBlurHashAverageColor(blurHash) {\n const val = decode83(blurHash, 2, 6);\n return [val >> 16, (val >> 8) & 255, val & 255];\n}\n\n/**\n * Decodes BlurHash image\n * @param {string} blurHash BlurHash image string\n * @param {number} width Output image width\n * @param {number} height Output image height\n * @param {?number} punch\n * @returns {Uint8ClampedArray}\n */\nexport function decodeBlurHash(blurHash, width, height, punch) {\n const sizeFlag = decode83(blurHash, 0, 1);\n const numX = (sizeFlag % 9) + 1;\n const numY = ~~(sizeFlag / 9) + 1;\n const size = numX * numY;\n\n let i, j, x, y, r, g, b, basis, basisY, colorIndex, pixelIndex, value;\n\n const maximumValue = ((decode83(blurHash, 1, 2) + 1) / 13446) * (punch | 1);\n\n const colors = new Float64Array(size * 3);\n\n const averageColor = getBlurHashAverageColor(blurHash);\n for (i = 0; i < 3; i++) {\n colors[i] = sRGBToLinear(averageColor[i]);\n }\n\n for (i = 1; i < size; i++) {\n value = decode83(blurHash, 4 + i * 2, 6 + i * 2);\n colors[i * 3] = signSqr(~~(value / 361) - 9) * maximumValue;\n colors[i * 3 + 1] = signSqr((~~(value / 19) % 19) - 9) * maximumValue;\n colors[i * 3 + 2] = signSqr((value % 19) - 9) * maximumValue;\n }\n\n const cosinesY = new Float64Array(numY * height);\n const cosinesX = new Float64Array(numX * width);\n for (j = 0; j < numY; j++) {\n for (y = 0; y < height; y++) {\n cosinesY[j * height + y] = fastCos((PI * y * j) / height);\n }\n }\n for (i = 0; i < numX; i++) {\n for (x = 0; x < width; x++) {\n cosinesX[i * width + x] = fastCos((PI * x * i) / width);\n }\n }\n\n const bytesPerRow = width * 4;\n const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n // The inverse transform is separable, so it is computed in two passes per\n // row: first collapse the Y basis into per-X-basis color sums (`u`), then\n // collapse the X basis for each pixel. This turns the inner work from\n // O(numX * numY) per pixel into O(numX) per pixel.\n const u = new Float64Array(numX * 3);\n for (y = 0; y < height; y++) {\n for (i = 0; i < numX; i++) {\n r = g = b = 0;\n for (j = 0; j < numY; j++) {\n basisY = cosinesY[j * height + y];\n colorIndex = (i + j * numX) * 3;\n r += colors[colorIndex] * basisY;\n g += colors[colorIndex + 1] * basisY;\n b += colors[colorIndex + 2] * basisY;\n }\n u[i * 3] = r;\n u[i * 3 + 1] = g;\n u[i * 3 + 2] = b;\n }\n for (x = 0; x < width; x++) {\n r = g = b = 0;\n for (i = 0; i < numX; i++) {\n basis = cosinesX[i * width + x];\n colorIndex = i * 3;\n r += u[colorIndex] * basis;\n g += u[colorIndex + 1] * basis;\n b += u[colorIndex + 2] * basis;\n }\n\n pixelIndex = 4 * x + y * bytesPerRow;\n pixels[pixelIndex] = fastLinearTosRGB(r);\n pixels[pixelIndex + 1] = fastLinearTosRGB(g);\n pixels[pixelIndex + 2] = fastLinearTosRGB(b);\n pixels[pixelIndex + 3] = 255; // alpha\n }\n }\n return pixels;\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export var styleRoot = 'kvfysmfp';\nexport var styleChild = 'ufhsfnkm';\nexport var styles = \".\".concat(styleRoot, \"{overflow:hidden;touch-action:none}.\").concat(styleChild, \"{transform-origin: 0 0}\");\n","var isSsr = typeof window === 'undefined';\nexport var isTouch = function () {\n return !isSsr && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};\nexport var make2dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale(\".concat(scale, \") translate(\").concat(x, \"px, \").concat(y, \"px)\");\n};\nexport var make3dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale3d(\".concat(scale, \",\").concat(scale, \", 1) translate3d(\").concat(x, \"px, \").concat(y, \"px, 0)\");\n};\nexport var hasTranslate3DSupport = function () {\n var css = !isSsr && window.CSS;\n return css && css.supports && css.supports('transform', 'translate3d(0,0,0)');\n};\n","var min = Math.min, max = Math.max;\nexport function getOffsetBounds(_a) {\n var containerDimension = _a.containerDimension, childDimension = _a.childDimension, padding = _a.padding, centerContained = _a.centerContained;\n var diff = childDimension - containerDimension;\n if (diff + 2 * padding <= 0 && centerContained) {\n return [diff / 2, diff / 2];\n }\n else {\n return [min(diff + padding, 0) - padding, max(0, diff + padding)];\n }\n}\n","import { __assign, __extends } from \"tslib\";\nimport React, { Component, createRef, Children, cloneElement } from 'react';\nimport { styleRoot, styleChild, styles } from './styles.css';\nimport { isTouch } from '../utils';\nimport { getOffsetBounds } from './getOffsetBounds';\nvar classnames = function (base, other) {\n return other ? \"\".concat(base, \" \").concat(other) : base;\n};\nvar abs = Math.abs, min = Math.min, sqrt = Math.sqrt;\nvar isSsr = typeof window === 'undefined';\nvar isMac = isSsr ? false : /(Mac)/i.test(navigator.platform);\nvar isDragInteraction = function (i) { return i === 'drag'; };\nvar isZoomInteraction = function (i) { return i === 'zoom'; };\nvar isZoomGesture = function (wheelEvent) { return isMac && wheelEvent.ctrlKey; };\nvar cancelEvent = function (event) {\n event.stopPropagation();\n event.preventDefault();\n};\nvar getDistance = function (a, b) {\n var x = a.x - b.x;\n var y = a.y - b.y;\n return sqrt(x * x + y * y);\n};\nvar calculateScale = function (startTouches, endTouches) {\n var startDistance = getDistance(startTouches[0], startTouches[1]);\n var endDistance = getDistance(endTouches[0], endTouches[1]);\n return endDistance / startDistance;\n};\nvar isCloseTo = function (value, expected) {\n return value > expected - 0.01 && value < expected + 0.01;\n};\nvar swing = function (p) { return -Math.cos(p * Math.PI) / 2 + 0.5; };\nvar getPointByPageCoordinates = function (touch) { return ({\n x: touch.pageX,\n y: touch.pageY,\n}); };\nvar getPageCoordinatesByTouches = function (touches) {\n return Array.from(touches).map(getPointByPageCoordinates);\n};\nvar sum = function (a, b) { return a + b; };\nvar getVectorAvg = function (vectors) { return ({\n x: vectors.map(function (_a) {\n var x = _a.x;\n return x;\n }).reduce(sum, 0) / vectors.length,\n y: vectors.map(function (_a) {\n var y = _a.y;\n return y;\n }).reduce(sum, 0) / vectors.length,\n}); };\nvar clamp = function (min, max, value) {\n return value < min ? min : value > max ? max : value;\n};\nvar shouldInterceptWheel = function (event) {\n return !(event.ctrlKey || event.metaKey);\n};\nvar getElementSize = function (element) {\n if (element) {\n var offsetWidth = element.offsetWidth, offsetHeight = element.offsetHeight;\n // Any DOMElement\n if (offsetWidth && offsetHeight) {\n return { width: offsetWidth, height: offsetHeight };\n }\n // Svg support\n var style = getComputedStyle(element);\n var width = parseFloat(style.width);\n var height = parseFloat(style.height);\n if (height && width) {\n return { width: width, height: height };\n }\n }\n return { width: 0, height: 0 };\n};\nvar calculateVelocity = function (startPoint, endPoint) { return ({\n x: endPoint.x - startPoint.x,\n y: endPoint.y - startPoint.y,\n}); };\nvar comparePoints = function (p1, p2) { return p1.x === p2.x && p1.y === p2.y; };\nvar noup = function () { };\nvar zeroPoint = { x: 0, y: 0 };\nvar PinchZoom = /** @class */ (function (_super) {\n __extends(PinchZoom, _super);\n function PinchZoom() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this._prevDragMovePoint = null;\n _this._containerObserver = null;\n _this._fingers = 0;\n _this._firstMove = true;\n _this._initialOffset = __assign({}, zeroPoint);\n _this._interaction = null;\n _this._isDoubleTap = false;\n _this._isOffsetsSet = false;\n _this._lastDragPosition = null;\n _this._lastScale = 1;\n _this._lastTouchStart = 0;\n _this._lastZoomCenter = null;\n _this._listenMouseMove = false;\n _this._nthZoom = 0;\n _this._offset = __assign({}, zeroPoint);\n _this._startOffset = __assign({}, zeroPoint);\n _this._startTouches = null;\n _this._updatePlaned = false;\n _this._wheelTimeOut = null;\n _this._zoomFactor = 1;\n _this._initialZoomFactor = 1;\n _this._draggingPoint = __assign({}, zeroPoint);\n // It help reduce behavior difference between touch and mouse events\n _this._ignoreNextClick = false;\n // @ts-ignore\n _this._containerRef = createRef();\n _this._handleClick = function (clickEvent) {\n if (_this._ignoreNextClick) {\n _this._ignoreNextClick = false;\n clickEvent.stopPropagation();\n }\n };\n _this._onResize = function () {\n var _a;\n if ((_a = _this._containerRef) === null || _a === void 0 ? void 0 : _a.current) {\n _this._updateInitialZoomFactor();\n _this._setupOffsets();\n _this._update();\n }\n };\n _this._handlerOnTouchEnd = _this._handlerIfEnable(function (touchEndEvent) {\n _this._fingers = touchEndEvent.touches.length;\n if (_this.props.shouldCancelHandledTouchEndEvents &&\n (isZoomInteraction(_this._interaction) ||\n (isDragInteraction(_this._interaction) &&\n (_this._startOffset.x !== _this._offset.x ||\n _this._startOffset.y !== _this._offset.y)))) {\n cancelEvent(touchEndEvent);\n }\n if (isDragInteraction(_this._interaction) && !_this._enoughToDrag()) {\n _this._handleClick(touchEndEvent);\n }\n _this._updateInteraction(touchEndEvent);\n });\n _this._handlerOnTouchStart = _this._handlerIfEnable(function (touchStartEvent) {\n _this._firstMove = true;\n _this._fingers = touchStartEvent.touches.length;\n _this._detectDoubleTap(touchStartEvent);\n });\n _this._handlerOnTouchMove = _this._handlerIfEnable(function (touchMoveEvent) {\n if (_this._isDoubleTap) {\n return;\n }\n _this._collectInertia(touchMoveEvent);\n if (_this._firstMove) {\n _this._updateInteraction(touchMoveEvent);\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n }\n _this._startOffset = __assign({}, _this._offset);\n _this._startTouches = getPageCoordinatesByTouches(touchMoveEvent.touches);\n }\n else {\n if (isZoomInteraction(_this._interaction)) {\n if (_this._startTouches &&\n _this._startTouches.length === 2 &&\n touchMoveEvent.touches.length === 2) {\n _this._handleZoom(touchMoveEvent, calculateScale(_this._startTouches, getPageCoordinatesByTouches(touchMoveEvent.touches)));\n }\n }\n else if (isDragInteraction(_this._interaction)) {\n _this._handleDrag(touchMoveEvent);\n }\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n _this._update();\n }\n }\n _this._firstMove = false;\n });\n _this._handlerWheel = function (wheelEvent) {\n if (_this.props.shouldInterceptWheel(wheelEvent)) {\n return;\n }\n cancelEvent(wheelEvent);\n var pageX = wheelEvent.pageX, pageY = wheelEvent.pageY, deltaY = wheelEvent.deltaY, deltaMode = wheelEvent.deltaMode;\n var scaleDelta = 1;\n if (isZoomGesture(wheelEvent) || deltaMode === 1) {\n scaleDelta = 15;\n }\n var likeTouchEvent = {\n touches: [\n // @ts-ignore\n { pageX: pageX, pageY: pageY },\n ],\n };\n var center = _this._getOffsetByFirstTouch(likeTouchEvent);\n var dScale = deltaY * scaleDelta;\n _this._stopAnimation();\n _this._scaleTo(_this._zoomFactor - dScale / _this.props.wheelScaleFactor, center);\n _this._update();\n clearTimeout(\n // @ts-ignore\n _this._wheelTimeOut);\n _this._wheelTimeOut = setTimeout(function () { return _this._sanitize(); }, 100);\n };\n // @ts-ignore\n _this._handlers = _this.props.isTouch()\n ? [\n ['touchstart', _this._handlerOnTouchStart],\n ['touchend', _this._handlerOnTouchEnd],\n ['touchmove', _this._handlerOnTouchMove],\n ]\n : [\n [\n 'mousemove',\n _this.simulate(_this._handlerOnTouchMove),\n _this.props._document,\n ],\n [\n 'mouseup',\n _this.simulate(_this._handlerOnTouchEnd),\n _this.props._document,\n ],\n ['mousedown', _this.simulate(_this._handlerOnTouchStart)],\n ['click', _this._handleClick],\n ['wheel', _this._handlerWheel],\n ];\n return _this;\n }\n PinchZoom.prototype._handleDragStart = function (event) {\n this._ignoreNextClick = true;\n this.props.onDragStart();\n this._stopAnimation();\n this._resetInertia();\n this._lastDragPosition = null;\n this._hasInteraction = true;\n this._draggingPoint = this._offset;\n this._handleDrag(event);\n };\n PinchZoom.prototype._handleDrag = function (event) {\n var touch = this._getOffsetByFirstTouch(event);\n if (this._enoughToDrag()) {\n this._drag(touch, this._lastDragPosition);\n }\n else {\n this._virtualDrag(touch, this._lastDragPosition);\n }\n this._offset = this._sanitizeOffset(this._offset);\n this._lastDragPosition = touch;\n };\n PinchZoom.prototype._resetInertia = function () {\n this._velocity = null;\n this._prevDragMovePoint = null;\n };\n PinchZoom.prototype._realizeInertia = function () {\n var _this = this;\n var _a = this.props, inertiaFriction = _a.inertiaFriction, inertia = _a.inertia;\n if (!inertia || !this._velocity) {\n return;\n }\n var _b = this._velocity, x = _b.x, y = _b.y;\n if (x || y) {\n this._stopAnimation();\n this._resetInertia();\n var renderFrame = function () {\n x *= inertiaFriction;\n y *= inertiaFriction;\n if (!x && !y) {\n return _this._stopAnimation();\n }\n var prevOffset = __assign({}, _this._offset);\n _this._addOffset({ x: x, y: y });\n _this._offset = _this._sanitizeOffset(_this._offset);\n if (comparePoints(prevOffset, _this._offset)) {\n return _this._stopAnimation();\n }\n _this._update({ isAnimation: true });\n };\n this._animate(renderFrame, { duration: 9999 });\n }\n };\n PinchZoom.prototype._collectInertia = function (_a) {\n var touches = _a.touches;\n if (!this.props.inertia) {\n return;\n }\n var currentCoordinates = getPageCoordinatesByTouches(touches)[0];\n var prevPoint = this._prevDragMovePoint;\n if (prevPoint) {\n this._velocity = calculateVelocity(currentCoordinates, prevPoint);\n }\n this._prevDragMovePoint = currentCoordinates;\n };\n PinchZoom.prototype._handleDragEnd = function () {\n this.props.onDragEnd();\n this._end();\n this._realizeInertia();\n };\n PinchZoom.prototype._handleZoomStart = function () {\n this.props.onZoomStart();\n this._stopAnimation();\n this._lastScale = 1;\n this._nthZoom = 0;\n this._lastZoomCenter = null;\n this._hasInteraction = true;\n };\n PinchZoom.prototype._handleZoom = function (event, newScale) {\n var touchCenter = getVectorAvg(this._getOffsetTouches(event));\n var scale = newScale / this._lastScale;\n this._lastScale = newScale;\n // The first touch events are thrown away since they are not precise\n this._nthZoom += 1;\n if (this._nthZoom > 3) {\n this._scale(scale, touchCenter);\n this._drag(touchCenter, this._lastZoomCenter);\n if (this.props.enforceBoundsDuringZoom) {\n this._offset = this._sanitizeOffset(this._offset);\n }\n }\n this._lastZoomCenter = touchCenter;\n };\n PinchZoom.prototype._handleZoomEnd = function () {\n this.props.onZoomEnd();\n this._end();\n };\n PinchZoom.prototype._handleDoubleTap = function (event) {\n var _this = this;\n if (this._hasInteraction || this.props.tapZoomFactor === 0) {\n return;\n }\n var needZoomOut = (this.props.doubleTapZoomOutOnMaxScale &&\n this._zoomFactor === this.props.maxZoom) ||\n (this.props.doubleTapToggleZoom && this._zoomFactor > 1);\n this.props.onDoubleTap();\n this._ignoreNextClick = true;\n var zoomFactor = this._zoomFactor + this.props.tapZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var updateProgress = function (progress) {\n _this._scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);\n };\n var center = this._getOffsetByFirstTouch(event);\n this._isDoubleTap = true;\n if (startZoomFactor > zoomFactor) {\n center = this._getCurrentZoomCenter();\n }\n needZoomOut ? this._zoomOutAnimation() : this._animate(updateProgress);\n };\n PinchZoom.prototype._computeInitialOffset = function () {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var x = -abs(width * this._getInitialZoomFactor() - rect.width) / 2;\n var y = -abs(height * this._getInitialZoomFactor() - rect.height) / 2;\n this._initialOffset = { x: x, y: y };\n };\n PinchZoom.prototype._resetOffset = function () {\n this._offset = __assign({}, this._initialOffset);\n };\n PinchZoom.prototype._setupOffsets = function () {\n if (this.props.setOffsetsOnce && this._isOffsetsSet) {\n return;\n }\n this._isOffsetsSet = true;\n this._computeInitialOffset();\n this._resetOffset();\n };\n PinchZoom.prototype._sanitizeOffset = function (offset) {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var elWidth = width * this._getInitialZoomFactor() * this._zoomFactor;\n var elHeight = height * this._getInitialZoomFactor() * this._zoomFactor;\n var _b = getOffsetBounds({\n containerDimension: rect.width,\n childDimension: elWidth,\n padding: this.props.horizontalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetX = _b[0], maxOffsetX = _b[1];\n var _c = getOffsetBounds({\n containerDimension: rect.height,\n childDimension: elHeight,\n padding: this.props.verticalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetY = _c[0], maxOffsetY = _c[1];\n return {\n x: clamp(minOffsetX, maxOffsetX, offset.x),\n y: clamp(minOffsetY, maxOffsetY, offset.y),\n };\n };\n PinchZoom.prototype.alignCenter = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), __x = _a.x, __y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n // Bug-Fix: https://github.com/retyui/react-quick-pinch-zoom/issues/58\n var x = __x * this._initialZoomFactor;\n var y = __y * this._initialZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n var rect = this._getContainerRect();\n var containerCenter = { x: rect.width / 2, y: rect.height / 2 };\n this._zoomFactor = 1;\n this._offset = { x: -(containerCenter.x - x), y: -(containerCenter.y - y) };\n this._scaleTo(scale, containerCenter);\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = _this._sanitizeOffset({ x: x, y: y });\n _this._update();\n };\n this._animate(updateFrame, {\n callback: function () { return _this._sanitize(); },\n duration: duration,\n });\n };\n PinchZoom.prototype.scaleTo = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), x = _a.x, y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n this._zoomFactor = 1;\n this._offset = { x: 0, y: 0 };\n this._scaleTo(scale, { x: x, y: y });\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateFrame, { callback: function () { return _this._sanitize(); }, duration: duration });\n };\n PinchZoom.prototype._scaleTo = function (zoomFactor, center) {\n this._scale(zoomFactor / this._zoomFactor, center);\n this._offset = this._sanitizeOffset(this._offset);\n };\n PinchZoom.prototype._scale = function (scale, center) {\n scale = this._scaleZoomFactor(scale);\n this._addOffset({\n x: (scale - 1) * (center.x + this._offset.x),\n y: (scale - 1) * (center.y + this._offset.y),\n });\n this.props.onZoomUpdate();\n };\n PinchZoom.prototype._scaleZoomFactor = function (scale) {\n var originalZoomFactor = this._zoomFactor;\n this._zoomFactor *= scale;\n this._zoomFactor = clamp(this.props.minZoom, this.props.maxZoom, this._zoomFactor);\n return this._zoomFactor / originalZoomFactor;\n };\n PinchZoom.prototype._canDrag = function () {\n return this.props.draggableUnZoomed || !isCloseTo(this._zoomFactor, 1);\n };\n PinchZoom.prototype._drag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n if (!this.props.lockDragAxis) {\n this._addOffset({\n x: x,\n y: y,\n });\n }\n else {\n // lock scroll to position that was changed the most\n if (abs(x) > abs(y)) {\n this._addOffset({\n x: x,\n y: 0,\n });\n }\n else {\n this._addOffset({\n y: y,\n x: 0,\n });\n }\n }\n this.props.onDragUpdate();\n }\n };\n PinchZoom.prototype._virtualDrag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n this._draggingPoint = {\n x: x + this._draggingPoint.x,\n y: y + this._draggingPoint.y,\n };\n }\n };\n PinchZoom.prototype._addOffset = function (offset) {\n var _a = this._offset, x = _a.x, y = _a.y;\n this._offset = {\n x: x + offset.x,\n y: y + offset.y,\n };\n };\n PinchZoom.prototype._sanitize = function () {\n if (this._zoomFactor < this.props.zoomOutFactor) {\n this._resetInertia();\n this._zoomOutAnimation();\n }\n else if (this._isInsaneOffset()) {\n this._sanitizeOffsetAnimation();\n }\n };\n PinchZoom.prototype._isInsaneOffset = function () {\n var offset = this._offset;\n var sanitizedOffset = this._sanitizeOffset(offset);\n return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y;\n };\n PinchZoom.prototype._sanitizeOffsetAnimation = function () {\n var _this = this;\n var targetOffset = this._sanitizeOffset(this._offset);\n var startOffset = __assign({}, this._offset);\n var updateProgress = function (progress) {\n var x = startOffset.x + progress * (targetOffset.x - startOffset.x);\n var y = startOffset.y + progress * (targetOffset.y - startOffset.y);\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._zoomOutAnimation = function () {\n var _this = this;\n if (this._zoomFactor === 1) {\n return;\n }\n var startZoomFactor = this._zoomFactor;\n var zoomFactor = 1;\n var center = this._getCurrentZoomCenter();\n var updateProgress = function (progress) {\n var scaleFactor = startZoomFactor + progress * (zoomFactor - startZoomFactor);\n _this._scaleTo(scaleFactor, center);\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._getInitialZoomFactor = function () {\n return this._initialZoomFactor;\n };\n PinchZoom.prototype._getCurrentZoomCenter = function () {\n var _a = this._offset, x = _a.x, y = _a.y;\n var offsetLeft = x - this._initialOffset.x;\n var offsetTop = y - this._initialOffset.y;\n return {\n x: -1 * x - offsetLeft / (1 / this._zoomFactor - 1),\n y: -1 * y - offsetTop / (1 / this._zoomFactor - 1),\n };\n };\n PinchZoom.prototype._getOffsetByFirstTouch = function (event) {\n return this._getOffsetTouches(event)[0];\n };\n PinchZoom.prototype._getOffsetTouches = function (event) {\n var _document = this.props._document;\n var _html = _document.documentElement;\n var _body = _document.body;\n var _a = this._getContainerRect(), top = _a.top, left = _a.left;\n var scrollTop = _html.scrollTop || _body.scrollTop;\n var scrollLeft = _html.scrollLeft || _body.scrollLeft;\n var posTop = top + scrollTop;\n var posLeft = left + scrollLeft;\n return getPageCoordinatesByTouches(event.touches).map(function (_a) {\n var x = _a.x, y = _a.y;\n return ({\n x: x - posLeft,\n y: y - posTop,\n });\n });\n };\n PinchZoom.prototype._animate = function (frameFn, options) {\n var _this = this;\n var startTime = new Date().getTime();\n var _a = __assign({ timeFn: swing, callback: function () { }, duration: this.props.animationDuration }, options), timeFn = _a.timeFn, callback = _a.callback, duration = _a.duration;\n var renderFrame = function () {\n if (!_this._inAnimation) {\n return;\n }\n var frameTime = new Date().getTime() - startTime;\n var progress = frameTime / duration;\n if (frameTime >= duration) {\n frameFn(1);\n _this._stopAnimation();\n callback();\n _this._update();\n }\n else {\n progress = timeFn(progress);\n frameFn(progress);\n _this._update({ isAnimation: true });\n requestAnimationFrame(renderFrame);\n }\n };\n this._inAnimation = true;\n requestAnimationFrame(renderFrame);\n };\n PinchZoom.prototype._stopAnimation = function () {\n this._inAnimation = false;\n };\n PinchZoom.prototype._end = function () {\n this._hasInteraction = false;\n this._sanitize();\n this._update();\n };\n PinchZoom.prototype._getContainerRect = function () {\n var div = this._containerRef.current;\n return div.getBoundingClientRect();\n };\n PinchZoom.prototype._getChildSize = function () {\n var div = this._containerRef.current;\n return getElementSize(div === null || div === void 0 ? void 0 : div.firstElementChild);\n };\n PinchZoom.prototype._updateInitialZoomFactor = function () {\n var rect = this._getContainerRect();\n var size = this._getChildSize();\n var xZoomFactor = rect.width / size.width;\n var yZoomFactor = rect.height / size.height;\n this._initialZoomFactor = min(xZoomFactor, yZoomFactor);\n };\n PinchZoom.prototype._bindEvents = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (window.ResizeObserver) {\n this._containerObserver = new ResizeObserver(this._onResize);\n this._containerObserver.observe(div);\n }\n else {\n window.addEventListener('resize', this._onResize);\n }\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).addEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.addEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._unSubscribe = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (this._containerObserver) {\n this._containerObserver.disconnect();\n this._containerObserver = null;\n }\n window.removeEventListener('resize', this._onResize);\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).removeEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.removeEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._update = function (options) {\n var _this = this;\n if (this._updatePlaned) {\n return;\n }\n var updateFrame = function () {\n var scale = _this._getInitialZoomFactor() * _this._zoomFactor;\n var x = -_this._offset.x / scale;\n var y = -_this._offset.y / scale;\n _this.props.onUpdate({ scale: scale, x: x, y: y });\n };\n if (options === null || options === void 0 ? void 0 : options.isAnimation) {\n return updateFrame();\n }\n this._updatePlaned = true;\n requestAnimationFrame(function () {\n _this._updatePlaned = false;\n updateFrame();\n });\n };\n PinchZoom.prototype._handlerIfEnable = function (fn) {\n var _this = this;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (_this.props.enabled) {\n fn.apply(void 0, args);\n }\n };\n };\n PinchZoom.prototype._setInteraction = function (newInteraction, event) {\n var interaction = this._interaction;\n if (interaction !== newInteraction) {\n if (interaction && !newInteraction) {\n if (isZoomInteraction(interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(interaction)) {\n this._handleDragEnd();\n }\n }\n if (isZoomInteraction(newInteraction)) {\n this._handleZoomStart();\n }\n else if (isDragInteraction(newInteraction)) {\n this._handleDragStart(event);\n }\n }\n this._interaction = newInteraction;\n };\n PinchZoom.prototype._distanceBetweenNumbers = function (a, b) {\n return a > b ? a - b : b - a;\n };\n PinchZoom.prototype._enoughToDrag = function () {\n if (this._distanceBetweenNumbers(this._startOffset.x, this._draggingPoint.x) >\n 5 ||\n this._distanceBetweenNumbers(this._startOffset.y, this._draggingPoint.y) >\n 5)\n return true;\n return false;\n };\n PinchZoom.prototype._updateInteraction = function (event) {\n var fingers = this._fingers;\n if (fingers === 2) {\n return this._setInteraction('zoom', event);\n }\n if (fingers === 1 && this._canDrag()) {\n return this._setInteraction('drag', event);\n }\n this._setInteraction(null, event);\n };\n PinchZoom.prototype._detectDoubleTap = function (event) {\n var time = new Date().getTime();\n if (this._fingers > 1) {\n this._lastTouchStart = 0;\n }\n if (time - this._lastTouchStart < 300) {\n cancelEvent(event);\n this._handleDoubleTap(event);\n if (isZoomInteraction(this._interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(this._interaction)) {\n this._handleDragEnd();\n }\n }\n else {\n this._isDoubleTap = false;\n }\n if (this._fingers === 1) {\n this._lastTouchStart = time;\n }\n };\n PinchZoom.prototype.simulate = function (fn) {\n var _this = this;\n return function (mouseEvent) {\n var pageX = mouseEvent.pageX, pageY = mouseEvent.pageY, type = mouseEvent.type;\n var isEnd = type === 'mouseup';\n var isStart = type === 'mousedown';\n if (isStart) {\n mouseEvent.preventDefault();\n _this._listenMouseMove = true;\n }\n if (_this._listenMouseMove) {\n // @ts-ignore\n mouseEvent.touches = isEnd ? [] : [{ pageX: pageX, pageY: pageY }];\n fn(\n // @ts-ignore\n mouseEvent);\n }\n if (isEnd) {\n _this._listenMouseMove = false;\n }\n };\n };\n PinchZoom.prototype.componentDidMount = function () {\n this._bindEvents();\n this._update();\n };\n PinchZoom.prototype.componentWillUnmount = function () {\n this._stopAnimation();\n this._unSubscribe();\n };\n PinchZoom.prototype.render = function () {\n var _a = this.props, children = _a.children, containerProps = _a.containerProps, nonce = _a.nonce;\n var child = Children.only(children);\n var props = containerProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"style\", { nonce: nonce }, styles),\n React.createElement(\"div\", __assign({}, props, { ref: this._containerRef, className: classnames(styleRoot, props.className) }), cloneElement(child, {\n className: classnames(styleChild, child.props.className),\n }))));\n };\n PinchZoom.defaultProps = {\n animationDuration: 250,\n draggableUnZoomed: true,\n enforceBoundsDuringZoom: false,\n centerContained: false,\n enabled: true,\n inertia: true,\n inertiaFriction: 0.96,\n horizontalPadding: 0,\n isTouch: isTouch,\n lockDragAxis: false,\n maxZoom: 5,\n minZoom: 0.5,\n onDoubleTap: noup,\n onDragEnd: noup,\n onDragStart: noup,\n onDragUpdate: noup,\n onZoomEnd: noup,\n onZoomStart: noup,\n onZoomUpdate: noup,\n setOffsetsOnce: false,\n shouldInterceptWheel: shouldInterceptWheel,\n shouldCancelHandledTouchEndEvents: false,\n tapZoomFactor: 1,\n verticalPadding: 0,\n wheelScaleFactor: 1500,\n zoomOutFactor: 1.3,\n doubleTapZoomOutOnMaxScale: false,\n doubleTapToggleZoom: false,\n // @ts-expect-error\n _document: isSsr ? null : window.document,\n };\n return PinchZoom;\n}(Component));\nif (process.env.NODE_ENV !== 'production') {\n var _a = require('prop-types'), any = _a.any, element = _a.element, object = _a.object, number = _a.number, func = _a.func, bool = _a.bool, string = _a.string;\n // @ts-ignore\n PinchZoom.propTypes = {\n children: element,\n containerProps: object,\n wheelScaleFactor: number,\n animationDuration: number,\n draggableUnZoomed: bool,\n enforceBoundsDuringZoom: bool,\n centerContained: bool,\n enabled: bool,\n horizontalPadding: number,\n lockDragAxis: bool,\n nonce: string,\n onUpdate: func.isRequired,\n maxZoom: number,\n minZoom: number,\n onDoubleTap: func,\n onDragEnd: func,\n onDragStart: func,\n onDragUpdate: func,\n onZoomEnd: func,\n onZoomStart: func,\n onZoomUpdate: func,\n setOffsetsOnce: bool,\n tapZoomFactor: number,\n verticalPadding: number,\n zoomOutFactor: number,\n doubleTapZoomOutOnMaxScale: bool,\n doubleTapToggleZoom: bool,\n isTouch: func,\n _document: any,\n };\n}\nexport default PinchZoom;\n","import PinchZoomComp from './PinchZoom/component';\nexport default PinchZoomComp;\nexport { hasTranslate3DSupport, make2dTransformValue, make3dTransformValue, isTouch, } from './utils';\n","export default function formatDuration(time) {\n if (!time) return;\n let hours = Math.floor(time / 3600);\n let minutes = Math.floor((time % 3600) / 60);\n let seconds = Math.round(time % 60);\n\n if (hours === 0) {\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n } else {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n }\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom';\n\nimport formatDuration from '../utils/format-duration';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\n/*\nMedia type\n===\nunknown = unsupported or unrecognized file type\nimage = Static image\ngifv = Looping, soundless animation\nvideo = Video clip\naudio = Audio track\n*/\n\nconst dataAltLabel = 'ALT';\nconst AltBadge = (props) => {\n const { t } = useLingui();\n const { alt, lang, index, ...rest } = props;\n if (!alt || !alt.trim()) return null;\n return (\n <button\n type=\"button\"\n class=\"alt-badge clickable\"\n {...rest}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n states.showMediaAlt = {\n alt,\n lang,\n };\n }}\n title={t`Media description`}\n >\n {dataAltLabel}\n {!!index && <sup>{index}</sup>}\n </button>\n );\n};\n\nconst MEDIA_CAPTION_LIMIT = 140;\nconst MEDIA_CAPTION_LIMIT_LONGER = 280;\nexport const isMediaCaptionLong = mem((caption) =>\n caption?.length\n ? caption.length > MEDIA_CAPTION_LIMIT ||\n /[\\n\\r].*[\\n\\r]/.test(caption.trim())\n : false,\n);\n\n// https://caniuse.com/http-live-streaming\nconst isStreamingVideoSupported = (() => {\n try {\n const video = document.createElement('video');\n if (!video.canPlayType) return false;\n return (\n video.canPlayType('application/vnd.apple.mpegurl') !== '' ||\n video.canPlayType('application/x-mpegURL') !== '' ||\n video.canPlayType('audio/mpegurl') !== ''\n );\n } catch (e) {\n return false;\n }\n})();\n\nfunction Media({\n class: className = '',\n media,\n to,\n lang,\n showOriginal,\n autoAnimate,\n showCaption,\n allowLongerCaption,\n altIndex,\n checkAspectRatio = true,\n onClick,\n autoplay = false,\n}) {\n let {\n id,\n blurhash,\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n if (/no\\-preview\\./i.test(previewUrl)) {\n previewUrl = null;\n }\n const mediaVTN = getSafeViewTransitionName(id || blurhash || url);\n const { original = {}, small, focus } = meta || {};\n\n const width = showOriginal\n ? original?.width\n : small?.width || original?.width;\n const height = showOriginal\n ? original?.height\n : small?.height || original?.height;\n const mediaURL = showOriginal ? url : previewUrl || url;\n const remoteMediaURL = showOriginal\n ? remoteUrl\n : previewRemoteUrl || remoteUrl;\n\n const hasPreviewDimensions = small?.width && small?.height;\n const hasDimensions = width && height;\n const orientation = hasDimensions\n ? width > height\n ? 'landscape'\n : 'portrait'\n : null;\n\n const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null;\n\n const videoRef = useRef();\n\n let focalPosition;\n if (focus) {\n // Convert focal point to CSS background position\n // Formula from jquery-focuspoint\n // x = -1, y = 1 => 0% 0%\n // x = 0, y = 0 => 50% 50%\n // x = 1, y = -1 => 100% 100%\n const x = ((focus.x + 1) / 2) * 100;\n const y = ((1 - focus.y) / 2) * 100;\n focalPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`;\n }\n\n const mediaRef = useRef();\n const onUpdate = useCallback(({ x, y, scale }) => {\n const { current: media } = mediaRef;\n\n if (media) {\n const value = make3dTransformValue({ x, y, scale });\n\n if (scale === 1) {\n media.style.removeProperty('transform');\n } else {\n media.style.setProperty('transform', value);\n }\n\n media.closest('.media-zoom').style.touchAction =\n scale <= 1.01 ? 'pan-x' : '';\n }\n }, []);\n\n const [pinchZoomEnabled, setPinchZoomEnabled] = useState(false);\n const quickPinchZoomProps = {\n enabled: pinchZoomEnabled,\n draggableUnZoomed: false,\n inertiaFriction: 0.9,\n tapZoomFactor: 2,\n doubleTapToggleZoom: true,\n containerProps: {\n className: 'media-zoom',\n style: {\n overflow: 'visible',\n // width: 'inherit',\n // height: 'inherit',\n // justifyContent: 'inherit',\n // alignItems: 'inherit',\n // display: 'inherit',\n },\n },\n onUpdate,\n };\n\n const [mediaLoadError, setMediaLoadError] = useState(false);\n\n const Parent = useMemo(\n () =>\n to && !mediaLoadError ? (props) => <Link to={to} {...props} /> : 'div',\n [to, mediaLoadError],\n );\n\n const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null;\n const isVideoMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(remoteMediaURLObj.pathname);\n const isStreamingVideoMaybe =\n remoteMediaURLObj &&\n /\\.m3u8$/i.test(remoteMediaURLObj.pathname) &&\n isStreamingVideoSupported;\n const isAudioMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(remoteMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' &&\n previewUrl &&\n !isVideoMaybe &&\n !isStreamingVideoMaybe &&\n !isAudioMaybe);\n const isPreviewVideoMaybe =\n (previewUrl &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(getURLObj(previewUrl).pathname)) ||\n isStreamingVideoMaybe;\n\n const parentRef = useRef();\n const [imageSmallerThanParent, setImageSmallerThanParent] = useState(false);\n useLayoutEffect(() => {\n if (!isImage) return;\n if (!showOriginal) return;\n if (!parentRef.current) return;\n const { offsetWidth, offsetHeight } = parentRef.current;\n const smaller = width < offsetWidth && height < offsetHeight;\n if (smaller) setImageSmallerThanParent(smaller);\n }, [width, height]);\n\n const maxAspectHeight =\n window.innerHeight * (orientation === 'portrait' ? 0.45 : 0.33);\n const maxHeight = orientation === 'portrait' ? 0 : 160;\n const averageColorStyle = {\n '--average-color': rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n };\n const mediaStyles =\n width && height\n ? {\n '--width': `${width}px`,\n '--height': `${height}px`,\n // Calculate '--aspectWidth' based on aspect ratio calculated from '--width' and '--height', max height has to be 160px\n '--aspectWidth': `${\n (width / height) * Math.max(maxHeight, maxAspectHeight)\n }px`,\n aspectRatio: `${width} / ${height}`,\n ...averageColorStyle,\n }\n : {\n ...averageColorStyle,\n };\n\n const longDesc = isMediaCaptionLong(description);\n let showInlineDesc =\n !!showCaption && !showOriginal && !!description && !longDesc;\n if (\n allowLongerCaption &&\n !showInlineDesc &&\n description?.length <= MEDIA_CAPTION_LIMIT_LONGER\n ) {\n showInlineDesc = true;\n }\n const Figure = !showInlineDesc\n ? Fragment\n : (props) => {\n const { children, ...restProps } = props;\n return (\n <figure {...restProps}>\n {children}\n <figcaption\n class=\"media-caption\"\n lang={lang}\n dir=\"auto\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: description,\n lang,\n };\n }}\n >\n {description}\n </figcaption>\n </figure>\n );\n };\n\n const postViewState = () =>\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? 'large'\n : 'small';\n const interceptOnClick = useCallback(\n (e) => {\n const isOnPostPage = e.target.closest('.status-deck');\n if (\n showOriginal ||\n (postViewState() === 'large' && isOnPostPage) ||\n !document.startViewTransition\n ) {\n onClick?.(e);\n return;\n }\n const el =\n e.target.closest('[data-view-transition-name]') ||\n e.target.querySelector('[data-view-transition-name]');\n if (el) {\n // BUG: both link and onClick is triggered at the same time\n // Temporarily disable view transition if has onClick\n // Detecting preventDefault for an onClick has to happen before view transition but it's only possible after click, and this mean the link is already clicked even before we know it's default prevented.\n if (onClick) {\n onClick(e);\n } else {\n e.preventDefault();\n if (el.dataset.viewTransitioned) {\n el.style.viewTransitionName = mediaVTN;\n try {\n document.startViewTransition(() => {\n el.style.viewTransitionName = '';\n location.hash = `#${to}`;\n });\n } catch (e) {\n console.error(e);\n el.style.viewTransitionName = '';\n location.hash = `#${to}`;\n }\n } else {\n location.hash = `#${to}`;\n }\n }\n } else {\n onClick?.(e);\n }\n },\n [mediaVTN, showOriginal, onClick],\n );\n\n // Prevent media session lingering after unmount\n useEffect(() => {\n return () => {\n const mediaElements =\n parentRef.current?.querySelectorAll?.('video, audio');\n if (mediaElements) {\n mediaElements.forEach((el) => {\n try {\n el.pause();\n el.src = '';\n el.load();\n } catch (e) {}\n });\n }\n if ('mediaSession' in navigator) {\n navigator.mediaSession.playbackState = 'none';\n }\n };\n }, []);\n\n if (isImage) {\n // Note: type: unknown might not have width/height\n quickPinchZoomProps.containerProps.style.display = 'inherit';\n\n useLayoutEffect(() => {\n if (!isSafari) return;\n if (!showOriginal) return;\n (async () => {\n try {\n await fetch(mediaURL, { mode: 'no-cors' });\n mediaRef.current.src = mediaURL;\n } catch (e) {\n // Ignore\n }\n })();\n }, [mediaURL]);\n\n return (\n <Figure>\n <Parent\n ref={parentRef}\n class={`media media-image ${className}`}\n onClick={interceptOnClick}\n data-orientation={orientation}\n data-has-alt={!showInlineDesc || undefined}\n style={\n showOriginal\n ? {\n backgroundImage: `url(${previewUrl})`,\n '--bg-image': `url(${previewUrl})`,\n backgroundSize: imageSmallerThanParent\n ? `${width}px ${height}px`\n : undefined,\n ...averageColorStyle,\n }\n : mediaStyles\n }\n >\n {showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps}>\n <img\n ref={mediaRef}\n src={mediaURL}\n alt={description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"eager\"\n decoding=\"sync\"\n style={{\n 'view-transition-name': mediaVTN,\n }}\n onLoad={(e) => {\n const el = e.target;\n const mediaImage = el.closest('.media-image');\n if (mediaImage) {\n mediaImage.style.backgroundImage = `url(${el.src})`;\n mediaImage.style.removeProperty('--bg-image');\n }\n el.closest('.media-zoom').style.display = '';\n setPinchZoomEnabled(true);\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n </QuickPinchZoom>\n ) : (\n <>\n <img\n src={mediaURL}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n data-view-transition-name={mediaVTN}\n style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // backgroundPosition: focalBackgroundPosition || 'center',\n // Duration based on width or height in pixels\n objectPosition: focalPosition || 'center',\n // 100px per second (rough estimate)\n // Clamp between 5s and 120s\n '--anim-duration': `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n onLoad={(e) => {\n // e.target.closest('.media-image').style.backgroundImage = '';\n e.target.dataset.loaded = true;\n const $media = e.target.closest('.media');\n if (!hasPreviewDimensions && $media) {\n const { naturalWidth, naturalHeight } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight ? 'landscape' : 'portrait';\n $media.style.setProperty('--width', `${naturalWidth}px`);\n $media.style.setProperty('--height', `${naturalHeight}px`);\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n\n // Check natural aspect ratio vs display aspect ratio\n if (checkAspectRatio && $media) {\n const { target } = e;\n setTimeout(() => {\n const {\n clientWidth,\n clientHeight,\n naturalWidth,\n naturalHeight,\n } = target;\n if (\n clientWidth &&\n clientHeight &&\n naturalWidth &&\n naturalHeight\n ) {\n const minDimension = 88;\n if (\n naturalWidth < minDimension ||\n naturalHeight < minDimension\n ) {\n $media.dataset.hasSmallDimension = true;\n } else {\n const displayNaturalHeight =\n (naturalHeight * clientWidth) / naturalWidth;\n const almostSimilarHeight =\n Math.abs(displayNaturalHeight - clientHeight) < 5;\n\n if (almostSimilarHeight) {\n const $mediaParent = $media.closest('.media');\n if ($mediaParent) {\n $mediaParent.dataset.hasNaturalAspectRatio = true;\n }\n }\n }\n }\n }, 300);\n }\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n } else {\n setMediaLoadError(true);\n }\n }}\n />\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n {mediaLoadError && (\n <div>\n <a href={remoteUrl} class=\"button plain6 small\" target=\"_blank\">\n <Icon icon=\"external\" />{' '}\n <span>\n <Trans>Open file</Trans>\n </span>\n </a>\n </div>\n )}\n </Figure>\n );\n } else if (\n type === 'gifv' ||\n type === 'video' ||\n isVideoMaybe ||\n isStreamingVideoMaybe\n ) {\n const hasDuration = original.duration > 0;\n const shortDuration = original.duration < 31;\n const isGIF = type === 'gifv' && shortDuration;\n // If GIF is too long, treat it as a video\n const loopable = original.duration < 61;\n const formattedDuration = formatDuration(original.duration);\n const hoverAnimate = !showOriginal && !autoAnimate && isGIF;\n const autoGIFAnimate = !showOriginal && autoAnimate && isGIF;\n const showProgress = original.duration > 5;\n\n // This string is only for autoplay + muted to work on Mobile Safari\n const gifHTML = `\n <video\n src=\"${url}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n style=\"view-transition-name: ${mediaVTN}\"\n preload=\"auto\"\n autoplay\n muted\n playsinline\n ${loopable ? 'loop' : ''}\n ondblclick=\"this.paused ? this.play() : this.pause()\"\n ${\n showProgress\n ? \"ontimeupdate=\\\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\\\"\"\n : ''\n }\n ></video>\n `;\n\n const videoURL = isStreamingVideoMaybe ? remoteMediaURL : url;\n const videoHTML = `\n <video\n src=\"${videoURL}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n style=\"view-transition-name: ${mediaVTN}\"\n preload=\"auto\"\n ${autoplay ? 'autoplay' : ''}\n playsinline\n ${loopable ? 'loop' : ''}\n controls\n ></video>\n `;\n\n return (\n <Figure>\n <Parent\n ref={parentRef}\n class={`media ${className} media-${isGIF ? 'gif' : 'video'} ${\n autoGIFAnimate ? 'media-contain' : ''\n } ${hoverAnimate ? 'media-hover-animate' : ''}`}\n data-orientation={orientation}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-label={\n isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n // style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // }}\n style={!showOriginal && mediaStyles}\n onClick={(e) => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n interceptOnClick(e);\n }}\n onMouseEnter={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onMouseLeave={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n onFocus={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onBlur={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n >\n {showOriginal || autoGIFAnimate ? (\n isGIF && showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps} enabled>\n <div\n ref={mediaRef}\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n </QuickPinchZoom>\n ) : isGIF ? (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n ) : (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{ __html: videoHTML }}\n />\n )\n ) : isGIF ? (\n <video\n ref={videoRef}\n src={url}\n poster={previewUrl}\n width={width}\n height={height}\n data-orientation={orientation}\n data-view-transition-name={mediaVTN}\n preload=\"auto\"\n // controls\n playsinline\n loop\n muted\n onTimeUpdate={\n showProgress\n ? (e) => {\n const { target } = e;\n const container = target?.closest('.media-gif');\n if (container) {\n const percentage =\n (target.currentTime / target.duration) * 100;\n container.style.setProperty(\n '--progress',\n `${percentage}%`,\n );\n }\n }\n : undefined\n }\n />\n ) : (\n <>\n {previewUrl && !isPreviewVideoMaybe ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n decoding=\"async\"\n data-view-transition-name={mediaVTN}\n onLoad={(e) => {\n if (!hasPreviewDimensions) {\n const $media = e.target.closest('.media');\n if ($media) {\n const { naturalHeight, naturalWidth } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight\n ? 'landscape'\n : 'portrait';\n $media.style.setProperty(\n '--width',\n `${naturalWidth}px`,\n );\n $media.style.setProperty(\n '--height',\n `${naturalHeight}px`,\n );\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n }\n }}\n />\n ) : (\n <video\n src={videoURL + '#t=0.1'} // Make Safari show 1st-frame preview\n width={width}\n height={height}\n data-orientation={orientation}\n data-view-transition-name={mediaVTN}\n preload=\"metadata\"\n muted\n disablePictureInPicture\n onLoadedMetadata={(e) => {\n if (!hasDuration) {\n const { duration } = e.target;\n if (duration) {\n const formattedDuration = formatDuration(duration);\n const container = e.target.closest('.media-video');\n if (container) {\n container.dataset.formattedDuration =\n formattedDuration;\n }\n }\n }\n }}\n />\n )}\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n </>\n )}\n {!showOriginal && !showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </Parent>\n </Figure>\n );\n } else if (type === 'audio' || isAudioMaybe) {\n const formattedDuration = formatDuration(original.duration);\n return (\n <Figure>\n <Parent\n class={`media media-audio ${className}`}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n onClick={onClick}\n style={!showOriginal && mediaStyles}\n >\n {showOriginal ? (\n previewUrl ? (\n <video\n src={(remoteUrl || url) + '#t=0.1'}\n width={width}\n height={height}\n data-orientation={orientation}\n poster={previewUrl}\n style={{\n background: `url(${previewUrl}) center/cover`,\n aspectRatio: `${width}/${height}`,\n }}\n preload=\"metadata\"\n controls\n controlsList=\"nofullscreen\"\n autoPlay={autoplay}\n playsInline\n />\n ) : (\n <audio\n src={remoteUrl || url}\n preload=\"none\"\n controls\n autoPlay={autoplay}\n />\n )\n ) : previewUrl ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n onError={(e) => {\n try {\n // Remove self if broken\n e.target?.remove?.();\n } catch (e) {}\n }}\n />\n ) : null}\n {!showOriginal && (\n <>\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n </Figure>\n );\n }\n}\n\nfunction getURLObj(url) {\n // Fake base URL if url doesn't have https:// prefix\n return URL.parse(url, location.origin);\n}\n\nexport function getSafeViewTransitionName(inputString) {\n // Replace any character that is not a letter, number, hyphen, or underscore with a hyphen.\n let safeName = inputString.replace(/[^a-zA-Z0-9_-]/g, '-');\n\n // Ensure it starts with a letter, underscore, or two hyphens (to prevent starting with a number or single hyphen).\n // This covers edge cases where the original string might start with an invalid character after replacement.\n if (safeName.match(/^[0-9-]/)) {\n safeName = 'vt-' + safeName;\n }\n\n return safeName;\n}\n\nexport default memo(Media, (oldProps, newProps) => {\n const oldMedia = oldProps.media || {};\n const newMedia = newProps.media || {};\n\n return (\n oldMedia?.id === newMedia?.id &&\n oldMedia.url === newMedia.url &&\n oldProps.to === newProps.to &&\n oldProps.class === newProps.class\n );\n});\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\n\nimport Icon from './icon';\nimport Media from './media';\n\nfunction MediaFirstContainer(props) {\n const { mediaAttachments, language, postID, instance } = props;\n const moreThanOne = mediaAttachments.length > 1;\n\n const carouselRef = useRef();\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return (\n <>\n <div class=\"media-first-container\">\n <div class=\"media-first-carousel\" ref={carouselRef}>\n {mediaAttachments.map((media, i) => (\n <div class=\"media-first-item\" key={media.id}>\n <Media\n media={media}\n lang={language}\n to={`/${instance}/s/${postID}?media=${i + 1}`}\n />\n </div>\n ))}\n </div>\n {moreThanOne && (\n <div class=\"media-carousel-controls\">\n <div class=\"carousel-indexer\">\n {currentIndex + 1}/{mediaAttachments.length}\n </div>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" />\n </button>\n </label>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" />\n </button>\n </label>\n </div>\n )}\n </div>\n {moreThanOne && (\n <div\n class=\"media-carousel-dots\"\n style={{\n '--dots-count': mediaAttachments.length,\n }}\n >\n {mediaAttachments.map((media, i) => (\n <span\n key={media.id}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n\nexport default MediaFirstContainer;\n","function MultipleMediaFigure(props) {\n const { enabled, children, lang, captionChildren } = props;\n if (!enabled || !captionChildren) return children;\n return (\n <figure class=\"media-figure-multiple\">\n {children}\n <figcaption lang={lang} dir=\"auto\">\n {captionChildren}\n </figcaption>\n </figure>\n );\n}\n\nexport default MultipleMediaFigure;\n","import { i18n } from '@lingui/core';\nimport { plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport haptics from '../utils/haptics';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport useTruncated from '../utils/useTruncated';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nconst POLL_OPTIONS_BATCH_SIZE = 40;\n\nexport default function Poll({\n poll,\n lang,\n readOnly,\n refresh = () => {},\n votePoll = () => {},\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [visibleOptionsCount, setVisibleOptionsCount] = useState(\n POLL_OPTIONS_BATCH_SIZE,\n );\n const loadMoreRef = useRef(null);\n const {\n expired,\n expiresAt,\n id,\n multiple,\n options,\n ownVotes,\n voted,\n votersCount,\n votesCount = 0,\n emojis,\n } = poll;\n const expiresAtDate = !!expiresAt && new Date(expiresAt); // Update poll at point of expiry\n // NOTE: Disable this because setTimeout runs immediately if delay is too large\n // https://stackoverflow.com/a/56718027/20838\n // useEffect(() => {\n // let timeout;\n // if (!expired && expiresAtDate) {\n // const ms = expiresAtDate.getTime() - Date.now() + 1; // +1 to give it a little buffer\n // if (ms > 0) {\n // timeout = setTimeout(() => {\n // setUIState('loading');\n // (async () => {\n // // await refresh();\n // setUIState('default');\n // })();\n // }, ms);\n // }\n // }\n // return () => {\n // clearTimeout(timeout);\n // };\n // }, [expired, expiresAtDate]);\n\n const pollVotesCount = multiple ? votersCount || votesCount : votesCount;\n let roundPrecision = 0;\n\n if (pollVotesCount <= 1000) {\n roundPrecision = 0;\n } else if (pollVotesCount <= 10000) {\n roundPrecision = 1;\n } else if (pollVotesCount <= 100000) {\n roundPrecision = 2;\n }\n\n const [showResults, setShowResults] = useState(false);\n const optionsHaveVoteCounts = options.every((o) => o.votesCount !== null);\n\n const resultsView =\n (showResults && optionsHaveVoteCounts) || voted || expired;\n const [selectedOptions, setSelectedOptions] = useState(multiple ? [] : null);\n\n useEffect(() => {\n if (!loadMoreRef.current) return;\n if (visibleOptionsCount >= options.length) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n setVisibleOptionsCount((prev) =>\n Math.min(prev + POLL_OPTIONS_BATCH_SIZE, options.length),\n );\n }\n },\n { threshold: 0.1 },\n );\n\n observer.observe(loadMoreRef.current);\n\n return () => observer.disconnect();\n }, [visibleOptionsCount, options.length]);\n\n useEffect(() => {\n setVisibleOptionsCount(POLL_OPTIONS_BATCH_SIZE);\n }, [resultsView, options.length]);\n\n const voteOptionsSelectionCount = multiple\n ? selectedOptions.length\n : selectedOptions !== null\n ? 1\n : 0;\n const [showPollInfo, setShowPollInfo] = useState(false);\n const ref = useTruncated({\n onTruncated: setShowPollInfo,\n });\n\n return (\n <div\n lang={lang}\n dir=\"auto\"\n class={`poll ${readOnly ? 'read-only' : ''} ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {resultsView ? (\n <>\n <div class=\"poll-options\" ref={ref}>\n {options.slice(0, visibleOptionsCount).map((option, i) => {\n const { title, votesCount: optionVotesCount } = option;\n const ratio = pollVotesCount\n ? optionVotesCount / pollVotesCount\n : 0;\n const percentage = ratio\n ? ratio.toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n maximumFractionDigits: roundPrecision,\n })\n : '0%';\n\n const isLeading =\n optionVotesCount > 0 &&\n optionVotesCount ===\n Math.max(...options.map((o) => o.votesCount));\n return (\n <div\n key={`${i}-${title}`}\n class={`poll-option poll-result ${\n isLeading ? 'poll-option-leading' : ''\n }`}\n style={{\n '--percentage': `${ratio * 100}%`,\n }}\n >\n <div class=\"poll-option-title\">\n <span>\n <EmojiText text={title} emojis={emojis} />\n </span>\n </div>\n <div\n class=\"poll-option-votes\"\n title={plural(optionVotesCount, {\n one: `# vote`,\n other: `# votes`,\n })}\n >\n {voted && ownVotes.includes(i) && (\n <>\n <Icon icon=\"check-circle\" alt={t`Voted`} />{' '}\n </>\n )}\n <span class=\"poll-option-votes-percentage\">\n {percentage}\n </span>\n </div>\n </div>\n );\n })}\n {visibleOptionsCount < options.length && (\n <div ref={loadMoreRef} style={{ minHeight: '1em' }} />\n )}\n </div>\n {!expired && !voted && (\n <div class=\"poll-actions\">\n <button\n class=\"poll-hide-results-button plain2\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(false);\n }}\n >\n <Icon icon=\"arrow-left\" size=\"s\" /> <Trans>Hide results</Trans>\n </button>{' '}\n <div class=\"poll-info\">\n {showPollInfo && (\n <small class=\"insignificant\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </small>\n )}\n </div>\n </div>\n )}\n </>\n ) : (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const choices = multiple\n ? selectedOptions\n : selectedOptions !== null\n ? [selectedOptions]\n : [];\n if (!choices.length) return;\n setUIState('loading');\n try {\n await votePoll(choices);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to vote in poll`);\n } finally {\n setUIState('default');\n }\n }}\n >\n <div class=\"poll-options\" ref={ref}>\n {options.slice(0, visibleOptionsCount).map((option, i) => {\n const { title } = option;\n const isSelected = multiple\n ? selectedOptions.includes(i)\n : selectedOptions === i;\n return (\n <div class=\"poll-option\" key={`${i}-${title}`}>\n <label class=\"poll-label\">\n <input\n type={multiple ? 'checkbox' : 'radio'}\n name=\"poll\"\n value={i}\n disabled={uiState === 'loading'}\n readOnly={readOnly}\n checked={isSelected}\n onChange={(e) => {\n const value = i;\n if (multiple) {\n setSelectedOptions((prev) =>\n e.target.checked\n ? [...prev, value]\n : prev.filter((v) => v !== value),\n );\n } else {\n setSelectedOptions(value);\n }\n }}\n />\n <span class=\"poll-option-title\">\n <EmojiText text={title} emojis={emojis} />\n </span>\n </label>\n </div>\n );\n })}\n {visibleOptionsCount < options.length && (\n <div ref={loadMoreRef} style={{ minHeight: '1em' }} />\n )}\n </div>\n <div class=\"poll-actions\">\n <button\n class=\"poll-vote-button\"\n type=\"submit\"\n disabled={\n readOnly ||\n uiState === 'loading' ||\n voteOptionsSelectionCount === 0\n }\n onClick={() => haptics.trigger('medium')}\n >\n <Trans>Vote</Trans>\n </button>{' '}\n <div class=\"poll-info\">\n {showPollInfo &&\n (multiple && voteOptionsSelectionCount > 0 ? (\n <small>\n {voteOptionsSelectionCount}{' '}\n <span class=\"insignificant\">/ {options.length}</span>\n </small>\n ) : (\n <small class=\"insignificant\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </small>\n ))}\n </div>\n </div>\n </form>\n )}\n <p class=\"poll-meta\">\n <span class=\"spacer\">\n {(expired || voted) && showPollInfo && (\n <>\n <span class=\"ib\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </span>{' '}\n &bull;{' '}\n </>\n )}\n <span class=\"ib\">\n <Plural\n value={votesCount}\n one={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span>{' '}\n vote\n </Trans>\n }\n other={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span>{' '}\n votes\n </Trans>\n }\n />\n </span>\n {!!votersCount && votersCount !== votesCount && (\n <>\n {' '}\n &bull;{' '}\n <span class=\"ib\">\n <Plural\n value={votersCount}\n one={\n <Trans>\n <span title={votersCount}>\n {shortenNumber(votersCount)}\n </span>{' '}\n voter\n </Trans>\n }\n other={\n <Trans>\n <span title={votersCount}>\n {shortenNumber(votersCount)}\n </span>{' '}\n voters\n </Trans>\n }\n />\n </span>\n </>\n )}{' '}\n &bull;{' '}\n {expired ? (\n !!expiresAtDate ? (\n <span class=\"ib\">\n <Trans>\n Ended <RelativeTime datetime={expiresAtDate} />\n </Trans>\n </span>\n ) : (\n t`Ended`\n )\n ) : !!expiresAtDate ? (\n <span class=\"ib\">\n <Trans>\n Ending <RelativeTime datetime={expiresAtDate} />\n </Trans>\n </span>\n ) : (\n t`Ending`\n )}\n </span>\n {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n <button\n type=\"button\"\n class=\"plain small poll-results-button\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(!showResults);\n }}\n title={showResults ? t`Hide results` : t`Show results`}\n >\n <Icon\n icon={showResults ? 'eye-open' : 'eye-close'}\n alt={showResults ? t`Hide results` : t`Show results`}\n />{' '}\n </button>\n )}\n {!expired && !readOnly && (\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setUIState('loading');\n\n (async () => {\n await refresh();\n setUIState('default');\n })();\n }}\n title={t`Refresh`}\n >\n <Icon icon=\"refresh\" alt={t`Refresh`} />\n </button>\n )}\n </p>\n </div>\n );\n}\n","import { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport enhanceContent from '../utils/enhance-content';\nimport handleContentLinks from '../utils/handle-content-links';\nimport states, { statusKey } from '../utils/states';\n\nconst HTTP_REGEX = /^http/i;\n\nconst PostContent =\n /*memo(*/\n ({ post, instance, previewMode }) => {\n const { content, emojis, language, mentions, url, taggedCollections } =\n post;\n const snapStates = useSnapshot(states);\n const sKey = statusKey(post.id, instance);\n const quotes = snapStates.statusQuotes[sKey];\n\n const divRef = useRef();\n useLayoutEffect(() => {\n if (!divRef.current) return;\n const dom = enhanceContent(content, {\n emojis,\n returnDOM: true,\n });\n // Remove target=\"_blank\" from links\n for (const a of dom.querySelectorAll('a.u-url[target=\"_blank\"]')) {\n if (!HTTP_REGEX.test(a.innerText.trim())) {\n a.removeAttribute('target');\n }\n }\n divRef.current.replaceChildren(dom.cloneNode(true));\n }, [content, emojis?.length]);\n\n useEffect(() => {\n // Find all links that's in states.statusQuotes and add 'is-quote' class\n if (quotes?.length) {\n for (const a of divRef.current.querySelectorAll('a')) {\n if (quotes.some((quote) => quote?.originalURL === a.href)) {\n a.classList.add('is-quote');\n }\n }\n }\n }, [quotes?.length]);\n\n return (\n <div\n ref={divRef}\n lang={language}\n dir=\"auto\"\n class=\"inner-content\"\n onClick={handleContentLinks({\n mentions,\n instance,\n previewMode,\n statusURL: url,\n taggedCollections,\n })}\n // dangerouslySetInnerHTML={{\n // __html: enhanceContent(content, {\n // emojis,\n // postEnhanceDOM: (dom) => {\n // // Remove target=\"_blank\" from links\n // dom.querySelectorAll('a.u-url[target=\"_blank\"]').forEach((a) => {\n // if (!/http/i.test(a.innerText.trim())) {\n // a.removeAttribute('target');\n // }\n // });\n // },\n // }),\n // }}\n />\n );\n }; /*,\n (oldProps, newProps) => {\n const { post: oldPost } = oldProps;\n const { post: newPost } = newProps;\n return oldPost.content === newPost.content;\n },\n);*/\n\nexport default PostContent;\n","/**\n * @param {string[]} splittedHtml\n * @param {{ char?: string; count?: number}} options\n * @returns {string}\n */\nconst addIndentation = (splittedHtml, options = {}) => {\n const char = options.char || ' '\n const count = options.count || 2\n\n let level = 0\n const opened = []\n\n return splittedHtml.reverse().reduce((indented, elTag) => {\n if (opened.length\n && level\n && opened[level]\n /* if current element tag is the same as previously opened one */\n && opened[level] === elTag.substring(1, opened[level].length + 1)\n ) {\n opened.splice(level, 1)\n level--\n }\n\n const indentation = char.repeat(level ? level * count : 0)\n\n const newIndented = [\n `${indentation}${elTag}`,\n ...indented,\n ]\n\n // if current element tag is closing tag\n // add it to opened elements\n if (elTag.substring(0, 2) === '</') {\n level++\n opened[level] = elTag.substring(2, elTag.length - 1)\n }\n\n return newIndented\n }, []).join('\\n')\n}\n\nmodule.exports = addIndentation\n","/**\n * @param {string} nonFormattedString Any non formatted string\n * @returns {string[]} Array of strings separated on new lines\n */\nconst removeEmptyLines = (nonFormattedString) => (\n // Replace\n // - 1 or more spaces or tabs at the start of line\n // - 1 or more spaces or tabs at the end of line\n // - empty lines\n // with empty string\n nonFormattedString.trim().replace(/(^(\\s|\\t)+|(( |\\t)+)$)/gm, '')\n)\n\n/**\n * @param {string} markup\n * @returns {string[]} Array of strings splitted on new lines without empty lines\n */\nconst mergeAttributesWithElements = (markup) => {\n const splittedMarkup = removeEmptyLines(markup).split('\\n')\n\n const mergedLines = []\n let currentElement = ''\n for (let i = 0; i < splittedMarkup.length; i += 1) {\n const line = splittedMarkup[i]\n\n // If line is closing element/tag separate closing tag from rest of the line with space\n if (line.endsWith('/>')) {\n mergedLines.push(`${currentElement}${line.slice(0, -2)} />`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n if (line.endsWith('>')) {\n mergedLines.push(`${currentElement}${\n line.startsWith('>') || line.startsWith('<') ? '' : ' '\n }${line}`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n currentElement += currentElement.length ? ` ${line}` : line\n }\n\n return mergedLines\n}\n\nmodule.exports = {\n mergeAttributesWithElements,\n removeEmptyLines,\n}\n","const addIndentation = require('./utils/addIndentation')\nconst { mergeAttributesWithElements } = require('./utils/toLines')\n\n/**\n * @param {string} markup\n * @param {{ char?: string; count?: number }} options\n * @returns {string}\n */\nconst prettify = (markup, options = {}) => {\n const splitted = mergeAttributesWithElements(markup)\n\n return addIndentation(splitted, options)\n}\n\nmodule.exports = prettify\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport prettify from 'html-prettify';\n\nimport emojifyText from '../utils/emojify-text';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\n\nimport Icon from './icon';\n\nfunction generateHTMLCode(post, instance, level = 0) {\n const {\n account: {\n url: accountURL,\n displayName,\n acct,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const sKey = statusKey(id, instance);\n const quotes = states.statusQuotes[sKey] || [];\n const uniqueQuotes = quotes.filter(\n (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n );\n const quoteStatusesHTML =\n uniqueQuotes.length && level <= 2\n ? uniqueQuotes\n .map((quote) => {\n const { id, instance } = quote;\n const sKey = statusKey(id, instance);\n const s = states.statuses[sKey];\n if (s) {\n return generateHTMLCode(s, instance, ++level);\n }\n })\n .join('')\n : '';\n\n const createdAtDate = new Date(createdAt);\n // const editedAtDate = editedAt && new Date(editedAt);\n\n const contentHTML =\n emojifyText(content, emojis) +\n '\\n' +\n quoteStatusesHTML +\n '\\n' +\n (poll?.options?.length\n ? `\n <p>📊:</p>\n <ul>\n ${poll.options\n .map(\n (option) => `\n <li>\n ${option.title}\n ${option.votesCount >= 0 ? ` (${option.votesCount})` : ''}\n </li>\n `,\n )\n .join('')}\n </ul>`\n : '') +\n (mediaAttachments.length > 0\n ? '\\n' +\n mediaAttachments\n .map((media) => {\n const {\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n const { original = {}, small } = meta || {};\n const width = small?.width || original?.width;\n const height = small?.height || original?.height;\n\n // Prefer remote over original\n const sourceMediaURL = remoteUrl || url;\n const previewMediaURL = previewRemoteUrl || previewUrl;\n const mediaURL = previewMediaURL || sourceMediaURL;\n\n const sourceMediaURLObj = sourceMediaURL\n ? URL.parse(sourceMediaURL)\n : null;\n const isVideoMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(sourceMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(sourceMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' &&\n previewMediaURL &&\n !isVideoMaybe &&\n !isAudioMaybe);\n const isVideo = type === 'gifv' || type === 'video' || isVideoMaybe;\n const isAudio = type === 'audio' || isAudioMaybe;\n\n let mediaHTML = '';\n if (isImage) {\n mediaHTML = `<img src=\"${mediaURL}\" width=\"${width}\" height=\"${height}\" alt=\"${description}\" loading=\"lazy\" />`;\n } else if (isVideo) {\n mediaHTML = `\n <video src=\"${sourceMediaURL}\" width=\"${width}\" height=\"${height}\" controls preload=\"auto\" poster=\"${previewMediaURL}\" loading=\"lazy\"></video>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else if (isAudio) {\n mediaHTML = `\n <audio src=\"${sourceMediaURL}\" controls preload=\"auto\"></audio>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else {\n mediaHTML = `\n <a href=\"${sourceMediaURL}\">📄 ${\n description || sourceMediaURL\n }</a>\n `;\n }\n\n return `<figure>${mediaHTML}</figure>`;\n })\n .join('\\n')\n : '');\n\n const htmlCode = `\n <blockquote lang=\"${language}\" cite=\"${url}\" data-source=\"fediverse\">\n ${\n spoilerText\n ? `\n <details>\n <summary>${spoilerText}</summary>\n ${contentHTML}\n </details>\n `\n : contentHTML\n }\n <footer>\n — ${emojifyText(\n displayName,\n accountEmojis,\n )} (@${acct}) ${!!createdAt ? `<a href=\"${url}\"><time datetime=\"${createdAtDate.toISOString()}\">${createdAtDate.toLocaleString()}</time></a>` : ''}\n </footer>\n </blockquote>\n `;\n\n return prettify(htmlCode);\n}\n\nfunction PostEmbedModal({ post, instance, onClose }) {\n const { t } = useLingui();\n const {\n account: {\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const htmlCode = generateHTMLCode(post, instance);\n return (\n <div id=\"embed-post\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Embed post</Trans>\n </h2>\n </header>\n <main tabIndex=\"-1\">\n <h3>\n <Trans>HTML Code</Trans>\n </h3>\n <textarea\n class=\"embed-code\"\n readonly\n onClick={(e) => {\n e.target.select();\n }}\n dir=\"auto\"\n >\n {htmlCode}\n </textarea>\n <button\n type=\"button\"\n onClick={() => {\n try {\n navigator.clipboard.writeText(htmlCode);\n showToast(t`HTML code copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy HTML code`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />{' '}\n <span>\n <Trans>Copy</Trans>\n </span>\n </button>\n {!!mediaAttachments?.length && (\n <section>\n <p>\n <Trans>Media attachments:</Trans>\n </p>\n <ol class=\"links-list\">\n {mediaAttachments.map((media) => {\n return (\n <li key={media.id}>\n <a\n href={media.remoteUrl || media.url}\n target=\"_blank\"\n download\n >\n {media.remoteUrl || media.url}\n </a>\n </li>\n );\n })}\n </ol>\n </section>\n )}\n {!!accountEmojis?.length && (\n <section>\n <p>\n <Trans>Account Emojis:</Trans>\n </p>\n <ul>\n {accountEmojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n {!!emojis?.length && (\n <section>\n <p>\n <Trans>Emojis:</Trans>\n </p>\n <ul>\n {emojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n <section>\n <small>\n <p>\n <Trans>Notes:</Trans>\n </p>\n <ul>\n <li>\n <Trans>\n This is static, unstyled and scriptless. You may need to apply\n your own styles and edit as needed.\n </Trans>\n </li>\n <li>\n <Trans>\n Polls are not interactive, becomes a list with vote counts.\n </Trans>\n </li>\n <li>\n <Trans>\n Media attachments can be images, videos, audios or any file\n types.\n </Trans>\n </li>\n <li>\n <Trans>Post could be edited or deleted later.</Trans>\n </li>\n </ul>\n </small>\n </section>\n <h3>\n <Trans>Preview</Trans>\n </h3>\n <output\n class=\"embed-preview\"\n dangerouslySetInnerHTML={{ __html: htmlCode }}\n dir=\"auto\"\n />\n <p>\n <small>\n <Trans>Note: This preview is lightly styled.</Trans>\n </small>\n </p>\n </main>\n </div>\n );\n}\n\nexport default PostEmbedModal;\n","import './quote-chain-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { getStatus } from '../utils/states';\nimport useTruncated from '../utils/useTruncated';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nfunction TruncatedLink(props) {\n const { t } = useLingui();\n const ref = useTruncated();\n return <Link {...props} data-read-more={t`Read more →`} ref={ref} />;\n}\n\nconst FETCH_DELAY = 500; // Delay between fetches to avoid rate limiting\nconst BATCH_LIMIT = 30; // The chain might get very long, so fetch in batches\n\nexport default function QuoteChainModal({\n statusId,\n instance,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n\n const [posts, setPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [nextPostID, setNextPostID] = useState(null);\n\n const abortControllerRef = useRef(null);\n\n const fetchQuoteChain = async (postID) => {\n abortControllerRef.current = new AbortController();\n const signal = abortControllerRef.current.signal;\n\n setUIState('loading');\n let fetchCount = 0;\n let currentPostID = postID;\n\n while (currentPostID && !signal.aborted && fetchCount < BATCH_LIMIT) {\n console.log('🔗 WHILE', { currentPostID, fetchCount });\n // Break circular reference if it somehow happens\n // Note that origin post could be edited to add a quote that might reference to any post in the chain ♻️\n if (posts.some((p) => p.id === currentPostID)) {\n break;\n }\n\n let fullStatus = getStatus(currentPostID, instance);\n const cached = !!fullStatus;\n\n if (!cached) {\n try {\n fullStatus = await masto.v1.statuses.$select(currentPostID).fetch();\n fetchCount++;\n } catch (e) {\n console.error('Error fetching quote:', e);\n setUIState('error');\n break;\n }\n }\n\n console.log('🔗 PUSH', fullStatus);\n setPosts((prev) => [...prev, fullStatus]);\n\n currentPostID =\n fullStatus.quote?.quotedStatusId || fullStatus.quote?.quotedStatus?.id;\n\n // Add delay before next fetch to avoid rate limiting\n if (\n !cached &&\n currentPostID &&\n !signal.aborted &&\n fetchCount < BATCH_LIMIT\n ) {\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY));\n }\n }\n\n if (!signal.aborted) {\n setNextPostID(currentPostID || null);\n setUIState('default');\n }\n };\n\n useEffect(() => {\n fetchQuoteChain(statusId);\n return () => {\n abortControllerRef.current?.abort();\n };\n }, [statusId]);\n\n return (\n <div id=\"quote-chain-modal\" class=\"sheet\" tabindex=\"-1\">\n {onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>Quote chain</Trans>\n </b>{' '}\n {posts.length > 0 && (\n <small class=\"tag insignificant collapsed\">\n {posts.length}\n {(!!nextPostID || uiState === 'loading') && '+'}\n </small>\n )}\n </header>\n <main>\n <ul class=\"quoted-posts-list\">\n {posts.map((post) => (\n <li key={post.id} class=\"quoted-post-item\">\n <TruncatedLink\n to={instance ? `/${instance}/s/${post.id}` : `/s/${post.id}`}\n class=\"status-link\"\n onContextMenu={(e) => {\n const postEl = e.target.querySelector('.status');\n if (postEl) {\n if (e.metaKey) return;\n e.preventDefault();\n postEl.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }}\n >\n <Status\n status={post}\n instance={instance}\n size=\"s\"\n readOnly\n showCommentCount\n showQuoteCount={(c) => c > 1}\n />\n </TruncatedLink>\n </li>\n ))}\n </ul>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to unwrap quote chain</Trans>\n </p>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : nextPostID ? (\n <button\n type=\"button\"\n class=\"light block\"\n onClick={() => {\n fetchQuoteChain(nextPostID);\n }}\n >\n <Icon icon=\"arrow-down\" /> <Trans>Continue unwrapping…</Trans>\n </button>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n","import './quote-settings-sheet.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport { saveStatus } from '../utils/states';\n\nimport Icon from './icon';\nimport Status from './status';\n\nfunction QuoteSettingsSheet({ onClose, post, currentPolicy }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n\n const [selectedPolicy, setSelectedPolicy] = useState(\n currentPolicy || 'public',\n );\n\n const handleFormSubmit = async (e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const quoteApprovalPolicy = formData.get('quoteApprovalPolicy');\n\n setSelectedPolicy(quoteApprovalPolicy);\n setUIState('loading');\n\n try {\n const newStatus = await masto.v1.statuses\n .$select(post.id)\n .interactionPolicy.update({\n quote_approval_policy: quoteApprovalPolicy,\n });\n onClose(true);\n showToast(t`Quote settings updated`);\n setUIState('default');\n\n // Update the status with new quote policy\n saveStatus(newStatus, post.instance, {\n skipThreading: true,\n skipUnfurling: true,\n });\n } catch (e) {\n console.error(e);\n showToast(t`Failed to update quote settings`);\n setUIState('error');\n }\n };\n\n return (\n <div class=\"sheet\" id=\"quote-settings-container\">\n {!!onClose && (\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={onClose}\n disabled={uiState === 'loading'}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Quote settings for this post</Trans>\n </h2>\n </header>\n <main>\n {!!post && (\n <div class=\"post-preview\">\n <Status status={post} size=\"s\" readOnly />\n </div>\n )}\n <form onSubmit={handleFormSubmit}>\n <select\n value={selectedPolicy}\n name=\"quoteApprovalPolicy\"\n disabled={uiState === 'loading'}\n >\n <option value=\"public\">\n <Trans>Anyone can quote</Trans>\n </option>\n <option value=\"followers\">\n <Trans>Your followers can quote</Trans>\n </option>\n <option value=\"nobody\">\n <Trans>Only you can quote</Trans>\n </option>\n </select>{' '}\n <button disabled={uiState === 'loading'}>\n <Trans>Save</Trans>\n </button>\n </form>\n </main>\n </div>\n );\n}\n\nexport default QuoteSettingsSheet;\n","import './quotes-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nconst LIMIT = 20;\n\nexport default function QuotesModal({\n statusId,\n instance,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n\n const [posts, setPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n const quotesIterator = useRef();\n const firstLoad = useRef(true);\n\n const loadQuotes = (isFirstLoad = false) => {\n if (isFirstLoad || !quotesIterator.current) {\n quotesIterator.current = masto.v1.statuses\n .$select(statusId)\n .quotes.list({\n limit: LIMIT,\n })\n .values();\n }\n\n setUIState('loading');\n\n (async () => {\n try {\n let { done, value } = await quotesIterator.current.next();\n\n if (Array.isArray(value)) {\n if (isFirstLoad) {\n setPosts(value);\n } else {\n setPosts((prev) => [...prev, ...value]);\n }\n if (value.length < LIMIT) {\n done = true;\n }\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error('Error loading quotes:', e);\n setUIState('error');\n }\n })();\n };\n\n useEffect(() => {\n loadQuotes(true);\n firstLoad.current = false;\n }, [statusId]);\n\n return (\n <div id=\"quotes-modal\" class=\"sheet\" tabindex=\"-1\">\n {onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Quotes</Trans>\n </h2>\n </header>\n <main>\n {posts.length > 0 ? (\n <>\n <ul class=\"quoted-posts-list\">\n {posts.map((post) => (\n <li key={post.id} class=\"quoted-post-item\">\n <Link\n to={\n instance ? `/${instance}/s/${post.id}` : `/s/${post.id}`\n }\n class=\"status-link\"\n onContextMenu={(e) => {\n const post = e.target.querySelector('.status');\n if (post) {\n // Fire a custom event to open the context menu\n if (e.metaKey) return;\n e.preventDefault();\n post.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }}\n >\n <Status\n status={post}\n instance={instance}\n size=\"s\"\n readOnly\n showCommentCount\n showQuoteCount\n />\n </Link>\n </li>\n ))}\n </ul>\n {uiState === 'default' ? (\n showMore ? (\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadQuotes()}\n >\n <Trans>Show more…</Trans>\n </button>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Error loading quotes</Trans>\n </p>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>No quotes yet</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n","import { forwardRef } from 'preact/compat';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport Icon from './icon';\n\nconst StatusButton = forwardRef((props, ref) => {\n let {\n checked,\n count,\n extraCount,\n class: className,\n title,\n alt,\n size,\n icon,\n iconSize = 'l',\n onClick,\n ...otherProps\n } = props;\n if (typeof title === 'string') {\n title = [title, title];\n }\n if (typeof alt === 'string') {\n alt = [alt, alt];\n }\n\n const [buttonTitle, setButtonTitle] = useState(title[0] || '');\n const [iconAlt, setIconAlt] = useState(alt[0] || '');\n\n useEffect(() => {\n if (checked) {\n setButtonTitle(title[1] || '');\n setIconAlt(alt[1] || '');\n } else {\n setButtonTitle(title[0] || '');\n setIconAlt(alt[0] || '');\n }\n }, [checked, title, alt]);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n title={buttonTitle}\n class={`plain ${size ? 'small' : ''} ${className} ${\n checked ? 'checked' : ''\n }`}\n onClick={(e) => {\n if (!onClick) return;\n e.preventDefault();\n e.stopPropagation();\n onClick(e);\n }}\n {...otherProps}\n >\n <Icon icon={icon} size={iconSize} alt={iconAlt} />\n {(!!count || !!extraCount) && (\n <>\n {' '}\n {!!count && <small title={count}>{shortenNumber(count)}</small>}\n {!!count && !!extraCount && <small>+</small>}\n {!!extraCount && (\n <small title={extraCount}>{shortenNumber(extraCount)}</small>\n )}\n </>\n )}\n </button>\n );\n});\n\nexport default StatusButton;\n","export class LiteYTEmbed extends HTMLElement {\n constructor() {\n super();\n this.isIframeLoaded = false;\n this.isPlaylistThumbnailLoaded = false;\n this.setupDom();\n }\n static get observedAttributes() {\n return ['videoid', 'playlistid', 'videoplay', 'videotitle'];\n }\n connectedCallback() {\n this.addEventListener('pointerover', () => LiteYTEmbed.warmConnections(this), {\n once: true,\n });\n this.addEventListener('click', () => this.addIframe());\n }\n get videoId() {\n return encodeURIComponent(this.getAttribute('videoid') || '');\n }\n set videoId(id) {\n this.setAttribute('videoid', id);\n }\n get playlistId() {\n return encodeURIComponent(this.getAttribute('playlistid') || '');\n }\n set playlistId(id) {\n this.setAttribute('playlistid', id);\n }\n get videoTitle() {\n return this.getAttribute('videotitle') || 'Video';\n }\n set videoTitle(title) {\n this.setAttribute('videotitle', title);\n }\n get videoPlay() {\n return this.getAttribute('videoplay') || 'Play';\n }\n set videoPlay(name) {\n this.setAttribute('videoplay', name);\n }\n get videoStartAt() {\n return this.getAttribute('videoStartAt') || '0';\n }\n get autoLoad() {\n return this.hasAttribute('autoload');\n }\n get autoPause() {\n return this.hasAttribute('autopause');\n }\n get noCookie() {\n return this.hasAttribute('nocookie');\n }\n get posterQuality() {\n return this.getAttribute('posterquality') || 'hqdefault';\n }\n get posterLoading() {\n return (this.getAttribute('posterloading') ||\n 'lazy');\n }\n get params() {\n return `start=${this.videoStartAt}&${this.getAttribute('params')}`;\n }\n set params(opts) {\n this.setAttribute('params', opts);\n }\n set posterQuality(opts) {\n this.setAttribute('posterquality', opts);\n }\n get disableNoscript() {\n return this.hasAttribute('disablenoscript');\n }\n setupDom() {\n const shadowDom = this.attachShadow({ mode: 'open' });\n let nonce = '';\n if (window.liteYouTubeNonce) {\n nonce = `nonce=\"${window.liteYouTubeNonce}\"`;\n }\n shadowDom.innerHTML = `\n <style ${nonce}>\n :host {\n --aspect-ratio: var(--lite-youtube-aspect-ratio, 16 / 9);\n --aspect-ratio-short: var(--lite-youtube-aspect-ratio-short, 9 / 16);\n --frame-shadow-visible: var(--lite-youtube-frame-shadow-visible, yes);\n contain: content;\n display: block;\n position: relative;\n width: 100%;\n aspect-ratio: var(--aspect-ratio);\n }\n\n @media (max-width: 40em) {\n :host([short]) {\n aspect-ratio: var(--aspect-ratio-short);\n }\n }\n\n #frame, #fallbackPlaceholder, iframe {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n }\n\n #frame {\n cursor: pointer;\n }\n\n #fallbackPlaceholder, slot[name=image]::slotted(*) {\n object-fit: cover;\n width: 100%;\n height: 100%;\n }\n\n @container style(--frame-shadow-visible: yes) {\n #frame::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n background-image: linear-gradient(180deg, #111 -20%, transparent 90%);\n height: 60px;\n width: 100%;\n z-index: 1;\n }\n }\n\n #playButton {\n width: 68px;\n height: 48px;\n background-color: transparent;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 68 48\"><path d=\"M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z\" fill=\"red\"/><path d=\"M45 24 27 14v20\" fill=\"white\"/></svg>');\n z-index: 1;\n border: 0;\n border-radius: inherit;\n }\n\n #playButton:before {\n content: '';\n border-style: solid;\n border-width: 11px 0 11px 19px;\n border-color: transparent transparent transparent #fff;\n }\n\n #playButton,\n #playButton:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate3d(-50%, -50%, 0);\n cursor: inherit;\n }\n\n /* Post-click styles */\n .activated {\n cursor: unset;\n }\n\n #frame.activated::before,\n #frame.activated > #playButton {\n display: none;\n }\n </style>\n <div id=\"frame\">\n <picture>\n <slot name=\"image\">\n <source id=\"webpPlaceholder\" type=\"image/webp\">\n <source id=\"jpegPlaceholder\" type=\"image/jpeg\">\n <img id=\"fallbackPlaceholder\" referrerpolicy=\"origin\" loading=\"lazy\">\n </slot>\n </picture>\n <button id=\"playButton\" part=\"playButton\"></button>\n </div>\n `;\n this.domRefFrame = shadowDom.querySelector('#frame');\n this.domRefImg = {\n fallback: shadowDom.querySelector('#fallbackPlaceholder'),\n webp: shadowDom.querySelector('#webpPlaceholder'),\n jpeg: shadowDom.querySelector('#jpegPlaceholder'),\n };\n this.domRefPlayButton = shadowDom.querySelector('#playButton');\n }\n setupComponent() {\n const hasImgSlot = this.shadowRoot.querySelector('slot[name=image]');\n if (hasImgSlot.assignedNodes().length === 0) {\n this.initImagePlaceholder();\n }\n this.domRefPlayButton.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.setAttribute('title', `${this.videoPlay}: ${this.videoTitle}`);\n if (this.autoLoad || this.isYouTubeShort() || this.autoPause) {\n this.initIntersectionObserver();\n }\n if (!this.disableNoscript) {\n this.injectSearchNoScript();\n }\n }\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal !== newVal) {\n if (name === 'playlistid' && oldVal !== null && oldVal !== newVal) {\n this.isPlaylistThumbnailLoaded = false;\n }\n this.setupComponent();\n if (this.domRefFrame.classList.contains('activated')) {\n this.domRefFrame.classList.remove('activated');\n this.shadowRoot.querySelector('iframe').remove();\n this.isIframeLoaded = false;\n }\n }\n }\n injectSearchNoScript() {\n const eleNoScript = document.createElement('noscript');\n this.prepend(eleNoScript);\n eleNoScript.innerHTML = this.generateIframe();\n }\n generateIframe(isIntersectionObserver = false) {\n let autoplay = isIntersectionObserver ? 0 : 1;\n let autoPause = this.autoPause ? '&enablejsapi=1' : '';\n const wantsNoCookie = this.noCookie ? '-nocookie' : '';\n let embedTarget;\n if (this.playlistId) {\n embedTarget = `?listType=playlist&list=${this.playlistId}&`;\n }\n else {\n embedTarget = `${this.videoId}?`;\n }\n if (this.isYouTubeShort()) {\n this.params = `loop=1&mute=1&modestbranding=1&playsinline=1&rel=0&enablejsapi=1&playlist=${this.videoId}`;\n autoplay = 1;\n }\n return `\n<iframe credentialless frameborder=\"0\" title=\"${this.videoTitle}\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\n src=\"https://www.youtube${wantsNoCookie}.com/embed/${embedTarget}autoplay=${autoplay}${autoPause}&${this.params}\"\n></iframe>`;\n }\n addIframe(isIntersectionObserver = false) {\n if (!this.isIframeLoaded) {\n const iframeHTML = this.generateIframe(isIntersectionObserver);\n this.domRefFrame.insertAdjacentHTML('beforeend', iframeHTML);\n this.domRefFrame.classList.add('activated');\n this.isIframeLoaded = true;\n this.attemptShortAutoPlay();\n this.dispatchEvent(new CustomEvent('liteYoutubeIframeLoaded', {\n detail: {\n videoId: this.videoId,\n },\n bubbles: true,\n cancelable: true,\n }));\n }\n }\n initImagePlaceholder() {\n if (this.playlistId && !this.videoId) {\n this.loadPlaylistThumbnail();\n }\n else {\n this.testPosterImage();\n }\n this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n }\n async loadPlaylistThumbnail() {\n if (this.isPlaylistThumbnailLoaded) {\n return;\n }\n this.isPlaylistThumbnailLoaded = true;\n try {\n const oEmbedUrl = `https://www.youtube.com/oembed?url=https://www.youtube.com/playlist?list=${this.playlistId}&format=json`;\n const response = await fetch(oEmbedUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch playlist thumbnail: ${response.status}`);\n }\n const data = await response.json();\n if (data.thumbnail_url) {\n const thumbnailUrl = data.thumbnail_url;\n const videoIdMatch = thumbnailUrl.match(/\\/vi\\/([^\\/]+)\\//);\n if (videoIdMatch) {\n const extractedVideoId = videoIdMatch[1];\n this.loadThumbnailImages(extractedVideoId);\n }\n else {\n this.domRefImg.fallback.src = thumbnailUrl;\n this.domRefImg.fallback.loading = this.posterLoading;\n }\n }\n }\n catch (error) {\n console.warn('Failed to load playlist thumbnail:', error);\n }\n }\n loadThumbnailImages(videoId) {\n const posterUrlWebp = `https://i.ytimg.com/vi_webp/${videoId}/${this.posterQuality}.webp`;\n this.domRefImg.webp.srcset = posterUrlWebp;\n const posterUrlJpeg = `https://i.ytimg.com/vi/${videoId}/${this.posterQuality}.jpg`;\n this.domRefImg.jpeg.srcset = posterUrlJpeg;\n this.domRefImg.fallback.src = posterUrlJpeg;\n this.domRefImg.fallback.loading = this.posterLoading;\n }\n async testPosterImage() {\n setTimeout(() => {\n const webpUrl = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n const img = new Image();\n img.fetchPriority = 'low';\n img.referrerPolicy = 'origin';\n img.src = webpUrl;\n img.onload = async (e) => {\n const target = e.target;\n const noPoster = target?.naturalHeight == 90 && target?.naturalWidth == 120;\n if (noPoster) {\n this.posterQuality = 'hqdefault';\n }\n this.loadThumbnailImages(this.videoId);\n };\n }, 100);\n }\n initIntersectionObserver() {\n const options = {\n root: null,\n rootMargin: '0px',\n threshold: 0,\n };\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !this.isIframeLoaded) {\n LiteYTEmbed.warmConnections(this);\n this.addIframe(true);\n observer.unobserve(this);\n }\n });\n }, options);\n observer.observe(this);\n if (this.autoPause) {\n const windowPause = new IntersectionObserver((e, o) => {\n e.forEach(entry => {\n if (entry.intersectionRatio !== 1) {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n }\n });\n }, { threshold: 1 });\n windowPause.observe(this);\n }\n }\n attemptShortAutoPlay() {\n if (this.isYouTubeShort()) {\n setTimeout(() => {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n }, 2000);\n }\n }\n isYouTubeShort() {\n return (this.getAttribute('short') === '' &&\n window.matchMedia('(max-width: 40em)').matches);\n }\n static addPrefetch(kind, url) {\n const linkElem = document.createElement('link');\n linkElem.rel = kind;\n linkElem.href = url;\n linkElem.crossOrigin = 'true';\n document.head.append(linkElem);\n }\n static warmConnections(context) {\n if (LiteYTEmbed.isPreconnected || window.liteYouTubeIsPreconnected)\n return;\n LiteYTEmbed.addPrefetch('preconnect', 'https://i.ytimg.com/');\n LiteYTEmbed.addPrefetch('preconnect', 'https://s.ytimg.com');\n if (!context.noCookie) {\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\n LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');\n }\n else {\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\n }\n LiteYTEmbed.isPreconnected = true;\n window.liteYouTubeIsPreconnected = true;\n }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","import { Trans } from '@lingui/react/macro';\n\nimport Icon from './icon';\nimport NameText from './name-text';\n\nfunction Byline({ authors, hidden, children }) {\n if (hidden) return children;\n if (!authors?.[0]?.account?.id) return children;\n const author = authors[0].account;\n\n return (\n <div class=\"card-byline\">\n {children}\n <div class=\"card-byline-author\">\n <Icon icon=\"link\" size=\"s\" />{' '}\n <small>\n <Trans comment=\"More from [Author]\">\n More from <NameText account={author} showAvatar />\n </Trans>\n </small>\n </div>\n </div>\n );\n}\n\nexport default Byline;\n","import '@justinribeiro/lite-youtube';\n\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getDomain from '../utils/get-domain';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport states from '../utils/states';\nimport unfurlMastodonLink, { unfurlCollectionLink } from '../utils/unfurl-link';\n\nimport Byline from './byline';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\n// \"Post\": Quote post + card link preview combo\n// Assume all links from these domains are \"posts\"\n// Mastodon links are \"posts\" too but they are converted to real quote posts and there's too many domains to check\n// This is just \"Progressive Enhancement\"\nfunction isCardPost(domain) {\n return [\n 'x.com',\n 'twitter.com',\n 'threads.net',\n 'bsky.app',\n 'bsky.brid.gy',\n 'fed.brid.gy',\n ].includes(domain);\n}\n\nfunction StatusCard({ card, selfReferential, selfAuthor, instance }) {\n const snapStates = useSnapshot(states);\n const {\n blurhash,\n title,\n description,\n html,\n providerName,\n providerUrl,\n authorName,\n authorUrl,\n width,\n height,\n image,\n imageDescription,\n url,\n type,\n embedUrl,\n language,\n publishedAt,\n authors,\n } = card;\n\n /* type\n link = Link OEmbed\n photo = Photo OEmbed\n video = Video OEmbed\n rich = iframe OEmbed. Not currently accepted, so won't show up in practice.\n */\n\n const hasText = title || providerName || authorName;\n const isLandscape = width / height >= 1.2;\n const size = isLandscape ? 'large' : '';\n\n const [cardStatusURL, setCardStatusURL] = useState(null);\n // const [cardStatusID, setCardStatusID] = useState(null);\n useEffect(() => {\n if (!hasText || !image || selfReferential || !isMastodonLinkMaybe(url)) {\n return;\n }\n\n const abortController = new AbortController();\n unfurlMastodonLink(instance, url, abortController.signal).then((result) => {\n if (!result) return;\n const { id, url } = result;\n setCardStatusURL('#' + url);\n\n // NOTE: This is for quote post\n // (async () => {\n // const { masto } = api({ instance });\n // const status = await masto.v1.statuses.$select(id).fetch();\n // saveStatus(status, instance);\n // setCardStatusID(id);\n // })();\n });\n unfurlCollectionLink(instance, url);\n\n return () => {\n abortController.abort();\n };\n }, [hasText, image, selfReferential]);\n\n // if (cardStatusID) {\n // return (\n // <Status statusID={cardStatusID} instance={instance} size=\"s\" readOnly />\n // );\n // }\n\n if (\n snapStates.unfurledLinks[url]?.url &&\n !snapStates.unfurledLinks[url].collections\n )\n // Hide card after unfurling a regular status;\n // keep it for account collections pages so it's clickable\n return null;\n\n const hasIframeHTML = /<iframe/i.test(html);\n const handleClick = useCallback(\n (e) => {\n const unfurled = states.unfurledLinks[url];\n if (unfurled?.url) {\n e.preventDefault();\n e.stopPropagation();\n location.hash = '#' + unfurled.url;\n return;\n }\n if (hasIframeHTML) {\n e.preventDefault();\n states.showEmbedModal = {\n html,\n url: url || embedUrl,\n width,\n height,\n };\n }\n },\n [hasIframeHTML, url],\n );\n\n const [blurhashImage, setBlurhashImage] = useState(null);\n if (hasText && (image || (type === 'photo' && blurhash))) {\n const domain = getDomain(url);\n const rgbAverageColor =\n image && blurhash ? getBlurHashAverageColor(blurhash) : null;\n if (!image) {\n const w = 44;\n const h = 44;\n const blurhashPixels = decodeBlurHash(blurhash, w, h);\n const canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = false;\n const imageData = ctx.createImageData(w, h);\n imageData.data.set(blurhashPixels);\n ctx.putImageData(imageData, 0, 0);\n try {\n if (window.OffscreenCanvas) {\n canvas.convertToBlob().then((blob) => {\n setBlurhashImage(URL.createObjectURL(blob));\n });\n } else {\n setBlurhashImage(canvas.toDataURL());\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n }\n\n const isPost = isCardPost(domain);\n\n return (\n <Byline hidden={!!selfAuthor} authors={authors}>\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener\"\n class={`card link ${isPost ? 'card-post' : ''} ${\n blurhashImage ? '' : size\n } ${hasIframeHTML ? 'can-show-embed' : ''}`}\n style={{\n '--average-color':\n rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n }}\n onClick={handleClick}\n >\n <div class=\"card-image\">\n <img\n src={image || blurhashImage}\n width={width}\n height={height}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n alt={imageDescription || ''}\n onError={(e) => {\n try {\n e.target.style.display = 'none';\n } catch (e) {}\n }}\n style={{\n '--anim-duration':\n width &&\n height &&\n `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n />\n </div>\n <div class=\"meta-container\" lang={language}>\n <p class=\"meta domain\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" dir=\"auto\" title={title}>\n {title}\n </p>\n <p class=\"meta\" dir=\"auto\" title={description}>\n {description ||\n (!!publishedAt && (\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n ))}\n </p>\n </div>\n </a>\n </Byline>\n );\n } else if (type === 'photo') {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noopener\"\n class=\"card photo\"\n onClick={handleClick}\n >\n <img\n src={embedUrl}\n width={width}\n height={height}\n alt={title || description}\n loading=\"lazy\"\n style={{\n height: 'auto',\n aspectRatio: `${width}/${height}`,\n }}\n />\n </a>\n );\n } else {\n if (type === 'video') {\n if (/youtube/i.test(providerName)) {\n // Get ID from e.g. https://www.youtube.com/watch?v=[VIDEO_ID]\n const videoID = url.match(/watch\\?v=([^&]+)/)?.[1];\n if (videoID) {\n return (\n <a class=\"card video\" onClick={handleClick}>\n <lite-youtube videoid={videoID} nocookie autoPause></lite-youtube>\n </a>\n );\n }\n }\n // return (\n // <div\n // class=\"card video\"\n // style={{\n // aspectRatio: `${width}/${height}`,\n // }}\n // dangerouslySetInnerHTML={{ __html: html }}\n // />\n // );\n }\n if (hasText && !image) {\n const domain = getDomain(url);\n const isPost = isCardPost(domain);\n return (\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener\"\n class={`card link ${isPost ? 'card-post' : ''} no-image`}\n lang={language}\n dir=\"auto\"\n onClick={handleClick}\n >\n <div class=\"meta-container\">\n <p class=\"meta domain\">\n <span class=\"domain\">\n <Icon icon=\"link\" size=\"s\" /> <span>{domain}</span>\n </span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" title={title}>\n {title}\n </p>\n <p class=\"meta\" title={description || providerName || authorName}>\n {description || providerName || authorName}\n </p>\n </div>\n </a>\n );\n }\n }\n}\n\nexport default StatusCard;\n","import { Trans } from '@lingui/react/macro';\nimport { useContext } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { getStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccID } from '../utils/store-utils';\n\nimport Avatar from './avatar';\nimport LazyRender from './lazy-render';\n\nfunction StatusCompact({ sKey }) {\n const snapStates = useSnapshot(states);\n const statusReply = snapStates.statusReply[sKey];\n if (!statusReply) return null;\n\n const { id, instance } = statusReply;\n const status = getStatus(id, instance);\n if (!status) return null;\n\n const {\n account: { id: accountId },\n sensitive,\n spoilerText,\n account: { avatar, avatarStatic, bot } = {},\n visibility,\n content,\n language,\n filtered,\n } = status;\n if (sensitive || spoilerText) return null;\n if (!content) return null;\n\n const srKey = statusKey(id, instance);\n const statusPeekText = statusPeek(status);\n\n const currentAccount = getCurrentAccID();\n const isSelf = currentAccount && currentAccount === accountId;\n\n const filterContext = useContext(FilterContext);\n let filterInfo = !isSelf && isFiltered(filtered, filterContext);\n\n // This is fine. Images are converted to emojis so they are\n // in a way, already \"obscured\"\n if (filterInfo?.action === 'blur') filterInfo = null;\n\n if (filterInfo?.action === 'hide') return null;\n\n const filterTitleStr = filterInfo?.titlesStr || '';\n\n return (\n <LazyRender\n as=\"article\"\n id={srKey}\n class={`status compact-reply ${\n visibility === 'direct' ? 'visibility-direct' : ''\n }`}\n tabindex=\"-1\"\n data-state-post-id={srKey}\n renderIfHasChildren={false}\n >\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {filterInfo ? (\n <b class=\"status-filtered-badge badge-meta\" title={filterTitleStr}>\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>\n ) : (\n <span>{statusPeekText}</span>\n )}\n </div>\n </LazyRender>\n );\n}\n\nexport default StatusCompact;\n","import { useMemo } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Link from './link';\n\nconst fauxDiv = document.createElement('div');\nconst HASHTAG_REGEX = /^[##][^##]+$/;\nconst ANOTHER_HASHTAG_REGEX = /^[^###️⃣]*[###️⃣]+/;\n\nconst collator = new Intl.Collator(undefined, {\n sensitivity: 'base',\n usage: 'search',\n});\nconst isSameTag = (a, b) => collator.compare(a, b) === 0;\n\nconst extractTagsFromStatus = (content) => {\n if (!content) return [];\n if (content.indexOf('#') === -1) return [];\n fauxDiv.innerHTML = content;\n const tags = [];\n\n const allLinks = fauxDiv.querySelectorAll('a[href]');\n for (const link of allLinks) {\n const text = link.textContent.trim();\n const isHashtagLink =\n link.classList.contains('hashtag') || HASHTAG_REGEX.test(text);\n\n if (isHashtagLink) {\n tags.push(text.replace(ANOTHER_HASHTAG_REGEX, ''));\n }\n }\n\n return tags;\n};\n\nexport default function StatusTags({ tags, content }) {\n if (!tags?.length) return null;\n\n const { instance } = api();\n\n const tagsToShow = useMemo(() => {\n const hashtagsInContent = extractTagsFromStatus(content);\n if (!hashtagsInContent.length) return tags;\n return tags.filter(\n (tag) => !hashtagsInContent.some((ht) => isSameTag(ht, tag.name)),\n );\n }, [tags, content]);\n\n if (!tagsToShow.length) return null;\n\n return (\n <ul class=\"status-tags\">\n {tagsToShow.map((tag) => (\n <li key={tag.name}>\n <Link\n to={\n instance\n ? `/${instance}/t/${encodeURIComponent(tag.name)}`\n : `/t/${encodeURIComponent(tag.name)}`\n }\n >\n <span class=\"more-insignificant\">#</span>\n {tag.name}\n </Link>\n </li>\n ))}\n </ul>\n );\n}\n","import { createContext } from 'preact';\n\nexport const ThreadCountContext = createContext(0);\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useContext } from 'preact/hooks';\n\nimport { ThreadCountContext } from '../utils/thread-count-context';\n\nimport Icon from './icon';\n\nfunction ThreadIcon({ alt }) {\n return <Icon icon=\"thread\" size=\"s\" alt={alt} />;\n}\n\nfunction ThreadBadge({ index, showIcon, showText }) {\n const { t } = useLingui();\n const total = useContext(ThreadCountContext);\n const hasIndex = index > 0;\n const hasTotal = total > 0;\n\n return (\n <div class=\"status-thread-badge\">\n {showIcon && (\n <>\n <ThreadIcon alt={showText ? '' : t`Thread`} />{' '}\n </>\n )}\n {showText ? (\n hasIndex ? (\n hasTotal ? (\n <Trans>\n Thread {index}/{total}\n </Trans>\n ) : (\n <Trans comment=\"X is the unspecified total number of posts in a thread\">\n Thread {index}/X\n </Trans>\n )\n ) : (\n t`Thread`\n )\n ) : hasIndex ? (\n hasTotal ? (\n t({\n message: `${index}/${total}`,\n comment: 'index/total posts in a thread',\n })\n ) : (\n t({\n message: `${index}/X`,\n comment: 'X is the unspecified total number of posts in a thread',\n })\n )\n ) : (\n !showIcon && <ThreadIcon alt={t`Thread`} />\n )}\n </div>\n );\n}\n\nexport default ThreadBadge;\n","import './status.css';\n\nimport { msg, plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { shallowEqual } from 'fast-equals';\nimport PQueue from 'p-queue';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api, getPreferences } from '../utils/api';\nimport { langDetector } from '../utils/browser-translator';\nimport { useEditHistory } from '../utils/edit-history-context';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport getHTMLText from '../utils/getHTMLText';\nimport haptics from '../utils/haptics';\nimport htmlContentLength from '../utils/html-content-length';\nimport isSameURL from '../utils/is-same-url';\nimport localeMatch from '../utils/locale-match';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport {\n getPostQuoteApprovalPolicy,\n supportsNativeQuote,\n} from '../utils/quote-utils';\nimport RTF from '../utils/relative-time-format';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states, { getStatus, saveStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getAPIVersions, getCurrentAccID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\nimport visibilityText from '../utils/visibility-text';\n\nimport Avatar from './avatar';\nimport CollectionCard from './collection-card';\nimport CustomEmoji from './custom-emoji';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport LazyRender from './lazy-render';\nimport LazyShazam from './lazy-shazam';\nimport Link from './link';\nimport Loader from './loader';\nimport MathBlock from './math-block';\nimport Media, { isMediaCaptionLong } from './media';\nimport MediaFirstContainer from './media-first-container';\nimport MenuConfirm from './menu-confirm';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport MultipleMediaFigure from './multiple-media-figure';\nimport NameText from './name-text';\nimport Poll from './poll';\nimport PostContent from './post-content';\nimport PostEmbedModal from './post-embed-modal';\nimport QuoteChainModal from './quote-chain-modal';\nimport QuoteSettingsSheet from './quote-settings-sheet';\nimport QuotesModal from './quotes-modal';\nimport RelativeTime from './relative-time';\nimport StatusButton from './status-button';\nimport StatusCard from './status-card';\nimport StatusCompact from './status-compact';\nimport StatusTags from './status-tags';\nimport SubMenu2 from './submenu2';\nimport ThreadBadge from './thread-badge';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\nconst MAX_COLLECTIONS = 4;\n\nconst accountQueue = new PQueue({\n concurrency: 1,\n interval: 1000,\n intervalCap: 1,\n});\nfunction fetchAccount(id, masto, signal) {\n return accountQueue.add(() => masto.v1.accounts.$select(id).fetch(), {\n signal,\n });\n}\nconst memFetchAccount = pmem(fetchAccount);\n\nconst isIOS =\n window.ontouchstart !== undefined &&\n /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n if (!poll?.options?.length) return '';\n return `📊:\\n${poll.options.map((option) => `- ${option.title}`).join('\\n')}`;\n}\n\nfunction getPostText(status, opts) {\n const {\n maskCustomEmojis,\n maskURLs,\n hideInlineQuote,\n htmlTextOpts = {},\n } = opts || {};\n const { spoilerText, poll, emojis } = status;\n let { content } = status;\n if (maskCustomEmojis && emojis?.length) {\n const emojisRegex = new RegExp(\n `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n 'g',\n );\n content = content.replace(emojisRegex, '⬚');\n }\n const fullText = [\n spoilerText || '',\n getHTMLText(content, {\n ...htmlTextOpts,\n preProcess:\n (maskURLs || hideInlineQuote) &&\n ((dom) => {\n // Remove links that contains text that starts with https?://\n if (maskURLs) {\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (/^https?:\\/\\//i.test(text)) {\n a.replaceWith('«🔗»');\n }\n }\n }\n // Hide inline quote\n if (hideInlineQuote) {\n const reContainer = dom.querySelector('.quote-inline');\n if (reContainer) {\n reContainer.remove();\n }\n }\n }),\n }),\n getPollText(poll),\n ]\n .join('\\n\\n')\n .trim();\n return fullText;\n}\n\nfunction forgivingQSA(selectors = [], dom = document) {\n // Run QSA for list of selectors\n // If a selector return invalid selector error, try the next one\n for (const selector of selectors) {\n try {\n return dom.querySelectorAll(selector);\n } catch (e) {}\n }\n return [];\n}\n\nconst getHTMLTextForDetectLang = mem((content, emojis) => {\n if (!content) return '';\n if (emojis?.length) {\n const emojisRegex = new RegExp(\n `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n 'g',\n );\n content = content.replace(emojisRegex, '');\n }\n content = content.trim();\n if (!content) return '';\n return getHTMLText(content, {\n preProcess: (dom) => {\n // Remove anything that can skew the language detection\n\n // Remove .mention, .hashtag, pre, code, a:has(.invisible)\n for (const a of forgivingQSA(\n [\n '.mention, .hashtag, pre, code, a:has(.invisible)',\n '.mention, .hashtag, pre, code',\n ],\n dom,\n )) {\n a.remove();\n }\n\n // Remove links that contains text that starts with https?://\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (text.startsWith('https://') || text.startsWith('http://')) {\n a.remove();\n }\n }\n },\n });\n});\n\nfunction isTranslateble(content, emojis) {\n return !!getHTMLTextForDetectLang(content, emojis);\n}\n\nconst SIZE_CLASS = {\n s: 'small',\n m: 'medium',\n l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\n text = text?.trim();\n\n // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md\n // 500 should be enough for now, also the default max chars for Mastodon\n if (text?.length > 500) {\n return null;\n }\n\n if (langDetector) {\n const langs = await langDetector.detect(text);\n console.groupCollapsed(\n '💬 DETECTLANG BROWSER',\n langs.slice(0, 3).map((l) => l.detectedLanguage),\n );\n console.log(text, langs.slice(0, 3));\n console.groupEnd();\n const lang = langs[0];\n if (lang?.detectedLanguage && lang?.confidence > 0.5) {\n return lang.detectedLanguage;\n }\n }\n\n const { detectAll } = await import('tinyld/light');\n const langs = detectAll(text);\n console.groupCollapsed(\n '💬 DETECTLANG TINYLD',\n langs.slice(0, 3).map((l) => l.lang),\n );\n console.log(text, langs.slice(0, 3));\n console.groupEnd();\n const lang = langs[0];\n if (lang?.lang && lang?.accuracy > 0.5) {\n // If > 50% accurate, use it\n // It can be accurate if < 50% but better be safe\n // Though > 50% also can be inaccurate 🤷‍♂️\n return lang.lang;\n }\n return null;\n});\n\nconst readMoreText = msg`Read more →`;\n\n// All this work just to make sure this only lazy-run once\n// Because first run is slow due to intl-localematcher\nconst DIFFERENT_LANG_CHECK = {};\nconst diffLangCheckCacheKey = (l, hls) => `${l}:${hls.join('|')}`;\nconst checkDifferentLanguage = (\n language,\n contentTranslationHideLanguages = [],\n) => {\n if (!language) return false;\n const cacheKey = diffLangCheckCacheKey(\n language,\n contentTranslationHideLanguages,\n );\n const targetLanguage = getTranslateTargetLanguage(true);\n const different =\n language !== targetLanguage &&\n !localeMatch([language], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => language === l || localeMatch([language], [l]),\n );\n if (different) {\n DIFFERENT_LANG_CHECK[cacheKey] = true;\n }\n return different;\n};\n\nconst quoteMessages = {\n quotePrivate: msg`Private posts cannot be quoted`,\n requestQuote: msg`Request to quote`,\n quoteManualReview: msg`Author will manually review`,\n quoteFollowersOnly: msg`Only followers can quote this post`,\n quoteCannot: msg`You are not allowed to quote this post`,\n};\n\nconst quoteApprovalPolicyMessages = {\n public: msg`Anyone can quote`,\n followers: msg`Your followers can quote`,\n nobody: msg`Only you can quote`,\n};\n\nconst QUESTION_REGEX = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n\nconst { DEV } = import.meta.env;\n\nfunction Status({\n statusID,\n status,\n instance: propInstance,\n size = 'm',\n contentTextWeight,\n readOnly,\n enableCommentHint,\n withinContext,\n skeleton,\n enableTranslate,\n forceTranslate: _forceTranslate,\n previewMode,\n allowFilters,\n onMediaClick,\n quoted,\n quoteDomain,\n onStatusLinkClick = () => {},\n showFollowedTags,\n allowContextMenu,\n showActionsBar,\n showReplyParent,\n mediaFirst,\n showCommentCount: forceShowCommentCount,\n showQuoteCount: forceShowQuoteCount,\n ghost,\n}) {\n const { _, t, i18n } = useLingui();\n const rtf = RTF(i18n.locale);\n\n if (ghost) {\n const { inReplyToAccountId } = ghost;\n const ghostAccount = inReplyToAccountId\n ? states.accounts[inReplyToAccountId]\n : null;\n return (\n <article\n class={`status ghost ${mediaFirst ? 'status-media-first small' : ''}`}\n >\n {!mediaFirst && (\n <Avatar\n size=\"xxl\"\n url={ghostAccount?.avatarStatic || ghostAccount?.avatar}\n squircle={ghostAccount?.bot}\n />\n )}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && (\n <Avatar\n size=\"m\"\n url={ghostAccount?.avatarStatic || ghostAccount?.avatar}\n squircle={ghostAccount?.bot}\n />\n )}\n {ghostAccount && (\n <NameText account={ghostAccount} showAvatar={false} />\n )}\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p class=\"insignificant\">\n <Trans>Post unavailable</Trans>\n </p>\n </div>\n </div>\n </div>\n </article>\n );\n }\n\n if (skeleton) {\n return (\n <div\n class={`status skeleton ${\n mediaFirst ? 'status-media-first small' : ''\n }`}\n >\n {!mediaFirst && <Avatar size=\"xxl\" />}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && <Avatar size=\"m\" />} ███ ████████\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p>████ ████████</p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const { instance: currentInstance } = api();\n const sameInstance = instance === currentInstance;\n\n let sKey = statusKey(statusID || status?.id, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n // const originalStatus = useRef(status);\n const { editHistoryRef, editHistoryMode, editedAtIndex } = useEditHistory();\n if (editHistoryMode && status?.editedAt && editHistoryRef.current.length) {\n const eStatus = editHistoryRef.current[editedAtIndex];\n if (eStatus) {\n status = {\n ...status,\n ...eStatus,\n };\n }\n } else {\n // Revert back to original status\n // Don't need to do anything, re-render will use the original status above\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n } = {},\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n quotesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language: _language,\n editedAt,\n filtered,\n card,\n taggedCollections,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments = [],\n reblog,\n quote,\n uri,\n url,\n emojis,\n tags,\n pinned,\n quoteApproval,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n // Non-Mastodon\n emojiReactions,\n } = status;\n\n const [languageAutoDetected, setLanguageAutoDetected] = useState(null);\n useEffect(() => {\n if (!content) return;\n if (_language) return;\n if (languageAutoDetected) return;\n let timer;\n timer = setTimeout(async () => {\n let detected = await detectLang(\n getHTMLTextForDetectLang(content, emojis),\n );\n setLanguageAutoDetected(detected);\n }, 1000);\n return () => clearTimeout(timer);\n }, [content, _language]);\n const language = _language || languageAutoDetected;\n\n // if (!mediaAttachments?.length) mediaFirst = false;\n const hasMediaAttachments = !!mediaAttachments?.length;\n if (mediaFirst && hasMediaAttachments) size = 's';\n\n const currentAccount = getCurrentAccID();\n const isSelf = currentAccount && currentAccount == accountId;\n\n const filterContext = useContext(FilterContext);\n const filterInfo =\n !isSelf &&\n ((!readOnly && !previewMode) || allowFilters) &&\n isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Status', id, status?.account?.displayName, quoted);\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n if (\n (allowFilters || size !== 'l') &&\n filterInfo &&\n filterInfo.action !== 'blur'\n ) {\n return (\n <FilteredStatus\n status={status}\n filterInfo={filterInfo}\n instance={instance}\n containerProps={{\n onMouseEnter: debugHover,\n }}\n showFollowedTags\n quoted={quoted}\n />\n );\n }\n\n const createdAtDate = new Date(createdAt);\n const editedAtDate = new Date(editedAt);\n\n let inReplyToAccountRef = mentions?.find(\n (mention) => mention.id === inReplyToAccountId,\n );\n if (!inReplyToAccountRef && inReplyToAccountId === id) {\n inReplyToAccountRef = { url: accountURL, username, displayName };\n }\n const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef);\n useEffect(() => {\n if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n const account = states.accounts[inReplyToAccountId];\n if (account) {\n setInReplyToAccount(account);\n return;\n }\n\n const abortController = new AbortController();\n memFetchAccount(inReplyToAccountId, masto, abortController.signal)\n .then((account) => {\n setInReplyToAccount(account);\n states.accounts[account.id] = account;\n })\n .catch((e) => {});\n\n return () => {\n abortController.abort();\n };\n }\n }, [withinContext, inReplyToAccount, inReplyToAccountId]);\n const mentionSelf =\n (inReplyToAccountId && inReplyToAccountId === currentAccount) ||\n mentions?.find((mention) => mention.id === currentAccount);\n\n const prefs = getPreferences();\n const readingExpandSpoilers = !!prefs['reading:expand:spoilers'];\n\n // default | show_all | hide_all\n const readingExpandMedia =\n prefs['reading:expand:media']?.toLowerCase() || 'default';\n\n // FOR TESTING:\n // const readingExpandSpoilers = true;\n // const readingExpandMedia = 'show_all';\n const showSpoiler =\n previewMode || readingExpandSpoilers || !!snapStates.spoilers[id];\n const showSpoilerMedia =\n previewMode ||\n (readingExpandMedia === 'show_all' && filterInfo?.action !== 'blur') ||\n !!snapStates.spoilersMedia[id];\n\n if (reblog) {\n // If has statusID, means useItemID (cached in states)\n\n if (group) {\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-group\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"group\" size=\"l\" alt={t`Group`} />{' '}\n <NameText account={status.account} instance={instance} showAvatar />\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-reblog\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"rocket\" size=\"l\" />{' '}\n <Trans>\n <NameText account={status.account} instance={instance} showAvatar />{' '}\n <span>boosted</span>\n </Trans>\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n enableCommentHint\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n // Check followedTags\n const FollowedTagsParent = useCallback(\n ({ children }) => (\n <div\n data-state-post-id={sKey}\n class=\"status-followed-tags\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n <Link\n key={tag}\n to={instance ? `/${instance}/t/${tag}` : `/t/${tag}`}\n class=\"status-followed-tag-item\"\n >\n {tag}\n </Link>\n ))}\n </div>\n {children}\n </div>\n ),\n [sKey, instance, snapStates.statusFollowedTags[sKey]],\n );\n const StatusParent =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length\n ? FollowedTagsParent\n : Fragment;\n\n const isSizeLarge = size === 'l';\n\n const contentLength = useMemo(() => htmlContentLength(content), [content]);\n\n const [forceTranslate, setForceTranslate] = useState(_forceTranslate);\n // const targetLanguage = getTranslateTargetLanguage(true);\n // const contentTranslationHideLanguages =\n // snapStates.settings.contentTranslationHideLanguages || [];\n const { contentTranslation, contentTranslationAutoInline } =\n snapStates.settings;\n if (!contentTranslation) enableTranslate = false;\n const inlineTranslate = useMemo(() => {\n if (\n !contentTranslation ||\n !contentTranslationAutoInline ||\n readOnly ||\n (withinContext && !isSizeLarge) ||\n previewMode ||\n spoilerText ||\n sensitive ||\n poll ||\n card /*||\n mediaAttachments?.length*/\n ) {\n return false;\n }\n return contentLength > 0 && contentLength <= INLINE_TRANSLATE_LIMIT;\n }, [\n contentTranslation,\n contentTranslationAutoInline,\n readOnly,\n withinContext,\n isSizeLarge,\n previewMode,\n spoilerText,\n sensitive,\n poll,\n card,\n mediaAttachments,\n contentLength,\n ]);\n\n const [showEdited, setShowEdited] = useState(false);\n const [showEmbed, setShowEmbed] = useState(false);\n const [showQuoteSettings, setShowQuoteSettings] = useState(false);\n const [showQuotes, setShowQuotes] = useState(false);\n const [showQuoteChain, setShowQuoteChain] = useState(false);\n\n const spoilerContentRef = useTruncated();\n const contentRef = useTruncated();\n const mediaContainerRef = useTruncated();\n\n const statusRef = useRef(null);\n const [reloadPostContentCount, reloadPostContent] = useReducer(\n (c) => c + 1,\n 0,\n );\n\n const unauthInteractionErrorMessage = t`Sorry, your current logged-in server can't interact with this post from another server.`;\n\n const textWeight = useCallback(\n () =>\n Math.max(\n Math.round(((spoilerText?.length || 0) + contentLength) / 140) || 1,\n 1,\n ),\n [spoilerText, contentLength],\n );\n\n const createdDateText = createdAt && niceDateTime(createdAtDate);\n const editedDateText = editedAt && niceDateTime(editedAtDate);\n\n // Can boost if:\n // - authenticated AND\n // - visibility != direct OR\n // - visibility = private AND isSelf\n const isPublic = ['public', 'unlisted'].includes(visibility);\n let canBoost = authenticated && isPublic;\n if (visibility === 'private' && isSelf) {\n canBoost = true;\n }\n\n // Quote logic blatantly copied from https://github.com/mastodon/mastodon/blob/854aaec6fe69df02e6d850cb90eef37032b4d72f/app/javascript/mastodon/components/status/boost_button_utils.ts#L131-L163\n let quoteDisabled = false;\n let quoteText = t`Quote`;\n let quoteMetaText;\n\n if (supportsNativeQuote()) {\n const isMine = isSelf;\n const isMineAndPrivate = isMine && visibility === 'private';\n const isQuoteAutomaticallyAccepted =\n quoteApproval?.currentUser === 'automatic' &&\n (isPublic || isMineAndPrivate);\n const isQuoteManuallyAccepted =\n quoteApproval?.currentUser === 'manual' && (isPublic || isMineAndPrivate);\n const isQuoteFollowersOnly =\n quoteApproval?.automatic?.[0] === 'followers' ||\n quoteApproval?.manual?.[0] === 'followers';\n if (!isPublic && !isMine) {\n quoteDisabled = true;\n quoteMetaText = _(quoteMessages.quotePrivate);\n } else if (isQuoteAutomaticallyAccepted) {\n // No need to do anything\n } else if (isQuoteManuallyAccepted) {\n quoteText = _(quoteMessages.requestQuote);\n quoteMetaText = _(quoteMessages.quoteManualReview);\n } else {\n quoteDisabled = true;\n quoteMetaText = isQuoteFollowersOnly\n ? _(quoteMessages.quoteFollowersOnly)\n : _(quoteMessages.quoteCannot);\n }\n }\n const canQuote = supportsNativeQuote() && !quoteDisabled;\n\n const postQuoteApprovalPolicy = getPostQuoteApprovalPolicy(quoteApproval);\n\n const replyStatus = (e, replyMode = 'all') => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n // syntheticEvent comes from MenuItem\n if (e?.shiftKey || e?.syntheticEvent?.shiftKey) {\n const newWin = openCompose({\n replyToStatus: status,\n replyMode,\n });\n if (newWin) return;\n }\n showCompose({\n replyToStatus: status,\n replyMode,\n });\n };\n\n // Check if media has no descriptions\n const mediaNoDesc = useMemo(() => {\n return mediaAttachments.some(\n (attachment) => !attachment.description?.trim?.(),\n );\n }, [mediaAttachments]);\n\n const statusMonthsAgo = useMemo(() => {\n return Math.floor(\n (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30),\n );\n }, [createdAtDate]);\n\n // const boostStatus = async () => {\n // if (!sameInstance || !authenticated) {\n // alert(unauthInteractionErrorMessage);\n // return false;\n // }\n // try {\n // if (!reblogged) {\n // let confirmText = 'Boost this post?';\n // if (mediaNoDesc) {\n // confirmText += '\\n\\n⚠️ Some media have no descriptions.';\n // }\n // const yes = confirm(confirmText);\n // if (!yes) {\n // return false;\n // }\n // }\n // // Optimistic\n // states.statuses[sKey] = {\n // ...status,\n // reblogged: !reblogged,\n // reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n // };\n // if (reblogged) {\n // const newStatus = await masto.v1.statuses.$select(id).unreblog();\n // saveStatus(newStatus, instance);\n // return true;\n // } else {\n // const newStatus = await masto.v1.statuses.$select(id).reblog();\n // saveStatus(newStatus, instance);\n // return true;\n // }\n // } catch (e) {\n // console.error(e);\n // // Revert optimistism\n // states.statuses[sKey] = status;\n // return false;\n // }\n // };\n const confirmBoostStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n reblogged: !reblogged,\n reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n };\n if (reblogged) {\n const newStatus = await masto.v1.statuses.$select(id).unreblog();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).reblog();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n\n const favouriteStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n favourited: !favourited,\n favouritesCount: favouritesCount + (favourited ? -1 : 1),\n };\n if (favourited) {\n const newStatus = await masto.v1.statuses.$select(id).unfavourite();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).favourite();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const favouriteStatusNotify = async () => {\n haptics.trigger('light');\n try {\n const done = await favouriteStatus();\n if (!isSizeLarge && done) {\n showToast(\n favourited\n ? t`Unliked @${username || acct}'s post`\n : t`Liked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n const bookmarkStatus = async () => {\n if (!supports('@mastodon/post-bookmark')) return;\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n bookmarked: !bookmarked,\n };\n if (bookmarked) {\n const newStatus = await masto.v1.statuses.$select(id).unbookmark();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).bookmark();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const bookmarkStatusNotify = async () => {\n haptics.trigger('light');\n try {\n const done = await bookmarkStatus();\n if (!isSizeLarge && done) {\n showToast(\n bookmarked\n ? t`Unbookmarked @${username || acct}'s post`\n : t`Bookmarked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n // const differentLanguage =\n // !!language &&\n // language !== targetLanguage &&\n // !localeMatch([language], [targetLanguage]) &&\n // !contentTranslationHideLanguages.find(\n // (l) => language === l || localeMatch([language], [l]),\n // );\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const [differentLanguage, setDifferentLanguage] = useState(\n DIFFERENT_LANG_CHECK[\n diffLangCheckCacheKey(language, contentTranslationHideLanguages)\n ],\n );\n useEffect(() => {\n if (!language || differentLanguage) {\n return;\n }\n if (\n !differentLanguage &&\n DIFFERENT_LANG_CHECK[\n diffLangCheckCacheKey(language, contentTranslationHideLanguages)\n ]\n ) {\n setDifferentLanguage(true);\n return;\n }\n let timeout = setTimeout(() => {\n const different = checkDifferentLanguage(\n language,\n contentTranslationHideLanguages,\n );\n if (different) setDifferentLanguage(different);\n }, 100);\n return () => clearTimeout(timeout);\n }, [language, differentLanguage]);\n\n const reblogIterator = useRef();\n const favouriteIterator = useRef();\n async function fetchBoostedLikedByAccounts(firstLoad) {\n if (firstLoad) {\n reblogIterator.current = masto.v1.statuses\n .$select(statusID)\n .rebloggedBy.list({\n limit: REACTIONS_LIMIT,\n })\n .values();\n favouriteIterator.current = masto.v1.statuses\n .$select(statusID)\n .favouritedBy.list({\n limit: REACTIONS_LIMIT,\n })\n .values();\n }\n const [{ value: reblogResults }, { value: favouriteResults }] =\n await Promise.allSettled([\n reblogIterator.current.next(),\n favouriteIterator.current.next(),\n ]);\n if (reblogResults.value?.length || favouriteResults.value?.length) {\n const accounts = [];\n if (reblogResults.value?.length) {\n accounts.push(\n ...reblogResults.value.map((a) => {\n a._types = ['reblog'];\n return a;\n }),\n );\n }\n if (favouriteResults.value?.length) {\n accounts.push(\n ...favouriteResults.value.map((a) => {\n a._types = ['favourite'];\n return a;\n }),\n );\n }\n return {\n value: accounts,\n done: reblogResults.done && favouriteResults.done,\n };\n }\n return {\n value: [],\n done: true,\n };\n }\n\n const isQuotingMyPost =\n quote?.state === 'accepted' &&\n quote?.quotedStatus?.account?.id === currentAccount;\n\n const actionsRef = useRef();\n const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n const menuFooter =\n mediaNoDesc && !reblogged ? (\n <div class=\"footer\">\n <Icon icon=\"alert\" />\n <Trans>Some media have no descriptions.</Trans>\n </div>\n ) : (\n statusMonthsAgo >= 3 && (\n <div class=\"footer\">\n <Icon icon=\"info\" />\n <span>\n <Trans>\n Old post (<strong>{rtf.format(-statusMonthsAgo, 'month')}</strong>\n )\n </Trans>\n </span>\n </div>\n )\n );\n const mentionsCount = useMemo(() => {\n if (!mentions?.length) return false;\n const allMentions = new Set([accountId, ...mentions.map((m) => m.id)]);\n return [...allMentions].filter((m) => m !== currentAccount).length;\n }, [accountId, mentions?.length, currentAccount]);\n const tooManyMentions = mentionsCount > 3;\n const ReplyMenuContent = () => (\n <>\n <Icon icon=\"comment\" />\n <span>\n {repliesCount > 0\n ? shortenNumber(repliesCount)\n : tooManyMentions\n ? t`Reply…`\n : t`Reply`}\n </span>\n </>\n );\n const replyModeMenuItems = (\n <>\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, 'all');\n }}\n >\n <small>\n <Trans>Reply all</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Plural value={mentionsCount} other=\"# mentions\" />\n </span>\n </small>\n </MenuItem>\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, 'author-first');\n }}\n >\n <small>\n <Trans>Reply all</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Plural\n value={mentionsCount - 1}\n other={\n <Trans comment=\"Author mention appears first, other mentions appear below with newlines in between\">\n <span class=\"bidi-isolate\">@{username || acct}</span> first, #\n others below\n </Trans>\n }\n />\n </span>\n </small>\n </MenuItem>\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, 'author-only');\n }}\n >\n <small>\n <Trans>Reply</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>\n Only <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n </span>\n </small>\n </MenuItem>\n </>\n );\n const StatusMenuItems = (\n <>\n {!isSizeLarge && sameInstance && (\n <>\n <div class=\"menu-control-group-horizontal status-menu\">\n {tooManyMentions ? (\n <SubMenu2\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n label={<ReplyMenuContent />}\n >\n {replyModeMenuItems}\n </SubMenu2>\n ) : (\n <MenuItem\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e);\n }}\n >\n <ReplyMenuContent />\n </MenuItem>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n </>\n }\n className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n menuExtras={\n <>\n {supportsNativeQuote() && (\n <MenuItem\n disabled={quoteDisabled}\n onClick={() => {\n showCompose({\n quoteStatus: status,\n });\n }}\n >\n <Icon icon=\"quote\" />\n {quoteMetaText ? (\n <small>\n {quoteText}\n <br />\n {quoteMetaText}\n </small>\n ) : (\n <span>{quoteText}</span>\n )}\n </MenuItem>\n )}\n {(DEV || !supportsNativeQuote()) && (\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote with link</Trans>\n </span>\n {supportsNativeQuote() && DEV && (\n <small class=\"tag collapsed\">DEV</small>\n )}\n </MenuItem>\n )}\n </>\n }\n menuFooter={menuFooter}\n disabled={!canBoost}\n onClick={async () => {\n haptics.trigger('light');\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n }}\n >\n {canQuote ? (\n <span class=\"icon\">\n <Icon icon=\"rocket\" />\n <Icon icon=\"quote\" />\n </span>\n ) : (\n <Icon icon=\"rocket\" />\n )}\n <span>\n {reblogsCount > 0 || quotesCount > 0\n ? `${reblogsCount > 0 ? shortenNumber(reblogsCount) : ''}${\n reblogsCount > 0 && quotesCount > 0 ? '+' : ''\n }${quotesCount > 0 ? shortenNumber(quotesCount) : ''}`\n : reblogged\n ? t`Unboost`\n : canQuote\n ? t`Boost/Quote…`\n : t`Boost…`}\n </span>\n </MenuConfirm>\n <MenuItem\n onClick={favouriteStatusNotify}\n className={`menu-favourite ${favourited ? 'checked' : ''}`}\n >\n <Icon icon=\"heart\" />\n <span>\n {favouritesCount > 0\n ? shortenNumber(favouritesCount)\n : favourited\n ? t`Unlike`\n : t`Like`}\n </span>\n </MenuItem>\n {supports('@mastodon/post-bookmark') && (\n <MenuItem\n onClick={bookmarkStatusNotify}\n className={`menu-bookmark ${bookmarked ? 'checked' : ''}`}\n >\n <Icon icon=\"bookmark\" />\n <span>{bookmarked ? t`Unbookmark` : t`Bookmark`}</span>\n </MenuItem>\n )}\n </div>\n </>\n )}\n {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n <MenuDivider />\n )}\n {(isSizeLarge || showActionsBar) && (\n <>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n heading: t`Boosted/Liked by…`,\n fetchAccounts: fetchBoostedLikedByAccounts,\n instance,\n showReactions: true,\n postID: sKey,\n };\n }}\n >\n <Icon icon=\"react\" />\n <span>\n <Trans>Boosted/Liked by…</Trans>\n </span>\n </MenuItem>\n {supportsNativeQuote() && (\n <MenuItem\n onClick={() => {\n setShowQuotes(true);\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>View Quotes</Trans>\n </span>\n </MenuItem>\n )}\n {quote?.quotedStatus?.quote && (\n <MenuItem\n onClick={() => {\n setShowQuoteChain(true);\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Unwrap quote chain</Trans>\n </span>\n </MenuItem>\n )}\n </>\n )}\n {(isSizeLarge ||\n (!mediaFirst &&\n (enableTranslate || !language || differentLanguage))) && (\n <MenuDivider />\n )}\n {!mediaFirst && (enableTranslate || !language || differentLanguage) && (\n <div class={supportsTTS ? 'menu-horizontal' : ''}>\n {enableTranslate ? (\n <MenuItem\n disabled={forceTranslate}\n onClick={() => setForceTranslate(true)}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuItem>\n ) : (\n <MenuLink\n to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuLink>\n )}\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n try {\n const postText = getPostText(status, {\n hideInlineQuote: supportsNativeQuote(),\n });\n if (postText) {\n speak(postText, language);\n }\n } catch (error) {\n console.error('Failed to speak text:', error);\n }\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n )}\n {isSizeLarge && (\n <MenuItem\n onClick={() => {\n try {\n const postText = getPostText(status, {\n hideInlineQuote: supportsNativeQuote(),\n htmlTextOpts: {\n truncateLinks: false,\n },\n });\n navigator.clipboard.writeText(postText);\n showToast(t`Post text copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy post text`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />\n <span>\n <Trans>Copy post text</Trans>\n </span>\n </MenuItem>\n )}\n {((!isSizeLarge && sameInstance) ||\n enableTranslate ||\n !language ||\n differentLanguage) && <MenuDivider />}\n {!isSizeLarge && (\n <>\n <MenuLink\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n onStatusLinkClick(e, status);\n }}\n >\n <Icon icon=\"arrows-right\" />\n <small>\n <Trans>\n View post by{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(visibilityText[visibility])} • {createdDateText}\n </span>\n </small>\n </MenuLink>\n </>\n )}\n {!!editedAt && (\n <>\n <MenuItem\n onClick={() => {\n setShowEdited(id);\n }}\n >\n <Icon icon=\"history\" />\n <small>\n <Trans>Show Edit History</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>Edited: {editedDateText}</Trans>\n </span>\n </small>\n </MenuItem>\n </>\n )}\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small\n class=\"menu-double-lines should-cloak\"\n style={{\n maxWidth: '16em',\n }}\n >\n {nicePostURL(url)}\n </small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy</Trans>\n </span>\n </MenuItem>\n {isPublic &&\n navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>\n <Trans>Share…</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n {isPublic && isSizeLarge && (\n <MenuItem\n onClick={() => {\n setShowEmbed(true);\n }}\n >\n <Icon icon=\"code\" />\n <span>\n <Trans>Embed post</Trans>\n </span>\n </MenuItem>\n )}\n {authenticated && (\n <>\n {(isSelf || mentionSelf) && <MenuDivider />}\n {(isSelf || mentionSelf) && (\n <MenuItem\n onClick={async () => {\n haptics.trigger('light');\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [muted ? 'unmute' : 'mute']();\n saveStatus(newStatus, instance);\n showToast(\n muted ? t`Conversation unmuted` : t`Conversation muted`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n muted\n ? t`Unable to unmute conversation`\n : t`Unable to mute conversation`,\n );\n }\n }}\n >\n {muted ? (\n <>\n <Icon icon=\"unmute\" />\n <span>\n <Trans>Unmute conversation</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"mute\" />\n <span>\n <Trans>Mute conversation</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && isPinnable && (\n <MenuItem\n onClick={async () => {\n haptics.trigger('light');\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [pinned ? 'unpin' : 'pin']();\n saveStatus(newStatus, instance);\n showToast(\n pinned\n ? t`Post unpinned from profile`\n : t`Post pinned to profile`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n pinned ? t`Unable to unpin post` : t`Unable to pin post`,\n );\n }\n }}\n >\n {pinned ? (\n <>\n <Icon icon=\"unpin\" />\n <span>\n <Trans>Unpin from profile</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"pin\" />\n <span>\n <Trans>Pin to profile</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && (\n <>\n {supportsNativeQuote() &&\n !['private', 'direct'].includes(visibility) && (\n <MenuItem onClick={() => setShowQuoteSettings(true)}>\n <Icon icon=\"quote2\" />\n <small>\n <Trans>Quote settings</Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(\n quoteApprovalPolicyMessages[postQuoteApprovalPolicy],\n )}\n </span>\n </small>\n </MenuItem>\n )}\n <div class=\"menu-horizontal\">\n {supports('@mastodon/post-edit') && (\n <MenuItem\n onClick={() => {\n showCompose({\n editStatus: status,\n quoteStatus: status.quote?.quotedStatus,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit</Trans>\n </span>\n </MenuItem>\n )}\n {isSizeLarge && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete this post?</Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Delete this post?');\n // if (yes) {\n (async () => {\n try {\n await masto.v1.statuses.$select(id).remove();\n const cachedStatus = getStatus(id, instance);\n cachedStatus._deleted = true;\n showToast(t`Post deleted`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to delete post`);\n }\n })();\n // }\n }}\n >\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete…</Trans>\n </span>\n </MenuConfirm>\n )}\n </div>\n </>\n )}\n {!isSelf && isSizeLarge && (\n <>\n <MenuDivider />\n {isQuotingMyPost && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"quote\" />\n <span>\n <Trans>\n Remove my post from{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n 's post?\n </Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n haptics.trigger('light');\n (async () => {\n try {\n // POST /api/v1/statuses/:id/quotes/:quoting_status_id/revoke\n const quotedStatusID = quote.quotedStatus.id;\n await masto.v1.statuses\n .$select(quotedStatusID)\n .quotes.$select(id)\n .revoke.create();\n showToast(t`Quote removed`);\n states.reloadStatusPage++;\n } catch (e) {\n console.error(e);\n showToast(t`Unable to remove quote`);\n }\n })();\n }}\n >\n <Icon icon=\"quote\" />\n <Trans>Remove quote…</Trans>\n </MenuConfirm>\n )}\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: status.account,\n post: status,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>\n <Trans>Report post…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </>\n )}\n </>\n );\n\n const contextMenuRef = useRef();\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuProps, setContextMenuProps] = useState({});\n\n const showContextMenu =\n allowContextMenu || (!isSizeLarge && !previewMode && !_deleted && !quoted);\n\n // Only iOS/iPadOS browsers don't support contextmenu\n // Some comments report iPadOS might support contextmenu if a mouse is connected\n const bindLongPressContext = useLongPress(\n isIOS && showContextMenu\n ? (e) => {\n if (e.pointerType === 'mouse') return;\n // There's 'pen' too, but not sure if contextmenu event would trigger from a pen\n\n const { clientX, clientY } = e.touches?.[0] || e;\n // link detection copied from onContextMenu because here it works\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: clientX,\n y: clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }\n : null,\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const hotkeysEnabled = !readOnly && !previewMode && !quoted;\n const rRef = useHotkeys(\n 'r, shift+r',\n (e, handler) => {\n // Fix bug: shift+r is fired even when r is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n replyStatus(e);\n },\n {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey || e.ctrlKey || e.altKey || e.key.toLowerCase() !== 'r',\n },\n );\n const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n enabled: hotkeysEnabled,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n !['f', 'l'].includes(e.key.toLowerCase()),\n useKey: true,\n });\n const dRef = useHotkeys('d', bookmarkStatusNotify, {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n e.key.toLowerCase() !== 'd',\n });\n const bRef = useHotkeys(\n 'shift+b',\n (e) => {\n // Need shiftKey check due to useKey: true\n if (!e.shiftKey) return;\n\n (async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n })();\n },\n {\n enabled: hotkeysEnabled && canBoost,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey || e.ctrlKey || e.altKey || e.key.toLowerCase() !== 'b',\n },\n );\n const xRef = useHotkeys(\n 'x',\n (e) => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const spoilerButton = activeStatus.querySelector(\n '.spoiler-button:not(.spoiling)',\n );\n if (spoilerButton) {\n e.stopPropagation();\n spoilerButton.click();\n } else {\n const spoilerMediaButton = activeStatus.querySelector(\n '.spoiler-media-button:not(.spoiling)',\n );\n if (spoilerMediaButton) {\n e.stopPropagation();\n spoilerMediaButton.click();\n }\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n e.key.toLowerCase() !== 'x',\n },\n );\n const qRef = useHotkeys(\n 'q',\n (e) => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n\n if (supportsNativeQuote()) {\n if (quoteDisabled) {\n showToast(quoteMetaText);\n } else {\n showCompose({\n quoteStatus: status,\n });\n }\n // Don't fallback to non-native if quoteDisabled\n } else {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }\n },\n {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) =>\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey ||\n e.key.toLowerCase() !== 'q',\n },\n );\n\n const displayedMediaAttachments = mediaAttachments.slice(\n 0,\n isSizeLarge ? undefined : 4,\n );\n const showMultipleMediaCaptions =\n mediaAttachments.length > 1 &&\n displayedMediaAttachments.some(\n (media) => !!media.description && !isMediaCaptionLong(media.description),\n );\n const captionChildren = useMemo(() => {\n if (!showMultipleMediaCaptions) return null;\n const attachments = [];\n displayedMediaAttachments.forEach((media, i) => {\n if (!media.description) return;\n const index = attachments.findIndex(\n (attachment) => attachment.media.description === media.description,\n );\n if (index === -1) {\n attachments.push({\n media,\n indices: [i],\n });\n } else {\n attachments[index].indices.push(i);\n }\n });\n return attachments.map(({ media, indices }) => (\n <div\n key={media.id}\n data-caption-index={indices.map((i) => i + 1).join(' ')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: media.description,\n lang: language,\n };\n }}\n title={media.description}\n >\n <sup>{indices.map((i) => i + 1).join(' ')}</sup> {media.description}\n </div>\n ));\n\n // return displayedMediaAttachments.map(\n // (media, i) =>\n // !!media.description && (\n // <div\n // key={media.id}\n // data-caption-index={i + 1}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // states.showMediaAlt = {\n // alt: media.description,\n // lang: language,\n // };\n // }}\n // title={media.description}\n // >\n // <sup>{i + 1}</sup> {media.description}\n // </div>\n // ),\n // );\n }, [showMultipleMediaCaptions, displayedMediaAttachments, language]);\n\n const isThread = useMemo(() => {\n return (\n (!!inReplyToId && inReplyToAccountId === status.account?.id) ||\n !!snapStates.statusThreadNumber[sKey]\n );\n }, [\n inReplyToId,\n inReplyToAccountId,\n status.account?.id,\n snapStates.statusThreadNumber[sKey],\n ]);\n\n const showCommentHint = useMemo(() => {\n return (\n enableCommentHint &&\n !isThread &&\n !withinContext &&\n !inReplyToId &&\n visibility === 'public' &&\n repliesCount > 0\n );\n }, [\n enableCommentHint,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n visibility,\n ]);\n const showCommentCount = useMemo(() => {\n if (forceShowCommentCount && repliesCount > 0) return true;\n if (\n card ||\n poll ||\n sensitive ||\n spoilerText ||\n mediaAttachments?.length ||\n isThread ||\n withinContext ||\n inReplyToId ||\n repliesCount <= 0\n ) {\n return false;\n }\n const containsQuestion = QUESTION_REGEX.test(content);\n if (!containsQuestion) return false;\n if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n return true;\n }\n }, [\n forceShowCommentCount,\n card,\n poll,\n sensitive,\n spoilerText,\n mediaAttachments,\n reblog,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n content,\n contentLength,\n ]);\n\n // Keep this simple for now, unlike showCommentCount\n const showQuoteCount =\n typeof forceShowQuoteCount === 'function'\n ? forceShowQuoteCount(quotesCount)\n : forceShowQuoteCount && quotesCount > 0;\n\n const collectionsWithCard = useMemo(() => {\n const tc = taggedCollections ?? [];\n const cardUrl = card?.url;\n const matchIndex = tc.findIndex((c) => isSameURL(c.url, cardUrl));\n\n if (matchIndex === -1) return [];\n\n const matched = tc[matchIndex];\n const others = tc.filter((_, i) => i !== matchIndex);\n\n return [matched, ...others].slice(0, MAX_COLLECTIONS);\n }, [taggedCollections, card?.url]);\n\n return (\n <StatusParent>\n {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n <StatusCompact sKey={sKey} />\n )}\n <article\n data-state-post-id={sKey}\n ref={(node) => {\n statusRef.current = node;\n // Use parent node if it's in focus\n // Use case: <a><status /></a>\n // When navigating (j/k), the <a> is focused instead of <status />\n // Hotkey binding doesn't bubble up thus this hack\n const nodeRef =\n node?.closest?.(\n '.timeline-item, .timeline-item-alt, .status-link, .status-focus',\n ) || node;\n rRef.current = nodeRef;\n fRef.current = nodeRef;\n dRef.current = nodeRef;\n bRef.current = nodeRef;\n xRef.current = nodeRef;\n qRef.current = nodeRef;\n }}\n tabindex=\"-1\"\n class={`status ${\n !withinContext && inReplyToId && inReplyToAccount\n ? 'status-reply-to'\n : ''\n } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${\n SIZE_CLASS[size]\n } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${\n isContextMenuOpen ? 'status-menu-open' : ''\n } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`}\n onMouseEnter={debugHover}\n onContextMenu={(e) => {\n if (!showContextMenu) return;\n if (e.metaKey) return;\n // console.log('context menu', e);\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n\n // If there's selected text, don't show custom context menu\n const selection = window.getSelection?.();\n if (selection.toString().length > 0) {\n const { anchorNode } = selection;\n if (statusRef.current?.contains(anchorNode)) {\n return;\n }\n }\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: e.clientX,\n y: e.clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }}\n {...(showContextMenu ? bindLongPressContext() : {})}\n >\n {showContextMenu && (\n <ControlledMenu\n ref={contextMenuRef}\n state={isContextMenuOpen ? 'open' : undefined}\n {...contextMenuProps}\n onClose={(e) => {\n setIsContextMenuOpen(false);\n // statusRef.current?.focus?.();\n // if (e?.reason === 'click') {\n // statusRef.current?.closest('[tabindex]')?.focus?.();\n // }\n }}\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n onClick: () => {\n contextMenuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n boundingBoxPadding={safeBoundingBoxPadding()}\n unmountOnClose\n >\n {StatusMenuItems}\n </ControlledMenu>\n )}\n {showActionsBar &&\n size !== 'l' &&\n !previewMode &&\n !readOnly &&\n !_deleted &&\n !quoted && (\n <div\n class={`status-actions ${\n isContextMenuOpen === 'actions-bar' ? 'open' : ''\n }`}\n ref={actionsRef}\n >\n <StatusButton\n size=\"s\"\n title={t`Reply`}\n alt={t`Reply`}\n class=\"reply-button\"\n icon=\"comment\"\n iconSize=\"m\"\n // Menu doesn't work here\n // Temporary solution: reply author-first if too many mentions\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e, tooManyMentions ? 'author-first' : 'all');\n }}\n />\n <StatusButton\n size=\"s\"\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n iconSize=\"m\"\n count={favouritesCount}\n onClick={favouriteStatusNotify}\n />\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'start',\n direction: 'left',\n gap: 0,\n shift: -8,\n });\n setIsContextMenuOpen('actions-bar');\n }}\n >\n <Icon icon=\"more2\" size=\"m\" alt={t`More`} />\n </button>\n </div>\n )}\n {size !== 'l' && (\n <div class=\"status-badge\">\n {reblogged && (\n <Icon class=\"reblog\" icon=\"rocket\" size=\"s\" alt={t`Boosted`} />\n )}\n {favourited && (\n <Icon class=\"favourite\" icon=\"heart\" size=\"s\" alt={t`Liked`} />\n )}\n {bookmarked && (\n <Icon\n class=\"bookmark\"\n icon=\"bookmark\"\n size=\"s\"\n alt={t`Bookmarked`}\n />\n )}\n {_pinned && (\n <Icon class=\"pin\" icon=\"pin\" size=\"s\" alt={t`Pinned`} />\n )}\n </div>\n )}\n {size !== 's' && (\n <a\n href={accountURL}\n tabindex=\"-1\"\n // target=\"_blank\"\n title={`@${acct}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: status.account,\n instance,\n };\n }}\n >\n <Avatar url={avatarStatic || avatar} size=\"xxl\" squircle={bot} />\n </a>\n )}\n <div class=\"container\">\n {!!quoteDomain && (\n <div class=\"status-quote-meta\">\n <span class=\"domain\">{quoteDomain}</span>\n </div>\n )}\n {!!(status.account || createdAt) && (\n <div class=\"meta\">\n <span class=\"meta-name\">\n <NameText\n account={status.account}\n instance={instance}\n showAvatar={size === 's'}\n showAcct={isSizeLarge}\n />\n </span>\n {withinContext && isThread && (\n <ThreadBadge\n showIcon={isSizeLarge}\n index={snapStates.statusThreadNumber[sKey]}\n />\n )}\n {/* {inReplyToAccount && !withinContext && size !== 's' && (\n <>\n {' '}\n <span class=\"ib\">\n <Icon icon=\"arrow-right\" class=\"arrow\" />{' '}\n <NameText account={inReplyToAccount} instance={instance} short />\n </span>\n </>\n )} */}\n {/* </span> */}{' '}\n {size !== 'l' &&\n (_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : url && !previewMode && !readOnly && !quoted ? (\n <Link\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n if (\n e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.altKey ||\n e.which === 2\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n onStatusLinkClick?.(e, status);\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'end',\n direction: 'bottom',\n gap: 4,\n });\n setIsContextMenuOpen(true);\n }}\n class={`time ${\n isContextMenuOpen && contextMenuProps?.anchorRef\n ? 'is-open'\n : ''\n }`}\n >\n {showCommentHint && !showCommentCount ? (\n <Icon\n icon=\"comment2\"\n size=\"s\"\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : visibility !== 'public' && visibility !== 'direct' ? (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n ) : editedAt && size === 's' ? (\n <Icon icon=\"pencil\" size=\"s\" alt={t`Edited`} />\n ) : null}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n {!previewMode && !readOnly && (\n <Icon icon=\"more2\" class=\"more\" alt={t`More`} />\n )}\n </Link>\n ) : (\n // <Menu\n // instanceRef={menuInstanceRef}\n // portal={{\n // target: document.body,\n // }}\n // containerProps={{\n // style: {\n // // Higher than the backdrop\n // zIndex: 1001,\n // },\n // onClick: (e) => {\n // if (e.target === e.currentTarget)\n // menuInstanceRef.current?.closeMenu?.();\n // },\n // }}\n // align=\"end\"\n // gap={4}\n // overflow=\"auto\"\n // viewScroll=\"close\"\n // boundingBoxPadding=\"8 8 8 8\"\n // unmountOnClose\n // menuButton={({ open }) => (\n // <Link\n // to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // onStatusLinkClick?.(e, status);\n // }}\n // class={`time ${open ? 'is-open' : ''}`}\n // >\n // <Icon\n // icon={visibilityIconsMap[visibility]}\n // alt={visibilityText[visibility]}\n // size=\"s\"\n // />{' '}\n // <RelativeTime datetime={createdAtDate} format=\"micro\" />\n // </Link>\n // )}\n // >\n // {StatusMenuItems}\n // </Menu>\n <span class=\"time\">\n {showCommentHint && !showCommentCount ? (\n <Icon\n icon=\"comment2\"\n size=\"s\"\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : visibility !== 'public' && visibility !== 'direct' ? (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n ) : editedAt && size === 's' ? (\n <Icon icon=\"pencil\" size=\"s\" alt={t`Edited`} />\n ) : null}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </span>\n ))}\n </div>\n )}\n <LazyRender id={sKey} class=\"pre-content-container\">\n {visibility === 'direct' && (\n <>\n <div class=\"status-direct-badge\">\n <Trans>Private mention</Trans>\n </div>{' '}\n </>\n )}\n {!withinContext &&\n (isThread ? (\n <ThreadBadge\n showIcon\n showText\n index={snapStates.statusThreadNumber[sKey]}\n />\n ) : (\n !!inReplyToId &&\n !!inReplyToAccount &&\n (!!spoilerText ||\n !mentions.find((mention) => {\n return mention.id === inReplyToAccountId;\n })) && (\n <div class=\"status-reply-badge\">\n <Icon icon=\"reply\" />{' '}\n <NameText\n account={inReplyToAccount}\n instance={instance}\n short\n />\n </div>\n )\n ))}\n </LazyRender>\n <div\n class={`content-container ${\n spoilerText ||\n sensitive ||\n filterInfo?.action === 'blur' ||\n readingExpandMedia === 'hide_all'\n ? 'has-spoiler'\n : ''\n } ${showSpoiler ? 'show-spoiler' : ''} ${\n showSpoilerMedia ? 'show-media' : ''\n }`}\n data-content-text-weight={contentTextWeight ? textWeight() : null}\n style={\n (isSizeLarge || contentTextWeight) && {\n '--content-text-weight': textWeight(),\n }\n }\n >\n {mediaFirst && hasMediaAttachments ? (\n <>\n {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n <>\n {!!spoilerText && (\n <span\n class=\"spoiler-content media-first-spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <EmojiText text={spoilerText} emojis={emojis} />{' '}\n </span>\n )}\n <button\n class={`light spoiler-button media-first-spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n </>\n )}\n <MediaFirstContainer\n mediaAttachments={mediaAttachments}\n language={language}\n postID={id}\n instance={instance}\n />\n {!!content && (\n <div class=\"media-first-content content\" ref={contentRef}>\n <PostContent\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n </>\n ) : (\n <>\n {!!spoilerText && (\n <>\n <div\n class=\"content spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <p>\n <EmojiText text={spoilerText} emojis={emojis} />\n </p>\n </div>\n {readingExpandSpoilers || previewMode ? (\n <div class=\"spoiler-divider\">\n <Icon icon=\"eye-open\" /> <Trans>Content warning</Trans>\n </div>\n ) : (\n <button\n class={`light spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n )}\n </>\n )}\n {!!content && (\n <div\n class=\"content\"\n ref={contentRef}\n data-read-more={_(readMoreText)}\n inert={!!spoilerText && !showSpoiler ? true : undefined}\n >\n <PostContent\n key={reloadPostContentCount}\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n {!!content && (\n <MathBlock\n content={content}\n contentRef={contentRef}\n onRevert={reloadPostContent}\n />\n )}\n {!!poll && (\n <Poll\n lang={language}\n poll={poll}\n readOnly={readOnly || !sameInstance || !authenticated}\n onUpdate={(newPoll) => {\n states.statuses[sKey].poll = newPoll;\n }}\n refresh={() => {\n return masto.v1.polls\n .$select(poll.id)\n .fetch()\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n votePoll={(choices) => {\n return masto.v1.polls\n .$select(poll.id)\n .votes.create({\n choices,\n })\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n });\n }}\n />\n )}\n {(((enableTranslate || inlineTranslate) &&\n isTranslateble(content, emojis) &&\n differentLanguage) ||\n forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate || inlineTranslate}\n mini={!isSizeLarge && !withinContext}\n sourceLanguage={language}\n autoDetected={languageAutoDetected}\n text={getPostText(status, {\n maskCustomEmojis: true,\n maskURLs: true,\n // Hide regardless of native quote support\n // They are not useful in translation context\n hideInlineQuote: true,\n })}\n />\n )}\n {!previewMode &&\n (sensitive ||\n filterInfo?.action === 'blur' ||\n readingExpandMedia === 'hide_all') &&\n !!mediaAttachments.length &&\n (readingExpandMedia !== 'show_all' ||\n filterInfo?.action === 'blur') && (\n <button\n class={`plain spoiler-media-button ${\n showSpoilerMedia ? 'spoiling' : ''\n }`}\n type=\"button\"\n hidden={!readingExpandSpoilers && !!spoilerText}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoilerMedia) {\n delete states.spoilersMedia[id];\n } else {\n states.spoilersMedia[id] = true;\n }\n }}\n >\n <Icon\n icon={showSpoilerMedia ? 'eye-open' : 'eye-close'}\n />{' '}\n <span>\n {filterInfo?.action === 'blur' && (\n <small>\n <Trans>Filtered: {filterInfo?.titlesStr}</Trans>\n <br />\n </small>\n )}\n {showSpoilerMedia ? t`Show less` : t`Show media`}\n </span>\n </button>\n )}\n {!!mediaAttachments.length &&\n (mediaAttachments.length > 1 &&\n (isSizeLarge || (withinContext && size === 'm')) ? (\n <div class=\"media-large-container\">\n {mediaAttachments.map((media, i) => (\n <div key={media.id} class={`media-container media-eq1`}>\n <Media\n media={media}\n autoAnimate\n showCaption\n allowLongerCaption={!content || isSizeLarge}\n lang={language}\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => onMediaClick(e, i, media, status)\n : undefined\n }\n />\n </div>\n ))}\n </div>\n ) : (\n <MultipleMediaFigure\n lang={language}\n enabled={showMultipleMediaCaptions}\n captionChildren={captionChildren}\n >\n <div\n ref={mediaContainerRef}\n class={`media-container media-eq${\n mediaAttachments.length\n } ${mediaAttachments.length > 2 ? 'media-gt2' : ''} ${\n mediaAttachments.length > 4 ? 'media-gt4' : ''\n }`}\n >\n {displayedMediaAttachments.map((media, i) => (\n <Media\n key={media.id}\n media={media}\n autoAnimate={isSizeLarge}\n showCaption={mediaAttachments.length === 1}\n allowLongerCaption={\n !content && mediaAttachments.length === 1\n }\n lang={language}\n altIndex={\n showMultipleMediaCaptions &&\n !!media.description &&\n i + 1\n }\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => {\n onMediaClick(e, i, media, status);\n }\n : undefined\n }\n checkAspectRatio={mediaAttachments.length === 1}\n />\n ))}\n </div>\n </MultipleMediaFigure>\n ))}\n <QuoteStatuses\n id={id}\n instance={instance}\n level={quoted}\n collapsed={!isSizeLarge && !withinContext}\n fallbackQuote={quote}\n />\n {!poll &&\n !mediaAttachments.length &&\n !snapStates.statusQuotes[sKey] &&\n (collectionsWithCard.length ? (\n <div class=\"collections-container\">\n {collectionsWithCard.map((collection) => (\n <CollectionCard\n key={collection.id}\n collection={collection}\n instance={currentInstance}\n creatorAccount={\n collection.accountId === accountId\n ? status.account\n : undefined\n }\n size={size}\n />\n ))}\n </div>\n ) : !!card && /^https/i.test(card?.url) ? (\n <StatusCard\n card={card}\n selfReferential={\n card?.url === status.url || card?.url === status.uri\n }\n selfAuthor={card?.authors?.some(\n (a) => a.account?.url === accountURL,\n )}\n instance={currentInstance}\n />\n ) : taggedCollections?.length ? (\n <div class=\"collections-container\">\n {/* Limit to 4, for now. */}\n {taggedCollections.slice(0, 4).map((collection) => (\n <CollectionCard\n key={collection.id}\n collection={collection}\n instance={currentInstance}\n creatorAccount={\n collection.accountId === accountId\n ? status.account\n : undefined\n }\n size={size}\n />\n ))}\n </div>\n ) : null)}\n {size !== 's' && <StatusTags tags={tags} content={content} />}\n </>\n )}\n </div>\n {!isSizeLarge && (showCommentCount || showQuoteCount) && (\n <div class=\"content-comment-hint insignificant\">\n {showCommentCount && (\n <>\n <Icon icon=\"comment2\" alt={t`Replies`} /> {repliesCount}\n </>\n )}{' '}\n {showQuoteCount && (\n <>\n <Icon icon=\"quote\" alt={t`Quotes`} /> {quotesCount}\n </>\n )}\n </div>\n )}\n {isSizeLarge && (\n <>\n <div class=\"extra-meta\">\n {_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : (\n <>\n <Icon icon={visibilityIconsMap[visibility]} alt=\"\" />{' '}\n <span>{_(visibilityText[visibility])}</span> &bull;{' '}\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {\n // within a day\n Date.now() - createdAtDate.getTime() < 86400000 && (\n <>\n <RelativeTime\n datetime={createdAtDate}\n format=\"micro\"\n />{' '}\n ‒{' '}\n </>\n )\n }\n {!!createdAt && (\n <time\n class=\"created\"\n datetime={createdAtDate.toISOString()}\n title={createdAtDate.toLocaleString()}\n >\n {createdDateText}\n </time>\n )}\n </a>\n {editedAt && (\n <span class=\"edited-container\">\n {' '}\n &bull; <Icon icon=\"pencil\" alt={t`Edited`} />{' '}\n <time\n tabIndex=\"0\"\n class=\"edited\"\n datetime={editedAtDate.toISOString()}\n onClick={() => {\n setShowEdited(id);\n }}\n >\n {editedDateText}\n </time>\n </span>\n )}\n </>\n )}\n </div>\n {!!emojiReactions?.length && (\n <div class=\"emoji-reactions\">\n {emojiReactions.map((emojiReaction) => {\n const { name, count, me, url, staticUrl } = emojiReaction;\n if (url) {\n // Some servers return url and staticUrl\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={url}\n staticUrl={staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n const isShortCode = /^:.+?:$/.test(name);\n if (isShortCode) {\n const emoji = emojis.find(\n (e) =>\n e.shortcode ===\n name.replace(/^:/, '').replace(/:$/, ''),\n );\n if (emoji) {\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={emoji.url}\n staticUrl={emoji.staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n }\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n {name} {count}\n </span>\n );\n })}\n </div>\n )}\n <div class={`actions ${_deleted ? 'disabled' : ''}`}>\n <div class=\"action has-count\">\n {tooManyMentions ? (\n <Menu2\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n menuButton={\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n />\n }\n >\n {replyModeMenuItems}\n </Menu2>\n ) : (\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n onClick={(e) => {\n haptics.trigger('light');\n replyStatus(e);\n }}\n />\n )}\n </div>\n {/* <div class=\"action has-count\">\n <StatusButton\n checked={reblogged}\n title={['Boost', 'Unboost']}\n alt={['Boost', 'Boosted']}\n class=\"reblog-button\"\n icon=\"rocket\"\n count={reblogsCount}\n onClick={boostStatus}\n disabled={!canBoost}\n />\n </div> */}\n <div\n class={`action ${canQuote && reblogsCount > 0 && quotesCount > 0 ? 'has-counts' : 'has-count'}`}\n >\n <MenuConfirm\n disabled={!canBoost}\n onClick={() => {\n haptics.trigger('light');\n return confirmBoostStatus();\n }}\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span class=\"menu-grow\">\n {reblogged ? t`Unboost` : t`Boost`}\n </span>\n {reblogsCount > 0 && (\n <small class=\"more-insignificant\">\n {shortenNumber(reblogsCount)}\n </small>\n )}\n </>\n }\n menuExtras={\n <>\n {supportsNativeQuote() && (\n <MenuItem\n disabled={quoteDisabled}\n onClick={() => {\n showCompose({\n quoteStatus: status,\n });\n }}\n >\n <Icon icon=\"quote\" />\n {quoteMetaText ? (\n <small>\n {quoteText}\n <br />\n {quoteMetaText}\n </small>\n ) : (\n <span class=\"menu-grow\">{quoteText}</span>\n )}\n {quotesCount > 0 && (\n <small class=\"more-insignificant\">\n {shortenNumber(quotesCount)}\n </small>\n )}\n </MenuItem>\n )}\n {(DEV || !supportsNativeQuote()) && (\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote with link</Trans>\n </span>\n {supportsNativeQuote() && DEV && (\n <small class=\"tag collapsed\">DEV</small>\n )}\n </MenuItem>\n )}\n </>\n }\n menuFooter={menuFooter}\n >\n <StatusButton\n checked={reblogged}\n title={[\n canQuote ? t`Boost/Quote…` : t`Boost…`,\n t`Unboost`,\n ]}\n alt={[t`Boost`, t`Boosted`]}\n class=\"reblog-button\"\n icon={\n reblogsCount <= 0 && quotesCount > 0\n ? 'quote'\n : 'rocket'\n }\n count={reblogsCount}\n extraCount={quotesCount}\n // onClick={boostStatus}\n disabled={!canBoost}\n />\n </MenuConfirm>\n </div>\n <div class=\"action has-count\">\n <StatusButton\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n count={favouritesCount}\n onClick={(e) => {\n haptics.trigger('light');\n favouriteStatus(e);\n }}\n />\n </div>\n {supports('@mastodon/post-bookmark') && (\n <div class=\"action\">\n <StatusButton\n checked={bookmarked}\n title={[t`Bookmark`, t`Unbookmark`]}\n alt={[t`Bookmark`, t`Bookmarked`]}\n class=\"bookmark-button\"\n icon=\"bookmark\"\n onClick={(e) => {\n haptics.trigger('light');\n bookmarkStatus(e);\n }}\n />\n </div>\n )}\n <Menu2\n portal={{\n target:\n document.querySelector('.status-deck') || document.body,\n }}\n align=\"end\"\n gap={4}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuButton={\n <div class=\"action\">\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n >\n <Icon icon=\"more2\" size=\"l\" alt={t`More`} />\n </button>\n </div>\n }\n >\n {StatusMenuItems}{' '}\n </Menu2>\n </div>\n </>\n )}\n </div>\n {!!showEdited && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowEdited(false);\n // statusRef.current?.focus();\n }\n }}\n >\n <EditedAtModal\n statusID={showEdited}\n instance={instance}\n fetchStatusHistory={() => {\n return masto.v1.statuses.$select(showEdited).history.list();\n }}\n onClose={() => {\n setShowEdited(false);\n statusRef.current?.focus();\n }}\n />\n </Modal>\n )}\n {!!showEmbed && (\n <Modal\n onClose={() => {\n setShowEmbed(false);\n }}\n >\n <PostEmbedModal\n post={status}\n instance={instance}\n onClose={() => {\n setShowEmbed(false);\n }}\n />\n </Modal>\n )}\n {!!showQuoteSettings && (\n <Modal\n onClose={() => {\n setShowQuoteSettings(false);\n states.reloadStatusPage++;\n }}\n >\n <QuoteSettingsSheet\n onClose={() => {\n setShowQuoteSettings(false);\n states.reloadStatusPage++;\n }}\n post={status}\n currentPolicy={postQuoteApprovalPolicy}\n />\n </Modal>\n )}\n {!!showQuotes && (\n <Modal\n onClose={() => {\n setShowQuotes(false);\n }}\n >\n <QuotesModal\n statusId={id}\n instance={instance}\n onClose={() => {\n setShowQuotes(false);\n }}\n />\n </Modal>\n )}\n {!!showQuoteChain && (\n <Modal\n onClose={() => {\n setShowQuoteChain(false);\n }}\n >\n <QuoteChainModal\n statusId={id}\n instance={instance}\n onClose={() => {\n setShowQuoteChain(false);\n }}\n />\n </Modal>\n )}\n </article>\n </StatusParent>\n );\n}\n\nfunction nicePostURL(url) {\n if (!url) return;\n const urlObj = URL.parse(url);\n if (!urlObj) return;\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '');\n // split only first slash\n const [_, username, restPath] = path.match(/\\/(@[^\\/]+)\\/(.*)/) || [];\n return (\n <>\n {punycode.toUnicode(host)}\n {username ? (\n <>\n /{username}\n <wbr />\n <span class=\"more-insignificant\">/{restPath}</span>\n </>\n ) : (\n <span class=\"more-insignificant\">{path}</span>\n )}\n </>\n );\n}\n\nconst handledUnfulfilledStates = [\n 'deleted',\n 'unauthorized',\n 'pending',\n 'rejected',\n 'revoked',\n 'blocked_account',\n 'blocked_domain',\n 'muted_account',\n];\nconst revealableUnfulfilledStates = [\n 'blocked_account',\n 'blocked_domain',\n 'muted_account',\n];\nconst unfulfilledText = {\n filterHidden: msg`Post hidden by your filters`,\n pending: msg`Post pending`,\n deleted: msg`Post unavailable`,\n unauthorized: msg`Post unavailable`,\n rejected: msg`Post unavailable`,\n revoked: msg`Post removed by author`,\n blocked_account: (name) => msg`Post hidden because you've blocked @${name}.`,\n blocked_domain: (domain) =>\n msg`Post hidden because you've blocked ${domain}.`,\n muted_account: (name) => msg`Post hidden because you've muted @${name}.`,\n};\n\nconst QuoteStatus = memo(({ quote, level = 0 }) => {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const filterContext = useContext(FilterContext);\n const currentAccount = getCurrentAccID();\n\n const q = quote;\n let unfulfilledState;\n\n // Static as in there's no live update (edited, liked, etc.)\n const isStaticQuote = !!q.quoteStatus;\n\n const quoteStatus =\n snapStates.statuses[statusKey(q.id, q.instance)] || q.quoteStatus;\n if (quoteStatus) {\n const isSelf = currentAccount && currentAccount === quoteStatus.account?.id;\n const filterInfo =\n !isSelf && isFiltered(quoteStatus.filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n unfulfilledState = 'filterHidden';\n }\n }\n\n if (!unfulfilledState) {\n unfulfilledState = handledUnfulfilledStates.find(\n (state) => q.state === state,\n );\n }\n\n const isRevealable = revealableUnfulfilledStates.includes(unfulfilledState);\n const quoteKey = q.id ? statusKey(q.id, q.instance) : null;\n const isRevealed = quoteKey && snapStates.revealedQuotes[quoteKey];\n\n if (unfulfilledState && (!isRevealable || !isRevealed)) {\n // Get account info for revealable states\n const quotedAccount = quoteStatus?.account;\n const quotedAccountAcct = quotedAccount?.acct;\n const domain = quotedAccountAcct?.split('@')[1];\n\n let message;\n if (isRevealable) {\n if (unfulfilledState === 'blocked_account') {\n message = _(unfulfilledText.blocked_account(quotedAccountAcct));\n } else if (unfulfilledState === 'blocked_domain') {\n message = _(unfulfilledText.blocked_domain(domain));\n } else if (unfulfilledState === 'muted_account') {\n message = _(unfulfilledText.muted_account(quotedAccountAcct));\n }\n } else {\n message = _(unfulfilledText[unfulfilledState]);\n }\n\n return (\n <div\n key={quoteKey}\n class={`status-card-unfulfilled ${\n unfulfilledState === 'filterHidden' || isRevealable\n ? 'status-card-ghost'\n : ''\n } ${q.native ? 'quote-post-native' : ''}`}\n >\n <Icon icon=\"quote\" />\n <i>{message}</i>\n {isRevealable && quoteKey && (\n <button\n type=\"button\"\n class=\"textual\"\n onClick={() => {\n states.revealedQuotes[quoteKey] = true;\n }}\n >\n <Trans>Show anyway</Trans>\n </button>\n )}\n </div>\n );\n }\n\n const Parent = q.native ? Fragment : LazyShazam;\n return (\n <Parent id={q.instance + q.id} key={q.instance + q.id}>\n <Link\n key={q.instance + q.id}\n to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`}\n class={`status-card-link ${q.native ? 'quote-post-native' : ''}`}\n data-read-more={_(readMoreText)}\n >\n <Status\n statusID={q.id}\n status={isStaticQuote ? quoteStatus : undefined}\n instance={q.instance}\n size=\"s\"\n quoted={level + 1}\n quoteDomain={q.originalDomain}\n enableCommentHint\n />\n </Link>\n </Parent>\n );\n});\n\nconst ShallowQuote = ({ quote } = {}) => {\n const { account, native, instance } = quote || {};\n if (!account) return null;\n return (\n <div class=\"status-card-container\">\n <div class={native ? 'quote-post-native' : ''}>\n <div class=\"status-card status-shallow-card\">\n <NameText account={account} instance={instance} showAvatar />{' '}\n <span class=\"insignificant\">…</span>\n </div>\n </div>\n </div>\n );\n};\n\nconst QuoteStatuses = memo(\n ({ id, instance, level = 0, collapsed = false, fallbackQuote }) => {\n if (!id || !instance) return;\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const sKey = statusKey(id, instance);\n const quotes = snapStates.statusQuotes[sKey];\n let uniqueQuotes = quotes?.filter(\n (q, i, arr) => q.native || arr.findIndex((q2) => q2.url === q.url) === i,\n );\n\n const containerRef = useTruncated();\n\n if (!uniqueQuotes?.length && fallbackQuote?.quotedStatus) {\n // Just render it\n return (\n <div\n class=\"status-card-container\"\n ref={containerRef}\n data-read-more={_(readMoreText)}\n data-quote-container-static={true}\n >\n <QuoteStatus\n quote={{\n // Same structure as the one in saveStatus (utils/states)\n id,\n instance,\n // url\n state: fallbackQuote.state,\n // account\n native: true,\n // Inject whole quoteStatus instead of reading from states\n quoteStatus: fallbackQuote.quotedStatus,\n }}\n />\n </div>\n );\n }\n\n if (!uniqueQuotes?.length) return;\n if (level > 2) {\n return <ShallowQuote quote={uniqueQuotes[0]} />;\n }\n\n if (collapsed) {\n // Only show the first quote if \"collapsed\"\n uniqueQuotes = [uniqueQuotes[0]];\n }\n\n return (\n <div\n class=\"status-card-container\"\n ref={containerRef}\n data-read-more={_(readMoreText)}\n >\n {uniqueQuotes.map((q) => {\n const quoteKey = q.id\n ? statusKey(q.id, q.instance)\n : `${q.instance || ''}-${q.state}`;\n return <QuoteStatus key={quoteKey} quote={q} level={level} />;\n })}\n </div>\n );\n },\n);\n\nfunction EditedAtModal({\n statusID,\n instance,\n fetchStatusHistory = () => {},\n onClose,\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [editHistory, setEditHistory] = useState([]);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const editHistory = await fetchStatusHistory();\n console.log(editHistory);\n setEditHistory(editHistory);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n return (\n <div id=\"edit-history\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Edit History</Trans>\n </h2>\n {uiState === 'error' && (\n <p>\n <Trans>Failed to load history</Trans>\n </p>\n )}\n {uiState === 'loading' && (\n <p>\n <Loader abrupt /> <Trans>Loading…</Trans>\n </p>\n )}\n </header>\n <main tabIndex=\"-1\">\n {editHistory.length > 0 && (\n <ol>\n {editHistory.map((status) => {\n const { createdAt } = status;\n const createdAtDate = new Date(createdAt);\n return (\n <li key={createdAt} class=\"history-item\">\n <h3>\n <time>\n {niceDateTime(createdAtDate, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n </time>\n </h3>\n <Status\n status={status}\n instance={instance}\n size=\"s\"\n withinContext\n readOnly\n previewMode\n />\n </li>\n );\n })}\n </ol>\n )}\n </main>\n </div>\n );\n}\n\nfunction FilteredStatus({\n status,\n filterInfo,\n instance,\n containerProps = {},\n showFollowedTags,\n quoted,\n}) {\n const { _, t } = useLingui();\n const snapStates = useSnapshot(states);\n const {\n id: statusID,\n account: { avatar, avatarStatic, bot, group },\n createdAt,\n visibility,\n reblog,\n } = status;\n const isReblog = !!reblog;\n const filterTitleStr = filterInfo?.titlesStr || '';\n const createdAtDate = new Date(createdAt);\n const statusPeekText = statusPeek(status.reblog || status);\n\n const [showPeek, setShowPeek] = useState(false);\n const bindLongPressPeek = useLongPress(\n () => {\n setShowPeek(true);\n },\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const statusPeekRef = useTruncated();\n const sKey = statusKey(status.id, instance);\n const ssKey =\n statusKey(status.id, instance) +\n ' ' +\n (statusKey(reblog?.id, instance) || '');\n\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n const isFollowedTags =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length;\n\n return (\n <div\n class={`${\n quoted\n ? ''\n : isReblog\n ? group\n ? 'status-group'\n : 'status-reblog'\n : isFollowedTags\n ? 'status-followed-tags'\n : ''\n } visibility-${visibility}`}\n {...containerProps}\n // title={statusPeekText}\n onContextMenu={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n {...bindLongPressPeek()}\n >\n <article\n data-state-post-id={ssKey}\n class={`status filtered ${quoted ? 'status-card' : ''}`}\n tabindex=\"-1\"\n >\n <b\n class=\"status-filtered-badge clickable badge-meta\"\n title={filterTitleStr}\n onClick={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n >\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>{' '}\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <span class=\"status-filtered-info\">\n <span class=\"status-filtered-info-1\">\n {isReblog ? (\n <Trans comment=\"[Name] [Visibility icon] boosted\">\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n boosted\n </Trans>\n ) : isFollowedTags ? (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <span>\n {snapStates.statusFollowedTags[sKey]\n .slice(0, 3)\n .map((tag) => (\n <span key={tag} class=\"status-followed-tag-item\">\n #{tag}\n </span>\n ))}\n </span>\n </>\n ) : (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </>\n )}\n </span>\n <span class=\"status-filtered-info-2\">\n {isReblog && (\n <>\n <Avatar\n url={reblog.account.avatarStatic || reblog.account.avatar}\n squircle={bot}\n />{' '}\n </>\n )}\n {statusPeekText}\n </span>\n </span>\n </article>\n {!!showPeek && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowPeek(false);\n }\n }}\n >\n <div id=\"filtered-status-peek\" class=\"sheet\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowPeek(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <b class=\"status-filtered-badge\">\n <Trans>Filtered</Trans>\n </b>{' '}\n {filterTitleStr}\n </header>\n <main tabIndex=\"-1\">\n <Link\n ref={statusPeekRef}\n class=\"status-link\"\n to={url}\n onClick={() => {\n setShowPeek(false);\n }}\n data-read-more={_(readMoreText)}\n >\n <Status status={status} instance={instance} size=\"s\" readOnly />\n </Link>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nexport default memo(Status, (oldProps, newProps) => {\n // Shallow equal all props except 'status'\n // This will be pure static until status ID changes\n const { status, ...restOldProps } = oldProps;\n const { status: newStatus, ...restNewProps } = newProps;\n return (\n status?.id === newStatus?.id && shallowEqual(restOldProps, restNewProps)\n );\n});\n","var IDX=36, HEX='';\nwhile (IDX--) HEX += IDX.toString(36);\n\nexport function uid(len) {\n\tvar str='', num = len || 11;\n\twhile (num--) str += HEX[Math.random() * 36 | 0];\n\treturn str;\n}\n","/**\n * Fuse.js v7.4.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2026 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n//#region src/helpers/typeGuards.ts\nfunction isArray(value) {\n\treturn !Array.isArray ? getTag(value) === \"[object Array]\" : Array.isArray(value);\n}\nfunction baseToString(value) {\n\tif (typeof value == \"string\") return value;\n\tif (typeof value === \"bigint\") return value.toString();\n\tconst result = value + \"\";\n\treturn result == \"0\" && 1 / value == -Infinity ? \"-0\" : result;\n}\nfunction toString(value) {\n\treturn value == null ? \"\" : baseToString(value);\n}\nfunction isString(value) {\n\treturn typeof value === \"string\";\n}\nfunction isNumber(value) {\n\treturn typeof value === \"number\";\n}\nfunction isBoolean(value) {\n\treturn value === true || value === false || isObjectLike(value) && getTag(value) == \"[object Boolean]\";\n}\nfunction isObject(value) {\n\treturn typeof value === \"object\";\n}\nfunction isObjectLike(value) {\n\treturn isObject(value) && value !== null;\n}\nfunction isDefined(value) {\n\treturn value !== void 0 && value !== null;\n}\nfunction isBlank(value) {\n\treturn !value.trim().length;\n}\nfunction getTag(value) {\n\treturn value == null ? value === void 0 ? \"[object Undefined]\" : \"[object Null]\" : Object.prototype.toString.call(value);\n}\n\n//#endregion\n//#region src/core/errorMessages.ts\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\nconst INVALID_DOC_INDEX = \"Invalid doc index: must be a non-negative integer within the bounds of the docs array\";\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => `Invalid value for key ${key}`;\nconst PATTERN_LENGTH_TOO_LARGE = (max) => `Pattern length exceeds max of ${max}.`;\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\nconst INVALID_KEY_WEIGHT_VALUE = (key) => `Property 'weight' in key '${key}' must be a positive integer`;\nconst FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED = \"Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.\";\n\n//#endregion\n//#region src/tools/KeyStore.ts\nconst hasOwn = Object.prototype.hasOwnProperty;\nvar KeyStore = class {\n\tconstructor(keys) {\n\t\tthis._keys = [];\n\t\tthis._keyMap = {};\n\t\tlet totalWeight = 0;\n\t\tkeys.forEach((key) => {\n\t\t\tconst obj = createKey(key);\n\t\t\tthis._keys.push(obj);\n\t\t\tthis._keyMap[obj.id] = obj;\n\t\t\ttotalWeight += obj.weight;\n\t\t});\n\t\tthis._keys.forEach((key) => {\n\t\t\tkey.weight /= totalWeight;\n\t\t});\n\t}\n\tget(keyId) {\n\t\treturn this._keyMap[keyId];\n\t}\n\tkeys() {\n\t\treturn this._keys;\n\t}\n\ttoJSON() {\n\t\treturn JSON.stringify(this._keys);\n\t}\n};\nfunction createKey(key) {\n\tlet path = null;\n\tlet id = null;\n\tlet src = null;\n\tlet weight = 1;\n\tlet getFn = null;\n\tif (isString(key) || isArray(key)) {\n\t\tsrc = key;\n\t\tpath = createKeyPath(key);\n\t\tid = createKeyId(key);\n\t} else {\n\t\tif (!hasOwn.call(key, \"name\")) throw new Error(MISSING_KEY_PROPERTY(\"name\"));\n\t\tconst name = key.name;\n\t\tsrc = name;\n\t\tif (hasOwn.call(key, \"weight\") && key.weight !== void 0) {\n\t\t\tweight = key.weight;\n\t\t\tif (weight <= 0) throw new Error(INVALID_KEY_WEIGHT_VALUE(createKeyId(name)));\n\t\t}\n\t\tpath = createKeyPath(name);\n\t\tid = createKeyId(name);\n\t\tgetFn = key.getFn ?? null;\n\t}\n\treturn {\n\t\tpath,\n\t\tid,\n\t\tweight,\n\t\tsrc,\n\t\tgetFn\n\t};\n}\nfunction createKeyPath(key) {\n\treturn isArray(key) ? key : key.split(\".\");\n}\nfunction createKeyId(key) {\n\treturn isArray(key) ? key.join(\".\") : key;\n}\n\n//#endregion\n//#region src/helpers/get.ts\nfunction get(obj, path) {\n\tconst list = [];\n\tlet arr = false;\n\tconst deepGet = (obj, path, index, arrayIndex) => {\n\t\tif (!isDefined(obj)) return;\n\t\tif (!path[index]) list.push(arrayIndex !== void 0 ? {\n\t\t\tv: obj,\n\t\t\ti: arrayIndex\n\t\t} : obj);\n\t\telse {\n\t\t\tconst value = obj[path[index]];\n\t\t\tif (!isDefined(value)) return;\n\t\t\tif (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value) || typeof value === \"bigint\")) list.push(arrayIndex !== void 0 ? {\n\t\t\t\tv: toString(value),\n\t\t\t\ti: arrayIndex\n\t\t\t} : toString(value));\n\t\t\telse if (isArray(value)) {\n\t\t\t\tarr = true;\n\t\t\t\tfor (let i = 0, len = value.length; i < len; i += 1) deepGet(value[i], path, index + 1, i);\n\t\t\t} else if (path.length) deepGet(value, path, index + 1, arrayIndex);\n\t\t}\n\t};\n\tdeepGet(obj, isString(path) ? path.split(\".\") : path, 0);\n\treturn arr ? list : list[0];\n}\n\n//#endregion\n//#region src/core/config.ts\nconst MatchOptions = {\n\tincludeMatches: false,\n\tfindAllMatches: false,\n\tminMatchCharLength: 1\n};\nconst BasicOptions = {\n\tisCaseSensitive: false,\n\tignoreDiacritics: false,\n\tincludeScore: false,\n\tkeys: [],\n\tshouldSort: true,\n\tsortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1\n};\nconst FuzzyOptions = {\n\tlocation: 0,\n\tthreshold: .6,\n\tdistance: 100\n};\nconst AdvancedOptions = {\n\tuseExtendedSearch: false,\n\tuseTokenSearch: false,\n\ttokenize: void 0,\n\ttokenMatch: \"any\",\n\tgetFn: get,\n\tignoreLocation: false,\n\tignoreFieldNorm: false,\n\tfieldNormWeight: 1\n};\nconst Config = Object.freeze({\n\t...BasicOptions,\n\t...MatchOptions,\n\t...FuzzyOptions,\n\t...AdvancedOptions\n});\n\n//#endregion\n//#region src/tools/fieldNorm.ts\nfunction norm(weight = 1, mantissa = 3) {\n\tconst cache = /* @__PURE__ */ new Map();\n\tconst m = Math.pow(10, mantissa);\n\treturn {\n\t\tget(value) {\n\t\t\tlet numTokens = 1;\n\t\t\tlet inSpace = false;\n\t\t\tfor (let i = 0; i < value.length; i++) if (value.charCodeAt(i) === 32) {\n\t\t\t\tif (!inSpace) {\n\t\t\t\t\tnumTokens++;\n\t\t\t\t\tinSpace = true;\n\t\t\t\t}\n\t\t\t} else inSpace = false;\n\t\t\tif (cache.has(numTokens)) return cache.get(numTokens);\n\t\t\tconst n = Math.round(m / Math.pow(numTokens, .5 * weight)) / m;\n\t\t\tcache.set(numTokens, n);\n\t\t\treturn n;\n\t\t},\n\t\tclear() {\n\t\t\tcache.clear();\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/tools/FuseIndex.ts\nvar FuseIndex = class {\n\tconstructor({ getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\t\tthis.norm = norm(fieldNormWeight, 3);\n\t\tthis.getFn = getFn;\n\t\tthis.isCreated = false;\n\t\tthis.docs = [];\n\t\tthis.keys = [];\n\t\tthis._keysMap = {};\n\t\tthis.setIndexRecords();\n\t}\n\tsetSources(docs = []) {\n\t\tthis.docs = docs;\n\t}\n\tsetIndexRecords(records = []) {\n\t\tthis.records = records;\n\t}\n\tsetKeys(keys = []) {\n\t\tthis.keys = keys;\n\t\tthis._keysMap = {};\n\t\tkeys.forEach((key, idx) => {\n\t\t\tthis._keysMap[key.id] = idx;\n\t\t});\n\t}\n\tcreate() {\n\t\tif (this.isCreated || !this.docs.length) return;\n\t\tthis.isCreated = true;\n\t\tconst len = this.docs.length;\n\t\tthis.records = new Array(len);\n\t\tlet recordCount = 0;\n\t\tif (isString(this.docs[0])) for (let i = 0; i < len; i++) {\n\t\t\tconst record = this._createStringRecord(this.docs[i], i);\n\t\t\tif (record) this.records[recordCount++] = record;\n\t\t}\n\t\telse for (let i = 0; i < len; i++) this.records[recordCount++] = this._createObjectRecord(this.docs[i], i);\n\t\tthis.records.length = recordCount;\n\t\tthis.norm.clear();\n\t}\n\tadd(doc, docIndex) {\n\t\tif (!Number.isInteger(docIndex) || docIndex < 0) throw new Error(INVALID_DOC_INDEX);\n\t\tif (isString(doc)) {\n\t\t\tconst record = this._createStringRecord(doc, docIndex);\n\t\t\tif (record) this.records.push(record);\n\t\t\treturn record;\n\t\t}\n\t\tconst record = this._createObjectRecord(doc, docIndex);\n\t\tthis.records.push(record);\n\t\treturn record;\n\t}\n\tremoveAt(idx) {\n\t\tif (!Number.isInteger(idx) || idx < 0) throw new Error(INVALID_DOC_INDEX);\n\t\tfor (let i = 0, len = this.records.length; i < len; i += 1) if (this.records[i].i === idx) {\n\t\t\tthis.records.splice(i, 1);\n\t\t\tbreak;\n\t\t}\n\t\tfor (let i = 0, len = this.records.length; i < len; i += 1) if (this.records[i].i > idx) this.records[i].i -= 1;\n\t}\n\tremoveAll(indices) {\n\t\tconst toRemove = /* @__PURE__ */ new Set();\n\t\tfor (const v of indices) if (Number.isInteger(v) && v >= 0) toRemove.add(v);\n\t\tif (toRemove.size === 0) return;\n\t\tthis.records = this.records.filter((r) => !toRemove.has(r.i));\n\t\tconst sorted = Array.from(toRemove).sort((a, b) => a - b);\n\t\tfor (const record of this.records) {\n\t\t\tlet lo = 0;\n\t\t\tlet hi = sorted.length;\n\t\t\twhile (lo < hi) {\n\t\t\t\tconst mid = lo + hi >>> 1;\n\t\t\t\tif (sorted[mid] < record.i) lo = mid + 1;\n\t\t\t\telse hi = mid;\n\t\t\t}\n\t\t\trecord.i -= lo;\n\t\t}\n\t}\n\tgetValueForItemAtKeyId(item, keyId) {\n\t\treturn item[this._keysMap[keyId]];\n\t}\n\tsize() {\n\t\treturn this.records.length;\n\t}\n\t_createStringRecord(doc, docIndex) {\n\t\tif (!isDefined(doc) || isBlank(doc)) return null;\n\t\treturn {\n\t\t\tv: doc,\n\t\t\ti: docIndex,\n\t\t\tn: this.norm.get(doc)\n\t\t};\n\t}\n\t_createObjectRecord(doc, docIndex) {\n\t\tconst record = {\n\t\t\ti: docIndex,\n\t\t\t$: {}\n\t\t};\n\t\tfor (let keyIndex = 0, keyLen = this.keys.length; keyIndex < keyLen; keyIndex++) {\n\t\t\tconst key = this.keys[keyIndex];\n\t\t\tconst value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\t\t\tif (!isDefined(value)) continue;\n\t\t\tif (isArray(value)) {\n\t\t\t\tconst subRecords = [];\n\t\t\t\tfor (let i = 0, len = value.length; i < len; i += 1) {\n\t\t\t\t\tconst item = value[i];\n\t\t\t\t\tif (!isDefined(item)) continue;\n\t\t\t\t\tif (isString(item)) {\n\t\t\t\t\t\tif (!isBlank(item)) {\n\t\t\t\t\t\t\tconst subRecord = {\n\t\t\t\t\t\t\t\tv: item,\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\tn: this.norm.get(item)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsubRecords.push(subRecord);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (isDefined(item.v)) {\n\t\t\t\t\t\tconst text = isString(item.v) ? item.v : toString(item.v);\n\t\t\t\t\t\tif (!isBlank(text)) {\n\t\t\t\t\t\t\tconst subRecord = {\n\t\t\t\t\t\t\t\tv: text,\n\t\t\t\t\t\t\t\ti: item.i,\n\t\t\t\t\t\t\t\tn: this.norm.get(text)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsubRecords.push(subRecord);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trecord.$[keyIndex] = subRecords;\n\t\t\t} else if (isString(value) && !isBlank(value)) {\n\t\t\t\tconst subRecord = {\n\t\t\t\t\tv: value,\n\t\t\t\t\tn: this.norm.get(value)\n\t\t\t\t};\n\t\t\t\trecord.$[keyIndex] = subRecord;\n\t\t\t}\n\t\t}\n\t\treturn record;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tkeys: this.keys.map(({ getFn, ...key }) => key),\n\t\t\trecords: this.records\n\t\t};\n\t}\n};\nfunction createIndex(keys, docs, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\tconst myIndex = new FuseIndex({\n\t\tgetFn,\n\t\tfieldNormWeight\n\t});\n\tmyIndex.setKeys(keys.map(createKey));\n\tmyIndex.setSources(docs);\n\tmyIndex.create();\n\treturn myIndex;\n}\nfunction parseIndex(data, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\tconst { keys, records } = data;\n\tconst myIndex = new FuseIndex({\n\t\tgetFn,\n\t\tfieldNormWeight\n\t});\n\tmyIndex.setKeys(keys);\n\tmyIndex.setIndexRecords(records);\n\treturn myIndex;\n}\n\n//#endregion\n//#region src/search/bitap/convertMaskToIndices.ts\nfunction convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) {\n\tconst indices = [];\n\tlet start = -1;\n\tlet end = -1;\n\tlet i = 0;\n\tfor (let len = matchmask.length; i < len; i += 1) {\n\t\tconst match = matchmask[i];\n\t\tif (match && start === -1) start = i;\n\t\telse if (!match && start !== -1) {\n\t\t\tend = i - 1;\n\t\t\tif (end - start + 1 >= minMatchCharLength) indices.push([start, end]);\n\t\t\tstart = -1;\n\t\t}\n\t}\n\tif (matchmask[i - 1] && i - start >= minMatchCharLength) indices.push([start, i - 1]);\n\treturn indices;\n}\n\n//#endregion\n//#region src/search/bitap/search.ts\nfunction search(text, pattern, patternAlphabet, { location = Config.location, distance = Config.distance, threshold = Config.threshold, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, includeMatches = Config.includeMatches, ignoreLocation = Config.ignoreLocation } = {}) {\n\tif (pattern.length > 32) throw new Error(PATTERN_LENGTH_TOO_LARGE(32));\n\tconst patternLen = pattern.length;\n\tconst textLen = text.length;\n\tconst expectedLocation = Math.max(0, Math.min(location, textLen));\n\tlet currentThreshold = threshold;\n\tlet bestLocation = expectedLocation;\n\tconst calcScore = (errors, currentLocation) => {\n\t\tconst accuracy = errors / patternLen;\n\t\tif (ignoreLocation) return accuracy;\n\t\tconst proximity = Math.abs(expectedLocation - currentLocation);\n\t\tif (!distance) return proximity ? 1 : accuracy;\n\t\treturn accuracy + proximity / distance;\n\t};\n\tconst computeMatches = minMatchCharLength > 1 || includeMatches;\n\tconst matchMask = computeMatches ? Array(textLen) : [];\n\tlet index;\n\twhile ((index = text.indexOf(pattern, bestLocation)) > -1) {\n\t\tconst score = calcScore(0, index);\n\t\tcurrentThreshold = Math.min(score, currentThreshold);\n\t\tbestLocation = index + patternLen;\n\t\tif (computeMatches) {\n\t\t\tlet i = 0;\n\t\t\twhile (i < patternLen) {\n\t\t\t\tmatchMask[index + i] = 1;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t}\n\tbestLocation = -1;\n\tlet lastBitArr = [];\n\tlet finalScore = 1;\n\tlet bestErrors = 0;\n\tlet binMax = patternLen + textLen;\n\tconst mask = 1 << patternLen - 1;\n\tfor (let i = 0; i < patternLen; i += 1) {\n\t\tlet binMin = 0;\n\t\tlet binMid = binMax;\n\t\twhile (binMin < binMid) {\n\t\t\tif (calcScore(i, expectedLocation + binMid) <= currentThreshold) binMin = binMid;\n\t\t\telse binMax = binMid;\n\t\t\tbinMid = Math.floor((binMax - binMin) / 2 + binMin);\n\t\t}\n\t\tbinMax = binMid;\n\t\tlet start = Math.max(1, expectedLocation - binMid + 1);\n\t\tconst finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\t\tconst bitArr = Array(finish + 2);\n\t\tbitArr[finish + 1] = (1 << i) - 1;\n\t\tfor (let j = finish; j >= start; j -= 1) {\n\t\t\tconst currentLocation = j - 1;\n\t\t\tconst charMatch = patternAlphabet[text[currentLocation]];\n\t\t\tbitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;\n\t\t\tif (i) bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];\n\t\t\tif (bitArr[j] & mask) {\n\t\t\t\tfinalScore = calcScore(i, currentLocation);\n\t\t\t\tif (finalScore <= currentThreshold) {\n\t\t\t\t\tcurrentThreshold = finalScore;\n\t\t\t\t\tbestLocation = currentLocation;\n\t\t\t\t\tbestErrors = i;\n\t\t\t\t\tif (bestLocation <= expectedLocation) break;\n\t\t\t\t\tstart = Math.max(1, 2 * expectedLocation - bestLocation);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (calcScore(i + 1, expectedLocation) > currentThreshold) break;\n\t\tlastBitArr = bitArr;\n\t}\n\tif (computeMatches && bestLocation >= 0) {\n\t\tconst matchEnd = Math.min(textLen - 1, bestLocation + patternLen - 1 + bestErrors);\n\t\tfor (let k = bestLocation; k <= matchEnd; k += 1) if (patternAlphabet[text[k]]) matchMask[k] = 1;\n\t}\n\tconst result = {\n\t\tisMatch: bestLocation >= 0,\n\t\tscore: Math.max(.001, finalScore)\n\t};\n\tif (computeMatches) {\n\t\tconst indices = convertMaskToIndices(matchMask, minMatchCharLength);\n\t\tif (!indices.length) result.isMatch = false;\n\t\telse if (includeMatches) result.indices = indices;\n\t}\n\treturn result;\n}\n\n//#endregion\n//#region src/search/bitap/createPatternAlphabet.ts\nfunction createPatternAlphabet(pattern) {\n\tconst mask = {};\n\tfor (let i = 0, len = pattern.length; i < len; i += 1) {\n\t\tconst char = pattern.charAt(i);\n\t\tmask[char] = (mask[char] || 0) | 1 << len - i - 1;\n\t}\n\treturn mask;\n}\n\n//#endregion\n//#region src/helpers/mergeIndices.ts\nfunction mergeIndices(indices) {\n\tif (indices.length <= 1) return indices;\n\tindices.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n\tconst merged = [indices[0]];\n\tfor (let i = 1, len = indices.length; i < len; i += 1) {\n\t\tconst last = merged[merged.length - 1];\n\t\tconst curr = indices[i];\n\t\tif (curr[0] <= last[1] + 1) last[1] = Math.max(last[1], curr[1]);\n\t\telse merged.push(curr);\n\t}\n\treturn merged;\n}\n\n//#endregion\n//#region src/helpers/diacritics.ts\nconst NON_DECOMPOSABLE_MAP = {\n\t\"ł\": \"l\",\n\t\"Ł\": \"L\",\n\t\"đ\": \"d\",\n\t\"Đ\": \"D\",\n\t\"ø\": \"o\",\n\t\"Ø\": \"O\",\n\t\"ħ\": \"h\",\n\t\"Ħ\": \"H\",\n\t\"ŧ\": \"t\",\n\t\"Ŧ\": \"T\",\n\t\"ı\": \"i\",\n\t\"ß\": \"ss\"\n};\nconst NON_DECOMPOSABLE_RE = new RegExp(\"[\" + Object.keys(NON_DECOMPOSABLE_MAP).join(\"\") + \"]\", \"g\");\nconst stripDiacritics = typeof String.prototype.normalize === \"function\" ? (str) => str.normalize(\"NFD\").replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, \"\").replace(NON_DECOMPOSABLE_RE, (ch) => NON_DECOMPOSABLE_MAP[ch]) : (str) => str;\n\n//#endregion\n//#region src/search/bitap/index.ts\nvar BitapSearch = class {\n\tconstructor(pattern, { location = Config.location, threshold = Config.threshold, distance = Config.distance, includeMatches = Config.includeMatches, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, ignoreLocation = Config.ignoreLocation } = {}) {\n\t\tthis.options = {\n\t\t\tlocation,\n\t\t\tthreshold,\n\t\t\tdistance,\n\t\t\tincludeMatches,\n\t\t\tfindAllMatches,\n\t\t\tminMatchCharLength,\n\t\t\tisCaseSensitive,\n\t\t\tignoreDiacritics,\n\t\t\tignoreLocation\n\t\t};\n\t\tpattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\t\tpattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n\t\tthis.pattern = pattern;\n\t\tthis.chunks = [];\n\t\tif (!this.pattern.length) return;\n\t\tconst addChunk = (pattern, startIndex) => {\n\t\t\tthis.chunks.push({\n\t\t\t\tpattern,\n\t\t\t\talphabet: createPatternAlphabet(pattern),\n\t\t\t\tstartIndex\n\t\t\t});\n\t\t};\n\t\tconst len = this.pattern.length;\n\t\tif (len > 32) {\n\t\t\tlet i = 0;\n\t\t\tconst remainder = len % 32;\n\t\t\tconst end = len - remainder;\n\t\t\twhile (i < end) {\n\t\t\t\taddChunk(this.pattern.substr(i, 32), i);\n\t\t\t\ti += 32;\n\t\t\t}\n\t\t\tif (remainder) {\n\t\t\t\tconst startIndex = len - 32;\n\t\t\t\taddChunk(this.pattern.substr(startIndex), startIndex);\n\t\t\t}\n\t\t} else addChunk(this.pattern, 0);\n\t}\n\tsearchIn(text) {\n\t\tconst { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\t\ttext = isCaseSensitive ? text : text.toLowerCase();\n\t\ttext = ignoreDiacritics ? stripDiacritics(text) : text;\n\t\tif (this.pattern === text) {\n\t\t\tconst result = {\n\t\t\t\tisMatch: true,\n\t\t\t\tscore: 0\n\t\t\t};\n\t\t\tif (includeMatches) result.indices = [[0, text.length - 1]];\n\t\t\treturn result;\n\t\t}\n\t\tconst { location, distance, threshold, findAllMatches, minMatchCharLength, ignoreLocation } = this.options;\n\t\tconst allIndices = [];\n\t\tlet totalScore = 0;\n\t\tlet hasMatches = false;\n\t\tthis.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n\t\t\tconst { isMatch, score, indices } = search(text, pattern, alphabet, {\n\t\t\t\tlocation: location + startIndex,\n\t\t\t\tdistance,\n\t\t\t\tthreshold,\n\t\t\t\tfindAllMatches,\n\t\t\t\tminMatchCharLength,\n\t\t\t\tincludeMatches,\n\t\t\t\tignoreLocation\n\t\t\t});\n\t\t\tif (isMatch) hasMatches = true;\n\t\t\ttotalScore += score;\n\t\t\tif (isMatch && indices) allIndices.push(...indices);\n\t\t});\n\t\tconst result = {\n\t\t\tisMatch: hasMatches,\n\t\t\tscore: hasMatches ? totalScore / this.chunks.length : 1\n\t\t};\n\t\tif (hasMatches && includeMatches) result.indices = mergeIndices(allIndices);\n\t\treturn result;\n\t}\n};\n\n//#endregion\n//#region src/search/extended/matchers.ts\nconst MULTI_MATCH_TYPES = new Set([\"fuzzy\", \"include\"]);\nfunction isInverse(type) {\n\treturn type.startsWith(\"inverse\");\n}\nconst matchers = [\n\t{\n\t\ttype: \"exact\",\n\t\tmultiRegex: /^=\"(.*)\"$/,\n\t\tsingleRegex: /^=(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text === pattern;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, pattern.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"include\",\n\t\tmultiRegex: /^'\"(.*)\"$/,\n\t\tsingleRegex: /^'(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"include\",\n\t\t\tsearch(text) {\n\t\t\t\tlet location = 0;\n\t\t\t\tlet index;\n\t\t\t\tconst indices = [];\n\t\t\t\tconst patternLen = pattern.length;\n\t\t\t\twhile ((index = text.indexOf(pattern, location)) > -1) {\n\t\t\t\t\tlocation = index + patternLen;\n\t\t\t\t\tindices.push([index, location - 1]);\n\t\t\t\t}\n\t\t\t\tconst isMatch = !!indices.length;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"prefix-exact\",\n\t\tmultiRegex: /^\\^\"(.*)\"$/,\n\t\tsingleRegex: /^\\^(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"prefix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.startsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, pattern.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-prefix-exact\",\n\t\tmultiRegex: /^!\\^\"(.*)\"$/,\n\t\tsingleRegex: /^!\\^(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-prefix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = !text.startsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-suffix-exact\",\n\t\tmultiRegex: /^!\"(.*)\"\\$$/,\n\t\tsingleRegex: /^!(.*)\\$$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-suffix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = !text.endsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"suffix-exact\",\n\t\tmultiRegex: /^\"(.*)\"\\$$/,\n\t\tsingleRegex: /^(.*)\\$$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"suffix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.endsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [text.length - pattern.length, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-exact\",\n\t\tmultiRegex: /^!\"(.*)\"$/,\n\t\tsingleRegex: /^!(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.indexOf(pattern) === -1;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"fuzzy\",\n\t\tmultiRegex: /^\"(.*)\"$/,\n\t\tsingleRegex: /^(.*)$/,\n\t\tcreate: (pattern, options = {}) => {\n\t\t\tconst bitap = new BitapSearch(pattern, {\n\t\t\t\tlocation: options.location ?? Config.location,\n\t\t\t\tthreshold: options.threshold ?? Config.threshold,\n\t\t\t\tdistance: options.distance ?? Config.distance,\n\t\t\t\tincludeMatches: options.includeMatches ?? Config.includeMatches,\n\t\t\t\tfindAllMatches: options.findAllMatches ?? Config.findAllMatches,\n\t\t\t\tminMatchCharLength: options.minMatchCharLength ?? Config.minMatchCharLength,\n\t\t\t\tisCaseSensitive: options.isCaseSensitive ?? Config.isCaseSensitive,\n\t\t\t\tignoreDiacritics: options.ignoreDiacritics ?? Config.ignoreDiacritics,\n\t\t\t\tignoreLocation: options.ignoreLocation ?? Config.ignoreLocation\n\t\t\t});\n\t\t\treturn {\n\t\t\t\ttype: \"fuzzy\",\n\t\t\t\tsearch(text) {\n\t\t\t\t\treturn bitap.searchIn(text);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n];\n\n//#endregion\n//#region src/search/extended/parseQuery.ts\nconst matchersLen = matchers.length;\nconst ESCAPED_PIPE = \"\\0\";\nconst OR_TOKEN = \"|\";\nfunction tokenize(pattern) {\n\tconst tokens = [];\n\tconst len = pattern.length;\n\tlet i = 0;\n\twhile (i < len) {\n\t\twhile (i < len && pattern[i] === \" \") i++;\n\t\tif (i >= len) break;\n\t\tlet j = i;\n\t\twhile (j < len && pattern[j] !== \" \" && pattern[j] !== \"\\\"\") j++;\n\t\tif (j < len && pattern[j] === \"\\\"\") {\n\t\t\tj++;\n\t\t\twhile (j < len) {\n\t\t\t\tif (pattern[j] === \"\\\"\") {\n\t\t\t\t\tconst next = j + 1;\n\t\t\t\t\tif (next >= len || pattern[next] === \" \") {\n\t\t\t\t\t\tj++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (pattern[next] === \"$\" && (next + 1 >= len || pattern[next + 1] === \" \")) {\n\t\t\t\t\t\tj += 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tj++;\n\t\t\t}\n\t\t\ttokens.push(pattern.substring(i, j));\n\t\t\ti = j;\n\t\t} else {\n\t\t\twhile (j < len && pattern[j] !== \" \") j++;\n\t\t\ttokens.push(pattern.substring(i, j));\n\t\t\ti = j;\n\t\t}\n\t}\n\treturn tokens;\n}\nfunction getMatch(pattern, exp) {\n\tconst matches = pattern.match(exp);\n\treturn matches ? matches[1] : null;\n}\nfunction parseQuery(pattern, options = {}) {\n\treturn pattern.replace(/\\\\\\|/g, ESCAPED_PIPE).split(OR_TOKEN).map((item) => {\n\t\tconst query = tokenize(item.replace(/\\u0000/g, \"|\").trim()).filter((item) => item && !!item.trim());\n\t\tconst results = [];\n\t\tfor (let i = 0, len = query.length; i < len; i += 1) {\n\t\t\tconst queryItem = query[i];\n\t\t\tlet found = false;\n\t\t\tlet idx = -1;\n\t\t\twhile (!found && ++idx < matchersLen) {\n\t\t\t\tconst def = matchers[idx];\n\t\t\t\tconst token = getMatch(queryItem, def.multiRegex);\n\t\t\t\tif (token) {\n\t\t\t\t\tresults.push(def.create(token, options));\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (found) continue;\n\t\t\tidx = -1;\n\t\t\twhile (++idx < matchersLen) {\n\t\t\t\tconst def = matchers[idx];\n\t\t\t\tconst token = getMatch(queryItem, def.singleRegex);\n\t\t\t\tif (token) {\n\t\t\t\t\tresults.push(def.create(token, options));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t});\n}\n\n//#endregion\n//#region src/search/extended/index.ts\nvar ExtendedSearch = class {\n\tconstructor(pattern, { isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, includeMatches = Config.includeMatches, minMatchCharLength = Config.minMatchCharLength, ignoreLocation = Config.ignoreLocation, findAllMatches = Config.findAllMatches, location = Config.location, threshold = Config.threshold, distance = Config.distance } = {}) {\n\t\tthis.query = null;\n\t\tthis.options = {\n\t\t\tisCaseSensitive,\n\t\t\tignoreDiacritics,\n\t\t\tincludeMatches,\n\t\t\tminMatchCharLength,\n\t\t\tfindAllMatches,\n\t\t\tignoreLocation,\n\t\t\tlocation,\n\t\t\tthreshold,\n\t\t\tdistance\n\t\t};\n\t\tpattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\t\tpattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n\t\tthis.pattern = pattern;\n\t\tthis.query = parseQuery(this.pattern, this.options);\n\t}\n\tstatic condition(_, options) {\n\t\treturn options.useExtendedSearch;\n\t}\n\tsearchIn(text) {\n\t\tconst query = this.query;\n\t\tif (!query) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\t\ttext = isCaseSensitive ? text : text.toLowerCase();\n\t\ttext = ignoreDiacritics ? stripDiacritics(text) : text;\n\t\tlet numMatches = 0;\n\t\tconst allIndices = [];\n\t\tlet totalScore = 0;\n\t\tlet hasInverse = false;\n\t\tfor (let i = 0, qLen = query.length; i < qLen; i += 1) {\n\t\t\tconst searchers = query[i];\n\t\t\tallIndices.length = 0;\n\t\t\tnumMatches = 0;\n\t\t\thasInverse = false;\n\t\t\tfor (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n\t\t\t\tconst matcher = searchers[j];\n\t\t\t\tconst { isMatch, indices, score } = matcher.search(text);\n\t\t\t\tif (isMatch) {\n\t\t\t\t\tnumMatches += 1;\n\t\t\t\t\ttotalScore += score;\n\t\t\t\t\tif (isInverse(matcher.type)) hasInverse = true;\n\t\t\t\t\tif (includeMatches) if (MULTI_MATCH_TYPES.has(matcher.type)) allIndices.push(...indices);\n\t\t\t\t\telse allIndices.push(indices);\n\t\t\t\t} else {\n\t\t\t\t\ttotalScore = 0;\n\t\t\t\t\tnumMatches = 0;\n\t\t\t\t\tallIndices.length = 0;\n\t\t\t\t\thasInverse = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (numMatches) {\n\t\t\t\tconst result = {\n\t\t\t\t\tisMatch: true,\n\t\t\t\t\tscore: totalScore / numMatches\n\t\t\t\t};\n\t\t\t\tif (hasInverse) result.hasInverse = true;\n\t\t\t\tif (includeMatches) result.indices = mergeIndices(allIndices);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t}\n};\n\n//#endregion\n//#region src/core/register.ts\nconst registeredSearchers = [];\nfunction register(...args) {\n\tregisteredSearchers.push(...args);\n}\nfunction createSearcher(pattern, options) {\n\tfor (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n\t\tconst searcherClass = registeredSearchers[i];\n\t\tif (searcherClass.condition(pattern, options)) return new searcherClass(pattern, options);\n\t}\n\treturn new BitapSearch(pattern, options);\n}\n\n//#endregion\n//#region src/core/queryParser.ts\nconst LogicalOperator = {\n\tAND: \"$and\",\n\tOR: \"$or\"\n};\nconst KeyType = {\n\tPATH: \"$path\",\n\tPATTERN: \"$val\"\n};\nconst isExpression = (query) => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\nconst isPath = (query) => !!query[KeyType.PATH];\nconst isLeaf = (query) => !isArray(query) && isObject(query) && !isExpression(query);\nconst convertToExplicit = (query) => ({ [LogicalOperator.AND]: Object.keys(query).map((key) => ({ [key]: query[key] })) });\nfunction parse(query, options, { auto = true } = {}) {\n\tconst next = (query) => {\n\t\tif (isString(query)) {\n\t\t\tconst obj = {\n\t\t\t\tkeyId: null,\n\t\t\t\tpattern: query\n\t\t\t};\n\t\t\tif (auto) obj.searcher = createSearcher(query, options);\n\t\t\treturn obj;\n\t\t}\n\t\tconst keys = Object.keys(query);\n\t\tconst isQueryPath = isPath(query);\n\t\tif (!isQueryPath && keys.length > 1 && !isExpression(query)) return next(convertToExplicit(query));\n\t\tif (isLeaf(query)) {\n\t\t\tconst key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\t\t\tconst pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\t\t\tif (!isString(pattern)) throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key));\n\t\t\tconst obj = {\n\t\t\t\tkeyId: createKeyId(key),\n\t\t\t\tpattern\n\t\t\t};\n\t\t\tif (auto) obj.searcher = createSearcher(pattern, options);\n\t\t\treturn obj;\n\t\t}\n\t\tconst node = {\n\t\t\tchildren: [],\n\t\t\toperator: keys[0]\n\t\t};\n\t\tkeys.forEach((key) => {\n\t\t\tconst value = query[key];\n\t\t\tif (isArray(value)) value.forEach((item) => {\n\t\t\t\tnode.children.push(next(item));\n\t\t\t});\n\t\t});\n\t\treturn node;\n\t};\n\tif (!isExpression(query)) query = convertToExplicit(query);\n\treturn next(query);\n}\n\n//#endregion\n//#region src/core/computeScore.ts\nfunction computeScoreSingle(matches, { ignoreFieldNorm = Config.ignoreFieldNorm }) {\n\tlet totalScore = 1;\n\tmatches.forEach(({ key, norm, score }) => {\n\t\tconst weight = key ? key.weight : null;\n\t\ttotalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm));\n\t});\n\treturn totalScore;\n}\nfunction computeScore(results, { ignoreFieldNorm = Config.ignoreFieldNorm }) {\n\tresults.forEach((result) => {\n\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t});\n}\n\n//#endregion\n//#region src/tools/MaxHeap.ts\nvar MaxHeap = class {\n\tconstructor(limit) {\n\t\tthis.limit = limit;\n\t\tthis.heap = [];\n\t}\n\tget size() {\n\t\treturn this.heap.length;\n\t}\n\tshouldInsert(score) {\n\t\treturn this.size < this.limit || score < this.heap[0].score;\n\t}\n\tinsert(item) {\n\t\tif (this.size < this.limit) {\n\t\t\tthis.heap.push(item);\n\t\t\tthis._bubbleUp(this.size - 1);\n\t\t} else if (item.score < this.heap[0].score) {\n\t\t\tthis.heap[0] = item;\n\t\t\tthis._sinkDown(0);\n\t\t}\n\t}\n\textractSorted(sortFn) {\n\t\treturn this.heap.sort(sortFn);\n\t}\n\t_bubbleUp(i) {\n\t\tconst heap = this.heap;\n\t\twhile (i > 0) {\n\t\t\tconst parent = i - 1 >> 1;\n\t\t\tif (heap[i].score <= heap[parent].score) break;\n\t\t\tconst tmp = heap[i];\n\t\t\theap[i] = heap[parent];\n\t\t\theap[parent] = tmp;\n\t\t\ti = parent;\n\t\t}\n\t}\n\t_sinkDown(i) {\n\t\tconst heap = this.heap;\n\t\tconst len = heap.length;\n\t\tlet largest = i;\n\t\tdo {\n\t\t\ti = largest;\n\t\t\tconst left = 2 * i + 1;\n\t\t\tconst right = 2 * i + 2;\n\t\t\tif (left < len && heap[left].score > heap[largest].score) largest = left;\n\t\t\tif (right < len && heap[right].score > heap[largest].score) largest = right;\n\t\t\tif (largest !== i) {\n\t\t\t\tconst tmp = heap[i];\n\t\t\t\theap[i] = heap[largest];\n\t\t\t\theap[largest] = tmp;\n\t\t\t}\n\t\t} while (largest !== i);\n\t}\n};\n\n//#endregion\n//#region src/core/formatMatches.ts\nfunction formatMatches(result) {\n\tconst matches = [];\n\tresult.matches.forEach((match) => {\n\t\tif (!isDefined(match.indices) || !match.indices.length) return;\n\t\tconst obj = {\n\t\t\tindices: match.indices,\n\t\t\tvalue: match.value\n\t\t};\n\t\tif (match.key) obj.key = match.key.id;\n\t\tif (match.idx > -1) obj.refIndex = match.idx;\n\t\tmatches.push(obj);\n\t});\n\treturn matches;\n}\n\n//#endregion\n//#region src/core/format.ts\nfunction format(results, docs, { includeMatches = Config.includeMatches, includeScore = Config.includeScore } = {}) {\n\treturn results.map((result) => {\n\t\tconst { idx } = result;\n\t\tconst data = {\n\t\t\titem: docs[idx],\n\t\t\trefIndex: idx\n\t\t};\n\t\tif (includeMatches) data.matches = formatMatches(result);\n\t\tif (includeScore) data.score = result.score;\n\t\treturn data;\n\t});\n}\n\n//#endregion\n//#region src/search/token/analyzer.ts\nconst DEFAULT_TOKEN = /[\\p{L}\\p{M}\\p{N}_]+/gu;\nconst warned = /* @__PURE__ */ new WeakSet();\nfunction warnNonGlobal(regex) {\n\tif (!warned.has(regex)) {\n\t\twarned.add(regex);\n\t\tconsole.warn(`[Fuse] tokenize regex ${regex} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`);\n\t}\n}\nfunction resolveTokenize(tokenize) {\n\tif (typeof tokenize === \"function\") {\n\t\tlet validated = false;\n\t\treturn (text) => {\n\t\t\tconst result = tokenize(text);\n\t\t\tif (!validated) {\n\t\t\t\tvalidated = true;\n\t\t\t\tif (!Array.isArray(result) || result.some((t) => typeof t !== \"string\")) throw new Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(result) ? \"array containing non-strings\" : typeof result}.`);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\tif (tokenize instanceof RegExp) {\n\t\tif (!tokenize.global) warnNonGlobal(tokenize);\n\t\treturn (text) => text.match(tokenize) || [];\n\t}\n\treturn (text) => text.match(DEFAULT_TOKEN) || [];\n}\nfunction createAnalyzer({ isCaseSensitive = false, ignoreDiacritics = false, tokenize } = {}) {\n\tconst tokenizeFn = resolveTokenize(tokenize);\n\treturn { tokenize(text) {\n\t\tif (!isCaseSensitive) text = text.toLowerCase();\n\t\tif (ignoreDiacritics) text = stripDiacritics(text);\n\t\treturn tokenizeFn(text);\n\t} };\n}\n\n//#endregion\n//#region src/search/token/index.ts\nconst MAX_MASK_TERMS = 31;\nvar TokenSearch = class {\n\tstatic condition(_, options) {\n\t\treturn options.useTokenSearch;\n\t}\n\tconstructor(pattern, options) {\n\t\tthis.options = options;\n\t\tthis.analyzer = createAnalyzer({\n\t\t\tisCaseSensitive: options.isCaseSensitive,\n\t\t\tignoreDiacritics: options.ignoreDiacritics,\n\t\t\ttokenize: options.tokenize\n\t\t});\n\t\tconst queryTerms = this.analyzer.tokenize(pattern);\n\t\tconst { df, fieldCount } = options._invertedIndex;\n\t\tthis.termSearchers = [];\n\t\tthis.idfWeights = [];\n\t\tfor (const term of queryTerms) {\n\t\t\tthis.termSearchers.push(new BitapSearch(term, {\n\t\t\t\tlocation: options.location,\n\t\t\t\tthreshold: options.threshold,\n\t\t\t\tdistance: options.distance,\n\t\t\t\tincludeMatches: options.includeMatches,\n\t\t\t\tfindAllMatches: options.findAllMatches,\n\t\t\t\tminMatchCharLength: options.minMatchCharLength,\n\t\t\t\tisCaseSensitive: options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: options.ignoreDiacritics,\n\t\t\t\tignoreLocation: true\n\t\t\t}));\n\t\t\tconst docFreq = df.get(term) || 0;\n\t\t\tconst idf = Math.log(1 + (fieldCount - docFreq + .5) / (docFreq + .5));\n\t\t\tthis.idfWeights.push(idf);\n\t\t}\n\t\tthis.combineAll = options.tokenMatch === \"all\";\n\t\tthis.numTerms = this.termSearchers.length;\n\t\tthis.useMask = this.numTerms <= 31;\n\t}\n\tsearchIn(text) {\n\t\tif (!this.termSearchers.length) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst allIndices = [];\n\t\tlet weightedScore = 0;\n\t\tlet maxPossibleScore = 0;\n\t\tlet matchedCount = 0;\n\t\tlet matchedMask = 0;\n\t\tconst matchedTerms = this.combineAll && !this.useMask ? /* @__PURE__ */ new Set() : null;\n\t\tfor (let i = 0; i < this.termSearchers.length; i++) {\n\t\t\tconst result = this.termSearchers[i].searchIn(text);\n\t\t\tconst idf = this.idfWeights[i];\n\t\t\tmaxPossibleScore += idf;\n\t\t\tif (result.isMatch) {\n\t\t\t\tmatchedCount++;\n\t\t\t\tweightedScore += idf * (1 - result.score);\n\t\t\t\tif (result.indices) allIndices.push(...result.indices);\n\t\t\t\tif (this.combineAll) if (this.useMask) matchedMask |= 1 << i;\n\t\t\t\telse matchedTerms.add(i);\n\t\t\t}\n\t\t}\n\t\tif (matchedCount === 0) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst normalized = maxPossibleScore > 0 ? 1 - weightedScore / maxPossibleScore : 0;\n\t\tconst searchResult = {\n\t\t\tisMatch: true,\n\t\t\tscore: Math.max(.001, normalized)\n\t\t};\n\t\tif (this.options.includeMatches && allIndices.length) searchResult.indices = mergeIndices(allIndices);\n\t\tif (this.combineAll) {\n\t\t\tif (this.useMask) searchResult.matchedMask = matchedMask;\n\t\t\telse searchResult.matchedTerms = matchedTerms;\n\t\t\tsearchResult.termCount = this.numTerms;\n\t\t}\n\t\treturn searchResult;\n\t}\n};\n\n//#endregion\n//#region src/search/token/InvertedIndex.ts\nfunction addField(index, text, docIdx, analyzer) {\n\tconst tokens = analyzer.tokenize(text);\n\tif (!tokens.length) return;\n\tindex.fieldCount++;\n\tindex.docFieldCount.set(docIdx, (index.docFieldCount.get(docIdx) || 0) + 1);\n\tconst distinctTerms = new Set(tokens);\n\tlet perDocTerms = index.docTermFieldHits.get(docIdx);\n\tif (!perDocTerms) {\n\t\tperDocTerms = /* @__PURE__ */ new Map();\n\t\tindex.docTermFieldHits.set(docIdx, perDocTerms);\n\t}\n\tfor (const term of distinctTerms) {\n\t\tperDocTerms.set(term, (perDocTerms.get(term) || 0) + 1);\n\t\tindex.df.set(term, (index.df.get(term) || 0) + 1);\n\t}\n}\nfunction ingestRecord(index, record, keyCount, analyzer) {\n\tconst { i: docIdx, v, $: fields } = record;\n\tif (v !== void 0) {\n\t\taddField(index, v, docIdx, analyzer);\n\t\treturn;\n\t}\n\tif (!fields) return;\n\tfor (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n\t\tconst value = fields[keyIdx];\n\t\tif (!value) continue;\n\t\tif (Array.isArray(value)) for (const sub of value) addField(index, sub.v, docIdx, analyzer);\n\t\telse addField(index, value.v, docIdx, analyzer);\n\t}\n}\nfunction buildInvertedIndex(records, keyCount, analyzer) {\n\tconst index = {\n\t\tfieldCount: 0,\n\t\tdf: /* @__PURE__ */ new Map(),\n\t\tdocFieldCount: /* @__PURE__ */ new Map(),\n\t\tdocTermFieldHits: /* @__PURE__ */ new Map()\n\t};\n\tfor (const record of records) ingestRecord(index, record, keyCount, analyzer);\n\treturn index;\n}\nfunction addToInvertedIndex(index, record, keyCount, analyzer) {\n\tingestRecord(index, record, keyCount, analyzer);\n}\nfunction removeFromInvertedIndex(index, docIdx) {\n\tconst fieldCount = index.docFieldCount.get(docIdx);\n\tif (fieldCount === void 0) return;\n\tindex.fieldCount -= fieldCount;\n\tindex.docFieldCount.delete(docIdx);\n\tconst perDocTerms = index.docTermFieldHits.get(docIdx);\n\tif (!perDocTerms) return;\n\tfor (const [term, hits] of perDocTerms) {\n\t\tconst next = (index.df.get(term) || 0) - hits;\n\t\tif (next <= 0) index.df.delete(term);\n\t\telse index.df.set(term, next);\n\t}\n\tindex.docTermFieldHits.delete(docIdx);\n}\nfunction removeAndShiftInvertedIndex(index, removedIndices) {\n\tif (removedIndices.length === 0) return;\n\tconst sorted = Array.from(new Set(removedIndices)).sort((a, b) => a - b);\n\tfor (const idx of sorted) removeFromInvertedIndex(index, idx);\n\tconst shift = (oldIdx) => {\n\t\tlet lo = 0;\n\t\tlet hi = sorted.length;\n\t\twhile (lo < hi) {\n\t\t\tconst mid = lo + hi >>> 1;\n\t\t\tif (sorted[mid] < oldIdx) lo = mid + 1;\n\t\t\telse hi = mid;\n\t\t}\n\t\treturn oldIdx - lo;\n\t};\n\tconst firstRemoved = sorted[0];\n\tconst shiftedDocFieldCount = /* @__PURE__ */ new Map();\n\tfor (const [oldKey, count] of index.docFieldCount) shiftedDocFieldCount.set(oldKey > firstRemoved ? shift(oldKey) : oldKey, count);\n\tindex.docFieldCount = shiftedDocFieldCount;\n\tconst shiftedDocTermFieldHits = /* @__PURE__ */ new Map();\n\tfor (const [oldKey, terms] of index.docTermFieldHits) shiftedDocTermFieldHits.set(oldKey > firstRemoved ? shift(oldKey) : oldKey, terms);\n\tindex.docTermFieldHits = shiftedDocTermFieldHits;\n}\n\n//#endregion\n//#region src/core/index.ts\nvar Fuse = class {\n\tconstructor(docs, options, index) {\n\t\tthis.options = {\n\t\t\t...Config,\n\t\t\t...options\n\t\t};\n\t\tif (this.options.useExtendedSearch && false);\n\t\tif (this.options.useTokenSearch && false);\n\t\tthis._keyStore = new KeyStore(this.options.keys);\n\t\tthis._docs = docs;\n\t\tthis._myIndex = null;\n\t\tthis._invertedIndex = null;\n\t\tthis.setCollection(docs, index);\n\t\tthis._lastQuery = null;\n\t\tthis._lastSearcher = null;\n\t}\n\t_getSearcher(query) {\n\t\tif (this._lastQuery === query) return this._lastSearcher;\n\t\tconst searcher = createSearcher(query, this._invertedIndex ? {\n\t\t\t...this.options,\n\t\t\t_invertedIndex: this._invertedIndex\n\t\t} : this.options);\n\t\tthis._lastQuery = query;\n\t\tthis._lastSearcher = searcher;\n\t\treturn searcher;\n\t}\n\tsetCollection(docs, index) {\n\t\tthis._docs = docs;\n\t\tif (index && !(index instanceof FuseIndex)) throw new Error(INCORRECT_INDEX_TYPE);\n\t\tthis._myIndex = index || createIndex(this.options.keys, this._docs, {\n\t\t\tgetFn: this.options.getFn,\n\t\t\tfieldNormWeight: this.options.fieldNormWeight\n\t\t});\n\t\tif (this.options.useTokenSearch) {\n\t\t\tconst analyzer = createAnalyzer({\n\t\t\t\tisCaseSensitive: this.options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: this.options.ignoreDiacritics,\n\t\t\t\ttokenize: this.options.tokenize\n\t\t\t});\n\t\t\tthis._invertedIndex = buildInvertedIndex(this._myIndex.records, this._myIndex.keys.length, analyzer);\n\t\t}\n\t\tthis._invalidateSearcherCache();\n\t}\n\tadd(doc) {\n\t\tif (!isDefined(doc)) return;\n\t\tthis._docs.push(doc);\n\t\tconst record = this._myIndex.add(doc, this._docs.length - 1);\n\t\tif (this._invertedIndex && record) {\n\t\t\tconst analyzer = createAnalyzer({\n\t\t\t\tisCaseSensitive: this.options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: this.options.ignoreDiacritics,\n\t\t\t\ttokenize: this.options.tokenize\n\t\t\t});\n\t\t\taddToInvertedIndex(this._invertedIndex, record, this._myIndex.keys.length, analyzer);\n\t\t}\n\t\tthis._invalidateSearcherCache();\n\t}\n\tremove(predicate = () => false) {\n\t\tconst results = [];\n\t\tconst indicesToRemove = [];\n\t\tfor (let i = 0, len = this._docs.length; i < len; i += 1) if (predicate(this._docs[i], i)) {\n\t\t\tresults.push(this._docs[i]);\n\t\t\tindicesToRemove.push(i);\n\t\t}\n\t\tif (indicesToRemove.length) {\n\t\t\tif (this._invertedIndex) removeAndShiftInvertedIndex(this._invertedIndex, indicesToRemove);\n\t\t\tconst toRemove = new Set(indicesToRemove);\n\t\t\tthis._docs = this._docs.filter((_, i) => !toRemove.has(i));\n\t\t\tthis._myIndex.removeAll(indicesToRemove);\n\t\t\tthis._invalidateSearcherCache();\n\t\t}\n\t\treturn results;\n\t}\n\tremoveAt(idx) {\n\t\tif (!Number.isInteger(idx) || idx < 0 || idx >= this._docs.length) throw new Error(INVALID_DOC_INDEX);\n\t\tif (this._invertedIndex) removeAndShiftInvertedIndex(this._invertedIndex, [idx]);\n\t\tconst doc = this._docs.splice(idx, 1)[0];\n\t\tthis._myIndex.removeAt(idx);\n\t\tthis._invalidateSearcherCache();\n\t\treturn doc;\n\t}\n\t_invalidateSearcherCache() {\n\t\tthis._lastQuery = null;\n\t\tthis._lastSearcher = null;\n\t}\n\tgetIndex() {\n\t\treturn this._myIndex;\n\t}\n\tsearch(query, options) {\n\t\tconst { limit = -1 } = options || {};\n\t\tconst { includeMatches, includeScore, shouldSort, sortFn, ignoreFieldNorm } = this.options;\n\t\tif (isString(query) && !query.trim()) {\n\t\t\tlet docs = this._docs.map((item, idx) => ({\n\t\t\t\titem,\n\t\t\t\trefIndex: idx\n\t\t\t}));\n\t\t\tif (isNumber(limit) && limit > -1) docs = docs.slice(0, limit);\n\t\t\treturn docs;\n\t\t}\n\t\tconst useHeap = isNumber(limit) && limit > 0 && isString(query);\n\t\tlet results;\n\t\tif (useHeap) {\n\t\t\tconst heap = new MaxHeap(limit);\n\t\t\tif (isString(this._docs[0])) this._searchStringList(query, {\n\t\t\t\theap,\n\t\t\t\tignoreFieldNorm\n\t\t\t});\n\t\t\telse this._searchObjectList(query, {\n\t\t\t\theap,\n\t\t\t\tignoreFieldNorm\n\t\t\t});\n\t\t\tresults = heap.extractSorted(sortFn);\n\t\t} else {\n\t\t\tresults = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query);\n\t\t\tcomputeScore(results, { ignoreFieldNorm });\n\t\t\tif (shouldSort) results.sort(sortFn);\n\t\t\tif (isNumber(limit) && limit > -1) results = results.slice(0, limit);\n\t\t}\n\t\treturn format(results, this._docs, {\n\t\t\tincludeMatches,\n\t\t\tincludeScore\n\t\t});\n\t}\n\t_searchStringList(query, { heap, ignoreFieldNorm } = {}) {\n\t\tconst searcher = this._getSearcher(query);\n\t\tconst requireAllTokens = this.options.useTokenSearch && this.options.tokenMatch === \"all\";\n\t\tconst { records } = this._myIndex;\n\t\tconst results = heap ? null : [];\n\t\trecords.forEach(({ v: text, i: idx, n: norm }) => {\n\t\t\tif (!isDefined(text)) return;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices\n\t\t\t\t};\n\t\t\t\tif (requireAllTokens) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tconst matches = [match];\n\t\t\t\tif (!requireAllTokens || this._coversAllTokens(matches)) {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\titem: text,\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\tmatches\n\t\t\t\t\t};\n\t\t\t\t\tif (heap) {\n\t\t\t\t\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t\t\t\t\t\tif (heap.shouldInsert(result.score)) heap.insert(result);\n\t\t\t\t\t} else results.push(result);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_searchLogical(query) {\n\t\tconst expression = parse(query, this.options);\n\t\tconst evaluate = (node, item, idx) => {\n\t\t\tif (!(\"children\" in node)) {\n\t\t\t\tconst { keyId, searcher } = node;\n\t\t\t\tlet matches;\n\t\t\t\tif (keyId === null) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tthis._myIndex.keys.forEach((key, keyIndex) => {\n\t\t\t\t\t\tmatches.push(...this._findMatches({\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tvalue: item[keyIndex],\n\t\t\t\t\t\t\tsearcher\n\t\t\t\t\t\t}));\n\t\t\t\t\t});\n\t\t\t\t} else matches = this._findMatches({\n\t\t\t\t\tkey: this._keyStore.get(keyId),\n\t\t\t\t\tvalue: this._myIndex.getValueForItemAtKeyId(item, keyId),\n\t\t\t\t\tsearcher\n\t\t\t\t});\n\t\t\t\tif (matches && matches.length) return [{\n\t\t\t\t\tidx,\n\t\t\t\t\titem,\n\t\t\t\t\tmatches\n\t\t\t\t}];\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst { children, operator } = node;\n\t\t\tconst res = [];\n\t\t\tfor (let i = 0, len = children.length; i < len; i += 1) {\n\t\t\t\tconst child = children[i];\n\t\t\t\tconst result = evaluate(child, item, idx);\n\t\t\t\tif (result.length) res.push(...result);\n\t\t\t\telse if (operator === LogicalOperator.AND) return [];\n\t\t\t}\n\t\t\treturn res;\n\t\t};\n\t\tconst records = this._myIndex.records;\n\t\tconst resultMap = /* @__PURE__ */ new Map();\n\t\tconst results = [];\n\t\trecords.forEach(({ $: item, i: idx }) => {\n\t\t\tif (isDefined(item)) {\n\t\t\t\tconst expResults = evaluate(expression, item, idx);\n\t\t\t\tif (expResults.length) {\n\t\t\t\t\tif (!resultMap.has(idx)) {\n\t\t\t\t\t\tresultMap.set(idx, {\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tmatches: []\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresults.push(resultMap.get(idx));\n\t\t\t\t\t}\n\t\t\t\t\texpResults.forEach(({ matches }) => {\n\t\t\t\t\t\tresultMap.get(idx).matches.push(...matches);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_searchObjectList(query, { heap, ignoreFieldNorm } = {}) {\n\t\tconst searcher = this._getSearcher(query);\n\t\tconst requireAllTokens = this.options.useTokenSearch && this.options.tokenMatch === \"all\";\n\t\tconst { keys, records } = this._myIndex;\n\t\tconst results = heap ? null : [];\n\t\trecords.forEach(({ $: item, i: idx }) => {\n\t\t\tif (!isDefined(item)) return;\n\t\t\tconst matches = [];\n\t\t\tlet anyKeyFailed = false;\n\t\t\tlet hasInverse = false;\n\t\t\tkeys.forEach((key, keyIndex) => {\n\t\t\t\tconst keyMatches = this._findMatches({\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: item[keyIndex],\n\t\t\t\t\tsearcher\n\t\t\t\t});\n\t\t\t\tif (keyMatches.length) {\n\t\t\t\t\tmatches.push(...keyMatches);\n\t\t\t\t\tif (keyMatches[0].hasInverse) hasInverse = true;\n\t\t\t\t} else anyKeyFailed = true;\n\t\t\t});\n\t\t\tif (hasInverse && anyKeyFailed) return;\n\t\t\tif (matches.length && (!requireAllTokens || this._coversAllTokens(matches))) {\n\t\t\t\tconst result = {\n\t\t\t\t\tidx,\n\t\t\t\t\titem,\n\t\t\t\t\tmatches\n\t\t\t\t};\n\t\t\t\tif (heap) {\n\t\t\t\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t\t\t\t\tif (heap.shouldInsert(result.score)) heap.insert(result);\n\t\t\t\t} else results.push(result);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_findMatches({ key, value, searcher }) {\n\t\tif (!isDefined(value)) return [];\n\t\tconst matches = [];\n\t\tif (isArray(value)) value.forEach(({ v: text, i: idx, n: norm }) => {\n\t\t\tif (!isDefined(text)) return;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tidx,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices,\n\t\t\t\t\thasInverse: searchResult.hasInverse\n\t\t\t\t};\n\t\t\t\tif (searchResult.termCount !== void 0) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t});\n\t\telse {\n\t\t\tconst { v: text, n: norm } = value;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices,\n\t\t\t\t\thasInverse: searchResult.hasInverse\n\t\t\t\t};\n\t\t\t\tif (searchResult.termCount !== void 0) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\t_coversAllTokens(matches) {\n\t\tconst termCount = matches.length ? matches[0].termCount : void 0;\n\t\tif (termCount === void 0) return true;\n\t\tif (termCount <= 31) {\n\t\t\tlet coverage = 0;\n\t\t\tfor (let i = 0; i < matches.length; i++) coverage |= matches[i].matchedMask || 0;\n\t\t\treturn coverage === 2 ** termCount - 1;\n\t\t}\n\t\tconst coverage = /* @__PURE__ */ new Set();\n\t\tfor (let i = 0; i < matches.length; i++) {\n\t\t\tconst terms = matches[i].matchedTerms;\n\t\t\tif (terms) for (const t of terms) coverage.add(t);\n\t\t}\n\t\treturn coverage.size === termCount;\n\t}\n};\n\n//#endregion\n//#region src/entry.ts\nFuse.version = \"7.4.2\";\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\nFuse.match = function(pattern, text, options) {\n\tif (options && options.useTokenSearch) throw new Error(FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED);\n\treturn createSearcher(pattern, {\n\t\t...Config,\n\t\t...options\n\t}).searchIn(text);\n};\nFuse.parseQuery = parse;\nregister(ExtendedSearch);\nregister(TokenSearch);\nFuse.use = function(...plugins) {\n\tplugins.forEach((plugin) => register(plugin));\n};\nvar entry_default = Fuse;\n\n//#endregion\nexport { entry_default as default };","import { useEffect, useState } from 'preact/hooks';\n\nexport const MIN_SCHEDULED_AT = 6 * 60 * 1000; // 6 mins\nconst MAX_SCHEDULED_AT = 90 * 24 * 60 * 60 * 1000; // 90 days\n\nexport default function ScheduledAtField({ scheduledAt, setScheduledAt }) {\n if (!scheduledAt || !scheduledAt?.getTime) {\n // Not using \"instanceof Date\" check due to \"cross-realm\" issues\n console.warn('scheduledAt is invalid', scheduledAt);\n return;\n }\n const [minStr, setMinStr] = useState();\n const [maxStr, setMaxStr] = useState();\n const timezoneOffset = scheduledAt.getTimezoneOffset();\n\n useEffect(() => {\n function updateMinStr() {\n const min = new Date(Date.now() + MIN_SCHEDULED_AT);\n const str = new Date(min.getTime() - timezoneOffset * 60000)\n .toISOString()\n .slice(0, 16);\n setMinStr(str);\n }\n updateMinStr();\n\n function updateMaxStr() {\n const max = new Date(Date.now() + MAX_SCHEDULED_AT);\n const str = new Date(max.getTime() - timezoneOffset * 60000)\n .toISOString()\n .slice(0, 16);\n setMaxStr(str);\n }\n updateMaxStr();\n\n // Update every 10s\n const intervalId = setInterval(() => {\n updateMinStr();\n updateMaxStr();\n }, 1000 * 10);\n return () => clearInterval(intervalId);\n }, []);\n\n const defaultValue = scheduledAt\n ? new Date(scheduledAt.getTime() - scheduledAt.getTimezoneOffset() * 60000)\n .toISOString()\n .slice(0, 16)\n : null;\n\n return (\n <input\n type=\"datetime-local\"\n name=\"scheduledAt\"\n defaultValue={defaultValue}\n min={minStr}\n max={maxStr}\n required\n onChange={(e) => {\n setScheduledAt(new Date(e.target.value));\n }}\n />\n );\n}\n\nexport function getLocalTimezoneName() {\n const date = new Date();\n const formatter = new Intl.DateTimeFormat(undefined, {\n timeZoneName: 'long',\n });\n const parts = formatter.formatToParts(date);\n const timezoneName = parts.find(\n (part) => part.type === 'timeZoneName',\n )?.value;\n return timezoneName;\n}\n"],"file":"ScheduledAtField-D-Abfo4J.js"}