Flow Youtube Chat

Youtubeのチャットをニコニコ風に画面上へ流す(再アップ) Make youtube chats move in danmaku-style.

当前为 2022-11-10 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Flow Youtube Chat
  3. // @version 1.15.15
  4. // @description Youtubeのチャットをニコニコ風に画面上へ流す(再アップ) Make youtube chats move in danmaku-style.
  5. // @match https://www.youtube.com/*
  6. // @namespace FlowYoutubeChatScript
  7. // @run-at document-end
  8. // @grant GM.setValue
  9. // @grant GM.getValue
  10. // @grant GM.deleteValue
  11. // @grant GM.listValues
  12. // @grant GM.setClipboard
  13. // @noframes
  14. // @license AGPL-3.0-or-later
  15. // @require https://cdn.jsdelivr.net/npm/sweetalert2@11.4.29/dist/sweetalert2.all.min.js#sha384-oOcVIFjLmJbkImF/OMv4gZHmkUcQAiX1EJZt7C9siwnS9yGghuo22mPgX7a623rc
  16. // @require https://unpkg.com/loglevel@1.8.0/dist/loglevel.min.js#sha384-xnEzWQtTztbu/yV2BtSvqqZGP52iLXbnb4NJ59OYT0ZDo1fGaKCR6QBxjyRuNFJ8
  17. // @require https://unpkg.com/rxjs@7.5.6/dist/bundles/rxjs.umd.min.js#sha384-loWwI45AmzSZ93ze6KW4+6eZVsQT8PriLOVCZGZstdycw5uylV3xKkHLQh53ui6b
  18. // @require https://unpkg.com/mithril@2.2.2/mithril.min.js#sha384-60kek02kUAH+DNSgj7HCtrpcirTroG3uWnDpsdvoAl2Z9Xe3GdpXDSy4ouNMHoBZ
  19. // @require https://cdn.jsdelivr.net/npm/check-types@11.1.2/src/check-types.min.js#sha384-KGnImnhVjA5llfqKEbjBiY+1Mp6oa+NvW/TEY1XTPAKWNgrAwa3Qvn//MXL07wBM
  20. // @require https://cdn.jsdelivr.net/npm/deep-diff@1.0.2/index.min.js#sha384-Q/uiWfFlwn9XjOpL49VpFKn01EkScmaC3hh1prAn7S++WoZgXRrrjQvZ7cI7C7Zn
  21. // @require https://cdn.jsdelivr.net/npm/astring@1.8.3/dist/astring.min.js#sha384-5Ucbdr4B4nO60a/3Lv4z9adjzcDkpVPH19acFTr320dXMe+cKE5y5zV+gycjJO8N
  22. // @require https://cdn.jsdelivr.net/npm/jsep@1.3.6/dist/iife/jsep.iife.min.js#sha384-6PGvkKayYZDccXp2sQ43aTf44oUNudO3L940VBGQYHfhg3YZEgSEbuannHJk7NBe
  23. // @require https://cdn.jsdelivr.net/npm/hash-it@5.0.2/dist/hash-it.min.js#sha384-biRMep0zr/5fw/hIdnBIb56UHRgiIyhAagZrngd9dSxxQ9aDFMP0hbYR8PEj5lVu
  24. // @require https://cdn.jsdelivr.net/npm/micro-memoize@4.0.11/dist/micro-memoize.min.js#sha384-3VwqC1DvF4pyT2nI/Y2hvIoGqAwEYFLImjifWlsBHhIuISG0a28JYU7K9g3c7wI9
  25. // ==/UserScript==
  26.  
  27. /* jshint esversion: 6 */
  28.  
  29. ;(() => {
  30. var __webpack_modules__ = {
  31. 661: module => {
  32. module.exports = !1
  33. },
  34. 204: module => {
  35. "use strict"
  36. module.exports = function equal(a, b) {
  37. if (a === b) return !0
  38. if (a && b && "object" == typeof a && "object" == typeof b) {
  39. if (a.constructor !== b.constructor) return !1
  40. var length, i, keys
  41. if (Array.isArray(a)) {
  42. if ((length = a.length) != b.length) return !1
  43. for (i = length; 0 != i--; ) if (!equal(a[i], b[i])) return !1
  44. return !0
  45. }
  46. if (a.constructor === RegExp)
  47. return a.source === b.source && a.flags === b.flags
  48. if (a.valueOf !== Object.prototype.valueOf)
  49. return a.valueOf() === b.valueOf()
  50. if (a.toString !== Object.prototype.toString)
  51. return a.toString() === b.toString()
  52. if (
  53. (length = (keys = Object.keys(a)).length) !==
  54. Object.keys(b).length
  55. )
  56. return !1
  57. for (i = length; 0 != i--; )
  58. if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return !1
  59. for (i = length; 0 != i--; ) {
  60. var key = keys[i]
  61. if (!equal(a[key], b[key])) return !1
  62. }
  63. return !0
  64. }
  65. return a != a && b != b
  66. }
  67. },
  68. 90: module => {
  69. module.exports = (function (e) {
  70. var r = {}
  71. function n(t) {
  72. if (r[t]) return r[t].exports
  73. var a = (r[t] = { i: t, l: !1, exports: {} })
  74. return e[t].call(a.exports, a, a.exports, n), (a.l = !0), a.exports
  75. }
  76. return (
  77. (n.m = e),
  78. (n.c = r),
  79. (n.d = function (e, r, t) {
  80. n.o(e, r) ||
  81. Object.defineProperty(e, r, { enumerable: !0, get: t })
  82. }),
  83. (n.r = function (e) {
  84. "undefined" != typeof Symbol &&
  85. Symbol.toStringTag &&
  86. Object.defineProperty(e, Symbol.toStringTag, {
  87. value: "Module",
  88. }),
  89. Object.defineProperty(e, "__esModule", { value: !0 })
  90. }),
  91. (n.t = function (e, r) {
  92. if ((1 & r && (e = n(e)), 8 & r)) return e
  93. if (4 & r && "object" == typeof e && e && e.__esModule) return e
  94. var t = Object.create(null)
  95. if (
  96. (n.r(t),
  97. Object.defineProperty(t, "default", {
  98. enumerable: !0,
  99. value: e,
  100. }),
  101. 2 & r && "string" != typeof e)
  102. )
  103. for (var a in e)
  104. n.d(
  105. t,
  106. a,
  107. function (r) {
  108. return e[r]
  109. }.bind(null, a)
  110. )
  111. return t
  112. }),
  113. (n.n = function (e) {
  114. var r =
  115. e && e.__esModule
  116. ? function () {
  117. return e.default
  118. }
  119. : function () {
  120. return e
  121. }
  122. return n.d(r, "a", r), r
  123. }),
  124. (n.o = function (e, r) {
  125. return Object.prototype.hasOwnProperty.call(e, r)
  126. }),
  127. (n.p = ""),
  128. n((n.s = 0))
  129. )
  130. })([
  131. function (e, r, n) {
  132. "use strict"
  133. n.r(r),
  134. n.d(r, "validateHTMLColorName", function () {
  135. return l
  136. }),
  137. n.d(r, "validateHTMLColorSpecialName", function () {
  138. return i
  139. }),
  140. n.d(r, "validateHTMLColorHex", function () {
  141. return u
  142. }),
  143. n.d(r, "validateHTMLColorRgb", function () {
  144. return d
  145. }),
  146. n.d(r, "validateHTMLColorHsl", function () {
  147. return f
  148. }),
  149. n.d(r, "validateHTMLColorHwb", function () {
  150. return h
  151. }),
  152. n.d(r, "validateHTMLColorLab", function () {
  153. return g
  154. }),
  155. n.d(r, "validateHTMLColor", function () {
  156. return m
  157. })
  158. const t = e => e && "string" == typeof e,
  159. a = [
  160. "AliceBlue",
  161. "AntiqueWhite",
  162. "Aqua",
  163. "Aquamarine",
  164. "Azure",
  165. "Beige",
  166. "Bisque",
  167. "Black",
  168. "BlanchedAlmond",
  169. "Blue",
  170. "BlueViolet",
  171. "Brown",
  172. "BurlyWood",
  173. "CadetBlue",
  174. "Chartreuse",
  175. "Chocolate",
  176. "Coral",
  177. "CornflowerBlue",
  178. "Cornsilk",
  179. "Crimson",
  180. "Cyan",
  181. "DarkBlue",
  182. "DarkCyan",
  183. "DarkGoldenrod",
  184. "DarkGray",
  185. "DarkGreen",
  186. "DarkKhaki",
  187. "DarkMagenta",
  188. "DarkOliveGreen",
  189. "DarkOrange",
  190. "DarkOrchid",
  191. "DarkRed",
  192. "DarkSalmon",
  193. "DarkSeaGreen",
  194. "DarkSlateBlue",
  195. "DarkSlateGray",
  196. "DarkTurquoise",
  197. "DarkViolet",
  198. "DeepPink",
  199. "DeepSkyBlue",
  200. "DimGray",
  201. "DodgerBlue",
  202. "FireBrick",
  203. "FloralWhite",
  204. "ForestGreen",
  205. "Fuchsia",
  206. "Gainsboro",
  207. "GhostWhite",
  208. "Gold",
  209. "Goldenrod",
  210. "Gray",
  211. "Green",
  212. "GreenYellow",
  213. "HoneyDew",
  214. "HotPink",
  215. "IndianRed",
  216. "Indigo",
  217. "Ivory",
  218. "Khaki",
  219. "Lavender",
  220. "LavenderBlush",
  221. "LawnGreen",
  222. "LemonChiffon",
  223. "LightBlue",
  224. "LightCoral",
  225. "LightCyan",
  226. "LightGoldenrodYellow",
  227. "LightGray",
  228. "LightGreen",
  229. "LightPink",
  230. "LightSalmon",
  231. "LightSalmon",
  232. "LightSeaGreen",
  233. "LightSkyBlue",
  234. "LightSlateGray",
  235. "LightSteelBlue",
  236. "LightYellow",
  237. "Lime",
  238. "LimeGreen",
  239. "Linen",
  240. "Magenta",
  241. "Maroon",
  242. "MediumAquamarine",
  243. "MediumBlue",
  244. "MediumOrchid",
  245. "MediumPurple",
  246. "MediumSeaGreen",
  247. "MediumSlateBlue",
  248. "MediumSlateBlue",
  249. "MediumSpringGreen",
  250. "MediumTurquoise",
  251. "MediumVioletRed",
  252. "MidnightBlue",
  253. "MintCream",
  254. "MistyRose",
  255. "Moccasin",
  256. "NavajoWhite",
  257. "Navy",
  258. "OldLace",
  259. "Olive",
  260. "OliveDrab",
  261. "Orange",
  262. "OrangeRed",
  263. "Orchid",
  264. "PaleGoldenrod",
  265. "PaleGreen",
  266. "PaleTurquoise",
  267. "PaleVioletRed",
  268. "PapayaWhip",
  269. "PeachPuff",
  270. "Peru",
  271. "Pink",
  272. "Plum",
  273. "PowderBlue",
  274. "Purple",
  275. "RebeccaPurple",
  276. "Red",
  277. "RosyBrown",
  278. "RoyalBlue",
  279. "SaddleBrown",
  280. "Salmon",
  281. "SandyBrown",
  282. "SeaGreen",
  283. "SeaShell",
  284. "Sienna",
  285. "Silver",
  286. "SkyBlue",
  287. "SlateBlue",
  288. "SlateGray",
  289. "Snow",
  290. "SpringGreen",
  291. "SteelBlue",
  292. "Tan",
  293. "Teal",
  294. "Thistle",
  295. "Tomato",
  296. "Turquoise",
  297. "Violet",
  298. "Wheat",
  299. "White",
  300. "WhiteSmoke",
  301. "Yellow",
  302. "YellowGreen",
  303. ],
  304. o = ["currentColor", "inherit", "transparent"],
  305. l = e => {
  306. let r = !1
  307. return (
  308. t(e) &&
  309. a.map(
  310. n => (
  311. e.toLowerCase() === n.toLowerCase() && (r = !0), null
  312. )
  313. ),
  314. r
  315. )
  316. },
  317. i = e => {
  318. let r = !1
  319. return (
  320. t(e) &&
  321. o.map(
  322. n => (
  323. e.toLowerCase() === n.toLowerCase() && (r = !0), null
  324. )
  325. ),
  326. r
  327. )
  328. },
  329. u = e => {
  330. if (t(e)) {
  331. const r = /^#([\da-f]{3}){1,2}$|^#([\da-f]{4}){1,2}$/i
  332. return e && r.test(e)
  333. }
  334. },
  335. d = e => {
  336. if (t(e)) {
  337. const r =
  338. /(rgb)a?\((\s*\d+%?\s*?,?\s*){2}(\s*\d+%?\s*?,?\s*\)?)(\s*,?\s*\/?\s*(0?\.?\d+%?\s*)?|1|0)?\)$/i
  339. return e && r.test(e)
  340. }
  341. },
  342. s = "(([0-9]|[1-9][0-9]|100)%)",
  343. c = `\\s*?\\)?)(\\s*?(\\/?)\\s+(((${s}))|(0?(\\.\\d+)?)|1))?\\s*?\\)$`,
  344. f = e => {
  345. if (t(e)) {
  346. const r = new RegExp(
  347. `(hsl)a?\\((\\s*?((-?([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-5][0-9]|360)(deg)?)|(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-9][0-9]|400)gra)|((([0-5])?\\.\\d+|6\\.([0-9]|1[0-9]|2[0-8])|[0-6])rad)|((0?(\\.\\d+)?|1)turn))((\\s*,\\s*)|(\\s+)))(\\s*?(0|${s})((\\s*,\\s*)|(\\s+)))(\\s*?(0|${s})\\s*?\\)?)(\\s*?(\\/?|,?)\\s*?(((${s}))|(0?(\\.\\d+)?)|1))?\\)$`
  348. )
  349. return e && r.test(e)
  350. }
  351. },
  352. h = e => {
  353. if (t(e)) {
  354. const r = new RegExp(
  355. `(hwb\\(\\s*?(-?([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-5][0-9]|360)(deg)?)\\s+)((0|${s})\\s+)((0|${s})${c}`
  356. )
  357. return e && r.test(e)
  358. }
  359. },
  360. g = e => {
  361. if (t(e)) {
  362. const r =
  363. "(-?(([0-9]|[1-9][0-9]|1[0-5][0-9])(\\.\\d+)??|160))",
  364. n = new RegExp(
  365. `(lab\\(\\s*?((\\d*(\\.\\d+)?)%)\\s+${r}\\s+${r}${c}`
  366. )
  367. return e && n.test(e)
  368. }
  369. },
  370. m = e => !!((e && u(e)) || d(e) || f(e) || h(e) || g(e))
  371. r.default = e =>
  372. !!((e && u(e)) || l(e) || i(e) || d(e) || f(e) || h(e) || g(e))
  373. },
  374. ])
  375. },
  376. 938: () => {},
  377. },
  378. __webpack_module_cache__ = {}
  379. function __webpack_require__(moduleId) {
  380. var cachedModule = __webpack_module_cache__[moduleId]
  381. if (void 0 !== cachedModule) return cachedModule.exports
  382. var module = (__webpack_module_cache__[moduleId] = { exports: {} })
  383. __webpack_modules__[moduleId](module, module.exports, __webpack_require__)
  384. return module.exports
  385. }
  386. __webpack_require__.n = module => {
  387. var getter =
  388. module && module.__esModule ? () => module.default : () => module
  389. __webpack_require__.d(getter, { a: getter })
  390. return getter
  391. }
  392. __webpack_require__.d = (exports, definition) => {
  393. for (var key in definition)
  394. __webpack_require__.o(definition, key) &&
  395. !__webpack_require__.o(exports, key) &&
  396. Object.defineProperty(exports, key, {
  397. enumerable: !0,
  398. get: definition[key],
  399. })
  400. }
  401. __webpack_require__.o = (obj, prop) =>
  402. Object.prototype.hasOwnProperty.call(obj, prop)
  403. ;(() => {
  404. "use strict"
  405. const external_log_namespaceObject = log
  406. var external_log_default = __webpack_require__.n(
  407. external_log_namespaceObject
  408. )
  409. const lib = observer => value => {
  410. observer.next(value)
  411. }
  412. Promise.resolve(!1)
  413. Promise.resolve(!0)
  414. var PROMISE_RESOLVED_VOID = Promise.resolve()
  415. function sleep(time, resolveWith) {
  416. time || (time = 0)
  417. return new Promise(function (res) {
  418. return setTimeout(function () {
  419. return res(resolveWith)
  420. }, time)
  421. })
  422. }
  423. function randomToken() {
  424. return Math.random().toString(36).substring(2)
  425. }
  426. var lastMs = 0,
  427. additional = 0
  428. function microSeconds() {
  429. var ms = new Date().getTime()
  430. if (ms === lastMs) return 1e3 * ms + ++additional
  431. lastMs = ms
  432. additional = 0
  433. return 1e3 * ms
  434. }
  435. var isNode =
  436. "[object process]" ===
  437. Object.prototype.toString.call(
  438. "undefined" != typeof process ? process : 0
  439. )
  440. const methods_native = {
  441. create: function (channelName) {
  442. var state = {
  443. messagesCallback: null,
  444. bc: new BroadcastChannel(channelName),
  445. subFns: [],
  446. }
  447. state.bc.onmessage = function (msg) {
  448. state.messagesCallback && state.messagesCallback(msg.data)
  449. }
  450. return state
  451. },
  452. close: function (channelState) {
  453. channelState.bc.close()
  454. channelState.subFns = []
  455. },
  456. onMessage: function (channelState, fn) {
  457. channelState.messagesCallback = fn
  458. },
  459. postMessage: function (channelState, messageJson) {
  460. try {
  461. channelState.bc.postMessage(messageJson, !1)
  462. return PROMISE_RESOLVED_VOID
  463. } catch (err) {
  464. return Promise.reject(err)
  465. }
  466. },
  467. canBeUsed: function () {
  468. if (isNode && "undefined" == typeof window) return !1
  469. if ("function" == typeof BroadcastChannel) {
  470. if (BroadcastChannel._pubkey)
  471. throw new Error(
  472. "BroadcastChannel: Do not overwrite window.BroadcastChannel with this module, this is not a polyfill"
  473. )
  474. return !0
  475. }
  476. return !1
  477. },
  478. type: "native",
  479. averageResponseTime: function () {
  480. return 150
  481. },
  482. microSeconds,
  483. }
  484. var ObliviousSet = (function () {
  485. function ObliviousSet(ttl) {
  486. this.ttl = ttl
  487. this.map = new Map()
  488. this._to = !1
  489. }
  490. ObliviousSet.prototype.has = function (value) {
  491. return this.map.has(value)
  492. }
  493. ObliviousSet.prototype.add = function (value) {
  494. var _this = this
  495. this.map.set(value, now())
  496. if (!this._to) {
  497. this._to = !0
  498. setTimeout(function () {
  499. _this._to = !1
  500. !(function (obliviousSet) {
  501. for (
  502. var olderThen = now() - obliviousSet.ttl,
  503. iterator = obliviousSet.map[Symbol.iterator]();
  504. ;
  505.  
  506. ) {
  507. var next = iterator.next().value
  508. if (!next) return
  509. var value = next[0]
  510. if (!(next[1] < olderThen)) return
  511. obliviousSet.map.delete(value)
  512. }
  513. })(_this)
  514. }, 0)
  515. }
  516. }
  517. ObliviousSet.prototype.clear = function () {
  518. this.map.clear()
  519. }
  520. return ObliviousSet
  521. })()
  522. function now() {
  523. return new Date().getTime()
  524. }
  525. function options_fillOptionsWithDefaults() {
  526. var originalOptions =
  527. arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
  528. options = JSON.parse(JSON.stringify(originalOptions))
  529. void 0 === options.webWorkerSupport && (options.webWorkerSupport = !0)
  530. options.idb || (options.idb = {})
  531. options.idb.ttl || (options.idb.ttl = 45e3)
  532. options.idb.fallbackInterval || (options.idb.fallbackInterval = 150)
  533. originalOptions.idb &&
  534. "function" == typeof originalOptions.idb.onclose &&
  535. (options.idb.onclose = originalOptions.idb.onclose)
  536. options.localstorage || (options.localstorage = {})
  537. options.localstorage.removeTimeout ||
  538. (options.localstorage.removeTimeout = 6e4)
  539. originalOptions.methods && (options.methods = originalOptions.methods)
  540. options.node || (options.node = {})
  541. options.node.ttl || (options.node.ttl = 12e4)
  542. options.node.maxParallelWrites || (options.node.maxParallelWrites = 2048)
  543. void 0 === options.node.useFastPath && (options.node.useFastPath = !0)
  544. return options
  545. }
  546. var TRANSACTION_SETTINGS = { durability: "relaxed" }
  547. function getIdb() {
  548. if ("undefined" != typeof indexedDB) return indexedDB
  549. if ("undefined" != typeof window) {
  550. if (void 0 !== window.mozIndexedDB) return window.mozIndexedDB
  551. if (void 0 !== window.webkitIndexedDB) return window.webkitIndexedDB
  552. if (void 0 !== window.msIndexedDB) return window.msIndexedDB
  553. }
  554. return !1
  555. }
  556. function commitIndexedDBTransaction(tx) {
  557. tx.commit && tx.commit()
  558. }
  559. function _readLoop(state) {
  560. state.closed ||
  561. readNewMessages(state)
  562. .then(function () {
  563. return sleep(state.options.idb.fallbackInterval)
  564. })
  565. .then(function () {
  566. return _readLoop(state)
  567. })
  568. }
  569. function readNewMessages(state) {
  570. return state.closed
  571. ? PROMISE_RESOLVED_VOID
  572. : state.messagesCallback
  573. ? (function (db, lastCursorId) {
  574. var tx = db.transaction(
  575. "messages",
  576. "readonly",
  577. TRANSACTION_SETTINGS
  578. ),
  579. objectStore = tx.objectStore("messages"),
  580. ret = [],
  581. keyRangeValue = IDBKeyRange.bound(lastCursorId + 1, 1 / 0)
  582. if (objectStore.getAll) {
  583. var getAllRequest = objectStore.getAll(keyRangeValue)
  584. return new Promise(function (res, rej) {
  585. getAllRequest.onerror = function (err) {
  586. return rej(err)
  587. }
  588. getAllRequest.onsuccess = function (e) {
  589. res(e.target.result)
  590. }
  591. })
  592. }
  593. return new Promise(function (res, rej) {
  594. var openCursorRequest = (function () {
  595. try {
  596. keyRangeValue = IDBKeyRange.bound(lastCursorId + 1, 1 / 0)
  597. return objectStore.openCursor(keyRangeValue)
  598. } catch (e) {
  599. return objectStore.openCursor()
  600. }
  601. })()
  602. openCursorRequest.onerror = function (err) {
  603. return rej(err)
  604. }
  605. openCursorRequest.onsuccess = function (ev) {
  606. var cursor = ev.target.result
  607. if (cursor)
  608. if (cursor.value.id < lastCursorId + 1)
  609. cursor.continue(lastCursorId + 1)
  610. else {
  611. ret.push(cursor.value)
  612. cursor.continue()
  613. }
  614. else {
  615. commitIndexedDBTransaction(tx)
  616. res(ret)
  617. }
  618. }
  619. })
  620. })(state.db, state.lastCursorId).then(function (newerMessages) {
  621. var useMessages = newerMessages
  622. .filter(function (msgObj) {
  623. return !!msgObj
  624. })
  625. .map(function (msgObj) {
  626. msgObj.id > state.lastCursorId &&
  627. (state.lastCursorId = msgObj.id)
  628. return msgObj
  629. })
  630. .filter(function (msgObj) {
  631. return (function (msgObj, state) {
  632. return !(
  633. msgObj.uuid === state.uuid ||
  634. state.eMIs.has(msgObj.id) ||
  635. msgObj.data.time < state.messagesCallbackTime
  636. )
  637. })(msgObj, state)
  638. })
  639. .sort(function (msgObjA, msgObjB) {
  640. return msgObjA.time - msgObjB.time
  641. })
  642. useMessages.forEach(function (msgObj) {
  643. if (state.messagesCallback) {
  644. state.eMIs.add(msgObj.id)
  645. state.messagesCallback(msgObj.data)
  646. }
  647. })
  648. return PROMISE_RESOLVED_VOID
  649. })
  650. : PROMISE_RESOLVED_VOID
  651. }
  652. const indexed_db = {
  653. create: function (channelName, options) {
  654. options = options_fillOptionsWithDefaults(options)
  655. return (function (channelName) {
  656. var dbName = "pubkey.broadcast-channel-0-" + channelName,
  657. openRequest = getIdb().open(dbName)
  658. openRequest.onupgradeneeded = function (ev) {
  659. ev.target.result.createObjectStore("messages", {
  660. keyPath: "id",
  661. autoIncrement: !0,
  662. })
  663. }
  664. return new Promise(function (res, rej) {
  665. openRequest.onerror = function (ev) {
  666. return rej(ev)
  667. }
  668. openRequest.onsuccess = function () {
  669. res(openRequest.result)
  670. }
  671. })
  672. })(channelName).then(function (db) {
  673. var state = {
  674. closed: !1,
  675. lastCursorId: 0,
  676. channelName,
  677. options,
  678. uuid: randomToken(),
  679. eMIs: new ObliviousSet(2 * options.idb.ttl),
  680. writeBlockPromise: PROMISE_RESOLVED_VOID,
  681. messagesCallback: null,
  682. readQueuePromises: [],
  683. db,
  684. }
  685. db.onclose = function () {
  686. state.closed = !0
  687. options.idb.onclose && options.idb.onclose()
  688. }
  689. _readLoop(state)
  690. return state
  691. })
  692. },
  693. close: function (channelState) {
  694. channelState.closed = !0
  695. channelState.db.close()
  696. },
  697. onMessage: function (channelState, fn, time) {
  698. channelState.messagesCallbackTime = time
  699. channelState.messagesCallback = fn
  700. readNewMessages(channelState)
  701. },
  702. postMessage: function (channelState, messageJson) {
  703. channelState.writeBlockPromise = channelState.writeBlockPromise
  704. .then(function () {
  705. return (function (db, readerUuid, messageJson) {
  706. var writeObject = {
  707. uuid: readerUuid,
  708. time: new Date().getTime(),
  709. data: messageJson,
  710. },
  711. tx = db.transaction(
  712. ["messages"],
  713. "readwrite",
  714. TRANSACTION_SETTINGS
  715. )
  716. return new Promise(function (res, rej) {
  717. tx.oncomplete = function () {
  718. return res()
  719. }
  720. tx.onerror = function (ev) {
  721. return rej(ev)
  722. }
  723. tx.objectStore("messages").add(writeObject)
  724. commitIndexedDBTransaction(tx)
  725. })
  726. })(channelState.db, channelState.uuid, messageJson)
  727. })
  728. .then(function () {
  729. 0 === Math.floor(11 * Math.random() + 0) &&
  730. ((db = channelState.db),
  731. (ttl = channelState.options.idb.ttl),
  732. (function (db, ttl) {
  733. var olderThen = new Date().getTime() - ttl,
  734. tx = db.transaction(
  735. "messages",
  736. "readonly",
  737. TRANSACTION_SETTINGS
  738. ),
  739. objectStore = tx.objectStore("messages"),
  740. ret = []
  741. return new Promise(function (res) {
  742. objectStore.openCursor().onsuccess = function (ev) {
  743. var cursor = ev.target.result
  744. if (cursor) {
  745. var msgObk = cursor.value
  746. if (!(msgObk.time < olderThen)) {
  747. commitIndexedDBTransaction(tx)
  748. res(ret)
  749. return
  750. }
  751. ret.push(msgObk)
  752. cursor.continue()
  753. } else res(ret)
  754. }
  755. })
  756. })(db, ttl).then(function (tooOld) {
  757. return (function (db, ids) {
  758. var objectStore = db
  759. .transaction(
  760. ["messages"],
  761. "readwrite",
  762. TRANSACTION_SETTINGS
  763. )
  764. .objectStore("messages")
  765. return Promise.all(
  766. ids.map(function (id) {
  767. var deleteRequest = objectStore.delete(id)
  768. return new Promise(function (res) {
  769. deleteRequest.onsuccess = function () {
  770. return res()
  771. }
  772. })
  773. })
  774. )
  775. })(
  776. db,
  777. tooOld.map(function (msg) {
  778. return msg.id
  779. })
  780. )
  781. }))
  782. var db, ttl
  783. })
  784. return channelState.writeBlockPromise
  785. },
  786. canBeUsed: function () {
  787. return !isNode && !!getIdb()
  788. },
  789. type: "idb",
  790. averageResponseTime: function (options) {
  791. return 2 * options.idb.fallbackInterval
  792. },
  793. microSeconds,
  794. }
  795. function getLocalStorage() {
  796. var localStorage
  797. if ("undefined" == typeof window) return null
  798. try {
  799. localStorage = window.localStorage
  800. localStorage =
  801. window["ie8-eventlistener/storage"] || window.localStorage
  802. } catch (e) {}
  803. return localStorage
  804. }
  805. function storageKey(channelName) {
  806. return "pubkey.broadcastChannel-" + channelName
  807. }
  808. function localstorage_canBeUsed() {
  809. if (isNode) return !1
  810. var ls = getLocalStorage()
  811. if (!ls) return !1
  812. try {
  813. var key = "__broadcastchannel_check"
  814. ls.setItem(key, "works")
  815. ls.removeItem(key)
  816. } catch (e) {
  817. return !1
  818. }
  819. return !0
  820. }
  821. const localstorage = {
  822. create: function (channelName, options) {
  823. options = options_fillOptionsWithDefaults(options)
  824. if (!localstorage_canBeUsed())
  825. throw new Error("BroadcastChannel: localstorage cannot be used")
  826. var uuid = randomToken(),
  827. eMIs = new ObliviousSet(options.localstorage.removeTimeout),
  828. state = { channelName, uuid, eMIs }
  829. state.listener = (function (channelName, fn) {
  830. var key = storageKey(channelName),
  831. listener = function (ev) {
  832. ev.key === key &&
  833. (function (msgObj) {
  834. if (
  835. state.messagesCallback &&
  836. msgObj.uuid !== uuid &&
  837. msgObj.token &&
  838. !eMIs.has(msgObj.token) &&
  839. !(
  840. msgObj.data.time &&
  841. msgObj.data.time < state.messagesCallbackTime
  842. )
  843. ) {
  844. eMIs.add(msgObj.token)
  845. state.messagesCallback(msgObj.data)
  846. }
  847. })(JSON.parse(ev.newValue))
  848. }
  849. window.addEventListener("storage", listener)
  850. return listener
  851. })(channelName)
  852. return state
  853. },
  854. close: function (channelState) {
  855. ;(listener = channelState.listener),
  856. window.removeEventListener("storage", listener)
  857. var listener
  858. },
  859. onMessage: function (channelState, fn, time) {
  860. channelState.messagesCallbackTime = time
  861. channelState.messagesCallback = fn
  862. },
  863. postMessage: function (channelState, messageJson) {
  864. return new Promise(function (res) {
  865. sleep().then(function () {
  866. var key = storageKey(channelState.channelName),
  867. writeObj = {
  868. token: randomToken(),
  869. time: new Date().getTime(),
  870. data: messageJson,
  871. uuid: channelState.uuid,
  872. },
  873. value = JSON.stringify(writeObj)
  874. getLocalStorage().setItem(key, value)
  875. var ev = document.createEvent("Event")
  876. ev.initEvent("storage", !0, !0)
  877. ev.key = key
  878. ev.newValue = value
  879. window.dispatchEvent(ev)
  880. res()
  881. })
  882. })
  883. },
  884. canBeUsed: localstorage_canBeUsed,
  885. type: "localstorage",
  886. averageResponseTime: function () {
  887. var userAgent = navigator.userAgent.toLowerCase()
  888. return userAgent.includes("safari") && !userAgent.includes("chrome")
  889. ? 240
  890. : 120
  891. },
  892. microSeconds,
  893. }
  894. var simulate_microSeconds = microSeconds,
  895. SIMULATE_CHANNELS = new Set()
  896. const simulate = {
  897. create: function (channelName) {
  898. var state = { name: channelName, messagesCallback: null }
  899. SIMULATE_CHANNELS.add(state)
  900. return state
  901. },
  902. close: function (channelState) {
  903. SIMULATE_CHANNELS.delete(channelState)
  904. },
  905. onMessage: function (channelState, fn) {
  906. channelState.messagesCallback = fn
  907. },
  908. postMessage: function (channelState, messageJson) {
  909. return new Promise(function (res) {
  910. return setTimeout(function () {
  911. Array.from(SIMULATE_CHANNELS)
  912. .filter(function (channel) {
  913. return channel.name === channelState.name
  914. })
  915. .filter(function (channel) {
  916. return channel !== channelState
  917. })
  918. .filter(function (channel) {
  919. return !!channel.messagesCallback
  920. })
  921. .forEach(function (channel) {
  922. return channel.messagesCallback(messageJson)
  923. })
  924. res()
  925. }, 5)
  926. })
  927. },
  928. canBeUsed: function () {
  929. return !0
  930. },
  931. type: "simulate",
  932. averageResponseTime: function () {
  933. return 5
  934. },
  935. microSeconds: simulate_microSeconds,
  936. }
  937. var METHODS = [methods_native, indexed_db, localstorage],
  938. OPEN_BROADCAST_CHANNELS = new Set(),
  939. lastId = 0,
  940. broadcast_channel_BroadcastChannel = function (name, options) {
  941. this.id = lastId++
  942. OPEN_BROADCAST_CHANNELS.add(this)
  943. this.name = name
  944. this.options = options_fillOptionsWithDefaults(options)
  945. this.method = (function (options) {
  946. var chooseMethods = []
  947. .concat(options.methods, METHODS)
  948. .filter(Boolean)
  949. if (options.type) {
  950. if ("simulate" === options.type) return simulate
  951. var ret = chooseMethods.find(function (m) {
  952. return m.type === options.type
  953. })
  954. if (ret) return ret
  955. throw new Error("method-type " + options.type + " not found")
  956. }
  957. options.webWorkerSupport ||
  958. isNode ||
  959. (chooseMethods = chooseMethods.filter(function (m) {
  960. return "idb" !== m.type
  961. }))
  962. var useMethod = chooseMethods.find(function (method) {
  963. return method.canBeUsed()
  964. })
  965. if (useMethod) return useMethod
  966. throw new Error(
  967. "No useable method found in " +
  968. JSON.stringify(
  969. METHODS.map(function (m) {
  970. return m.type
  971. })
  972. )
  973. )
  974. })(this.options)
  975. this._iL = !1
  976. this._onML = null
  977. this._addEL = { message: [], internal: [] }
  978. this._uMP = new Set()
  979. this._befC = []
  980. this._prepP = null
  981. !(function (channel) {
  982. var obj,
  983. maybePromise = channel.method.create(channel.name, channel.options)
  984. if ((obj = maybePromise) && "function" == typeof obj.then) {
  985. channel._prepP = maybePromise
  986. maybePromise.then(function (s) {
  987. channel._state = s
  988. })
  989. } else channel._state = maybePromise
  990. })(this)
  991. }
  992. broadcast_channel_BroadcastChannel._pubkey = !0
  993. broadcast_channel_BroadcastChannel.prototype = {
  994. postMessage: function (msg) {
  995. if (this.closed)
  996. throw new Error(
  997. "BroadcastChannel.postMessage(): Cannot post message after channel has closed " +
  998. JSON.stringify(msg)
  999. )
  1000. return _post(this, "message", msg)
  1001. },
  1002. postInternal: function (msg) {
  1003. return _post(this, "internal", msg)
  1004. },
  1005. set onmessage(fn) {
  1006. var listenObj = { time: this.method.microSeconds(), fn }
  1007. _removeListenerObject(this, "message", this._onML)
  1008. if (fn && "function" == typeof fn) {
  1009. this._onML = listenObj
  1010. _addListenerObject(this, "message", listenObj)
  1011. } else this._onML = null
  1012. },
  1013. addEventListener: function (type, fn) {
  1014. _addListenerObject(this, type, { time: this.method.microSeconds(), fn })
  1015. },
  1016. removeEventListener: function (type, fn) {
  1017. _removeListenerObject(
  1018. this,
  1019. type,
  1020. this._addEL[type].find(function (obj) {
  1021. return obj.fn === fn
  1022. })
  1023. )
  1024. },
  1025. close: function () {
  1026. var _this = this
  1027. if (!this.closed) {
  1028. OPEN_BROADCAST_CHANNELS.delete(this)
  1029. this.closed = !0
  1030. var awaitPrepare = this._prepP ? this._prepP : PROMISE_RESOLVED_VOID
  1031. this._onML = null
  1032. this._addEL.message = []
  1033. return awaitPrepare
  1034. .then(function () {
  1035. return Promise.all(Array.from(_this._uMP))
  1036. })
  1037. .then(function () {
  1038. return Promise.all(
  1039. _this._befC.map(function (fn) {
  1040. return fn()
  1041. })
  1042. )
  1043. })
  1044. .then(function () {
  1045. return _this.method.close(_this._state)
  1046. })
  1047. }
  1048. },
  1049. get type() {
  1050. return this.method.type
  1051. },
  1052. get isClosed() {
  1053. return this.closed
  1054. },
  1055. }
  1056. function _post(broadcastChannel, type, msg) {
  1057. var msgObj = {
  1058. time: broadcastChannel.method.microSeconds(),
  1059. type,
  1060. data: msg,
  1061. }
  1062. return (
  1063. broadcastChannel._prepP
  1064. ? broadcastChannel._prepP
  1065. : PROMISE_RESOLVED_VOID
  1066. ).then(function () {
  1067. var sendPromise = broadcastChannel.method.postMessage(
  1068. broadcastChannel._state,
  1069. msgObj
  1070. )
  1071. broadcastChannel._uMP.add(sendPromise)
  1072. sendPromise.catch().then(function () {
  1073. return broadcastChannel._uMP.delete(sendPromise)
  1074. })
  1075. return sendPromise
  1076. })
  1077. }
  1078. function _hasMessageListeners(channel) {
  1079. return (
  1080. channel._addEL.message.length > 0 || channel._addEL.internal.length > 0
  1081. )
  1082. }
  1083. function _addListenerObject(channel, type, obj) {
  1084. channel._addEL[type].push(obj)
  1085. !(function (channel) {
  1086. if (!channel._iL && _hasMessageListeners(channel)) {
  1087. var listenerFn = function (msgObj) {
  1088. channel._addEL[msgObj.type].forEach(function (listenerObject) {
  1089. var minMessageTime = listenerObject.time - 1e5
  1090. msgObj.time >= minMessageTime && listenerObject.fn(msgObj.data)
  1091. })
  1092. },
  1093. time = channel.method.microSeconds()
  1094. if (channel._prepP)
  1095. channel._prepP.then(function () {
  1096. channel._iL = !0
  1097. channel.method.onMessage(channel._state, listenerFn, time)
  1098. })
  1099. else {
  1100. channel._iL = !0
  1101. channel.method.onMessage(channel._state, listenerFn, time)
  1102. }
  1103. }
  1104. })(channel)
  1105. }
  1106. function _removeListenerObject(channel, type, obj) {
  1107. channel._addEL[type] = channel._addEL[type].filter(function (o) {
  1108. return o !== obj
  1109. })
  1110. !(function (channel) {
  1111. if (channel._iL && !_hasMessageListeners(channel)) {
  1112. channel._iL = !1
  1113. var time = channel.method.microSeconds()
  1114. channel.method.onMessage(channel._state, null, time)
  1115. }
  1116. })(channel)
  1117. }
  1118. var browser = __webpack_require__(661),
  1119. browser_default = __webpack_require__.n(browser)
  1120. const es_browser = {
  1121. add: function (fn) {
  1122. if (
  1123. "function" == typeof WorkerGlobalScope &&
  1124. self instanceof WorkerGlobalScope
  1125. );
  1126. else {
  1127. if ("function" != typeof window.addEventListener) return
  1128. window.addEventListener(
  1129. "beforeunload",
  1130. function () {
  1131. fn()
  1132. },
  1133. !0
  1134. )
  1135. window.addEventListener(
  1136. "unload",
  1137. function () {
  1138. fn()
  1139. },
  1140. !0
  1141. )
  1142. }
  1143. },
  1144. }
  1145. var node_ignored_ = __webpack_require__(938),
  1146. node_ignored_default = __webpack_require__.n(node_ignored_)
  1147. browser_default() && node_ignored_default(), new Set()
  1148. const external_DeepDiff_namespaceObject = DeepDiff
  1149. var fast_deep_equal = __webpack_require__(204),
  1150. fast_deep_equal_default = __webpack_require__.n(fast_deep_equal),
  1151. apply = function (a) {
  1152. return function (f) {
  1153. return f(a)
  1154. }
  1155. }
  1156. function function_identity(a) {
  1157. return a
  1158. }
  1159. function constant(a) {
  1160. return function () {
  1161. return a
  1162. }
  1163. }
  1164. var constNull = constant(null),
  1165. constUndefined = constant(void 0)
  1166. function function_flow(ab, bc, cd, de, ef, fg, gh, hi, ij) {
  1167. switch (arguments.length) {
  1168. case 1:
  1169. return ab
  1170. case 2:
  1171. return function () {
  1172. return bc(ab.apply(this, arguments))
  1173. }
  1174. case 3:
  1175. return function () {
  1176. return cd(bc(ab.apply(this, arguments)))
  1177. }
  1178. case 4:
  1179. return function () {
  1180. return de(cd(bc(ab.apply(this, arguments))))
  1181. }
  1182. case 5:
  1183. return function () {
  1184. return ef(de(cd(bc(ab.apply(this, arguments)))))
  1185. }
  1186. case 6:
  1187. return function () {
  1188. return fg(ef(de(cd(bc(ab.apply(this, arguments))))))
  1189. }
  1190. case 7:
  1191. return function () {
  1192. return gh(fg(ef(de(cd(bc(ab.apply(this, arguments)))))))
  1193. }
  1194. case 8:
  1195. return function () {
  1196. return hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments))))))))
  1197. }
  1198. case 9:
  1199. return function () {
  1200. return ij(hi(gh(fg(ef(de(cd(bc(ab.apply(this, arguments)))))))))
  1201. }
  1202. }
  1203. }
  1204. function function_pipe(a, ab, bc, cd, de, ef, fg, gh, hi) {
  1205. switch (arguments.length) {
  1206. case 1:
  1207. return a
  1208. case 2:
  1209. return ab(a)
  1210. case 3:
  1211. return bc(ab(a))
  1212. case 4:
  1213. return cd(bc(ab(a)))
  1214. case 5:
  1215. return de(cd(bc(ab(a))))
  1216. case 6:
  1217. return ef(de(cd(bc(ab(a)))))
  1218. case 7:
  1219. return fg(ef(de(cd(bc(ab(a))))))
  1220. case 8:
  1221. return gh(fg(ef(de(cd(bc(ab(a)))))))
  1222. case 9:
  1223. return hi(gh(fg(ef(de(cd(bc(ab(a))))))))
  1224. default:
  1225. for (var ret = arguments[0], i = 1; i < arguments.length; i++)
  1226. ret = arguments[i](ret)
  1227. return ret
  1228. }
  1229. }
  1230. var eqStrict = {
  1231. equals: function (a, b) {
  1232. return a === b
  1233. },
  1234. }
  1235. function apSecond(A) {
  1236. return function (second) {
  1237. return function (first) {
  1238. return A.ap(
  1239. A.map(first, function () {
  1240. return function (b) {
  1241. return b
  1242. }
  1243. }),
  1244. second
  1245. )
  1246. }
  1247. }
  1248. }
  1249. function apS(F) {
  1250. return function (name, fb) {
  1251. return function (fa) {
  1252. return F.ap(
  1253. F.map(fa, function (a) {
  1254. return function (b) {
  1255. var _a
  1256. return Object.assign({}, a, (((_a = {})[name] = b), _a))
  1257. }
  1258. }),
  1259. fb
  1260. )
  1261. }
  1262. }
  1263. }
  1264. function chainFirst(M) {
  1265. return function (f) {
  1266. return function (first) {
  1267. return M.chain(first, function (a) {
  1268. return M.map(f(a), function () {
  1269. return a
  1270. })
  1271. })
  1272. }
  1273. }
  1274. }
  1275. function bind(M) {
  1276. return function (name, f) {
  1277. return function (ma) {
  1278. return M.chain(ma, function (a) {
  1279. return M.map(f(a), function (b) {
  1280. var _a
  1281. return Object.assign({}, a, (((_a = {})[name] = b), _a))
  1282. })
  1283. })
  1284. }
  1285. }
  1286. }
  1287. function bindTo(F) {
  1288. return function (name) {
  1289. return function (fa) {
  1290. return F.map(fa, function (a) {
  1291. var _a
  1292. return ((_a = {})[name] = a), _a
  1293. })
  1294. }
  1295. }
  1296. }
  1297. function let_(F) {
  1298. return function (name, f) {
  1299. return function (fa) {
  1300. return F.map(fa, function (a) {
  1301. var _a
  1302. return Object.assign({}, a, (((_a = {})[name] = f(a)), _a))
  1303. })
  1304. }
  1305. }
  1306. }
  1307. var isSome = function (fa) {
  1308. return "Some" === fa._tag
  1309. },
  1310. none = { _tag: "None" },
  1311. some = function (a) {
  1312. return { _tag: "Some", value: a }
  1313. },
  1314. isNonEmpty = function (as) {
  1315. return as.length > 0
  1316. },
  1317. head = function (as) {
  1318. return as[0]
  1319. },
  1320. emptyReadonlyArray = [],
  1321. _map =
  1322. (Object.prototype.hasOwnProperty,
  1323. function (ma, f) {
  1324. return function () {
  1325. return f(ma())
  1326. }
  1327. }),
  1328. _ap = function (mab, ma) {
  1329. return function () {
  1330. return mab()(ma())
  1331. }
  1332. },
  1333. _chain = function (ma, f) {
  1334. return function () {
  1335. return f(ma())()
  1336. }
  1337. },
  1338. IO_map = function (f) {
  1339. return function (fa) {
  1340. return _map(fa, f)
  1341. }
  1342. },
  1343. of = constant,
  1344. chain = function (f) {
  1345. return function (ma) {
  1346. return _chain(ma, f)
  1347. }
  1348. },
  1349. Functor = { URI: "IO", map: _map },
  1350. Pointed = { URI: "IO", of },
  1351. Apply = { URI: "IO", map: _map, ap: _ap },
  1352. IO_apSecond = apSecond(Apply),
  1353. Chain = { URI: "IO", map: _map, ap: _ap, chain: _chain },
  1354. Monad = { URI: "IO", map: _map, ap: _ap, of, chain: _chain },
  1355. IO_chainFirst = chainFirst(Chain),
  1356. IO_bindTo = bindTo(Functor),
  1357. IO_bind = bind(Chain),
  1358. IO_apS = apS(Apply),
  1359. ApT = of(emptyReadonlyArray),
  1360. traverseArray = function (f) {
  1361. return (function (f) {
  1362. var g = (function (f) {
  1363. return function (as) {
  1364. return function () {
  1365. for (var out = [f(0, head(as))()], i = 1; i < as.length; i++)
  1366. out.push(f(i, as[i])())
  1367. return out
  1368. }
  1369. }
  1370. })(f)
  1371. return function (as) {
  1372. return isNonEmpty(as) ? g(as) : ApT
  1373. }
  1374. })(function (_, a) {
  1375. return f(a)
  1376. })
  1377. },
  1378. sequenceArray = traverseArray(function_identity),
  1379. Predicate_not = function (predicate) {
  1380. return function (a) {
  1381. return !predicate(a)
  1382. }
  1383. },
  1384. Separated_separated = function (left, right) {
  1385. return { left, right }
  1386. },
  1387. Option_none = none,
  1388. Option_some = some
  1389. function fromPredicate(predicate) {
  1390. return function (a) {
  1391. return predicate(a) ? Option_some(a) : Option_none
  1392. }
  1393. }
  1394. var Option_map = function (fa, f) {
  1395. return function_pipe(fa, es6_Option_map(f))
  1396. },
  1397. Option_ap = function (fab, fa) {
  1398. return function_pipe(fab, es6_Option_ap(fa))
  1399. },
  1400. _filter = function (fa, predicate) {
  1401. return function_pipe(fa, filter(predicate))
  1402. },
  1403. es6_Option_map = function (f) {
  1404. return function (fa) {
  1405. return Option_isNone(fa) ? Option_none : Option_some(f(fa.value))
  1406. }
  1407. },
  1408. Option_Functor = { URI: "Option", map: Option_map },
  1409. Option_of = Option_some,
  1410. es6_Option_ap = function (fa) {
  1411. return function (fab) {
  1412. return Option_isNone(fab) || Option_isNone(fa)
  1413. ? Option_none
  1414. : Option_some(fab.value(fa.value))
  1415. }
  1416. },
  1417. Option_Apply = { URI: "Option", map: Option_map, ap: Option_ap },
  1418. es6_Option_chain = function (f) {
  1419. return function (ma) {
  1420. return Option_isNone(ma) ? Option_none : f(ma.value)
  1421. }
  1422. },
  1423. Option_Chain = {
  1424. URI: "Option",
  1425. map: Option_map,
  1426. ap: Option_ap,
  1427. chain: function (ma, f) {
  1428. return function_pipe(ma, es6_Option_chain(f))
  1429. },
  1430. },
  1431. alt = function (that) {
  1432. return function (fa) {
  1433. return Option_isNone(fa) ? that() : fa
  1434. }
  1435. },
  1436. Option_compact = es6_Option_chain(function_identity),
  1437. defaultSeparated = Separated_separated(Option_none, Option_none),
  1438. Option_separate = function (ma) {
  1439. return Option_isNone(ma)
  1440. ? defaultSeparated
  1441. : Separated_separated(
  1442. (function (ma) {
  1443. return "Right" === ma._tag ? Option_none : Option_some(ma.left)
  1444. })(ma.value),
  1445. (function (ma) {
  1446. return "Left" === ma._tag ? Option_none : Option_some(ma.right)
  1447. })(ma.value)
  1448. )
  1449. },
  1450. filter = function (predicate) {
  1451. return function (fa) {
  1452. return Option_isNone(fa)
  1453. ? Option_none
  1454. : predicate(fa.value)
  1455. ? fa
  1456. : Option_none
  1457. }
  1458. },
  1459. filterMap = function (f) {
  1460. return function (fa) {
  1461. return Option_isNone(fa) ? Option_none : f(fa.value)
  1462. }
  1463. },
  1464. partition = function (predicate) {
  1465. return function (fa) {
  1466. return Separated_separated(
  1467. _filter(fa, Predicate_not(predicate)),
  1468. _filter(fa, predicate)
  1469. )
  1470. }
  1471. },
  1472. partitionMap = function (f) {
  1473. return function_flow(es6_Option_map(f), Option_separate)
  1474. },
  1475. Filterable = {
  1476. URI: "Option",
  1477. map: Option_map,
  1478. compact: Option_compact,
  1479. separate: Option_separate,
  1480. filter: _filter,
  1481. filterMap: function (fa, f) {
  1482. return function_pipe(fa, filterMap(f))
  1483. },
  1484. partition: function (fa, predicate) {
  1485. return function_pipe(fa, partition(predicate))
  1486. },
  1487. partitionMap: function (fa, f) {
  1488. return function_pipe(fa, partitionMap(f))
  1489. },
  1490. },
  1491. Option_isSome = isSome,
  1492. Option_isNone = function (fa) {
  1493. return "None" === fa._tag
  1494. },
  1495. match = function (onNone, onSome) {
  1496. return function (ma) {
  1497. return Option_isNone(ma) ? onNone() : onSome(ma.value)
  1498. }
  1499. },
  1500. getOrElseW = function (onNone) {
  1501. return function (ma) {
  1502. return Option_isNone(ma) ? onNone() : ma.value
  1503. }
  1504. },
  1505. getOrElse = getOrElseW,
  1506. fromNullable = function (a) {
  1507. return null == a ? Option_none : Option_some(a)
  1508. },
  1509. chainNullableK = function (f) {
  1510. return function (ma) {
  1511. return Option_isNone(ma) ? Option_none : fromNullable(f(ma.value))
  1512. }
  1513. },
  1514. toNullable = match(constNull, function_identity),
  1515. toUndefined = match(constUndefined, function_identity),
  1516. Option_bind = bind(Option_Chain),
  1517. Option_ApT = Option_of(emptyReadonlyArray),
  1518. Option_traverseArray = function (f) {
  1519. return (function (f) {
  1520. var g = (function (f) {
  1521. return function (as) {
  1522. var o = f(0, head(as))
  1523. if (Option_isNone(o)) return Option_none
  1524. for (var out = [o.value], i = 1; i < as.length; i++) {
  1525. var o_1 = f(i, as[i])
  1526. if (Option_isNone(o_1)) return Option_none
  1527. out.push(o_1.value)
  1528. }
  1529. return Option_some(out)
  1530. }
  1531. })(f)
  1532. return function (as) {
  1533. return isNonEmpty(as) ? g(as) : Option_ApT
  1534. }
  1535. })(function (_, a) {
  1536. return f(a)
  1537. })
  1538. },
  1539. Option_sequenceArray = Option_traverseArray(function_identity)
  1540. function Filterable_filter(F, G) {
  1541. return function (predicate) {
  1542. return function (fga) {
  1543. return F.map(fga, function (ga) {
  1544. return G.filter(ga, predicate)
  1545. })
  1546. }
  1547. }
  1548. }
  1549. function chainIOK(F, M) {
  1550. return function (f) {
  1551. var g = function_flow(f, F.fromIO)
  1552. return function (first) {
  1553. return M.chain(first, g)
  1554. }
  1555. }
  1556. }
  1557. function chainFirstIOK(F, M) {
  1558. var chainFirstM = chainFirst(M)
  1559. return function (f) {
  1560. return chainFirstM(function_flow(f, F.fromIO))
  1561. }
  1562. }
  1563. function OptionT_some(F) {
  1564. return function_flow(Option_some, F.of)
  1565. }
  1566. function fromF(F) {
  1567. return function (ma) {
  1568. return F.map(ma, Option_some)
  1569. }
  1570. }
  1571. function chainOptionK(M) {
  1572. var F,
  1573. chainM = OptionT_chain(M),
  1574. fromOptionKM =
  1575. ((F = M),
  1576. function (f) {
  1577. return function_flow(f, F.of)
  1578. })
  1579. return function (f) {
  1580. return chainM(fromOptionKM(f))
  1581. }
  1582. }
  1583. function OptionT_map(F) {
  1584. return (function (F, G) {
  1585. return function (f) {
  1586. return function (fa) {
  1587. return F.map(fa, function (ga) {
  1588. return G.map(ga, f)
  1589. })
  1590. }
  1591. }
  1592. })(F, Option_Functor)
  1593. }
  1594. function OptionT_ap(F) {
  1595. return (function (F, G) {
  1596. return function (fa) {
  1597. return function (fab) {
  1598. return F.ap(
  1599. F.map(fab, function (gab) {
  1600. return function (ga) {
  1601. return G.ap(gab, ga)
  1602. }
  1603. }),
  1604. fa
  1605. )
  1606. }
  1607. }
  1608. })(F, Option_Apply)
  1609. }
  1610. function OptionT_chain(M) {
  1611. var zeroM = constant(M.of(Option_none))
  1612. return function (f) {
  1613. return function (ma) {
  1614. return M.chain(
  1615. ma,
  1616. match(function () {
  1617. return zeroM()
  1618. }, f)
  1619. )
  1620. }
  1621. }
  1622. }
  1623. function OptionT_alt(M) {
  1624. var _some = OptionT_some(M)
  1625. return function (second) {
  1626. return function (first) {
  1627. return M.chain(first, match(second, _some))
  1628. }
  1629. }
  1630. }
  1631. var IOOption_some = OptionT_some(Pointed),
  1632. fromOption = of,
  1633. IOOption_fromIO = fromF(Functor),
  1634. IOOption_chainOptionK =
  1635. (IO_map(toUndefined), IO_map(toNullable), chainOptionK(Monad)),
  1636. IOOption_map = OptionT_map(Functor),
  1637. IOOption_ap = OptionT_ap(Apply),
  1638. IOOption_of = IOOption_some,
  1639. IOOption_chain = OptionT_chain(Monad),
  1640. IOOption_alt = OptionT_alt(Monad),
  1641. IOOption_filter = Filterable_filter(Functor, Filterable),
  1642. IOOption_Chain = {
  1643. URI: "IOOption",
  1644. map: function (fa, f) {
  1645. return function_pipe(fa, IOOption_map(f))
  1646. },
  1647. ap: function (fab, fa) {
  1648. return function_pipe(fab, IOOption_ap(fa))
  1649. },
  1650. chain: function (ma, f) {
  1651. return function_pipe(ma, IOOption_chain(f))
  1652. },
  1653. },
  1654. IOOption_FromIO = { URI: "IOOption", fromIO: IOOption_fromIO },
  1655. IOOption_chainIOK = chainIOK(IOOption_FromIO, IOOption_Chain),
  1656. IOOption_chainFirstIOK = chainFirstIOK(IOOption_FromIO, IOOption_Chain),
  1657. es6_Reader_map = function (f) {
  1658. return function (fa) {
  1659. return function (r) {
  1660. return f(fa(r))
  1661. }
  1662. }
  1663. },
  1664. Reader_ApT = constant(emptyReadonlyArray),
  1665. Reader_traverseArray = function (f) {
  1666. return (function (f) {
  1667. var g = (function (f) {
  1668. return function (as) {
  1669. return function (r) {
  1670. for (var out = [f(0, head(as))(r)], i = 1; i < as.length; i++)
  1671. out.push(f(i, as[i])(r))
  1672. return out
  1673. }
  1674. }
  1675. })(f)
  1676. return function (as) {
  1677. return isNonEmpty(as) ? g(as) : Reader_ApT
  1678. }
  1679. })(function (_, a) {
  1680. return f(a)
  1681. })
  1682. },
  1683. Reader_sequenceArray = Reader_traverseArray(function_identity),
  1684. ReadonlyNonEmptyArray_spreadArray = function (to, from, pack) {
  1685. if (pack || 2 === arguments.length)
  1686. for (var ar, i = 0, l = from.length; i < l; i++)
  1687. if (ar || !(i in from)) {
  1688. ar || (ar = Array.prototype.slice.call(from, 0, i))
  1689. ar[i] = from[i]
  1690. }
  1691. return to.concat(ar || Array.prototype.slice.call(from))
  1692. },
  1693. ReadonlyNonEmptyArray_empty = emptyReadonlyArray,
  1694. ReadonlyNonEmptyArray_isNonEmpty = isNonEmpty,
  1695. ReadonlyNonEmptyArray_head = head,
  1696. ReadonlyNonEmptyArray_tail = function (as) {
  1697. return as.slice(1)
  1698. },
  1699. ReadonlyArray_isNonEmpty = ReadonlyNonEmptyArray_isNonEmpty,
  1700. ReadonlyArray_append = function (end) {
  1701. return function (init) {
  1702. return ReadonlyNonEmptyArray_spreadArray(
  1703. ReadonlyNonEmptyArray_spreadArray([], init, !0),
  1704. [end],
  1705. !1
  1706. )
  1707. }
  1708. },
  1709. ReadonlyArray_makeBy = function (n, f) {
  1710. return n <= 0
  1711. ? ReadonlyArray_empty
  1712. : (function (f) {
  1713. return function (n) {
  1714. for (
  1715. var j = Math.max(0, Math.floor(n)), out = [f(0)], i = 1;
  1716. i < j;
  1717. i++
  1718. )
  1719. out.push(f(i))
  1720. return out
  1721. }
  1722. })(f)(n)
  1723. },
  1724. ReadonlyArray_isOutOfBound = function (i, as) {
  1725. return i < 0 || i >= as.length
  1726. },
  1727. ReadonlyArray_head = function (as) {
  1728. return ReadonlyArray_isNonEmpty(as)
  1729. ? some(ReadonlyNonEmptyArray_head(as))
  1730. : none
  1731. },
  1732. findIndex = function (predicate) {
  1733. return function (as) {
  1734. for (var i = 0; i < as.length; i++)
  1735. if (predicate(as[i])) return some(i)
  1736. return none
  1737. }
  1738. },
  1739. ReadonlyArray_reverse = function (as) {
  1740. return as.length <= 1 ? as : as.slice().reverse()
  1741. },
  1742. ReadonlyArray_of = function (a) {
  1743. return [a]
  1744. },
  1745. es6_ReadonlyArray_chain = function (f) {
  1746. return function (ma) {
  1747. return function_pipe(
  1748. ma,
  1749. (function (f) {
  1750. return function (as) {
  1751. if (
  1752. (function (as) {
  1753. return 0 === as.length
  1754. })(as)
  1755. )
  1756. return ReadonlyArray_empty
  1757. for (var out = [], i = 0; i < as.length; i++)
  1758. out.push.apply(out, f(0, as[i]))
  1759. return out
  1760. }
  1761. })(function (_, a) {
  1762. return f(a)
  1763. })
  1764. )
  1765. }
  1766. },
  1767. es6_ReadonlyArray_map = function (f) {
  1768. return function (fa) {
  1769. return fa.map(function (a) {
  1770. return f(a)
  1771. })
  1772. }
  1773. },
  1774. es6_ReadonlyArray_mapWithIndex = function (f) {
  1775. return function (fa) {
  1776. return fa.map(function (a, i) {
  1777. return f(i, a)
  1778. })
  1779. }
  1780. },
  1781. es6_ReadonlyArray_filter = function (predicate) {
  1782. return function (as) {
  1783. return as.filter(predicate)
  1784. }
  1785. },
  1786. es6_ReadonlyArray_filterMap = function (f) {
  1787. return (function (f) {
  1788. return function (fa) {
  1789. for (var out = [], i = 0; i < fa.length; i++) {
  1790. var optionB = f(i, fa[i])
  1791. isSome(optionB) && out.push(optionB.value)
  1792. }
  1793. return out
  1794. }
  1795. })(function (_, a) {
  1796. return f(a)
  1797. })
  1798. },
  1799. ReadonlyArray_compact = es6_ReadonlyArray_filterMap(function_identity),
  1800. es6_ReadonlyArray_reduce = function (b, f) {
  1801. return es6_ReadonlyArray_reduceWithIndex(b, function (_, b, a) {
  1802. return f(b, a)
  1803. })
  1804. },
  1805. es6_ReadonlyArray_reduceWithIndex = function (b, f) {
  1806. return function (fa) {
  1807. for (var len = fa.length, out = b, i = 0; i < len; i++)
  1808. out = f(i, out, fa[i])
  1809. return out
  1810. }
  1811. },
  1812. toArray = function (as) {
  1813. return as.slice()
  1814. },
  1815. ReadonlyArray_empty = ReadonlyNonEmptyArray_empty
  1816. function every(predicate) {
  1817. return function (as) {
  1818. return as.every(predicate)
  1819. }
  1820. }
  1821. var ReadonlyArray_some = function (predicate) {
  1822. return function (as) {
  1823. return as.some(predicate)
  1824. }
  1825. },
  1826. ReadonlyArray_bindTo = bindTo({
  1827. URI: "ReadonlyArray",
  1828. map: function (fa, f) {
  1829. return function_pipe(fa, es6_ReadonlyArray_map(f))
  1830. },
  1831. }),
  1832. Task_fromIO = function (ma) {
  1833. return function () {
  1834. return Promise.resolve().then(ma)
  1835. }
  1836. },
  1837. Task_map = function (fa, f) {
  1838. return function_pipe(fa, es6_Task_map(f))
  1839. },
  1840. _apPar = function (fab, fa) {
  1841. return function_pipe(fab, Task_ap(fa))
  1842. },
  1843. es6_Task_map = function (f) {
  1844. return function (fa) {
  1845. return function () {
  1846. return Promise.resolve().then(fa).then(f)
  1847. }
  1848. }
  1849. },
  1850. Task_ap = function (fa) {
  1851. return function (fab) {
  1852. return function () {
  1853. return Promise.all([
  1854. Promise.resolve().then(fab),
  1855. Promise.resolve().then(fa),
  1856. ]).then(function (_a) {
  1857. return (0, _a[0])(_a[1])
  1858. })
  1859. }
  1860. }
  1861. },
  1862. Task_of = function (a) {
  1863. return function () {
  1864. return Promise.resolve(a)
  1865. }
  1866. },
  1867. es6_Task_chain = function (f) {
  1868. return function (ma) {
  1869. return function () {
  1870. return Promise.resolve()
  1871. .then(ma)
  1872. .then(function (a) {
  1873. return f(a)()
  1874. })
  1875. }
  1876. }
  1877. },
  1878. Task_Functor = { URI: "Task", map: Task_map },
  1879. ApplyPar = { URI: "Task", map: Task_map, ap: _apPar },
  1880. Task_Chain = {
  1881. URI: "Task",
  1882. map: Task_map,
  1883. ap: _apPar,
  1884. chain: function (ma, f) {
  1885. return function_pipe(ma, es6_Task_chain(f))
  1886. },
  1887. },
  1888. Task_chainFirstIOK = chainFirstIOK(
  1889. { URI: "Task", fromIO: Task_fromIO },
  1890. Task_Chain
  1891. ),
  1892. Task_let_ = let_(Task_Functor),
  1893. Task_bind = bind(Task_Chain),
  1894. Task_apS = apS(ApplyPar)
  1895. const external_rxjs_namespaceObject = rxjs,
  1896. appendLog =
  1897. log =>
  1898. ([a, ...b]) =>
  1899. function_pipe(
  1900. [...log, `${a}${b.length > 0 ? ": " : ""}${b.join(", ")}`],
  1901. x => (x.length > 1e3 ? x.slice(0, 100) : x)
  1902. ),
  1903. consoleLog = (...[[a, ...b]]) =>
  1904. function_pipe(
  1905. () =>
  1906. external_log_default().info(
  1907. ...("string" == typeof a ? [`【FYC ${a}`] : ["【FYC】", a])
  1908. ),
  1909. IO_apSecond(
  1910. b.length > 0 ? () => external_log_default().info(...b) : () => {}
  1911. )
  1912. ),
  1913. createChatScreen = function_pipe(
  1914. () => document.createElement("div"),
  1915. IO_chainFirst(
  1916. x => () =>
  1917. Object.assign(x.style, {
  1918. pointerEvents: "none",
  1919. zIndex: "30",
  1920. position: "absolute",
  1921. overflow: "hidden",
  1922. height: "100%",
  1923. width: "100%",
  1924. })
  1925. )
  1926. ),
  1927. external_jsep_namespaceObject = jsep
  1928. var external_jsep_default = __webpack_require__.n(
  1929. external_jsep_namespaceObject
  1930. ),
  1931. u = {
  1932. "||": function (r, e) {
  1933. return r || e
  1934. },
  1935. "&&": function (r, e) {
  1936. return r && e
  1937. },
  1938. "|": function (r, e) {
  1939. return r | e
  1940. },
  1941. "^": function (r, e) {
  1942. return r ^ e
  1943. },
  1944. "&": function (r, e) {
  1945. return r & e
  1946. },
  1947. "==": function (r, e) {
  1948. return r == e
  1949. },
  1950. "!=": function (r, e) {
  1951. return r != e
  1952. },
  1953. "===": function (r, e) {
  1954. return r === e
  1955. },
  1956. "!==": function (r, e) {
  1957. return r !== e
  1958. },
  1959. "<": function (r, e) {
  1960. return r < e
  1961. },
  1962. ">": function (r, e) {
  1963. return r > e
  1964. },
  1965. "<=": function (r, e) {
  1966. return r <= e
  1967. },
  1968. ">=": function (r, e) {
  1969. return r >= e
  1970. },
  1971. "<<": function (r, e) {
  1972. return r << e
  1973. },
  1974. ">>": function (r, e) {
  1975. return r >> e
  1976. },
  1977. ">>>": function (r, e) {
  1978. return r >>> e
  1979. },
  1980. "+": function (r, e) {
  1981. return r + e
  1982. },
  1983. "-": function (r, e) {
  1984. return r - e
  1985. },
  1986. "*": function (r, e) {
  1987. return r * e
  1988. },
  1989. "/": function (r, e) {
  1990. return r / e
  1991. },
  1992. "%": function (r, e) {
  1993. return r % e
  1994. },
  1995. },
  1996. i = {
  1997. "-": function (r) {
  1998. return -r
  1999. },
  2000. "+": function (r) {
  2001. return +r
  2002. },
  2003. "~": function (r) {
  2004. return ~r
  2005. },
  2006. "!": function (r) {
  2007. return !r
  2008. },
  2009. }
  2010. function s(r, e) {
  2011. return r.map(function (r) {
  2012. return a(r, e)
  2013. })
  2014. }
  2015. function c(r, e) {
  2016. var n,
  2017. t = a(r.object, e)
  2018. if (
  2019. ((n = r.computed ? a(r.property, e) : r.property.name),
  2020. /^__proto__|prototype|constructor$/.test(n))
  2021. )
  2022. throw Error('Access to member "' + n + '" disallowed.')
  2023. return [t, t[n]]
  2024. }
  2025. function a(r, e) {
  2026. var n = r
  2027. switch (n.type) {
  2028. case "ArrayExpression":
  2029. return s(n.elements, e)
  2030. case "BinaryExpression":
  2031. return u[n.operator](a(n.left, e), a(n.right, e))
  2032. case "CallExpression":
  2033. var t, o, l
  2034. if (
  2035. ("MemberExpression" === n.callee.type
  2036. ? ((t = (l = c(n.callee, e))[0]), (o = l[1]))
  2037. : (o = a(n.callee, e)),
  2038. "function" != typeof o)
  2039. )
  2040. return
  2041. return o.apply(t, s(n.arguments, e))
  2042. case "ConditionalExpression":
  2043. return a(n.test, e) ? a(n.consequent, e) : a(n.alternate, e)
  2044. case "Identifier":
  2045. return e[n.name]
  2046. case "Literal":
  2047. return n.value
  2048. case "LogicalExpression":
  2049. return "||" === n.operator
  2050. ? a(n.left, e) || a(n.right, e)
  2051. : "&&" === n.operator
  2052. ? a(n.left, e) && a(n.right, e)
  2053. : u[n.operator](a(n.left, e), a(n.right, e))
  2054. case "MemberExpression":
  2055. return c(n, e)[1]
  2056. case "ThisExpression":
  2057. return e
  2058. case "UnaryExpression":
  2059. return i[n.operator](a(n.argument, e))
  2060. default:
  2061. return
  2062. }
  2063. }
  2064. const external_astring_namespaceObject = astring
  2065. var Eq = {
  2066. equals: function (first, second) {
  2067. return first === second
  2068. },
  2069. },
  2070. string_isEmpty = function (s) {
  2071. return 0 === s.length
  2072. },
  2073. split = function (separator) {
  2074. return function (s) {
  2075. var out = s.split(separator)
  2076. return ReadonlyNonEmptyArray_isNonEmpty(out) ? out : [s]
  2077. }
  2078. }
  2079. const fycKey = key => `FYC_${key}`,
  2080. languages = ["FYC_EN", "FYC_JA"],
  2081. stringsArgs = [
  2082. [],
  2083. function_flow(
  2084. split(/\r\n|\n/),
  2085. es6_ReadonlyArray_filter(Predicate_not(string_isEmpty))
  2086. ),
  2087. x => x.join("\n"),
  2088. ],
  2089. sc = (k, d) =>
  2090. (async (key, defaultVal) => ({
  2091. gmKey: key,
  2092. val: (await GM.getValue(key)) ?? defaultVal,
  2093. defaultVal,
  2094. toGm: function_identity,
  2095. }))(fycKey(k), d),
  2096. ic = (k, d, i, g) =>
  2097. (async (key, defaultVal, toItem, toGm) =>
  2098. function_pipe(
  2099. await GM.getValue(key),
  2100. x => (void 0 !== x ? toItem(x) : defaultVal),
  2101. x => ({ gmKey: key, val: x, defaultVal, toGm })
  2102. ))(fycKey(k), d, i, g),
  2103. defaultUserConfig = () =>
  2104. function_pipe(
  2105. async () => ({
  2106. lang: await ic(
  2107. "LANG",
  2108. "FYC_EN",
  2109. x => (languages.includes(x) ? x : "FYC_EN"),
  2110. x => x
  2111. ),
  2112. font: await sc("FONT", "MS PGothic"),
  2113. chatOpacity: await sc("OPACITY", 0.8),
  2114. color: await sc("COLOR", "#ffffff"),
  2115. ownerColor: await sc("COLOR_OWNER", "#ffd600"),
  2116. moderatorColor: await sc("COLOR_MODERATOR", "#c564ff"),
  2117. memberColor: await sc("COLOR_MEMBER", "#9fffff"),
  2118. fontSize: await sc("SIZE", 1),
  2119. fontWeight: await sc("WEIGHT", 730),
  2120. shadowFontWeight: await sc("WEIGHT_SHADOW", 1),
  2121. maxChatCount: await sc("LIMIT", 40),
  2122. flowSpeed: await sc("SPEED", 18),
  2123. maxChatLength: await sc("MAX", 100),
  2124. laneCount: await sc("LANE_DIV", 12),
  2125. bannedWords: await ic("NG_WORDS", ...stringsArgs),
  2126. bannedWordRegexs: await ic("NG_REG_WORDS", ...stringsArgs),
  2127. bannedUsers: await ic("NG_USERS", ...stringsArgs),
  2128. createChats: await sc("TOGGLE_CREATE_COMMENTS", !0),
  2129. noOverlap: await sc("NO_OVERLAP", !0),
  2130. createBanButton: await sc("NG_BUTTON", !0),
  2131. simplifyChatField: await sc("SIMPLE_CHAT_FIELD", !1),
  2132. displayModName: await sc("DISPLAY_MODERATOR_NAME", !0),
  2133. displaySuperChatAuthor: await sc("DISPLAY_SUPER_CHAT_AUTHOR", !0),
  2134. textOnly: await sc("TEXT_ONLY", !1),
  2135. timingFunction: await sc("TIMING_FUNCTION", "linear"),
  2136. displayChats: await sc("DISPLAY_COMMENTS", !0),
  2137. minSpacing: await sc("MIN_SPACING", 0.5),
  2138. fieldScale: await sc("FIELD_SCALE", 1),
  2139. flowY1: await sc("flowY1", 0),
  2140. flowY2: await sc("flowY2", 1),
  2141. flowX1: await sc("flowX1", 0),
  2142. flowX2: await sc("flowX2", 1),
  2143. shadowColor: await sc("shadowColor", "#000000"),
  2144. }),
  2145. Task_bind(
  2146. "filterExp",
  2147. x => () =>
  2148. ic(
  2149. "filterExp",
  2150. external_jsep_default()(
  2151. `\n or([\n RA.some(\n flip(flow([inText, RA.some]))(${JSON.stringify(
  2152. x.bannedWords.val
  2153. )})\n )(RA.compact([\n messageText,\n paymentInfo\n ])),\n RA.some(\n flip(flow([matchedByText, RA.some]))(${JSON.stringify(
  2154. x.bannedWordRegexs.val
  2155. )})\n )(RA.compact([\n messageText,\n paymentInfo\n ])),\n O.exists(\n flip(flow([eqText, RA.some]))(${JSON.stringify(
  2156. x.bannedUsers.val
  2157. )})\n )(authorID)\n ])\n `
  2158. ),
  2159. external_jsep_default(),
  2160. external_astring_namespaceObject.generate
  2161. )
  2162. )
  2163. )(),
  2164. chatApp = () =>
  2165. function_pipe(
  2166. fromNullable(document.querySelector("#chatframe")),
  2167. filter(x => {
  2168. const state = x.contentDocument?.readyState
  2169. return "loading" === state || "complete" === state
  2170. }),
  2171. chainNullableK(x => x.contentDocument),
  2172. alt(() => Option_of(document)),
  2173. chainNullableK(x => x.querySelector("yt-live-chat-app"))
  2174. ),
  2175. livePageYt = {
  2176. toggleChatBtnParent: () =>
  2177. fromNullable(document.querySelector(".ytp-right-controls")),
  2178. settingsToggleNextElement: () =>
  2179. function_pipe(
  2180. document.querySelector("#menu-container"),
  2181. fromNullable,
  2182. filter(x => null !== x.offsetParent),
  2183. chainNullableK(x =>
  2184. x.querySelector(".dropdown-trigger.ytd-menu-renderer")
  2185. ),
  2186. alt(() =>
  2187. fromNullable(
  2188. document.querySelector(
  2189. "#top-row .dropdown-trigger.ytd-menu-renderer"
  2190. )
  2191. )
  2192. )
  2193. ),
  2194. settingsContainer: () => fromNullable(document.body),
  2195. player: () => fromNullable(document.querySelector("#movie_player")),
  2196. video: () =>
  2197. fromNullable(
  2198. document.querySelector("video.video-stream.html5-main-video")
  2199. ),
  2200. chatField: () =>
  2201. function_pipe(
  2202. chatApp(),
  2203. chainNullableK(x =>
  2204. x.querySelector("#items.yt-live-chat-item-list-renderer")
  2205. )
  2206. ),
  2207. chatTicker: () =>
  2208. function_pipe(
  2209. chatApp(),
  2210. chainNullableK(x =>
  2211. x.querySelector("#items.yt-live-chat-ticker-renderer")
  2212. )
  2213. ),
  2214. chatScroller: () =>
  2215. function_pipe(
  2216. chatApp(),
  2217. chainNullableK(x =>
  2218. x.querySelector("#item-scroller.yt-live-chat-item-list-renderer")
  2219. )
  2220. ),
  2221. offlineSlate: () =>
  2222. fromNullable(document.querySelector(".ytp-offline-slate")),
  2223. },
  2224. mainCss = function_pipe(
  2225. () => document.createElement("style"),
  2226. IO_chainFirst(x => () => {
  2227. x.innerHTML =
  2228. ".fyc_chat {\n line-height: 1;\n z-index: 30;\n position: absolute;\n user-select: none;\n white-space: nowrap;\n will-change: transform;\n}\n.fyc_button {\n display: inline-block;\n border-style: none;\n z-index: 4;\n font-weight: 500;\n color: var(--yt-spec-text-secondary);\n}"
  2229. })
  2230. ),
  2231. observePair = con =>
  2232. function_pipe(
  2233. () => new external_rxjs_namespaceObject.Subject(),
  2234. IO_bindTo("subject"),
  2235. IO_bind("observer", x => () => new con(lib(x.subject)))
  2236. ),
  2237. banButton = function_pipe(
  2238. document.createElement("button"),
  2239. of,
  2240. IO_chainFirst(
  2241. x => () =>
  2242. x.classList.add("style-scope", "yt-icon-button", "fyc_button")
  2243. ),
  2244. IO_chainFirst(
  2245. x => () =>
  2246. Object.assign(x.style, {
  2247. padding: "0px",
  2248. width: "20px",
  2249. height: "20px",
  2250. fill: "#fff",
  2251. })
  2252. ),
  2253. IO_chainFirst(
  2254. x => () => x.setAttribute("aria-label", "NGに入れる(Ban this user)")
  2255. ),
  2256. IO_chainFirst(x => () => {
  2257. x.innerHTML =
  2258. '<svg class="style-scope yt-icon" style="width: 100%; height: 75%; fill: var(--yt-spec-text-secondary);" viewBox="0 0 512 512"><path d="M440 78A256 256 0 1 0 73 435 256 256 0 0 0 440 78zm-99 35L113 341C37 179 212 44 341 113zM177 405l228-228c76 162-99 297-228 228z" fill-rule="evenodd"/></svg>'
  2259. })
  2260. )(),
  2261. external_Swal_namespaceObject = Swal
  2262. var external_Swal_default = __webpack_require__.n(
  2263. external_Swal_namespaceObject
  2264. )
  2265. const addBanButton = (chat, id, getConfig, setConfig) =>
  2266. chat.children.namedItem("card")
  2267. ? () => {}
  2268. : function_pipe(
  2269. () => banButton.cloneNode(!0),
  2270. IO_chainFirst(clone => {
  2271. return function_pipe(
  2272. getConfig.bannedUsers,
  2273. IOOption_fromIO,
  2274. IOOption_filter(x => !x.includes(id)),
  2275. IOOption_map(
  2276. function_flow(
  2277. ((f = (function (E) {
  2278. return function (as) {
  2279. if (1 === as.length) return as
  2280. for (
  2281. var out = [ReadonlyNonEmptyArray_head(as)],
  2282. _loop_1 = function (a) {
  2283. out.every(function (o) {
  2284. return !E.equals(o, a)
  2285. }) && out.push(a)
  2286. },
  2287. _i = 0,
  2288. rest_1 = ReadonlyNonEmptyArray_tail(as);
  2289. _i < rest_1.length;
  2290. _i++
  2291. )
  2292. _loop_1(rest_1[_i])
  2293. return out
  2294. }
  2295. })(Eq)),
  2296. function (as) {
  2297. return ReadonlyArray_isNonEmpty(as) ? f(as) : as
  2298. }),
  2299. ReadonlyArray_append(id)
  2300. )
  2301. ),
  2302. IOOption_chainIOK(x =>
  2303. function_pipe(
  2304. setConfig.bannedUsers(x),
  2305. IO_apSecond(() =>
  2306. external_Swal_default()
  2307. .mixin({
  2308. toast: !0,
  2309. position: "bottom-left",
  2310. timer: 2500,
  2311. timerProgressBar: !0,
  2312. showConfirmButton: !1,
  2313. didOpen: toast => {
  2314. toast.addEventListener(
  2315. "pointerenter",
  2316. external_Swal_default().stopTimer
  2317. )
  2318. toast.addEventListener(
  2319. "pointerleave",
  2320. external_Swal_default().resumeTimer
  2321. )
  2322. },
  2323. })
  2324. .fire({
  2325. title: `Added Banned User: ${id}`,
  2326. icon: "success",
  2327. })
  2328. )
  2329. )
  2330. ),
  2331. IO_apSecond(() => {
  2332. chat.style.display = "none"
  2333. }),
  2334. x => () => {
  2335. clone.onclick = x
  2336. }
  2337. )
  2338. var f
  2339. }),
  2340. chain(
  2341. x => () => chat.querySelector("#content #message")?.append(x)
  2342. )
  2343. ),
  2344. getChatFontSize = mainState =>
  2345. Math.round(
  2346. ((Math.max(mainState.getConfig.fontSize() - 0.2, 0.01) *
  2347. mainState.playerRect.height) /
  2348. mainState.getConfig.laneCount()) *
  2349. (mainState.getConfig.flowY2() - mainState.getConfig.flowY1()) *
  2350. 100
  2351. ) / 100
  2352. var equalsDefault = function (compare) {
  2353. return function (first, second) {
  2354. return first === second || 0 === compare(first, second)
  2355. }
  2356. },
  2357. Ord_contramap = function (f) {
  2358. return function (fa) {
  2359. return {
  2360. equals: equalsDefault(
  2361. (compare = function (first, second) {
  2362. return fa.compare(f(first), f(second))
  2363. })
  2364. ),
  2365. compare: function (first, second) {
  2366. return first === second ? 0 : compare(first, second)
  2367. },
  2368. }
  2369. var compare
  2370. }
  2371. },
  2372. number_Ord = {
  2373. equals: function (first, second) {
  2374. return first === second
  2375. },
  2376. compare: function (first, second) {
  2377. return first < second ? -1 : first > second ? 1 : 0
  2378. },
  2379. },
  2380. number_Show_show = function (n) {
  2381. return JSON.stringify(n)
  2382. }
  2383. const external_window_micro_memoize_namespaceObject =
  2384. window["micro-memoize"]
  2385. var external_window_micro_memoize_default = __webpack_require__.n(
  2386. external_window_micro_memoize_namespaceObject
  2387. )
  2388. const getFlowChatProgress = chat =>
  2389. function_pipe(
  2390. chat.animation,
  2391. chainNullableK(x => x.currentTime),
  2392. getOrElse(() => 0),
  2393. x => x / chat.animationDuration
  2394. ),
  2395. getFlowChatRect = (chat, mainState) =>
  2396. function_pipe(
  2397. mainState.getConfig,
  2398. x =>
  2399. mainState.playerRect.width * x.flowX2() -
  2400. (chat.width +
  2401. mainState.playerRect.width * (x.flowX2() - x.flowX1())) *
  2402. getFlowChatProgress(chat),
  2403. x => new DOMRect(x, chat.y, chat.width, chat.height)
  2404. ),
  2405. getChatLane = (flowChat, progress, flowChats) => mainState => {
  2406. const flowWidth =
  2407. mainState.playerRect.width *
  2408. (mainState.getConfig.flowX2() - mainState.getConfig.flowX1()),
  2409. chatRect = getFlowChatRect(flowChat, mainState),
  2410. chatWidth = chatRect.width,
  2411. chatHeight = chatRect.height,
  2412. chatX = chatRect.x,
  2413. chatIndex = flowChats.indexOf(flowChat),
  2414. movingChats = function_pipe(
  2415. flowChats,
  2416. ((n = chatIndex >= 0 ? chatIndex : -1),
  2417. function (as) {
  2418. return ReadonlyArray_isOutOfBound(n, as)
  2419. ? as
  2420. : 0 === n
  2421. ? ReadonlyArray_empty
  2422. : as.slice(0, n)
  2423. }),
  2424. es6_ReadonlyArray_filter(
  2425. chat => !chat.animationEnded && chat.width > 0
  2426. ),
  2427. ((O = Ord_contramap(x => x.lane)(number_Ord)),
  2428. function (as) {
  2429. return as.length <= 1 ? as : as.slice().sort(O.compare)
  2430. })
  2431. ),
  2432. tooCloseTo = external_window_micro_memoize_default()(
  2433. i => {
  2434. const otherRect = getFlowChatRect(movingChats[i], mainState),
  2435. otherWidth = otherRect.width,
  2436. otherX = otherRect.x,
  2437. gap =
  2438. (chatHeight * otherWidth * chatWidth) ** 0.333 *
  2439. mainState.getConfig.minSpacing()
  2440. return (
  2441. (flowWidth - otherX) / (flowWidth + otherWidth) - progress <
  2442. (chatWidth + gap) / (flowWidth + chatWidth) ||
  2443. otherX + otherWidth + gap > chatX
  2444. )
  2445. },
  2446. { maxSize: 1e3 }
  2447. ),
  2448. occupyInfo = function_pipe(
  2449. movingChats,
  2450. es6_ReadonlyArray_mapWithIndex((i, x) => ({
  2451. tooClose: () => tooCloseTo(i),
  2452. lane: x.lane,
  2453. })),
  2454. ReadonlyArray_append({
  2455. tooClose: () => !0,
  2456. lane: mainState.getConfig.laneCount(),
  2457. })
  2458. ),
  2459. index = occupyInfo.findIndex(x => x.lane >= flowChat.lane),
  2460. rightFreeLane = function_pipe(
  2461. occupyInfo.slice(index),
  2462. ((predicate = x => x.tooClose()),
  2463. function (as) {
  2464. for (var i = 0; i < as.length; i++)
  2465. if (predicate(as[i])) return some(as[i])
  2466. return none
  2467. }),
  2468. es6_Option_map(x => x.lane),
  2469. getOrElse(() => mainState.getConfig.laneCount())
  2470. )
  2471. var O, n, predicate
  2472. const leftFreeLane = function_pipe(
  2473. occupyInfo.slice(0, index),
  2474. function (as) {
  2475. for (var i = as.length - 1; i >= 0; i--)
  2476. if (as[i].tooClose()) return some(as[i])
  2477. return none
  2478. },
  2479. es6_Option_map(x => x.lane),
  2480. getOrElse(() => -1)
  2481. ),
  2482. formerLaneInterval = Math.min(
  2483. flowChat.lane - leftFreeLane,
  2484. rightFreeLane - flowChat.lane,
  2485. 1
  2486. )
  2487. return function_pipe(
  2488. occupyInfo,
  2489. es6_ReadonlyArray_reduce(
  2490. { maxInterval: 0, maxIntervalLane: 0, lastLane: -1 },
  2491. ({ maxInterval, maxIntervalLane, lastLane }, info) =>
  2492. maxInterval > 0.999 || !info.tooClose()
  2493. ? { maxInterval, maxIntervalLane, lastLane }
  2494. : (() => {
  2495. const nextLane = info.lane,
  2496. interLane = Math.min(
  2497. Math.max((lastLane + nextLane) / 2, 0),
  2498. mainState.getConfig.laneCount() - 1
  2499. ),
  2500. newInterval = Math.min(
  2501. interLane - lastLane,
  2502. nextLane - interLane,
  2503. 1
  2504. )
  2505. return newInterval - maxInterval > 0.001
  2506. ? {
  2507. maxInterval: newInterval,
  2508. maxIntervalLane: Math.max(lastLane + newInterval, 0),
  2509. lastLane: nextLane,
  2510. }
  2511. : { maxInterval, maxIntervalLane, lastLane: nextLane }
  2512. })()
  2513. ),
  2514. x => ({
  2515. lane:
  2516. Math.abs(formerLaneInterval - x.maxInterval) < 0.001
  2517. ? flowChat.lane
  2518. : x.maxIntervalLane,
  2519. interval: x.maxInterval,
  2520. })
  2521. )
  2522. },
  2523. intervalTooSmall = interval => getConfig =>
  2524. getConfig.noOverlap() && interval < 0.999,
  2525. external_m_namespaceObject = m
  2526. var external_m_default = __webpack_require__.n(external_m_namespaceObject)
  2527. const textShadow = shadowColor =>
  2528. function_flow(
  2529. x => `${x}px`,
  2530. x => (a, b) => `${a}${x} ${b}${x} ${shadowColor}99`,
  2531. x => [x("-", "-"), x("", "-"), x("-", ""), x("", "")].join(", ")
  2532. ),
  2533. textStyle = { fontFamily: "inherit" },
  2534. renderChat = chat => mainState => () =>
  2535. external_m_default().render(
  2536. chat.element,
  2537. ((chat, mainState) => {
  2538. const { getConfig } = mainState,
  2539. data = chat.getData(getConfig)
  2540. return external_m_default()(
  2541. "span",
  2542. {
  2543. style: {
  2544. fontSize: `${getChatFontSize(mainState)}px`,
  2545. visibility: getConfig.displayChats() ? "visible" : "hidden",
  2546. color:
  2547. "owner" === data.authorType
  2548. ? getConfig.ownerColor()
  2549. : "moderator" === data.authorType
  2550. ? getConfig.moderatorColor()
  2551. : "member" === data.authorType
  2552. ? getConfig.memberColor()
  2553. : getConfig.color(),
  2554. fontWeight: getConfig.fontWeight().toString(),
  2555. fontFamily: getConfig.font(),
  2556. opacity: getConfig.chatOpacity().toString(),
  2557. textShadow: textShadow(getConfig.shadowColor())(
  2558. getConfig.shadowFontWeight()
  2559. ),
  2560. },
  2561. },
  2562. function_pipe(
  2563. [
  2564. function_pipe(
  2565. data.authorName,
  2566. filter(x => x.visible),
  2567. es6_Option_map(x =>
  2568. external_m_default()(
  2569. "span",
  2570. {
  2571. style: {
  2572. color: toUndefined(data.textColor),
  2573. fontSize: "0.84em",
  2574. ...textStyle,
  2575. },
  2576. },
  2577. `${x.content}: `
  2578. )
  2579. )
  2580. ),
  2581. function_pipe(
  2582. data.messageElement,
  2583. es6_Option_map(x =>
  2584. ((message, getConfig) => {
  2585. const eleWin =
  2586. message.ownerDocument.defaultView ?? window,
  2587. maxChatLength = getConfig.maxChatLength()
  2588. return function_pipe(
  2589. Array.from(message.childNodes),
  2590. es6_ReadonlyArray_reduce(
  2591. { vnodes: [], length: 0 },
  2592. ({ vnodes, length }, node) => {
  2593. return length >= maxChatLength
  2594. ? { vnodes, length }
  2595. : !getConfig.textOnly() &&
  2596. node instanceof eleWin.HTMLImageElement
  2597. ? {
  2598. vnodes: [
  2599. ...vnodes,
  2600. external_m_default()("img", {
  2601. style: {
  2602. height: "1em",
  2603. width: "1em",
  2604. verticalAlign: "text-top",
  2605. },
  2606. src: node.src,
  2607. alt: node.alt,
  2608. }),
  2609. ],
  2610. length: length + 1,
  2611. }
  2612. : function_pipe(
  2613. node.textContent ?? "",
  2614. ((end = maxChatLength),
  2615. function (s) {
  2616. return s.slice(0, end)
  2617. }),
  2618. x =>
  2619. node instanceof eleWin.HTMLAnchorElement
  2620. ? {
  2621. vnodes: [
  2622. ...vnodes,
  2623. external_m_default()(
  2624. "span",
  2625. {
  2626. style: {
  2627. fontSize: "0.84em",
  2628. textDecoration: "underline",
  2629. ...textStyle,
  2630. },
  2631. },
  2632. x
  2633. ),
  2634. ],
  2635. length: length + x.length,
  2636. }
  2637. : {
  2638. vnodes: [
  2639. ...vnodes,
  2640. external_m_default().fragment(
  2641. {},
  2642. x
  2643. ),
  2644. ],
  2645. length: length + x.length,
  2646. }
  2647. )
  2648. var end
  2649. }
  2650. )
  2651. )
  2652. })(x, getConfig)
  2653. ),
  2654. es6_Option_map(x =>
  2655. external_m_default()(
  2656. "span",
  2657. {
  2658. style: {
  2659. color: toUndefined(data.textColor),
  2660. ...textStyle,
  2661. },
  2662. },
  2663. x.vnodes
  2664. )
  2665. )
  2666. ),
  2667. function_pipe(
  2668. data.paymentInfo,
  2669. filter(x => x.visible),
  2670. es6_Option_map(x =>
  2671. external_m_default()(
  2672. "span",
  2673. {
  2674. style: {
  2675. color: toUndefined(data.paidColor),
  2676. fontSize: "0.84em",
  2677. ...textStyle,
  2678. },
  2679. },
  2680. external_m_default()(
  2681. "strong",
  2682. { style: textStyle },
  2683. x.content
  2684. )
  2685. )
  2686. )
  2687. ),
  2688. ],
  2689. ReadonlyArray_compact,
  2690. toArray
  2691. )
  2692. )
  2693. })(chat, mainState)
  2694. ),
  2695. external_window_hash_it_namespaceObject = window["hash-it"]
  2696. var external_window_hash_it_default = __webpack_require__.n(
  2697. external_window_hash_it_namespaceObject
  2698. )
  2699. const getLaneY = (lane, mainState) =>
  2700. mainState.playerRect.height *
  2701. ((lane / mainState.getConfig.laneCount() + 0.005) *
  2702. (mainState.getConfig.flowY2() - mainState.getConfig.flowY1()) +
  2703. mainState.getConfig.flowY1()),
  2704. setChatPlayState = chat => mainState =>
  2705. function_pipe(
  2706. chat,
  2707. fromPredicate(x => !x.animationEnded),
  2708. fromOption,
  2709. IOOption_chainOptionK(x => x.animation),
  2710. IOOption_chainFirstIOK(x =>
  2711. mainState.chatPlaying ? () => x.play() : () => x.pause()
  2712. ),
  2713. IOOption_chainIOK(x => () => {
  2714. x.playbackRate = mainState.getConfig.flowSpeed() / 15
  2715. })
  2716. ),
  2717. getWidth = external_window_micro_memoize_default()(
  2718. ele => ele?.getBoundingClientRect().width ?? 0,
  2719. {
  2720. maxSize: 2e3,
  2721. transformKey: function_flow(
  2722. es6_ReadonlyArray_map(external_window_hash_it_default()),
  2723. toArray
  2724. ),
  2725. }
  2726. ),
  2727. setChatAnimation = (chat, chats) => mainState =>
  2728. function_pipe(
  2729. { fontSize: getChatFontSize(mainState) },
  2730. of,
  2731. IO_chainFirst(x => () => {
  2732. chat.element.style.transform = `translate(${
  2733. mainState.playerRect.width *
  2734. (mainState.getConfig.flowX2() - mainState.getConfig.flowX1())
  2735. }px, -${2 * x.fontSize}px)`
  2736. }),
  2737. IOOption_fromIO,
  2738. IOOption_filter(() => !chat.animationEnded),
  2739. IOOption_chainFirstIOK(x => () => {
  2740. chat.animationDuration = 6400
  2741. chat.width = getWidth(chat.element.firstElementChild)
  2742. chat.height = x.fontSize
  2743. }),
  2744. IOOption_map(() => ({ progress: getFlowChatProgress(chat) })),
  2745. IOOption_map(x => ({
  2746. ...x,
  2747. ...getChatLane(chat, x.progress, chats)(mainState),
  2748. })),
  2749. IOOption_chain(ctx =>
  2750. intervalTooSmall(ctx.interval)(mainState.getConfig)
  2751. ? function_pipe(
  2752. chat.animation,
  2753. fromOption,
  2754. IOOption_chainIOK(x => () => {
  2755. x.finish()
  2756. chat.animation = Option_none
  2757. }),
  2758. IO_map(() => Option_none)
  2759. )
  2760. : IOOption_of(ctx)
  2761. ),
  2762. IOOption_chainFirstIOK(x => () => {
  2763. chat.lane = x.lane
  2764. }),
  2765. IOOption_map(x => ({ ...x, laneY: getLaneY(chat.lane, mainState) })),
  2766. IOOption_chain(ctx =>
  2767. function_pipe(
  2768. [
  2769. function_pipe(
  2770. chat.animation,
  2771. fromOption,
  2772. IOOption_chainIOK(x => () => x.cancel())
  2773. ),
  2774. function_pipe(
  2775. [
  2776. [
  2777. mainState.playerRect.width *
  2778. (mainState.getConfig.flowX2() -
  2779. mainState.getConfig.flowX1()),
  2780. ctx.laneY,
  2781. ],
  2782. [-chat.width, ctx.laneY],
  2783. ],
  2784. es6_ReadonlyArray_map(es6_ReadonlyArray_map(x => `${x}px`)),
  2785. es6_ReadonlyArray_map(([x, y]) => `translate(${x}, ${y})`),
  2786. ReadonlyArray_bindTo("transform"),
  2787. toArray,
  2788. x =>
  2789. chat.element.animate(x, {
  2790. duration: 6400,
  2791. easing: mainState.getConfig.timingFunction(),
  2792. }),
  2793. x => {
  2794. x.onfinish = () => {
  2795. chat.animationEnded = !0
  2796. }
  2797. chat.y = ctx.laneY
  2798. const newTime = 6400 * ctx.progress
  2799. x.currentTime = newTime
  2800. return x
  2801. },
  2802. Option_of,
  2803. x => () => {
  2804. chat.animation = x
  2805. },
  2806. IO_apSecond(setChatPlayState(chat)(mainState))
  2807. ),
  2808. ],
  2809. sequenceArray,
  2810. IOOption_fromIO
  2811. )
  2812. ),
  2813. IO_map(Option_isSome)
  2814. ),
  2815. emptyElement = document.createElement("span")
  2816. var Monoid_concatAll = function (M) {
  2817. return (function (M) {
  2818. return function (startWith) {
  2819. return function (as) {
  2820. return as.reduce(function (a, acc) {
  2821. return M.concat(a, acc)
  2822. }, startWith)
  2823. }
  2824. }
  2825. })(M)(M.empty)
  2826. }
  2827. const filterOperators = {
  2828. flip: function (f) {
  2829. return function () {
  2830. for (var args = [], _i = 0; _i < arguments.length; _i++)
  2831. args[_i] = arguments[_i]
  2832. return args.length > 1
  2833. ? f(args[1], args[0])
  2834. : function (a) {
  2835. return f(a)(args[0])
  2836. }
  2837. }
  2838. },
  2839. flow: fns => function_flow(...fns),
  2840. and: Monoid_concatAll({
  2841. concat: function (first, second) {
  2842. return first && second
  2843. },
  2844. empty: !0,
  2845. }),
  2846. or: Monoid_concatAll({
  2847. concat: function (first, second) {
  2848. return first || second
  2849. },
  2850. empty: !1,
  2851. }),
  2852. RA: { some: ReadonlyArray_some, compact: ReadonlyArray_compact },
  2853. O: {
  2854. exists: function (predicate) {
  2855. return function (ma) {
  2856. return !Option_isNone(ma) && predicate(ma.value)
  2857. }
  2858. },
  2859. },
  2860. inText: text => x => {
  2861. return ((searchString = x),
  2862. function (s) {
  2863. return s.includes(searchString, undefined)
  2864. })(text.content)
  2865. var searchString
  2866. },
  2867. eqText: text => x => text.content === x,
  2868. matchedByText: text => x => Boolean(text.content.match(RegExp(x, "u"))),
  2869. isVisible: x => x.visible,
  2870. },
  2871. filter_filterOperators = filterOperators,
  2872. assert_lib = check.assert,
  2873. tapNonNull = x => {
  2874. assert_lib(null != x)
  2875. return x
  2876. },
  2877. onChatFieldMutate = (
  2878. chatScrn,
  2879. flowChats,
  2880. mainState,
  2881. setConfig,
  2882. mainLog
  2883. ) =>
  2884. function_flow(
  2885. es6_ReadonlyArray_chain(e => Array.from(e.addedNodes)),
  2886. es6_ReadonlyArray_filter(x => x.children.length > 0),
  2887. ReadonlyArray_reverse,
  2888. es6_ReadonlyArray_map(chat => () => {
  2889. const getData = (chat => {
  2890. const chatType = chat.querySelector(
  2891. ".yt-live-chat-ticker-paid-message-item-renderer"
  2892. )
  2893. ? "ticker"
  2894. : chat.querySelector(
  2895. ".yt-live-chat-membership-item-renderer"
  2896. )
  2897. ? "membership"
  2898. : chat.querySelector(
  2899. ".yt-live-chat-viewer-engagement-message-renderer"
  2900. )
  2901. ? "engagement"
  2902. : "normal",
  2903. isPaid =
  2904. "ticker" === chatType ||
  2905. Boolean(chat.querySelector("#card")),
  2906. paymentInfo = function_pipe(
  2907. fromNullable(
  2908. isPaid
  2909. ? chat.querySelector(
  2910. [
  2911. "#purchase-amount",
  2912. "#purchase-amount-chip",
  2913. "#content>#text",
  2914. ].join(",")
  2915. )?.textContent
  2916. : void 0
  2917. ),
  2918. es6_Option_map(x => ({ visible: !0, content: x }))
  2919. ),
  2920. authorType = chat.querySelector(".owner")
  2921. ? "owner"
  2922. : chat.querySelector(".moderator")
  2923. ? "moderator"
  2924. : chat.querySelector(".member")
  2925. ? "member"
  2926. : "normal",
  2927. messageElement = fromNullable(chat.querySelector("#message")),
  2928. isPaidNormal =
  2929. !!Option_isSome(paymentInfo) &&
  2930. Boolean(
  2931. chat.querySelector(".yt-live-chat-paid-message-renderer")
  2932. ),
  2933. isPaidSticker =
  2934. !(!Option_isSome(paymentInfo) || isPaidNormal) &&
  2935. Boolean(
  2936. chat.querySelector(".yt-live-chat-paid-sticker-renderer")
  2937. ),
  2938. textColor = fromNullable(
  2939. isPaidNormal
  2940. ? window
  2941. .getComputedStyle(
  2942. tapNonNull(chat.querySelector("#header"))
  2943. )
  2944. .getPropertyValue("background-color")
  2945. : isPaidSticker
  2946. ? window
  2947. .getComputedStyle(chat)
  2948. .getPropertyValue(
  2949. "--yt-live-chat-paid-sticker-chip-background-color"
  2950. )
  2951. : void 0
  2952. ),
  2953. paidColor = fromNullable(
  2954. isPaidNormal
  2955. ? window
  2956. .getComputedStyle(
  2957. tapNonNull(chat.querySelector("#content"))
  2958. )
  2959. .getPropertyValue("background-color")
  2960. : isPaidSticker
  2961. ? window
  2962. .getComputedStyle(chat)
  2963. .getPropertyValue(
  2964. "--yt-live-chat-paid-sticker-background-color"
  2965. )
  2966. : void 0
  2967. ),
  2968. authorPhotoMatches = chat
  2969. .querySelector(["#author-photo", "img"].join(" "))
  2970. ?.src.match(/ytc\/(.*)=/),
  2971. authorID = fromNullable(authorPhotoMatches?.at(-1)),
  2972. authorName = fromNullable(
  2973. chat.querySelector("#author-name")?.textContent
  2974. ),
  2975. message = function_pipe(
  2976. messageElement,
  2977. es6_Option_map(x => ({ visible: !0, content: x.innerHTML }))
  2978. ),
  2979. messageText = function_pipe(
  2980. messageElement,
  2981. es6_Option_map(x => ({
  2982. visible: !0,
  2983. content: x.textContent ?? "",
  2984. }))
  2985. )
  2986. return getConfig => ({
  2987. chatType,
  2988. authorType,
  2989. authorID,
  2990. authorName: function_pipe(
  2991. authorName,
  2992. es6_Option_map(x => ({
  2993. visible:
  2994. ("moderator" === authorType &&
  2995. getConfig.displayModName()) ||
  2996. (Option_isSome(paymentInfo) &&
  2997. getConfig.displaySuperChatAuthor()),
  2998. content: x,
  2999. }))
  3000. ),
  3001. messageElement,
  3002. message,
  3003. messageText,
  3004. paymentInfo,
  3005. textColor,
  3006. paidColor,
  3007. })
  3008. })(chat),
  3009. { getConfig } = mainState,
  3010. data = getData(getConfig)
  3011. ;(((data, getConfig, mainLog) =>
  3012. function_pipe(
  3013. data,
  3014. fromPredicate(() =>
  3015. function_pipe(getConfig.filterExp(), x =>
  3016. a(
  3017. x,
  3018. (data => ({
  3019. ...filter_filterOperators,
  3020. authorName: data.authorName,
  3021. message: data.message,
  3022. messageText: data.messageText,
  3023. paymentInfo: data.paymentInfo,
  3024. authorID: function_pipe(
  3025. data.authorID,
  3026. es6_Option_map(x => ({ visible: !1, content: x }))
  3027. ),
  3028. }))(data)
  3029. )
  3030. )
  3031. ),
  3032. es6_Option_map(x => [
  3033. function_pipe(
  3034. x.message,
  3035. es6_Option_map(m => m.content)
  3036. ),
  3037. function_pipe(
  3038. x.paymentInfo,
  3039. es6_Option_map(p => p.content)
  3040. ),
  3041. ]),
  3042. es6_Option_map(es6_ReadonlyArray_map(getOrElse(() => ""))),
  3043. es6_Option_map(JSON.stringify),
  3044. es6_Option_map(x => mainLog([`Filtered: ${x}`])),
  3045. match(
  3046. () => () => !1,
  3047. IO_map(() => !0)
  3048. )
  3049. )())(data, getConfig, mainLog)
  3050. ? () => {
  3051. chat.style.display = "none"
  3052. }
  3053. : function_pipe(
  3054. [
  3055. function_pipe(
  3056. void 0,
  3057. fromPredicate(getConfig.createChats),
  3058. filter(() => "normal" === data.chatType),
  3059. fromOption,
  3060. IOOption_chainIOK(() =>
  3061. ((getData, flowChats, chatScrn, mainState) =>
  3062. function_pipe(
  3063. {
  3064. getData,
  3065. element: emptyElement,
  3066. lane: -1,
  3067. animation: Option_none,
  3068. animationDuration: 0,
  3069. animationEnded: !1,
  3070. width: 2,
  3071. height: getChatFontSize(mainState),
  3072. y: 0,
  3073. },
  3074. x =>
  3075. getChatLane(x, 0, flowChats)(mainState).interval,
  3076. intervalTooSmall,
  3077. x => x(mainState.getConfig)
  3078. )
  3079. ? () => {}
  3080. : () => {
  3081. const offScreenIndex = function_pipe(
  3082. flowChats,
  3083. findIndex(
  3084. chat =>
  3085. chat.animationEnded ||
  3086. flowChats.length >=
  3087. mainState.getConfig.maxChatCount()
  3088. )
  3089. ),
  3090. element = function_pipe(
  3091. offScreenIndex,
  3092. es6_Option_map(x => flowChats[x].element),
  3093. getOrElseW(() =>
  3094. document.createElement("span")
  3095. )
  3096. )
  3097. function_pipe(
  3098. offScreenIndex,
  3099. match(
  3100. () => () => {
  3101. external_log_default().debug(
  3102. "CreateFlowChat"
  3103. )
  3104. chatScrn.append(element)
  3105. },
  3106. i =>
  3107. function_pipe(
  3108. () =>
  3109. flowChats.splice(i, 1)[0].animation,
  3110. IOOption_chainIOK(
  3111. oldAnimation => () =>
  3112. oldAnimation.cancel()
  3113. )
  3114. )
  3115. )
  3116. )()
  3117. const flowChat = {
  3118. getData,
  3119. element,
  3120. lane: -1,
  3121. animation: Option_none,
  3122. animationDuration: 0,
  3123. animationEnded: !1,
  3124. width: 2,
  3125. height: getChatFontSize(mainState),
  3126. y: 0,
  3127. }
  3128. element.classList.add("fyc_chat")
  3129. function_pipe(
  3130. mainState,
  3131. of,
  3132. IO_chainFirst(renderChat(flowChat)),
  3133. chain(setChatAnimation(flowChat, flowChats)),
  3134. chain(x =>
  3135. x
  3136. ? () => flowChats.push(flowChat)
  3137. : () => flowChat.element.remove()
  3138. )
  3139. )()
  3140. })(getData, flowChats, chatScrn, mainState)
  3141. )
  3142. ),
  3143. function_pipe(
  3144. data.authorID,
  3145. fromOption,
  3146. IOOption_filter(getConfig.createBanButton),
  3147. IOOption_chainIOK(x =>
  3148. addBanButton(chat, x, getConfig, setConfig)
  3149. ),
  3150. IO_map(() => Option_of(void 0)),
  3151. IOOption_filter(getConfig.simplifyChatField),
  3152. IOOption_chainIOK(() =>
  3153. (chat =>
  3154. chat.querySelector(
  3155. ".style-scope.yt-live-chat-paid-message-renderer"
  3156. )
  3157. ? () => {}
  3158. : function_pipe(
  3159. [
  3160. "#author-photo",
  3161. "yt-live-chat-author-chip.style-scope.yt-live-chat-text-message-renderer",
  3162. ],
  3163. es6_ReadonlyArray_map(x =>
  3164. fromNullable(chat.querySelector(x))
  3165. ),
  3166. ReadonlyArray_compact,
  3167. es6_ReadonlyArray_map(x => () => {
  3168. x.style.display = "none"
  3169. }),
  3170. ReadonlyArray_append(() => {
  3171. chat.style.borderBottom =
  3172. "1px solid var(--yt-spec-text-secondary)"
  3173. }),
  3174. sequenceArray
  3175. ))(chat)
  3176. )
  3177. ),
  3178. ],
  3179. sequenceArray
  3180. ))()
  3181. }),
  3182. sequenceArray
  3183. ),
  3184. removeOldChats = maxChatCount => flowChats =>
  3185. function_pipe(
  3186. () =>
  3187. flowChats.sort((a, b) =>
  3188. a.animationEnded === b.animationEnded
  3189. ? 0
  3190. : a.animationEnded
  3191. ? -1
  3192. : 1
  3193. ),
  3194. IO_apSecond(() =>
  3195. flowChats.splice(0, Math.max(0, flowChats.length - maxChatCount))
  3196. ),
  3197. chain(
  3198. removed => () =>
  3199. removed.forEach(x => {
  3200. external_log_default().debug("RemoveChat")
  3201. x.element.remove()
  3202. })
  3203. )
  3204. ),
  3205. setChatAppCss = chatField => () =>
  3206. function_pipe(
  3207. fromNullable(chatField.parentElement),
  3208. es6_Option_map(x => () => {
  3209. x.style.overflow = "unset"
  3210. })
  3211. ),
  3212. exceptions = ["timingFunction", "lang"],
  3213. isEditable = k => v =>
  3214. ("number" == typeof v ||
  3215. "string" == typeof v ||
  3216. (Array.isArray(v) && ("string" == typeof v[0] || 0 === v.length))) &&
  3217. !ReadonlyArray_some(x => x === k)(exceptions)
  3218. function fst(ea) {
  3219. return ea[0]
  3220. }
  3221. function snd(ea) {
  3222. return ea[1]
  3223. }
  3224. var mapFst = function (f) {
  3225. return function (fa) {
  3226. return [f(fst(fa)), snd(fa)]
  3227. }
  3228. },
  3229. mapSnd = function (f) {
  3230. return function (fa) {
  3231. return [fst(fa), f(snd(fa))]
  3232. }
  3233. }
  3234. const Editable_of = x => [x, Option_none],
  3235. fromValueText = v => t => [v, Option_of([t, Option_none])],
  3236. Editable_value = fst,
  3237. Editable_text = function_flow(snd, es6_Option_map(fst)),
  3238. error = function_flow(snd, es6_Option_chain(snd)),
  3239. setValue = function_flow(constant, mapFst),
  3240. setText = x =>
  3241. mapSnd(
  3242. function_flow(
  3243. es6_Option_map(mapFst(constant(x))),
  3244. alt(constant(Option_of([x, Option_none])))
  3245. )
  3246. ),
  3247. hasError = function_flow(error, Option_isSome),
  3248. identifier = function_identity,
  3249. isExpType = type => x => x.type === type,
  3250. fromJsepExp = x => {
  3251. return isExpType("Identifier")(x)
  3252. ? Option_of(identifier(x))
  3253. : isExpType("MemberExpression")(x)
  3254. ? ((f = fromJsepExp),
  3255. exp =>
  3256. function_pipe(
  3257. { type: exp.type, computed: exp.computed },
  3258. Option_of,
  3259. Option_bind("object", () => f(exp.object)),
  3260. Option_bind("property", () => f(exp.property))
  3261. ))(x)
  3262. : isExpType("CallExpression")(x)
  3263. ? (
  3264. f => exp =>
  3265. function_pipe(
  3266. { type: exp.type },
  3267. Option_of,
  3268. Option_bind("argument", () =>
  3269. function_pipe(
  3270. exp.arguments,
  3271. ReadonlyArray_head,
  3272. es6_Option_map(f)
  3273. )
  3274. ),
  3275. Option_bind("callee", () => f(exp.callee))
  3276. )
  3277. )(fromJsepExp)(x)
  3278. : isExpType("Literal")(x)
  3279. ? "string" == typeof (exp = x).value
  3280. ? Option_of({ type: "Literal", value: Editable_of(exp.value) })
  3281. : Option_none
  3282. : isExpType("ArrayExpression")(x)
  3283. ? (
  3284. f => exp =>
  3285. function_pipe(exp.elements, elements =>
  3286. function_pipe(
  3287. elements,
  3288. fromPredicate(every(x => "Literal" === x.type)),
  3289. filter(every(x => "string" == typeof x.value)),
  3290. es6_Option_map(es => ({
  3291. type: "LiteralArray",
  3292. value: Editable_of(
  3293. function_pipe(
  3294. es,
  3295. es6_ReadonlyArray_map(x => x.value)
  3296. )
  3297. ),
  3298. })),
  3299. x =>
  3300. Option_isSome(x)
  3301. ? x
  3302. : function_pipe(
  3303. { type: exp.type },
  3304. Option_of,
  3305. Option_bind("elements", () =>
  3306. function_pipe(
  3307. elements,
  3308. es6_ReadonlyArray_map(f),
  3309. Option_sequenceArray
  3310. )
  3311. )
  3312. )
  3313. )
  3314. )
  3315. )(fromJsepExp)(x)
  3316. : isExpType("Compound")(x)
  3317. ? (
  3318. f => exp =>
  3319. function_pipe(
  3320. { type: exp.type },
  3321. Option_of,
  3322. Option_bind("body", () =>
  3323. function_pipe(
  3324. exp.body,
  3325. es6_ReadonlyArray_map(f),
  3326. Option_sequenceArray
  3327. )
  3328. )
  3329. )
  3330. )(fromJsepExp)(x)
  3331. : Option_none
  3332. var f, exp
  3333. },
  3334. EditableExpression_fromJsepExp = fromJsepExp,
  3335. settingStateInit = getConfig =>
  3336. function_pipe(
  3337. Object.entries(getConfig),
  3338. es6_ReadonlyArray_map(([k, v]) => [k, v()]),
  3339. es6_ReadonlyArray_map(([k, v]) => [
  3340. k,
  3341. isEditable(k)(v)
  3342. ? Editable_of(v)
  3343. : "filterExp" === k
  3344. ? function_pipe(
  3345. EditableExpression_fromJsepExp(v),
  3346. getOrElseW(() => ({ type: "Compound", body: [] }))
  3347. )
  3348. : v,
  3349. ]),
  3350. Object.fromEntries,
  3351. x => ({
  3352. ...x,
  3353. showPanel: !1,
  3354. mainTab: 0,
  3355. logTab: 0,
  3356. timingStepCount: Editable_of(
  3357. parseInt(
  3358. getConfig.timingFunction().match(/^steps\((\d+),.+/)?.[1] ??
  3359. "150",
  3360. 10
  3361. )
  3362. ),
  3363. eventLog: [],
  3364. panelRect: new DOMRectReadOnly(0, 0, 660, 395),
  3365. })
  3366. )
  3367. var EMPTY_OBJ = {},
  3368. EMPTY_ARR = [],
  3369. hyperapp_id = a => a,
  3370. hyperapp_map = EMPTY_ARR.map,
  3371. isArray = Array.isArray,
  3372. enqueue =
  3373. "undefined" != typeof requestAnimationFrame
  3374. ? requestAnimationFrame
  3375. : setTimeout,
  3376. createClass = obj => {
  3377. var out = ""
  3378. if ("string" == typeof obj) return obj
  3379. if (isArray(obj))
  3380. for (var tmp, k = 0; k < obj.length; k++)
  3381. (tmp = createClass(obj[k])) && (out += (out && " ") + tmp)
  3382. else for (var k in obj) obj[k] && (out += (out && " ") + k)
  3383. return out
  3384. },
  3385. shouldRestart = (a, b) => {
  3386. for (var k in { ...a, ...b })
  3387. if ("function" == typeof (isArray(a[k]) ? a[k][0] : a[k])) b[k] = a[k]
  3388. else if (a[k] !== b[k]) return !0
  3389. },
  3390. getKey = vdom => (null == vdom ? vdom : vdom.key),
  3391. patchProperty = (node, key, oldValue, newValue, listener, isSvg) => {
  3392. if ("style" === key)
  3393. for (var k in { ...oldValue, ...newValue }) {
  3394. oldValue =
  3395. null == newValue || null == newValue[k] ? "" : newValue[k]
  3396. "-" === k[0]
  3397. ? node[key].setProperty(k, oldValue)
  3398. : (node[key][k] = oldValue)
  3399. }
  3400. else
  3401. "o" === key[0] && "n" === key[1]
  3402. ? ((node.events || (node.events = {}))[(key = key.slice(2))] =
  3403. newValue)
  3404. ? oldValue || node.addEventListener(key, listener)
  3405. : node.removeEventListener(key, listener)
  3406. : !isSvg && "list" !== key && "form" !== key && key in node
  3407. ? (node[key] = newValue ?? "")
  3408. : null == newValue || !1 === newValue
  3409. ? node.removeAttribute(key)
  3410. : node.setAttribute(key, newValue)
  3411. },
  3412. createNode = (vdom, listener, isSvg) => {
  3413. var props = vdom.props,
  3414. node =
  3415. 3 === vdom.type
  3416. ? document.createTextNode(vdom.tag)
  3417. : (isSvg = isSvg || "svg" === vdom.tag)
  3418. ? document.createElementNS(
  3419. "http://www.w3.org/2000/svg",
  3420. vdom.tag,
  3421. props.is && props
  3422. )
  3423. : document.createElement(vdom.tag, props.is && props)
  3424. for (var k in props)
  3425. patchProperty(node, k, null, props[k], listener, isSvg)
  3426. for (var i = 0; i < vdom.children.length; i++)
  3427. node.appendChild(
  3428. createNode(
  3429. (vdom.children[i] = maybeVNode(vdom.children[i])),
  3430. listener,
  3431. isSvg
  3432. )
  3433. )
  3434. return (vdom.node = node)
  3435. },
  3436. patch = (parent, node, oldVNode, newVNode, listener, isSvg) => {
  3437. if (oldVNode === newVNode);
  3438. else if (null != oldVNode && 3 === oldVNode.type && 3 === newVNode.type)
  3439. oldVNode.tag !== newVNode.tag && (node.nodeValue = newVNode.tag)
  3440. else if (null == oldVNode || oldVNode.tag !== newVNode.tag) {
  3441. node = parent.insertBefore(
  3442. createNode((newVNode = maybeVNode(newVNode)), listener, isSvg),
  3443. node
  3444. )
  3445. null != oldVNode && parent.removeChild(oldVNode.node)
  3446. } else {
  3447. var tmpVKid,
  3448. oldVKid,
  3449. oldKey,
  3450. newKey,
  3451. oldProps = oldVNode.props,
  3452. newProps = newVNode.props,
  3453. oldVKids = oldVNode.children,
  3454. newVKids = newVNode.children,
  3455. oldHead = 0,
  3456. newHead = 0,
  3457. oldTail = oldVKids.length - 1,
  3458. newTail = newVKids.length - 1
  3459. isSvg = isSvg || "svg" === newVNode.tag
  3460. for (var i in { ...oldProps, ...newProps })
  3461. ("value" === i || "selected" === i || "checked" === i
  3462. ? node[i]
  3463. : oldProps[i]) !== newProps[i] &&
  3464. patchProperty(node, i, oldProps[i], newProps[i], listener, isSvg)
  3465. for (
  3466. ;
  3467. newHead <= newTail &&
  3468. oldHead <= oldTail &&
  3469. null != (oldKey = getKey(oldVKids[oldHead])) &&
  3470. oldKey === getKey(newVKids[newHead]);
  3471.  
  3472. )
  3473. patch(
  3474. node,
  3475. oldVKids[oldHead].node,
  3476. oldVKids[oldHead],
  3477. (newVKids[newHead] = maybeVNode(
  3478. newVKids[newHead++],
  3479. oldVKids[oldHead++]
  3480. )),
  3481. listener,
  3482. isSvg
  3483. )
  3484. for (
  3485. ;
  3486. newHead <= newTail &&
  3487. oldHead <= oldTail &&
  3488. null != (oldKey = getKey(oldVKids[oldTail])) &&
  3489. oldKey === getKey(newVKids[newTail]);
  3490.  
  3491. )
  3492. patch(
  3493. node,
  3494. oldVKids[oldTail].node,
  3495. oldVKids[oldTail],
  3496. (newVKids[newTail] = maybeVNode(
  3497. newVKids[newTail--],
  3498. oldVKids[oldTail--]
  3499. )),
  3500. listener,
  3501. isSvg
  3502. )
  3503. if (oldHead > oldTail)
  3504. for (; newHead <= newTail; )
  3505. node.insertBefore(
  3506. createNode(
  3507. (newVKids[newHead] = maybeVNode(newVKids[newHead++])),
  3508. listener,
  3509. isSvg
  3510. ),
  3511. (oldVKid = oldVKids[oldHead]) && oldVKid.node
  3512. )
  3513. else if (newHead > newTail)
  3514. for (; oldHead <= oldTail; )
  3515. node.removeChild(oldVKids[oldHead++].node)
  3516. else {
  3517. var keyed = {},
  3518. newKeyed = {}
  3519. for (i = oldHead; i <= oldTail; i++)
  3520. null != (oldKey = oldVKids[i].key) &&
  3521. (keyed[oldKey] = oldVKids[i])
  3522. for (; newHead <= newTail; ) {
  3523. oldKey = getKey((oldVKid = oldVKids[oldHead]))
  3524. newKey = getKey(
  3525. (newVKids[newHead] = maybeVNode(newVKids[newHead], oldVKid))
  3526. )
  3527. if (
  3528. newKeyed[oldKey] ||
  3529. (null != newKey && newKey === getKey(oldVKids[oldHead + 1]))
  3530. ) {
  3531. null == oldKey && node.removeChild(oldVKid.node)
  3532. oldHead++
  3533. } else if (null == newKey || 1 === oldVNode.type) {
  3534. if (null == oldKey) {
  3535. patch(
  3536. node,
  3537. oldVKid && oldVKid.node,
  3538. oldVKid,
  3539. newVKids[newHead],
  3540. listener,
  3541. isSvg
  3542. )
  3543. newHead++
  3544. }
  3545. oldHead++
  3546. } else {
  3547. if (oldKey === newKey) {
  3548. patch(
  3549. node,
  3550. oldVKid.node,
  3551. oldVKid,
  3552. newVKids[newHead],
  3553. listener,
  3554. isSvg
  3555. )
  3556. newKeyed[newKey] = !0
  3557. oldHead++
  3558. } else if (null != (tmpVKid = keyed[newKey])) {
  3559. patch(
  3560. node,
  3561. node.insertBefore(tmpVKid.node, oldVKid && oldVKid.node),
  3562. tmpVKid,
  3563. newVKids[newHead],
  3564. listener,
  3565. isSvg
  3566. )
  3567. newKeyed[newKey] = !0
  3568. } else
  3569. patch(
  3570. node,
  3571. oldVKid && oldVKid.node,
  3572. null,
  3573. newVKids[newHead],
  3574. listener,
  3575. isSvg
  3576. )
  3577. newHead++
  3578. }
  3579. }
  3580. for (; oldHead <= oldTail; )
  3581. null == getKey((oldVKid = oldVKids[oldHead++])) &&
  3582. node.removeChild(oldVKid.node)
  3583. for (var i in keyed)
  3584. null == newKeyed[i] && node.removeChild(keyed[i].node)
  3585. }
  3586. }
  3587. return (newVNode.node = node)
  3588. },
  3589. maybeVNode = (newVNode, oldVNode) =>
  3590. !0 !== newVNode && !1 !== newVNode && newVNode
  3591. ? "function" == typeof newVNode.tag
  3592. ? ((!oldVNode ||
  3593. null == oldVNode.memo ||
  3594. ((a, b) => {
  3595. for (var k in a) if (a[k] !== b[k]) return !0
  3596. for (var k in b) if (a[k] !== b[k]) return !0
  3597. })(oldVNode.memo, newVNode.memo)) &&
  3598. ((oldVNode = newVNode.tag(newVNode.memo)).memo = newVNode.memo),
  3599. oldVNode)
  3600. : newVNode
  3601. : hyperapp_text(""),
  3602. recycleNode = node =>
  3603. 3 === node.nodeType
  3604. ? hyperapp_text(node.nodeValue, node)
  3605. : createVNode(
  3606. node.nodeName.toLowerCase(),
  3607. EMPTY_OBJ,
  3608. hyperapp_map.call(node.childNodes, recycleNode),
  3609. 1,
  3610. node
  3611. ),
  3612. createVNode = (tag, { key, ...props }, children, type, node) => ({
  3613. tag,
  3614. props,
  3615. key,
  3616. children,
  3617. type,
  3618. node,
  3619. }),
  3620. hyperapp_text = (value, node) =>
  3621. createVNode(value, EMPTY_OBJ, EMPTY_ARR, 3, node),
  3622. h = (tag, { class: c, ...props }, children = EMPTY_ARR) =>
  3623. createVNode(
  3624. tag,
  3625. { ...props, ...(c ? { class: createClass(c) } : EMPTY_OBJ) },
  3626. isArray(children) ? children : [children]
  3627. ),
  3628. app = ({
  3629. node,
  3630. view,
  3631. subscriptions,
  3632. dispatch = hyperapp_id,
  3633. init = EMPTY_OBJ,
  3634. }) => {
  3635. var state,
  3636. busy,
  3637. vdom = node && recycleNode(node),
  3638. subs = [],
  3639. update = newState => {
  3640. if (state !== newState) {
  3641. null == (state = newState) &&
  3642. (dispatch = subscriptions = render = hyperapp_id)
  3643. subscriptions &&
  3644. (subs = ((oldSubs, newSubs = EMPTY_ARR, dispatch) => {
  3645. for (
  3646. var oldSub, newSub, subs = [], i = 0;
  3647. i < oldSubs.length || i < newSubs.length;
  3648. i++
  3649. ) {
  3650. oldSub = oldSubs[i]
  3651. newSub = newSubs[i]
  3652. subs.push(
  3653. newSub && !0 !== newSub
  3654. ? !oldSub ||
  3655. newSub[0] !== oldSub[0] ||
  3656. shouldRestart(newSub[1], oldSub[1])
  3657. ? [
  3658. newSub[0],
  3659. newSub[1],
  3660. (oldSub && oldSub[2](),
  3661. newSub[0](dispatch, newSub[1])),
  3662. ]
  3663. : oldSub
  3664. : oldSub && oldSub[2]()
  3665. )
  3666. }
  3667. return subs
  3668. })(subs, subscriptions(state), dispatch))
  3669. view && !busy && enqueue(render, (busy = !0))
  3670. }
  3671. },
  3672. render = () =>
  3673. (node = patch(
  3674. node.parentNode,
  3675. node,
  3676. vdom,
  3677. (vdom = view(state)),
  3678. listener,
  3679. (busy = !1)
  3680. )),
  3681. listener = function (event) {
  3682. dispatch(this.events[event.type], event)
  3683. }
  3684. return (
  3685. (dispatch = dispatch((action, props) =>
  3686. "function" == typeof action
  3687. ? dispatch(action(state, props))
  3688. : isArray(action)
  3689. ? "function" == typeof action[0]
  3690. ? dispatch(action[0], action[1])
  3691. : action
  3692. .slice(1)
  3693. .map(
  3694. fx => fx && !0 !== fx && (fx[0] || fx)(dispatch, fx[1]),
  3695. update(action[0])
  3696. )
  3697. : update(action)
  3698. ))(init),
  3699. dispatch
  3700. )
  3701. }
  3702. const makeComponent = x => tag => ({ tag, view: x(tag) }),
  3703. src_flip =
  3704. x =>
  3705. (...b) =>
  3706. (...a) =>
  3707. x(...a)(...b),
  3708. defaultText = {
  3709. setting: ["Settings", "設定"],
  3710. font: ["Font", "フォント"],
  3711. color: ["Color(Normal)", "色(通常)"],
  3712. ownerColor: ["Color(Owner)", "色(オーナー)"],
  3713. moderatorColor: ["Color(Moderator)", "色(モデレーター)"],
  3714. memberColor: ["Color(Member)", "色(メンバー)"],
  3715. feedback: ["Feedback", "バグ報告と要望"],
  3716. eventLog: ["Event log", "イベントログ"],
  3717. giveFeedback: [
  3718. "Give your feedbacks here(Please attach the event log if they're bug related)",
  3719. "バグ報告、要望はこちら(バグの場合は、イベントログを添付してください)",
  3720. ],
  3721. chatOpacity: ["Opacity", "不透明度"],
  3722. fontSize: ["Size", "サイズ"],
  3723. fontWeight: ["Weight", "太さ"],
  3724. shadowFontWeight: ["Weight(Shadow)", "太さ(影)"],
  3725. flowSpeed: ["Speed", "速度"],
  3726. maxChatCount: ["Max number of chats", "最大表示数"],
  3727. maxChatLength: ["Max number of characters", "最大文字数"],
  3728. laneCount: ["Number of rows", "行数"],
  3729. bannedWords: ["Banned Words", "NGワード"],
  3730. bannedWordRegexs: ["Banned Words(Regex)", "NGワード(正規表現)"],
  3731. bannedUsers: ["Banned Users", "NGユーザー"],
  3732. simplifyChatField: ["Simplify", "簡略化する"],
  3733. createBanButton: ["Show ban button", "NGボタンを表示する"],
  3734. displayModName: [
  3735. "Show moderator's name",
  3736. "モデレーターの名前を表示する",
  3737. ],
  3738. displaySuperChatAuthor: [
  3739. "Show super chat author",
  3740. "スパチャの作成者を表示する",
  3741. ],
  3742. createChats: ["Display flowing chats", "チャットを流す"],
  3743. textOnly: ["Text only(ignore emojis)", "文字のみ(絵文字を無視する)"],
  3744. error: ["Error", "エラー"],
  3745. video: ["Video", "画面"],
  3746. chatField: ["Chat Window", "チャット欄"],
  3747. useStepTiming: ["Move chat in steps", "チャットを段階的に動かす"],
  3748. timingStepCount: ["└Step Count", "└段階数"],
  3749. chatFilter: ["Chat Filter", "チャットフィルター"],
  3750. flowChat: ["Flow Chat", "チャット流れ"],
  3751. clearFlowChats: ["Clear Flowing Chats", "流れるチャットをクリアする"],
  3752. flowNewChatIf: [
  3753. "A new chat will appear if all of the followings are met:",
  3754. "新しいチャットは以下のすべてを満たす場合に流れます:",
  3755. ],
  3756. noOverlap: ["└Chats won't overlap", "└他のチャットと重ならない"],
  3757. minSpacing: ["Min spacing between chats", "チャットの最小間隔"],
  3758. fieldScale: ["Scale", "拡大率"],
  3759. copy: ["Copy", "コピーする"],
  3760. showChat: ["Show chats", "チャット非表示"],
  3761. hideChat: ["Hide chats", "チャット表示"],
  3762. flowY1: ["Flow area top edge", "流れ範囲の上端"],
  3763. flowY2: ["Flow area bottom edge", "流れ範囲の下端"],
  3764. flowX1: ["Flow area left edge", "流れ範囲の左端"],
  3765. flowX2: ["Flow area right edge", "流れ範囲の右端"],
  3766. shadowColor: ["Color(Shadow)", "色(影)"],
  3767. invalidColor: ["Invalid color", "無効な色"],
  3768. inputNonNumberic: ["Input isn't a number", "入力値が数字でない"],
  3769. invalidSetting: ["Invalid setting", "無効な設定値"],
  3770. },
  3771. getText = key => language =>
  3772. defaultText[key]["FYC_EN" === language ? 0 : 1],
  3773. languageLabels = ["English", "日本語"],
  3774. computed = {
  3775. useStepTiming: s => Boolean(s.timingFunction.match(/^steps\(.+/)),
  3776. },
  3777. getState = k => (k in computed ? computed[k] : s => s[k]),
  3778. toJsepExp_identifier = function_identity,
  3779. toJsepExp = x => {
  3780. return "Identifier" === x.type
  3781. ? toJsepExp_identifier(x)
  3782. : "ArrayExpression" === x.type
  3783. ? ((f = toJsepExp),
  3784. exp =>
  3785. function_pipe({
  3786. type: exp.type,
  3787. elements: function_pipe(
  3788. es6_ReadonlyArray_map(f)(exp.elements),
  3789. toArray
  3790. ),
  3791. }))(x)
  3792. : "MemberExpression" === x.type
  3793. ? (f => exp => ({
  3794. ...exp,
  3795. object: f(exp.object),
  3796. property: f(exp.property),
  3797. }))(toJsepExp)(x)
  3798. : "CallExpression" === x.type
  3799. ? (f => exp => ({
  3800. ...exp,
  3801. arguments: function_pipe(
  3802. exp.argument,
  3803. es6_Option_map(f),
  3804. es6_Option_map(ReadonlyArray_of),
  3805. es6_Option_map(toArray),
  3806. getOrElse(constant([]))
  3807. ),
  3808. callee: f(exp.callee),
  3809. }))(toJsepExp)(x)
  3810. : "Literal" === x.type
  3811. ? function_pipe(x.value, Editable_value, x => ({
  3812. type: "Literal",
  3813. value: x,
  3814. raw: JSON.stringify(x),
  3815. }))
  3816. : "LiteralArray" === x.type
  3817. ? {
  3818. type: "ArrayExpression",
  3819. elements: function_pipe(
  3820. x.value,
  3821. Editable_value,
  3822. es6_ReadonlyArray_map(
  3823. function_flow(x => ({
  3824. type: "Literal",
  3825. value: x,
  3826. raw: JSON.stringify(x),
  3827. }))
  3828. ),
  3829. toArray
  3830. ),
  3831. }
  3832. : (
  3833. f => exp =>
  3834. function_pipe({
  3835. type: exp.type,
  3836. body: function_pipe(
  3837. es6_ReadonlyArray_map(f)(exp.body),
  3838. toArray
  3839. ),
  3840. })
  3841. )(toJsepExp)(x)
  3842. var f
  3843. },
  3844. EditableExpression_toJsepExp = toJsepExp,
  3845. configEffect = (k, v) => setConfig => setConfig[k](v),
  3846. stepTiming = stepCount => `steps(${stepCount}, jump-end)`,
  3847. setComputed = {
  3848. useStepTiming: v => c => s =>
  3849. function_pipe(
  3850. v ? stepTiming(Editable_value(s.timingStepCount)) : "linear",
  3851. timingFunction => [
  3852. { ...s, timingFunction },
  3853. configEffect("timingFunction", timingFunction)(c.setConfig),
  3854. ]
  3855. ),
  3856. },
  3857. settingUI_setComputed = setComputed
  3858. var es6_Identity_map = function (f) {
  3859. return function (fa) {
  3860. return f(fa)
  3861. }
  3862. },
  3863. Identity_Functor = {
  3864. URI: "Identity",
  3865. map: function (fa, f) {
  3866. return function_pipe(fa, es6_Identity_map(f))
  3867. },
  3868. },
  3869. Identity_bindTo = bindTo(Identity_Functor),
  3870. Identity_let_ = let_(Identity_Functor)
  3871. const setRange = keyA => keyB => bFn => vA => c => s =>
  3872. function_pipe(
  3873. { a: Editable_value(vA) },
  3874. Identity_let_("b", ({ a }) => bFn(a)(Editable_value(s[keyB]))),
  3875. ({ a, b }) =>
  3876. function_pipe(
  3877. [configEffect(keyA, a), configEffect(keyB, b)],
  3878. Reader_sequenceArray,
  3879. es6_Reader_map(effects => [
  3880. { ...s, [keyA]: vA, [keyB]: setValue(b)(s[keyB]) },
  3881. ...effects,
  3882. ])
  3883. )(c.setConfig)
  3884. ),
  3885. setState = {
  3886. flowY1: setRange("flowY1")("flowY2")(a => b => Math.max(b, a + 0.05)),
  3887. flowY2: setRange("flowY2")("flowY1")(a => b => Math.min(b, a - 0.05)),
  3888. flowX1: setRange("flowX1")("flowX2")(a => b => Math.max(b, a + 0.05)),
  3889. flowX2: setRange("flowX2")("flowX1")(a => b => Math.min(b, a - 0.05)),
  3890. timingStepCount: v => c => s =>
  3891. function_pipe(stepTiming(Editable_value(v)), timingFunction => [
  3892. { ...s, timingStepCount: v, timingFunction },
  3893. configEffect("timingFunction", timingFunction)(c.setConfig),
  3894. ]),
  3895. },
  3896. settingUI_setState = setState,
  3897. settingUI_updateAt = (k, v) =>
  3898. function_pipe(
  3899. k in settingUI_setComputed
  3900. ? settingUI_setComputed[k](v)
  3901. : k in settingUI_setState
  3902. ? settingUI_setState[k](v)
  3903. : c => s =>
  3904. [
  3905. { ...s, [k]: v },
  3906. ...(k in c.setConfig
  3907. ? [
  3908. configEffect(
  3909. k,
  3910. Array.isArray(v) &&
  3911. 2 === v.length &&
  3912. isEditable(k)(v[0])
  3913. ? Editable_value(v)
  3914. : "filterExp" === k
  3915. ? EditableExpression_toJsepExp(v)
  3916. : v
  3917. )(c.setConfig),
  3918. ]
  3919. : []),
  3920. ]
  3921. ),
  3922. tapIs = constructor => x => {
  3923. assert_lib(x instanceof constructor)
  3924. return x
  3925. },
  3926. checkboxNode = label => c => s => {
  3927. return ((label, checked, onchange) =>
  3928. h(
  3929. "div",
  3930. {},
  3931. h("label", {}, [
  3932. hyperapp_text(label),
  3933. h("input", { type: "checkbox", checked, onchange }),
  3934. ])
  3935. ))(
  3936. getText(label)(s.lang),
  3937. getState(label)(s),
  3938. ((key = label),
  3939. src_flip((s, e) =>
  3940. function_pipe(
  3941. (e => tapIs(HTMLInputElement)(e.currentTarget).checked)(e),
  3942. x => settingUI_updateAt(key, x),
  3943. src_flip,
  3944. apply(s)
  3945. )
  3946. ))(c)
  3947. )
  3948. var key
  3949. },
  3950. updateInput = setter => key =>
  3951. src_flip((s, e) =>
  3952. function_pipe(
  3953. (e => {
  3954. const target = e.currentTarget ?? e.__target
  3955. if (
  3956. target instanceof HTMLSelectElement ||
  3957. target instanceof HTMLTextAreaElement ||
  3958. target instanceof HTMLInputElement
  3959. )
  3960. return target.value
  3961. throw Error("Event target type isn't acceptable.")
  3962. })(e),
  3963. setter,
  3964. apply(getState(key)(s)),
  3965. x => settingUI_updateAt(key, x),
  3966. src_flip,
  3967. apply(s)
  3968. )
  3969. ),
  3970. editAction = (key, setter) => c => ({
  3971. oninput: (s, e) => updateInput(setter(!0))(key)(c)(s, e),
  3972. onchange: (s, e) => updateInput(setter(!1))(key)(c)(s, e),
  3973. }),
  3974. setEditNumber = editing => value => state =>
  3975. function_pipe(
  3976. value,
  3977. Number.parseFloat,
  3978. editing
  3979. ? x =>
  3980. Number.isNaN(x) || "." === value.at(-1)
  3981. ? function_pipe(state, setText(value))
  3982. : fromValueText(x)(value)
  3983. : x =>
  3984. Number.isNaN(x)
  3985. ? function_pipe(
  3986. state,
  3987. mapSnd(constant(Option_of([value, Option_of("")])))
  3988. )
  3989. : Editable_of(x)
  3990. ),
  3991. errorText = subject => edit =>
  3992. function_pipe(
  3993. edit,
  3994. error,
  3995. es6_Option_map(x => `${subject}${"" === x ? "" : ": "}${x}`),
  3996. getOrElse(constant(""))
  3997. ),
  3998. rangeRow = (min, max, step, action) => value =>
  3999. h("div", {}, [
  4000. h("input", {
  4001. style: { width: "150px", verticalAlign: "middle" },
  4002. type: "range",
  4003. min,
  4004. max,
  4005. step,
  4006. value: Editable_value(value).toString(),
  4007. oninput: action.onchange,
  4008. }),
  4009. h("input", {
  4010. style: {
  4011. width: "30px",
  4012. backgroundColor: "transparent",
  4013. color: "inherit",
  4014. borderWidth: "1px",
  4015. verticalAlign: "middle",
  4016. borderColor: hasError(value) ? "#f55" : void 0,
  4017. },
  4018. inputmode: "decimal",
  4019. value: function_pipe(
  4020. value,
  4021. Editable_text,
  4022. getOrElse(
  4023. constant(
  4024. Editable_value(value)
  4025. .toFixed(4)
  4026. .replace(/\.?0+$/, "")
  4027. )
  4028. )
  4029. ),
  4030. ...action,
  4031. }),
  4032. ]),
  4033. settingRow = (label, error, content) =>
  4034. h("div", {}, [
  4035. h("span", {}, hyperapp_text(label)),
  4036. h(
  4037. "span",
  4038. {
  4039. style: {
  4040. color: "#f55",
  4041. marginLeft: "5px",
  4042. whiteSpace: "pre-wrap",
  4043. },
  4044. },
  4045. hyperapp_text(error)
  4046. ),
  4047. h("div", {}, content),
  4048. ]),
  4049. numberNode = (label, min, max, step) => c => s =>
  4050. settingRow(
  4051. getText(label)(s.lang),
  4052. errorText(getText("inputNonNumberic")(s.lang))(s[label]),
  4053. [
  4054. rangeRow(
  4055. min,
  4056. max,
  4057. step,
  4058. editAction(label, setEditNumber)(c)
  4059. )(getState(label)(s)),
  4060. ]
  4061. ),
  4062. panelBoxStyle = width => ({ flex: `0 0 ${width}px`, margin: "2px" }),
  4063. settingUI_chatFieldPanel = function_pipe(
  4064. [
  4065. function_pipe(
  4066. [
  4067. numberNode("fieldScale", 0.7, 1.5, 0.05),
  4068. checkboxNode("simplifyChatField"),
  4069. checkboxNode("createBanButton"),
  4070. ],
  4071. Reader_sequenceArray,
  4072. es6_Reader_map(Reader_sequenceArray),
  4073. es6_Reader_map(
  4074. es6_Reader_map(x => h("div", { style: panelBoxStyle(644) }, x))
  4075. )
  4076. ),
  4077. ],
  4078. Reader_sequenceArray,
  4079. es6_Reader_map(Reader_sequenceArray)
  4080. ),
  4081. action = {
  4082. copy: () => s => async () => {
  4083. GM.setClipboard(s.eventLog.join("\n"))
  4084. },
  4085. clearFlowChats: c => s => async () => {
  4086. c.act.clearFlowChats()
  4087. },
  4088. },
  4089. buttonNode = label => c => state =>
  4090. h(
  4091. "button",
  4092. { type: "button", onclick: s => [s, action[label](c)(s)] },
  4093. hyperapp_text(getText(label)(state.lang))
  4094. ),
  4095. tabContainer = style => ontabSelect => labels => tabs => mainTab =>
  4096. h("div", {}, [
  4097. h(
  4098. "div",
  4099. {},
  4100. function_pipe(
  4101. labels,
  4102. es6_ReadonlyArray_mapWithIndex((i, x) =>
  4103. h(
  4104. "span",
  4105. {
  4106. style: {
  4107. ...style.label,
  4108. ...(mainTab === i ? style.labelFocus : {}),
  4109. display: "inline-block",
  4110. },
  4111. onpointerdown: [ontabSelect, i],
  4112. },
  4113. hyperapp_text(x)
  4114. )
  4115. )
  4116. )
  4117. ),
  4118. h(
  4119. "div",
  4120. { style: { ...style.container, overflow: "hidden auto" } },
  4121. h(
  4122. "div",
  4123. { style: { ...style.tab } },
  4124. tabs.find((_, i) => i === mainTab)?.()
  4125. )
  4126. ),
  4127. ]),
  4128. feedbackPanel = c => s =>
  4129. function_pipe(
  4130. Math.trunc(getState("eventLog")(s).length / 100) + 1,
  4131. logPageLength => [
  4132. h("div", { style: panelBoxStyle(644) }, [
  4133. h(
  4134. "div",
  4135. { style: { float: "right" } },
  4136. h(
  4137. "a",
  4138. {
  4139. style: { color: "#f0f" },
  4140. href: "https://greasyfork.org/en/scripts/411442-flow-youtube-chat/feedback",
  4141. target: "_blank",
  4142. },
  4143. hyperapp_text(getText("giveFeedback")(s.lang))
  4144. )
  4145. ),
  4146. h("div", {}, [
  4147. h("span", {}, hyperapp_text(getText("eventLog")(s.lang))),
  4148. buttonNode("copy")(c)(s),
  4149. tabContainer({
  4150. container: { height: "276px" },
  4151. label: { padding: "4px", width: "2em", textAlign: "center" },
  4152. labelFocus: { background: "#666" },
  4153. tab: {
  4154. display: "flex",
  4155. flexDirection: "column",
  4156. padding: "6px",
  4157. },
  4158. })((_, n) => settingUI_updateAt("logTab", n)(c))(
  4159. function_pipe(
  4160. ReadonlyArray_makeBy(logPageLength, number_Show_show)
  4161. )
  4162. )(
  4163. function_pipe(
  4164. ReadonlyArray_makeBy(
  4165. logPageLength,
  4166. i => () =>
  4167. function_pipe(
  4168. getState("eventLog")(s).slice(100 * i, 100 * (i + 1)),
  4169. es6_ReadonlyArray_mapWithIndex((j, x) =>
  4170. h("div", { style: { display: "flex" } }, [
  4171. h(
  4172. "div",
  4173. {
  4174. style: {
  4175. userSelect: "none",
  4176. flex: "0 0 2em",
  4177. },
  4178. },
  4179. hyperapp_text(100 * i + j)
  4180. ),
  4181. h(
  4182. "div",
  4183. {
  4184. style: {
  4185. background: j % 2 == 0 ? "#fff" : "#ddd",
  4186. color: "#000",
  4187. flex: "auto",
  4188. wordBreak: "break-all",
  4189. padding: "0 2px",
  4190. },
  4191. },
  4192. hyperapp_text(x)
  4193. ),
  4194. ])
  4195. )
  4196. )
  4197. )
  4198. )
  4199. )(getState("logTab")(s)),
  4200. ]),
  4201. ]),
  4202. ]
  4203. ),
  4204. setEditRegexs = editing => value =>
  4205. function_pipe(
  4206. value,
  4207. split(/\r\n|\n/),
  4208. es6_ReadonlyArray_filter(Predicate_not(string_isEmpty)),
  4209. Identity_bindTo("regexs"),
  4210. Identity_let_("errors", ({ regexs }) => {
  4211. return function_pipe(
  4212. regexs,
  4213. es6_ReadonlyArray_mapWithIndex((i, x) => {
  4214. try {
  4215. RegExp(x, "u")
  4216. return Option_none
  4217. } catch (e) {
  4218. return Option_of(`${e} in regex number ${i}`)
  4219. }
  4220. }),
  4221. Monoid_concatAll(
  4222. ((S = { concat: (x, y) => `${x}\n${y}` }),
  4223. {
  4224. concat: function (x, y) {
  4225. return Option_isNone(x)
  4226. ? y
  4227. : Option_isNone(y)
  4228. ? x
  4229. : Option_some(S.concat(x.value, y.value))
  4230. },
  4231. empty: Option_none,
  4232. })
  4233. )
  4234. )
  4235. var S
  4236. }),
  4237. ctx =>
  4238. editing
  4239. ? setText(value)
  4240. : function_pipe(
  4241. ctx.errors,
  4242. es6_Option_map(x =>
  4243. mapSnd(() => Option_of([value, Option_of(x)]))
  4244. ),
  4245. getOrElse(constant(constant(Editable_of(ctx.regexs))))
  4246. )
  4247. ),
  4248. setEditStrings = editing => value =>
  4249. function_pipe(
  4250. value,
  4251. split(/\r\n|\n/),
  4252. es6_ReadonlyArray_filter(Predicate_not(string_isEmpty)),
  4253. x =>
  4254. constant(
  4255. editing ? [x, Option_of([value, Option_none])] : Editable_of(x)
  4256. )
  4257. ),
  4258. textAreaRow = (rows, action) => value =>
  4259. h("textarea", {
  4260. rows,
  4261. style: {
  4262. resize: "horizontal",
  4263. boxSizing: "border-box",
  4264. width: "100%",
  4265. borderColor: hasError(value) ? "#f55" : void 0,
  4266. },
  4267. value: function_pipe(
  4268. value,
  4269. Editable_text,
  4270. getOrElse(
  4271. function_pipe(Editable_value(value), x => x.join("\n"), constant)
  4272. )
  4273. ),
  4274. ...action,
  4275. }),
  4276. textAreaNode = (label, rows, setter) => c => s =>
  4277. settingRow(
  4278. getText(label)(s.lang),
  4279. errorText(getText("invalidSetting")(s.lang))(s[label]),
  4280. [textAreaRow(rows, editAction(label, setter)(c))(getState(label)(s))]
  4281. ),
  4282. filterPanelOld = c => s =>
  4283. [
  4284. h(
  4285. "div",
  4286. { style: panelBoxStyle(212) },
  4287. textAreaNode("bannedWords", 18, setEditStrings)(c)(s)
  4288. ),
  4289. h(
  4290. "div",
  4291. { style: panelBoxStyle(212) },
  4292. textAreaNode("bannedWordRegexs", 18, setEditRegexs)(c)(s)
  4293. ),
  4294. h(
  4295. "div",
  4296. { style: panelBoxStyle(212) },
  4297. textAreaNode("bannedUsers", 18, setEditStrings)(c)(s)
  4298. ),
  4299. ]
  4300. var validate_color_lib = __webpack_require__(90),
  4301. lib_default = __webpack_require__.n(validate_color_lib)
  4302. const validColor = x => lib_default()(x.replace(/grey/gi, "gray")),
  4303. setEditColor = editing => value =>
  4304. editing
  4305. ? validColor(value)
  4306. ? constant(fromValueText(value)(value))
  4307. : setText(value)
  4308. : validColor(value)
  4309. ? constant(Editable_of(value))
  4310. : mapSnd(constant(Option_of([value, Option_of("")]))),
  4311. colorPicker = action => color =>
  4312. h("input", {
  4313. style: { width: "36px", verticalAlign: "middle" },
  4314. type: "color",
  4315. value: color,
  4316. oninput: action.onchange,
  4317. }),
  4318. textInput = action => value =>
  4319. h("input", {
  4320. style: {
  4321. verticalAlign: "middle",
  4322. width: "5.5em",
  4323. borderColor: hasError(value) ? "#f55" : void 0,
  4324. },
  4325. maxlength: 20,
  4326. value: function_pipe(
  4327. value,
  4328. Editable_text,
  4329. getOrElse(constant(Editable_value(value)))
  4330. ),
  4331. ...action,
  4332. }),
  4333. setEditInt = editing => value => state =>
  4334. function_pipe(
  4335. value,
  4336. Number.parseInt,
  4337. editing
  4338. ? x =>
  4339. Number.isNaN(x) || "." === value.at(-1)
  4340. ? function_pipe(state, setText(value))
  4341. : fromValueText(x)(value)
  4342. : x =>
  4343. Number.isNaN(x)
  4344. ? function_pipe(
  4345. state,
  4346. mapSnd(constant(Option_of([value, Option_of("")])))
  4347. )
  4348. : Editable_of(x)
  4349. ),
  4350. intNode = (label, min, max, step) => c => s =>
  4351. settingRow(
  4352. getText(label)(s.lang),
  4353. errorText(getText("inputNonNumberic")(s.lang))(s[label]),
  4354. [
  4355. rangeRow(
  4356. min,
  4357. max,
  4358. step,
  4359. editAction(label, setEditInt)(c)
  4360. )(getState(label)(s)),
  4361. ]
  4362. ),
  4363. fonts = currentFont => [
  4364. ["", "Default", "デフォルト"],
  4365. ["arial", "Arial", "Arial"],
  4366. ["arial black", "Arial Black", "Arial Black"],
  4367. ["arial narrow", "Arial Narrow", "Arial Narrow"],
  4368. ["Century", "Century", "Century"],
  4369. ["Comic Sans MS", "Comic Sans MS", "Comic Sans MS"],
  4370. ["Courier", "Courier", "Courier"],
  4371. ["cursive", "cursive", "cursive"],
  4372. ["fantasy", "fantasy", "fantasy"],
  4373. ["Impact", "Impact", "Impact"],
  4374. ["Meiryo", "Meiryo", "メイリオ"],
  4375. ["Meiryo UI", "Meiryo UI", "メイリオ UI"],
  4376. ["monospace", "monospace", "monospace"],
  4377. ["Monotype Corsiva", "Monotype Corsiva", "Monotype Corsiva"],
  4378. ["MS PGothic", "MS PGothic", "MS Pゴシック"],
  4379. ["MS Gothic", "MS Gothic", "MS ゴシック"],
  4380. ["MS Sans Serif", "MS Sans Serif", "MS Sans Serif"],
  4381. ["MS Serif", "MS Serif", "MS Serif"],
  4382. ["MS UI Gothic", "MS UI Gothic", "MS UI Gothic"],
  4383. ["sans-serif", "Sans-serif", "Sans-serif"],
  4384. ["serif", "Serif", "Serif"],
  4385. ["Times New Roman", "Times New Roman", "Times New Roman"],
  4386. ["Yu Gothic", "Yu Gothic", "遊ゴシック"],
  4387. ["YuGothic", "YuGothic", "游ゴシック体"],
  4388. [currentFont, "Custom", "カスタム"],
  4389. ],
  4390. setEditString = editing =>
  4391. function_flow(x =>
  4392. constant(editing ? fromValueText(x)(x) : Editable_of(x))
  4393. ),
  4394. settingUI_textRowStyle = { width: "70%", boxSizing: "border-box" },
  4395. ui_option = (value, label, selected) =>
  4396. h("option", { value, selected }, hyperapp_text(label)),
  4397. exampleTextStyle = s => ({
  4398. fontFamily: Editable_value(s.font),
  4399. fontWeight: Editable_value(s.fontWeight).toString(),
  4400. textShadow: textShadow(Editable_value(s.shadowColor))(
  4401. Editable_value(s.shadowFontWeight)
  4402. ),
  4403. }),
  4404. colorTextOutput = textStyle => color =>
  4405. h(
  4406. "span",
  4407. { style: { ...textStyle, color } },
  4408. hyperapp_text("Aa1あア亜")
  4409. ),
  4410. textColorNode = label => c => s =>
  4411. settingRow(
  4412. getText(label)(s.lang),
  4413. errorText(getText("invalidColor")(s.lang))(s[label]),
  4414. function_pipe(
  4415. {
  4416. a: editAction(label, setEditColor)(c),
  4417. v: Editable_value(s[label]),
  4418. },
  4419. ({ a, v }) => [
  4420. colorPicker(a)(v),
  4421. textInput(a)(s[label]),
  4422. colorTextOutput(exampleTextStyle(s))(v),
  4423. ]
  4424. )
  4425. ),
  4426. flowChatPanel = function_pipe(
  4427. [
  4428. function_pipe(
  4429. [
  4430. c => s =>
  4431. function_pipe(Editable_value(s.font), font =>
  4432. settingRow(getText("font")(s.lang), "", [
  4433. h(
  4434. "select",
  4435. {
  4436. style: settingUI_textRowStyle,
  4437. onchange: updateInput(setEditString(!1))("font")(c),
  4438. },
  4439. function_pipe(
  4440. fonts(font),
  4441. findIndex(x => x[0] === font),
  4442. getOrElse(() => 0),
  4443. index =>
  4444. function_pipe(
  4445. fonts(font),
  4446. es6_ReadonlyArray_mapWithIndex((i, f) =>
  4447. ui_option(
  4448. f[0],
  4449. function_pipe(
  4450. languages,
  4451. findIndex(x => x === s.lang),
  4452. es6_Option_map(x => f[x + 1]),
  4453. getOrElse(() => "Error")
  4454. ),
  4455. i === index
  4456. )
  4457. )
  4458. )
  4459. )
  4460. ),
  4461. h("input", {
  4462. style: settingUI_textRowStyle,
  4463. maxlength: 20,
  4464. value: font,
  4465. ...editAction("font", setEditString),
  4466. }),
  4467. ])
  4468. ),
  4469. textColorNode("color"),
  4470. textColorNode("ownerColor"),
  4471. textColorNode("moderatorColor"),
  4472. textColorNode("memberColor"),
  4473. ((label = "shadowColor"),
  4474. c => s =>
  4475. settingRow(
  4476. getText(label)(s.lang),
  4477. errorText(getText("invalidColor")(s.lang))(s[label]),
  4478. function_pipe(editAction(label, setEditColor)(c), x => [
  4479. colorPicker(x)(Editable_value(s[label])),
  4480. textInput(x)(s[label]),
  4481. ])
  4482. )),
  4483. ],
  4484. Reader_sequenceArray,
  4485. es6_Reader_map(Reader_sequenceArray),
  4486. es6_Reader_map(
  4487. es6_Reader_map(x => h("div", { style: panelBoxStyle(212) }, x))
  4488. )
  4489. ),
  4490. function_pipe(
  4491. [
  4492. numberNode("chatOpacity", 0, 1, 0.05),
  4493. numberNode("fontSize", 0.3, 2, 0.05),
  4494. numberNode("fontWeight", 10, 1e3, 10),
  4495. numberNode("shadowFontWeight", 0, 3, 0.1),
  4496. numberNode("flowSpeed", 1, 50, 1),
  4497. intNode("maxChatCount", 5, 200, 5),
  4498. intNode("maxChatLength", 5, 200, 5),
  4499. intNode("laneCount", 1, 25, 1),
  4500. ],
  4501. Reader_sequenceArray,
  4502. es6_Reader_map(Reader_sequenceArray),
  4503. es6_Reader_map(
  4504. es6_Reader_map(x => h("div", { style: panelBoxStyle(212) }, x))
  4505. )
  4506. ),
  4507. function_pipe(
  4508. [
  4509. numberNode("flowY1", 0, 0.95, 0.01),
  4510. numberNode("flowY2", 0.05, 1, 0.01),
  4511. numberNode("flowX1", 0, 0.95, 0.01),
  4512. numberNode("flowX2", 0.05, 1, 0.01),
  4513. numberNode("minSpacing", 0, 2.5, 0.1),
  4514. c => s =>
  4515. h("div", {}, [
  4516. checkboxNode("useStepTiming")(c)(s),
  4517. h(
  4518. "div",
  4519. {
  4520. style: {
  4521. opacity: getState("useStepTiming")(s) ? void 0 : "0.5",
  4522. },
  4523. },
  4524. intNode("timingStepCount", 1, 400, 1)(c)(s)
  4525. ),
  4526. ]),
  4527. checkboxNode("createChats"),
  4528. checkboxNode("displayModName"),
  4529. checkboxNode("displaySuperChatAuthor"),
  4530. checkboxNode("textOnly"),
  4531. () => s => hyperapp_text(getText("flowNewChatIf")(s.lang)),
  4532. checkboxNode("noOverlap"),
  4533. buttonNode("clearFlowChats"),
  4534. ],
  4535. Reader_sequenceArray,
  4536. es6_Reader_map(Reader_sequenceArray),
  4537. es6_Reader_map(
  4538. es6_Reader_map(x => h("div", { style: panelBoxStyle(212) }, x))
  4539. )
  4540. ),
  4541. ],
  4542. Reader_sequenceArray,
  4543. es6_Reader_map(Reader_sequenceArray)
  4544. )
  4545. var label
  4546. const settingUI_flowChatPanel = flowChatPanel,
  4547. setString = function_flow(function_identity, constant),
  4548. simpleWrap = (comp, init) =>
  4549. function_pipe(
  4550. () => document.createElement(comp.tag),
  4551. chain(node => () => ({
  4552. node,
  4553. dispatch: app({ init, view: comp.view, node }),
  4554. }))
  4555. ),
  4556. toggleSettingsPanelButton = function_flow(
  4557. syncSettingState => (x, e) =>
  4558. function_pipe({ ...x, showPanel: !x.showPanel }, newState => [
  4559. newState,
  4560. x.showPanel
  4561. ? () => tapIs(HTMLElement)(e.currentTarget).blur()
  4562. : () => {},
  4563. syncSettingState(newState),
  4564. ]),
  4565. toggle => state =>
  4566. h(
  4567. "button",
  4568. {
  4569. class: "fyc_button",
  4570. style: {
  4571. background: "rgba(0,0,0,0)",
  4572. marginLeft: "10px",
  4573. whiteSpace: "nowrap",
  4574. },
  4575. onclick: toggle,
  4576. },
  4577. [
  4578. h(
  4579. "svg",
  4580. {
  4581. preserveAspectRatio: "xMidYMid meet",
  4582. viewBox: "0 0 640 640",
  4583. width: "15",
  4584. height: "15",
  4585. style: { position: "relative", top: "1px" },
  4586. },
  4587. [
  4588. h(
  4589. "defs",
  4590. {},
  4591. h("path", {
  4592. id: "d1TbzTC1zI",
  4593. d: "M135 58c25 14 67 30 82 35-7 49 16 109-15 149-50 71-19 184 64 213 74 31 165-18 183-95-3-38 23-62 58-36l120 55c-39 10-106 35-72 85 40 38 1 71-29 98-29 53-70-17-109-5-46 22-25 109-96 85h-55c-24-31-21-103-80-84-32 32-70 31-93-9l-35-36c4-40 57-96-6-120-45 5-58-32-52-68 2-19-4-41 3-59 35-15 100-22 77-79-48-43 1-84 35-115 5-6 12-12 20-14zM577 2c52 3 72 62 62 106-5 51 19 117-27 155-18 24 8 49 11 74-39-8-98-46-146-60-55-1-111 2-167-2-52-15-57-76-52-121S242 52 282 18c38-30 88-11 132-16h163z",
  4594. })
  4595. ),
  4596. h("use", {
  4597. href: "#d1TbzTC1zI",
  4598. opacity: "1",
  4599. fill: "var(--iron-icon-fill-color, currentcolor)",
  4600. "fill-opacity": "1",
  4601. }),
  4602. ]
  4603. ),
  4604. h(
  4605. "span",
  4606. {
  4607. style: {
  4608. position: "relative",
  4609. top: "-2px",
  4610. marginLeft: "8px,",
  4611. },
  4612. },
  4613. hyperapp_text(getText("setting")(state.lang))
  4614. ),
  4615. ]
  4616. )
  4617. ),
  4618. toggleSettingsPanelComponent = function_flow(
  4619. toggleSettingsPanelButton,
  4620. button =>
  4621. makeComponent(
  4622. tag => s => h(tag, { style: { display: "flex" } }, button(s))
  4623. )("span")
  4624. ),
  4625. initialize = () =>
  4626. function_pipe(
  4627. defaultUserConfig,
  4628. function_flow(
  4629. es6_Task_map(x => {
  4630. return {
  4631. userConfig: x,
  4632. configKeys: Object.keys(x),
  4633. getConfig:
  4634. ((config = x),
  4635. function_pipe(
  4636. Object.keys(config),
  4637. es6_ReadonlyArray_map(x => [x, () => config[x].val]),
  4638. Object.fromEntries
  4639. )),
  4640. }
  4641. var config
  4642. }),
  4643. Task_let_("mainState", x => ({
  4644. chatPlaying: !0,
  4645. playerRect: new DOMRectReadOnly(0, 0, 600, 400),
  4646. getConfig: x.getConfig,
  4647. })),
  4648. Task_let_("configSubject", ctx =>
  4649. function_pipe(
  4650. ctx.configKeys,
  4651. es6_ReadonlyArray_map(x => [
  4652. x,
  4653. new external_rxjs_namespaceObject.Subject(),
  4654. ]),
  4655. Object.fromEntries
  4656. )
  4657. ),
  4658. Task_let_("setConfigPlain", ctx =>
  4659. function_pipe(
  4660. ctx.configKeys,
  4661. es6_ReadonlyArray_map(x => [
  4662. x,
  4663. val => async () => {
  4664. ctx.userConfig[x].val = val
  4665. ctx.configSubject[x].next(val)
  4666. },
  4667. ]),
  4668. Object.fromEntries
  4669. )
  4670. ),
  4671. Task_apS(
  4672. "channel",
  4673. Task_of(
  4674. new broadcast_channel_BroadcastChannel("fyc-0615654655528523")
  4675. )
  4676. ),
  4677. Task_let_("setConfig", ctx =>
  4678. function_pipe(
  4679. ctx.configKeys,
  4680. es6_ReadonlyArray_map(x => [
  4681. x,
  4682. val => async () => {
  4683. if (fast_deep_equal_default()(ctx.getConfig[x](), val))
  4684. return
  4685. ctx.setConfigPlain[x](val)()
  4686. ctx.channel.postMessage([x, val])
  4687. const item = ctx.userConfig[x]
  4688. GM.setValue(item.gmKey, item.toGm(val))
  4689. },
  4690. ]),
  4691. Object.fromEntries
  4692. )
  4693. )
  4694. ),
  4695. function_flow(
  4696. Task_apS(
  4697. "reinitSubject",
  4698. Task_fromIO(() => new external_rxjs_namespaceObject.Subject())
  4699. ),
  4700. Task_let_("reinitialize", ctx => () => {
  4701. requestAnimationFrame(() => lib(ctx.reinitSubject)())
  4702. }),
  4703. Task_let_("toggleChatButtonInit", ctx => ({
  4704. lang: ctx.getConfig.lang(),
  4705. displayChats: ctx.getConfig.displayChats(),
  4706. })),
  4707. Task_let_("wrappedToggleChat", ctx => {
  4708. return simpleWrap(
  4709. ((setConfig = ctx.setConfig),
  4710. function_pipe(
  4711. "button",
  4712. makeComponent(
  4713. tag => state =>
  4714. function_pipe(
  4715. getText(state.displayChats ? "hideChat" : "showChat")(
  4716. state.lang
  4717. ),
  4718. label =>
  4719. h(
  4720. tag,
  4721. {
  4722. class: "ytp-button",
  4723. style: {
  4724. background: "none",
  4725. border: "none",
  4726. cursor: "pointer",
  4727. float: "left",
  4728. fontSize: "1em",
  4729. height: "4em",
  4730. outline: "none",
  4731. overflow: "visible",
  4732. padding: "0 0 0em",
  4733. position: "relative",
  4734. width: "3em",
  4735. },
  4736. type: "button",
  4737. "aria-label": label,
  4738. title: label,
  4739. onclick: s =>
  4740. function_pipe(!s.displayChats, displayChats => [
  4741. { ...s, displayChats },
  4742. setConfig.displayChats(displayChats),
  4743. ]),
  4744. },
  4745. [
  4746. h(
  4747. "svg",
  4748. {
  4749. style: { width: "100%" },
  4750. viewBox: "0 0 36 36",
  4751. },
  4752. [
  4753. h("path", {
  4754. class: "chat-button-path",
  4755. d: "m11 12h17q1 0 1 1v9q0 1-1 1h-1v2l-4-2h-12q-1 0-1-1v-9q0-1 1-1z",
  4756. fill: "#fff",
  4757. "fill-opacity": state.displayChats
  4758. ? "1"
  4759. : "0",
  4760. stroke: "#fff",
  4761. "stroke-width": "2",
  4762. }),
  4763. ]
  4764. ),
  4765. ]
  4766. )
  4767. )
  4768. )
  4769. )),
  4770. ctx.toggleChatButtonInit
  4771. )()
  4772. var setConfig
  4773. }),
  4774. Task_apS("flowChats", Task_of([])),
  4775. Task_apS("settingUpdateApps", Task_of([])),
  4776. Task_let_(
  4777. "updateSettingState",
  4778. ctx => dispatchable =>
  4779. function_pipe(
  4780. ctx.settingUpdateApps,
  4781. es6_ReadonlyArray_map(x => () => x(dispatchable)),
  4782. sequenceArray
  4783. )
  4784. ),
  4785. Task_let_("wrappedSettings", ctx =>
  4786. simpleWrap(
  4787. function_pipe(
  4788. (c =>
  4789. function_flow(state =>
  4790. state.showPanel
  4791. ? h(
  4792. "div",
  4793. {
  4794. class: "fyc_panel",
  4795. style: {
  4796. backgroundColor: "rgba(30,30,30,0.9)",
  4797. position: "absolute",
  4798. zIndex: "10000",
  4799. color: "#fff",
  4800. fontSize: "14px",
  4801. overflow: "auto",
  4802. left: `${state.panelRect.x}px`,
  4803. top: `${state.panelRect.y}px`,
  4804. width: `${state.panelRect.width}px`,
  4805. height: `${state.panelRect.height}px`,
  4806. border: "solid 1px #666",
  4807. fontFamily: "MS PGothic",
  4808. lineHeight: "1.2",
  4809. colorScheme: "dark",
  4810. },
  4811. },
  4812. [
  4813. h(
  4814. "div",
  4815. {
  4816. style: {
  4817. position: "absolute",
  4818. inset: "3px 3px auto auto",
  4819. },
  4820. },
  4821. [
  4822. hyperapp_text("🌐"),
  4823. h(
  4824. "select",
  4825. {
  4826. onchange:
  4827. updateInput(setString)("lang")(c),
  4828. },
  4829. function_pipe(
  4830. languages,
  4831. es6_ReadonlyArray_mapWithIndex(
  4832. (i, lang) =>
  4833. ui_option(
  4834. lang,
  4835. languageLabels[i],
  4836. lang === state.lang
  4837. )
  4838. )
  4839. )
  4840. ),
  4841. ]
  4842. ),
  4843. tabContainer({
  4844. container: { height: "364px" },
  4845. label: { padding: "6px" },
  4846. labelFocus: { background: "#666" },
  4847. tab: { display: "flex", padding: "6px" },
  4848. })((s, n) =>
  4849. settingUI_updateAt("mainTab", n)(c)(s)
  4850. )(
  4851. function_pipe(
  4852. [
  4853. "flowChat",
  4854. "chatFilter",
  4855. "chatField",
  4856. "feedback",
  4857. ],
  4858. es6_ReadonlyArray_map(getText),
  4859. es6_ReadonlyArray_map(apply(state.lang))
  4860. )
  4861. )(
  4862. function_pipe(
  4863. [
  4864. settingUI_flowChatPanel,
  4865. filterPanelOld,
  4866. settingUI_chatFieldPanel,
  4867. feedbackPanel,
  4868. ],
  4869. es6_ReadonlyArray_map(apply(c)),
  4870. es6_ReadonlyArray_map(constant),
  4871. es6_ReadonlyArray_map(src_flip),
  4872. es6_ReadonlyArray_map(apply(state))
  4873. )
  4874. )(getState("mainTab")(state)),
  4875. ]
  4876. )
  4877. : h("div", {})
  4878. ))({
  4879. setConfig: ctx.setConfig,
  4880. act: {
  4881. clearFlowChats: Task_fromIO(
  4882. removeOldChats(0)(ctx.flowChats)
  4883. ),
  4884. },
  4885. }),
  4886. panel =>
  4887. makeComponent(
  4888. tag => s =>
  4889. h(tag, { style: { display: "contents" } }, panel(s))
  4890. )("span")
  4891. ),
  4892. settingStateInit(ctx.getConfig)
  4893. )()
  4894. ),
  4895. Task_let_("wrappedToggleSettings", ctx =>
  4896. simpleWrap(
  4897. toggleSettingsPanelComponent(ctx.updateSettingState),
  4898. settingStateInit(ctx.getConfig)
  4899. )()
  4900. )
  4901. ),
  4902. function_flow(
  4903. Task_chainFirstIOK(
  4904. ctx => () =>
  4905. ctx.settingUpdateApps.push(
  4906. ctx.wrappedSettings.dispatch,
  4907. ctx.wrappedToggleSettings.dispatch
  4908. )
  4909. ),
  4910. Task_apS(
  4911. "settingsRectSubject",
  4912. Task_of(
  4913. new external_rxjs_namespaceObject.BehaviorSubject(
  4914. new DOMRectReadOnly(0, 0, 660, 395)
  4915. )
  4916. )
  4917. ),
  4918. Task_let_(
  4919. "updateSettingsRect",
  4920. ctx => last =>
  4921. function_pipe(
  4922. () => ctx.wrappedToggleSettings.node,
  4923. IO_map(fromPredicate(x => null !== x.offsetParent)),
  4924. IOOption_map(x => x.getBoundingClientRect()),
  4925. IOOption_map(
  4926. x =>
  4927. new DOMRectReadOnly(
  4928. Math.max(0, x.right + window.scrollX - 660),
  4929. Math.max(0, x.y + window.scrollY - 395),
  4930. 660,
  4931. Math.min(x.y + window.scrollY, 395)
  4932. )
  4933. ),
  4934. IOOption_alt(() =>
  4935. IOOption_of(new DOMRectReadOnly(-660, -395, 660, 395))
  4936. ),
  4937. IOOption_filter(
  4938. x =>
  4939. x.x !== last.x ||
  4940. x.y !== last.y ||
  4941. x.width !== last.width ||
  4942. x.height !== last.height
  4943. ),
  4944. IOOption_chainFirstIOK(
  4945. x => () => ctx.settingsRectSubject.next(x)
  4946. ),
  4947. IO_apSecond(() => {})
  4948. )
  4949. ),
  4950. Task_let_(
  4951. "mainLog",
  4952. ctx => x =>
  4953. ctx.updateSettingState(s => ({
  4954. ...s,
  4955. eventLog: appendLog(s.eventLog)(x),
  4956. }))
  4957. ),
  4958. Task_let_("mixLog", ctx =>
  4959. function_pipe(
  4960. [ctx.mainLog, consoleLog],
  4961. Reader_sequenceArray,
  4962. es6_Reader_map(sequenceArray)
  4963. )
  4964. )
  4965. ),
  4966. Task_chainFirstIOK(ctx =>
  4967. function_pipe(
  4968. [
  4969. ["Version", "1.15.15"],
  4970. ["User Agent", window.navigator.userAgent],
  4971. ["UserConfig", JSON.stringify(ctx.userConfig)],
  4972. ],
  4973. es6_ReadonlyArray_map(ctx.mainLog),
  4974. sequenceArray
  4975. )
  4976. ),
  4977. Task_let_("cs", ctx =>
  4978. function_pipe(
  4979. ctx.configSubject,
  4980. x => Object.entries(x),
  4981. es6_ReadonlyArray_map(([k, value]) => [
  4982. k,
  4983. function_pipe(
  4984. value,
  4985. (0, external_rxjs_namespaceObject.tap)(v =>
  4986. function_pipe(
  4987. v,
  4988. x => s => ({ ...s, [k]: x }),
  4989. of,
  4990. IO_chainFirst(() => {
  4991. return ctx.updateSettingState(
  4992. ((key = k),
  4993. value => state => ({
  4994. ...state,
  4995. [key]: isEditable(key)(value)
  4996. ? setValue(value)(state[key])
  4997. : "filterExp" === key
  4998. ? function_pipe(
  4999. EditableExpression_fromJsepExp(value),
  5000. getOrElseW(() => ({
  5001. type: "Compound",
  5002. body: [],
  5003. }))
  5004. )
  5005. : value,
  5006. }))(v)
  5007. )
  5008. var key
  5009. }),
  5010. chain(x =>
  5011. k in ctx.toggleChatButtonInit
  5012. ? () => ctx.wrappedToggleChat.dispatch(x)
  5013. : () => {}
  5014. ),
  5015. x => () => requestAnimationFrame(x)
  5016. )()
  5017. )
  5018. ),
  5019. ]),
  5020. Object.fromEntries
  5021. )
  5022. ),
  5023. Task_apS("livePage", Task_of(livePageYt)),
  5024. Task_let_("live", ctx => {
  5025. return (
  5026. (livePage = ctx.livePage),
  5027. function_pipe(
  5028. Object.keys(livePage),
  5029. es6_ReadonlyArray_map(x => [
  5030. x,
  5031. { ele: Option_none, read: livePage[x] },
  5032. ]),
  5033. Object.fromEntries
  5034. )
  5035. )
  5036. var livePage
  5037. }),
  5038. Task_apS("chatScreen", Task_fromIO(createChatScreen)),
  5039. Task_let_("config$", ctx =>
  5040. function_pipe(ctx.cs, cs =>
  5041. (0, external_rxjs_namespaceObject.defer)(() =>
  5042. (0, external_rxjs_namespaceObject.merge)(
  5043. (0, external_rxjs_namespaceObject.merge)(
  5044. cs.bannedWordRegexs,
  5045. cs.bannedWords,
  5046. cs.bannedUsers
  5047. ),
  5048. function_pipe(
  5049. cs.fieldScale,
  5050. (0, external_rxjs_namespaceObject.startWith)(
  5051. ctx.getConfig.fieldScale()
  5052. ),
  5053. (0, external_rxjs_namespaceObject.tap)(scale =>
  5054. function_pipe(
  5055. ctx.live.chatField.ele,
  5056. fromOption,
  5057. IOOption_chainIOK(field =>
  5058. function_pipe(
  5059. [
  5060. function_pipe(
  5061. fromNullable(field.parentElement),
  5062. es6_Option_map(
  5063. x => () =>
  5064. Object.assign(x.style, {
  5065. transformOrigin:
  5066. (scale >= 1 ? "top" : "bottom") +
  5067. " left",
  5068. transform: `scale(${scale})`,
  5069. width: 100 / scale + "%",
  5070. height: 100 / scale + "%",
  5071. })
  5072. )
  5073. ),
  5074. function_pipe(
  5075. ctx.live.chatScroller.ele,
  5076. es6_Option_map(scroller => () => {
  5077. scroller.scrollTop = scroller.scrollHeight
  5078. })
  5079. ),
  5080. ],
  5081. ReadonlyArray_compact,
  5082. sequenceArray
  5083. )
  5084. )
  5085. )()
  5086. )
  5087. ),
  5088. function_pipe(
  5089. (0, external_rxjs_namespaceObject.merge)(
  5090. function_pipe(
  5091. (0, external_rxjs_namespaceObject.merge)(
  5092. cs.font,
  5093. cs.fontSize,
  5094. cs.fontWeight,
  5095. cs.laneCount,
  5096. cs.minSpacing,
  5097. cs.flowY1,
  5098. cs.flowY2,
  5099. function_pipe(
  5100. cs.flowX1,
  5101. (0, external_rxjs_namespaceObject.startWith)(
  5102. ctx.getConfig.flowX1()
  5103. ),
  5104. (0, external_rxjs_namespaceObject.tap)(x =>
  5105. Object.assign(ctx.chatScreen.style, {
  5106. left: 100 * x + "%",
  5107. width: 100 * (ctx.getConfig.flowX2() - x) + "%",
  5108. })
  5109. )
  5110. ),
  5111. function_pipe(
  5112. cs.flowX2,
  5113. (0, external_rxjs_namespaceObject.tap)(x =>
  5114. Object.assign(ctx.chatScreen.style, {
  5115. left: 100 * ctx.getConfig.flowX1() + "%",
  5116. width: 100 * (x - ctx.getConfig.flowX1()) + "%",
  5117. })
  5118. )
  5119. ),
  5120. cs.textOnly
  5121. ),
  5122. (0, external_rxjs_namespaceObject.map)(() => ({
  5123. render: !0,
  5124. setAnimation: !0,
  5125. }))
  5126. ),
  5127. function_pipe(
  5128. (0, external_rxjs_namespaceObject.merge)(
  5129. cs.color,
  5130. cs.ownerColor,
  5131. cs.moderatorColor,
  5132. cs.memberColor,
  5133. cs.shadowColor,
  5134. cs.chatOpacity,
  5135. cs.shadowFontWeight,
  5136. cs.displayChats
  5137. ),
  5138. (0, external_rxjs_namespaceObject.map)(() => ({
  5139. render: !0,
  5140. }))
  5141. ),
  5142. function_pipe(
  5143. cs.flowSpeed,
  5144. (0, external_rxjs_namespaceObject.map)(() => ({
  5145. setPlayState: !0,
  5146. }))
  5147. ),
  5148. function_pipe(
  5149. (0, external_rxjs_namespaceObject.merge)(
  5150. function_pipe(
  5151. cs.maxChatCount,
  5152. (0, external_rxjs_namespaceObject.tap)(x =>
  5153. removeOldChats(x)(ctx.flowChats)()
  5154. )
  5155. ),
  5156. cs.noOverlap,
  5157. cs.timingFunction
  5158. ),
  5159. (0, external_rxjs_namespaceObject.map)(() => ({
  5160. setAnimation: !0,
  5161. }))
  5162. )
  5163. ),
  5164. (0, external_rxjs_namespaceObject.throttleTime)(
  5165. 180,
  5166. void 0,
  5167. { leading: !0, trailing: !0 }
  5168. ),
  5169. (0, external_rxjs_namespaceObject.tap)(config =>
  5170. function_pipe(
  5171. ctx.flowChats,
  5172. es6_ReadonlyArray_filter(x => !x.animationEnded),
  5173. es6_ReadonlyArray_map(chat =>
  5174. function_pipe(
  5175. {
  5176. render: !1,
  5177. setAnimation: !1,
  5178. setPlayState: !1,
  5179. ...config,
  5180. },
  5181. x =>
  5182. function_pipe(
  5183. [
  5184. function_pipe(
  5185. renderChat(chat),
  5186. fromPredicate(() => x.render)
  5187. ),
  5188. function_pipe(
  5189. setChatAnimation(chat, ctx.flowChats),
  5190. fromPredicate(() => x.setAnimation),
  5191. alt(() =>
  5192. function_pipe(
  5193. setChatPlayState(chat),
  5194. fromPredicate(() => x.setPlayState)
  5195. )
  5196. )
  5197. ),
  5198. ],
  5199. ReadonlyArray_compact,
  5200. es6_ReadonlyArray_map(apply(ctx.mainState)),
  5201. sequenceArray
  5202. )
  5203. )
  5204. ),
  5205. sequenceArray
  5206. )()
  5207. )
  5208. ),
  5209. function_pipe(
  5210. cs.lang,
  5211. (0, external_rxjs_namespaceObject.tap)(lang =>
  5212. ctx.updateSettingState(x => ({ ...x, lang }))()
  5213. )
  5214. ),
  5215. cs.maxChatLength,
  5216. cs.simplifyChatField,
  5217. cs.createBanButton,
  5218. cs.createChats,
  5219. cs.displayModName,
  5220. cs.displaySuperChatAuthor,
  5221. cs.fieldScale,
  5222. function_pipe(
  5223. (0, external_rxjs_namespaceObject.merge)(
  5224. cs.bannedWords,
  5225. cs.bannedWordRegexs,
  5226. cs.bannedUsers
  5227. ),
  5228. (0, external_rxjs_namespaceObject.tap)(() => {
  5229. return ctx.setConfig.filterExp(
  5230. ((getConfig = ctx.getConfig),
  5231. external_jsep_default()(
  5232. `\nor([\nRA.some(\n flip(flow([inText, RA.some]))(${JSON.stringify(
  5233. getConfig.bannedWords()
  5234. )})\n)(RA.compact([\n messageText,\n paymentInfo\n])),\nRA.some(\n flip(flow([matchedByText, RA.some]))(${JSON.stringify(
  5235. getConfig.bannedWordRegexs()
  5236. )})\n)(RA.compact([\n messageText,\n paymentInfo\n])),\nO.exists(\n flip(flow([eqText, RA.some]))(${JSON.stringify(
  5237. getConfig.bannedUsers()
  5238. )})\n)(authorID)\n])\n`
  5239. ))
  5240. )()
  5241. var getConfig
  5242. })
  5243. )
  5244. )
  5245. )
  5246. )
  5247. ),
  5248. Task_bind("all$", ctx => {
  5249. return function_pipe(
  5250. {
  5251. eq: ((E = eqStrict),
  5252. {
  5253. equals: function (x, y) {
  5254. return (
  5255. x === y ||
  5256. (Option_isNone(x)
  5257. ? Option_isNone(y)
  5258. : !Option_isNone(y) && E.equals(x.value, y.value))
  5259. )
  5260. },
  5261. }).equals,
  5262. initDelay: 100,
  5263. urlDelay: 1700,
  5264. changeDetectInterval: 700,
  5265. bodyResizeDetectInterval: 300,
  5266. errorRetryInterval: 5e3,
  5267. liveElementKeys: Object.keys(ctx.livePage),
  5268. tapUpdateSettingsRect: ob =>
  5269. (0, external_rxjs_namespaceObject.switchMap)(value =>
  5270. function_pipe(
  5271. ctx.settingsRectSubject,
  5272. (0, external_rxjs_namespaceObject.first)(),
  5273. (0, external_rxjs_namespaceObject.tap)(x =>
  5274. ctx.updateSettingsRect(x)()
  5275. ),
  5276. (0, external_rxjs_namespaceObject.map)(() => value)
  5277. )
  5278. )(ob),
  5279. },
  5280. of,
  5281. IO_apS("css", mainCss),
  5282. IO_apS("documentMutationPair", observePair(MutationObserver)),
  5283. IO_apS("chatMutationPair", observePair(MutationObserver)),
  5284. IO_apS("playerResizePair", observePair(ResizeObserver)),
  5285. IO_apS("bodyResizePair", observePair(ResizeObserver)),
  5286. IO_map(c =>
  5287. function_pipe(
  5288. ctx.reinitSubject,
  5289. (0, external_rxjs_namespaceObject.observeOn)(
  5290. external_rxjs_namespaceObject.asyncScheduler
  5291. ),
  5292. (0, external_rxjs_namespaceObject.delay)(c.initDelay),
  5293. (0, external_rxjs_namespaceObject.tap)(ctx.mixLog(["Init"])),
  5294. (0, external_rxjs_namespaceObject.switchMap)(() =>
  5295. function_pipe(
  5296. (0, external_rxjs_namespaceObject.interval)(
  5297. c.changeDetectInterval
  5298. ),
  5299. c.tapUpdateSettingsRect,
  5300. (0, external_rxjs_namespaceObject.filter)(() =>
  5301. function_pipe(
  5302. c.liveElementKeys,
  5303. es6_ReadonlyArray_map(key =>
  5304. function_pipe(
  5305. ctx.live[key].read(),
  5306. fromPredicate(
  5307. newEle => !c.eq(ctx.live[key].ele, newEle)
  5308. ),
  5309. es6_Option_map(
  5310. function_flow(
  5311. of,
  5312. IO_chainFirst(x => () => {
  5313. ctx.live[key].ele = x
  5314. }),
  5315. IO_map(Option_isSome),
  5316. IO_map(x => `${key} ${x ? "found" : "lost"}`),
  5317. chain(x => ctx.mixLog([x]))
  5318. )
  5319. )
  5320. )
  5321. ),
  5322. ReadonlyArray_compact,
  5323. sequenceArray,
  5324. IO_map(ReadonlyArray_isNonEmpty)
  5325. )()
  5326. ),
  5327. (0, external_rxjs_namespaceObject.startWith)(0)
  5328. )
  5329. ),
  5330. (0, external_rxjs_namespaceObject.tap)(
  5331. ctx.mixLog(["Loading..."])
  5332. ),
  5333. (0, external_rxjs_namespaceObject.tap)(() => {
  5334. removeOldChats(0)(ctx.flowChats)()
  5335. c.documentMutationPair.observer.disconnect()
  5336. c.documentMutationPair.observer.observe(document, {
  5337. childList: !0,
  5338. subtree: !0,
  5339. })
  5340. c.chatMutationPair.observer.disconnect()
  5341. c.playerResizePair.observer.disconnect()
  5342. c.bodyResizePair.observer.disconnect()
  5343. document.head.append(c.css)
  5344. function_pipe(
  5345. [
  5346. function_pipe(
  5347. ctx.live.chatField.ele,
  5348. es6_Option_map(
  5349. function_flow(
  5350. of,
  5351. IO_chainFirst(setChatAppCss),
  5352. chain(
  5353. x => () =>
  5354. c.chatMutationPair.observer.observe(x, {
  5355. childList: !0,
  5356. })
  5357. )
  5358. )
  5359. )
  5360. ),
  5361. function_pipe(
  5362. ctx.live.chatTicker.ele,
  5363. es6_Option_map(
  5364. x => () =>
  5365. c.chatMutationPair.observer.observe(x, {
  5366. childList: !0,
  5367. })
  5368. )
  5369. ),
  5370. function_pipe(
  5371. ctx.live.player.ele,
  5372. es6_Option_map(
  5373. function_flow(
  5374. of,
  5375. IO_chainFirst(
  5376. x => () =>
  5377. c.playerResizePair.observer.observe(x)
  5378. ),
  5379. chain(x => () => x.prepend(ctx.chatScreen))
  5380. )
  5381. )
  5382. ),
  5383. function_pipe(
  5384. ctx.live.toggleChatBtnParent.ele,
  5385. es6_Option_map(
  5386. x => () => x.append(ctx.wrappedToggleChat.node)
  5387. )
  5388. ),
  5389. function_pipe(
  5390. ctx.live.settingsToggleNextElement.ele,
  5391. es6_Option_map(
  5392. x => () => x.before(ctx.wrappedToggleSettings.node)
  5393. )
  5394. ),
  5395. function_pipe(
  5396. ctx.live.settingsContainer.ele,
  5397. es6_Option_map(
  5398. function_flow(
  5399. of,
  5400. IO_chainFirst(
  5401. x => () => x.append(ctx.wrappedSettings.node)
  5402. )
  5403. )
  5404. )
  5405. ),
  5406. function_pipe(
  5407. document.body,
  5408. fromNullable,
  5409. es6_Option_map(
  5410. x => () => c.bodyResizePair.observer.observe(x)
  5411. )
  5412. ),
  5413. ],
  5414. ReadonlyArray_compact,
  5415. ReadonlyArray_append(
  5416. function_pipe(
  5417. ctx.live.video.ele,
  5418. filter(x => !x.paused),
  5419. alt(() => ctx.live.offlineSlate.ele),
  5420. Option_isSome,
  5421. x => () => {
  5422. ctx.mainState.chatPlaying = x
  5423. }
  5424. )
  5425. ),
  5426. sequenceArray
  5427. )()
  5428. }),
  5429. (0, external_rxjs_namespaceObject.switchMap)(() =>
  5430. (0, external_rxjs_namespaceObject.merge)(
  5431. function_pipe(
  5432. (0, external_rxjs_namespaceObject.fromEvent)(
  5433. ctx.channel,
  5434. "message"
  5435. ),
  5436. (0, external_rxjs_namespaceObject.tap)(([key, val]) =>
  5437. function_pipe(
  5438. [
  5439. "lang",
  5440. "bannedWords",
  5441. "bannedWordRegexs",
  5442. "bannedUsers",
  5443. "filterExp",
  5444. "simplifyChatField",
  5445. "createBanButton",
  5446. "fieldScale",
  5447. ],
  5448. x => x.includes(key),
  5449. x => (x ? ctx.setConfigPlain[key](val) : () => {})
  5450. )()
  5451. )
  5452. ),
  5453. ...function_pipe(
  5454. ctx.configKeys,
  5455. es6_ReadonlyArray_map(key =>
  5456. function_pipe(
  5457. ctx.cs[key],
  5458. (0, external_rxjs_namespaceObject.startWith)(
  5459. ctx.getConfig[key]()
  5460. ),
  5461. (0, external_rxjs_namespaceObject.bufferCount)(
  5462. 2,
  5463. 1
  5464. ),
  5465. (0, external_rxjs_namespaceObject.map)(([x, y]) =>
  5466. (0, external_DeepDiff_namespaceObject.diff)(x, y)
  5467. ),
  5468. (0, external_rxjs_namespaceObject.tap)(x =>
  5469. ctx.mainLog([
  5470. `Config ${key}`,
  5471. JSON.stringify(x, void 0, 2),
  5472. ])()
  5473. )
  5474. )
  5475. )
  5476. ),
  5477. ctx.config$,
  5478. function_pipe(
  5479. ctx.live.video.ele,
  5480. match(
  5481. () => external_rxjs_namespaceObject.EMPTY,
  5482. x => {
  5483. return function_pipe(
  5484. ((video = x),
  5485. function_pipe(
  5486. [["playing"], ["waiting", "pause"]],
  5487. es6_ReadonlyArray_mapWithIndex((i, x) => [
  5488. x,
  5489. 0 === i,
  5490. ]),
  5491. es6_ReadonlyArray_chain(([xs, b]) =>
  5492. function_pipe(
  5493. xs,
  5494. es6_ReadonlyArray_map(x => [x, b])
  5495. )
  5496. ),
  5497. es6_ReadonlyArray_map(([x, b]) =>
  5498. function_pipe(
  5499. (0,
  5500. external_rxjs_namespaceObject.fromEvent)(
  5501. video,
  5502. x
  5503. ),
  5504. (0, external_rxjs_namespaceObject.map)(
  5505. () => b
  5506. )
  5507. )
  5508. ),
  5509. x =>
  5510. (0, external_rxjs_namespaceObject.merge)(...x)
  5511. )),
  5512. (0, external_rxjs_namespaceObject.map)(
  5513. playing =>
  5514. playing ||
  5515. Option_isSome(ctx.live.offlineSlate.ele)
  5516. ),
  5517. (0, external_rxjs_namespaceObject.tap)(
  5518. chatPlaying =>
  5519. function_pipe(() => {
  5520. ctx.mainState.chatPlaying = chatPlaying
  5521. }, IO_apSecond(function_pipe(ctx.flowChats, es6_ReadonlyArray_map(setChatPlayState), es6_ReadonlyArray_map(apply(ctx.mainState)), sequenceArray)))()
  5522. )
  5523. )
  5524. var video
  5525. }
  5526. )
  5527. ),
  5528. function_pipe(
  5529. c.chatMutationPair.subject,
  5530. (0, external_rxjs_namespaceObject.map)(
  5531. onChatFieldMutate(
  5532. ctx.chatScreen,
  5533. ctx.flowChats,
  5534. ctx.mainState,
  5535. ctx.setConfig,
  5536. ctx.mainLog
  5537. )
  5538. ),
  5539. (0, external_rxjs_namespaceObject.tap)(x => x())
  5540. ),
  5541. function_pipe(
  5542. c.documentMutationPair.subject,
  5543. (0, external_rxjs_namespaceObject.map)(
  5544. () => window.location.href
  5545. ),
  5546. (0,
  5547. external_rxjs_namespaceObject.distinctUntilChanged)(),
  5548. (0, external_rxjs_namespaceObject.skip)(1),
  5549. c.tapUpdateSettingsRect,
  5550. (0, external_rxjs_namespaceObject.map)(x =>
  5551. sequenceArray([
  5552. ctx.mixLog(["URL Changed", x]),
  5553. removeOldChats(0)(ctx.flowChats),
  5554. ctx.mixLog([`Wait for ${c.urlDelay}ms...`]),
  5555. ])
  5556. ),
  5557. (0, external_rxjs_namespaceObject.tap)(x => x()),
  5558. (0, external_rxjs_namespaceObject.delay)(c.urlDelay),
  5559. (0, external_rxjs_namespaceObject.tap)(ctx.reinitialize)
  5560. ),
  5561. function_pipe(
  5562. c.playerResizePair.subject,
  5563. (0, external_rxjs_namespaceObject.throttleTime)(
  5564. 500,
  5565. void 0,
  5566. { leading: !0, trailing: !0 }
  5567. ),
  5568. (0, external_rxjs_namespaceObject.startWith)([]),
  5569. (0, external_rxjs_namespaceObject.map)(
  5570. () => ctx.live.player.ele
  5571. ),
  5572. (0, external_rxjs_namespaceObject.map)(
  5573. es6_Option_map(x => x.getBoundingClientRect())
  5574. ),
  5575. (0, external_rxjs_namespaceObject.tap)(x => {
  5576. return (
  5577. (rect = x),
  5578. (flowChats = ctx.flowChats),
  5579. (mainState = ctx.mainState),
  5580. (mainLog = ctx.mainLog),
  5581. function_pipe(
  5582. rect,
  5583. match(
  5584. () => () => {},
  5585. x => () => {
  5586. mainLog(["Resize detected"])()
  5587. mainState.playerRect = x
  5588. flowChats.forEach(chat => {
  5589. renderChat(chat)(mainState)()
  5590. setChatAnimation(
  5591. chat,
  5592. flowChats
  5593. )(mainState)()
  5594. })
  5595. }
  5596. )
  5597. )()
  5598. )
  5599. var rect, flowChats, mainState, mainLog
  5600. })
  5601. ),
  5602. function_pipe(
  5603. c.bodyResizePair.subject,
  5604. (0, external_rxjs_namespaceObject.throttleTime)(
  5605. c.bodyResizeDetectInterval,
  5606. void 0,
  5607. { leading: !0, trailing: !0 }
  5608. ),
  5609. (0, external_rxjs_namespaceObject.startWith)([]),
  5610. c.tapUpdateSettingsRect
  5611. ),
  5612. function_pipe(
  5613. ctx.settingsRectSubject,
  5614. (0, external_rxjs_namespaceObject.tap)(panelRect =>
  5615. ctx.updateSettingState(s => ({ ...s, panelRect }))()
  5616. )
  5617. )
  5618. )
  5619. ),
  5620. (0, external_rxjs_namespaceObject.retry)({
  5621. delay: e =>
  5622. function_pipe(
  5623. e,
  5624. external_rxjs_namespaceObject.of,
  5625. (0, external_rxjs_namespaceObject.tap)(
  5626. ctx.mixLog(["Errored", e])
  5627. ),
  5628. (0, external_rxjs_namespaceObject.delay)(
  5629. c.errorRetryInterval
  5630. ),
  5631. (0, external_rxjs_namespaceObject.tap)(ctx.reinitialize)
  5632. ),
  5633. })
  5634. )
  5635. ),
  5636. Task_fromIO
  5637. )
  5638. var E
  5639. }),
  5640. Task_chainFirstIOK(
  5641. ctx => () =>
  5642. ctx.all$.subscribe({
  5643. error: x => ctx.mixLog(["Stream error", x])(),
  5644. complete: ctx.mixLog(["Stream complete"]),
  5645. })
  5646. ),
  5647. Task_chainFirstIOK(ctx => ctx.reinitialize)
  5648. )()
  5649. ;(async () => {
  5650. external_log_namespaceObject.setLevel("info")
  5651. try {
  5652. await initialize()
  5653. } catch (error) {
  5654. external_log_namespaceObject.info("【FYC】 Error", error)
  5655. }
  5656. })()
  5657. })()
  5658. })()