您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Userscript for PornoLab.Net
// ==UserScript== // @name plab-ultra // @namespace https://github.com/clangmoyai/plab-ultra // @version 2025.08.30 // @author clangmoyai // @description Userscript for PornoLab.Net // @license MIT // @icon https://github.com/clangmoyai/plab-ultra/raw/main/src/assets/logo64.png // @homepage https://github.com/clangmoyai/plab-ultra // @supportURL https://github.com/clangmoyai/plab-ultra/issues // @match https://pornolab.net/forum/viewtopic.php* // @tag pornolab // @tag pornolab.net // @connect * // @grant GM_addStyle // @grant GM_xmlhttpRequest // @run-at document-start // ==/UserScript== (function () { 'use strict'; const d=new Set;const importCSS = async e=>{d.has(e)||(d.add(e),(t=>{typeof GM_addStyle=="function"?GM_addStyle(t):document.head.appendChild(document.createElement("style")).append(t);})(e));}; importCSS(` .ultra-logo.svelte-14s75i7{width:16px;display:inline-flex;vertical-align:top;margin:0 .45rem 0 0}.ultra-logo.svelte-14s75i7:hover{cursor:pointer}#x-header.svelte-14s75i7{--header-height: 4.5rem;display:grid;grid-template-columns:auto 1fr;column-gap:1rem;margin-bottom:var(--content-margin);min-height:var(--header-height)}.floatingDownload.svelte-14s75i7{padding-right:5rem}.logo.svelte-14s75i7{height:var(--header-height)}.logo.svelte-14s75i7 img:where(.svelte-14s75i7){height:100%;border-radius:var(--border-radius-large)}.align-right.svelte-14s75i7{display:flex;justify-content:flex-end;min-width:0}.container.svelte-14s75i7{display:flex;flex-direction:column;min-width:0;row-gap:1rem}.links.svelte-14s75i7{display:flex;min-width:0;flex-wrap:nowrap;justify-content:end}.unread.svelte-14s75i7{color:var(--highlighted);filter:brightness(1.25)}.item.svelte-14s75i7{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.item.svelte-14s75i7+.item:where(.svelte-14s75i7):before{display:inline-block;content:"|";margin:0 .8rem;color:var(--post-border-color);transform:translateY(-1px)}.search.svelte-14s75i7{display:flex;gap:.5rem}.search.svelte-14s75i7 input:where(.svelte-14s75i7){flex:1 1 auto;min-width:0;border:1px solid var(--post-border-color);color:var(--search-color);background:var(--input-bg)!important;padding:.3rem .5rem .4rem;border-radius:var(--border-radius-small);font-size:.8rem!important;font-family:inherit}.search.svelte-14s75i7 button:where(.svelte-14s75i7){background:var(--input-bg)!important;border:1px solid var(--post-border-color)!important;width:1.75rem;border-radius:var(--border-radius-small)}.incognito.svelte-14s75i7{filter:var(--incognito-filter)!important}.themeIcon.svelte-14s75i7 a,.themeIcon.svelte-14s75i7 a:hover{text-decoration:none!important}@media (max-width: 768px){#x-header.svelte-14s75i7{grid-template-columns:1fr}.logo.svelte-14s75i7{display:none}.container.svelte-14s75i7{width:100%}}.container.svelte-5e73jo{display:flex;gap:1.15rem;justify-content:space-between}.column.svelte-5e73jo{display:flex;flex-direction:column;overflow:hidden;gap:.75rem}h2.svelte-5e73jo{margin:0;margin-bottom:.25rem;font-size:1rem;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}input[type=checkbox].svelte-5e73jo{margin:4px}label.svelte-5e73jo{display:flex;align-items:center;gap:.5rem}.disabled.svelte-5e73jo{text-decoration:line-through;cursor:default}span.svelte-5e73jo{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.description.svelte-5e73jo{opacity:.5}input[type=checkbox].svelte-5e73jo:disabled{cursor:default}@media (max-width: 1200px){.container.svelte-5e73jo{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(2,auto);gap:1rem;justify-content:stretch}.column.svelte-5e73jo{min-width:0}}@media (max-width: 768px){.container.svelte-5e73jo{display:flex;flex-direction:column;gap:1rem}.column.svelte-5e73jo{min-width:0;width:100%}}button.svelte-ig1se8{all:unset;display:flex;justify-content:center;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:var(--button-color)!important;border:none!important;border-radius:var(--border-radius-small);padding:.4rem .5rem;font-family:inherit;font-weight:500;font-size:.8rem;color:#fff;transition:background-color opacity 1.8s ease-in-out}button.svelte-ig1se8:disabled{background-color:var(--post-border-color)!important;opacity:.5;cursor:not-allowed}svg.svelte-ig1se8{position:absolute}svg.svelte-ig1se8 path:where(.svelte-ig1se8){transform-origin:center;fill:#fff}.container.svelte-d5217q{display:flex;justify-content:space-between;align-items:center;margin-top:1rem}.align-right.svelte-d5217q{display:flex;gap:.5rem}.container.svelte-6don7f{display:flex;flex-direction:column;margin-top:1.25rem}.item.svelte-6don7f{display:grid;grid-template-columns:min-content minmax(0,10rem) 1fr auto;align-items:center;gap:.75rem;min-width:0;margin-bottom:.5rem}img.svelte-6don7f{width:.9rem;height:.9rem;flex-shrink:0}input[type=text].svelte-6don7f{padding:.3rem .5rem .4rem;border:1px solid var(--post-border-color);border-radius:var(--border-radius-small);font-size:.8rem!important;background:var(--input-bg)!important;color:inherit;font:inherit;min-width:0}button.svelte-6don7f{background:#a62f2fbf!important;border-radius:var(--border-radius-small);font-size:1.2rem;border:none!important;color:#fff!important;display:flex;align-items:center;width:1.5rem;height:1.5rem;align-items:flex-end;justify-content:center;-webkit-user-select:none;user-select:none}button.svelte-6don7f:hover{background:#a62f2f!important}div.svelte-rmjlst{font-size:.8rem;position:relative;background:var(--post-bg);border:1px solid var(--post-border-color);padding:.9rem 1rem 1rem;border-radius:var(--border-radius-large);overflow:hidden;display:flex;flex-flow:column;font-family:inherit;margin-bottom:var(--content-margin)}button.svelte-rmjlst{position:absolute;top:.6rem;right:.6rem;background:none!important;border:none;font-size:1.5rem;cursor:pointer;flex-shrink:0;-webkit-user-select:none;user-select:none}div.svelte-hyxnps{position:fixed;top:1.3rem;right:2.5rem;z-index:9999;border-radius:var(--border-radius-large);padding:.35rem;border:1px solid var(--post-border-color);background-color:#009c3c!important}button.svelte-hyxnps{cursor:pointer;aspect-ratio:1 / 1;--size: 1.7rem;width:var(--size);background-color:#fff!important}.ic--sharp-download.svelte-hyxnps{display:inline-block;--svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M19 9h-4V3H9v6H5l7 7zM5 18v2h14v-2z'/%3E%3C/svg%3E");background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%}.container.svelte-m808n{position:absolute;z-index:2;transform:translate(-50%);padding-top:.2rem}.indicator.svelte-m808n{position:absolute;left:calc(50% - 8px);border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:7px solid var(--post-border-color)}.items.svelte-m808n{margin-top:7px;position:relative;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:var(--border-radius-large);-webkit-user-select:none;user-select:none;border:1px solid var(--post-border-color);box-shadow:#00000040 0 25px 50px -12px;background:var(--overlay-bg);white-space:nowrap}.items.svelte-m808n img:where(.svelte-m808n){width:.9rem;height:1rem;width:1rem;-webkit-user-drag:none}.items.svelte-m808n a:where(.svelte-m808n){display:flex;align-items:center;gap:.75rem;font-size:.9rem;font-weight:500;text-decoration:none;padding:.5rem 1rem;-webkit-user-drag:none}.items.svelte-m808n a:where(.svelte-m808n):hover{color:unset}.items.svelte-m808n a:where(.svelte-m808n):first-of-type{padding-top:.9rem}.items.svelte-m808n a:where(.svelte-m808n):last-of-type{padding-bottom:1rem}#x-title.svelte-12bxepp{font-size:1.375rem;margin-top:0;margin-bottom:var(--content-margin)}.original-title.svelte-12bxepp{text-decoration:none}.title-item.svelte-12bxepp{color:unset;text-decoration:none}.title-item.svelte-12bxepp:hover,.title-item--hover{text-decoration:underline!important;color:var(--link-color)!important;cursor:pointer}button.svelte-1ilvoyd{all:unset;cursor:pointer;background:none!important}button.svelte-1ilvoyd:disabled{cursor:text;-webkit-user-select:text;user-select:text}#thx-btn{all:unset!important}#x-stats.svelte-7pdkl5{display:flex;flex-wrap:wrap;gap:.8rem;font-weight:500;font-size:.8rem;margin-bottom:var(--content-margin)}.item.svelte-7pdkl5:not(:last-child):after{display:inline-block;content:"|";color:var(--post-border-color);margin-left:.8rem;transform:translateY(-1px)}button.svelte-7pdkl5{all:unset;cursor:pointer;background:none!important}button.svelte-7pdkl5:disabled{cursor:text;-webkit-user-select:text;user-select:text}.seeders.svelte-7pdkl5{color:var(--seed-color)}.leechers.svelte-7pdkl5,.error.svelte-7pdkl5{color:var(--leech-color)}#x-tags.svelte-hxarl5{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:var(--content-margin)}.tag-item.svelte-hxarl5{display:inline-flex;align-items:center;justify-content:center;padding:.25rem .6rem .255rem;border-radius:var(--border-radius-small);font-size:.7rem;white-space:nowrap;text-decoration:none;cursor:pointer;font-weight:500;opacity:.75;transition:opacity .1s ease;color:var(--tag-color);background-color:var(--tag-bg);row-gap:.35rem;column-gap:.35rem;transition:opacity .15s ease-in-out}.tag-item.svelte-hxarl5:hover,.tag-item--hover{opacity:1!important;text-decoration:none!important}.tag-res.svelte-hxarl5{background:var(--highlighted)!important;color:#fff!important;opacity:1}.filelist.svelte-eqeghx{background:var(--post-bg);border:1px solid var(--post-border-color);padding:.75rem;border-radius:var(--border-radius-large);margin-bottom:var(--content-margin)}.filelist.svelte-eqeghx i{color:var(--link-color);font-style:normal;font-weight:500}div.svelte-1rhiyed{display:flex;flex-direction:column;gap:1rem;will-change:width;position:relative}.dragging.svelte-1rhiyed{cursor:ew-resize}.loader.svelte-10rouec{width:15%;height:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);pointer-events:none}svg.svelte-10rouec{width:100%;height:auto;will-change:transform}svg.svelte-10rouec path:where(.svelte-10rouec){fill:#fff}.animate.svelte-10rouec{animation:svelte-10rouec-spin 1s linear infinite;transform-origin:center center}@keyframes svelte-10rouec-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.debug.svelte-zizdl6{position:relative;display:flex;flex-direction:column;font-family:monospace;background:var(--button-color);padding:1rem;width:-webkit-fill-available;color:#fff;-webkit-user-select:text;user-select:text;word-wrap:break-word;gap:.4rem}.debug.svelte-zizdl6 a:where(.svelte-zizdl6){color:#fff;text-decoration:none;display:contents}.error.svelte-zizdl6{color:red}.copy.svelte-zizdl6{position:absolute;top:.5rem;right:.5rem;background:none!important;border:none;font-size:1.5rem;cursor:pointer;flex-shrink:0}svg.svelte-zizdl6 path:where(.svelte-zizdl6){transform-origin:center;fill:#fff;transform:translateY(2px)}.section.svelte-ojhdzd{display:flex;padding:1rem;flex-direction:column;align-items:center;-webkit-user-select:none;user-select:none;margin-bottom:var(--content-margin)}a.svelte-ojhdzd{position:relative;display:block;overflow:hidden}.container.svelte-ojhdzd{border-radius:var(--border-radius-small);overflow:hidden}img.svelte-ojhdzd{width:100%;height:auto;border:none;flex:1 0 100%;-webkit-user-select:none;user-select:none;will-change:width;display:block}a.gif.svelte-ojhdzd{width:fit-content}img.gif.svelte-ojhdzd{width:auto;max-width:100%}.incognito.svelte-ojhdzd{filter:var(--incognito-filter)!important}.dragging.svelte-ojhdzd a:where(.svelte-ojhdzd),.dragging.svelte-ojhdzd img:where(.svelte-ojhdzd){pointer-events:none}.forumline.svelte-14j3c1y{padding:1rem;position:relative;display:flex;flex-direction:column;align-items:center}.section.svelte-14j3c1y{margin-bottom:var(--content-margin)}a.svelte-14j3c1y{color:#4da3ff;text-decoration:none}a.svelte-14j3c1y:hover{text-decoration:underline}.post.svelte-14j3c1y{display:flex;gap:1rem;padding:1rem;border-bottom:1px solid var(--post-border-color)}.post.svelte-14j3c1y:nth-child(2n){background-color:var(--post-odd-bg)}.post.svelte-14j3c1y:last-child{border-bottom:none}.avatar.svelte-14j3c1y img:where(.svelte-14j3c1y){width:48px;height:48px;border-radius:var(--border-radius-small);object-fit:cover;border:1px solid var(--post-border-color)}.no-avatar.svelte-14j3c1y{display:flex;width:48px;height:48px;text-align:center;line-height:48px;background:var(--main-bg);border:1px solid var(--post-border-color);border-radius:var(--border-radius-small);font-size:1.3rem;cursor:pointer;justify-content:center;align-items:center}.no-avatar.svelte-14j3c1y svg:where(.svelte-14j3c1y){width:55%;height:55%}.no-avatar.svelte-14j3c1y:hover{text-decoration:none!important}.content.svelte-14j3c1y{flex:1}.header.svelte-14j3c1y{font-size:.8rem;color:#bbb;margin-block-end:.4rem;display:flex;gap:.5rem;align-items:center}.nick.svelte-14j3c1y{font-weight:600}.date.svelte-14j3c1y{all:unset!important;color:var(--post-date-color)!important;font-weight:400!important;opacity:.8!important;cursor:pointer!important}.date.svelte-14j3c1y:hover{opacity:1!important}.message.svelte-14j3c1y{margin:0;line-height:1.4}#ultra-pagination.svelte-13k3ejc{display:flex;justify-content:space-between;font-size:.75rem;font-weight:600;margin-bottom:var(--content-margin)}#ultra-pagination a{text-decoration:none!important} `); const DEV = false; var is_array = Array.isArray; var index_of = Array.prototype.indexOf; var array_from = Array.from; var define_property = Object.defineProperty; var get_descriptor = Object.getOwnPropertyDescriptor; var get_descriptors = Object.getOwnPropertyDescriptors; var object_prototype = Object.prototype; var array_prototype = Array.prototype; var get_prototype_of = Object.getPrototypeOf; var is_extensible = Object.isExtensible; function is_function(thing) { return typeof thing === "function"; } const noop = () => { }; function is_promise(value) { return typeof value?.then === "function"; } function run(fn) { return fn(); } function run_all(arr) { for (var i = 0; i < arr.length; i++) { arr[i](); } } function deferred() { var resolve; var reject; var promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { promise, resolve, reject }; } function to_array(value, n) { if (Array.isArray(value)) { return value; } if (!(Symbol.iterator in value)) { return Array.from(value); } const array = []; for (const element of value) { array.push(element); if (array.length === n) break; } return array; } const DERIVED = 1 << 1; const EFFECT = 1 << 2; const RENDER_EFFECT = 1 << 3; const BLOCK_EFFECT = 1 << 4; const BRANCH_EFFECT = 1 << 5; const ROOT_EFFECT = 1 << 6; const BOUNDARY_EFFECT = 1 << 7; const UNOWNED = 1 << 8; const DISCONNECTED = 1 << 9; const CLEAN = 1 << 10; const DIRTY = 1 << 11; const MAYBE_DIRTY = 1 << 12; const INERT = 1 << 13; const DESTROYED = 1 << 14; const EFFECT_RAN = 1 << 15; const EFFECT_TRANSPARENT = 1 << 16; const INSPECT_EFFECT = 1 << 17; const HEAD_EFFECT = 1 << 18; const EFFECT_PRESERVED = 1 << 19; const USER_EFFECT = 1 << 20; const REACTION_IS_UPDATING = 1 << 21; const ASYNC = 1 << 22; const ERROR_VALUE = 1 << 23; const STATE_SYMBOL = Symbol("$state"); const LEGACY_PROPS = Symbol("legacy props"); const LOADING_ATTR_SYMBOL = Symbol(""); const STALE_REACTION = new class StaleReactionError extends Error { name = "StaleReactionError"; message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; }(); function await_outside_boundary() { { throw new Error(`https://svelte.dev/e/await_outside_boundary`); } } function lifecycle_outside_component(name) { { throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); } } function async_derived_orphan() { { throw new Error(`https://svelte.dev/e/async_derived_orphan`); } } function effect_in_teardown(rune) { { throw new Error(`https://svelte.dev/e/effect_in_teardown`); } } function effect_in_unowned_derived() { { throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); } } function effect_orphan(rune) { { throw new Error(`https://svelte.dev/e/effect_orphan`); } } function effect_update_depth_exceeded() { { throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); } } function state_descriptors_fixed() { { throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); } } function state_prototype_fixed() { { throw new Error(`https://svelte.dev/e/state_prototype_fixed`); } } function state_unsafe_mutation() { { throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); } } const EACH_ITEM_REACTIVE = 1; const EACH_INDEX_REACTIVE = 1 << 1; const EACH_IS_CONTROLLED = 1 << 2; const EACH_IS_ANIMATED = 1 << 3; const EACH_ITEM_IMMUTABLE = 1 << 4; const PROPS_IS_IMMUTABLE = 1; const PROPS_IS_RUNES = 1 << 1; const PROPS_IS_UPDATED = 1 << 2; const PROPS_IS_BINDABLE = 1 << 3; const PROPS_IS_LAZY_INITIAL = 1 << 4; const TRANSITION_IN = 1; const TRANSITION_OUT = 1 << 1; const TRANSITION_GLOBAL = 1 << 2; const TEMPLATE_FRAGMENT = 1; const TEMPLATE_USE_IMPORT_NODE = 1 << 1; const UNINITIALIZED = Symbol(); const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; let hydrating = false; function equals(value) { return value === this.v; } function safe_not_equal(a, b) { return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; } function safe_equals(value) { return !safe_not_equal(value, this.v); } let legacy_mode_flag = false; let tracing_mode_flag = false; function enable_legacy_mode_flag() { legacy_mode_flag = true; } let component_context = null; function set_component_context(context) { component_context = context; } function push(props, runes = false, fn) { component_context = { p: component_context, c: null, e: null, s: props, x: null, l: legacy_mode_flag && !runes ? { s: null, u: null, $: [] } : null }; } function pop(component) { var context = ( component_context ); var effects = context.e; if (effects !== null) { context.e = null; for (var fn of effects) { create_user_effect(fn); } } component_context = context.p; return ( {} ); } function is_runes() { return !legacy_mode_flag || component_context !== null && component_context.l === null; } const adjustments = new WeakMap(); function handle_error(error) { var effect2 = active_effect; if (effect2 === null) { active_reaction.f |= ERROR_VALUE; return error; } if ((effect2.f & EFFECT_RAN) === 0) { if ((effect2.f & BOUNDARY_EFFECT) === 0) { if (!effect2.parent && error instanceof Error) { apply_adjustments(error); } throw error; } effect2.b.error(error); } else { invoke_error_boundary(error, effect2); } } function invoke_error_boundary(error, effect2) { while (effect2 !== null) { if ((effect2.f & BOUNDARY_EFFECT) !== 0) { try { effect2.b.error(error); return; } catch (e) { error = e; } } effect2 = effect2.parent; } if (error instanceof Error) { apply_adjustments(error); } throw error; } function apply_adjustments(error) { const adjusted = adjustments.get(error); if (adjusted) { define_property(error, "message", { value: adjusted.message }); define_property(error, "stack", { value: adjusted.stack }); } } let micro_tasks = []; let idle_tasks = []; function run_micro_tasks() { var tasks2 = micro_tasks; micro_tasks = []; run_all(tasks2); } function run_idle_tasks() { var tasks2 = idle_tasks; idle_tasks = []; run_all(tasks2); } function queue_micro_task(fn) { if (micro_tasks.length === 0) { queueMicrotask(run_micro_tasks); } micro_tasks.push(fn); } function flush_tasks() { if (micro_tasks.length > 0) { run_micro_tasks(); } if (idle_tasks.length > 0) { run_idle_tasks(); } } function get_pending_boundary() { var boundary = ( active_effect.b ); while (boundary !== null && !boundary.has_pending_snippet()) { boundary = boundary.parent; } if (boundary === null) { await_outside_boundary(); } return boundary; } function derived(fn) { var flags = DERIVED | DIRTY; var parent_derived = active_reaction !== null && (active_reaction.f & DERIVED) !== 0 ? ( active_reaction ) : null; if (active_effect === null || parent_derived !== null && (parent_derived.f & UNOWNED) !== 0) { flags |= UNOWNED; } else { active_effect.f |= EFFECT_PRESERVED; } const signal = { ctx: component_context, deps: null, effects: null, equals, f: flags, fn, reactions: null, rv: 0, v: ( UNINITIALIZED ), wv: 0, parent: parent_derived ?? active_effect, ac: null }; return signal; } function async_derived(fn, location2) { let parent = ( active_effect ); if (parent === null) { async_derived_orphan(); } var boundary = ( parent.b ); var promise = ( void 0 ); var signal = source( UNINITIALIZED ); var prev = null; var should_suspend = !active_reaction; async_effect(() => { try { var p = fn(); if (prev) Promise.resolve(p).catch(() => { }); } catch (error) { p = Promise.reject(error); } var r2 = () => p; promise = prev?.then(r2, r2) ?? Promise.resolve(p); prev = promise; var batch = ( current_batch ); var pending = boundary.pending; if (should_suspend) { boundary.update_pending_count(1); if (!pending) batch.increment(); } const handler = (value, error = void 0) => { prev = null; if (!pending) batch.activate(); if (error) { if (error !== STALE_REACTION) { signal.f |= ERROR_VALUE; internal_set(signal, error); } } else { if ((signal.f & ERROR_VALUE) !== 0) { signal.f ^= ERROR_VALUE; } internal_set(signal, value); } if (should_suspend) { boundary.update_pending_count(-1); if (!pending) batch.decrement(); } unset_context(); }; promise.then(handler, (e) => handler(null, e || "unknown")); if (batch) { return () => { queueMicrotask(() => batch.neuter()); }; } }); return new Promise((fulfil) => { function next(p) { function go() { if (p === promise) { fulfil(signal); } else { next(promise); } } p.then(go, go); } next(promise); }); } function user_derived(fn) { const d = derived(fn); push_reaction_value(d); return d; } function derived_safe_equal(fn) { const signal = derived(fn); signal.equals = safe_equals; return signal; } function destroy_derived_effects(derived2) { var effects = derived2.effects; if (effects !== null) { derived2.effects = null; for (var i = 0; i < effects.length; i += 1) { destroy_effect( effects[i] ); } } } function get_derived_parent_effect(derived2) { var parent = derived2.parent; while (parent !== null) { if ((parent.f & DERIVED) === 0) { return ( parent ); } parent = parent.parent; } return null; } function execute_derived(derived2) { var value; var prev_active_effect = active_effect; set_active_effect(get_derived_parent_effect(derived2)); { try { destroy_derived_effects(derived2); value = update_reaction(derived2); } finally { set_active_effect(prev_active_effect); } } return value; } function update_derived(derived2) { var value = execute_derived(derived2); if (!derived2.equals(value)) { derived2.v = value; derived2.wv = increment_write_version(); } if (is_destroying_effect) { return; } { var status = (skip_reaction || (derived2.f & UNOWNED) !== 0) && derived2.deps !== null ? MAYBE_DIRTY : CLEAN; set_signal_status(derived2, status); } } function flatten(sync, async, fn) { const d = is_runes() ? derived : derived_safe_equal; if (async.length === 0) { fn(sync.map(d)); return; } var batch = current_batch; var parent = ( active_effect ); var restore = capture(); var boundary = get_pending_boundary(); Promise.all(async.map((expression) => async_derived(expression))).then((result) => { batch?.activate(); restore(); try { fn([...sync.map(d), ...result]); } catch (error) { if ((parent.f & DESTROYED) === 0) { invoke_error_boundary(error, parent); } } batch?.deactivate(); unset_context(); }).catch((error) => { boundary.error(error); }); } function capture() { var previous_effect = active_effect; var previous_reaction = active_reaction; var previous_component_context = component_context; var previous_batch2 = current_batch; return function restore() { set_active_effect(previous_effect); set_active_reaction(previous_reaction); set_component_context(previous_component_context); previous_batch2?.activate(); }; } function unset_context() { set_active_effect(null); set_active_reaction(null); set_component_context(null); } const batches = new Set(); let current_batch = null; let previous_batch = null; let effect_pending_updates = new Set(); let tasks = []; function dequeue() { const task = ( tasks.shift() ); if (tasks.length > 0) { queueMicrotask(dequeue); } task(); } let queued_root_effects = []; let last_scheduled_effect = null; let is_flushing = false; let is_flushing_sync = false; class Batch { current = new Map(); #previous = new Map(); #callbacks = new Set(); #pending = 0; #deferred = null; #neutered = false; #async_effects = []; #boundary_async_effects = []; #render_effects = []; #effects = []; #block_effects = []; #dirty_effects = []; #maybe_dirty_effects = []; skipped_effects = new Set(); process(root_effects) { queued_root_effects = []; previous_batch = null; for (const root2 of root_effects) { this.#traverse_effect_tree(root2); } if (this.#async_effects.length === 0 && this.#pending === 0) { this.#commit(); var render_effects = this.#render_effects; var effects = this.#effects; this.#render_effects = []; this.#effects = []; this.#block_effects = []; previous_batch = current_batch; current_batch = null; flush_queued_effects(render_effects); flush_queued_effects(effects); if (current_batch === null) { current_batch = this; } else { batches.delete(this); } this.#deferred?.resolve(); } else { this.#defer_effects(this.#render_effects); this.#defer_effects(this.#effects); this.#defer_effects(this.#block_effects); } for (const effect2 of this.#async_effects) { update_effect(effect2); } for (const effect2 of this.#boundary_async_effects) { update_effect(effect2); } this.#async_effects = []; this.#boundary_async_effects = []; } #traverse_effect_tree(root2) { root2.f ^= CLEAN; var effect2 = root2.first; while (effect2 !== null) { var flags = effect2.f; var is_branch = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; var is_skippable_branch = is_branch && (flags & CLEAN) !== 0; var skip = is_skippable_branch || (flags & INERT) !== 0 || this.skipped_effects.has(effect2); if (!skip && effect2.fn !== null) { if (is_branch) { effect2.f ^= CLEAN; } else if ((flags & EFFECT) !== 0) { this.#effects.push(effect2); } else if ((flags & CLEAN) === 0) { if ((flags & ASYNC) !== 0) { var effects = effect2.b?.pending ? this.#boundary_async_effects : this.#async_effects; effects.push(effect2); } else if (is_dirty(effect2)) { if ((effect2.f & BLOCK_EFFECT) !== 0) this.#block_effects.push(effect2); update_effect(effect2); } } var child2 = effect2.first; if (child2 !== null) { effect2 = child2; continue; } } var parent = effect2.parent; effect2 = effect2.next; while (effect2 === null && parent !== null) { effect2 = parent.next; parent = parent.parent; } } } #defer_effects(effects) { for (const e of effects) { const target = (e.f & DIRTY) !== 0 ? this.#dirty_effects : this.#maybe_dirty_effects; target.push(e); set_signal_status(e, CLEAN); } effects.length = 0; } capture(source2, value) { if (!this.#previous.has(source2)) { this.#previous.set(source2, value); } this.current.set(source2, source2.v); } activate() { current_batch = this; } deactivate() { current_batch = null; previous_batch = null; for (const update of effect_pending_updates) { effect_pending_updates.delete(update); update(); if (current_batch !== null) { break; } } } neuter() { this.#neutered = true; } flush() { if (queued_root_effects.length > 0) { flush_effects(); } else { this.#commit(); } if (current_batch !== this) { return; } if (this.#pending === 0) { batches.delete(this); } this.deactivate(); } #commit() { if (!this.#neutered) { for (const fn of this.#callbacks) { fn(); } } this.#callbacks.clear(); } increment() { this.#pending += 1; } decrement() { this.#pending -= 1; if (this.#pending === 0) { for (const e of this.#dirty_effects) { set_signal_status(e, DIRTY); schedule_effect(e); } for (const e of this.#maybe_dirty_effects) { set_signal_status(e, MAYBE_DIRTY); schedule_effect(e); } this.#render_effects = []; this.#effects = []; this.flush(); } else { this.deactivate(); } } add_callback(fn) { this.#callbacks.add(fn); } settled() { return (this.#deferred ??= deferred()).promise; } static ensure() { if (current_batch === null) { const batch = current_batch = new Batch(); batches.add(current_batch); if (!is_flushing_sync) { Batch.enqueue(() => { if (current_batch !== batch) { return; } batch.flush(); }); } } return current_batch; } static enqueue(task) { if (tasks.length === 0) { queueMicrotask(dequeue); } tasks.unshift(task); } } function flushSync(fn) { var was_flushing_sync = is_flushing_sync; is_flushing_sync = true; try { var result; if (fn) ; while (true) { flush_tasks(); if (queued_root_effects.length === 0) { current_batch?.flush(); if (queued_root_effects.length === 0) { last_scheduled_effect = null; return ( result ); } } flush_effects(); } } finally { is_flushing_sync = was_flushing_sync; } } function flush_effects() { var was_updating_effect = is_updating_effect; is_flushing = true; try { var flush_count = 0; set_is_updating_effect(true); while (queued_root_effects.length > 0) { var batch = Batch.ensure(); if (flush_count++ > 1e3) { var updates, entry; if (DEV) ; infinite_loop_guard(); } batch.process(queued_root_effects); old_values.clear(); } } finally { is_flushing = false; set_is_updating_effect(was_updating_effect); last_scheduled_effect = null; } } function infinite_loop_guard() { try { effect_update_depth_exceeded(); } catch (error) { invoke_error_boundary(error, last_scheduled_effect); } } let eager_block_effects = null; function flush_queued_effects(effects) { var length = effects.length; if (length === 0) return; var i = 0; while (i < length) { var effect2 = effects[i++]; if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { eager_block_effects = []; update_effect(effect2); if (effect2.deps === null && effect2.first === null && effect2.nodes_start === null) { if (effect2.teardown === null && effect2.ac === null) { unlink_effect(effect2); } else { effect2.fn = null; } } if (eager_block_effects?.length > 0) { old_values.clear(); for (const e of eager_block_effects) { update_effect(e); } eager_block_effects = []; } } } eager_block_effects = null; } function schedule_effect(signal) { var effect2 = last_scheduled_effect = signal; while (effect2.parent !== null) { effect2 = effect2.parent; var flags = effect2.f; if (is_flushing && effect2 === active_effect && (flags & BLOCK_EFFECT) !== 0) { return; } if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { if ((flags & CLEAN) === 0) return; effect2.f ^= CLEAN; } } queued_root_effects.push(effect2); } const old_values = new Map(); function source(v, stack) { var signal = { f: 0, v, reactions: null, equals, rv: 0, wv: 0 }; return signal; } function state$1(v, stack) { const s = source(v); push_reaction_value(s); return s; } function mutable_source(initial_value, immutable = false, trackable = true) { const s = source(initial_value); if (!immutable) { s.equals = safe_equals; } if (legacy_mode_flag && trackable && component_context !== null && component_context.l !== null) { (component_context.l.s ??= []).push(s); } return s; } function set(source2, value, should_proxy = false) { if (active_reaction !== null && (!untracking || (active_reaction.f & INSPECT_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | INSPECT_EFFECT)) !== 0 && !current_sources?.includes(source2)) { state_unsafe_mutation(); } let new_value = should_proxy ? proxy(value) : value; return internal_set(source2, new_value); } function internal_set(source2, value) { if (!source2.equals(value)) { var old_value = source2.v; if (is_destroying_effect) { old_values.set(source2, value); } else { old_values.set(source2, old_value); } source2.v = value; var batch = Batch.ensure(); batch.capture(source2, old_value); if ((source2.f & DERIVED) !== 0) { if ((source2.f & DIRTY) !== 0) { execute_derived( source2 ); } set_signal_status(source2, (source2.f & UNOWNED) === 0 ? CLEAN : MAYBE_DIRTY); } source2.wv = increment_write_version(); mark_reactions(source2, DIRTY); if (is_runes() && active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { if (untracked_writes === null) { set_untracked_writes([source2]); } else { untracked_writes.push(source2); } } } return value; } function increment(source2) { set(source2, source2.v + 1); } function mark_reactions(signal, status) { var reactions = signal.reactions; if (reactions === null) return; var runes = is_runes(); var length = reactions.length; for (var i = 0; i < length; i++) { var reaction = reactions[i]; var flags = reaction.f; if (!runes && reaction === active_effect) continue; var not_dirty = (flags & DIRTY) === 0; if (not_dirty) { set_signal_status(reaction, status); } if ((flags & DERIVED) !== 0) { mark_reactions( reaction, MAYBE_DIRTY ); } else if (not_dirty) { if ((flags & BLOCK_EFFECT) !== 0) { if (eager_block_effects !== null) { eager_block_effects.push( reaction ); } } schedule_effect( reaction ); } } } function proxy(value) { if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { return value; } const prototype = get_prototype_of(value); if (prototype !== object_prototype && prototype !== array_prototype) { return value; } var sources = new Map(); var is_proxied_array = is_array(value); var version = state$1(0); var parent_version = update_version; var with_parent = (fn) => { if (update_version === parent_version) { return fn(); } var reaction = active_reaction; var version2 = update_version; set_active_reaction(null); set_update_version(parent_version); var result = fn(); set_active_reaction(reaction); set_update_version(version2); return result; }; if (is_proxied_array) { sources.set("length", state$1( value.length )); } return new Proxy( value, { defineProperty(_, prop2, descriptor) { if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { state_descriptors_fixed(); } var s = sources.get(prop2); if (s === void 0) { s = with_parent(() => { var s2 = state$1(descriptor.value); sources.set(prop2, s2); return s2; }); } else { set(s, descriptor.value, true); } return true; }, deleteProperty(target, prop2) { var s = sources.get(prop2); if (s === void 0) { if (prop2 in target) { const s2 = with_parent(() => state$1(UNINITIALIZED)); sources.set(prop2, s2); increment(version); } } else { set(s, UNINITIALIZED); increment(version); } return true; }, get(target, prop2, receiver) { if (prop2 === STATE_SYMBOL) { return value; } var s = sources.get(prop2); var exists = prop2 in target; if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { s = with_parent(() => { var p = proxy(exists ? target[prop2] : UNINITIALIZED); var s2 = state$1(p); return s2; }); sources.set(prop2, s); } if (s !== void 0) { var v = get(s); return v === UNINITIALIZED ? void 0 : v; } return Reflect.get(target, prop2, receiver); }, getOwnPropertyDescriptor(target, prop2) { var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); if (descriptor && "value" in descriptor) { var s = sources.get(prop2); if (s) descriptor.value = get(s); } else if (descriptor === void 0) { var source2 = sources.get(prop2); var value2 = source2?.v; if (source2 !== void 0 && value2 !== UNINITIALIZED) { return { enumerable: true, configurable: true, value: value2, writable: true }; } } return descriptor; }, has(target, prop2) { if (prop2 === STATE_SYMBOL) { return true; } var s = sources.get(prop2); var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { if (s === void 0) { s = with_parent(() => { var p = has ? proxy(target[prop2]) : UNINITIALIZED; var s2 = state$1(p); return s2; }); sources.set(prop2, s); } var value2 = get(s); if (value2 === UNINITIALIZED) { return false; } } return has; }, set(target, prop2, value2, receiver) { var s = sources.get(prop2); var has = prop2 in target; if (is_proxied_array && prop2 === "length") { for (var i = value2; i < s.v; i += 1) { var other_s = sources.get(i + ""); if (other_s !== void 0) { set(other_s, UNINITIALIZED); } else if (i in target) { other_s = with_parent(() => state$1(UNINITIALIZED)); sources.set(i + "", other_s); } } } if (s === void 0) { if (!has || get_descriptor(target, prop2)?.writable) { s = with_parent(() => state$1(void 0)); set(s, proxy(value2)); sources.set(prop2, s); } } else { has = s.v !== UNINITIALIZED; var p = with_parent(() => proxy(value2)); set(s, p); } var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); if (descriptor?.set) { descriptor.set.call(receiver, value2); } if (!has) { if (is_proxied_array && typeof prop2 === "string") { var ls = ( sources.get("length") ); var n = Number(prop2); if (Number.isInteger(n) && n >= ls.v) { set(ls, n + 1); } } increment(version); } return true; }, ownKeys(target) { get(version); var own_keys = Reflect.ownKeys(target).filter((key2) => { var source3 = sources.get(key2); return source3 === void 0 || source3.v !== UNINITIALIZED; }); for (var [key, source2] of sources) { if (source2.v !== UNINITIALIZED && !(key in target)) { own_keys.push(key); } } return own_keys; }, setPrototypeOf() { state_prototype_fixed(); } } ); } var $window; var $document; var is_firefox; var first_child_getter; var next_sibling_getter; function init_operations() { if ($window !== void 0) { return; } $window = window; $document = document; is_firefox = /Firefox/.test(navigator.userAgent); var element_prototype = Element.prototype; var node_prototype = Node.prototype; var text_prototype = Text.prototype; first_child_getter = get_descriptor(node_prototype, "firstChild").get; next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; if (is_extensible(element_prototype)) { element_prototype.__click = void 0; element_prototype.__className = void 0; element_prototype.__attributes = null; element_prototype.__style = void 0; element_prototype.__e = void 0; } if (is_extensible(text_prototype)) { text_prototype.__t = void 0; } } function create_text(value = "") { return document.createTextNode(value); } function get_first_child(node) { return first_child_getter.call(node); } function get_next_sibling(node) { return next_sibling_getter.call(node); } function child(node, is_text) { { return get_first_child(node); } } function first_child(fragment, is_text) { { var first = ( get_first_child( fragment ) ); if (first instanceof Comment && first.data === "") return get_next_sibling(first); return first; } } function sibling(node, count = 1, is_text = false) { let next_sibling = node; while (count--) { next_sibling = get_next_sibling(next_sibling); } { return next_sibling; } } function clear_text_content(node) { node.textContent = ""; } let listening_to_form_reset = false; function add_form_reset_listener() { if (!listening_to_form_reset) { listening_to_form_reset = true; document.addEventListener( "reset", (evt) => { Promise.resolve().then(() => { if (!evt.defaultPrevented) { for ( const e of evt.target.elements ) { e.__on_r?.(); } } }); }, { capture: true } ); } } function without_reactive_context(fn) { var previous_reaction = active_reaction; var previous_effect = active_effect; set_active_reaction(null); set_active_effect(null); try { return fn(); } finally { set_active_reaction(previous_reaction); set_active_effect(previous_effect); } } function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { element.addEventListener(event2, () => without_reactive_context(handler)); const prev = element.__on_r; if (prev) { element.__on_r = () => { prev(); on_reset(true); }; } else { element.__on_r = () => on_reset(true); } add_form_reset_listener(); } function validate_effect(rune) { if (active_effect === null && active_reaction === null) { effect_orphan(); } if (active_reaction !== null && (active_reaction.f & UNOWNED) !== 0 && active_effect === null) { effect_in_unowned_derived(); } if (is_destroying_effect) { effect_in_teardown(); } } function push_effect(effect2, parent_effect) { var parent_last = parent_effect.last; if (parent_last === null) { parent_effect.last = parent_effect.first = effect2; } else { parent_last.next = effect2; effect2.prev = parent_last; parent_effect.last = effect2; } } function create_effect(type, fn, sync, push2 = true) { var parent = active_effect; if (parent !== null && (parent.f & INERT) !== 0) { type |= INERT; } var effect2 = { ctx: component_context, deps: null, nodes_start: null, nodes_end: null, f: type | DIRTY, first: null, fn, last: null, next: null, parent, b: parent && parent.b, prev: null, teardown: null, transitions: null, wv: 0, ac: null }; if (sync) { try { update_effect(effect2); effect2.f |= EFFECT_RAN; } catch (e2) { destroy_effect(effect2); throw e2; } } else if (fn !== null) { schedule_effect(effect2); } if (push2) { var e = effect2; if (sync && e.deps === null && e.teardown === null && e.nodes_start === null && e.first === e.last && (e.f & EFFECT_PRESERVED) === 0) { e = e.first; } if (e !== null) { e.parent = parent; if (parent !== null) { push_effect(e, parent); } if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { var derived2 = ( active_reaction ); (derived2.effects ??= []).push(e); } } } return effect2; } function teardown(fn) { const effect2 = create_effect(RENDER_EFFECT, null, false); set_signal_status(effect2, CLEAN); effect2.teardown = fn; return effect2; } function user_effect(fn) { validate_effect(); var flags = ( active_effect.f ); var defer = !active_reaction && (flags & BRANCH_EFFECT) !== 0 && (flags & EFFECT_RAN) === 0; if (defer) { var context = ( component_context ); (context.e ??= []).push(fn); } else { return create_user_effect(fn); } } function create_user_effect(fn) { return create_effect(EFFECT | USER_EFFECT, fn, false); } function user_pre_effect(fn) { validate_effect(); return create_effect(RENDER_EFFECT | USER_EFFECT, fn, true); } function component_root(fn) { Batch.ensure(); const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn, true); return (options = {}) => { return new Promise((fulfil) => { if (options.outro) { pause_effect(effect2, () => { destroy_effect(effect2); fulfil(void 0); }); } else { destroy_effect(effect2); fulfil(void 0); } }); }; } function effect(fn) { return create_effect(EFFECT, fn, false); } function async_effect(fn) { return create_effect(ASYNC | EFFECT_PRESERVED, fn, true); } function render_effect(fn, flags = 0) { return create_effect(RENDER_EFFECT | flags, fn, true); } function template_effect(fn, sync = [], async = []) { flatten(sync, async, (values) => { create_effect(RENDER_EFFECT, () => fn(...values.map(get)), true); }); } function block(fn, flags = 0) { var effect2 = create_effect(BLOCK_EFFECT | flags, fn, true); return effect2; } function branch(fn, push2 = true) { return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn, true, push2); } function execute_effect_teardown(effect2) { var teardown2 = effect2.teardown; if (teardown2 !== null) { const previously_destroying_effect = is_destroying_effect; const previous_reaction = active_reaction; set_is_destroying_effect(true); set_active_reaction(null); try { teardown2.call(null); } finally { set_is_destroying_effect(previously_destroying_effect); set_active_reaction(previous_reaction); } } } function destroy_effect_children(signal, remove_dom = false) { var effect2 = signal.first; signal.first = signal.last = null; while (effect2 !== null) { const controller = effect2.ac; if (controller !== null) { without_reactive_context(() => { controller.abort(STALE_REACTION); }); } var next = effect2.next; if ((effect2.f & ROOT_EFFECT) !== 0) { effect2.parent = null; } else { destroy_effect(effect2, remove_dom); } effect2 = next; } } function destroy_block_effect_children(signal) { var effect2 = signal.first; while (effect2 !== null) { var next = effect2.next; if ((effect2.f & BRANCH_EFFECT) === 0) { destroy_effect(effect2); } effect2 = next; } } function destroy_effect(effect2, remove_dom = true) { var removed = false; if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes_start !== null && effect2.nodes_end !== null) { remove_effect_dom( effect2.nodes_start, effect2.nodes_end ); removed = true; } destroy_effect_children(effect2, remove_dom && !removed); remove_reactions(effect2, 0); set_signal_status(effect2, DESTROYED); var transitions = effect2.transitions; if (transitions !== null) { for (const transition2 of transitions) { transition2.stop(); } } execute_effect_teardown(effect2); var parent = effect2.parent; if (parent !== null && parent.first !== null) { unlink_effect(effect2); } effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes_start = effect2.nodes_end = effect2.ac = null; } function remove_effect_dom(node, end) { while (node !== null) { var next = node === end ? null : ( get_next_sibling(node) ); node.remove(); node = next; } } function unlink_effect(effect2) { var parent = effect2.parent; var prev = effect2.prev; var next = effect2.next; if (prev !== null) prev.next = next; if (next !== null) next.prev = prev; if (parent !== null) { if (parent.first === effect2) parent.first = next; if (parent.last === effect2) parent.last = prev; } } function pause_effect(effect2, callback) { var transitions = []; pause_children(effect2, transitions, true); run_out_transitions(transitions, () => { destroy_effect(effect2); if (callback) callback(); }); } function run_out_transitions(transitions, fn) { var remaining = transitions.length; if (remaining > 0) { var check = () => --remaining || fn(); for (var transition2 of transitions) { transition2.out(check); } } else { fn(); } } function pause_children(effect2, transitions, local) { if ((effect2.f & INERT) !== 0) return; effect2.f ^= INERT; if (effect2.transitions !== null) { for (const transition2 of effect2.transitions) { if (transition2.is_global || local) { transitions.push(transition2); } } } var child2 = effect2.first; while (child2 !== null) { var sibling2 = child2.next; var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; pause_children(child2, transitions, transparent ? local : false); child2 = sibling2; } } function resume_effect(effect2) { resume_children(effect2, true); } function resume_children(effect2, local) { if ((effect2.f & INERT) === 0) return; effect2.f ^= INERT; if ((effect2.f & CLEAN) === 0) { set_signal_status(effect2, DIRTY); schedule_effect(effect2); } var child2 = effect2.first; while (child2 !== null) { var sibling2 = child2.next; var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; resume_children(child2, transparent ? local : false); child2 = sibling2; } if (effect2.transitions !== null) { for (const transition2 of effect2.transitions) { if (transition2.is_global || local) { transition2.in(); } } } } let is_updating_effect = false; function set_is_updating_effect(value) { is_updating_effect = value; } let is_destroying_effect = false; function set_is_destroying_effect(value) { is_destroying_effect = value; } let active_reaction = null; let untracking = false; function set_active_reaction(reaction) { active_reaction = reaction; } let active_effect = null; function set_active_effect(effect2) { active_effect = effect2; } let current_sources = null; function push_reaction_value(value) { if (active_reaction !== null && true) { if (current_sources === null) { current_sources = [value]; } else { current_sources.push(value); } } } let new_deps = null; let skipped_deps = 0; let untracked_writes = null; function set_untracked_writes(value) { untracked_writes = value; } let write_version = 1; let read_version = 0; let update_version = read_version; function set_update_version(value) { update_version = value; } let skip_reaction = false; function increment_write_version() { return ++write_version; } function is_dirty(reaction) { var flags = reaction.f; if ((flags & DIRTY) !== 0) { return true; } if ((flags & MAYBE_DIRTY) !== 0) { var dependencies = reaction.deps; var is_unowned = (flags & UNOWNED) !== 0; if (dependencies !== null) { var i; var dependency; var is_disconnected = (flags & DISCONNECTED) !== 0; var is_unowned_connected = is_unowned && active_effect !== null && !skip_reaction; var length = dependencies.length; if ((is_disconnected || is_unowned_connected) && (active_effect === null || (active_effect.f & DESTROYED) === 0)) { var derived2 = ( reaction ); var parent = derived2.parent; for (i = 0; i < length; i++) { dependency = dependencies[i]; if (is_disconnected || !dependency?.reactions?.includes(derived2)) { (dependency.reactions ??= []).push(derived2); } } if (is_disconnected) { derived2.f ^= DISCONNECTED; } if (is_unowned_connected && parent !== null && (parent.f & UNOWNED) === 0) { derived2.f ^= UNOWNED; } } for (i = 0; i < length; i++) { dependency = dependencies[i]; if (is_dirty( dependency )) { update_derived( dependency ); } if (dependency.wv > reaction.wv) { return true; } } } if (!is_unowned || active_effect !== null && !skip_reaction) { set_signal_status(reaction, CLEAN); } } return false; } function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { var reactions = signal.reactions; if (reactions === null) return; if (current_sources?.includes(signal)) { return; } for (var i = 0; i < reactions.length; i++) { var reaction = reactions[i]; if ((reaction.f & DERIVED) !== 0) { schedule_possible_effect_self_invalidation( reaction, effect2, false ); } else if (effect2 === reaction) { if (root2) { set_signal_status(reaction, DIRTY); } else if ((reaction.f & CLEAN) !== 0) { set_signal_status(reaction, MAYBE_DIRTY); } schedule_effect( reaction ); } } } function update_reaction(reaction) { var previous_deps = new_deps; var previous_skipped_deps = skipped_deps; var previous_untracked_writes = untracked_writes; var previous_reaction = active_reaction; var previous_skip_reaction = skip_reaction; var previous_sources = current_sources; var previous_component_context = component_context; var previous_untracking = untracking; var previous_update_version = update_version; var flags = reaction.f; new_deps = null; skipped_deps = 0; untracked_writes = null; skip_reaction = (flags & UNOWNED) !== 0 && (untracking || !is_updating_effect || active_reaction === null); active_reaction = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; current_sources = null; set_component_context(reaction.ctx); untracking = false; update_version = ++read_version; if (reaction.ac !== null) { without_reactive_context(() => { reaction.ac.abort(STALE_REACTION); }); reaction.ac = null; } try { reaction.f |= REACTION_IS_UPDATING; var fn = ( reaction.fn ); var result = fn(); var deps = reaction.deps; if (new_deps !== null) { var i; remove_reactions(reaction, skipped_deps); if (deps !== null && skipped_deps > 0) { deps.length = skipped_deps + new_deps.length; for (i = 0; i < new_deps.length; i++) { deps[skipped_deps + i] = new_deps[i]; } } else { reaction.deps = deps = new_deps; } if (!skip_reaction || (flags & DERIVED) !== 0 && reaction.reactions !== null) { for (i = skipped_deps; i < deps.length; i++) { (deps[i].reactions ??= []).push(reaction); } } } else if (deps !== null && skipped_deps < deps.length) { remove_reactions(reaction, skipped_deps); deps.length = skipped_deps; } if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { for (i = 0; i < untracked_writes.length; i++) { schedule_possible_effect_self_invalidation( untracked_writes[i], reaction ); } } if (previous_reaction !== null && previous_reaction !== reaction) { read_version++; if (untracked_writes !== null) { if (previous_untracked_writes === null) { previous_untracked_writes = untracked_writes; } else { previous_untracked_writes.push(... untracked_writes); } } } if ((reaction.f & ERROR_VALUE) !== 0) { reaction.f ^= ERROR_VALUE; } return result; } catch (error) { return handle_error(error); } finally { reaction.f ^= REACTION_IS_UPDATING; new_deps = previous_deps; skipped_deps = previous_skipped_deps; untracked_writes = previous_untracked_writes; active_reaction = previous_reaction; skip_reaction = previous_skip_reaction; current_sources = previous_sources; set_component_context(previous_component_context); untracking = previous_untracking; update_version = previous_update_version; } } function remove_reaction(signal, dependency) { let reactions = dependency.reactions; if (reactions !== null) { var index2 = index_of.call(reactions, signal); if (index2 !== -1) { var new_length = reactions.length - 1; if (new_length === 0) { reactions = dependency.reactions = null; } else { reactions[index2] = reactions[new_length]; reactions.pop(); } } } if (reactions === null && (dependency.f & DERIVED) !== 0 && (new_deps === null || !new_deps.includes(dependency))) { set_signal_status(dependency, MAYBE_DIRTY); if ((dependency.f & (UNOWNED | DISCONNECTED)) === 0) { dependency.f ^= DISCONNECTED; } destroy_derived_effects( dependency ); remove_reactions( dependency, 0 ); } } function remove_reactions(signal, start_index) { var dependencies = signal.deps; if (dependencies === null) return; for (var i = start_index; i < dependencies.length; i++) { remove_reaction(signal, dependencies[i]); } } function update_effect(effect2) { var flags = effect2.f; if ((flags & DESTROYED) !== 0) { return; } set_signal_status(effect2, CLEAN); var previous_effect = active_effect; var was_updating_effect = is_updating_effect; active_effect = effect2; is_updating_effect = true; try { if ((flags & BLOCK_EFFECT) !== 0) { destroy_block_effect_children(effect2); } else { destroy_effect_children(effect2); } execute_effect_teardown(effect2); var teardown2 = update_reaction(effect2); effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; effect2.wv = write_version; var dep; if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; } finally { is_updating_effect = was_updating_effect; active_effect = previous_effect; } } async function tick() { await Promise.resolve(); flushSync(); } function get(signal) { var flags = signal.f; var is_derived = (flags & DERIVED) !== 0; if (active_reaction !== null && !untracking) { var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; if (!destroyed && !current_sources?.includes(signal)) { var deps = active_reaction.deps; if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { if (signal.rv < read_version) { signal.rv = read_version; if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { skipped_deps++; } else if (new_deps === null) { new_deps = [signal]; } else if (!skip_reaction || !new_deps.includes(signal)) { new_deps.push(signal); } } } else { (active_reaction.deps ??= []).push(signal); var reactions = signal.reactions; if (reactions === null) { signal.reactions = [active_reaction]; } else if (!reactions.includes(active_reaction)) { reactions.push(active_reaction); } } } } else if (is_derived && signal.deps === null && signal.effects === null) { var derived2 = ( signal ); var parent = derived2.parent; if (parent !== null && (parent.f & UNOWNED) === 0) { derived2.f ^= UNOWNED; } } if (is_destroying_effect) { if (old_values.has(signal)) { return old_values.get(signal); } if (is_derived) { derived2 = signal; var value = derived2.v; if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { value = execute_derived(derived2); } old_values.set(derived2, value); return value; } } else if (is_derived) { derived2 = signal; if (is_dirty(derived2)) { update_derived(derived2); } } if ((signal.f & ERROR_VALUE) !== 0) { throw signal.v; } return signal.v; } function depends_on_old_values(derived2) { if (derived2.v === UNINITIALIZED) return true; if (derived2.deps === null) return false; for (const dep of derived2.deps) { if (old_values.has(dep)) { return true; } if ((dep.f & DERIVED) !== 0 && depends_on_old_values( dep )) { return true; } } return false; } function untrack(fn) { var previous_untracking = untracking; try { untracking = true; return fn(); } finally { untracking = previous_untracking; } } const STATUS_MASK = -7169; function set_signal_status(signal, status) { signal.f = signal.f & STATUS_MASK | status; } function deep_read_state(value) { if (typeof value !== "object" || !value || value instanceof EventTarget) { return; } if (STATE_SYMBOL in value) { deep_read(value); } else if (!Array.isArray(value)) { for (let key in value) { const prop2 = value[key]; if (typeof prop2 === "object" && prop2 && STATE_SYMBOL in prop2) { deep_read(prop2); } } } } function deep_read(value, visited = new Set()) { if (typeof value === "object" && value !== null && !(value instanceof EventTarget) && !visited.has(value)) { visited.add(value); if (value instanceof Date) { value.getTime(); } for (let key in value) { try { deep_read(value[key], visited); } catch (e) { } } const proto = get_prototype_of(value); if (proto !== Object.prototype && proto !== Array.prototype && proto !== Map.prototype && proto !== Set.prototype && proto !== Date.prototype) { const descriptors = get_descriptors(proto); for (let key in descriptors) { const get2 = descriptors[key].get; if (get2) { try { get2.call(value); } catch (e) { } } } } } } const PASSIVE_EVENTS = ["touchstart", "touchmove"]; function is_passive_event(name) { return PASSIVE_EVENTS.includes(name); } const all_registered_events = new Set(); const root_event_handles = new Set(); function create_event(event_name, dom, handler, options = {}) { function target_handler(event2) { if (!options.capture) { handle_event_propagation.call(dom, event2); } if (!event2.cancelBubble) { return without_reactive_context(() => { return handler?.call(this, event2); }); } } if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { queue_micro_task(() => { dom.addEventListener(event_name, target_handler, options); }); } else { dom.addEventListener(event_name, target_handler, options); } return target_handler; } function on(element, type, handler, options = {}) { var target_handler = create_event(type, element, handler, options); return () => { element.removeEventListener(type, target_handler, options); }; } function event(event_name, dom, handler, capture2, passive) { var options = { capture: capture2, passive }; var target_handler = create_event(event_name, dom, handler, options); if (dom === document.body || dom === window || dom === document || dom instanceof HTMLMediaElement) { teardown(() => { dom.removeEventListener(event_name, target_handler, options); }); } } function delegate(events) { for (var i = 0; i < events.length; i++) { all_registered_events.add(events[i]); } for (var fn of root_event_handles) { fn(events); } } let last_propagated_event = null; function handle_event_propagation(event2) { var handler_element = this; var owner_document = ( handler_element.ownerDocument ); var event_name = event2.type; var path = event2.composedPath?.() || []; var current_target = ( path[0] || event2.target ); last_propagated_event = event2; var path_idx = 0; var handled_at = last_propagated_event === event2 && event2.__root; if (handled_at) { var at_idx = path.indexOf(handled_at); if (at_idx !== -1 && (handler_element === document || handler_element === window)) { event2.__root = handler_element; return; } var handler_idx = path.indexOf(handler_element); if (handler_idx === -1) { return; } if (at_idx <= handler_idx) { path_idx = at_idx; } } current_target = path[path_idx] || event2.target; if (current_target === handler_element) return; define_property(event2, "currentTarget", { configurable: true, get() { return current_target || owner_document; } }); var previous_reaction = active_reaction; var previous_effect = active_effect; set_active_reaction(null); set_active_effect(null); try { var throw_error; var other_errors = []; while (current_target !== null) { var parent_element = current_target.assignedSlot || current_target.parentNode || current_target.host || null; try { var delegated = current_target["__" + event_name]; if (delegated != null && (! current_target.disabled || event2.target === current_target)) { if (is_array(delegated)) { var [fn, ...data2] = delegated; fn.apply(current_target, [event2, ...data2]); } else { delegated.call(current_target, event2); } } } catch (error) { if (throw_error) { other_errors.push(error); } else { throw_error = error; } } if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { break; } current_target = parent_element; } if (throw_error) { for (let error of other_errors) { queueMicrotask(() => { throw error; }); } throw throw_error; } } finally { event2.__root = handler_element; delete event2.currentTarget; set_active_reaction(previous_reaction); set_active_effect(previous_effect); } } function head(render_fn) { var anchor; { anchor = document.head.appendChild(create_text()); } try { block(() => render_fn(anchor), HEAD_EFFECT); } finally { } } function create_fragment_from_html(html2) { var elem = document.createElement("template"); elem.innerHTML = html2.replaceAll("<!>", "<!---->"); return elem.content; } function assign_nodes(start, end) { var effect2 = ( active_effect ); if (effect2.nodes_start === null) { effect2.nodes_start = start; effect2.nodes_end = end; } } function from_html(content, flags) { var is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0; var use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0; var node; var has_start = !content.startsWith("<!>"); return () => { if (node === void 0) { node = create_fragment_from_html(has_start ? content : "<!>" + content); if (!is_fragment) node = get_first_child(node); } var clone = ( use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) ); if (is_fragment) { var start = ( get_first_child(clone) ); var end = ( clone.lastChild ); assign_nodes(start, end); } else { assign_nodes(clone, clone); } return clone; }; } function from_namespace(content, flags, ns = "svg") { var has_start = !content.startsWith("<!>"); var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; var node; return () => { if (!node) { var fragment = ( create_fragment_from_html(wrapped) ); var root2 = ( get_first_child(fragment) ); { node = get_first_child(root2); } } var clone = ( node.cloneNode(true) ); { assign_nodes(clone, clone); } return clone; }; } function from_svg(content, flags) { return from_namespace(content, flags, "svg"); } function text(value = "") { { var t = create_text(value + ""); assign_nodes(t, t); return t; } } function comment() { var frag = document.createDocumentFragment(); var start = document.createComment(""); var anchor = create_text(); frag.append(start, anchor); assign_nodes(start, anchor); return frag; } function append(anchor, dom) { if (anchor === null) { return; } anchor.before( dom ); } let should_intro = true; function set_text(text2, value) { var str = value == null ? "" : typeof value === "object" ? value + "" : value; if (str !== (text2.__t ??= text2.nodeValue)) { text2.__t = str; text2.nodeValue = str + ""; } } function mount(component, options) { return _mount(component, options); } const document_listeners = new Map(); function _mount(Component, { target, anchor, props = {}, events, context, intro = true }) { init_operations(); var registered_events = new Set(); var event_handle = (events2) => { for (var i = 0; i < events2.length; i++) { var event_name = events2[i]; if (registered_events.has(event_name)) continue; registered_events.add(event_name); var passive = is_passive_event(event_name); target.addEventListener(event_name, handle_event_propagation, { passive }); var n = document_listeners.get(event_name); if (n === void 0) { document.addEventListener(event_name, handle_event_propagation, { passive }); document_listeners.set(event_name, 1); } else { document_listeners.set(event_name, n + 1); } } }; event_handle(array_from(all_registered_events)); root_event_handles.add(event_handle); var component = void 0; var unmount = component_root(() => { var anchor_node = anchor ?? target.appendChild(create_text()); branch(() => { if (context) { push({}); var ctx = ( component_context ); ctx.c = context; } if (events) { props.$$events = events; } should_intro = intro; component = Component(anchor_node, props) || {}; should_intro = true; if (context) { pop(); } }); return () => { for (var event_name of registered_events) { target.removeEventListener(event_name, handle_event_propagation); var n = ( document_listeners.get(event_name) ); if (--n === 0) { document.removeEventListener(event_name, handle_event_propagation); document_listeners.delete(event_name); } else { document_listeners.set(event_name, n); } } root_event_handles.delete(event_handle); if (anchor_node !== anchor) { anchor_node.parentNode?.removeChild(anchor_node); } }; }); mounted_components.set(component, unmount); return component; } let mounted_components = new WeakMap(); const PENDING = 0; const THEN = 1; const CATCH = 2; function await_block(node, get_input, pending_fn, then_fn, catch_fn) { var anchor = node; var runes = is_runes(); var active_component_context = component_context; var input = UNINITIALIZED; var pending_effect; var then_effect; var catch_effect; var input_source = runes ? source( void 0 ) : mutable_source( void 0, false, false ); var error_source = runes ? source(void 0) : mutable_source(void 0, false, false); var resolved = false; function update(state2, restore) { resolved = true; if (restore) { set_active_effect(effect2); set_active_reaction(effect2); set_component_context(active_component_context); } try { if (state2 === PENDING && pending_fn) ; if (state2 === THEN && then_fn) { if (then_effect) resume_effect(then_effect); else then_effect = branch(() => then_fn(anchor, input_source)); } if (state2 === CATCH && catch_fn) ; if (state2 !== PENDING && pending_effect) { pause_effect(pending_effect, () => pending_effect = null); } if (state2 !== THEN && then_effect) { pause_effect(then_effect, () => then_effect = null); } if (state2 !== CATCH && catch_effect) { pause_effect(catch_effect, () => catch_effect = null); } } finally { if (restore) { set_component_context(null); set_active_reaction(null); set_active_effect(null); flushSync(); } } } var effect2 = block(() => { if (input === (input = get_input())) return; if (is_promise(input)) { var promise = input; resolved = false; promise.then( (value) => { if (promise !== input) return; internal_set(input_source, value); update(THEN, true); }, (error) => { if (promise !== input) return; internal_set(error_source, error); update(CATCH, true); { throw error_source.v; } } ); { queue_micro_task(() => { if (!resolved) update(PENDING, true); }); } } else { internal_set(input_source, input); update(THEN, false); } return () => input = UNINITIALIZED; }); } function if_block(node, fn, elseif = false) { var anchor = node; var consequent_effect = null; var alternate_effect = null; var condition = UNINITIALIZED; var flags = elseif ? EFFECT_TRANSPARENT : 0; var has_branch = false; const set_branch = (fn2, flag = true) => { has_branch = true; update_branch(flag, fn2); }; function commit() { var active = condition ? consequent_effect : alternate_effect; var inactive = condition ? alternate_effect : consequent_effect; if (active) { resume_effect(active); } if (inactive) { pause_effect(inactive, () => { if (condition) { alternate_effect = null; } else { consequent_effect = null; } }); } } const update_branch = (new_condition, fn2) => { if (condition === (condition = new_condition)) return; var target = anchor; if (condition) { consequent_effect ??= fn2 && branch(() => fn2(target)); } else { alternate_effect ??= fn2 && branch(() => fn2(target)); } { commit(); } }; block(() => { has_branch = false; fn(set_branch); if (!has_branch) { update_branch(null, null); } }, flags); } function index(_, i) { return i; } function pause_effects(state2, items, controlled_anchor) { var items_map = state2.items; var transitions = []; var length = items.length; for (var i = 0; i < length; i++) { pause_children(items[i].e, transitions, true); } var is_controlled = length > 0 && transitions.length === 0 && controlled_anchor !== null; if (is_controlled) { var parent_node = ( controlled_anchor.parentNode ); clear_text_content(parent_node); parent_node.append( controlled_anchor ); items_map.clear(); link(state2, items[0].prev, items[length - 1].next); } run_out_transitions(transitions, () => { for (var i2 = 0; i2 < length; i2++) { var item = items[i2]; if (!is_controlled) { items_map.delete(item.k); link(state2, item.prev, item.next); } destroy_effect(item.e, !is_controlled); } }); } function each(node, flags, get_collection, get_key, render_fn, fallback_fn = null) { var anchor = node; var state2 = { flags, items: new Map(), first: null }; var is_controlled = (flags & EACH_IS_CONTROLLED) !== 0; if (is_controlled) { var parent_node = ( node ); anchor = parent_node.appendChild(create_text()); } var fallback = null; var was_empty = false; var offscreen_items = new Map(); var each_array = derived_safe_equal(() => { var collection = get_collection(); return is_array(collection) ? collection : collection == null ? [] : array_from(collection); }); var array; var each_effect; function commit() { reconcile( each_effect, array, state2, offscreen_items, anchor, render_fn, flags, get_key, get_collection ); if (fallback_fn !== null) { if (array.length === 0) { if (fallback) { resume_effect(fallback); } else { fallback = branch(() => fallback_fn(anchor)); } } else if (fallback !== null) { pause_effect(fallback, () => { fallback = null; }); } } } block(() => { each_effect ??= active_effect; array = get(each_array); var length = array.length; if (was_empty && length === 0) { return; } was_empty = length === 0; { { commit(); } } get(each_array); }); } function reconcile(each_effect, array, state2, offscreen_items, anchor, render_fn, flags, get_key, get_collection) { var is_animated = (flags & EACH_IS_ANIMATED) !== 0; var should_update = (flags & (EACH_ITEM_REACTIVE | EACH_INDEX_REACTIVE)) !== 0; var length = array.length; var items = state2.items; var first = state2.first; var current = first; var seen; var prev = null; var to_animate; var matched = []; var stashed = []; var value; var key; var item; var i; if (is_animated) { for (i = 0; i < length; i += 1) { value = array[i]; key = get_key(value, i); item = items.get(key); if (item !== void 0) { item.a?.measure(); (to_animate ??= new Set()).add(item); } } } for (i = 0; i < length; i += 1) { value = array[i]; key = get_key(value, i); item = items.get(key); if (item === void 0) { var pending = offscreen_items.get(key); if (pending !== void 0) { offscreen_items.delete(key); items.set(key, pending); var next = prev ? prev.next : current; link(state2, prev, pending); link(state2, pending, next); move(pending, next, anchor); prev = pending; } else { var child_anchor = current ? ( current.e.nodes_start ) : anchor; prev = create_item( child_anchor, state2, prev, prev === null ? state2.first : prev.next, value, key, i, render_fn, flags, get_collection ); } items.set(key, prev); matched = []; stashed = []; current = prev.next; continue; } if (should_update) { update_item(item, value, i, flags); } if ((item.e.f & INERT) !== 0) { resume_effect(item.e); if (is_animated) { item.a?.unfix(); (to_animate ??= new Set()).delete(item); } } if (item !== current) { if (seen !== void 0 && seen.has(item)) { if (matched.length < stashed.length) { var start = stashed[0]; var j; prev = start.prev; var a = matched[0]; var b = matched[matched.length - 1]; for (j = 0; j < matched.length; j += 1) { move(matched[j], start, anchor); } for (j = 0; j < stashed.length; j += 1) { seen.delete(stashed[j]); } link(state2, a.prev, b.next); link(state2, prev, a); link(state2, b, start); current = start; prev = b; i -= 1; matched = []; stashed = []; } else { seen.delete(item); move(item, current, anchor); link(state2, item.prev, item.next); link(state2, item, prev === null ? state2.first : prev.next); link(state2, prev, item); prev = item; } continue; } matched = []; stashed = []; while (current !== null && current.k !== key) { if ((current.e.f & INERT) === 0) { (seen ??= new Set()).add(current); } stashed.push(current); current = current.next; } if (current === null) { continue; } item = current; } matched.push(item); prev = item; current = item.next; } if (current !== null || seen !== void 0) { var to_destroy = seen === void 0 ? [] : array_from(seen); while (current !== null) { if ((current.e.f & INERT) === 0) { to_destroy.push(current); } current = current.next; } var destroy_length = to_destroy.length; if (destroy_length > 0) { var controlled_anchor = (flags & EACH_IS_CONTROLLED) !== 0 && length === 0 ? anchor : null; if (is_animated) { for (i = 0; i < destroy_length; i += 1) { to_destroy[i].a?.measure(); } for (i = 0; i < destroy_length; i += 1) { to_destroy[i].a?.fix(); } } pause_effects(state2, to_destroy, controlled_anchor); } } if (is_animated) { queue_micro_task(() => { if (to_animate === void 0) return; for (item of to_animate) { item.a?.apply(); } }); } each_effect.first = state2.first && state2.first.e; each_effect.last = prev && prev.e; for (var unused of offscreen_items.values()) { destroy_effect(unused.e); } offscreen_items.clear(); } function update_item(item, value, index2, type) { if ((type & EACH_ITEM_REACTIVE) !== 0) { internal_set(item.v, value); } if ((type & EACH_INDEX_REACTIVE) !== 0) { internal_set( item.i, index2 ); } else { item.i = index2; } } function create_item(anchor, state2, prev, next, value, key, index2, render_fn, flags, get_collection, deferred2) { var reactive = (flags & EACH_ITEM_REACTIVE) !== 0; var mutable = (flags & EACH_ITEM_IMMUTABLE) === 0; var v = reactive ? mutable ? mutable_source(value, false, false) : source(value) : value; var i = (flags & EACH_INDEX_REACTIVE) === 0 ? index2 : source(index2); var item = { i, v, k: key, a: null, e: null, prev, next }; try { if (anchor === null) { var fragment = document.createDocumentFragment(); fragment.append(anchor = create_text()); } item.e = branch(() => render_fn( anchor, v, i, get_collection ), hydrating); item.e.prev = prev && prev.e; item.e.next = next && next.e; if (prev === null) { if (!deferred2) { state2.first = item; } } else { prev.next = item; prev.e.next = item.e; } if (next !== null) { next.prev = item; next.e.prev = item.e; } return item; } finally { } } function move(item, next, anchor) { var end = item.next ? ( item.next.e.nodes_start ) : anchor; var dest = next ? ( next.e.nodes_start ) : anchor; var node = ( item.e.nodes_start ); while (node !== null && node !== end) { var next_node = ( get_next_sibling(node) ); dest.before(node); node = next_node; } } function link(state2, prev, next) { if (prev === null) { state2.first = next; } else { prev.next = next; prev.e.next = next && next.e; } if (next !== null) { next.prev = prev; next.e.prev = prev && prev.e; } } function html(node, get_value, svg = false, mathml = false, skip_warning = false) { var anchor = node; var value = ""; template_effect(() => { var effect2 = ( active_effect ); if (value === (value = get_value() ?? "")) { return; } if (effect2.nodes_start !== null) { remove_effect_dom( effect2.nodes_start, effect2.nodes_end ); effect2.nodes_start = effect2.nodes_end = null; } if (value === "") return; var html2 = value + ""; if (svg) html2 = `<svg>${html2}</svg>`; else if (mathml) html2 = `<math>${html2}</math>`; var node2 = create_fragment_from_html(html2); if (svg || mathml) { node2 = get_first_child(node2); } assign_nodes( get_first_child(node2), node2.lastChild ); if (svg || mathml) { while ( get_first_child(node2)) { anchor.before( get_first_child(node2) ); } } else { anchor.before(node2); } }); } function snippet(node, get_snippet, ...args) { var anchor = node; var snippet2 = noop; var snippet_effect; block(() => { if (snippet2 === (snippet2 = get_snippet())) return; if (snippet_effect) { destroy_effect(snippet_effect); snippet_effect = null; } snippet_effect = branch(() => ( snippet2(anchor, ...args) )); }, EFFECT_TRANSPARENT); } function attach(node, get_fn) { var fn = void 0; var e; block(() => { if (fn !== (fn = get_fn())) { if (e) { destroy_effect(e); e = null; } if (fn) { e = branch(() => { effect(() => ( fn(node) )); }); } } }); } function r(e) { var t, f, n = ""; if ("string" == typeof e || "number" == typeof e) n += e; else if ("object" == typeof e) if (Array.isArray(e)) { var o = e.length; for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f); } else for (f in e) e[f] && (n && (n += " "), n += f); return n; } function clsx$1() { for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t); return n; } function clsx(value) { if (typeof value === "object") { return clsx$1(value); } else { return value ?? ""; } } const whitespace = [..." \n\r\f \v\uFEFF"]; function to_class(value, hash, directives) { var classname = value == null ? "" : "" + value; if (hash) { classname = classname ? classname + " " + hash : hash; } if (directives) { for (var key in directives) { if (directives[key]) { classname = classname ? classname + " " + key : key; } else if (classname.length) { var len = key.length; var a = 0; while ((a = classname.indexOf(key, a)) >= 0) { var b = a + len; if ((a === 0 || whitespace.includes(classname[a - 1])) && (b === classname.length || whitespace.includes(classname[b]))) { classname = (a === 0 ? "" : classname.substring(0, a)) + classname.substring(b + 1); } else { a = b; } } } } } return classname === "" ? null : classname; } function append_styles(styles, important = false) { var separator = important ? " !important;" : ";"; var css = ""; for (var key in styles) { var value = styles[key]; if (value != null && value !== "") { css += " " + key + ": " + value + separator; } } return css; } function to_style(value, styles) { if (styles) { var new_style = ""; var normal_styles; var important_styles; if (Array.isArray(styles)) { normal_styles = styles[0]; important_styles = styles[1]; } else { normal_styles = styles; } if (normal_styles) { new_style += append_styles(normal_styles); } if (important_styles) { new_style += append_styles(important_styles, true); } new_style = new_style.trim(); return new_style === "" ? null : new_style; } return String(value); } function set_class(dom, is_html, value, hash, prev_classes, next_classes) { var prev = dom.__className; if (prev !== value || prev === void 0) { var next_class_name = to_class(value, hash, next_classes); { if (next_class_name == null) { dom.removeAttribute("class"); } else { dom.className = next_class_name; } } dom.__className = value; } else if (next_classes && prev_classes !== next_classes) { for (var key in next_classes) { var is_present = !!next_classes[key]; if (prev_classes == null || is_present !== !!prev_classes[key]) { dom.classList.toggle(key, is_present); } } } return next_classes; } function update_styles(dom, prev = {}, next, priority) { for (var key in next) { var value = next[key]; if (prev[key] !== value) { if (next[key] == null) { dom.style.removeProperty(key); } else { dom.style.setProperty(key, value, priority); } } } } function set_style(dom, value, prev_styles, next_styles) { var prev = dom.__style; if (prev !== value) { var next_style_attr = to_style(value, next_styles); { if (next_style_attr == null) { dom.removeAttribute("style"); } else { dom.style.cssText = next_style_attr; } } dom.__style = value; } else if (next_styles) { if (Array.isArray(next_styles)) { update_styles(dom, prev_styles?.[0], next_styles[0]); update_styles(dom, prev_styles?.[1], next_styles[1], "important"); } else { update_styles(dom, prev_styles, next_styles); } } return next_styles; } const IS_CUSTOM_ELEMENT = Symbol("is custom element"); const IS_HTML = Symbol("is html"); function set_attribute(element, attribute, value, skip_warning) { var attributes = get_attributes(element); if (attributes[attribute] === (attributes[attribute] = value)) return; if (attribute === "loading") { element[LOADING_ATTR_SYMBOL] = value; } if (value == null) { element.removeAttribute(attribute); } else if (typeof value !== "string" && get_setters(element).includes(attribute)) { element[attribute] = value; } else { element.setAttribute(attribute, value); } } function get_attributes(element) { return ( element.__attributes ??= { [IS_CUSTOM_ELEMENT]: element.nodeName.includes("-"), [IS_HTML]: element.namespaceURI === NAMESPACE_HTML } ); } var setters_cache = new Map(); function get_setters(element) { var cache_key = element.getAttribute("is") || element.nodeName; var setters = setters_cache.get(cache_key); if (setters) return setters; setters_cache.set(cache_key, setters = []); var descriptors; var proto = element; var element_proto = Element.prototype; while (element_proto !== proto) { descriptors = get_descriptors(proto); for (var key in descriptors) { if (descriptors[key].set) { setters.push(key); } } proto = get_prototype_of(proto); } return setters; } const now = () => performance.now(); const raf = { tick: ( (_) => requestAnimationFrame(_) ), now: () => now(), tasks: new Set() }; function run_tasks() { const now2 = raf.now(); raf.tasks.forEach((task) => { if (!task.c(now2)) { raf.tasks.delete(task); task.f(); } }); if (raf.tasks.size !== 0) { raf.tick(run_tasks); } } function loop(callback) { let task; if (raf.tasks.size === 0) { raf.tick(run_tasks); } return { promise: new Promise((fulfill) => { raf.tasks.add(task = { c: callback, f: fulfill }); }), abort() { raf.tasks.delete(task); } }; } function dispatch_event(element, type) { without_reactive_context(() => { element.dispatchEvent(new CustomEvent(type)); }); } function css_property_to_camelcase(style) { if (style === "float") return "cssFloat"; if (style === "offset") return "cssOffset"; if (style.startsWith("--")) return style; const parts = style.split("-"); if (parts.length === 1) return parts[0]; return parts[0] + parts.slice(1).map( (word) => word[0].toUpperCase() + word.slice(1) ).join(""); } function css_to_keyframe(css) { const keyframe = {}; const parts = css.split(";"); for (const part of parts) { const [property, value] = part.split(":"); if (!property || value === void 0) break; const formatted_property = css_property_to_camelcase(property.trim()); keyframe[formatted_property] = value.trim(); } return keyframe; } const linear$1 = (t) => t; function transition(flags, element, get_fn, get_params) { var is_intro = (flags & TRANSITION_IN) !== 0; var is_outro = (flags & TRANSITION_OUT) !== 0; var is_both = is_intro && is_outro; var is_global = (flags & TRANSITION_GLOBAL) !== 0; var direction = is_both ? "both" : is_intro ? "in" : "out"; var current_options; var inert = element.inert; var overflow = element.style.overflow; var intro; var outro; function get_options() { return without_reactive_context(() => { return current_options ??= get_fn()(element, get_params?.() ?? {}, { direction }); }); } var transition2 = { is_global, in() { element.inert = inert; if (!is_intro) { outro?.abort(); outro?.reset?.(); return; } if (!is_outro) { intro?.abort(); } dispatch_event(element, "introstart"); intro = animate(element, get_options(), outro, 1, () => { dispatch_event(element, "introend"); intro?.abort(); intro = current_options = void 0; element.style.overflow = overflow; }); }, out(fn) { if (!is_outro) { fn?.(); current_options = void 0; return; } element.inert = true; dispatch_event(element, "outrostart"); outro = animate(element, get_options(), intro, 0, () => { dispatch_event(element, "outroend"); fn?.(); }); }, stop: () => { intro?.abort(); outro?.abort(); } }; var e = ( active_effect ); (e.transitions ??= []).push(transition2); if (is_intro && should_intro) { var run2 = is_global; if (!run2) { var block2 = ( e.parent ); while (block2 && (block2.f & EFFECT_TRANSPARENT) !== 0) { while (block2 = block2.parent) { if ((block2.f & BLOCK_EFFECT) !== 0) break; } } run2 = !block2 || (block2.f & EFFECT_RAN) !== 0; } if (run2) { effect(() => { untrack(() => transition2.in()); }); } } } function animate(element, options, counterpart, t2, on_finish) { var is_intro = t2 === 1; if (is_function(options)) { var a; var aborted = false; queue_micro_task(() => { if (aborted) return; var o = options({ direction: is_intro ? "in" : "out" }); a = animate(element, o, counterpart, t2, on_finish); }); return { abort: () => { aborted = true; a?.abort(); }, deactivate: () => a.deactivate(), reset: () => a.reset(), t: () => a.t() }; } counterpart?.deactivate(); if (!options?.duration) { on_finish(); return { abort: noop, deactivate: noop, reset: noop, t: () => t2 }; } const { delay = 0, css, tick: tick2, easing = linear$1 } = options; var keyframes = []; if (is_intro && counterpart === void 0) { if (tick2) { tick2(0, 1); } if (css) { var styles = css_to_keyframe(css(0, 1)); keyframes.push(styles, styles); } } var get_t = () => 1 - t2; var animation = element.animate(keyframes, { duration: delay, fill: "forwards" }); animation.onfinish = () => { animation.cancel(); var t1 = counterpart?.t() ?? 1 - t2; counterpart?.abort(); var delta = t2 - t1; var duration = ( options.duration * Math.abs(delta) ); var keyframes2 = []; if (duration > 0) { var needs_overflow_hidden = false; if (css) { var n = Math.ceil(duration / (1e3 / 60)); for (var i = 0; i <= n; i += 1) { var t = t1 + delta * easing(i / n); var styles2 = css_to_keyframe(css(t, 1 - t)); keyframes2.push(styles2); needs_overflow_hidden ||= styles2.overflow === "hidden"; } } if (needs_overflow_hidden) { element.style.overflow = "hidden"; } get_t = () => { var time = ( animation.currentTime ); return t1 + delta * easing(time / duration); }; if (tick2) { loop(() => { if (animation.playState !== "running") return false; var t3 = get_t(); tick2(t3, 1 - t3); return true; }); } } animation = element.animate(keyframes2, { duration, fill: "forwards" }); animation.onfinish = () => { get_t = () => t2; tick2?.(t2, 1 - t2); on_finish(); }; }; return { abort: () => { if (animation) { animation.cancel(); animation.effect = null; animation.onfinish = noop; } }, deactivate: () => { on_finish = noop; }, reset: () => { if (t2 === 0) { tick2?.(1, 0); } }, t: () => get_t() }; } function bind_value(input, get2, set2 = get2) { var batches2 = new WeakSet(); listen_to_event_and_reset_event(input, "input", async (is_reset) => { var value = is_reset ? input.defaultValue : input.value; value = is_numberlike_input(input) ? to_number(value) : value; set2(value); if (current_batch !== null) { batches2.add(current_batch); } await tick(); if (value !== (value = get2())) { var start = input.selectionStart; var end = input.selectionEnd; input.value = value ?? ""; if (end !== null) { input.selectionStart = start; input.selectionEnd = Math.min(end, input.value.length); } } }); if ( untrack(get2) == null && input.value ) { set2(is_numberlike_input(input) ? to_number(input.value) : input.value); if (current_batch !== null) { batches2.add(current_batch); } } render_effect(() => { var value = get2(); if (input === document.activeElement) { var batch = ( previous_batch ?? current_batch ); if (batches2.has(batch)) { return; } } if (is_numberlike_input(input) && value === to_number(input.value)) { return; } if (input.type === "date" && !value && !input.value) { return; } if (value !== input.value) { input.value = value ?? ""; } }); } function bind_checked(input, get2, set2 = get2) { listen_to_event_and_reset_event(input, "change", (is_reset) => { var value = is_reset ? input.defaultChecked : input.checked; set2(value); }); if ( untrack(get2) == null ) { set2(input.checked); } render_effect(() => { var value = get2(); input.checked = Boolean(value); }); } function is_numberlike_input(input) { var type = input.type; return type === "number" || type === "range"; } function to_number(value) { return value === "" ? null : +value; } class ResizeObserverSingleton { #listeners = new WeakMap(); #observer; #options; static entries = new WeakMap(); constructor(options) { this.#options = options; } observe(element, listener) { var listeners = this.#listeners.get(element) || new Set(); listeners.add(listener); this.#listeners.set(element, listeners); this.#getObserver().observe(element, this.#options); return () => { var listeners2 = this.#listeners.get(element); listeners2.delete(listener); if (listeners2.size === 0) { this.#listeners.delete(element); this.#observer.unobserve(element); } }; } #getObserver() { return this.#observer ?? (this.#observer = new ResizeObserver( (entries) => { for (var entry of entries) { ResizeObserverSingleton.entries.set(entry.target, entry); for (var listener of this.#listeners.get(entry.target) || []) { listener(entry); } } } )); } } var resize_observer_border_box = new ResizeObserverSingleton({ box: "border-box" }); function bind_element_size(element, type, set2) { var unsub = resize_observer_border_box.observe(element, () => set2(element[type])); effect(() => { untrack(() => set2(element[type])); return unsub; }); } function is_bound_this(bound_value, element_or_component) { return bound_value === element_or_component || bound_value?.[STATE_SYMBOL] === element_or_component; } function bind_this(element_or_component = {}, update, get_value, get_parts) { effect(() => { var old_parts; var parts; render_effect(() => { old_parts = parts; parts = get_parts?.() || []; untrack(() => { if (element_or_component !== get_value(...parts)) { update(element_or_component, ...parts); if (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) { update(null, ...old_parts); } } }); }); return () => { queue_micro_task(() => { if (parts && is_bound_this(get_value(...parts), element_or_component)) { update(null, ...parts); } }); }; }); return element_or_component; } function init(immutable = false) { const context = ( component_context ); const callbacks = context.l.u; if (!callbacks) return; let props = () => deep_read_state(context.s); if (immutable) { let version = 0; let prev = ( {} ); const d = derived(() => { let changed = false; const props2 = context.s; for (const key in props2) { if (props2[key] !== prev[key]) { prev[key] = props2[key]; changed = true; } } if (changed) version++; return version; }); props = () => get(d); } if (callbacks.b.length) { user_pre_effect(() => { observe_all(context, props); run_all(callbacks.b); }); } user_effect(() => { const fns = untrack(() => callbacks.m.map(run)); return () => { for (const fn of fns) { if (typeof fn === "function") { fn(); } } }; }); if (callbacks.a.length) { user_effect(() => { observe_all(context, props); run_all(callbacks.a); }); } } function observe_all(context, props) { if (context.l.s) { for (const signal of context.l.s) get(signal); } props(); } function reactive_import(fn) { var s = source(0); return function() { if (arguments.length === 1) { set(s, get(s) + 1); return arguments[0]; } else { get(s); return fn(); } }; } let is_store_binding = false; function capture_store_binding(fn) { var previous_is_store_binding = is_store_binding; try { is_store_binding = false; return [fn(), is_store_binding]; } finally { is_store_binding = previous_is_store_binding; } } function prop(props, key, flags, fallback) { var runes = !legacy_mode_flag || (flags & PROPS_IS_RUNES) !== 0; var bindable = (flags & PROPS_IS_BINDABLE) !== 0; var lazy = (flags & PROPS_IS_LAZY_INITIAL) !== 0; var fallback_value = ( fallback ); var fallback_dirty = true; var get_fallback = () => { if (fallback_dirty) { fallback_dirty = false; fallback_value = lazy ? untrack( fallback ) : ( fallback ); } return fallback_value; }; var setter; if (bindable) { var is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props; setter = get_descriptor(props, key)?.set ?? (is_entry_props && key in props ? (v) => props[key] = v : void 0); } var initial_value; var is_store_sub = false; if (bindable) { [initial_value, is_store_sub] = capture_store_binding(() => ( props[key] )); } else { initial_value = props[key]; } var getter; if (runes) { getter = () => { var value = ( props[key] ); if (value === void 0) return get_fallback(); fallback_dirty = true; return value; }; } else { getter = () => { var value = ( props[key] ); if (value !== void 0) { fallback_value = void 0; } return value === void 0 ? fallback_value : value; }; } if (runes && (flags & PROPS_IS_UPDATED) === 0) { return getter; } if (setter) { var legacy_parent = props.$$legacy; return ( (function(value, mutation) { if (arguments.length > 0) { if (!runes || !mutation || legacy_parent || is_store_sub) { setter(mutation ? getter() : value); } return value; } return getter(); }) ); } var overridden = false; var d = ((flags & PROPS_IS_IMMUTABLE) !== 0 ? derived : derived_safe_equal)(() => { overridden = false; return getter(); }); if (bindable) get(d); var parent_effect = ( active_effect ); return ( (function(value, mutation) { if (arguments.length > 0) { const new_value = mutation ? get(d) : runes && bindable ? proxy(value) : value; set(d, new_value); overridden = true; if (fallback_value !== void 0) { fallback_value = new_value; } return value; } if (is_destroying_effect && overridden || (parent_effect.f & DESTROYED) !== 0) { return d.v; } return get(d); }) ); } function onMount(fn) { if (component_context === null) { lifecycle_outside_component(); } if (legacy_mode_flag && component_context.l !== null) { init_update_callbacks(component_context).m.push(fn); } else { user_effect(() => { const cleanup = untrack(fn); if (typeof cleanup === "function") return ( cleanup ); }); } } function onDestroy(fn) { if (component_context === null) { lifecycle_outside_component(); } onMount(() => () => untrack(fn)); } function init_update_callbacks(context) { var l = ( context.l ); return l.u ??= { a: [], b: [], m: [] }; } const PUBLIC_VERSION = "5"; if (typeof window !== "undefined") { ((window.__svelte ??= {}).v ??= new Set()).add(PUBLIC_VERSION); } function cubicOut(t) { const f = t - 1; return f * f * f + 1; } function quadInOut(t) { t /= 0.5; if (t < 1) return 0.5 * t * t; t--; return -0.5 * (t * (t - 2) - 1); } const LINKS_KEY = "performer-links"; const defaultLinks = [ { label: "Pornolab", url: "http://pornolab.net/forum/tracker.php?search_id=&nm={q}" }, { label: "Simpcity", url: "https://simpcity.su/search/1/?page=99&o=date&q={q}" }, { label: "MissAV", url: "https://missav.ws/en/search/{q}" }, { label: "Bunkr", url: "https://bunkr-albums.io/?search={q}" } ]; function generateId(link2) { const performerLink = { ...link2 }; performerLink.id = crypto.randomUUID(); return performerLink; } function stripId(link2) { const performerLink = { ...link2 }; delete performerLink.id; return performerLink; } function savePerformerLinks() { const stored = store.performerLinks.map(stripId); localStorage.setItem(LINKS_KEY, JSON.stringify(stored)); } function loadPerformerLinks() { try { const stored = localStorage.getItem(LINKS_KEY); if (stored === null) return defaultLinks.map(generateId); const parsed = JSON.parse(stored); return parsed.map(generateId); } catch { return defaultLinks.map(generateId); } } function addPerformerLink() { const emptyLink = { label: "", url: "" }; store.performerLinks.push(generateId(emptyLink)); savePerformerLinks(); } function removePerformerLink(index2) { if (index2 < 0 || index2 >= store.performerLinks.length) return; store.performerLinks.splice(index2, 1); savePerformerLinks(); } function updatePerformerLink(index2, data2) { if (index2 < 0 || index2 >= store.performerLinks.length) return; const link2 = store.performerLinks[index2]; if (link2) Object.assign(link2, data2); savePerformerLinks(); } function getLinkUrl(link2, query) { const linkUrl = link2.url; if (!query || !linkUrl.includes("{q}")) return linkUrl; return linkUrl.replace("{q}", encodeURIComponent(query)); } function getFaviconUrl(url) { try { const domain = new URL(url).host; return `https://icons.duckduckgo.com/ip3/${domain}.ico`; } catch { return "https://icons.duckduckgo.com/ip3/invalid.ico"; } } function restorePerformerLinks() { localStorage.removeItem(LINKS_KEY); for (let i = 0; i < defaultLinks.length; i++) { const defaultSite = defaultLinks[i]; if (i < store.performerLinks.length) { const existingLink = store.performerLinks[i]; if (existingLink?.label !== defaultSite?.label || existingLink?.url !== defaultSite?.url) { if (existingLink) Object.assign(existingLink, defaultSite); } } else { if (defaultSite) store.performerLinks.push(generateId(defaultSite)); } } if (store.performerLinks.length > defaultLinks.length) { store.performerLinks.splice(defaultLinks.length); } savePerformerLinks(); } const store = proxy({ readyStateComplete: false, showSettings: false, options: { Title: [], Images: [], Download: [], Shortcuts: [], Developer: [] }, performerLinks: [], resizeWidth: 100, dropdown: null, openDropdown(event2, item, classList) { if (this.dropdown) { this.closeDropdown(); } else { this.dropdown = { item, classList, clientX: event2.clientX, clientY: event2.clientY, currentTarget: event2.currentTarget }; } }, closeDropdown() { if (this.dropdown) { const currentTarget = this.dropdown.currentTarget; const classList = this.dropdown.classList; if (currentTarget && classList) currentTarget.classList.remove(...classList); this.dropdown = null; } }, upgradeImgData: {}, downloadState: "idle", ultraImages: null, ultraPost: null, imgRefs: [], showFileList: false, fileListData: null, toggleFileList() { this.showFileList = !this.showFileList; }, documentHidden: false, get transition() { return { duration: this.readyStateComplete !== false && !this.documentHidden ? 180 : 0, easing: quadInOut }; }, get favIcons() { return Object.fromEntries(this.performerLinks.filter((link2) => link2.url).map((link2) => [link2.url, getFaviconUrl(link2.url)])); } }); function handleUser(element) { if (!element) return; const name = element?.textContent; const link2 = element.getAttribute("href"); if (name && link2 && link2?.includes("viewprofile")) { return { name, link: link2 }; } return; } function handleTheme(element) { if (!element) return; const parentNode = element.closest("a"); const darkmode = element.classList.contains("fa-sun"); return { element: parentNode, darkmode }; } function handleTimes(element) { if (!element) return; const part = element?.textContent?.split(" ")[0]; if (!part) return; const parsed = parseInt(part); if (isNaN(parsed)) return; return parsed; } function handleImages(postImgs) { const images = []; if (!postImgs) return images; postImgs.forEach((varElement) => { const src = varElement.getAttribute("title"); if (src) { const parentAnchor = varElement.closest("a"); const href = parentAnchor?.href; images.push({ id: crypto.randomUUID(), href, src }); } }); return images; } function handlePosts(posts) { if (posts) { return Array.from(posts).map((msg) => { const row = msg?.closest("tbody"); const nickEl = row?.querySelector(".nick"); const dateEl = row?.querySelector(".small"); const avatarImg = row?.querySelector(".avatar img"); const profileLink = row?.querySelector( 'a.txtb[href*="viewprofile"]' ); return { nick: nickEl?.textContent, date: dateEl?.textContent, avatar: avatarImg?.getAttribute("src"), link: profileLink?.getAttribute("href"), message: msg }; }); } return []; } function handleDate(dateString) { if (!dateString) return null; const ruMonthMap = { Янв: "Jan", Фев: "Feb", Мар: "Mar", Апр: "Apr", Май: "May", Июн: "Jun", Июл: "Jul", Авг: "Aug", Сен: "Sep", Окт: "Oct", Ноя: "Nov", Дек: "Dec" }; const match = dateString.match( /(\d{2})-([А-Яа-я]{3})-(\d{2}) (\d{2}:\d{2}:\d{2})/ ); if (!match) return null; const [, day, ruMonth, shortYear, time] = match; if (!ruMonth || !shortYear) return null; const enMonth = ruMonthMap[ruMonth]; const year = 2e3 + parseInt(shortYear, 10); const isoString = `${day} ${enMonth} ${year} ${time}`; return new Date(isoString); } function handleRelativeDate(dateLike) { if (dateLike === null) return ""; const locale = "en"; const rtf = new Intl.RelativeTimeFormat(locale, { numeric: "auto" }); const divisions = [ { amount: 60, name: "seconds" }, { amount: 60, name: "minutes" }, { amount: 24, name: "hours" }, { amount: 7, name: "days" }, { amount: 4.34524, name: "weeks" }, { amount: 12, name: "months" }, { amount: Infinity, name: "years" } ]; let delta = (new Date(dateLike).getTime() - Date.now()) / 1e3; for (const { amount, name } of divisions) { if (Math.abs(delta) < amount) { return rtf.format(Math.round(delta), name); } delta /= amount; } return ""; } function handleThankList(element) { if (!element) return new Set(); const userIds = new Set(); const uElements = element.querySelectorAll("u"); uElements.forEach((uElement) => { const uid = uElement.textContent; if (uid) userIds.add(uid); }); return userIds; } function handleTitle(topicEl) { const text2 = topicEl?.textContent?.trim(); if (!text2) return null; const tags = extractTags(text2); const parsed = text2.replace(TAG_RE, "").trim(); const searchTerms = extractSearchTerms(parsed); return { original: text2, parsed, searchTerms, tags }; } function extractTags(text2) { const all = [...text2.matchAll(TAG_RE)].flatMap((m) => m[1]?.split(",") ?? []).map((t) => t.trim()).filter(Boolean); return [...new Set(all)]; } function extractSearchTerms(text2) { const terms = []; let cursor = 0; const splitOnSeparators = (fragment) => fragment.trim() ? fragment.split(SEP_RE).map((s) => s.trim()).filter(Boolean) : []; for (const match of text2.matchAll(BRACKETS_RE)) { terms.push(...splitOnSeparators(text2.slice(cursor, match.index))); const inner = match[1] ?? match[2] ?? ""; terms.push(...splitOnSeparators(inner)); cursor = match.index + match[0].length; } terms.push(...splitOnSeparators(text2.slice(cursor))); return terms.filter((t, i) => terms.indexOf(t) === i); } const TAG_RE = /\[([^\]]+)]/g; const BRACKETS_RE = /\(([^)]+)\)|\{([^}]+)\}/g; const SEPARATORS = [",", "|", "/", "&", "-", "—", "aka"]; const SEP_RE = new RegExp( SEPARATORS.map((str) => { const escaped = str.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); switch (str) { case "-": case "—": case "/": case "aka": return `(?<=\\s)${escaped}(?=\\s)`; default: return escaped; } }).join("|"), "g" ); function handleData() { const sel = Object.fromEntries(Object.entries({ title: "a#topic-title", images: "#topic_main > tbody:nth-of-type(2) div.sp-wrap var.postImg", user: "div.topmenu td a", messages: "div.topmenu a.new-pm-link", theme: "div.topmenu .fas.fa-sun, div.topmenu .fas.fa-moon", seeders: "span.seed > b", leechers: "b.leech > b", size: "#tor-reged tr:nth-of-type(5) td:last-of-type", date: "div.post_head a.small", times: "td.borderless.bCenter.pad_8 > b", link: "a.dl-stub.dl-link", thank: "input#thx-btn", list: "div.thx-list", pagination: "table#pagination", logo: "img.site-logo", forumline: "table.forumline.message" }).map(([key, value]) => [key, document.querySelectorAll(value)])); return { title: handleTitle(sel?.["title"]?.[0]), posts: [], images: handleImages(sel["images"]), user: handleUser(sel?.["user"]?.[0]), messages: sel["messages"]?.[0], theme: handleTheme(sel["theme"]?.[0]), torrent: { seeders: sel?.["seeders"]?.[0]?.textContent, leechers: sel?.["leechers"]?.[0]?.textContent?.trim(), size: sel?.["size"]?.[0]?.textContent, date: handleDate(sel?.["date"]?.[0]?.textContent), times: handleTimes(sel?.["times"]?.[2]), link: sel?.["link"]?.[0]?.href }, thank: { element: sel?.["thank"]?.[0], list: handleThankList(sel?.["list"]?.[0]) }, pagination: sel?.["pagination"]?.[0], logo: sel?.["logo"]?.[0]?.src, forumline: sel?.["forumline"]?.[0] }; } const data = proxy({}); var _GM_xmlhttpRequest = (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)(); function GM_fetch(method, url, responseType, headers, data2) { return new Promise((resolve, reject) => { _GM_xmlhttpRequest({ method, url, responseType, headers, data: data2, onload: (response) => resolve(response), onerror: () => reject(new Error(`GM_fetch failed: ${url}`)) }); }); } const KEY$1 = "resolved-urls"; const cache = JSON.parse( sessionStorage.getItem(KEY$1) || "{}" ); function getCache$1(url) { return cache[url]; } function setCache$1(url, src) { cache[url] = src; sessionStorage.setItem(KEY$1, JSON.stringify(cache)); } function clearCache() { Object.keys(cache).forEach((key) => delete cache[key]); sessionStorage.removeItem(KEY$1); } async function getBlob(url) { if (getSettings("proxyCache")) return "https://corsproxy.io/?url=" + encodeURIComponent(url); const { response } = await GM_fetch("GET", url, "blob"); return URL.createObjectURL(response); } const OPTIONS_KEY = "user-settings"; const defaultOptions = { Title: [ { label: "Parse title", key: "parseTitle", value: true }, { label: "Show tags", key: "showTags", value: true }, { label: "Performer links", key: "performerLinks", value: true } ], Images: [ { label: "Upgrade images", key: "upgradeImages", value: true }, { label: "Last image first", key: "lastImageFirst", value: true }, { label: "Drag to resize", key: "dragResize", value: true } ], Download: [ { label: "Floating download button", key: "floatingDownload", value: false }, { label: 'Send to <a href="https://github.com/valpackett/transmitter" target="_blank">Transmitter</a>', key: "sendToTransmitter", value: false }, { label: "Auto-expand file list", key: "expandFiles", value: false } ], Shortcuts: [ { label: "Navigate with number keys", key: "numKeys", value: true, description: "[1, 2, 3, 4]" }, { label: "Anchor images", key: "spaceImageAnchor", value: true, description: "[Space, Shift + Space]" }, { label: "Download torrent", key: "dKeyToDownload", value: false, description: "[d]" } ], Network: [ { label: "Cache resolved urls", key: "cacheImages", value: true }, { label: "Limit concurrent upgrades", key: "limitConcurrent", value: true }, { label: "CorsProxy.io", key: "proxyCache", value: false, description: "cache hotlinked" } ], Developer: [ { label: "Toggle settings", key: "sKeySettings", value: false, description: "[s]" }, { label: "Debug upgrade", key: "debugImgs", value: false }, { label: "Incognito", key: "incognito", value: false } ] }; function loadOptions() { const options = structuredClone(defaultOptions); const stored = localStorage.getItem(OPTIONS_KEY); if (stored) { try { const saved = JSON.parse(stored); Object.values(options).flat().forEach((opt) => { const value = saved[opt.key]; if (value !== void 0) { opt.value = value; } }); } catch (error) { console.warn(`Failed to load ${OPTIONS_KEY} from localStorage:`, error); } } return options; } function saveOptions() { const options = Object.values(store.options).flat(); const json = Object.fromEntries(options.map((opt) => [opt.key, opt.value])); localStorage.setItem(OPTIONS_KEY, JSON.stringify(json)); } function updateOption(key, value) { const option = Object.values(store.options).flat().find((opt) => opt.key === key); if (option) option.value = value; saveOptions(); } function restoreOptions() { Object.entries(defaultOptions).forEach(([groupKey, groupSettings]) => { groupSettings.forEach((defaultSetting) => { const currentOpt = store.options[groupKey]?.find( (opt) => opt.key === defaultSetting.key ); if (currentOpt) { currentOpt.value = defaultSetting.value; } }); }); localStorage.removeItem(OPTIONS_KEY); saveOptions(); } const DEFAULT_WIDTH = 100; const RESIZE_KEY = "images-resize-width"; function loadResize() { try { const stored = localStorage.getItem(RESIZE_KEY); if (stored) return parseInt(stored); } catch (error) { console.warn(`Failed to load ${RESIZE_KEY} from localStorage:`, error); } return DEFAULT_WIDTH; } function saveResize(value) { try { localStorage.setItem(RESIZE_KEY, value.toString()); } catch (error) { console.warn(`Failed to save ${RESIZE_KEY} to localStorage:`, error); } } function restoreResize() { localStorage.setItem(RESIZE_KEY, DEFAULT_WIDTH.toString()); store.resizeWidth = DEFAULT_WIDTH; } const parser$3 = new DOMParser(); const decoder = new TextDecoder("windows-1251"); const regex = /\b\d+[pk]\b/gi; async function getRelated(title) { const query = stripResolution(title); const cache2 = getCache(); if (cache2[query]) return cache2[query]; const elements = await handleSearch(query); const results = []; elements.forEach((element) => { if (element instanceof HTMLAnchorElement && element.href && element.textContent) { const resolution = getResolution(element.textContent); if (resolution) { results.push({ href: element.href, textContent: element.textContent, resolution }); } } }); cache2[query] = results; setCache(cache2); return results; } async function handleSearch(searchQuery) { const headers = { "Content-Type": "application/x-www-form-urlencoded" }; const body = `max=1&to=1&nm=${encodeURIComponent(searchQuery)}`; const response = await fetch("/forum/tracker.php", { method: "POST", headers, body }); const buffer = await response.arrayBuffer(); const result = decoder.decode(buffer); const doc = parser$3.parseFromString(result, "text/html"); const nothingFound = doc.querySelector(".info_msg_wrap"); if (nothingFound) return []; const related = doc.querySelectorAll(".med.tLink.bold"); return Array.from(related); } function stripResolution(title) { return title.replace(regex, "").replace(/ ,/g, "").replace(/\s*,\s*(?=\])/g, "").replace(/\[\]/g, ""); } function getResolution(title) { const match = title.match(regex); return match?.[0]; } const CACHE_KEY = "related-cache"; function getCache() { const cached = sessionStorage.getItem(CACHE_KEY); return cached ? JSON.parse(cached) : {}; } function setCache(cache2) { sessionStorage.setItem(CACHE_KEY, JSON.stringify(cache2)); } function restoreRelated() { sessionStorage.removeItem(CACHE_KEY); } const SETTINGS_KEY = "show-settings"; function getSettings(key) { const setting = Object.values(store.options).flat().find((opt) => opt.key === key); return setting?.value || false; } function loadShowSettings() { const stored = localStorage.getItem(SETTINGS_KEY); if (stored === null) return false; try { return JSON.parse(stored); } catch (error) { console.warn(`Failed to parse settings from localStorage:`, stored, error); return false; } } function saveShowSettings(value) { try { localStorage.setItem(SETTINGS_KEY, JSON.stringify(value)); } catch (error) { console.warn(`Failed to save ${SETTINGS_KEY} to localStorage:`, error); } } function toggleShowSettings(event2) { event2.preventDefault(); store.showSettings = !store.showSettings; saveShowSettings(store.showSettings); } function restoreDefaultSettings() { if (!confirm("Are you sure you want to restore all settings to default?")) return; restoreOptions(); restorePerformerLinks(); restoreResize(); restoreRelated(); clearCache(); } const SYNC_TRIGGER_KEY = "sync-trigger"; function syncSettings() { localStorage.setItem(SYNC_TRIGGER_KEY, Date.now().toString()); } function onstorage(event2) { if (event2.key !== SYNC_TRIGGER_KEY) return; const optionsValue = localStorage.getItem(OPTIONS_KEY); if (optionsValue) { const saved = JSON.parse(optionsValue); Object.values(store.options).flat().forEach((setting) => { if (setting.key in saved) { setting.value = saved[setting.key]; } }); saveOptions(); } const resizeValue = localStorage.getItem(RESIZE_KEY); if (resizeValue) store.resizeWidth = parseInt(resizeValue); const linksValue = localStorage.getItem(LINKS_KEY); if (linksValue) { store.performerLinks.length = 0; store.performerLinks.push(...loadPerformerLinks()); } store.showSettings = false; } function exportSettings() { const performerLinks = store.performerLinks.map(stripId); const options = Object.values(store.options).flat(); const optionsJson = Object.fromEntries( options.map((opt) => [opt.key, opt.value]) ); const fileContent = `// Paste this into browser console localStorage.setItem("${OPTIONS_KEY}", JSON.stringify(${JSON.stringify( optionsJson, null, 2 )})); localStorage.setItem("${LINKS_KEY}", JSON.stringify(${JSON.stringify( performerLinks, null, 2 )})); localStorage.setItem("${RESIZE_KEY}", "${store.resizeWidth || "100"}"); location.reload(); `; const blob = new Blob([fileContent], { type: "text/plain" }); const url = URL.createObjectURL(blob); const a = Object.assign(document.createElement("a"), { href: url, download: `data-${( new Date()).toISOString().split("T")[0]}.txt` }); document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } const KEY = "userscript-disabled"; function userscriptDisabled() { const stored = sessionStorage.getItem(KEY); return stored === null ? false : stored === "true"; } function setUserscript(value) { sessionStorage.setItem(KEY, JSON.stringify(value)); location.reload(); } function appendUserscriptEnableButton() { console.warn("userscript disabled"); const button = document.createElement("button"); Object.assign(button, { textContent: "Enable Pornolab Ultra", onclick: () => setUserscript(false) }); Object.assign(button.style, { position: "fixed", top: "0.75rem", right: "0.75rem", zIndex: "9999" }); const element = document.querySelector("#pl-speedbar-a"); element?.parentElement?.appendChild(button); } function prependContentSecurityPolicy() { const meta = document.createElement("meta"); meta.httpEquiv = "Content-Security-Policy"; meta.content = ` default-src 'self'; img-src 'self' http: https: data: blob:; style-src 'unsafe-inline'; font-src 'self' https://static.pornolab.net/templates/default/webfonts/fa-solid-900.woff2; script-src 'unsafe-inline' https://static.pornolab.net/js/main.js https://static.pornolab.net/js/jquery.pack.js; `; document.head.prepend(meta); return document.head.contains(meta); } function forumDisabled(app) { const p = document.querySelector("body > div > p"); const disabledText = "Форум временно отключен"; if (!p?.textContent?.includes(disabledText)) return false; const translations = { [disabledText]: "Forum is temporarily disabled", "Последние новости вы можете узнать в": "You can find out the latest news on", твиттере: "Twitter" }; app.remove(); let html2 = p.innerHTML; for (const [russian, english] of Object.entries(translations)) { html2 = html2.replace(russian, english); } p.innerHTML = html2; return true; } enable_legacy_mode_flag(); function state(state2) { store.downloadState = state2; } async function handleDownload(event2) { event2.preventDefault(); if (store.downloadState === "downloading") { return; } if (!data.torrent?.link) { return state("error"); } try { store.downloadState = "downloading"; if (!getSettings("sendToTransmitter")) { window.location.assign(data.torrent.link); return state("success"); } const url = "http://transmitter.web-extension/" + encodeURIComponent(data.torrent.link); const bgColor = getComputedStyle(document.documentElement).getPropertyValue( "--main-bg" ); const page = ` <!DOCTYPE html> <html> <head> <style> body { background-color: ${bgColor}; } img { display: none; } </style> </head> <body> <img src="${url}" onload="window.close()" onerror="window.close()"> </body> </html> `; window.open( URL.createObjectURL(new Blob([page], { type: "text/html" })), "_blank", "noopener" ); state("success"); } catch (err) { console.error("Error downloading torrent:", err); state("error"); } } var $$_import_store = reactive_import(() => store); function Events($$anchor, $$props) { push($$props, false); function handleReadyStateChange() { if (document.readyState === "complete") { $$_import_store($$_import_store().readyStateComplete = true); } } onMount(() => { handleReadyStateChange(); if ($$_import_store().readyStateComplete) return; return on(document, "readystatechange", handleReadyStateChange); }); function onkeydown(event2) { const target = event2.target; const input = target.isContentEditable || target instanceof HTMLInputElement && target.type === "text"; if (input || event2.ctrlKey || event2.metaKey || event2.altKey) return; switch (event2.code) { case "Space": handleSpace(event2); break; case "KeyS": handleKeyS(event2); break; case "KeyD": handleKeyD(event2); break; case "Escape": handleEscape(); break; case "Digit1": case "Digit2": case "Digit3": case "Digit4": if (!getSettings("numKeys")) return; event2.preventDefault(); digitHandlers[event2.code](); break; default: return; } } const digitHandlers = { Digit1: handleDigit1, Digit2: handleDigit2, Digit3: handleDigit3, Digit4: handleDigit4 }; function handleSpace(event2) { if (!getSettings("spaceImageAnchor") || !$$_import_store().imgRefs.length || !$$_import_store().ultraImages) return; const scrollY = window.scrollY; const containerTop = $$_import_store().ultraImages.offsetTop; const containerBottom = containerTop + $$_import_store().ultraImages.offsetHeight; if (containerTop >= scrollY + window.innerHeight || containerBottom <= scrollY) return; let imgRefs = [...$$_import_store().imgRefs]; if (getSettings("lastImageFirst") && imgRefs.length > 1) { const lastImg = imgRefs.pop(); if (lastImg) imgRefs.unshift(lastImg); } let filteredImgRefs = imgRefs.filter((el) => el.dataset["broken"] !== "true"); if (filteredImgRefs.length === 0) return; if (scrollY < containerTop) { if (!event2.shiftKey) { event2.preventDefault(); filteredImgRefs[0]?.scrollIntoView({ block: "start" }); } return; } const backward = event2.shiftKey; const threshold = scrollY + (backward ? -10 : 10); if (backward) { for (const img of filteredImgRefs.slice().reverse()) { const imgTop = scrollY + img.getBoundingClientRect().top; if (imgTop < threshold) { event2.preventDefault(); img.scrollIntoView({ block: "start" }); return; } } } else { for (const img of filteredImgRefs) { const imgTop = scrollY + img.getBoundingClientRect().top; if (imgTop > threshold) { event2.preventDefault(); img.scrollIntoView({ block: "start" }); return; } } } } function handleKeyD(event2) { if (!getSettings("dKeyToDownload")) return; event2.preventDefault(); handleDownload(event2); } function handleEscape() { if ($$_import_store().dropdown !== null) { $$_import_store().closeDropdown(); } else if ($$_import_store().showSettings) { $$_import_store($$_import_store().showSettings = false); saveShowSettings($$_import_store().showSettings); } } function handleKeyS(event2) { if (!getSettings("sKeySettings")) return; if (!$$_import_store().showSettings) window.scrollTo({ top: 0 }); toggleShowSettings(event2); } function handleDigit1() { window.scrollTo({ top: 0 }); } function handleDigit2() { $$_import_store().ultraImages?.scrollIntoView({ block: "start" }); } function handleDigit3() { $$_import_store().ultraPost?.scrollIntoView({ block: "start" }); } function handleDigit4() { window.scrollTo({ top: document.body.scrollHeight }); } function onvisibilitychange() { $$_import_store($$_import_store().documentHidden = document.hidden); } init(); event("keydown", $window, onkeydown); event("storage", $window, function(...$$args) { onstorage?.apply(this, $$args); }); event("visibilitychange", $document, onvisibilitychange); pop(); } const Item$2 = ($$anchor, title = noop, content = noop) => { var div = root_1$d(); var node = child(div); snippet(node, content); template_effect(() => set_attribute(div, "title", title())); append($$anchor, div); }; const Messages = ($$anchor) => { const href = user_derived(() => "/forum/privmsg.php?folder=inbox"); var a_2 = root_7$3(); set_attribute(a_2, "href", get(href)); var i = child(a_2); template_effect(() => set_class(i, 1, clsx(["fas", "fa-envelope", data.messages && "unread"]), "svelte-14s75i7")); append($$anchor, a_2); }; const Settings$1 = ($$anchor) => { var fragment_3 = root_11$2(); var a_4 = first_child(fragment_3); a_4.__click = function(...$$args) { toggleShowSettings?.apply(this, $$args); }; var a_5 = sibling(a_4, 2); a_5.__click = function(...$$args) { toggleShowSettings?.apply(this, $$args); }; append($$anchor, fragment_3); }; function disableUserscript(event2) { event2.preventDefault(); setUserscript(true); } var root_1$d = from_html(`<div class="item svelte-14s75i7"><!></div>`); var root_5$5 = from_html(`<a>Profile</a>`); var root_6$5 = from_html(`<a href="/">Login</a>`); var root_7$3 = from_html(`<a aria-label="inbox"><i></i></a>`); var root_9$2 = from_html(`<span class="themeIcon svelte-14s75i7"></span>`); var root_10 = from_html(`<a href="/" aria-label="placeholder"><i></i></a>`); var root_11$2 = from_html(`<a href="#settings"><img src="https://github.com/clangmoyai/plab-ultra/raw/main/src/assets/logo64.png" class="ultra-logo svelte-14s75i7" alt="logo"/></a> <a href="#settings">Settings</a>`, 1); var root_12$1 = from_html(`<a href="#disable">Disable</a>`); var root$5 = from_html(`<div id="x-header"><div class="logo svelte-14s75i7"><a href="/forum/index.php"><img alt=""/></a></div> <div class="align-right svelte-14s75i7"><div class="container svelte-14s75i7"><div class="links svelte-14s75i7"><!> <!> <!> <!> <!> <!></div> <div class="search svelte-14s75i7"><input type="text" name="search" placeholder="Search…" class="svelte-14s75i7"/> <button class="svelte-14s75i7">»</button></div></div></div></div>`); function Header($$anchor, $$props) { push($$props, true); const Profile = ($$anchor2) => { var fragment = comment(); var node_1 = first_child(fragment); { var consequent = ($$anchor3) => { var text$1 = text("Profile"); append($$anchor3, text$1); }; var alternate_1 = ($$anchor3) => { var fragment_1 = comment(); var node_2 = first_child(fragment_1); { var consequent_1 = ($$anchor4) => { var a = root_5$5(); template_effect(() => { set_attribute(a, "href", data.user.link); set_attribute(a, "title", data.user?.name); }); append($$anchor4, a); }; var alternate = ($$anchor4) => { var a_1 = root_6$5(); append($$anchor4, a_1); }; if_block( node_2, ($$render) => { if (data.user?.link) $$render(consequent_1); else $$render(alternate, false); }, true ); } append($$anchor3, fragment_1); }; if_block(node_1, ($$render) => { if (get(incognito)) $$render(consequent); else $$render(alternate_1, false); }); } append($$anchor2, fragment); }; const Theme = ($$anchor2) => { var fragment_2 = comment(); var node_3 = first_child(fragment_2); { var consequent_2 = ($$anchor3) => { var span = root_9$2(); attach(span, () => appendThemeButton(data.theme.element)); append($$anchor3, span); }; var alternate_2 = ($$anchor3) => { const darkMode = user_derived(() => data.theme?.darkmode); var a_3 = root_10(); var i_1 = child(a_3); template_effect(() => set_class(i_1, 1, clsx([ "fas", get(darkMode) && "fa-sun", !get(darkMode) && "fa-moon" ]))); append($$anchor3, a_3); }; if_block(node_3, ($$render) => { if (data.theme?.element) $$render(consequent_2); else $$render(alternate_2, false); }); } append($$anchor2, fragment_2); }; const Disable = ($$anchor2) => { var a_6 = root_12$1(); a_6.__click = [disableUserscript]; append($$anchor2, a_6); }; let incognito = user_derived(() => getSettings("incognito")); let floatingDownload = user_derived(() => getSettings("floatingDownload")); let messagesTitle = user_derived(() => data.messages ? "Unread" : "Messages"); let searchQuery = state$1(""); function handleSearch2() { const url = "/forum/tracker.php?search_id=&nm="; window.location.href = `${url}${encodeURIComponent(get(searchQuery))}`; } function appendThemeButton(themeElement) { return (element) => { if (!(themeElement instanceof HTMLAnchorElement)) return; element.appendChild(themeElement); return () => { themeElement.remove(); }; }; } var div_1 = root$5(); let classes; var div_2 = child(div_1); var a_8 = child(div_2); var img = child(a_8); let classes_1; var div_3 = sibling(div_2, 2); var div_4 = child(div_3); var div_5 = child(div_4); var node_4 = child(div_5); Item$2(node_4, () => "Profile", () => Profile); var node_5 = sibling(node_4, 2); Item$2(node_5, () => get(messagesTitle), () => Messages); var node_6 = sibling(node_5, 2); Item$2(node_6, () => "Theme", () => Theme); var node_7 = sibling(node_6, 2); Item$2(node_7, () => "Settings", () => Settings$1); var node_8 = sibling(node_7, 2); { if_block(node_8, ($$render) => { }); } var node_9 = sibling(node_8, 2); Item$2(node_9, () => "Disable", () => Disable); var div_6 = sibling(div_5, 2); var input = child(div_6); var button = sibling(input, 2); button.__click = handleSearch2; template_effect( ($0, $1) => { classes = set_class(div_1, 1, "svelte-14s75i7", null, classes, $0); set_attribute(img, "src", data.logo); classes_1 = set_class(img, 1, "svelte-14s75i7", null, classes_1, $1); }, [ () => ({ floatingDownload: get(floatingDownload) }), () => ({ incognito: get(incognito) }) ] ); event("keypress", input, (event2) => { if (event2.key === "Enter") handleSearch2(); }); bind_value(input, () => get(searchQuery), ($$value) => set(searchQuery, $$value)); append($$anchor, div_1); pop(); } delegate(["click"]); function onchange(event2) { const checkbox = event2.target; if (!checkbox) return; const handleToggleFileList = checkbox.id === "expandFiles" && store.showFileList !== checkbox.checked; if (handleToggleFileList) store.toggleFileList(); const handleClearCache = checkbox.id === "cacheImages" && !checkbox.checked; if (handleClearCache) clearCache(); saveOptions(); } var on_click$4 = (event2) => { event2.currentTarget?.blur(); }; var root_3$6 = from_html(`<span class="description svelte-5e73jo"> </span>`); var root_2$5 = from_html(`<label><input type="checkbox" class="svelte-5e73jo"/> <span class="svelte-5e73jo"><!> <!></span></label>`); var root_1$c = from_html(`<div class="column svelte-5e73jo"><h2 class="svelte-5e73jo"> </h2> <!></div>`); var root$4 = from_html(`<div class="container svelte-5e73jo"></div>`); function Options($$anchor, $$props) { push($$props, true); let parseTitle = user_derived(() => getSettings("parseTitle")); var div = root$4(); each( div, 21, () => Object.entries(store.options), ([title, items]) => title, ($$anchor2, $$item) => { var $$array = user_derived(() => to_array(get($$item), 2)); let title = () => get($$array)[0]; let items = () => get($$array)[1]; var div_1 = root_1$c(); var h2 = child(div_1); var text2 = child(h2); var node = sibling(h2, 2); each(node, 17, items, (item) => item.key, ($$anchor3, item, $$index) => { const disabled = user_derived(() => !get(parseTitle) && (get(item).key === "performerLinks" || get(item).key === "showTags")); var label = root_2$5(); let classes; var input = child(label); input.__change = [onchange]; input.__click = [on_click$4]; var span = sibling(input, 2); var node_1 = child(span); html(node_1, () => get(item).label); var node_2 = sibling(node_1, 2); { var consequent = ($$anchor4) => { var span_1 = root_3$6(); var text_1 = child(span_1); template_effect(() => set_text(text_1, get(item).description)); append($$anchor4, span_1); }; if_block(node_2, ($$render) => { if (get(item).description) $$render(consequent); }); } template_effect( ($0) => { classes = set_class(label, 1, "svelte-5e73jo", null, classes, $0); set_attribute(input, "id", get(item).key); input.disabled = get(disabled); }, [() => ({ disabled: get(disabled) })] ); bind_checked(input, () => get(item).value, ($$value) => get(item).value = $$value); append($$anchor3, label); }); template_effect(() => set_text(text2, title())); append($$anchor2, div_1); } ); append($$anchor, div); pop(); } delegate(["change", "click"]); const linear = (x) => x; function cubic_out(t) { const f = t - 1; return f * f * f + 1; } function fade(node, { delay = 0, duration = 400, easing = linear } = {}) { const o = +getComputedStyle(node).opacity; return { delay, duration, easing, css: (t) => `opacity: ${t * o}` }; } function slide(node, { delay = 0, duration = 400, easing = cubic_out, axis = "y" } = {}) { const style = getComputedStyle(node); const opacity = +style.opacity; const primary_property = axis === "y" ? "height" : "width"; const primary_property_value = parseFloat(style[primary_property]); const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"]; const capitalized_secondary_properties = secondary_properties.map( (e) => ( `${e[0].toUpperCase()}${e.slice(1)}` ) ); const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]); const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]); const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]); const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]); const border_width_start_value = parseFloat( style[`border${capitalized_secondary_properties[0]}Width`] ); const border_width_end_value = parseFloat( style[`border${capitalized_secondary_properties[1]}Width`] ); return { delay, duration, easing, css: (t) => `overflow: hidden;opacity: ${Math.min(t * 20, 1) * opacity};${primary_property}: ${t * primary_property_value}px;padding-${secondary_properties[0]}: ${t * padding_start_value}px;padding-${secondary_properties[1]}: ${t * padding_end_value}px;margin-${secondary_properties[0]}: ${t * margin_start_value}px;margin-${secondary_properties[1]}: ${t * margin_end_value}px;border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;min-${primary_property}: 0` }; } function scale(node, { delay = 0, duration = 400, easing = cubic_out, start = 0, opacity = 0 } = {}) { const style = getComputedStyle(node); const target_opacity = +style.opacity; const transform = style.transform === "none" ? "" : style.transform; const sd = 1 - start; const od = target_opacity * (1 - opacity); return { delay, duration, easing, css: (_t, u) => ` transform: ${transform} scale(${1 - sd * u}); opacity: ${target_opacity - od * u} ` }; } function onclick(_, $$props, handleTransition) { $$props.onclick?.(); handleTransition(); } var root_1$b = from_html(`<span><!></span>`); var root_2$4 = from_svg(`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="svelte-ig1se8"><path d="M9.86 18a1 1 0 0 1-.73-.32l-4.86-5.17a1 1 0 1 1 1.46-1.37l4.12 4.39l8.41-9.2a1 1 0 1 1 1.48 1.34l-9.14 10a1 1 0 0 1-.73.33Z" class="svelte-ig1se8"></path></svg>`); var root$3 = from_html(`<button class="svelte-ig1se8"><!></button>`); function Checkmark($$anchor, $$props) { push($$props, true); const DURATION = 1e3; let clicked = state$1(false); let timeout; let clientWidth = state$1(0); let clientHeight = state$1(0); let opts = user_derived(() => ({ ...store.transition, start: 0.6 })); function handleTransition() { set(clicked, true); if (timeout) clearTimeout(timeout); timeout = setTimeout( () => { set(clicked, false); timeout = null; }, DURATION ); } onDestroy(() => { if (timeout) clearTimeout(timeout); }); var button = root$3(); button.__click = [onclick, $$props, handleTransition]; let styles; var node = child(button); { var consequent = ($$anchor2) => { var span = root_1$b(); var node_1 = child(span); snippet(node_1, () => $$props.children); transition(3, span, () => scale, () => get(opts)); bind_element_size(span, "clientWidth", ($$value) => set(clientWidth, $$value)); bind_element_size(span, "clientHeight", ($$value) => set(clientHeight, $$value)); append($$anchor2, span); }; var alternate = ($$anchor2) => { var svg = root_2$4(); var path = child(svg); transition(3, path, () => scale, () => get(opts)); append($$anchor2, svg); }; if_block(node, ($$render) => { if (!get(clicked)) $$render(consequent); else $$render(alternate, false); }); } template_effect( ($0) => { set_attribute(button, "title", $$props.title); button.disabled = $$props.disabled; styles = set_style(button, "", styles, $0); }, [ () => ({ width: `${get(clientWidth) ?? ""}px`, height: `${get(clientHeight) ?? ""}px` }) ] ); append($$anchor, button); pop(); } delegate(["click"]); var root$2 = from_html(`<div class="container svelte-d5217q"><!> <div class="align-right svelte-d5217q"><!> <!> <!></div></div>`); function Actions($$anchor, $$props) { push($$props, true); let parseTitle = user_derived(() => getSettings("parseTitle")); let performerLinks = user_derived(() => getSettings("performerLinks")); var div = root$2(); var node = child(div); { let $0 = user_derived(() => !get(parseTitle) || !get(performerLinks)); Checkmark(node, { get onclick() { return addPerformerLink; }, title: "Add performer link", get disabled() { return get($0); }, children: ($$anchor2, $$slotProps) => { var text$1 = text("Add link"); append($$anchor2, text$1); }, $$slots: { default: true } }); } var div_1 = sibling(node, 2); var node_1 = child(div_1); Checkmark(node_1, { get onclick() { return syncSettings; }, title: "Sync settings to other tabs", children: ($$anchor2, $$slotProps) => { var text_1 = text("Sync"); append($$anchor2, text_1); }, $$slots: { default: true } }); var node_2 = sibling(node_1, 2); Checkmark(node_2, { get onclick() { return restoreDefaultSettings; }, title: "Restore all settings to default", children: ($$anchor2, $$slotProps) => { var text_2 = text("Restore"); append($$anchor2, text_2); }, $$slots: { default: true } }); var node_3 = sibling(node_2, 2); Checkmark(node_3, { get onclick() { return exportSettings; }, title: "Export settings as text file", children: ($$anchor2, $$slotProps) => { var text_3 = text("Export"); append($$anchor2, text_3); }, $$slots: { default: true } }); append($$anchor, div); pop(); } function slideFade(node, { delay = 0, duration = 400, easing = cubicOut, axis = "y" } = {}) { const style = getComputedStyle(node); const opacity = +style.opacity; const primary_property = axis === "y" ? "height" : "width"; const primary_property_value = parseFloat(style[primary_property]); const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"]; const capitalized_secondary_properties = secondary_properties.map( (e) => `${e[0].toUpperCase()}${e.slice(1)}` ); const padding_start_value = parseFloat( style[`padding${capitalized_secondary_properties[0]}`] ); const padding_end_value = parseFloat( style[`padding${capitalized_secondary_properties[1]}`] ); const margin_start_value = parseFloat( style[`margin${capitalized_secondary_properties[0]}`] ); const margin_end_value = parseFloat( style[`margin${capitalized_secondary_properties[1]}`] ); const border_width_start_value = parseFloat( style[`border${capitalized_secondary_properties[0]}Width`] ); const border_width_end_value = parseFloat( style[`border${capitalized_secondary_properties[1]}Width`] ); return { delay, duration, easing, css: (t) => `overflow: hidden;opacity: ${t * opacity};${primary_property}: ${t * primary_property_value}px;padding-${secondary_properties[0]}: ${t * padding_start_value}px;padding-${secondary_properties[1]}: ${t * padding_end_value}px;margin-${secondary_properties[0]}: ${t * margin_start_value}px;margin-${secondary_properties[1]}: ${t * margin_end_value}px;border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;min-${primary_property}: 0` }; } const Favicon = ($$anchor, link2 = noop) => { const src = user_derived(() => getFaviconUrl(link2().url)); var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var img = root_2$3(); template_effect(() => { set_attribute(img, "src", get(src)); set_attribute(img, "alt", link2().label); }); append($$anchor2, img); }; if_block(node, ($$render) => { if (get(src)) $$render(consequent); }); } append($$anchor, fragment); }; const Remove = ($$anchor, index2 = noop) => { var button = root_4$3(); button.__click = [on_click$3, index2]; append($$anchor, button); }; var root_2$3 = from_html(`<img class="svelte-6don7f"/>`); var on_input = (_, index2, key, link2) => updatePerformerLink(index2(), { [key()]: link2()[key()] }); var root_3$5 = from_html(`<input type="text" class="svelte-6don7f"/>`); var on_click$3 = (__1, index2) => removePerformerLink(index2()); var root_4$3 = from_html(`<button title="Remove link" class="svelte-6don7f">×</button>`); var root_6$4 = from_html(`<div class="item svelte-6don7f"><!> <!> <!> <!></div>`); var root_5$4 = from_html(`<div class="container svelte-6don7f"></div>`); function Links($$anchor, $$props) { push($$props, true); const Input = ($$anchor2, key = noop, link2 = noop, index2 = noop) => { var input = root_3$5(); input.__input = [on_input, index2, key, link2]; template_effect(() => { set_attribute(input, "name", placeholders[key()]); set_attribute(input, "placeholder", placeholders[key()]); }); bind_value(input, () => link2()[key()], ($$value) => link2()[key()] = $$value); append($$anchor2, input); }; const placeholders = { id: "ID", label: "Label", url: "URL" }; let parseTitle = user_derived(() => getSettings("parseTitle")); let performerLinks = user_derived(() => getSettings("performerLinks")); var fragment_1 = comment(); var node_1 = first_child(fragment_1); { var consequent_1 = ($$anchor2) => { var div = root_5$4(); each(div, 23, () => store.performerLinks, (link2) => link2.id, ($$anchor3, link2, index2) => { var div_1 = root_6$4(); var node_2 = child(div_1); Favicon(node_2, () => get(link2)); var node_3 = sibling(node_2, 2); Input(node_3, () => "label", () => get(link2), () => get(index2)); var node_4 = sibling(node_3, 2); Input(node_4, () => "url", () => get(link2), () => get(index2)); var node_5 = sibling(node_4, 2); Remove(node_5, () => get(index2)); transition(3, div_1, () => slideFade, () => store.transition); append($$anchor3, div_1); }); transition(3, div, () => slideFade, () => store.transition); append($$anchor2, div); }; if_block(node_1, ($$render) => { if (get(parseTitle) && get(performerLinks) && store.performerLinks?.length) $$render(consequent_1); }); } append($$anchor, fragment_1); pop(); } delegate(["input", "click"]); var root_1$a = from_html(`<div class="svelte-rmjlst"><button class="svelte-rmjlst">×</button> <!> <!> <!></div>`); function Settings($$anchor, $$props) { push($$props, false); init(); var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var div = root_1$a(); var button = child(div); button.__click = function(...$$args) { toggleShowSettings?.apply(this, $$args); }; var node_1 = sibling(button, 2); Options(node_1, {}); var node_2 = sibling(node_1, 2); Links(node_2, {}); var node_3 = sibling(node_2, 2); Actions(node_3, {}); transition(3, div, () => slideFade, () => store.transition); append($$anchor2, div); }; if_block(node, ($$render) => { if (store.showSettings) $$render(consequent); }); } append($$anchor, fragment); pop(); } delegate(["click"]); var root_1$9 = from_html(`<div class="svelte-hyxnps"><button class="ic--sharp-download svelte-hyxnps" title="Download" aria-label="Download"></button></div>`); function Float($$anchor, $$props) { push($$props, true); let floatingDownload = user_derived(() => getSettings("floatingDownload")); var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var div = root_1$9(); var button = child(div); button.__click = function(...$$args) { handleDownload?.apply(this, $$args); }; transition(1, div, () => fade, () => store.transition); append($$anchor2, div); }; if_block(node, ($$render) => { if (get(floatingDownload)) $$render(consequent); }); } append($$anchor, fragment); pop(); } delegate(["click"]); var root_3$4 = from_html(`<link rel="prefetch" as="image"/>`); var root_6$3 = from_html(`<a class="svelte-m808n"><img class="svelte-m808n"/> </a>`); var root_4$2 = from_html(`<div class="container svelte-m808n"><div class="indicator svelte-m808n"></div> <div class="items svelte-m808n"></div></div>`); function Dropdown$1($$anchor, $$props) { push($$props, true); let top = state$1(0); let left = state$1(0); let container = state$1(null); let currentTarget = user_derived(() => store.dropdown?.currentTarget); user_effect( () => { if (!store.dropdown?.clientX || !store.dropdown?.clientY || !get(currentTarget)) return; const rect = getClickedRect(store.dropdown.clientX, store.dropdown.clientY); if (!rect) return; set(top, rect.bottom + window.scrollY); set(left, store.dropdown.clientX + window.scrollX); if (store.dropdown?.classList) get(currentTarget).classList.add(...store.dropdown.classList); return on(get(currentTarget), "pointerleave", onpointerleave); } ); function getClickedRect(clientX, clientY) { const rects = get(currentTarget).getClientRects(); if (!rects.length) return null; let clickedRect = null; for (let i = 0; i < rects.length; i++) { const rect = rects[i]; if (rect && clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom) { clickedRect = rect; break; } } return clickedRect; } function onpointerleave(event2) { const related = event2.relatedTarget; if (get(currentTarget)?.contains(related) || get(container)?.contains(related)) return; store.closeDropdown(); } function onclickcapture() { store.closeDropdown(); } var fragment_2 = comment(); head(($$anchor2) => { var fragment = comment(); var node = first_child(fragment); each(node, 17, () => store.performerLinks, (link2) => link2.id, ($$anchor3, link2) => { var fragment_1 = comment(); var node_1 = first_child(fragment_1); { var consequent = ($$anchor4) => { var link_1 = root_3$4(); template_effect(() => set_attribute(link_1, "href", store.favIcons[get(link2).url])); append($$anchor4, link_1); }; if_block(node_1, ($$render) => { if (get(link2).url && store.favIcons[get(link2).url]) $$render(consequent); }); } append($$anchor3, fragment_1); }); append($$anchor2, fragment); }); var node_2 = first_child(fragment_2); { var consequent_2 = ($$anchor2) => { var div = root_4$2(); let styles; var div_1 = sibling(child(div), 2); each(div_1, 21, () => store.performerLinks, (link2) => link2.id, ($$anchor3, link2) => { var fragment_3 = comment(); var node_3 = first_child(fragment_3); { var consequent_1 = ($$anchor4) => { var a = root_6$3(); var img = child(a); var text2 = sibling(img); template_effect( ($0) => { set_attribute(a, "href", $0); set_attribute(img, "src", store.favIcons[get(link2).url]); set_attribute(img, "alt", get(link2).label); set_text(text2, ` ${get(link2).label ?? ""}`); }, [() => getLinkUrl(get(link2), store.dropdown.item)] ); event("click", a, onclickcapture, true); append($$anchor4, a); }; if_block(node_3, ($$render) => { if (get(link2).label && get(link2).url && store.favIcons[get(link2).url] && store.dropdown?.item) $$render(consequent_1); }); } append($$anchor3, fragment_3); }); bind_this(div, ($$value) => set(container, $$value), () => get(container)); template_effect(($0) => styles = set_style(div, "", styles, $0), [ () => ({ top: `${get(top) ?? ""}px`, left: `${get(left) ?? ""}px` }) ]); event("pointerleave", div, onpointerleave); transition(2, div, () => fade, () => store.transition); append($$anchor2, div); }; if_block(node_2, ($$render) => { if (store.dropdown) $$render(consequent_2); }); } append($$anchor, fragment_2); pop(); } const Dropdown = ($$anchor, item = noop) => { var span = root_3$3(); span.__click = [on_click$2, item]; var text2 = child(span); template_effect(() => set_text(text2, item())); append($$anchor, span); }; const Placholder = ($$anchor) => { const items = user_derived(() => ["Performer", "Title"]); var fragment_1 = comment(); var node_1 = first_child(fragment_1); each(node_1, 17, () => get(items), index, ($$anchor2, item, i) => { var fragment_2 = root_5$3(); var text_1 = first_child(fragment_2); text_1.nodeValue = `${i > 0 ? " - " : ""} `; var node_2 = sibling(text_1); Dropdown(node_2, () => get(item)); append($$anchor2, fragment_2); }); append($$anchor, fragment_1); }; var on_click$2 = (event2, item) => store.openDropdown(event2, item(), ["title-item--hover"]); var root_3$3 = from_html(`<span class="title-item svelte-12bxepp"> </span>`); var root_5$3 = from_html(` <!>`, 1); var root_9$1 = from_html(`<a class="title-item svelte-12bxepp"> </a>`); var root_11$1 = from_html(`<a class="title-item svelte-12bxepp"> </a>`); var root_15$1 = from_html(`<h1 id="x-title" class="svelte-12bxepp"><!></h1>`); var root_17 = from_html(`<h1 id="x-title" class="svelte-12bxepp"> </h1>`); var root_19$1 = from_html(`<h1 id="x-title" class="svelte-12bxepp"><!></h1>`); var root_21 = from_html(`<h1 id="x-title" class="svelte-12bxepp"><a class="original-title svelte-12bxepp"> </a></h1>`); function Title($$anchor, $$props) { push($$props, true); const ParsedTitle = ($$anchor2, searchTerms2 = noop) => { const validLinks = user_derived(() => store.performerLinks.filter((link2) => link2.url && link2.label)); var fragment_3 = comment(); var node_3 = first_child(fragment_3); each(node_3, 17, () => get(items), index, ($$anchor3, item) => { var fragment_4 = comment(); var node_4 = first_child(fragment_4); { var consequent_4 = ($$anchor4) => { var fragment_5 = comment(); var node_5 = first_child(fragment_5); { var consequent_1 = ($$anchor5) => { var a_1 = root_9$1(); var text_2 = child(a_1); template_effect( ($0) => { set_attribute(a_1, "href", `/forum/tracker.php?nm=${$0 ?? ""}`); set_text(text_2, get(item)); }, [() => encodeURIComponent(get(item))] ); append($$anchor5, a_1); }; var alternate_1 = ($$anchor5) => { var fragment_6 = comment(); var node_6 = first_child(fragment_6); { var consequent_2 = ($$anchor6) => { var a_2 = root_11$1(); var text_3 = child(a_2); template_effect( ($0) => { set_attribute(a_2, "href", $0); set_text(text_3, get(item)); }, [() => getLinkUrl(store.performerLinks[0], get(item))] ); append($$anchor6, a_2); }; var alternate = ($$anchor6) => { var fragment_7 = comment(); var node_7 = first_child(fragment_7); { var consequent_3 = ($$anchor7) => { Dropdown($$anchor7, () => get(item)); }; if_block( node_7, ($$render) => { if (get(validLinks).length > 1) $$render(consequent_3); }, true ); } append($$anchor6, fragment_7); }; if_block( node_6, ($$render) => { if (get(validLinks).length === 1 && store.performerLinks[0]) $$render(consequent_2); else $$render(alternate, false); }, true ); } append($$anchor5, fragment_6); }; if_block(node_5, ($$render) => { if (get(validLinks).length === 0 || !get(performerLinks)) $$render(consequent_1); else $$render(alternate_1, false); }); } append($$anchor4, fragment_5); }; var alternate_2 = ($$anchor4) => { var text_4 = text(); template_effect(() => set_text(text_4, get(item))); append($$anchor4, text_4); }; if_block(node_4, ($$render) => { if (get(item) && searchTerms2().includes(get(item))) $$render(consequent_4); else $$render(alternate_2, false); }); } append($$anchor3, fragment_4); }); append($$anchor2, fragment_3); }; let incognito = user_derived(() => getSettings("incognito")); let parseTitle = user_derived(() => getSettings("parseTitle")); let performerLinks = user_derived(() => getSettings("performerLinks")); let title = user_derived(() => data.title?.parsed); let searchTerms = user_derived(() => data.title?.searchTerms); let original = user_derived(() => data.title?.original); let firstTag = user_derived(() => { const tag = data.title?.tags?.[0]; if (get(searchTerms)?.length === 0 && tag) return tag; return; }); let items = user_derived( () => { if (!get(title) || !get(searchTerms)?.length) return [get(title)]; const sortedTerms = [...get(searchTerms)].sort((a, b) => b.length - a.length); const parts = []; let remaining = get(title); while (remaining) { let foundMatch = null; let foundIndex = remaining.length; for (const term of sortedTerms) { const index2 = remaining.indexOf(term); if (index2 !== -1 && index2 < foundIndex) { foundMatch = term; foundIndex = index2; } } if (foundMatch) { if (foundIndex > 0) parts.push(remaining.slice(0, foundIndex)); parts.push(foundMatch); remaining = remaining.slice(foundIndex + foundMatch.length); } else { parts.push(remaining); break; } } return parts.filter((part) => part !== ""); } ); let documentTitle = user_derived( () => { if (get(parseTitle)) { if (get(firstTag)) { return get(firstTag); } else if (get(title)) { return get(title); } } return document.title; } ); var fragment_10 = comment(); head(($$anchor2) => { var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor3) => { template_effect(() => $document.title = get(documentTitle)); }; if_block(node, ($$render) => { if (get(documentTitle)) $$render(consequent); }); } append($$anchor2, fragment); }); var node_8 = first_child(fragment_10); { var consequent_5 = ($$anchor2) => { var h1 = root_15$1(); var node_9 = child(h1); Placholder(node_9); append($$anchor2, h1); }; var alternate_5 = ($$anchor2) => { var fragment_11 = comment(); var node_10 = first_child(fragment_11); { var consequent_6 = ($$anchor3) => { var h1_1 = root_17(); var text_5 = child(h1_1); template_effect(() => set_text(text_5, get(firstTag))); append($$anchor3, h1_1); }; var alternate_4 = ($$anchor3) => { var fragment_12 = comment(); var node_11 = first_child(fragment_12); { var consequent_7 = ($$anchor4) => { var h1_2 = root_19$1(); var node_12 = child(h1_2); ParsedTitle(node_12, () => get(searchTerms)); append($$anchor4, h1_2); }; var alternate_3 = ($$anchor4) => { var fragment_13 = comment(); var node_13 = first_child(fragment_13); { var consequent_8 = ($$anchor5) => { var h1_3 = root_21(); var a_3 = child(h1_3); var text_6 = child(a_3); template_effect( ($0) => { set_attribute(a_3, "href", `/forum/tracker.php?nm=${$0 ?? ""}`); set_text(text_6, get(original)); }, [() => encodeURIComponent(get(original))] ); append($$anchor5, h1_3); }; if_block( node_13, ($$render) => { if (get(original)) $$render(consequent_8); }, true ); } append($$anchor4, fragment_13); }; if_block( node_11, ($$render) => { if (get(parseTitle) && get(title) && get(searchTerms)) $$render(consequent_7); else $$render(alternate_3, false); }, true ); } append($$anchor3, fragment_12); }; if_block( node_10, ($$render) => { if (get(firstTag)) $$render(consequent_6); else $$render(alternate_4, false); }, true ); } append($$anchor2, fragment_11); }; if_block(node_8, ($$render) => { if (get(incognito)) $$render(consequent_5); else $$render(alternate_5, false); }); } append($$anchor, fragment_10); pop(); } delegate(["click"]); var root_1$8 = from_html(`<button class="item svelte-1ilvoyd" aria-label="thank"></button>`); function Thank($$anchor, $$props) { push($$props, true); let observer2; let clicked = state$1(false); let success = state$1(false); let disabled = user_derived( () => { if (get(success)) return true; if (!data.thank?.list) return false; const userLink = data.user?.link; if (!userLink) return false; const userId = new URL(userLink, location.href).searchParams.get("u"); if (!userId) return false; return data.thank?.list.has(userId); } ); let title = user_derived( () => { if (get(disabled)) return "Already thanked"; return; } ); function handleValue(value) { if (data.thank?.element && data.thank?.element instanceof HTMLInputElement) data.thank.element.value = "Thanks: " + value; } function handleElement(thank) { return (element) => { if (thank) for (const attr of ["title", "style", "class"]) thank.removeAttribute(attr); if (get(disabled)) { handleValue("Given"); } else if (get(clicked) && !get(disabled)) { handleValue("Loading..."); } else { handleValue("Give"); } element.appendChild(thank); return () => thank.remove(); }; } function onclick2(event2) { if (get(disabled) || get(clicked)) return; set(clicked, true); observer2?.disconnect(); const currentTarget = event2.currentTarget; const callback = (mutationList, observer3) => { for (const mutation of mutationList) { if (mutation.type !== "childList") continue; mutation.addedNodes.forEach((node) => { if (node instanceof HTMLHeadingElement) { node.remove(); set(success, true); observer3.disconnect(); } }); } }; observer2 = new MutationObserver(callback); observer2.observe(currentTarget, { childList: true }); } onDestroy(() => observer2?.disconnect()); var fragment = comment(); var node_1 = first_child(fragment); { var consequent = ($$anchor2) => { var button = root_1$8(); button.__click = onclick2; attach(button, () => handleElement(data.thank.element)); template_effect(() => { set_attribute(button, "title", get(title)); button.disabled = get(disabled); }); append($$anchor2, button); }; if_block(node_1, ($$render) => { if (data.thank?.element) $$render(consequent); }); } append($$anchor, fragment); pop(); } delegate(["click"]); const Item$1 = ($$anchor, title = noop, data2 = noop) => { var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var div = root_2$2(); var span = child(div); var text2 = child(span); var span_1 = sibling(span, 2); var text_1 = child(span_1); template_effect( ($0) => { set_text(text2, `${title() ?? ""}:`); set_class(span_1, 1, $0, "svelte-7pdkl5"); set_text(text_1, data2()); }, [() => clsx(title().toLowerCase())] ); append($$anchor2, div); }; var alternate = ($$anchor2) => { Error$1($$anchor2, title); }; if_block(node, ($$render) => { if (data2()) $$render(consequent); else $$render(alternate, false); }); } append($$anchor, fragment); }; const Error$1 = ($$anchor, title = noop) => { var div_1 = root_4$1(); var span_2 = child(div_1); var text_2 = child(span_2); template_effect(() => set_text(text_2, `${title() ?? ""}:`)); append($$anchor, div_1); }; function handleDateClick(_, showFullDate) { set(showFullDate, !get(showFullDate)); } function handleFileListClick(__1, fileListState) { if (store.showFileList) { set(fileListState, "idle"); } else { set(fileListState, "loading"); } store.toggleFileList(); } var root_2$2 = from_html(`<div class="item svelte-7pdkl5"><span class="title"> </span> <span> </span></div>`); var root_4$1 = from_html(`<div class="item svelte-7pdkl5"><span class="title"> </span> <span class="error svelte-7pdkl5">N/A</span></div>`); var root_6$2 = from_html(`<button class="item svelte-7pdkl5"><span class="title">Date:</span> <!></button>`); var root_14 = from_html(`<span class="item svelte-7pdkl5"><!></span>`); var root_22 = from_html(`<a>.torrent</a>`); var root_18 = from_html(`<button class="item svelte-7pdkl5"><span class="title">Download:</span> <!></button>`); var root_27 = from_html(`<span><a> </a> </span>`); var root_26 = from_html(`<div class="item svelte-7pdkl5"><span class="title">Related:</span> <!></div>`); var root_5$2 = from_html(`<div id="x-stats" class="svelte-7pdkl5"><!> <!> <!> <!> <button class="item svelte-7pdkl5"><span class="title">Files:</span> <!></button> <!> <!> <!> <!></div>`); function Stats($$anchor, $$props) { push($$props, true); let showFullDate = state$1(false); let expandFiles = user_derived(() => getSettings("expandFiles")); let fileListState = state$1("idle"); let downloadState = "idle"; onMount( () => { if (get(expandFiles)) { store.toggleFileList(); } } ); user_effect( () => { if (!store.showFileList) { set(fileListState, "idle"); } if (store.fileListData && get(fileListState) === "loading") { set(fileListState, "loaded"); } } ); var fragment_2 = comment(); var node_1 = first_child(fragment_2); { var consequent_12 = ($$anchor2) => { var div_2 = root_5$2(); var node_2 = child(div_2); Item$1(node_2, () => "Seeders", () => data.torrent?.seeders || "0"); var node_3 = sibling(node_2, 2); Item$1(node_3, () => "Leechers", () => data.torrent?.leechers || "0"); var node_4 = sibling(node_3, 2); Item$1(node_4, () => "Size", () => data.torrent?.size); var node_5 = sibling(node_4, 2); { var consequent_2 = ($$anchor3) => { var button = root_6$2(); button.__click = [handleDateClick, showFullDate]; var node_6 = sibling(child(button), 2); { var consequent_1 = ($$anchor4) => { var text_3 = text(); template_effect(($0) => set_text(text_3, $0), [() => handleRelativeDate(data.torrent.date)]); append($$anchor4, text_3); }; var alternate_1 = ($$anchor4) => { var text_4 = text(); template_effect(($0) => set_text(text_4, $0), [() => data.torrent.date?.toLocaleString()]); append($$anchor4, text_4); }; if_block(node_6, ($$render) => { if (!get(showFullDate)) $$render(consequent_1); else $$render(alternate_1, false); }); } append($$anchor3, button); }; var alternate_2 = ($$anchor3) => { Error$1($$anchor3, () => "Date"); }; if_block(node_5, ($$render) => { if (data.torrent?.date) $$render(consequent_2); else $$render(alternate_2, false); }); } var button_1 = sibling(node_5, 2); button_1.__click = [handleFileListClick, fileListState]; var node_7 = sibling(child(button_1), 2); { var consequent_3 = ($$anchor3) => { var text_5 = text("Loading..."); append($$anchor3, text_5); }; var alternate_4 = ($$anchor3) => { var fragment_6 = comment(); var node_8 = first_child(fragment_6); { var consequent_4 = ($$anchor4) => { var text_6 = text("Hide"); append($$anchor4, text_6); }; var alternate_3 = ($$anchor4) => { var text_7 = text("Show"); append($$anchor4, text_7); }; if_block( node_8, ($$render) => { if (store.showFileList) $$render(consequent_4); else $$render(alternate_3, false); }, true ); } append($$anchor3, fragment_6); }; if_block(node_7, ($$render) => { if (get(fileListState) === "loading") $$render(consequent_3); else $$render(alternate_4, false); }); } var node_9 = sibling(button_1, 2); { var consequent_5 = ($$anchor3) => { var span_3 = root_14(); var node_10 = child(span_3); Thank(node_10, {}); append($$anchor3, span_3); }; var alternate_5 = ($$anchor3) => { Error$1($$anchor3, () => "Thanks"); }; if_block(node_9, ($$render) => { if (data.thank?.element && data.thank?.list) $$render(consequent_5); else $$render(alternate_5, false); }); } var node_11 = sibling(node_9, 2); { var consequent_6 = ($$anchor3) => { const format = user_derived(() => new Intl.NumberFormat("en-US").format(data.torrent.times)); Item$1($$anchor3, () => "Downloads", () => get(format)); }; var alternate_6 = ($$anchor3) => { Error$1($$anchor3, () => "Downloads"); }; if_block(node_11, ($$render) => { if (data.torrent?.times != null) $$render(consequent_6); else $$render(alternate_6, false); }); } var node_12 = sibling(node_11, 2); { var consequent_9 = ($$anchor3) => { var button_2 = root_18(); button_2.__click = function(...$$args) { handleDownload?.apply(this, $$args); }; button_2.disabled = downloadState === "downloading"; var node_13 = sibling(child(button_2), 2); { var alternate_8 = ($$anchor4) => { var fragment_10 = comment(); var node_14 = first_child(fragment_10); { var alternate_7 = ($$anchor5) => { var a = root_22(); template_effect(() => set_attribute(a, "href", data.torrent?.link)); append($$anchor5, a); }; if_block( node_14, ($$render) => { $$render(alternate_7, false); }, true ); } append($$anchor4, fragment_10); }; if_block(node_13, ($$render) => { $$render(alternate_8, false); }); } append($$anchor3, button_2); }; var alternate_9 = ($$anchor3) => { Error$1($$anchor3, () => "Download"); }; if_block(node_12, ($$render) => { if (data.torrent) $$render(consequent_9); else $$render(alternate_9, false); }); } var node_15 = sibling(node_12, 2); { var consequent_11 = ($$anchor3) => { const max = user_derived(() => 5); var fragment_12 = comment(); var node_16 = first_child(fragment_12); await_block(node_16, () => getRelated(data.title.original), null, ($$anchor4, related) => { const results = user_derived(() => get(related).filter((result) => result.textContent !== data.title?.original)); var fragment_13 = comment(); var node_17 = first_child(fragment_13); { var consequent_10 = ($$anchor5) => { var div_3 = root_26(); var node_18 = sibling(child(div_3), 2); each(node_18, 17, () => get(results), index, ($$anchor6, result, i) => { var span_4 = root_27(); var a_1 = child(span_4); var text_10 = child(a_1); var text_11 = sibling(a_1); template_effect(() => { set_attribute(a_1, "href", get(result).href); set_text(text_10, get(result).resolution); set_text(text_11, ` ${i < get(results).length - 1 ? ", " : ""}`); }); append($$anchor6, span_4); }); append($$anchor5, div_3); }; if_block(node_17, ($$render) => { if (get(results).length > 0 && get(results).length < get(max)) $$render(consequent_10); }); } append($$anchor4, fragment_13); }); append($$anchor3, fragment_12); }; if_block(node_15, ($$render) => { if (data.title?.original) $$render(consequent_11); }); } template_effect(() => button_1.disabled = get(fileListState) === "loading"); append($$anchor2, div_2); }; if_block(node_1, ($$render) => { if (data.user && !data.forumline) $$render(consequent_12); }); } append($$anchor, fragment_2); pop(); } delegate(["click"]); var root_3$2 = from_html(`<a> </a>`); var root_6$1 = from_html(`<a> </a>`); var on_click$1 = (event2, item) => store.openDropdown(event2, get(item), ["tag-item--hover"]); var root_7$2 = from_html(`<span> </span>`); var root_1$7 = from_html(`<div id="x-tags" class="svelte-hxarl5"></div>`); function Tags($$anchor, $$props) { push($$props, true); let parseTitle = user_derived(() => getSettings("parseTitle")); let showTags = user_derived(() => getSettings("showTags")); let performerLinks = user_derived(() => getSettings("performerLinks")); let derivedTags = user_derived( () => { if (getSettings("incognito")) return ["tag1", "tag2", "tag3", "tag4", "tag5"]; const tags = data?.title?.tags || []; return [...new Set(tags)]; } ); function resTag(tag) { return /\b(?:\d{3,}p|\d+k)\b/i.test(tag); } var fragment = comment(); var node = first_child(fragment); { var consequent_3 = ($$anchor2) => { var div = root_1$7(); each(div, 21, () => get(derivedTags), index, ($$anchor3, item) => { const classList = user_derived(() => ["tag-item", resTag(get(item)) && "tag-res"]); var fragment_1 = comment(); var node_1 = first_child(fragment_1); { var consequent = ($$anchor4) => { var a = root_3$2(); var text2 = child(a); template_effect( ($0) => { set_class(a, 1, clsx(get(classList)), "svelte-hxarl5"); set_attribute(a, "href", `/forum/tracker.php?nm=${$0 ?? ""}`); set_text(text2, get(item)); }, [() => encodeURIComponent(get(item))] ); append($$anchor4, a); }; var alternate_1 = ($$anchor4) => { var fragment_2 = comment(); var node_2 = first_child(fragment_2); { var consequent_2 = ($$anchor5) => { const link2 = user_derived(() => store.performerLinks[0]); var fragment_3 = comment(); var node_3 = first_child(fragment_3); { var consequent_1 = ($$anchor6) => { var a_1 = root_6$1(); var text_1 = child(a_1); template_effect( ($0) => { set_class(a_1, 1, clsx(get(classList)), "svelte-hxarl5"); set_attribute(a_1, "href", $0); set_text(text_1, get(item)); }, [() => getLinkUrl(get(link2), get(item))] ); append($$anchor6, a_1); }; if_block(node_3, ($$render) => { if (get(link2)) $$render(consequent_1); }); } append($$anchor5, fragment_3); }; var alternate = ($$anchor5) => { var span = root_7$2(); span.__click = [on_click$1, item]; var text_2 = child(span); template_effect(() => { set_class(span, 1, clsx(get(classList)), "svelte-hxarl5"); set_text(text_2, get(item)); }); append($$anchor5, span); }; if_block( node_2, ($$render) => { if (store.performerLinks.length === 1) $$render(consequent_2); else $$render(alternate, false); }, true ); } append($$anchor4, fragment_2); }; if_block(node_1, ($$render) => { if (!get(performerLinks)) $$render(consequent); else $$render(alternate_1, false); }); } append($$anchor3, fragment_1); }); transition(3, div, () => slideFade, () => store.transition); append($$anchor2, div); }; if_block(node, ($$render) => { if (get(parseTitle) && get(showTags) && get(derivedTags)?.length) $$render(consequent_3); }); } append($$anchor, fragment); pop(); } delegate(["click"]); var root_1$6 = from_html(`<div class="filelist svelte-eqeghx"><!></div>`); function FileList($$anchor, $$props) { push($$props, true); function humanSize(bytes) { if (bytes <= 0) return "0 B"; const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; const rounders = [1, 1, 1, 100, 1e3, 1e3, 1e3, 1e3, 1e3]; const idx = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1); let value = bytes / Math.pow(1024, idx); const factor = rounders[idx]; if (!factor) return null; value = Math.round((value + Number.EPSILON) * factor) / factor; return `${value} ${units[idx]}`; } async function getFileList() { const t = new URL(location.href).searchParams.get("t"); if (!t) { console.error('Missing "t" parameter'); return; } try { const res = await fetch("viewtorrent.php", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ t }).toString() }); if (!res.ok) { console.error(`Server error: ${res.status}`); return; } const raw = await res.text(); const doc = new DOMParser().parseFromString(raw, "text/html"); doc.querySelectorAll("li.collapsable").forEach((li) => { let dirSize = 0; li.querySelectorAll("i").forEach((i) => { dirSize += parseInt(i.textContent?.trim() || "0", 10); }); const spanB = li.querySelector("span.b"); if (spanB) { const s = doc.createElement("s"); s.textContent = humanSize(dirSize); spanB.append(" · ", s); } }); doc.querySelectorAll("i").forEach((i) => { const bytes = parseInt(i.textContent?.trim() || "0", 10); i.textContent = humanSize(bytes); }); store.fileListData = doc.body.innerHTML; } catch (err) { console.error("Failed to fetch/transform torrent filelist:", err); } } user_effect( () => { if (!store.fileListData && store.showFileList) { getFileList(); } } ); var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var div = root_1$6(); var node_1 = child(div); html(node_1, () => store.fileListData); transition(3, div, () => slideFade, () => store.transition); append($$anchor2, div); }; if_block(node, ($$render) => { if (store.fileListData && store.showFileList) $$render(consequent); }); } append($$anchor, fragment); pop(); } const parser$2 = new DOMParser(); async function generic(href, selector, headers) { const { response, responseText, finalUrl } = await GM_fetch( "GET", href, "blob", headers ); if (response.type.startsWith("image/")) { return finalUrl; } const doc = parser$2.parseFromString(responseText, "text/html"); const img = doc.querySelector(selector); const src = img?.getAttribute("src"); if (!src) { throw new Error(`image not found: ${href}`); } return new URL(src, href).href; } async function imagebam(href, selector) { const headers = { Cookie: "nsfw_inter=1" }; return generic(href, selector, headers); } async function imagenimage(href, src) { const match = src?.match( /(https:\/\/img\d+\.imagenimage\.com\/)th\/(.+)\.jpg/ ); if (!src || !match) { const selector = "#left > a > img"; return generic(href, selector); } const domain = match[1]; const path = match[2]; const linkMatch = href.match(/https:\/\/imagenimage\.com\/(.+)/); if (!linkMatch) { throw new Error(`Invalid URL: ${href}`); } const filename = linkMatch[1]; const imgSrc = `${domain}i/${path}.jpg/${filename}`; return imgSrc; } async function imagetwist(href, src) { let imgSrc; if (src && src.includes("/th/")) { const extRegex = /\.([\w]{2,4})(\?|$)/; const hrefExt = href.match(extRegex)?.[1]; imgSrc = src.replace("/th/", "/i/"); if (hrefExt) { imgSrc = imgSrc.replace(extRegex, `.${hrefExt}$2`); } const response = await GM_fetch("HEAD", imgSrc, "text"); const imgError = /content-length:\s*8183/i.test(response.responseHeaders); if (!imgError) { return await getBlob(imgSrc); } } imgSrc = await generic(href, "img.pic"); if (!imgSrc) { throw new Error(`image not found: ${href}`); } return await getBlob(imgSrc); } async function imgbase(href, src) { if (!src) return href; return src.replace("-thumb.", "."); } async function imgbox(href) { if (href.includes("thumbs")) return href.replace("thumbs", "images").replace("_t.", "_o."); const selector = "#img"; return generic(href, selector); } const parser$1 = new DOMParser(); async function imgbum(href) { const { responseText } = await GM_fetch("GET", href, "text"); const doc = parser$1.parseFromString(responseText, "text/html"); const selector = "table > tbody > tr > td > img"; const img = doc.querySelector(selector); const onclick2 = img?.getAttribute("onclick"); const match = onclick2?.match(/\/\*mshow\('([^']+)'\);\*\//); const imgSrc = match?.[1]; if (!imgSrc) { throw new Error(`image not found: ${href}`); } return new URL(imgSrc, href).href; } async function imgdrive(href, src) { if (!src) return href; const imgSrc = src.replace("/small/", "/big/"); if (src.includes("imgwallet.com")) return imgSrc; return await getBlob(imgSrc); } async function imgfrost(href, src) { if (!src) return Promise.resolve(href); const parsed = new URL(src); parsed.hostname = "prcf.imglomalr.site"; parsed.pathname = parsed.pathname.replace("/small/small_", "/big/"); const headers = { Referer: "https://imgair.net" }; const { response, finalUrl } = await GM_fetch( "GET", parsed.href, "blob", headers ); if (!response.type.startsWith("image/")) { throw new Error(`Expected image but got ${response.type} from ${finalUrl}`); } return finalUrl; } async function piccash(href, src) { let imgSrc; if (src && src.includes("img_thumb")) { imgSrc = src; } else { imgSrc = href; } return imgSrc.replace("http://", "https://").replace("/img_thumb/", "/img_full/").replace("-thumb.", "."); } const parser = new DOMParser(); async function picforall(href) { const { responseText } = await GM_fetch("GET", href, "text"); const selector = "#pay_thumb_img img"; const doc = parser.parseFromString(responseText, "text/html"); const img = doc.querySelector(selector); const onclick2 = img?.getAttribute("onclick"); const match = onclick2?.match(/mshow\('([^']+)'\)/); const imgSrc = match?.[1]; if (!imgSrc) { throw new Error(`image not found: ${href}`); } return imgSrc; } async function picshick(href, src) { if (!src || !src.includes("/th/") || !href.includes("/")) { const selector = "img.pic"; const imgSrc = await generic(href, selector); return await getBlob(imgSrc); } const fileName = href.substring(href.lastIndexOf("/") + 1); const extension = fileName.substring(fileName.lastIndexOf(".") + 1); const parts = src.split("/"); const albumId = parts[parts.length - 2]; const thumbFile = parts[parts.length - 1]; if (!thumbFile) { throw Error(`parsing image: ${href}`); } const imageId = thumbFile.substring(0, thumbFile.lastIndexOf(".")); const host = src.substring(0, src.indexOf("/th/")); const fullSizePath = `/i/${albumId}/${imageId}.${extension}/${fileName}`; const finalUrl = `${host}${fullSizePath}`; return await getBlob(finalUrl); } async function turboimagehost(href) { const { response, responseText, finalUrl } = await GM_fetch( "GET", href, "blob" ); if (response.type.startsWith("image/")) { return finalUrl; } const match = responseText.match(/"og:image" content="([^"]+)"/); if (match[1]) { return new URL(match[1], href).href; } const selector = "#imageid"; return generic(href, selector); } const HANDLERS = { "fastpic.": (href) => generic(href, "#imglink > img.image.img-fluid"), "imgsto.com": (href) => generic(href, ".main-content-image > img"), "imagebam.com": (href) => imagebam(href, "img.main-image"), "imageban.ru": (href) => generic(href, "#img_main"), "imagenimage.com": (href, src) => imagenimage(href, src), "imagetwist.com": (href, src) => imagetwist(href, src), "picturelol.com": (href, src) => imagetwist(href, src), "vipr.im": (href, src) => imagetwist(href, src), "imagevenue.com": (href) => generic(href, "#main-image"), "imgbase.ru": (href, src) => imgbase(href, src), "picclick.ru": (href, src) => imgbase(href, src), "adult-images.ru": (href, src) => imgbase(href, src), "payforpic.ru": (href, src) => imgbase(href, src), "imgbox.com": (href) => imgbox(href), "imgbum.ru": (href) => imgbum(href), "imgdrive.net": (href, src) => imgdrive(href, src), "imgadult.com": (href, src) => imgdrive(href, src), "imgwallet.com": (href, src) => imgdrive(href, src), "imgfrost.net": (href, src) => imgfrost(href, src), "imgblaze.net": (href, src) => imgfrost(href, src), "piccash.net": (href, src) => piccash(href, src), "picforall.ru": (href) => picforall(href), "imgclick.ru": (href) => picforall(href), "freescreens.ru": (href) => picforall(href), "picshick.com": (href, src) => picshick(href, src), "turboimagehost.com": (href) => turboimagehost(href) }; function updateStatus(imageId, data2) { store.upgradeImgData[imageId] = { ...store.upgradeImgData[imageId], ...data2 }; } async function upgradeImg(img) { if (!img) return; if (!img.id) return console.error("Image is missing id"); const anchor = img.closest("a"); if (!anchor || !anchor.getAttribute("href")) { return updateStatus(img.id, { status: "error", error: `Image anchor with id ${img.id} is missing href` }); } updateStatus(img.id, { status: "loading" }); if (getSettings("cacheImages")) { const cached = getCache$1(anchor.href); if (cached) { if (img.complete && img.naturalHeight !== 0) { updateStatus(img.id, { status: "cached", resolved: cached }); } else { on( img, "load", () => { updateStatus(img.id, { status: "cached", resolved: cached }); }, { once: true } ); on( img, "error", () => { updateStatus(img.id, { status: "error", error: `Failed to load cached image: ${cached}` }); }, { once: true } ); } img.src = cached; return; } } const entry = Object.entries(HANDLERS).find( ([domain]) => anchor.href.includes(domain) ); if (!entry) return updateStatus(img.id, { status: "error", error: `No handler for ${new URL(anchor.href).hostname}` }); const [, handler] = entry; try { const src = await handler(anchor.href, img.src); if (src.startsWith("blob:")) { on( img, "load", () => { URL.revokeObjectURL(src); updateStatus(img.id, { status: "resolved", resolved: src }); }, { once: true } ); on( img, "error", () => { URL.revokeObjectURL(src); updateStatus(img.id, { status: "error", error: `Failed to load blob` }); }, { once: true } ); } else { on( img, "load", () => { setCache$1(anchor.href, src); updateStatus(img.id, { status: "resolved", resolved: src }); }, { once: true } ); on( img, "error", () => { updateStatus(img.id, { status: "error", error: `Failed to load image from: ${src}` }); }, { once: true } ); } updateStatus(img.id, { resolved: src }); img.src = src; } catch (error) { return updateStatus(img.id, { error: String(error), status: "error" }); } } function onIntersect(entries, observer2) { entries.forEach((entry) => { if (entry.isIntersecting) { observer2.unobserve(entry.target); upgradeImg(entry.target); } }); } const observed = new WeakSet(); const observer = new IntersectionObserver(onIntersect, { rootMargin: `${getSettings("limitConcurrent") ? "200%" : "1000%"} 0%` }); async function observeImg(imgRefs) { const unobserved = imgRefs.filter((img) => { return !observed.has(img) && img instanceof HTMLImageElement; }); if (!unobserved.length) return; unobserved.forEach((img) => { observed.add(img); }); if (unobserved[0]) await upgradeImg(unobserved[0]); unobserved.slice(1).forEach((img) => { observer.observe(img); }); } var root$1 = from_html(`<div><!></div>`); function Resize($$anchor, $$props) { push($$props, true); let clicked = prop($$props, "clicked", 15), resized = prop($$props, "resized", 15); let dragResize = user_derived(() => getSettings("dragResize")); let clientX = state$1(0); let prevResizeWidth = state$1(0); let draggedEl = state$1(null); let draggedElCenter = state$1(0); function getElementCenter(element) { const rect = element.getBoundingClientRect(); return rect.top + rect.height / 2; } function clamp(value, min = 20, max = 100) { return Math.min(max, Math.max(min, value)); } function onpointerdown(event2) { if (!get(dragResize) || !(event2.target instanceof HTMLImageElement)) return; if (event2.button !== 0) return; event2.preventDefault(); set(draggedEl, event2.target, true); set(draggedElCenter, getElementCenter(get(draggedEl)), true); clicked(true); set(clientX, event2.clientX, true); set(prevResizeWidth, store.resizeWidth, true); } async function onpointermove(event2) { if (!get(dragResize) || !clicked()) return; if (!resized()) { resized(event2.clientX - get(clientX) !== 0); } else if (resized() && $$props.containerWidth) { const deltaPercent = (event2.clientX - get(clientX)) / $$props.containerWidth * 100; let newWidth = get(prevResizeWidth) + deltaPercent; let clampedWidth = clamp(newWidth); if (clampedWidth !== newWidth) { set(prevResizeWidth, clampedWidth, true); set(clientX, event2.clientX, true); } store.resizeWidth = Math.round(clampedWidth * 10) / 10; requestAnimationFrame(() => { if (!get(draggedEl)) return; const currentCenter = getElementCenter(get(draggedEl)); const deltaY = currentCenter - get(draggedElCenter); window.scrollTo(0, window.scrollY + deltaY); }); } } function onpointerup() { if (clicked() && resized()) { saveResize(store.resizeWidth); } clicked(false); resized(false); set(clientX, 0); set(prevResizeWidth, 0); } var div = root$1(); event("pointermove", $document, onpointermove); event("pointerup", $document, onpointerup); div.__pointerdown = onpointerdown; let classes; let styles; var node = child(div); snippet(node, () => $$props.children); template_effect( ($0, $1) => { classes = set_class(div, 1, "svelte-1rhiyed", null, classes, $0); styles = set_style(div, "", styles, $1); }, [ () => ({ dragging: clicked() && resized() }), () => ({ width: `${(get(dragResize) ? store.resizeWidth : 100) ?? ""}%` }) ] ); append($$anchor, div); pop(); } delegate(["pointerdown"]); var root_1$5 = from_html(`<div class="loader svelte-10rouec"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="svelte-10rouec"><path d="M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2Zm0 18a8 8 0 1 1 8-8A8 8 0 0 1 12 20Z" opacity="0.5" class="svelte-10rouec"></path><path class="animate svelte-10rouec" d="M20 12h2A10 10 0 0 0 12 2V4A8 8 0 0 1 20 12Z"></path></svg></div>`); function Loader($$anchor, $$props) { push($$props, true); var fragment = comment(); var node = first_child(fragment); { var consequent = ($$anchor2) => { var div = root_1$5(); transition(3, div, () => fade, () => store.transition); append($$anchor2, div); }; if_block(node, ($$render) => { if ($$props.loading) $$render(consequent); }); } append($$anchor, fragment); pop(); } const Item = ($$anchor, key = noop, value = noop, error = noop) => { var p = root_1$4(); var strong = child(p); var text2 = child(strong); var node = sibling(strong, 2); { var consequent = ($$anchor2) => { var a = root_2$1(); var text_1 = child(a); template_effect(() => { set_attribute(a, "href", value()); set_text(text_1, value()); }); append($$anchor2, a); }; var alternate_1 = ($$anchor2) => { var fragment = comment(); var node_1 = first_child(fragment); { var consequent_1 = ($$anchor3) => { var span = root_4(); append($$anchor3, span); }; var alternate = ($$anchor3) => { var fragment_1 = root_5$1(); var text_2 = first_child(fragment_1); var node_2 = sibling(text_2); { var consequent_2 = ($$anchor4) => { var span_1 = root_6(); var text_3 = child(span_1); template_effect(() => set_text(text_3, error())); append($$anchor4, span_1); }; if_block(node_2, ($$render) => { if (value() === "error" && error()) $$render(consequent_2); }); } template_effect(() => set_text(text_2, `${value() ?? ""} `)); append($$anchor3, fragment_1); }; if_block( node_1, ($$render) => { if (value() === void 0) $$render(consequent_1); else $$render(alternate, false); }, true ); } append($$anchor2, fragment); }; if_block(node, ($$render) => { if (value() && value().startsWith("http")) $$render(consequent); else $$render(alternate_1, false); }); } template_effect(() => { set_attribute(p, "data-key", key()); set_text(text2, key()); }); append($$anchor, p); }; var root_2$1 = from_html(`<a class="svelte-zizdl6"> </a>`); var root_4 = from_html(`<span class="error svelte-zizdl6">null</span>`); var root_6 = from_html(`<span class="error svelte-zizdl6"> </span>`); var root_5$1 = from_html(` <!>`, 1); var root_1$4 = from_html(`<p><strong> </strong>: <!></p>`); var root_7$1 = from_svg(`<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="svelte-zizdl6"><path d="M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1a1 1 0 0 1-1 1a1 1 0 0 1-1-1a1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2" class="svelte-zizdl6"></path></svg>`); var root = from_html(`<div class="debug svelte-zizdl6"><!> <!> <!> <!> <div class="copy svelte-zizdl6"><!></div></div>`); function Debug($$anchor, $$props) { push($$props, true); let data2 = user_derived(() => store.upgradeImgData?.[$$props.img.id] || {}); async function copyToClipboard(data3) { try { const dataWithoutId = Object.fromEntries(Object.entries(data3).filter(([key]) => key !== "id")); await navigator.clipboard.writeText(JSON.stringify(dataWithoutId, null, 2)); } catch (err) { console.error("Failed to copy debug:", err); } } var div = root(); var node_3 = child(div); Item(node_3, () => "status", () => get(data2).status, () => get(data2).error); var node_4 = sibling(node_3, 2); Item(node_4, () => "href", () => $$props.img.href); var node_5 = sibling(node_4, 2); Item(node_5, () => "src", () => $$props.img.src); var node_6 = sibling(node_5, 2); Item(node_6, () => "resolved", () => get(data2).resolved); var div_1 = sibling(node_6, 2); var node_7 = child(div_1); Checkmark(node_7, { onclick: () => copyToClipboard({ id: $$props.img.id, href: $$props.img.href, src: $$props.img.src, status: get(data2).status, resolved: get(data2).resolved, error: get(data2).error }), title: "Copy to clipboard", children: ($$anchor2, $$slotProps) => { var svg = root_7$1(); append($$anchor2, svg); }, $$slots: { default: true } }); transition(3, div, () => slide, () => store.transition); append($$anchor, div); pop(); } var root_3$1 = from_html(`<div class="container svelte-ojhdzd"><!> <a target="_blank"><img/> <!></a></div>`); var root_1$3 = from_html(`<div id="x-images"><!></div>`); function Images($$anchor, $$props) { push($$props, true); let clicked = state$1(false); let resized = state$1(false); let containerWidth = state$1(0); let upgradeImages = user_derived(() => getSettings("upgradeImages")); let incognito = user_derived(() => getSettings("incognito")); let lastImageFirst = user_derived(() => getSettings("lastImageFirst")); let debugImgs = user_derived(() => getSettings("debugImgs")); function onerror(event2) { const img = event2.currentTarget; img.dataset["broken"] = "true"; } function handleOrder(index2) { if (data.images && get(lastImageFirst)) { if (index2 === data.images.length - 1) return -1; } return; } user_effect( () => { if (get(upgradeImages) && store.imgRefs.length) { observeImg(store.imgRefs); } return () => observer.disconnect(); } ); var fragment = comment(); var node = first_child(fragment); { var consequent_2 = ($$anchor2) => { var div = root_1$3(); let classes; var node_1 = child(div); Resize(node_1, { get containerWidth() { return get(containerWidth); }, get clicked() { return get(clicked); }, set clicked($$value) { set(clicked, $$value, true); }, get resized() { return get(resized); }, set resized($$value) { set(resized, $$value, true); }, children: ($$anchor3, $$slotProps) => { var fragment_1 = comment(); var node_2 = first_child(fragment_1); each(node_2, 19, () => data.images, (img) => img.id, ($$anchor4, img, i) => { const gif = user_derived(() => get(img)?.src?.toLowerCase()?.includes(".gif")); const loading = user_derived(() => get(img)?.href ? "eager" : "lazy"); var div_1 = root_3$1(); let styles; var node_3 = child(div_1); { var consequent = ($$anchor5) => { Debug($$anchor5, { get img() { return get(img); } }); }; if_block(node_3, ($$render) => { if (get(debugImgs)) $$render(consequent); }); } var a = sibling(node_3, 2); let classes_1; var img_1 = child(a); let classes_2; bind_this(img_1, ($$value, i2) => store.imgRefs[i2] = $$value, (i2) => store?.imgRefs?.[i2], () => [get(i)]); var node_4 = sibling(img_1, 2); { var consequent_1 = ($$anchor5) => { { let $0 = user_derived(() => get(upgradeImages) && store.upgradeImgData?.[get(img).id]?.status === "loading"); Loader($$anchor5, { get loading() { return get($0); } }); } }; if_block(node_4, ($$render) => { if (!get(gif)) $$render(consequent_1); }); } template_effect( ($0, $1, $2) => { set_attribute(div_1, "data-id", get(img).id); styles = set_style(div_1, "", styles, $0); set_attribute(a, "href", get(img)?.href); classes_1 = set_class(a, 1, "svelte-ojhdzd", null, classes_1, $1); set_attribute(img_1, "loading", get(loading)); set_attribute(img_1, "id", get(img).id); set_attribute(img_1, "src", get(img)?.src); set_attribute(img_1, "alt", get(img)?.src); classes_2 = set_class(img_1, 1, "svelte-ojhdzd", null, classes_2, $2); }, [ () => ({ order: handleOrder(get(i)) }), () => ({ gif: get(gif) }), () => ({ incognito: get(incognito), gif: get(gif) }) ] ); event("error", img_1, onerror); append($$anchor4, div_1); }); append($$anchor3, fragment_1); }, $$slots: { default: true } }); bind_this(div, ($$value) => store.ultraImages = $$value, () => store?.ultraImages); template_effect(($0) => classes = set_class(div, 1, "section svelte-ojhdzd", null, classes, $0), [() => ({ dragging: get(clicked) && get(resized) })]); bind_element_size(div, "offsetWidth", ($$value) => set(containerWidth, $$value)); append($$anchor2, div); }; if_block(node, ($$render) => { if (data.images && data.images.length) $$render(consequent_2); }); } append($$anchor, fragment); pop(); } const Incognito = ($$anchor) => { var div = root_1$2(); var a = sibling(child(div)); a.__click = [on_click]; set_style(a, "", {}, { cursor: "pointer" }); append($$anchor, div); }; const Forumline = ($$anchor, forumline = noop) => { const infoHeader = user_derived(() => forumline()?.querySelector("th")?.textContent); const infoBody = user_derived(() => forumline()?.querySelector("td")?.innerHTML); const errorMessages = user_derived(() => ({ "Тема находится в мусорке": "The topic is in the trash", "Тема не найдена": "Topic not found", "Раздача ожидает проверки": "Distribution is awaiting moderator approval<br /><br />Viewing is currently unavailable" })); const currentError = user_derived(() => Object.keys(get(errorMessages)).find((key) => forumline()?.textContent?.includes(key))); var div_1 = root_2(); var node = child(div_1); { var consequent = ($$anchor2) => { var fragment = root_3(); var p = sibling(first_child(fragment), 4); set_style(p, "", {}, { "text-align": "center" }); var node_1 = child(p); html(node_1, () => get(errorMessages)[get(currentError)]); append($$anchor2, fragment); }; var alternate_1 = ($$anchor2) => { var fragment_1 = comment(); var node_2 = first_child(fragment_1); { var consequent_1 = ($$anchor3) => { var fragment_2 = root_5(); var h3 = first_child(fragment_2); var text2 = child(h3); var node_3 = sibling(h3, 2); html(node_3, () => get(infoBody)); template_effect(() => set_text(text2, get(infoHeader))); append($$anchor3, fragment_2); }; var alternate = ($$anchor3) => { var fragment_3 = comment(); var node_4 = first_child(fragment_3); html(node_4, () => forumline()?.innerHTML); append($$anchor3, fragment_3); }; if_block( node_2, ($$render) => { if (get(infoHeader) && get(infoBody)) $$render(consequent_1); else $$render(alternate, false); }, true ); } append($$anchor2, fragment_1); }; if_block(node, ($$render) => { if (get(currentError)) $$render(consequent); else $$render(alternate_1, false); }); } append($$anchor, div_1); }; const Avatar = ($$anchor, avatar = noop, nick = noop, link2 = noop) => { var a_1 = root_7(); var node_5 = child(a_1); { var consequent_2 = ($$anchor2) => { var img = root_8(); template_effect(() => { set_attribute(img, "src", avatar()); set_attribute(img, "alt", nick()); }); append($$anchor2, img); }; var alternate_2 = ($$anchor2) => { var svg = root_9(); append($$anchor2, svg); }; if_block(node_5, ($$render) => { if (avatar()) $$render(consequent_2); else $$render(alternate_2, false); }); } template_effect(() => set_attribute(a_1, "href", link2())); append($$anchor, a_1); }; const Nick = ($$anchor, nick = noop, link2 = noop) => { var fragment_4 = comment(); var node_6 = first_child(fragment_4); { var consequent_4 = ($$anchor2) => { const content = user_derived(() => nick() === "Гость" ? "Guest" : nick()); var span = root_11(); var node_7 = child(span); { var consequent_3 = ($$anchor3) => { var a_2 = root_12(); var text_1 = child(a_2); template_effect(() => { set_attribute(a_2, "href", link2()); set_text(text_1, get(content)); }); append($$anchor3, a_2); }; var alternate_3 = ($$anchor3) => { var text_2 = text(); template_effect(() => set_text(text_2, get(content))); append($$anchor3, text_2); }; if_block(node_7, ($$render) => { if (link2()) $$render(consequent_3); else $$render(alternate_3, false); }); } append($$anchor2, span); }; if_block(node_6, ($$render) => { if (nick()) $$render(consequent_4); }); } append($$anchor, fragment_4); }; var on_click = (event2) => { event2.preventDefault(); updateOption("incognito", false); }; var root_1$2 = from_html(`<div>Post not rendered... <a href="#incognito" class="svelte-14j3c1y">turn off incognito</a></div>`); var root_3 = from_html(`<h3>Information</h3> <br/> <p><!></p> <br/> <a href="/forum/index.php" class="svelte-14j3c1y">Return to home page</a>`, 1); var root_5 = from_html(`<h3> </h3> <!>`, 1); var root_2 = from_html(`<div class="forumline svelte-14j3c1y"><!></div>`); var root_8 = from_html(`<img class="svelte-14j3c1y"/>`); var root_9 = from_svg(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="svelte-14j3c1y"><path fill="currentcolor" fill-rule="evenodd" d="M8 7a4 4 0 1 1 8 0a4 4 0 0 1-8 0m0 6a5 5 0 0 0-5 5a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3a5 5 0 0 0-5-5z" clip-rule="evenodd"></path></svg>`); var root_7 = from_html(`<a class="no-avatar svelte-14j3c1y"><!></a>`); var root_12 = from_html(`<a class="svelte-14j3c1y"> </a>`); var root_11 = from_html(`<span class="nick svelte-14j3c1y"><!></span>`); var on_click_1 = (_, toggleFullDate, i) => toggleFullDate(i()); var root_15 = from_html(`<button class="date svelte-14j3c1y"><!></button>`); var root_23 = from_html(`<div class="post svelte-14j3c1y"><div class="avatar svelte-14j3c1y"><!></div> <div class="content svelte-14j3c1y"><div class="header svelte-14j3c1y"><!> <!></div> <div class="message svelte-14j3c1y"></div></div></div>`); var root_19 = from_html(`<div id="x-post"><!></div>`); function Post($$anchor, $$props) { push($$props, true); const Date2 = ($$anchor2, date = noop, i = noop) => { var fragment_6 = comment(); var node_8 = first_child(fragment_6); { var consequent_6 = ($$anchor3) => { const paredDate = user_derived(() => handleDate(date())); var button = root_15(); button.__click = [on_click_1, toggleFullDate, i]; var node_9 = child(button); { var consequent_5 = ($$anchor4) => { var text_3 = text(); template_effect(($0) => set_text(text_3, $0), [() => get(paredDate)?.toLocaleString()]); append($$anchor4, text_3); }; var alternate_4 = ($$anchor4) => { var text_4 = text(); template_effect(($0) => set_text(text_4, $0), [() => handleRelativeDate(get(paredDate))]); append($$anchor4, text_4); }; if_block(node_9, ($$render) => { if (showFullDate[i()]) $$render(consequent_5); else $$render(alternate_4, false); }); } append($$anchor3, button); }; if_block(node_8, ($$render) => { if (date()) $$render(consequent_6); }); } append($$anchor2, fragment_6); }; let incognito = user_derived(() => getSettings("incognito")); let showFullDate = proxy({}); function toggleFullDate(index2) { showFullDate[index2] = !showFullDate[index2]; } function insertPost(message) { return (element) => { element.appendChild(message); return () => message.remove(); }; } var fragment_9 = comment(); var node_10 = first_child(fragment_9); { var consequent_7 = ($$anchor2) => { Incognito($$anchor2); }; var alternate_6 = ($$anchor2) => { var div_2 = root_19(); let classes; var node_11 = child(div_2); { var consequent_8 = ($$anchor3) => { Forumline($$anchor3, () => data.forumline); }; var alternate_5 = ($$anchor3) => { var fragment_12 = comment(); var node_12 = first_child(fragment_12); { var consequent_9 = ($$anchor4) => { var fragment_13 = comment(); var node_13 = first_child(fragment_13); each(node_13, 17, () => data.posts, index, ($$anchor5, $$item, i) => { let nick = () => get($$item).nick; let link2 = () => get($$item).link; let avatar = () => get($$item).avatar; let date = () => get($$item).date; let message = () => get($$item).message; var div_3 = root_23(); var div_4 = child(div_3); var node_14 = child(div_4); Avatar(node_14, avatar, nick, link2); var div_5 = sibling(div_4, 2); var div_6 = child(div_5); var node_15 = child(div_6); Nick(node_15, nick, link2); var node_16 = sibling(node_15, 2); Date2(node_16, date, () => i); var div_7 = sibling(div_6, 2); attach(div_7, () => insertPost(message())); append($$anchor5, div_3); }); append($$anchor4, fragment_13); }; if_block( node_12, ($$render) => { if (data.posts && data.posts?.length) $$render(consequent_9); }, true ); } append($$anchor3, fragment_12); }; if_block(node_11, ($$render) => { if (data.forumline) $$render(consequent_8); else $$render(alternate_5, false); }); } bind_this(div_2, ($$value) => store.ultraPost = $$value, () => store?.ultraPost); template_effect(($0) => classes = set_class(div_2, 1, "svelte-14j3c1y", null, classes, $0), [() => ({ section: data.forumline || data.posts?.length })]); append($$anchor2, div_2); }; if_block(node_10, ($$render) => { if (get(incognito)) $$render(consequent_7); else $$render(alternate_6, false); }); } append($$anchor, fragment_9); pop(); } delegate(["click"]); var root_1$1 = from_html(`<div id="ultra-pagination" class="svelte-13k3ejc"><!></div>`); function Pagination($$anchor, $$props) { push($$props, true); const parser2 = new DOMParser(); const translations = { Страница: "Page", Страницы: "Pages", из: "of", "Пред.": "Prev", "След.": "Next" }; const regex2 = /Страница|Страницы|из|Пред\.|След\./g; let content = user_derived(() => { if (!data.pagination?.innerHTML) return ""; const doc = parser2.parseFromString(data.pagination.innerHTML, "text/html"); const pageSelect = doc.querySelector("a.menu-root"); if (pageSelect) { pageSelect.replaceWith(doc.createTextNode("Pages")); } return doc.body.innerHTML.replace(regex2, (match) => translations[match] ?? match).replace(/Pages\s+:/, "Pages:"); }); var fragment = comment(); var node = first_child(fragment); { var consequent_1 = ($$anchor2) => { var div = root_1$1(); var node_1 = child(div); { var consequent = ($$anchor3) => { var fragment_1 = comment(); var node_2 = first_child(fragment_1); html(node_2, () => get(content)); append($$anchor3, fragment_1); }; if_block(node_1, ($$render) => { if (data.pagination) $$render(consequent); }); } append($$anchor2, div); }; if_block(node, ($$render) => { if (data?.pagination) $$render(consequent_1); }); } append($$anchor, fragment); pop(); } var root_1 = from_html(`<!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!>`, 1); function App($$anchor, $$props) { push($$props, true); let app = prop($$props, "app", 7); let firstPage = state$1(true); if (document.readyState === "loading") { on(document, "DOMContentLoaded", parseDOM, { once: true }); } else { parseDOM(); } function parseDOM() { if (forumDisabled(app())) return; if (Object.keys(data).length === 0) { Object.assign(data, handleData()); store.showSettings = loadShowSettings(); store.options = loadOptions(); store.performerLinks = loadPerformerLinks(); store.resizeWidth = loadResize(); const startParam = new URLSearchParams(location.search).get("start"); set(firstPage, startParam === null || Number(startParam) === 0, true); setTimeout( () => { const selector = "#topic_main div.post-user-message"; const posts = document.querySelectorAll(selector); data.posts = handlePosts(posts); Array.from(document.body.children).forEach((child2) => { if (child2 !== app()) child2.remove(); }); app().style.height = "auto"; }, 0 ); } } user_effect( () => { const darkMode = Boolean(data.theme?.darkmode); document.documentElement.dataset["theme"] = darkMode ? "dark" : "light"; sessionStorage.setItem("dark-mode", darkMode.toString()); } ); var fragment = comment(); var node = first_child(fragment); { var consequent_1 = ($$anchor2) => { var fragment_1 = root_1(); var node_1 = first_child(fragment_1); Events(node_1, {}); var node_2 = sibling(node_1, 2); Header(node_2, {}); var node_3 = sibling(node_2, 2); Settings(node_3, {}); var node_4 = sibling(node_3, 2); Float(node_4, {}); var node_5 = sibling(node_4, 2); Dropdown$1(node_5, {}); var node_6 = sibling(node_5, 2); Title(node_6, {}); var node_7 = sibling(node_6, 2); { var consequent = ($$anchor3) => { Stats($$anchor3, {}); }; var alternate = ($$anchor3) => { Pagination($$anchor3, {}); }; if_block(node_7, ($$render) => { if (get(firstPage)) $$render(consequent); else $$render(alternate, false); }); } var node_8 = sibling(node_7, 2); Tags(node_8, {}); var node_9 = sibling(node_8, 2); FileList(node_9, {}); var node_10 = sibling(node_9, 2); Images(node_10, {}); var node_11 = sibling(node_10, 2); Post(node_11, {}); var node_12 = sibling(node_11, 2); Pagination(node_12, {}); append($$anchor2, fragment_1); }; if_block(node, ($$render) => { if (Object.keys(data).length !== 0) $$render(consequent_1); }); } append($$anchor, fragment); pop(); } const appCss = "html{--border-radius-large: 8px;--border-radius-small: 4px;--tag-color: rgb(255, 255, 255);--content-margin: 1rem;--highlighted: rgb(180 99 0)}html[data-theme=dark]{--main-bg: rgb(18, 18, 18);--post-bg: rgb(40, 40, 40);--post-date-color: rgb(135, 179, 223);--post-border-color: rgb(85, 85, 85);--post-odd-bg: rgb(55, 55, 55);--link-color: rgb(156, 206, 255);--tag-bg: rgb(50 50 50);--search-color: rgb(255, 255, 255);--overlay-bg: rgb(32, 32, 32, .75);--input-bg: rgb(28, 27, 27);--incognito-filter: brightness(0);--button-color: rgb(40, 74, 134);--seed-color: rgb(51, 185, 51);--leech-color: rgb(255, 84, 84)}html[data-theme=light]{--main-bg: rgb(255, 255, 255);--post-bg: rgb(239, 239, 239);--post-date-color: rgb(52, 93, 164);--post-border-color: rgb(202, 202, 202);--post-odd-bg: rgb(227, 227, 227);--link-color: rgb(52, 93, 164);--tag-bg: var(--link-color);--search-color: rgb(0, 0, 0);--overlay-bg: rgba(255, 255, 255, .75);--input-bg: rgb(250, 250, 250);--incognito-filter: brightness(0) invert(1);--button-color: rgb(70, 119, 204);--seed-color: rgb(0, 102, 0);--leech-color: rgb(153, 0, 0)}#ultra{display:flex;flex-direction:column;padding:1.5rem 2.5rem;font-family:system-ui;background-color:var(--main-bg)}#ultra .section{background-color:var(--post-bg);border-radius:var(--border-radius-large);overflow:hidden;border:1px solid var(--post-border-color)}#ultra img{filter:unset}body{min-width:unset!important}"; importCSS(appCss); if (userscriptDisabled()) { if (document.readyState === "loading") { on(document, "DOMContentLoaded", appendUserscriptEnableButton, { once: true }); } else { appendUserscriptEnableButton(); } } else { let mountApp = function() { const app = document.createElement("div"); app.id = "ultra"; app.style.height = "100vh"; document.body.prepend(app); mount(App, { target: app, props: { app } }); }; const cachedTheme = sessionStorage.getItem("dark-mode"); if (cachedTheme !== null) document.documentElement.dataset["theme"] = cachedTheme === "true" ? "dark" : "light"; let CSP = false; if (document.head) { CSP = prependContentSecurityPolicy(); } if (document.body) { mountApp(); const body_container = document.getElementById("body_container"); if (body_container) body_container.style.display = "none"; } else { const targetNode = document.documentElement; const config = { childList: true, subtree: true }; const callback = (mutationList, observer22) => { for (const mutation of mutationList) { if (mutation.type === "childList") { for (const node of mutation.addedNodes) { if (node.nodeName === "HEAD" && !CSP) CSP = prependContentSecurityPolicy(); if (node.nodeName === "BODY") mountApp(); if (node instanceof HTMLElement && node.id === "body_container") { node.style.display = "none"; observer22.disconnect(); } } } } }; const observer2 = new MutationObserver(callback); observer2.observe(targetNode, config); } } })();