billy-herrington-utils 1.4.5 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -331,13 +331,13 @@ function objectToFormData(object) {
331
331
  class InfiniteScroller {
332
332
  constructor({
333
333
  enabled = true,
334
- delay = 350,
334
+ delay = 300,
335
335
  writeHistory = false,
336
336
  paginationOffset,
337
337
  paginationLast,
338
338
  paginationElement,
339
339
  paginationUrlGenerator,
340
- handleHtmlCallback,
340
+ parseData,
341
341
  alternativeGenerator,
342
342
  intersectionObservable
343
343
  }) {
@@ -347,7 +347,7 @@ class InfiniteScroller {
347
347
  __publicField(this, "paginationOffset");
348
348
  __publicField(this, "paginationLast");
349
349
  __publicField(this, "writeHistory");
350
- __publicField(this, "handleHtmlCallback");
350
+ __publicField(this, "parseData");
351
351
  __publicField(this, "onScrollCBs", []);
352
352
  __publicField(this, "generatorConsumer", async () => {
353
353
  if (!this.enabled) return false;
@@ -356,7 +356,7 @@ class InfiniteScroller {
356
356
  const nextPageHTML = await fetchHtml(url);
357
357
  const prevScrollPos = document.documentElement.scrollTop;
358
358
  this.paginationOffset = offset;
359
- this.handleHtmlCallback(nextPageHTML);
359
+ this.parseData(nextPageHTML);
360
360
  this._onScroll();
361
361
  window.scrollTo(0, prevScrollPos);
362
362
  if (this.writeHistory) {
@@ -370,7 +370,7 @@ class InfiniteScroller {
370
370
  this.writeHistory = writeHistory;
371
371
  this.paginationOffset = paginationOffset;
372
372
  this.paginationLast = paginationLast;
373
- this.handleHtmlCallback = handleHtmlCallback;
373
+ this.parseData = parseData;
374
374
  this.paginationGenerator = alternativeGenerator?.() ?? InfiniteScroller.createPaginationGenerator(
375
375
  paginationOffset,
376
376
  paginationLast,
@@ -396,12 +396,13 @@ class InfiniteScroller {
396
396
  }
397
397
  }
398
398
  }
399
- function createInfiniteScroller(store, handleHtmlCallback, rules) {
399
+ function createInfiniteScroller(store, parseData, rules) {
400
400
  const enabled = store.state.infiniteScrollEnabled;
401
401
  const iscroller = new InfiniteScroller({
402
402
  enabled,
403
- handleHtmlCallback,
404
- ...rules
403
+ parseData,
404
+ ...rules,
405
+ ...rules.paginationStrategy
405
406
  }).onScroll(({ paginationLast, paginationOffset }) => {
406
407
  store.localState.pagIndexLast = paginationLast;
407
408
  store.localState.pagIndexCur = paginationOffset;
@@ -411,6 +412,240 @@ function createInfiniteScroller(store, handleHtmlCallback, rules) {
411
412
  });
412
413
  return iscroller;
413
414
  }
415
+ function getPaginationLinks(doc = document, url = location.href, pathnameSelector = /\/(page\/)?\d+\/?$/) {
416
+ const currentUrl = parseURL(url);
417
+ currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, "/");
418
+ const pageLinks = Array.from(
419
+ doc.querySelectorAll("a[href]") || [],
420
+ (a) => a.href
421
+ ).filter((h) => {
422
+ try {
423
+ const linkUrl = new URL(h.replace(/#$/, ""), doc.baseURI || currentUrl.origin);
424
+ return linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname);
425
+ } catch {
426
+ return false;
427
+ }
428
+ });
429
+ return pageLinks;
430
+ }
431
+ function parseURL(s) {
432
+ if (typeof s === "string") return new URL(s);
433
+ return new URL(s.href);
434
+ }
435
+ class PaginationStrategy {
436
+ constructor(options) {
437
+ __publicField(this, "doc", document);
438
+ __publicField(this, "url");
439
+ __publicField(this, "paginationSelector", ".pagination");
440
+ __publicField(this, "fixPaginationLast");
441
+ __publicField(this, "offsetMin", 1);
442
+ if (options) {
443
+ Object.entries(options).forEach(([k, v]) => {
444
+ Object.assign(this, { [k]: v });
445
+ });
446
+ }
447
+ this.url = parseURL(options?.url || this.doc.URL);
448
+ }
449
+ getPaginationElement() {
450
+ return this.doc.querySelector(this.paginationSelector) || this.doc;
451
+ }
452
+ getPaginationOffset() {
453
+ return this.offsetMin;
454
+ }
455
+ getPaginationLast() {
456
+ return this.offsetMin;
457
+ }
458
+ getPaginationUrlGenerator() {
459
+ return (_) => this.url.href;
460
+ }
461
+ }
462
+ function formatTimeToHHMMSS(timeString) {
463
+ const regex = /(?:(\d+)\s*h\s*)?(?:(\d+)\s*mi?n?\s*)?(?:(\d+)\s*sec)?/;
464
+ const match = timeString.match(regex);
465
+ const h = parseInt(match?.[1] || "0");
466
+ const m = parseInt(match?.[2] || "0");
467
+ const s = parseInt(match?.[3] || "0");
468
+ const pad = (num) => String(num).padStart(2, "0");
469
+ return `${pad(h)}:${pad(m)}:${pad(s)}`;
470
+ }
471
+ function timeToSeconds(t) {
472
+ const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;
473
+ return (r?.match(/\d+/gm) || [0]).reverse().map((s, i) => parseInt(s) * 60 ** i).reduce((a, b) => a + b);
474
+ }
475
+ function parseIntegerOr(n, or) {
476
+ return ((num) => Number.isNaN(num) ? or : num)(parseInt(n));
477
+ }
478
+ function parseDataParams(str) {
479
+ const paramsStr = decodeURI(str.trim()).split(";");
480
+ return paramsStr.reduce((acc, s) => {
481
+ const parsed = s.match(/([\+\w]+):([\w\-\ ]+)?/);
482
+ if (parsed) {
483
+ const [, key, value] = parsed;
484
+ if (value) {
485
+ key.split("+").forEach((p) => {
486
+ acc[p] = value;
487
+ });
488
+ }
489
+ }
490
+ return acc;
491
+ }, {});
492
+ }
493
+ function parseCSSUrl(s) {
494
+ return s.replace(/url\("|\"\).*/g, "");
495
+ }
496
+ class PaginationStrategyDataParams extends PaginationStrategy {
497
+ getPaginationLast() {
498
+ const links = this.getPaginationElement()?.querySelectorAll("[data-parameters *= from]");
499
+ const pages = Array.from(links || [], (l) => {
500
+ const p = l.getAttribute("data-parameters");
501
+ const v = p?.match(/from\w*:(\d+)/)?.[1] || this.offsetMin.toString();
502
+ return parseInt(v);
503
+ });
504
+ const lastPage = Math.max(...pages, this.offsetMin);
505
+ if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);
506
+ return lastPage;
507
+ }
508
+ getPaginationOffset() {
509
+ const link = this.getPaginationElement()?.querySelector(
510
+ ".prev[data-parameters *= from], .prev [data-parameters *= from]"
511
+ );
512
+ if (!link) return this.offsetMin;
513
+ const p = link.getAttribute("data-parameters");
514
+ const v = p?.match(/from\w*:(\d+)/)?.[1] || this.offsetMin.toString();
515
+ return parseInt(v);
516
+ }
517
+ getPaginationUrlGenerator() {
518
+ const url = new URL(this.url.href);
519
+ const parametersElement = this.getPaginationElement()?.querySelector(
520
+ "a[data-block-id][data-parameters]"
521
+ );
522
+ const block_id = parametersElement?.getAttribute("data-block-id") || "";
523
+ const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
524
+ const attrs = {
525
+ mode: "async",
526
+ function: "get_block",
527
+ block_id,
528
+ ...parameters
529
+ };
530
+ Object.keys(attrs).forEach((k) => {
531
+ url.searchParams.set(k, attrs[k]);
532
+ });
533
+ const paginationUrlGenerator = (n) => {
534
+ Object.keys(attrs).forEach((k) => {
535
+ k.includes("from") && url.searchParams.set(k, n.toString());
536
+ });
537
+ url.searchParams.set("_", Date.now().toString());
538
+ return url.href;
539
+ };
540
+ return paginationUrlGenerator;
541
+ }
542
+ }
543
+ class PaginationStrategyPathnameParams extends PaginationStrategy {
544
+ constructor() {
545
+ super(...arguments);
546
+ __publicField(this, "pathnameSelector", /\/(\d+)\/?$/);
547
+ __publicField(this, "extractPage", (a) => {
548
+ const href = typeof a === "string" ? a : a.href;
549
+ const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);
550
+ return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());
551
+ });
552
+ }
553
+ getPaginationLast() {
554
+ const links = getPaginationLinks(
555
+ this.getPaginationElement(),
556
+ this.url.href,
557
+ this.pathnameSelector
558
+ );
559
+ const pages = Array.from(links, this.extractPage);
560
+ const lastPage = Math.max(...pages, this.offsetMin);
561
+ if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);
562
+ return lastPage;
563
+ }
564
+ getPaginationOffset() {
565
+ return this.extractPage(this.url.href);
566
+ }
567
+ getPaginationUrlGenerator(url_ = this.url) {
568
+ const url = new URL(url_.href);
569
+ const pathnameSelectorPlaceholder = this.pathnameSelector.toString().replace(/[/|\\|$|?|(|)]+/g, "/");
570
+ if (!this.pathnameSelector.test(url.pathname)) {
571
+ url.pathname = url.pathname.concat(pathnameSelectorPlaceholder.replace(/d\+/, this.offsetMin.toString())).replace(/\/{2,}/g, "/");
572
+ }
573
+ const paginationUrlGenerator = (offset) => {
574
+ url.pathname = url.pathname.replace(
575
+ this.pathnameSelector,
576
+ pathnameSelectorPlaceholder.replace(/d\+/, offset.toString())
577
+ );
578
+ return url.href;
579
+ };
580
+ return paginationUrlGenerator;
581
+ }
582
+ }
583
+ class PaginationStrategySearchParams extends PaginationStrategy {
584
+ constructor() {
585
+ super(...arguments);
586
+ __publicField(this, "searchParamSelector", "page");
587
+ }
588
+ getPaginationElement() {
589
+ return this.doc.querySelector(this.paginationSelector) || this.doc;
590
+ }
591
+ extractPage(a) {
592
+ const href = typeof a === "string" ? a : a.href;
593
+ const p = new URL(href).searchParams.get(this.searchParamSelector);
594
+ return parseInt(p) || this.offsetMin;
595
+ }
596
+ getPaginationLast() {
597
+ const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter(
598
+ (h) => /(page|p)=\d+/.test(h)
599
+ );
600
+ const pages = links.map(this.extractPage);
601
+ const lastPage = Math.max(...pages, this.offsetMin);
602
+ if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);
603
+ return lastPage;
604
+ }
605
+ getPaginationOffset() {
606
+ if (this.doc === document) {
607
+ return this.extractPage(this.url);
608
+ }
609
+ const link = this.getPaginationElement().querySelector(
610
+ `a.active[href *= "${this.searchParamSelector}="]`
611
+ );
612
+ return this.extractPage(link);
613
+ }
614
+ getPaginationUrlGenerator() {
615
+ const url = new URL(this.url.href);
616
+ const paginationUrlGenerator = (offset) => {
617
+ url.searchParams.set(this.searchParamSelector, offset.toString());
618
+ return url.href;
619
+ };
620
+ return paginationUrlGenerator;
621
+ }
622
+ }
623
+ function getPaginationStrategy(options) {
624
+ const { doc = document, url = location.href } = options;
625
+ const pageLinks = getPaginationLinks(doc, url);
626
+ console.log({ pageLinks });
627
+ const getStrategy = () => {
628
+ if (pageLinks.some((h) => /(page|p)=\d+/.test(h))) {
629
+ const l = pageLinks.filter((h) => /(page|p)=\d+/.test(h));
630
+ console.log("PaginationStrategySearchParams", l);
631
+ return PaginationStrategySearchParams;
632
+ }
633
+ if (pageLinks.some((h) => /\/(page\/)?\d+\/?$/.test(h))) {
634
+ const l = pageLinks.filter((h) => /\/(page\/)?\d+\/?$/.test(h));
635
+ console.log("PaginationStrategyPathnameParams", l);
636
+ return PaginationStrategyPathnameParams;
637
+ }
638
+ const type5Links = Array.from(document.querySelectorAll("[data-parameters *= from]"));
639
+ if (type5Links.length > 0) {
640
+ console.log("PaginationStrategyDataParams", type5Links);
641
+ return PaginationStrategyDataParams;
642
+ }
643
+ console.error("Found No Strategy");
644
+ return PaginationStrategy;
645
+ };
646
+ const paginationStrategy = new (getStrategy())(options);
647
+ return paginationStrategy;
648
+ }
414
649
  function chunks(arr, n) {
415
650
  return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));
416
651
  }
@@ -513,40 +748,6 @@ class Tick {
513
748
  function circularShift(n, c = 6, s = 1) {
514
749
  return (n + s) % c || c;
515
750
  }
516
- function formatTimeToHHMMSS(timeString) {
517
- const regex = /(?:(\d+)\s*h\s*)?(?:(\d+)\s*mi?n?\s*)?(?:(\d+)\s*sec)?/;
518
- const match = timeString.match(regex);
519
- const h = parseInt(match?.[1] || "0");
520
- const m = parseInt(match?.[2] || "0");
521
- const s = parseInt(match?.[3] || "0");
522
- const pad = (num) => String(num).padStart(2, "0");
523
- return `${pad(h)}:${pad(m)}:${pad(s)}`;
524
- }
525
- function timeToSeconds(t) {
526
- const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;
527
- return (r?.match(/\d+/gm) || [0]).reverse().map((s, i) => parseInt(s) * 60 ** i).reduce((a, b) => a + b);
528
- }
529
- function parseIntegerOr(n, or) {
530
- return ((num) => Number.isNaN(num) ? or : num)(parseInt(n));
531
- }
532
- function parseDataParams(str) {
533
- const paramsStr = decodeURI(str.trim()).split(";");
534
- return paramsStr.reduce((acc, s) => {
535
- const parsed = s.match(/([\+\w]+):([\w\-\ ]+)?/);
536
- if (parsed) {
537
- const [, key, value] = parsed;
538
- if (value) {
539
- key.split("+").forEach((p) => {
540
- acc[p] = value;
541
- });
542
- }
543
- }
544
- return acc;
545
- }, {});
546
- }
547
- function parseCSSUrl(s) {
548
- return s.replace(/url\("|\"\).*/g, "");
549
- }
550
751
  export {
551
752
  AsyncPool,
552
753
  DataManager,
@@ -554,6 +755,10 @@ export {
554
755
  LazyImgLoader,
555
756
  MOBILE_UA,
556
757
  Observer,
758
+ PaginationStrategy,
759
+ PaginationStrategyDataParams,
760
+ PaginationStrategyPathnameParams,
761
+ PaginationStrategySearchParams,
557
762
  Tick,
558
763
  chunks,
559
764
  circularShift,
@@ -567,6 +772,7 @@ export {
567
772
  fetchWith,
568
773
  findNextSibling,
569
774
  getAllUniqueParents,
775
+ getPaginationStrategy,
570
776
  isMob,
571
777
  listenEvents,
572
778
  objectToFormData,
@@ -1 +1 @@
1
- {"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts","../src/utils/parsers/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n handleHtmlCallback: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private handleHtmlCallback: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 350,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n handleHtmlCallback,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.handleHtmlCallback = handleHtmlCallback;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.handleHtmlCallback(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n handleHtmlCallback: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n const iscroller = new InfiniteScroller({\n enabled,\n handleHtmlCallback,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n"],"names":["target","s","observer"],"mappings":"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"}
1
+ {"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n ...rules,\n ...rules.paginationStrategy,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":";;;AAAO,MAAM,SAAS;AAAA,EAEpB,YAAoB,UAAoC;AADjD;AACa,SAAA,WAAA;AAClB,SAAK,WAAW,IAAI,qBAAqB,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,EAAA;AAAA,EAG7E,QAAQ,QAAiB;AAClB,SAAA,SAAS,QAAQ,MAAM;AAAA,EAAA;AAAA,EAG9B,SAAS,QAAiB,cAAsB;AACzC,SAAA,SAAS,UAAU,MAAM;AAC9B,eAAW,MAAM,KAAK,SAAS,QAAQ,MAAM,GAAG,YAAY;AAAA,EAAA;AAAA,EAG9D,mBAAmB,SAA8C;AAC/D,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,gBAAgB;AACnB,aAAA,SAAS,MAAM,MAAM;AAAA,MAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAGF,OAAO,aACL,QACA,UACA,cACA;AACA,UAAM,YAAY,IAAI,SAAS,OAAOA,YAAoB;AAClD,YAAA,YAAY,MAAM,SAAS;AACjC,UAAI,UAAW,WAAU,SAASA,SAAQ,YAAY;AAAA,IAAA,CACvD;AACD,cAAU,QAAQ,MAAM;AACjB,WAAA;AAAA,EAAA;AAEX;AAEO,MAAM,cAAc;AAAA,EAIzB,YAAY,gBAA8C;AAHnD;AACC,yCAAgB;AAiBxB,oCAAW,CAAC,WAA6B;AAClC,WAAA,gBAAgB,SAAS,UAAU,MAAM;AAC9C,aAAO,MAAM,OAAO,aAAa,KAAK,aAAa;AAC5C,aAAA,gBAAgB,KAAK,aAAa;AAAA,IAC3C;AAlBE,SAAK,kBAAkB,IAAI,SAAS,CAAC,WAAoB;AACnD,UAAA,eAAe,MAAM,GAAG;AAC1B,aAAK,SAAS,MAA0B;AAAA,MAAA;AAAA,IAC1C,CACD;AAAA,EAAA;AAAA,EAGH,OAAO,SAAkB,KAAuB,QAAgB;AAC1D,QAAA,CAAC,OAAO,CAAC,OAAQ;AACjB,QAAA,aAAa,KAAK,eAAe,MAAM;AAC3C,QAAI,MAAM;AACL,SAAA,gBAAgB,QAAQ,GAAG;AAAA,EAAA;AAQpC;AC7DO,SAAS,cAAc,GAA0B;AACtD,SAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAAC,OAAKA,GAAE,OAAO,YAAY,CAAC,EAAE,OAAO,OAAK,CAAC;AACpE;AAEO,SAAS,YAAY,GAAW;AACrC,SAAO,GAAG,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,OAAO,YAAiB,KAAA;AAChF;ACkBA,MAAM,WAAW;AAAA,EAGf,YACU,OACA,OACR;AALK;AAkBP,wCAAe,MAAsB;AACnC,aAAO,CAAC,MAAmB;AACzB,cAAM,WAAW,CAAC,KAAK,MAAM,UAAU,EAAE,OAAsB;AACxD,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,gBAAgB;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,aAAO,CAAC,MAAmB;AACzB,cAAM,YAAY,KAAK,MAAM,UAAU,EAAE,OAAsB;AACxD,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,oCAAW,MAAsB;AAC/B,aAAO,CAAC,MAAmB;AACzB,cAAM,OAAO,KAAK,MAAM,KAAK,EAAE,OAAsB;AAC9C,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,0CAAiB,MAAsB;AACrC,aAAO,CAAC,MAAmB;AACnB,cAAA,aACH,EAAE,WAAsB,KAAK,MAAM,sBACnC,EAAE,WAAsB,KAAK,MAAM;AAC/B,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,kBAAkB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,YAAM,OAAO,YAAY,iBAAiB,KAAK,MAAM,kBAAkB;AACvE,aAAO,CAAC,MAAmB;AACnB,cAAA,cAAc,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,KAAe,CAAC;AAC3D,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,YAAM,OAAO,YAAY,iBAAiB,KAAK,MAAM,kBAAkB;AACvE,aAAO,CAAC,MAAmB;AACnB,cAAA,iBAAiB,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,KAAe,CAAC;AAC/D,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AA7EU,SAAA,QAAA;AACA,SAAA,QAAA;AAER,SAAK,QAAQ;AAEP,UAAA,UAAU,OAAO,oBAAoB,IAAI;AAC/C,SAAK,UAAU,QAAQ,OAAO,CAAC,KAA8C,MAAM;AAC7E,UAAA,KAAK,KAAK,OAAO;AACf,YAAA,CAAC,IAAI,KAAK,CAAqB;AACnC,oBAAY,WAAW,EAAE,cAAc,MAAM,CAAC,CAAC,gCAAgC;AAAA,MAAA;AAE1E,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,EAAA;AAkET;AAYO,MAAM,YAAY;AAAA,EAOvB,YAAY,OAAe,OAAwB;AAN3C;AACA;AACA;AACA;AACD;AA8BP,wCAAe,CAAC,SAAqC,SAAS,MAAY;AAClE,YAAA,iBAAiB,OAAO,KAAK,OAAO,EACvC,OAAO,CAAC,MAAM,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,EAChD,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,GAAG;AAE/B,UAAA,eAAe,WAAW,EAAG;AAEjC,YAAM,UAA0B,CAAC;AACjC,UAAI,iBAAiB;AACrB,iBAAW,KAAK,KAAK,KAAK,OAAA,GAAU;AAC9B,YAAA,EAAE,iBAAiB,QAAQ;AAC7B,qBAAW,KAAK,gBAAgB;AAC9B,kBAAM,EAAE,KAAK,cAAc,EAAE,CAAgB;AACrC,oBAAA,KAAK,MAAO,EAAE,QAAwB,UAAU,OAAO,KAAK,SAAS,CAAC;AAAA,UAAA;AAAA,QAChF;AAAA,MACF;AAGF,4BAAsB,MAAM;AAClB,gBAAA,QAAQ,CAAC,WAAW;AACnB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,CACF;AAAA,IACH;AAEA,qCAAY,CAAC,WAA0B;AACrC,YAAM,UAAU,OAAO;AAAA,QACrB,CAAC;AAAA,QACD,GAAG,OAAO,KAAK,KAAK,WAAW,EAAE,IAAI,CAAC,OAAO;AAAA,UAC3C,CAAC,CAAC,GAAG,KAAK,MAAM,CAA0B;AAAA,QAAA,EAC1C;AAAA,MACJ;AACK,WAAA,aAAa,SAAS,MAAM;AAAA,IACnC;AAEA,qCAAY,CACV,MACA,WACA,mBAAmB,OACnB,eAAe,SACN;AACT,YAAM,SAAS,KAAK,MAAM,UAAU,IAAI;AAClC,YAAA,cAAc,KAAK,KAAK;AAE9B,iBAAW,gBAAgB,QAAQ;AACjC,cAAM,MAAM,KAAK,MAAM,YAAY,YAAY;AAC/C,YAAI,CAAC,OAAO,KAAK,KAAK,IAAI,GAAG,GAAG;AAC1B,cAAA,+BAA+B,OAAO;AAC1C;AAAA,QAAA;AAGF,cAAM,OAAO,KAAK,MAAM,aAAa,YAAY;AAC5C,aAAA,KAAK,IAAI,KAAK,EAAE,SAAS,cAAc,GAAG,MAAM;AAErD,YAAI,cAAc;AAChB,gBAAM,EAAE,KAAK,WAAW,KAAK,MAAM,gBAAgB,YAAY;AAC/D,eAAK,cAAc,OAAO,cAAc,KAAyB,MAAM;AAAA,QAAA;AAGnE,cAAA,SAAS,aAAa,KAAK,MAAM;AACvC,YAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO,YAAY,YAAY;AAAA,MAAA;AAGrE,WAAK,UAAU,WAAW;AAAA,IAC5B;AA3FE,SAAK,QAAQ;AACb,SAAK,QAAQ;AACR,SAAA,2BAAW,IAAI;AACpB,SAAK,gBAAgB,IAAI;AAAA,MACvB,CAAC,WAAoB,CAAC,KAAK,WAAW,MAAqB;AAAA,IAC7D;AACA,SAAK,cAAc,IAAI,WAAW,OAAO,KAAK,EAAE;AAEhD,UAAM,UAAU,CAAC,QAAS,WAAmB,YAAY,EAAE,OAAO,OAAO;AACjE,YAAA,QAAQ,CAAC,MAAW;AAC1B,aAAO,OAAO,GAAG;AAAA,QACf,aAAa,MAAM,KAAK,KAAK,MAAM;AAAA,QACnC,gBAAgB,MAAM,KAAK,KAAK,UAAU;AAAA,MAAA,CAC3C;AAAA,IAAA,CACF;AAAA,EAAA;AAAA,EAGH,OAAO,iBAAiB,KAAuB;AAC7C,UAAM,aAAa,CAAC,MAAc,UAAU,CAAC;AACvC,UAAA,OAAO,IAAI,QAAQ,YAAY,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;AACrD,WAAA,cAAc,IAAI,EAAE,IAAI,CAAC,SAAiB,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,EAAA;AAAA,EAGxE,WAAW,IAA0B;AAC5B,WAAA,GAAG,UAAU,SAAS,UAAU;AAAA,EAAA;AAAA,EAqEzC,KAAK,UAAkB;AACjB,QAAA,KAAK,KAAK,OAAO,EAAG;AAElB,UAAA,SAAS,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AACzD,aACI,KAAK,KAAK,IAAI,CAAC,EAAkB,QAAQ,IACzC,KAAK,KAAK,IAAI,CAAC,EAAkB,QAAQ;AAAA,IAAA,CAE9C;AAEK,UAAA,YAAc,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,EAAkB,QAC1D;AAEI,WAAA,QAAQ,CAAC,MAAM;AACpB,YAAM,IAAK,KAAK,KAAK,IAAI,CAAC,EAAkB;AAC5C,gBAAU,OAAO,CAAC;AAAA,IAAA,CACnB;AAAA,EAAA;AAEL;AC7OO,SAAS,SAAS,MAA2B;AAClD,QAAM,SAAS,IAAI,YAAY,gBAAgB,MAAM,WAAW,EAAE;AAClE,SAAO,OAAO,SAAS,SAAS,IAAI,SAAS,OAAO;AACtD;AAEgB,SAAA,eAAe,QAA+B,QAA+B;AAChF,aAAA,QAAQ,OAAO,YAAY;AACpC,SAAK,aAAa,OAAO,aAAa,KAAK,UAAU,KAAK,SAAS;AAAA,EAAA;AAEvE;AAEgB,SAAA,kBAAkB,GAA0B,SAAiB;AACrE,QAAA,gBAAgB,SAAS,cAAc,OAAO;AACpD,iBAAe,eAAe,CAAC;AAC/B,gBAAc,YAAY,EAAE;AAC1B,IAAA,YAAY,aAAa,eAAe,CAAC;AACpC,SAAA;AACT;AAEO,SAAS,oBAAoB,UAAwD;AAC1F,SAAO,MAAM,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,MAAM;AAC7C,QAAI,EAAE,iBAAiB,CAAC,IAAI,SAAS,EAAE,aAA4B,GAAG;AAAM,UAAA,KAAK,EAAE,aAAa;AAAA,IAAA;AACzF,WAAA;AAAA,EACT,GAAG,EAAkC;AACvC;AAEO,SAAS,gBAAgB,IAA2B;AACrD,MAAA,GAAG,mBAAoB,QAAO,GAAG;AACrC,MAAI,GAAG,cAAsB,QAAA,gBAAgB,GAAG,aAAa;AACtD,SAAA;AACT;AAEgB,SAAA,qBAAqB,QAA+B,UAAkB,UAAuC;AAC3H,QAAM,WAAW,IAAI,iBAAiB,CAAC,eAAe;AAC9C,UAAA,KAAK,OAAO,cAAc,QAAQ;AACxC,QAAI,IAAI;AACN,eAAS,WAAW;AACpB,eAAS,EAAE;AAAA,IAAA;AAAA,EACb,CACD;AACQ,WAAA,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,MAAM;AACpE;AAEgB,SAAA,0BAA0B,SACxC,UAAqE;AACjE,MAAA,QAAQ,QAAQ,SAAS;AAC7B,QAAM,WAAW,IAAI,iBAAiB,CAAC,cAAcC,cAAa;AAChE,eAAW,YAAY,cAAc;AAC/B,UAAA,SAAS,SAAS,aAAa;AAC7B,YAAA,UAAU,QAAQ,SAAS,QAAQ;AACrC,kBAAQ,QAAQ,SAAS;AACzB,mBAASA,WAAU,KAAK;AAAA,QAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CACD;AACD,WAAS,QAAQ,SAAS,EAAE,WAAW,MAAM;AAC/C;AAEO,SAAS,4BACd,SACA,UACA,WAAW,KACX,QAAQ,UACR,UAAmC,EAAE,WAAW,MAAM,SAAS,MAAM,YAAY,QACjF;AACI,MAAA;AACA,MAAA;AACJ,MAAI,SAAS;AACb,QAAM,WAAW,IAAI,iBAAiB,CAAC,eAAe,cAAc;AAC9D,QAAA,WAAW,YAAY,SAAS,GAAG;AACrC,eAAS,WAAW;AACpB;AAAA,IAAA;AAEF;AACM,UAAA,MAAM,KAAK,IAAI;AACjB,QAAA,oBAAoB,MAAM,mBAAmB,UAAU;AACzD,iBAAW,aAAa,OAAO;AAAA,IAAA;AAEvB,cAAA,WAAW,UAAU,QAAQ;AACpB,uBAAA;AAAA,EAAA,CACpB;AACQ,WAAA,QAAQ,SAAS,OAAO;AAC1B,SAAA;AACT;AAEgB,SAAA,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,MAAM;AAAE,KAAK;AACzF,QAAA,MAAM,SAAS,QAAQ,MAAM;AAE/B,MAAA,QAAQ,OAAiB,UAAA,cAAc,QAAQ,MAAM,GAAG,OAAO,GAAG;AAClE,MAAA,QAAQ,MAAgB,UAAA,cAAc,QAAQ,KAAK,GAAG,MAAM,GAAG;AAE/D,MAAA,iBAAiB,SAAS,CAAC,MAAM;AACnC,MAAE,eAAe;AAEb,QAAA,QAAQ,SAAU,SAAQ,SAAS;AAEvC,yBAAqB,SAAS,MAAM,SAAS,CAAC,UAAmB;AAC/D,aAAO,SAAS,OAAO,MAAM,aAAa,KAAK;AAAA,IAAA,CAChD;AAAA,EAAA,CACF;AACH;AAEO,SAAS,iBAAiB,OAAyB;AACxD,QAAM,gBAAgB,KAAK;AAC3B,QAAM,KAAK;AACX,QAAM,OAAO;AACf;ACzGO,MAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAEM,SAAA,UACd,KACA,UAAmC,EAAE,MAAM,OAAO,QAAQ,SAC1D;AACA,QAAM,UAAU,CAAC;AACjB,MAAI,QAAQ,OAAe,QAAA,OAAO,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,cAAc,UAAU,CAAC,GAAG;AAChG,SAAO,MAAM,KAAK,OAAO,EACtB,KAAK,CAAC,MAAM,EAAE,KAAA,CAAM,EACpB,KAAK,CAAC,MAAO,QAAQ,OAAO,SAAS,CAAC,IAAI,CAAE;AACjD;AAEa,MAAA,YAAY,CAAC,QAAgB,UAAU,KAAK,EAAE,MAAM,KAAM,CAAA;AAEhE,MAAM,YAAY,CAAC,QAAgB,UAAU,GAAG;AAEhD,SAAS,iBAAiB,QAA6D;AACtF,QAAA,WAAW,IAAI,SAAS;AAC9B,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,SAAS,OAAO,GAAG,CAAW,CAAC;AACnE,SAAA;AACT;ACJO,MAAM,iBAAiB;AAAA,EAS5B,YAAY;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACoB;AAnBf;AACA;AACA;AACA;AACA;AACA;AACC;AAiCA,uCAA2D,CAAC;AAcpE,6CAAoB,YAAY;AAC1B,UAAA,CAAC,KAAK,QAAgB,QAAA;AAC1B,YAAM,EAAE,OAAO,EAAE,KAAK,OAAO,IAAI,IAAI,SAAS,MAAM,KAAK,oBAAoB,KAAK;AAClF,UAAI,CAAC,MAAM;AACH,cAAA,eAAe,MAAM,UAAU,GAAG;AAClC,cAAA,gBAAgB,SAAS,gBAAgB;AAC/C,aAAK,mBAAmB;AACxB,aAAK,UAAU,YAAY;AAC3B,aAAK,UAAU;AACR,eAAA,SAAS,GAAG,aAAa;AAChC,YAAI,KAAK,cAAc;AACrB,kBAAQ,aAAa,IAAI,IAAI,GAAG;AAAA,QAAA;AAAA,MAClC;AAEF,aAAO,CAAC;AAAA,IACV;AAhDE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AACtB,SAAK,YAAY;AAEZ,SAAA,sBACH,uBAAuB,KACvB,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,UAAM,aAAa,0BAA0B;AAC7C,aAAS,aAAa,YAAY,KAAK,mBAAmB,KAAK,KAAK;AAAA,EAAA;AAAA,EAK/D,SAAS,UAAgD,WAAW,OAAO;AAC5E,QAAA,mBAAmB,IAAI;AACtB,SAAA,YAAY,KAAK,QAAQ;AACvB,WAAA;AAAA,EAAA;AAAA,EAGD,YAAY;AACb,SAAA,YAAY,QAAQ,CAAC,OAAO;AAC/B,SAAG,IAAI;AAAA,IAAA,CACR;AAAA,EAAA;AAAA,EAoBH,QAAQ,0BACN,aACA,YACA,aACiB;AACjB,aAAS,SAAS,cAAc,GAAG,UAAU,YAAY,UAAU;AAC3D,YAAA,MAAM,YAAY,MAAM;AACxB,YAAA,EAAE,KAAK,OAAO;AAAA,IAAA;AAAA,EACtB;AAEJ;ACtFgB,SAAA,uBACd,OACA,WACA,OACA;AACM,QAAA,UAAU,MAAM,MAAM;AAEtB,QAAA,YAAY,IAAI,iBAAiB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG,MAAM;AAAA,EACV,CAAA,EAAE,SAAS,CAAC,EAAE,gBAAgB,uBAAuB;AACpD,UAAM,WAAW,eAAe;AAChC,UAAM,WAAW,cAAc;AAAA,KAC9B,IAAI;AAEP,QAAM,UAAU,MAAM;AACV,cAAA,UAAU,MAAM,MAAM;AAAA,EAAA,CACjC;AAEM,SAAA;AACT;ACxCO,SAAS,mBACd,MAA8B,UAC9B,MAA+B,SAAS,MACxC,mBAAmB,sBACT;AACJ,QAAA,aAAa,SAAS,GAAG;AAC/B,aAAW,WAAW,WAAW,SAAS,QAAQ,kBAAkB,GAAG;AACvE,QAAM,YAAY,MAAM;AAAA,IACrB,IAAI,iBAAiB,SAAS,KAAuC,CAAC;AAAA,IACvE,CAAC,MAAM,EAAE;AAAA,EAAA,EACT,OAAO,CAAC,MAAM;AACV,QAAA;AACI,YAAA,UAAU,IAAI,IAAI,EAAE,QAAQ,MAAM,EAAE,GAAG,IAAI,WAAW,WAAW,MAAM;AAE3E,aAAA,QAAQ,WAAW,WAAW,UAAU,QAAQ,SAAS,WAAW,WAAW,QAAQ;AAAA,IAAA,QAEnF;AACC,aAAA;AAAA,IAAA;AAAA,EACT,CACD;AACM,SAAA;AACT;AAEO,SAAS,SAAS,GAAqD;AAC5E,MAAI,OAAO,MAAM,SAAiB,QAAA,IAAI,IAAI,CAAC;AACpC,SAAA,IAAI,IAAI,EAAE,IAAI;AACvB;ACdO,MAAM,mBAAmB;AAAA,EAO9B,YAAY,SAA+B;AANpC,+BAAM;AACN;AACA,8CAAqB;AACrB;AACA,qCAAY;AAGjB,QAAI,SAAS;AACJ,aAAA,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AAC1C,eAAO,OAAO,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG;AAAA,MAAA,CAC/B;AAAA,IAAA;AAGH,SAAK,MAAM,SAAS,SAAS,OAAO,KAAK,IAAI,GAAG;AAAA,EAAA;AAAA,EAGlD,uBAAuB;AACrB,WAAQ,KAAK,IAAI,cAAc,KAAK,kBAAkB,KAAK,KAAK;AAAA,EAAA;AAAA,EAGlE,sBAAsB;AACpB,WAAO,KAAK;AAAA,EAAA;AAAA,EAEd,oBAAoB;AAClB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,4BAA4B;AACnB,WAAA,CAAC,MAAc,KAAK,IAAI;AAAA,EAAA;AAEnC;AC3CO,SAAS,mBAAmB,YAA4B;AAC7D,QAAM,QAAgB;AAChB,QAAA,QAAiC,WAAW,MAAM,KAAK;AAC7D,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AAC5C,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AAC5C,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AACtC,QAAA,MAAM,CAAC,QAAwB,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG;AACzD,SAAA,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACtC;AAGO,SAAS,cAAc,GAAmB;AAC/C,QAAM,IAAI,cAAc,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI;AAClD,UAAA,GAAG,MAAM,OAAO,KAAK,CAAC,CAAC,GAC5B,QAAA,EACA,IAAI,CAAC,GAAG,MAAM,SAAS,CAAW,IAAI,MAAM,CAAC,EAC7C,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3B;AAEgB,SAAA,eAAe,GAAoB,IAAoB;AAC7D,UAAA,CAAA,QAAO,OAAO,MAAM,GAAG,IAAI,KAAK,KAAK,SAAS,CAAW,CAAC;AACpE;AAGO,SAAS,gBAAgB,KAAqC;AACnE,QAAM,YAAY,UAAU,IAAI,MAAM,EAAE,MAAM,GAAG;AACjD,SAAO,UAAU,OAAO,CAAC,KAAK,MAAM;AAC5B,UAAA,SAAS,EAAE,MAAM,wBAAwB;AAC/C,QAAI,QAAQ;AACV,YAAM,CAAG,EAAA,KAAK,KAAK,IAAI;AACvB,UAAI,OAAO;AACT,YAAI,MAAM,GAAG,EAAE,QAAQ,CAAK,MAAA;AAAE,cAAI,CAAC,IAAI;AAAA,QAAA,CAAQ;AAAA,MAAA;AAAA,IACjD;AAEK,WAAA;AAAA,EACT,GAAG,EAA4B;AACjC;AAEO,SAAS,YAAY,GAAW;AAC9B,SAAA,EAAE,QAAQ,kBAAkB,EAAE;AACvC;ACrCO,MAAM,qCAAqC,mBAAmB;AAAA,EACnE,oBAAoB;AAClB,UAAM,QAAQ,KAAK,qBAAqB,GAAG,iBAAiB,2BAA2B;AACvF,UAAM,QAAQ,MAAM,KAAK,SAAS,CAAA,GAAI,CAAC,MAAM;AACrC,YAAA,IAAI,EAAE,aAAa,iBAAiB;AACpC,YAAA,IAAI,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK,KAAK,UAAU,SAAS;AACpE,aAAO,SAAS,CAAC;AAAA,IAAA,CAClB;AACD,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AACd,UAAA,OAAO,KAAK,qBAAA,GAAwB;AAAA,MACxC;AAAA,IACF;AACI,QAAA,CAAC,KAAM,QAAO,KAAK;AACjB,UAAA,IAAI,KAAK,aAAa,iBAAiB;AACvC,UAAA,IAAI,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK,KAAK,UAAU,SAAS;AACpE,WAAO,SAAS,CAAC;AAAA,EAAA;AAAA,EAGnB,4BAA4B;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3B,UAAA,oBAAoB,KAAK,qBAAA,GAAwB;AAAA,MACrD;AAAA,IACF;AACA,UAAM,WAAW,mBAAmB,aAAa,eAAe,KAAK;AACrE,UAAM,aAAa,gBAAgB,mBAAmB,aAAa,iBAAiB,KAAK,EAAE;AAE3F,UAAM,QAAgC;AAAA,MACpC,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM;AAChC,UAAI,aAAa,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,IAAA,CACjC;AAEK,UAAA,yBAAyB,CAAC,MAAc;AAC5C,aAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM;AAC9B,UAAA,SAAS,MAAM,KAAK,IAAI,aAAa,IAAI,GAAG,EAAE,UAAU;AAAA,MAAA,CAC3D;AACD,UAAI,aAAa,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU;AAC/C,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;AChDO,MAAM,yCAAyC,mBAAmB;AAAA,EAAlE;AAAA;AACE,4CAAmB;AAE1B,uCAAc,CAAC,MAAqD;AAClE,YAAM,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACrC,YAAA,EAAE,SAAS,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,WAAW,KAAK,IAAI,MAAM;AAC/D,aAAA,SAAS,SAAS,MAAM,KAAK,gBAAgB,GAAG,SAAS,KAAK,UAAU,SAAA,CAAU;AAAA,IAC3F;AAAA;AAAA,EAEA,oBAAoB;AAClB,UAAM,QAAQ;AAAA,MACZ,KAAK,qBAAqB;AAAA,MAC1B,KAAK,IAAI;AAAA,MACT,KAAK;AAAA,IACP;AACA,UAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,WAAW;AAChD,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AACpB,WAAO,KAAK,YAAY,KAAK,IAAI,IAAI;AAAA,EAAA;AAAA,EAGvC,0BAA0B,OAAY,KAAK,KAAK;AAC9C,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI;AAE7B,UAAM,8BAA8B,KAAK,iBACtC,WACA,QAAQ,oBAAoB,GAAG;AAElC,QAAI,CAAC,KAAK,iBAAiB,KAAK,IAAI,QAAQ,GAAG;AAC7C,UAAI,WAAW,IAAI,SAChB,OAAO,4BAA4B,QAAQ,OAAO,KAAK,UAAU,SAAU,CAAA,CAAC,EAC5E,QAAQ,WAAW,GAAG;AAAA,IAAA;AAGrB,UAAA,yBAAyB,CAAC,WAAmB;AAC7C,UAAA,WAAW,IAAI,SAAS;AAAA,QAC1B,KAAK;AAAA,QACL,4BAA4B,QAAQ,OAAO,OAAO,SAAU,CAAA;AAAA,MAC9D;AACA,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;ACrDO,MAAM,uCAAuC,mBAAmB;AAAA,EAAhE;AAAA;AACE,+CAAsB;AAAA;AAAA,EAE7B,uBAAuB;AACrB,WAAQ,KAAK,IAAI,cAAc,KAAK,kBAAkB,KAAK,KAAK;AAAA,EAAA;AAAA,EAGlE,YAAY,GAAwD;AAClE,UAAM,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACrC,UAAA,IAAI,IAAI,IAAI,IAAI,EAAE,aAAa,IAAI,KAAK,mBAAmB;AAC1D,WAAA,SAAS,CAAC,KAAK,KAAK;AAAA,EAAA;AAAA,EAG7B,oBAAoB;AACZ,UAAA,QAAQ,mBAAmB,KAAK,wBAAwB,KAAK,IAAI,IAAI,EAAE;AAAA,MAAO,CAAC,MACnF,eAAe,KAAK,CAAC;AAAA,IACvB;AACA,UAAM,QAAQ,MAAM,IAAI,KAAK,WAAW;AACxC,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AAChB,QAAA,KAAK,QAAQ,UAAU;AAClB,aAAA,KAAK,YAAY,KAAK,GAAG;AAAA,IAAA;AAE5B,UAAA,OAAO,KAAK,qBAAA,EAAuB;AAAA,MACvC,qBAAqB,KAAK,mBAAmB;AAAA,IAC/C;AACO,WAAA,KAAK,YAAY,IAAI;AAAA,EAAA;AAAA,EAG9B,4BAA4B;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3B,UAAA,yBAAyB,CAAC,WAAmB;AACjD,UAAI,aAAa,IAAI,KAAK,qBAAqB,OAAO,UAAU;AAChE,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;ACrCO,SAAS,sBAAsB,SAA8B;AAClE,QAAM,EAAE,MAAM,UAAU,MAAM,SAAS,SAAS;AAC1C,QAAA,YAAY,mBAAmB,KAAK,GAAG;AAErC,UAAA,IAAI,EAAE,WAAW;AAEzB,QAAM,cAAc,MAAiC;AAC/C,QAAA,UAAU,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC,GAAG;AAC3C,YAAA,IAAI,UAAU,OAAO,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC;AAChD,cAAA,IAAI,kCAAkC,CAAC;AACxC,aAAA;AAAA,IAAA;AAGL,QAAA,UAAU,KAAK,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC,GAAG;AACjD,YAAA,IAAI,UAAU,OAAO,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC;AACtD,cAAA,IAAI,oCAAoC,CAAC;AAC1C,aAAA;AAAA,IAAA;AAGT,UAAM,aAAa,MAAM,KAAK,SAAS,iBAAiB,2BAA2B,CAAC;AAChF,QAAA,WAAW,SAAS,GAAG;AACjB,cAAA,IAAI,gCAAgC,UAAU;AAC/C,aAAA;AAAA,IAAA;AAGT,YAAQ,MAAM,mBAAmB;AAC1B,WAAA;AAAA,EACT;AAEA,QAAM,qBAAqB,KAAK,YAAY,GAAG,OAAO;AAE/C,SAAA;AACT;ACzCgB,SAAA,OAAU,KAAe,GAA4B;AAC5D,SAAA,MAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC,EAAA,GAAK,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;AAChG;AAEO,SAAS,MAAM,MAAc,UAAkB,GAAG,OAAe,GAAa;AAC5E,SAAA,MAAM,KAAK,EAAE,QAAQ,KAAA,GAAQ,CAAC,GAAG,UAAU,UAAU,QAAQ,IAAI;AAC1E;ACLA,eAAsB,sBAAsB,UAAyC;AACnF,QAAM,MAAM,CAAC;AACb,mBAAiB,KAAK,UAAU;AAC1B,QAAA,KAAK,MAAM,GAAG;AAAA,EAAA;AAEb,SAAA;AACT;AAEO,SAAS,KAAK,cAAsB;AACzC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AACnE;AAOO,MAAM,UAAU;AAAA,EAWrB,YAAoB,MAAM,GAAW,OAA6B,CAAA,GAAI;AAV9D,+BAAM;AACN;AACA;AAQY,SAAA,MAAA;AAAiB,SAAA,OAAA;AACnC,SAAK,WAAW,IAAI,QAAQ,CAAC,YAAY;AACvC,WAAK,WAAW;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EATH,aAAoB,eAAe,MAAM,GAAG,OAAqD,CAAA,GAAI;AAC7F,UAAA,QAAQ,IAAI,UAAU,GAAG;AAC/B,SAAK,QAAQ,CAAA,MAAK,MAAM,KAAK,CAAC,CAAC;AAC/B,WAAO,MAAM,IAAI;AAAA,EAAA;AAAA,EASX,qBAAqB,IAAI,GAAsC;AACrE,QAAI,IAAI,KAAK,KAAK,KAAK,WAAW,EAAU,QAAA;AACtC,UAAA,IAAI,KAAK,KAAK,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9C,QAAI,KAAK,GAAG;AACV,YAAM,MAAM,KAAK,KAAK,CAAC,EAAE;AACpB,WAAA,KAAK,OAAO,GAAG,CAAC;AACd,aAAA;AAAA,IAAA;AAEF,WAAA,KAAK,qBAAqB,IAAI,CAAC;AAAA,EAAA;AAAA,EAGxC,MAAc,UAAU;AACjB,SAAA;AACC,UAAA,IAAI,KAAK,qBAAqB;AACpC,UAAM,IAAI;AACL,SAAA;AACL,SAAK,SAAS;AAAA,EAAA;AAAA,EAGR,WAAW;AACb,QAAA,CAAC,KAAK,KAAK,QAAQ;AACrB,WAAK,WAAW,IAAI;AACpB;AAAA,IAAA;AAEE,QAAA,KAAK,MAAM,KAAK,KAAK;AACvB,WAAK,QAAQ;AACb,WAAK,SAAS;AAAA,IAAA;AAAA,EAChB;AAAA,EAGF,MAAa,MAAM;AACjB,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EAAA;AAAA,EAGP,KAAK,GAA0C;AAC/C,SAAA,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAA,CAAG;AAAA,EAAA;AAEhD;ACzEO,SAAS,QAAQ;AACf,SAAA,kBAAkB,KAAK,UAAU,SAAS;AACnD;ACFgB,SAAA,aAAa,KAA4B,QAAuB,UAAoC;AAClH,aAAW,KAAK,QAAQ;AAClB,QAAA,iBAAiB,GAAG,UAAU,IAAI;AAAA,EAAA;AAE1C;AAEO,MAAM,KAAK;AAAA,EAIhB,YAAoB,OAAuB,iBAA0B,MAAM;AAHnE;AACA;AAEY,SAAA,QAAA;AAAuB,SAAA,iBAAA;AAAA,EAAA;AAAA,EAEpC,MAAM,UAAsB,eAAkC;AACnE,SAAK,KAAK;AACV,SAAK,gBAAgB;AACjB,QAAA,KAAK,eAAyB,UAAA;AAClC,SAAK,OAAO,OAAO,YAAY,UAAU,KAAK,KAAK;AAAA,EAAA;AAAA,EAG9C,OAAa;AACd,QAAA,KAAK,SAAS,QAAW;AAC3B,oBAAc,KAAK,IAAI;AACvB,WAAK,OAAO;AAAA,IAAA;AAEd,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AAAA,IAAA;AAAA,EACvB;AAEJ;AC7BO,SAAS,cAAc,GAAW,IAAI,GAAG,IAAI,GAAW;AACrD,UAAA,IAAI,KAAK,KAAK;AACxB;"}