@hopeplayer/core 1.3.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +4 -0
  2. package/dist/HopePlayerElement.d.ts +29 -4
  3. package/dist/HopePlayerElement.d.ts.map +1 -1
  4. package/dist/chunks/NativeEme-CXosVcw8.js +80 -0
  5. package/dist/chunks/NativeEme-CXosVcw8.js.map +1 -0
  6. package/dist/chunks/{accessibility-CehDBG3h.js → accessibility-DFx4CE0H.js} +45 -41
  7. package/dist/chunks/accessibility-DFx4CE0H.js.map +1 -0
  8. package/dist/chunks/{ads-BFmyld9u.js → ads-C4tDPsUs.js} +3 -3
  9. package/dist/chunks/ads-C4tDPsUs.js.map +1 -0
  10. package/dist/chunks/analytics-DEjTAJO9.js +281 -0
  11. package/dist/chunks/analytics-DEjTAJO9.js.map +1 -0
  12. package/dist/chunks/{cast-DJXOJLEZ.js → cast-Baxvu76A.js} +2 -2
  13. package/dist/chunks/{cast-DJXOJLEZ.js.map → cast-Baxvu76A.js.map} +1 -1
  14. package/dist/chunks/dash-CWjy-y7B.js +22 -0
  15. package/dist/chunks/dash-CWjy-y7B.js.map +1 -0
  16. package/dist/chunks/{history-YQ9A8HBv.js → history-CvydU0aN.js} +2 -2
  17. package/dist/chunks/{history-YQ9A8HBv.js.map → history-CvydU0aN.js.map} +1 -1
  18. package/dist/chunks/keySystems-CNzjRq6e.js +70 -0
  19. package/dist/chunks/keySystems-CNzjRq6e.js.map +1 -0
  20. package/dist/chunks/{markers-BmcD53SJ.js → markers-Dr4-CCxE.js} +2 -2
  21. package/dist/chunks/{markers-BmcD53SJ.js.map → markers-Dr4-CCxE.js.map} +1 -1
  22. package/dist/chunks/{player-BVkwkn4b.js → player-DV4Hf5Cw.js} +1320 -993
  23. package/dist/chunks/player-DV4Hf5Cw.js.map +1 -0
  24. package/dist/chunks/{playlist-jDbObKz3.js → playlist-DJsdK6xm.js} +29 -21
  25. package/dist/chunks/playlist-DJsdK6xm.js.map +1 -0
  26. package/dist/chunks/pluginHost-GxNfyP5E.js +566 -0
  27. package/dist/chunks/pluginHost-GxNfyP5E.js.map +1 -0
  28. package/dist/chunks/{redirectScreen-CFZKtEdv.js → redirectScreen-BT_26-5g.js} +2 -2
  29. package/dist/chunks/{redirectScreen-CFZKtEdv.js.map → redirectScreen-BT_26-5g.js.map} +1 -1
  30. package/dist/chunks/{rewardedUnlock-Cn4_68a3.js → rewardedUnlock-jFOdzfSq.js} +2 -2
  31. package/dist/chunks/{rewardedUnlock-Cn4_68a3.js.map → rewardedUnlock-jFOdzfSq.js.map} +1 -1
  32. package/dist/chunks/{segments-DXARAkpS.js → segments--hl_QVrI.js} +2 -2
  33. package/dist/chunks/{segments-DXARAkpS.js.map → segments--hl_QVrI.js.map} +1 -1
  34. package/dist/chunks/{skipSegments-U0aUwoDt.js → skipSegments-vJMhdiJn.js} +55 -42
  35. package/dist/chunks/{skipSegments-U0aUwoDt.js.map → skipSegments-vJMhdiJn.js.map} +1 -1
  36. package/dist/chunks/{spriteThumbnails-DLfTFsPU.js → spriteThumbnails-BoxVY--_.js} +76 -53
  37. package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +1 -0
  38. package/dist/chunks/{statsPanel-DSClIwA3.js → statsPanel-D0DtoFgS.js} +2 -2
  39. package/dist/chunks/statsPanel-D0DtoFgS.js.map +1 -0
  40. package/dist/chunks/{story-Ce56rEaN.js → story-BRkhSDhR.js} +2 -2
  41. package/dist/chunks/{story-Ce56rEaN.js.map → story-BRkhSDhR.js.map} +1 -1
  42. package/dist/controls/ControlBar.d.ts +2 -0
  43. package/dist/controls/ControlBar.d.ts.map +1 -1
  44. package/dist/controls/SeekBar.d.ts.map +1 -1
  45. package/dist/controls/SettingsMenu.d.ts +5 -0
  46. package/dist/controls/SettingsMenu.d.ts.map +1 -1
  47. package/dist/drm/NativeEme.d.ts +23 -0
  48. package/dist/drm/NativeEme.d.ts.map +1 -0
  49. package/dist/drm/keySystems.d.ts +18 -0
  50. package/dist/drm/keySystems.d.ts.map +1 -0
  51. package/dist/hls/SourceManager.d.ts +31 -5
  52. package/dist/hls/SourceManager.d.ts.map +1 -1
  53. package/dist/hls/dashEngine.d.ts +85 -0
  54. package/dist/hls/dashEngine.d.ts.map +1 -0
  55. package/dist/hls/sourceGroups.d.ts.map +1 -1
  56. package/dist/hope-player.js +6 -3
  57. package/dist/i18n/locales/en.d.ts.map +1 -1
  58. package/dist/i18n/locales/tr.d.ts.map +1 -1
  59. package/dist/i18n/types.d.ts +3 -0
  60. package/dist/i18n/types.d.ts.map +1 -1
  61. package/dist/index.d.ts +4 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/keyboard/KeyboardController.d.ts +14 -0
  64. package/dist/keyboard/KeyboardController.d.ts.map +1 -1
  65. package/dist/plugin-api/PluginAds.d.ts +61 -0
  66. package/dist/plugin-api/PluginAds.d.ts.map +1 -0
  67. package/dist/plugin-api/PluginHost.d.ts +71 -0
  68. package/dist/plugin-api/PluginHost.d.ts.map +1 -0
  69. package/dist/plugin-api/registry.d.ts +10 -0
  70. package/dist/plugin-api/registry.d.ts.map +1 -0
  71. package/dist/plugin-api/types.d.ts +209 -0
  72. package/dist/plugin-api/types.d.ts.map +1 -0
  73. package/dist/plugins/accessibility/Accessibility.d.ts +5 -0
  74. package/dist/plugins/accessibility/Accessibility.d.ts.map +1 -1
  75. package/dist/plugins/ads/AdsController.d.ts +2 -0
  76. package/dist/plugins/ads/AdsController.d.ts.map +1 -1
  77. package/dist/plugins/analytics/QoeTracker.d.ts +71 -0
  78. package/dist/plugins/analytics/QoeTracker.d.ts.map +1 -0
  79. package/dist/plugins/analytics/index.d.ts +6 -0
  80. package/dist/plugins/analytics/index.d.ts.map +1 -0
  81. package/dist/plugins/playlist/PlaylistRunner.d.ts +2 -0
  82. package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
  83. package/dist/plugins/skip-segments/index.d.ts +2 -0
  84. package/dist/plugins/skip-segments/index.d.ts.map +1 -1
  85. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +8 -0
  86. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
  87. package/dist/screens/ErrorScreen.d.ts +1 -1
  88. package/dist/screens/ErrorScreen.d.ts.map +1 -1
  89. package/dist/types/index.d.ts +159 -4
  90. package/dist/types/index.d.ts.map +1 -1
  91. package/package.json +2 -1
  92. package/dist/chunks/accessibility-CehDBG3h.js.map +0 -1
  93. package/dist/chunks/ads-BFmyld9u.js.map +0 -1
  94. package/dist/chunks/player-BVkwkn4b.js.map +0 -1
  95. package/dist/chunks/playlist-jDbObKz3.js.map +0 -1
  96. package/dist/chunks/spriteThumbnails-DLfTFsPU.js.map +0 -1
  97. package/dist/chunks/statsPanel-DSClIwA3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginHost-GxNfyP5E.js","sources":["../../src/plugin-api/PluginAds.ts","../../src/plugin-api/PluginHost.ts"],"sourcesContent":["// Eklenti reklam API'si: reklam arası, preroll kapısı, midroll noktaları, duraklatma / bitiş kancaları, tag dönüşümü.\nimport type { PluginAdBreak, PluginAdBreakOptions, PluginAdBreakType, PluginCleanup } from './types';\n\nexport interface PluginAdsContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n isAdPlaying(): boolean;\n /** Player'ın reklam kilidi (kontroller gizli, isAdPlaying true). */\n blockAds(): void;\n unblockAds(): void;\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\nconst DEFAULT_BREAK_TIMEOUT_MS = 60_000;\nconst PREROLL_GATE_TIMEOUT_MS = 15_000;\nconst DEFAULT_PAUSE_DELAY_MS = 300;\n/** Reklam arasında engellenen içerik kısayolları. */\nconst BLOCKED_KEYS = new Set([' ', 'k', 'j', 'l', 'ArrowLeft', 'ArrowRight', ',', '.']);\n\ntype Guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void;\n\ninterface Mid {\n owner: string;\n marks: number[];\n fired: Set<number>;\n seekPast: 'last' | 'skip';\n fire: (mark: number) => void;\n}\n\ninterface Active {\n owner: string;\n finish: () => void;\n}\n\nexport class PluginAds {\n private active: Active | null = null;\n private prerolls: Array<{ owner: string; run: () => unknown }> = [];\n private mids: Mid[] = [];\n private pauses: Array<{ owner: string; run: () => unknown; delayMs: number }> = [];\n private endeds: Array<{ owner: string; run: () => void }> = [];\n private transforms: Array<{ owner: string; fn: (url: string, type: PluginAdBreakType) => string }> = [];\n private prerollDone = false;\n private gateRunning = false;\n private contentStarted = false;\n private lastPos = 0;\n private seekPending = false;\n private pauseTimer: ReturnType<typeof setTimeout> | null = null;\n private pauseCleanups: Array<() => void> = [];\n\n constructor(private readonly ctx: PluginAdsContext) {\n const v = ctx.video;\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('play', this.onPlay, true);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('pause', this.onPause);\n // Capture: playlist / yönlendirme dinleyicilerinden önce — postroll arası onlar çalışmadan başlar.\n v.addEventListener('ended', this.onEnded, true);\n ctx.element.addEventListener('keydown', this.onKeyDown, true);\n }\n\n destroy(): void {\n const v = this.ctx.video;\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('play', this.onPlay, true);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded, true);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown, true);\n this.active?.finish();\n this.clearPause();\n }\n\n /** Eklenti kaldırılınca onun kayıtları ve süren arası. */\n removeOwner(owner: string): void {\n this.prerolls = this.prerolls.filter((x) => x.owner !== owner);\n this.mids = this.mids.filter((x) => x.owner !== owner);\n this.pauses = this.pauses.filter((x) => x.owner !== owner);\n this.endeds = this.endeds.filter((x) => x.owner !== owner);\n this.transforms = this.transforms.filter((x) => x.owner !== owner);\n if (this.active?.owner === owner) this.active.finish();\n }\n\n /** IMA isteği öncesi tüm eklentilerin dönüşümleri. */\n transformTag(url: string, type: PluginAdBreakType): string {\n let out = url;\n for (const t of this.transforms) {\n try {\n const next = t.fn(out, type);\n if (typeof next === 'string' && next) out = next;\n } catch (err) {\n this.ctx.log(`Plugin \"${t.owner}\" failed in ads.transformTag: ${(err as Error)?.message ?? err}`, { plugin: t.owner });\n }\n }\n return out;\n }\n\n /** Bir eklentiye verilen `ads` nesnesi. */\n api(owner: string, guard: Guard) {\n const add = <T>(list: T[], item: T): (() => void) => {\n list.push(item);\n return () => {\n const i = list.indexOf(item);\n if (i >= 0) list.splice(i, 1);\n };\n };\n return {\n requestBreak: (run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions) => this.requestBreak(owner, run, options),\n beforeContent: (run: () => unknown) => add(this.prerolls, { owner, run }),\n atTime: (seconds: number | number[], run: (s: number) => unknown, options?: { seekPast?: 'last' | 'skip' }) => {\n const marks = (Array.isArray(seconds) ? seconds : [seconds]).filter((s) => Number.isFinite(s) && s >= 0).sort((a, b) => a - b);\n const fire = guard((m: number) => run(m), 'ads.atTime');\n return add(this.mids, { owner, marks, fired: new Set<number>(), seekPast: options?.seekPast ?? 'last', fire });\n },\n onPause: (run: () => void | PluginCleanup, options?: { delayMs?: number }) =>\n add(this.pauses, { owner, run: () => run(), delayMs: options?.delayMs ?? DEFAULT_PAUSE_DELAY_MS }),\n onEnded: (run: () => unknown) => add(this.endeds, { owner, run: guard(() => run(), 'ads.onEnded') }),\n transformTag: (fn: (url: string, type: PluginAdBreakType) => string) => add(this.transforms, { owner, fn }),\n };\n }\n\n // ── Reklam arası ──\n\n private requestBreak(owner: string, run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions): Promise<boolean> {\n if (this.active || this.ctx.isAdPlaying()) return Promise.resolve(false);\n const v = this.ctx.video;\n const type: PluginAdBreakType = options?.type ?? (v.ended ? 'postroll' : !this.contentStarted ? 'preroll' : 'midroll');\n const wasPlaying = !v.paused && !v.ended;\n if (!v.paused) v.pause();\n this.ctx.blockAds();\n\n const layer = document.createElement('div');\n layer.className = 'hp-plugin-layer hp-plugin-ad';\n layer.setAttribute('part', `plugin-ad plugin-${owner}`);\n layer.dataset.plugin = owner;\n layer.dataset.position = 'fill';\n layer.toggleAttribute('data-above', true);\n layer.toggleAttribute('data-interactive', true);\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) layer.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.videoArea.appendChild(layer);\n\n const ctrl = new AbortController();\n this.emit('hp:adstart', type, owner);\n\n return new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n ctrl.abort();\n layer.remove();\n this.active = null;\n this.ctx.unblockAds();\n this.emit('hp:adend', type, owner);\n if (wasPlaying && type !== 'postroll') void v.play().catch(() => {});\n resolve(true);\n };\n const timer = setTimeout(() => {\n this.ctx.log(`Plugin \"${owner}\" ad break timed out`, { plugin: owner, type });\n finish();\n }, options?.timeoutMs ?? DEFAULT_BREAK_TIMEOUT_MS);\n this.active = { owner, finish };\n const fail = (err: unknown): void => {\n this.ctx.log(`Plugin \"${owner}\" failed in ads.requestBreak: ${(err as Error)?.message ?? err}`, { plugin: owner, type });\n finish();\n };\n try {\n Promise.resolve(run({ type, layer, signal: ctrl.signal, end: finish })).then(finish, fail);\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private emit(name: 'hp:adstart' | 'hp:adend', type: PluginAdBreakType, plugin: string): void {\n this.ctx.element.dispatchEvent(new CustomEvent(name, { detail: { type, linear: true, plugin } }));\n }\n\n // ── Olaylar ──\n\n private readonly onLoadStart = (): void => {\n this.prerollDone = false;\n this.contentStarted = false;\n this.lastPos = 0;\n for (const m of this.mids) m.fired.clear();\n this.clearPause();\n };\n\n private readonly onPlay = (): void => {\n const v = this.ctx.video;\n // Reklam arasında / preroll beklenirken içerik oynamaz.\n if (this.active || this.gateRunning) {\n v.pause();\n return;\n }\n this.clearPause();\n if (this.prerollDone || !this.prerolls.length || this.ctx.isAdPlaying()) return;\n this.prerollDone = true;\n v.pause();\n void this.runPrerolls();\n };\n\n private async runPrerolls(): Promise<void> {\n this.gateRunning = true;\n const all = Promise.all(\n this.prerolls.map((p) =>\n Promise.resolve()\n .then(() => p.run())\n .catch((err) => this.ctx.log(`Plugin \"${p.owner}\" failed in ads.beforeContent: ${(err as Error)?.message ?? err}`, { plugin: p.owner }))\n )\n );\n await Promise.race([all, new Promise((r) => setTimeout(r, PREROLL_GATE_TIMEOUT_MS))]);\n // Süren bir ara varsa onun bitmesini bekle.\n while (this.active) await new Promise((r) => setTimeout(r, 100));\n this.gateRunning = false;\n void this.ctx.video.play().catch(() => {});\n }\n\n private readonly onPlaying = (): void => {\n if (!this.active && !this.ctx.isAdPlaying()) this.contentStarted = true;\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.video;\n const pos = v.currentTime;\n const prev = this.lastPos;\n this.lastPos = pos;\n const seeked = this.seekPending;\n this.seekPending = false;\n if (this.active || this.ctx.isAdPlaying() || v.paused || v.seeking || pos <= prev) return;\n for (const m of this.mids) {\n const crossed = m.marks.filter((s) => prev < s && s <= pos && !m.fired.has(s));\n if (!crossed.length) continue;\n for (const s of crossed) m.fired.add(s);\n // İleri sarınca geçilen noktalardan yalnızca sonuncusu (ya da hiçbiri).\n if (seeked && m.seekPast === 'skip') continue;\n m.fire(crossed[crossed.length - 1]!);\n }\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.video;\n if (!this.pauses.length || v.ended || v.seeking || this.active || this.gateRunning || this.ctx.isAdPlaying()) return;\n this.clearPause();\n const delay = Math.min(...this.pauses.map((p) => p.delayMs));\n this.pauseTimer = setTimeout(() => {\n this.pauseTimer = null;\n if (!v.paused || v.ended || this.active || this.ctx.isAdPlaying()) return;\n for (const p of this.pauses) {\n try {\n const cleanup = p.run();\n if (typeof cleanup === 'function') this.pauseCleanups.push(cleanup as () => void);\n } catch (err) {\n this.ctx.log(`Plugin \"${p.owner}\" failed in ads.onPause: ${(err as Error)?.message ?? err}`, { plugin: p.owner });\n }\n }\n }, delay);\n };\n\n private clearPause(): void {\n if (this.pauseTimer) clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n for (const c of this.pauseCleanups.splice(0)) {\n try {\n c();\n } catch {\n /* yok say */\n }\n }\n }\n\n private readonly onEnded = (): void => {\n this.clearPause();\n for (const e of this.endeds) e.run();\n };\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if ((this.active || this.gateRunning) && BLOCKED_KEYS.has(e.key)) e.preventDefault();\n };\n}\n","// Eklentileri kurar / kaldırır; eklenenleri izler ve temizler, hataları yakalar.\nimport { createIcon } from '../icons/Icon';\nimport { PluginAds } from './PluginAds';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../controls/SettingsMenu';\nimport {\n PLUGIN_API_VERSION,\n type HopePlugin,\n type PlayerApi,\n type PluginButtonHandle,\n type PluginButtonOptions,\n type PluginCleanup,\n type PluginEntry,\n type PluginLabel,\n type PluginLayerHandle,\n type PluginLayerOptions,\n type PluginLoader,\n type PluginSettingsHandle,\n} from './types';\n\n/** Player → PluginHost bağlamı (eklentiler görmez). */\nexport interface PluginHostContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n /** Alt katmanlar bunun önüne eklenir. */\n chromeEl: HTMLElement;\n labels: Readonly<Record<string, unknown>>;\n locale(): string;\n currentSrc(): string | null;\n isAdPlaying(): boolean;\n /** Reklam kilidi (`blockChrome('ads')`). */\n blockAds(): void;\n unblockAds(): void;\n isFullscreen(): boolean;\n addControlButton(button: HTMLButtonElement, position: 'left' | 'right'): void;\n settings: {\n registerToggle(row: { key: string; label: string; getValueLabel(): string; onToggle(): void }): void;\n unregisterToggle(key: string): void;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n };\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\ninterface Instance {\n plugin: HopePlugin<any>;\n optionsKey: string;\n api: PlayerApi;\n disposers: Array<() => void>;\n /** Dil değişince yeniden çizilecekler. */\n relabel: Array<() => void>;\n localeHandlers: Array<(locale: string) => void>;\n cleanup: PluginCleanup | null;\n removed: boolean;\n}\n\n/** `Shift+W` gibi kısayol. */\ninterface KeySpec {\n key: string;\n shift: boolean | null;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n}\n\nexport interface PluginShortcut {\n keys: string[];\n description: string;\n}\n\nconst resolve = (label: PluginLabel): string => (typeof label === 'function' ? label() : label);\n\nfunction parseKey(spec: string): KeySpec {\n const parts = spec.split('+');\n // \"Shift++\" gibi: son parça boşsa tuş \"+\".\n const key = (parts.pop() || '+').toLowerCase();\n const mods = parts.map((p) => p.toLowerCase());\n const letter = /^[a-z]$/.test(key);\n return { key, shift: mods.includes('shift') ? true : letter ? false : null, alt: mods.includes('alt'), ctrl: mods.includes('ctrl') || mods.includes('control'), meta: mods.includes('meta') || mods.includes('cmd') };\n}\n\nfunction matches(spec: KeySpec, e: KeyboardEvent): boolean {\n return (\n e.key.toLowerCase() === spec.key &&\n e.altKey === spec.alt &&\n e.ctrlKey === spec.ctrl &&\n e.metaKey === spec.meta &&\n (spec.shift === null || e.shiftKey === spec.shift)\n );\n}\n\nexport class PluginHost {\n private readonly instances = new Map<string, Instance>();\n private readonly shortcutList: Array<{ owner: string; spec: KeySpec; label: string; description: PluginLabel | undefined; handler: (e: KeyboardEvent) => void }> = [];\n private syncSeq = 0;\n private toastEl: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n /** Ayar satırı anahtarları. */\n private keySeq = 0;\n private readonly ads: PluginAds;\n\n constructor(private readonly ctx: PluginHostContext) {\n ctx.element.addEventListener('keydown', this.onKeyDown);\n this.ads = new PluginAds(ctx);\n }\n\n /** IMA tag'i eklenti dönüşümlerinden geçirir. */\n transformAdTag(url: string, type: 'preroll' | 'midroll' | 'postroll'): string {\n return this.ads.transformTag(url, type);\n }\n\n /** Listeye eşitler: kurar, kaldırır, günceller (aynı adlıda sonraki kazanır). */\n async sync(builtin: PluginEntry[], user: PluginEntry[]): Promise<void> {\n const seq = ++this.syncSeq;\n const resolved = await Promise.all([...builtin, ...user].map((e) => this.resolveEntry(e)));\n if (seq !== this.syncSeq) return; // daha yenisi başladı\n const wanted = new Map<string, { plugin: HopePlugin<any>; options: unknown }>();\n for (const r of resolved) if (r) wanted.set(r.plugin.name, r);\n\n for (const [name, inst] of this.instances) if (!wanted.has(name)) this.dispose(name, inst);\n for (const [name, { plugin, options }] of wanted) {\n const key = optionsKey(options);\n const inst = this.instances.get(name);\n if (inst && inst.plugin === plugin) {\n if (inst.optionsKey === key) continue;\n if (plugin.update) {\n inst.optionsKey = key;\n this.guard(name, () => plugin.update!(options))();\n continue;\n }\n }\n if (inst) this.dispose(name, inst);\n await this.install(plugin, options, key);\n }\n }\n\n /** Dil değişince. */\n refreshLabels(): void {\n for (const [name, inst] of this.instances) {\n for (const fn of inst.relabel) this.guard(name, fn)();\n for (const fn of inst.localeHandlers) this.guard(name, () => fn(this.ctx.locale()))();\n }\n }\n\n /** `?` listesi için. */\n shortcuts(): PluginShortcut[] {\n return this.shortcutList.filter((s) => s.description !== undefined).map((s) => ({ keys: [s.label], description: resolve(s.description!) }));\n }\n\n has(name: string): boolean {\n return this.instances.has(name);\n }\n\n destroy(): void {\n ++this.syncSeq;\n for (const [name, inst] of this.instances) this.dispose(name, inst);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown);\n this.ads.destroy();\n this.toastEl?.remove();\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n // ── Kurulum ──\n\n private async resolveEntry(entry: PluginEntry): Promise<{ plugin: HopePlugin<any>; options: unknown } | null> {\n const [target, options] = Array.isArray(entry) ? entry : [entry, undefined];\n try {\n if (typeof target === 'function') {\n const mod = await (target as PluginLoader)();\n const plugin = 'setup' in mod ? mod : 'default' in mod ? mod.default : mod.plugin;\n return plugin && typeof plugin.setup === 'function' ? { plugin, options } : null;\n }\n return target && typeof target.setup === 'function' && typeof target.name === 'string' ? { plugin: target, options } : null;\n } catch (err) {\n this.ctx.log(`Plugin could not be loaded: ${(err as Error)?.message ?? err}`, { plugin: typeof target === 'function' ? 'loader' : String((target as HopePlugin)?.name) });\n return null;\n }\n }\n\n private async install(plugin: HopePlugin<any>, options: unknown, key: string): Promise<void> {\n const name = plugin.name;\n if (plugin.apiVersion && plugin.apiVersion > PLUGIN_API_VERSION) {\n this.ctx.log(`Plugin \"${name}\" was written for plugin API v${plugin.apiVersion}; this player has v${PLUGIN_API_VERSION}`, { plugin: name });\n }\n const inst: Instance = { plugin, optionsKey: key, api: null as unknown as PlayerApi, disposers: [], relabel: [], localeHandlers: [], cleanup: null, removed: false };\n inst.api = this.createApi(inst);\n this.instances.set(name, inst);\n try {\n const result = await plugin.setup(inst.api, options);\n if (inst.removed) {\n if (typeof result === 'function') this.guard(name, result)();\n return;\n }\n if (typeof result === 'function') inst.cleanup = result;\n } catch (err) {\n this.report(name, err, 'setup');\n this.dispose(name, inst);\n }\n }\n\n private dispose(name: string, inst: Instance): void {\n if (inst.removed) return;\n inst.removed = true;\n if (this.instances.get(name) === inst) this.instances.delete(name);\n if (inst.cleanup) this.guard(name, inst.cleanup)();\n // Ters sırada kaldır.\n for (const d of inst.disposers.reverse()) {\n try {\n d();\n } catch {\n /* yok say */\n }\n }\n inst.disposers = [];\n this.ads.removeOwner(name);\n for (let i = this.shortcutList.length - 1; i >= 0; i--) if (this.shortcutList[i]!.owner === name) this.shortcutList.splice(i, 1);\n }\n\n private report(name: string, err: unknown, where: string): void {\n const message = (err as Error)?.message ?? String(err);\n this.ctx.log(`Plugin \"${name}\" failed in ${where}: ${message}`, { plugin: name });\n console.error(`[hope-player] plugin \"${name}\" (${where}):`, err);\n }\n\n /** Eklenti kodu hep bundan çağrılır; hata player'a geçmez. */\n private guard<A extends unknown[]>(name: string, fn: (...args: A) => unknown, where = 'handler'): (...args: A) => void {\n return (...args: A) => {\n try {\n const r = fn(...args);\n if (r instanceof Promise) r.catch((err) => this.report(name, err, where));\n } catch (err) {\n this.report(name, err, where);\n }\n };\n }\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n // Player'ın kendi tuşları önce; işlendiyse karışma.\n if (e.defaultPrevented) return;\n const target = e.composedPath()[0];\n if (target instanceof HTMLElement && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName))) return;\n for (const s of this.shortcutList) {\n if (matches(s.spec, e)) {\n e.preventDefault();\n s.handler(e);\n return;\n }\n }\n };\n\n // ── PlayerApi ──\n\n private createApi(inst: Instance): PlayerApi {\n const ctx = this.ctx;\n const name = inst.plugin.name;\n const track = (dispose: () => void): void => {\n if (inst.removed) dispose();\n else inst.disposers.push(dispose);\n };\n const guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => this.guard(name, fn, where);\n const strings: Record<string, Record<string, string>> = {};\n const host = this;\n\n const on = (event: string, handler: (event: Event) => void, once = false): (() => void) => {\n // `x:y` olayları elementte, diğerleri videoda.\n const target: EventTarget = event.includes(':') ? ctx.element : ctx.video;\n const wrapped = guard((ev: Event) => {\n if (once) off();\n handler(ev);\n }, `on(${event})`);\n target.addEventListener(event, wrapped);\n let done = false;\n const off = (): void => {\n if (done) return;\n done = true;\n target.removeEventListener(event, wrapped);\n };\n track(off);\n return off;\n };\n\n const api: PlayerApi = {\n plugin: name,\n apiVersion: PLUGIN_API_VERSION,\n element: ctx.element,\n video: ctx.video,\n get locale() {\n return ctx.locale();\n },\n labels: ctx.labels,\n get currentTime() {\n return ctx.video.currentTime;\n },\n get duration() {\n return ctx.video.duration;\n },\n get paused() {\n return ctx.video.paused;\n },\n get isLive() {\n return ctx.video.duration === Infinity;\n },\n get isAdPlaying() {\n return ctx.isAdPlaying();\n },\n get isFullscreen() {\n return ctx.isFullscreen();\n },\n get src() {\n return ctx.currentSrc();\n },\n play: () => ctx.video.play(),\n pause: () => ctx.video.pause(),\n seek: (time: number) => {\n if (Number.isFinite(time)) ctx.video.currentTime = Math.max(0, time);\n },\n on: (event, handler) => on(event, handler),\n once: (event, handler) => on(event, handler, true),\n emit: (event, detail) => {\n ctx.element.dispatchEvent(new CustomEvent(`${name}:${event}`, { detail, bubbles: true, composed: true }));\n },\n onSourceChange: (handler) => on('loadstart', () => handler(ctx.currentSrc())),\n onLocaleChange: (handler) => {\n inst.localeHandlers.push(handler);\n const off = (): void => {\n const i = inst.localeHandlers.indexOf(handler);\n if (i >= 0) inst.localeHandlers.splice(i, 1);\n };\n track(off);\n return off;\n },\n onDestroy: (handler) => track(guard(handler, 'onDestroy')),\n setTimeout: (handler, ms) => {\n const id = window.setTimeout(guard(handler, 'setTimeout'), ms);\n track(() => clearTimeout(id));\n return id;\n },\n setInterval: (handler, ms) => {\n const id = window.setInterval(guard(handler, 'setInterval'), ms);\n track(() => clearInterval(id));\n return id;\n },\n ui: {\n addButton: (o) => host.addButton(inst, o, track, guard),\n addLayer: (o) => host.addLayer(inst, o ?? {}, track),\n toast: (message, o) => host.toast(message, o?.durationMs),\n },\n settings: {\n addToggle: (o) => {\n const key = `plugin:${name}:toggle:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerToggle({\n key,\n label: resolve(o.label),\n getValueLabel: () => (o.get() ? onOff(ctx.labels, true) : onOff(ctx.labels, false)),\n onToggle: guard(() => o.set(!o.get()), 'settings.toggle'),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterToggle(key));\n return settingsHandle(register, () => ctx.settings.unregisterToggle(key));\n },\n addSelect: (o) => {\n const key = `plugin:${name}:select:${++host.keySeq}`;\n const list = () => (typeof o.options === 'function' ? o.options() : o.options);\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => {\n const current = list().find((x) => x.value === o.get());\n return current ? resolve(current.label) : '';\n },\n getItems: () => list().map((x) => ({ label: resolve(x.label), active: x.value === o.get(), onSelect: guard(() => o.set(x.value), 'settings.select') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n addSubmenu: (o) => {\n const key = `plugin:${name}:submenu:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => (o.value ? o.value() : ''),\n getItems: (): SettingsSubmenuItem[] =>\n o.items().map((x) => ({ label: resolve(x.label), active: !!x.active, onSelect: guard(() => x.onSelect(), 'settings.submenu') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n },\n keys: {\n add: (key, handler, description) => {\n const entry = { owner: name, spec: parseKey(key), label: key, description, handler: guard(handler, `keys(${key})`) };\n host.shortcutList.push(entry);\n const off = (): void => {\n const i = host.shortcutList.indexOf(entry);\n if (i >= 0) host.shortcutList.splice(i, 1);\n };\n track(off);\n return off;\n },\n },\n i18n: {\n add: (more) => {\n for (const [locale, values] of Object.entries(more)) strings[locale] = { ...strings[locale], ...values };\n },\n t: (key, fallback) => strings[ctx.locale()]?.[key] ?? strings.en?.[key] ?? fallback ?? key,\n },\n storage: {\n get: <T>(key: string, fallback?: T): T | undefined => {\n try {\n const raw = localStorage.getItem(storageKey(name, key));\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set: (key, value) => {\n try {\n localStorage.setItem(storageKey(name, key), JSON.stringify(value));\n } catch {\n /* yok say */\n }\n },\n remove: (key) => {\n try {\n localStorage.removeItem(storageKey(name, key));\n } catch {\n /* yok say */\n }\n },\n },\n ads: (() => {\n const raw = host.ads.api(name, guard);\n // Dönen kaldırıcılar eklenti kaldırılınca da çağrılır.\n const tracked = <F extends (...a: any[]) => () => void>(fn: F) =>\n ((...a: Parameters<F>) => {\n const off = fn(...a);\n track(off);\n return off;\n }) as F;\n return {\n requestBreak: raw.requestBreak,\n beforeContent: tracked(raw.beforeContent),\n atTime: tracked(raw.atTime),\n onPause: tracked(raw.onPause),\n onEnded: tracked(raw.onEnded),\n transformTag: tracked(raw.transformTag),\n };\n })(),\n log: (message, details) => ctx.log(message, { plugin: name, ...details }),\n };\n return api;\n }\n\n private addButton(\n inst: Instance,\n o: PluginButtonOptions,\n track: (d: () => void) => void,\n guard: <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void\n ): PluginButtonHandle {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-plugin-btn hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer hp:shrink-0';\n btn.setAttribute('part', `plugin-button plugin-${inst.plugin.name}`);\n btn.dataset.plugin = inst.plugin.name;\n let label: PluginLabel = o.label;\n let active = !!o.active;\n const setIcon = (icon: string): void => {\n btn.textContent = '';\n if (icon.trim().startsWith('<')) {\n btn.insertAdjacentHTML('beforeend', icon);\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n } else btn.appendChild(createIcon(icon, 'hp:text-[length:var(--hp-ctrl-icon-size)]'));\n };\n const applyLabel = (): void => btn.setAttribute('aria-label', resolve(label));\n const applyActive = (): void => {\n if (o.active !== undefined) btn.setAttribute('aria-pressed', String(active));\n };\n setIcon(o.icon);\n applyLabel();\n applyActive();\n inst.relabel.push(applyLabel);\n const handle: PluginButtonHandle = {\n el: btn,\n get active() {\n return active;\n },\n setLabel: (l) => {\n label = l;\n applyLabel();\n },\n setIcon,\n setActive: (a) => {\n active = a;\n btn.setAttribute('aria-pressed', String(a));\n },\n show: () => {\n btn.style.display = '';\n },\n hide: () => {\n btn.style.display = 'none';\n },\n remove: () => btn.remove(),\n };\n if (o.onClick) {\n const click = guard((e: MouseEvent) => o.onClick!(e, handle), 'button.onClick');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n click(e);\n });\n }\n this.ctx.addControlButton(btn, o.position ?? 'right');\n track(() => btn.remove());\n return handle;\n }\n\n private addLayer(inst: Instance, o: PluginLayerOptions, track: (d: () => void) => void): PluginLayerHandle {\n const el = document.createElement('div');\n el.className = 'hp-plugin-layer';\n el.setAttribute('part', `plugin-layer plugin-${inst.plugin.name}`);\n el.dataset.plugin = inst.plugin.name;\n el.dataset.position = o.position ?? 'fill';\n el.toggleAttribute('data-autohide', !!o.autoHide);\n el.toggleAttribute('data-interactive', !!o.interactive);\n el.toggleAttribute('data-above', !!o.above);\n let visible = o.visible !== false;\n el.hidden = !visible;\n\n if (o.above) this.ctx.videoArea.appendChild(el);\n else this.ctx.videoArea.insertBefore(el, this.ctx.chromeEl);\n // Stil katmanın dışında: `el.innerHTML` silmesin.\n let style: HTMLStyleElement | null = null;\n if (o.css) {\n style = document.createElement('style');\n style.textContent = o.css;\n el.before(style);\n }\n const removeAll = (): void => {\n el.remove();\n style?.remove();\n };\n if (o.interactive) {\n // Tıklama videoya geçmesin.\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n }\n track(removeAll);\n const set = (v: boolean): void => {\n visible = v;\n el.hidden = !v;\n };\n return {\n el,\n get visible() {\n return visible;\n },\n show: () => set(true),\n hide: () => set(false),\n toggle: (force) => set(force ?? !visible),\n remove: removeAll,\n };\n }\n\n private toast(message: string, durationMs = 2500): void {\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = 'hp-plugin-toast';\n this.toastEl.setAttribute('part', 'plugin-toast');\n this.toastEl.setAttribute('role', 'status');\n this.toastEl.setAttribute('aria-live', 'polite');\n this.ctx.videoArea.appendChild(this.toastEl);\n }\n this.toastEl.textContent = message;\n this.toastEl.setAttribute('data-visible', '');\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => this.toastEl?.removeAttribute('data-visible'), Math.max(500, durationMs));\n }\n}\n\nfunction settingsHandle(register: () => void, remove: () => void): PluginSettingsHandle {\n return { refresh: register, remove };\n}\n\nfunction onOff(labels: Readonly<Record<string, unknown>>, on: boolean): string {\n const value = on ? labels.a11yOn : labels.a11yOff;\n return typeof value === 'string' ? value : on ? 'On' : 'Off';\n}\n\nfunction storageKey(plugin: string, key: string): string {\n return `hp-plugin:${plugin}:${key}`;\n}\n\n/** Seçenek karşılaştırma anahtarı. */\nfunction optionsKey(options: unknown): string {\n try {\n return JSON.stringify(options ?? null, (_k, v: unknown) => (typeof v === 'function' ? `fn:${(v as { name?: string }).name ?? ''}` : v));\n } catch {\n return String(Math.random());\n }\n}\n\nexport { PLUGIN_API_VERSION };\nexport type { PluginShortcut as Shortcut };\n"],"names":["DEFAULT_BREAK_TIMEOUT_MS","PREROLL_GATE_TIMEOUT_MS","DEFAULT_PAUSE_DELAY_MS","BLOCKED_KEYS","PluginAds","ctx","__publicField","m","v","pos","prev","seeked","crossed","s","delay","p","cleanup","err","_a","owner","x","url","type","out","t","next","guard","add","list","item","i","run","options","seconds","marks","a","b","fire","fn","wasPlaying","layer","ev","e","ctrl","resolve","done","finish","timer","fail","name","plugin","all","r","c","label","parseKey","spec","parts","key","mods","letter","matches","PluginHost","target","builtin","user","seq","resolved","wanted","inst","optionsKey","entry","mod","PLUGIN_API_VERSION","result","d","where","message","args","track","dispose","strings","host","on","event","handler","once","wrapped","off","time","detail","ms","id","o","register","onOff","settingsHandle","current","description","more","locale","values","fallback","_b","raw","storageKey","value","tracked","details","btn","active","setIcon","icon","createIcon","applyLabel","applyActive","handle","click","el","visible","style","removeAll","set","force","durationMs","remove","labels","_k"],"mappings":";;;;AAcA,MAAMA,IAA2B,KAC3BC,IAA0B,MAC1BC,IAAyB,KAEzBC,IAAe,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,aAAa,cAAc,KAAK,GAAG,CAAC;AAiB/E,MAAMC,EAAU;AAAA,EAenB,YAA6BC,GAAuB;AAd5C,IAAAC,EAAA,gBAAwB;AACxB,IAAAA,EAAA,kBAAyD,CAAA;AACzD,IAAAA,EAAA,cAAc,CAAA;AACd,IAAAA,EAAA,gBAAwE,CAAA;AACxE,IAAAA,EAAA,gBAAoD,CAAA;AACpD,IAAAA,EAAA,oBAA6F,CAAA;AAC7F,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,oBAAmD;AACnD,IAAAA,EAAA,uBAAmC,CAAA;AAyI1B;AAAA,IAAAA,EAAA,qBAAc,MAAY;AACvC,WAAK,cAAc,IACnB,KAAK,iBAAiB,IACtB,KAAK,UAAU;AACf,iBAAWC,KAAK,KAAK,KAAM,CAAAA,EAAE,MAAM,MAAA;AACnC,WAAK,WAAA;AAAA,IACT;AAEiB,IAAAD,EAAA,gBAAS,MAAY;AAClC,YAAME,IAAI,KAAK,IAAI;AAEnB,UAAI,KAAK,UAAU,KAAK,aAAa;AACjC,QAAAA,EAAE,MAAA;AACF;AAAA,MACJ;AAEA,MADA,KAAK,WAAA,GACD,OAAK,eAAe,CAAC,KAAK,SAAS,UAAU,KAAK,IAAI,mBAC1D,KAAK,cAAc,IACnBA,EAAE,MAAA,GACG,KAAK,YAAA;AAAA,IACd;AAkBiB,IAAAF,EAAA,mBAAY,MAAY;AACrC,MAAI,CAAC,KAAK,UAAU,CAAC,KAAK,IAAI,YAAA,MAAe,KAAK,iBAAiB;AAAA,IACvE;AAEiB,IAAAA,EAAA,mBAAY,MAAY;AACrC,WAAK,cAAc;AAAA,IACvB;AAEiB,IAAAA,EAAA,sBAAe,MAAY;AACxC,YAAME,IAAI,KAAK,IAAI,OACbC,IAAMD,EAAE,aACRE,IAAO,KAAK;AAClB,WAAK,UAAUD;AACf,YAAME,IAAS,KAAK;AAEpB,UADA,KAAK,cAAc,IACf,OAAK,UAAU,KAAK,IAAI,YAAA,KAAiBH,EAAE,UAAUA,EAAE,WAAWC,KAAOC;AAC7E,mBAAWH,KAAK,KAAK,MAAM;AACvB,gBAAMK,IAAUL,EAAE,MAAM,OAAO,CAACM,MAAMH,IAAOG,KAAKA,KAAKJ,KAAO,CAACF,EAAE,MAAM,IAAIM,CAAC,CAAC;AAC7E,cAAKD,EAAQ,QACb;AAAA,uBAAWC,KAAKD,EAAS,CAAAL,EAAE,MAAM,IAAIM,CAAC;AAEtC,YAAIF,KAAUJ,EAAE,aAAa,UAC7BA,EAAE,KAAKK,EAAQA,EAAQ,SAAS,CAAC,CAAE;AAAA;AAAA,QACvC;AAAA,IACJ;AAEiB,IAAAN,EAAA,iBAAU,MAAY;AACnC,YAAME,IAAI,KAAK,IAAI;AACnB,UAAI,CAAC,KAAK,OAAO,UAAUA,EAAE,SAASA,EAAE,WAAW,KAAK,UAAU,KAAK,eAAe,KAAK,IAAI,cAAe;AAC9G,WAAK,WAAA;AACL,YAAMM,IAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,CAACC,MAAMA,EAAE,OAAO,CAAC;AAC3D,WAAK,aAAa,WAAW,MAAM;AAE/B,YADA,KAAK,aAAa,MACd,GAACP,EAAE,UAAUA,EAAE,SAAS,KAAK,UAAU,KAAK,IAAI;AACpD,qBAAWO,KAAK,KAAK;AACjB,gBAAI;AACA,oBAAMC,IAAUD,EAAE,IAAA;AAClB,cAAI,OAAOC,KAAY,cAAY,KAAK,cAAc,KAAKA,CAAqB;AAAA,YACpF,SAASC,GAAK;AACV,mBAAK,IAAI,IAAI,WAAWF,EAAE,KAAK,6BAA6BE,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQF,EAAE,OAAO;AAAA,YACpH;AAAA,MAER,GAAGD,CAAK;AAAA,IACZ;AAciB,IAAAR,EAAA,iBAAU,MAAY;AACnC,WAAK,WAAA;AACL,iBAAW,KAAK,KAAK,OAAQ,GAAE,IAAA;AAAA,IACnC;AAEiB,IAAAA,EAAA,mBAAY,CAAC,MAA2B;AACrD,OAAK,KAAK,UAAU,KAAK,gBAAgBH,EAAa,IAAI,EAAE,GAAG,KAAG,EAAE,eAAA;AAAA,IACxE;AA7O6B,SAAA,MAAAE;AACzB,UAAMG,IAAIH,EAAI;AACd,IAAAG,EAAE,iBAAiB,aAAa,KAAK,WAAW,GAChDA,EAAE,iBAAiB,QAAQ,KAAK,QAAQ,EAAI,GAC5CA,EAAE,iBAAiB,WAAW,KAAK,SAAS,GAC5CA,EAAE,iBAAiB,cAAc,KAAK,YAAY,GAClDA,EAAE,iBAAiB,WAAW,KAAK,SAAS,GAC5CA,EAAE,iBAAiB,SAAS,KAAK,OAAO,GAExCA,EAAE,iBAAiB,SAAS,KAAK,SAAS,EAAI,GAC9CH,EAAI,QAAQ,iBAAiB,WAAW,KAAK,WAAW,EAAI;AAAA,EAChE;AAAA,EAEA,UAAgB;;AACZ,UAAMG,IAAI,KAAK,IAAI;AACnB,IAAAA,EAAE,oBAAoB,aAAa,KAAK,WAAW,GACnDA,EAAE,oBAAoB,QAAQ,KAAK,QAAQ,EAAI,GAC/CA,EAAE,oBAAoB,WAAW,KAAK,SAAS,GAC/CA,EAAE,oBAAoB,cAAc,KAAK,YAAY,GACrDA,EAAE,oBAAoB,WAAW,KAAK,SAAS,GAC/CA,EAAE,oBAAoB,SAAS,KAAK,OAAO,GAC3CA,EAAE,oBAAoB,SAAS,KAAK,SAAS,EAAI,GACjD,KAAK,IAAI,QAAQ,oBAAoB,WAAW,KAAK,WAAW,EAAI,IACpEU,IAAA,KAAK,WAAL,QAAAA,EAAa,UACb,KAAK,WAAA;AAAA,EACT;AAAA;AAAA,EAGA,YAAYC,GAAqB;;AAC7B,SAAK,WAAW,KAAK,SAAS,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GAC7D,KAAK,OAAO,KAAK,KAAK,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GACrD,KAAK,SAAS,KAAK,OAAO,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GACzD,KAAK,SAAS,KAAK,OAAO,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GACzD,KAAK,aAAa,KAAK,WAAW,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,KAC7DD,IAAA,KAAK,WAAL,gBAAAA,EAAa,WAAUC,KAAO,KAAK,OAAO,OAAA;AAAA,EAClD;AAAA;AAAA,EAGA,aAAaE,GAAaC,GAAiC;AACvD,QAAIC,IAAMF;AACV,eAAWG,KAAK,KAAK;AACjB,UAAI;AACA,cAAMC,IAAOD,EAAE,GAAGD,GAAKD,CAAI;AAC3B,QAAI,OAAOG,KAAS,YAAYA,MAAMF,IAAME;AAAA,MAChD,SAASR,GAAK;AACV,aAAK,IAAI,IAAI,WAAWO,EAAE,KAAK,kCAAkCP,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQO,EAAE,OAAO;AAAA,MACzH;AAEJ,WAAOD;AAAA,EACX;AAAA;AAAA,EAGA,IAAIJ,GAAeO,GAAc;AAC7B,UAAMC,IAAM,CAAIC,GAAWC,OACvBD,EAAK,KAAKC,CAAI,GACP,MAAM;AACT,YAAMC,IAAIF,EAAK,QAAQC,CAAI;AAC3B,MAAIC,KAAK,KAAGF,EAAK,OAAOE,GAAG,CAAC;AAAA,IAChC;AAEJ,WAAO;AAAA,MACH,cAAc,CAACC,GAAkDC,MAAmC,KAAK,aAAab,GAAOY,GAAKC,CAAO;AAAA,MACzI,eAAe,CAACD,MAAuBJ,EAAI,KAAK,UAAU,EAAE,OAAAR,GAAO,KAAAY,GAAK;AAAA,MACxE,QAAQ,CAACE,GAA4BF,GAA6BC,MAA6C;AAC3G,cAAME,KAAS,MAAM,QAAQD,CAAO,IAAIA,IAAU,CAACA,CAAO,GAAG,OAAO,CAACpB,MAAM,OAAO,SAASA,CAAC,KAAKA,KAAK,CAAC,EAAE,KAAK,CAACsB,GAAGC,MAAMD,IAAIC,CAAC,GACvHC,IAAOX,EAAM,CAACnB,MAAcwB,EAAIxB,CAAC,GAAG,YAAY;AACtD,eAAOoB,EAAI,KAAK,MAAM,EAAE,OAAAR,GAAO,OAAAe,GAAO,OAAO,oBAAI,IAAA,GAAe,WAAUF,KAAA,gBAAAA,EAAS,aAAY,QAAQ,MAAAK,GAAM;AAAA,MACjH;AAAA,MACA,SAAS,CAACN,GAAiCC,MACvCL,EAAI,KAAK,QAAQ,EAAE,OAAAR,GAAO,KAAK,MAAMY,EAAA,GAAO,UAASC,KAAA,gBAAAA,EAAS,YAAW9B,GAAwB;AAAA,MACrG,SAAS,CAAC6B,MAAuBJ,EAAI,KAAK,QAAQ,EAAE,OAAAR,GAAO,KAAKO,EAAM,MAAMK,EAAA,GAAO,aAAa,GAAG;AAAA,MACnG,cAAc,CAACO,MAAyDX,EAAI,KAAK,YAAY,EAAE,OAAAR,GAAO,IAAAmB,EAAA,CAAI;AAAA,IAAA;AAAA,EAElH;AAAA;AAAA,EAIQ,aAAanB,GAAeY,GAAkDC,GAAkD;AACpI,QAAI,KAAK,UAAU,KAAK,IAAI,cAAe,QAAO,QAAQ,QAAQ,EAAK;AACvE,UAAMxB,IAAI,KAAK,IAAI,OACbc,KAA0BU,KAAA,gBAAAA,EAAS,UAASxB,EAAE,QAAQ,aAAc,KAAK,iBAA6B,YAAZ,YAC1F+B,IAAa,CAAC/B,EAAE,UAAU,CAACA,EAAE;AACnC,IAAKA,EAAE,UAAQA,EAAE,MAAA,GACjB,KAAK,IAAI,SAAA;AAET,UAAMgC,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,gCAClBA,EAAM,aAAa,QAAQ,oBAAoBrB,CAAK,EAAE,GACtDqB,EAAM,QAAQ,SAASrB,GACvBqB,EAAM,QAAQ,WAAW,QACzBA,EAAM,gBAAgB,cAAc,EAAI,GACxCA,EAAM,gBAAgB,oBAAoB,EAAI;AAC9C,eAAWC,KAAM,CAAC,eAAe,aAAa,WAAW,cAAc,YAAY,SAAS,UAAU,KAAkB,iBAAiBA,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AACvK,SAAK,IAAI,UAAU,YAAYF,CAAK;AAEpC,UAAMG,IAAO,IAAI,gBAAA;AACjB,gBAAK,KAAK,cAAcrB,GAAMH,CAAK,GAE5B,IAAI,QAAiB,CAACyB,MAAY;AACrC,UAAIC,IAAO;AACX,YAAMC,IAAS,MAAY;AACvB,QAAID,MACJA,IAAO,IACP,aAAaE,CAAK,GAClBJ,EAAK,MAAA,GACLH,EAAM,OAAA,GACN,KAAK,SAAS,MACd,KAAK,IAAI,WAAA,GACT,KAAK,KAAK,YAAYlB,GAAMH,CAAK,GAC7BoB,KAAcjB,MAAS,cAAiBd,EAAE,KAAA,EAAO,MAAM,MAAM;AAAA,QAAC,CAAC,GACnEoC,EAAQ,EAAI;AAAA,MAChB,GACMG,IAAQ,WAAW,MAAM;AAC3B,aAAK,IAAI,IAAI,WAAW5B,CAAK,wBAAwB,EAAE,QAAQA,GAAO,MAAAG,EAAA,CAAM,GAC5EwB,EAAA;AAAA,MACJ,IAAGd,KAAA,gBAAAA,EAAS,cAAahC,CAAwB;AACjD,WAAK,SAAS,EAAE,OAAAmB,GAAO,QAAA2B,EAAA;AACvB,YAAME,IAAO,CAAC/B,MAAuB;AACjC,aAAK,IAAI,IAAI,WAAWE,CAAK,kCAAkCF,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQE,GAAO,MAAAG,GAAM,GACvHwB,EAAA;AAAA,MACJ;AACA,UAAI;AACA,gBAAQ,QAAQf,EAAI,EAAE,MAAAT,GAAM,OAAAkB,GAAO,QAAQG,EAAK,QAAQ,KAAKG,GAAQ,CAAC,EAAE,KAAKA,GAAQE,CAAI;AAAA,MAC7F,SAAS/B,GAAK;AACV,QAAA+B,EAAK/B,CAAG;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,KAAKgC,GAAiC3B,GAAyB4B,GAAsB;AACzF,SAAK,IAAI,QAAQ,cAAc,IAAI,YAAYD,GAAM,EAAE,QAAQ,EAAE,MAAA3B,GAAM,QAAQ,IAAM,QAAA4B,EAAA,EAAO,CAAG,CAAC;AAAA,EACpG;AAAA,EA0BA,MAAc,cAA6B;AACvC,SAAK,cAAc;AACnB,UAAMC,IAAM,QAAQ;AAAA,MAChB,KAAK,SAAS;AAAA,QAAI,CAACpC,MACf,QAAQ,QAAA,EACH,KAAK,MAAMA,EAAE,IAAA,CAAK,EAClB,MAAM,CAACE,MAAQ,KAAK,IAAI,IAAI,WAAWF,EAAE,KAAK,mCAAmCE,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQF,EAAE,MAAA,CAAO,CAAC;AAAA,MAAA;AAAA,IAC/I;AAIJ,SAFA,MAAM,QAAQ,KAAK,CAACoC,GAAK,IAAI,QAAQ,CAACC,MAAM,WAAWA,GAAGnD,CAAuB,CAAC,CAAC,CAAC,GAE7E,KAAK,SAAQ,OAAM,IAAI,QAAQ,CAACmD,MAAM,WAAWA,GAAG,GAAG,CAAC;AAC/D,SAAK,cAAc,IACd,KAAK,IAAI,MAAM,KAAA,EAAO,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C;AAAA,EA+CQ,aAAmB;AACvB,IAAI,KAAK,cAAY,aAAa,KAAK,UAAU,GACjD,KAAK,aAAa;AAClB,eAAWC,KAAK,KAAK,cAAc,OAAO,CAAC;AACvC,UAAI;AACA,QAAAA,EAAA;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,EAER;AAUJ;AC1NA,MAAMT,IAAU,CAACU,MAAgC,OAAOA,KAAU,aAAaA,MAAUA;AAEzF,SAASC,EAASC,GAAuB;AACrC,QAAMC,IAAQD,EAAK,MAAM,GAAG,GAEtBE,KAAOD,EAAM,IAAA,KAAS,KAAK,YAAA,GAC3BE,IAAOF,EAAM,IAAI,CAAC1C,MAAMA,EAAE,aAAa,GACvC6C,IAAS,UAAU,KAAKF,CAAG;AACjC,SAAO,EAAE,KAAAA,GAAK,OAAOC,EAAK,SAAS,OAAO,IAAI,KAAOC,IAAS,KAAQ,MAAM,KAAKD,EAAK,SAAS,KAAK,GAAG,MAAMA,EAAK,SAAS,MAAM,KAAKA,EAAK,SAAS,SAAS,GAAG,MAAMA,EAAK,SAAS,MAAM,KAAKA,EAAK,SAAS,KAAK,EAAA;AACtN;AAEA,SAASE,EAAQL,GAAe,GAA2B;AACvD,SACI,EAAE,IAAI,YAAA,MAAkBA,EAAK,OAC7B,EAAE,WAAWA,EAAK,OAClB,EAAE,YAAYA,EAAK,QACnB,EAAE,YAAYA,EAAK,SAClBA,EAAK,UAAU,QAAQ,EAAE,aAAaA,EAAK;AAEpD;AAEO,MAAMM,EAAW;AAAA,EAUpB,YAA6BzD,GAAwB;AATpC,IAAAC,EAAA,uCAAgB,IAAA;AAChB,IAAAA,EAAA,sBAAkJ,CAAA;AAC3J,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAiC;AACjC,IAAAA,EAAA,oBAAmD;AAEnD;AAAA,IAAAA,EAAA,gBAAS;AACA,IAAAA,EAAA;AAyIA,IAAAA,EAAA,mBAAY,CAAC,MAA2B;AAErD,UAAI,EAAE,iBAAkB;AACxB,YAAMyD,IAAS,EAAE,aAAA,EAAe,CAAC;AACjC,UAAI,EAAAA,aAAkB,gBAAgBA,EAAO,qBAAqB,6BAA6B,KAAKA,EAAO,OAAO;AAClH,mBAAW,KAAK,KAAK;AACjB,cAAIF,EAAQ,EAAE,MAAM,CAAC,GAAG;AACpB,cAAE,eAAA,GACF,EAAE,QAAQ,CAAC;AACX;AAAA,UACJ;AAAA;AAAA,IAER;AAnJ6B,SAAA,MAAAxD,GACzBA,EAAI,QAAQ,iBAAiB,WAAW,KAAK,SAAS,GACtD,KAAK,MAAM,IAAID,EAAUC,CAAG;AAAA,EAChC;AAAA;AAAA,EAGA,eAAegB,GAAaC,GAAkD;AAC1E,WAAO,KAAK,IAAI,aAAaD,GAAKC,CAAI;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,KAAK0C,GAAwBC,GAAoC;AACnE,UAAMC,IAAM,EAAE,KAAK,SACbC,IAAW,MAAM,QAAQ,IAAI,CAAC,GAAGH,GAAS,GAAGC,CAAI,EAAE,IAAI,CAACvB,MAAM,KAAK,aAAaA,CAAC,CAAC,CAAC;AACzF,QAAIwB,MAAQ,KAAK,QAAS;AAC1B,UAAME,wBAAa,IAAA;AACnB,eAAWhB,KAAKe,EAAU,CAAIf,OAAU,IAAIA,EAAE,OAAO,MAAMA,CAAC;AAE5D,eAAW,CAACH,GAAMoB,CAAI,KAAK,KAAK,UAAW,CAAKD,EAAO,IAAInB,CAAI,KAAG,KAAK,QAAQA,GAAMoB,CAAI;AACzF,eAAW,CAACpB,GAAM,EAAE,QAAAC,GAAQ,SAAAlB,EAAA,CAAS,KAAKoC,GAAQ;AAC9C,YAAMV,IAAMY,EAAWtC,CAAO,GACxBqC,IAAO,KAAK,UAAU,IAAIpB,CAAI;AACpC,UAAIoB,KAAQA,EAAK,WAAWnB,GAAQ;AAChC,YAAImB,EAAK,eAAeX,EAAK;AAC7B,YAAIR,EAAO,QAAQ;AACf,UAAAmB,EAAK,aAAaX,GAClB,KAAK,MAAMT,GAAM,MAAMC,EAAO,OAAQlB,CAAO,CAAC,EAAA;AAC9C;AAAA,QACJ;AAAA,MACJ;AACA,MAAIqC,KAAM,KAAK,QAAQpB,GAAMoB,CAAI,GACjC,MAAM,KAAK,QAAQnB,GAAQlB,GAAS0B,CAAG;AAAA,IAC3C;AAAA,EACJ;AAAA;AAAA,EAGA,gBAAsB;AAClB,eAAW,CAACT,GAAMoB,CAAI,KAAK,KAAK,WAAW;AACvC,iBAAW/B,KAAM+B,EAAK,cAAc,MAAMpB,GAAMX,CAAE,EAAA;AAClD,iBAAWA,KAAM+B,EAAK,eAAgB,MAAK,MAAMpB,GAAM,MAAMX,EAAG,KAAK,IAAI,OAAA,CAAQ,CAAC,EAAA;AAAA,IACtF;AAAA,EACJ;AAAA;AAAA,EAGA,YAA8B;AAC1B,WAAO,KAAK,aAAa,OAAO,CAACzB,MAAMA,EAAE,gBAAgB,MAAS,EAAE,IAAI,CAACA,OAAO,EAAE,MAAM,CAACA,EAAE,KAAK,GAAG,aAAa+B,EAAQ/B,EAAE,WAAY,EAAA,EAAI;AAAA,EAC9I;AAAA,EAEA,IAAIoC,GAAuB;AACvB,WAAO,KAAK,UAAU,IAAIA,CAAI;AAAA,EAClC;AAAA,EAEA,UAAgB;;AACZ,MAAE,KAAK;AACP,eAAW,CAACA,GAAMoB,CAAI,KAAK,KAAK,UAAW,MAAK,QAAQpB,GAAMoB,CAAI;AAClE,SAAK,IAAI,QAAQ,oBAAoB,WAAW,KAAK,SAAS,GAC9D,KAAK,IAAI,QAAA,IACTnD,IAAA,KAAK,YAAL,QAAAA,EAAc,UACV,KAAK,cAAY,aAAa,KAAK,UAAU;AAAA,EACrD;AAAA;AAAA,EAIA,MAAc,aAAaqD,GAAmF;AAC1G,UAAM,CAACR,GAAQ/B,CAAO,IAAI,MAAM,QAAQuC,CAAK,IAAIA,IAAQ,CAACA,GAAO,MAAS;AAC1E,QAAI;AACA,UAAI,OAAOR,KAAW,YAAY;AAC9B,cAAMS,IAAM,MAAOT,EAAA,GACbb,IAAS,WAAWsB,IAAMA,IAAM,aAAaA,IAAMA,EAAI,UAAUA,EAAI;AAC3E,eAAOtB,KAAU,OAAOA,EAAO,SAAU,aAAa,EAAE,QAAAA,GAAQ,SAAAlB,MAAY;AAAA,MAChF;AACA,aAAO+B,KAAU,OAAOA,EAAO,SAAU,cAAc,OAAOA,EAAO,QAAS,WAAW,EAAE,QAAQA,GAAQ,SAAA/B,MAAY;AAAA,IAC3H,SAASf,GAAK;AACV,kBAAK,IAAI,IAAI,gCAAgCA,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQ,OAAO8C,KAAW,aAAa,WAAW,OAAQA,KAAA,gBAAAA,EAAuB,IAAI,GAAG,GACjK;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAc,QAAQb,GAAyBlB,GAAkB0B,GAA4B;AACzF,UAAMT,IAAOC,EAAO;AACpB,IAAIA,EAAO,cAAcA,EAAO,aAAauB,KACzC,KAAK,IAAI,IAAI,WAAWxB,CAAI,iCAAiCC,EAAO,UAAU,sBAAsBuB,CAAkB,IAAI,EAAE,QAAQxB,GAAM;AAE9I,UAAMoB,IAAiB,EAAE,QAAAnB,GAAQ,YAAYQ,GAAK,KAAK,MAA8B,WAAW,CAAA,GAAI,SAAS,CAAA,GAAI,gBAAgB,CAAA,GAAI,SAAS,MAAM,SAAS,GAAA;AAC7J,IAAAW,EAAK,MAAM,KAAK,UAAUA,CAAI,GAC9B,KAAK,UAAU,IAAIpB,GAAMoB,CAAI;AAC7B,QAAI;AACA,YAAMK,IAAS,MAAMxB,EAAO,MAAMmB,EAAK,KAAKrC,CAAO;AACnD,UAAIqC,EAAK,SAAS;AACd,QAAI,OAAOK,KAAW,mBAAiB,MAAMzB,GAAMyB,CAAM,EAAA;AACzD;AAAA,MACJ;AACA,MAAI,OAAOA,KAAW,eAAYL,EAAK,UAAUK;AAAA,IACrD,SAASzD,GAAK;AACV,WAAK,OAAOgC,GAAMhC,GAAK,OAAO,GAC9B,KAAK,QAAQgC,GAAMoB,CAAI;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEQ,QAAQpB,GAAcoB,GAAsB;AAChD,QAAI,CAAAA,EAAK,SACT;AAAA,MAAAA,EAAK,UAAU,IACX,KAAK,UAAU,IAAIpB,CAAI,MAAMoB,KAAM,KAAK,UAAU,OAAOpB,CAAI,GAC7DoB,EAAK,WAAS,KAAK,MAAMpB,GAAMoB,EAAK,OAAO,EAAA;AAE/C,iBAAWM,KAAKN,EAAK,UAAU,QAAA;AAC3B,YAAI;AACA,UAAAM,EAAA;AAAA,QACJ,QAAQ;AAAA,QAER;AAEJ,MAAAN,EAAK,YAAY,CAAA,GACjB,KAAK,IAAI,YAAYpB,CAAI;AACzB,eAASnB,IAAI,KAAK,aAAa,SAAS,GAAGA,KAAK,GAAGA,IAAK,CAAI,KAAK,aAAaA,CAAC,EAAG,UAAUmB,UAAW,aAAa,OAAOnB,GAAG,CAAC;AAAA;AAAA,EACnI;AAAA,EAEQ,OAAOmB,GAAchC,GAAc2D,GAAqB;AAC5D,UAAMC,KAAW5D,KAAA,gBAAAA,EAAe,YAAW,OAAOA,CAAG;AACrD,SAAK,IAAI,IAAI,WAAWgC,CAAI,eAAe2B,CAAK,KAAKC,CAAO,IAAI,EAAE,QAAQ5B,EAAA,CAAM,GAChF,QAAQ,MAAM,yBAAyBA,CAAI,MAAM2B,CAAK,MAAM3D,CAAG;AAAA,EACnE;AAAA;AAAA,EAGQ,MAA2BgC,GAAcX,GAA6BsC,IAAQ,WAAiC;AACnH,WAAO,IAAIE,MAAY;AACnB,UAAI;AACA,cAAM,IAAIxC,EAAG,GAAGwC,CAAI;AACpB,QAAI,aAAa,WAAS,EAAE,MAAM,CAAC7D,MAAQ,KAAK,OAAOgC,GAAMhC,GAAK2D,CAAK,CAAC;AAAA,MAC5E,SAAS3D,GAAK;AACV,aAAK,OAAOgC,GAAMhC,GAAK2D,CAAK;AAAA,MAChC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAkBQ,UAAUP,GAA2B;AACzC,UAAMhE,IAAM,KAAK,KACX4C,IAAOoB,EAAK,OAAO,MACnBU,IAAQ,CAACC,MAA8B;AACzC,MAAIX,EAAK,UAASW,EAAA,IACbX,EAAK,UAAU,KAAKW,CAAO;AAAA,IACpC,GACMtD,IAAQ,CAAsBY,GAA6BsC,MAAmB,KAAK,MAAM3B,GAAMX,GAAIsC,CAAK,GACxGK,IAAkD,CAAA,GAClDC,IAAO,MAEPC,IAAK,CAACC,GAAeC,GAAiCC,IAAO,OAAwB;AAEvF,YAAMvB,IAAsBqB,EAAM,SAAS,GAAG,IAAI/E,EAAI,UAAUA,EAAI,OAC9DkF,IAAU7D,EAAM,CAACe,MAAc;AACjC,QAAI6C,KAAME,EAAA,GACVH,EAAQ5C,CAAE;AAAA,MACd,GAAG,MAAM2C,CAAK,GAAG;AACjB,MAAArB,EAAO,iBAAiBqB,GAAOG,CAAO;AACtC,UAAI1C,IAAO;AACX,YAAM2C,IAAM,MAAY;AACpB,QAAI3C,MACJA,IAAO,IACPkB,EAAO,oBAAoBqB,GAAOG,CAAO;AAAA,MAC7C;AACA,aAAAR,EAAMS,CAAG,GACFA;AAAA,IACX;AAmLA,WAjLuB;AAAA,MACnB,QAAQvC;AAAA,MACR,YAAYwB;AAAA,MACZ,SAASpE,EAAI;AAAA,MACb,OAAOA,EAAI;AAAA,MACX,IAAI,SAAS;AACT,eAAOA,EAAI,OAAA;AAAA,MACf;AAAA,MACA,QAAQA,EAAI;AAAA,MACZ,IAAI,cAAc;AACd,eAAOA,EAAI,MAAM;AAAA,MACrB;AAAA,MACA,IAAI,WAAW;AACX,eAAOA,EAAI,MAAM;AAAA,MACrB;AAAA,MACA,IAAI,SAAS;AACT,eAAOA,EAAI,MAAM;AAAA,MACrB;AAAA,MACA,IAAI,SAAS;AACT,eAAOA,EAAI,MAAM,aAAa;AAAA,MAClC;AAAA,MACA,IAAI,cAAc;AACd,eAAOA,EAAI,YAAA;AAAA,MACf;AAAA,MACA,IAAI,eAAe;AACf,eAAOA,EAAI,aAAA;AAAA,MACf;AAAA,MACA,IAAI,MAAM;AACN,eAAOA,EAAI,WAAA;AAAA,MACf;AAAA,MACA,MAAM,MAAMA,EAAI,MAAM,KAAA;AAAA,MACtB,OAAO,MAAMA,EAAI,MAAM,MAAA;AAAA,MACvB,MAAM,CAACoF,MAAiB;AACpB,QAAI,OAAO,SAASA,CAAI,MAAGpF,EAAI,MAAM,cAAc,KAAK,IAAI,GAAGoF,CAAI;AAAA,MACvE;AAAA,MACA,IAAI,CAACL,GAAOC,MAAYF,EAAGC,GAAOC,CAAO;AAAA,MACzC,MAAM,CAACD,GAAOC,MAAYF,EAAGC,GAAOC,GAAS,EAAI;AAAA,MACjD,MAAM,CAACD,GAAOM,MAAW;AACrB,QAAArF,EAAI,QAAQ,cAAc,IAAI,YAAY,GAAG4C,CAAI,IAAImC,CAAK,IAAI,EAAE,QAAAM,GAAQ,SAAS,IAAM,UAAU,GAAA,CAAM,CAAC;AAAA,MAC5G;AAAA,MACA,gBAAgB,CAACL,MAAYF,EAAG,aAAa,MAAME,EAAQhF,EAAI,WAAA,CAAY,CAAC;AAAA,MAC5E,gBAAgB,CAACgF,MAAY;AACzB,QAAAhB,EAAK,eAAe,KAAKgB,CAAO;AAChC,cAAMG,IAAM,MAAY;AACpB,gBAAM1D,IAAIuC,EAAK,eAAe,QAAQgB,CAAO;AAC7C,UAAIvD,KAAK,KAAGuC,EAAK,eAAe,OAAOvC,GAAG,CAAC;AAAA,QAC/C;AACA,eAAAiD,EAAMS,CAAG,GACFA;AAAA,MACX;AAAA,MACA,WAAW,CAACH,MAAYN,EAAMrD,EAAM2D,GAAS,WAAW,CAAC;AAAA,MACzD,YAAY,CAACA,GAASM,MAAO;AACzB,cAAMC,IAAK,OAAO,WAAWlE,EAAM2D,GAAS,YAAY,GAAGM,CAAE;AAC7D,eAAAZ,EAAM,MAAM,aAAaa,CAAE,CAAC,GACrBA;AAAA,MACX;AAAA,MACA,aAAa,CAACP,GAASM,MAAO;AAC1B,cAAMC,IAAK,OAAO,YAAYlE,EAAM2D,GAAS,aAAa,GAAGM,CAAE;AAC/D,eAAAZ,EAAM,MAAM,cAAca,CAAE,CAAC,GACtBA;AAAA,MACX;AAAA,MACA,IAAI;AAAA,QACA,WAAW,CAACC,MAAMX,EAAK,UAAUb,GAAMwB,GAAGd,GAAOrD,CAAK;AAAA,QACtD,UAAU,CAACmE,MAAMX,EAAK,SAASb,GAAMwB,KAAK,CAAA,GAAId,CAAK;AAAA,QACnD,OAAO,CAACF,GAASgB,MAAMX,EAAK,MAAML,GAASgB,KAAA,gBAAAA,EAAG,UAAU;AAAA,MAAA;AAAA,MAE5D,UAAU;AAAA,QACN,WAAW,CAACA,MAAM;AACd,gBAAMnC,IAAM,UAAUT,CAAI,WAAW,EAAEiC,EAAK,MAAM,IAC5CY,IAAW,MACbzF,EAAI,SAAS,eAAe;AAAA,YACxB,KAAAqD;AAAA,YACA,OAAOd,EAAQiD,EAAE,KAAK;AAAA,YACtB,eAAe,MAAOA,EAAE,IAAA,IAAQE,EAAM1F,EAAI,QAAQ,EAAI,IAAI0F,EAAM1F,EAAI,QAAQ,EAAK;AAAA,YACjF,UAAUqB,EAAM,MAAMmE,EAAE,IAAI,CAACA,EAAE,IAAA,CAAK,GAAG,iBAAiB;AAAA,UAAA,CAC3D;AACL,iBAAAC,EAAA,GACAzB,EAAK,QAAQ,KAAKyB,CAAQ,GAC1Bf,EAAM,MAAM1E,EAAI,SAAS,iBAAiBqD,CAAG,CAAC,GACvCsC,EAAeF,GAAU,MAAMzF,EAAI,SAAS,iBAAiBqD,CAAG,CAAC;AAAA,QAC5E;AAAA,QACA,WAAW,CAACmC,MAAM;AACd,gBAAMnC,IAAM,UAAUT,CAAI,WAAW,EAAEiC,EAAK,MAAM,IAC5CtD,IAAO,MAAO,OAAOiE,EAAE,WAAY,aAAaA,EAAE,YAAYA,EAAE,SAChEC,IAAW,MACbzF,EAAI,SAAS,gBAAgB;AAAA,YACzB,KAAAqD;AAAA,YACA,OAAOd,EAAQiD,EAAE,KAAK;AAAA,YACtB,eAAe,MAAM;AACjB,oBAAMI,IAAUrE,EAAA,EAAO,KAAK,CAACR,MAAMA,EAAE,UAAUyE,EAAE,KAAK;AACtD,qBAAOI,IAAUrD,EAAQqD,EAAQ,KAAK,IAAI;AAAA,YAC9C;AAAA,YACA,UAAU,MAAMrE,IAAO,IAAI,CAACR,OAAO,EAAE,OAAOwB,EAAQxB,EAAE,KAAK,GAAG,QAAQA,EAAE,UAAUyE,EAAE,OAAO,UAAUnE,EAAM,MAAMmE,EAAE,IAAIzE,EAAE,KAAK,GAAG,iBAAiB,IAAI;AAAA,UAAA,CACzJ;AACL,iBAAA0E,EAAA,GACAzB,EAAK,QAAQ,KAAKyB,CAAQ,GAC1Bf,EAAM,MAAM1E,EAAI,SAAS,kBAAkBqD,CAAG,CAAC,GACxCsC,EAAeF,GAAU,MAAMzF,EAAI,SAAS,kBAAkBqD,CAAG,CAAC;AAAA,QAC7E;AAAA,QACA,YAAY,CAACmC,MAAM;AACf,gBAAMnC,IAAM,UAAUT,CAAI,YAAY,EAAEiC,EAAK,MAAM,IAC7CY,IAAW,MACbzF,EAAI,SAAS,gBAAgB;AAAA,YACzB,KAAAqD;AAAA,YACA,OAAOd,EAAQiD,EAAE,KAAK;AAAA,YACtB,eAAe,MAAOA,EAAE,QAAQA,EAAE,UAAU;AAAA,YAC5C,UAAU,MACNA,EAAE,MAAA,EAAQ,IAAI,CAACzE,OAAO,EAAE,OAAOwB,EAAQxB,EAAE,KAAK,GAAG,QAAQ,CAAC,CAACA,EAAE,QAAQ,UAAUM,EAAM,MAAMN,EAAE,SAAA,GAAY,kBAAkB,IAAI;AAAA,UAAA,CACtI;AACL,iBAAA0E,EAAA,GACAzB,EAAK,QAAQ,KAAKyB,CAAQ,GAC1Bf,EAAM,MAAM1E,EAAI,SAAS,kBAAkBqD,CAAG,CAAC,GACxCsC,EAAeF,GAAU,MAAMzF,EAAI,SAAS,kBAAkBqD,CAAG,CAAC;AAAA,QAC7E;AAAA,MAAA;AAAA,MAEJ,MAAM;AAAA,QACF,KAAK,CAACA,GAAK2B,GAASa,MAAgB;AAChC,gBAAM3B,IAAQ,EAAE,OAAOtB,GAAM,MAAMM,EAASG,CAAG,GAAG,OAAOA,GAAK,aAAAwC,GAAa,SAASxE,EAAM2D,GAAS,QAAQ3B,CAAG,GAAG,EAAA;AACjH,UAAAwB,EAAK,aAAa,KAAKX,CAAK;AAC5B,gBAAMiB,IAAM,MAAY;AACpB,kBAAM1D,IAAIoD,EAAK,aAAa,QAAQX,CAAK;AACzC,YAAIzC,KAAK,KAAGoD,EAAK,aAAa,OAAOpD,GAAG,CAAC;AAAA,UAC7C;AACA,iBAAAiD,EAAMS,CAAG,GACFA;AAAA,QACX;AAAA,MAAA;AAAA,MAEJ,MAAM;AAAA,QACF,KAAK,CAACW,MAAS;AACX,qBAAW,CAACC,GAAQC,CAAM,KAAK,OAAO,QAAQF,CAAI,EAAG,CAAAlB,EAAQmB,CAAM,IAAI,EAAE,GAAGnB,EAAQmB,CAAM,GAAG,GAAGC,EAAA;AAAA,QACpG;AAAA,QACA,GAAG,CAAC3C,GAAK4C,MAAA;;AAAa,mBAAApF,IAAA+D,EAAQ5E,EAAI,OAAA,CAAQ,MAApB,gBAAAa,EAAwBwC,SAAQ6C,IAAAtB,EAAQ,OAAR,gBAAAsB,EAAa7C,OAAQ4C,KAAY5C;AAAA;AAAA,MAAA;AAAA,MAE3F,SAAS;AAAA,QACL,KAAK,CAAIA,GAAa4C,MAAgC;AAClD,cAAI;AACA,kBAAME,IAAM,aAAa,QAAQC,EAAWxD,GAAMS,CAAG,CAAC;AACtD,mBAAO8C,MAAQ,OAAOF,IAAY,KAAK,MAAME,CAAG;AAAA,UACpD,QAAQ;AACJ,mBAAOF;AAAA,UACX;AAAA,QACJ;AAAA,QACA,KAAK,CAAC5C,GAAKgD,MAAU;AACjB,cAAI;AACA,yBAAa,QAAQD,EAAWxD,GAAMS,CAAG,GAAG,KAAK,UAAUgD,CAAK,CAAC;AAAA,UACrE,QAAQ;AAAA,UAER;AAAA,QACJ;AAAA,QACA,QAAQ,CAAChD,MAAQ;AACb,cAAI;AACA,yBAAa,WAAW+C,EAAWxD,GAAMS,CAAG,CAAC;AAAA,UACjD,QAAQ;AAAA,UAER;AAAA,QACJ;AAAA,MAAA;AAAA,MAEJ,MAAM,MAAM;AACR,cAAM8C,IAAMtB,EAAK,IAAI,IAAIjC,GAAMvB,CAAK,GAE9BiF,IAAU,CAAwCrE,OACnD,IAAIH,MAAqB;AACtB,gBAAMqD,IAAMlD,EAAG,GAAGH,CAAC;AACnB,iBAAA4C,EAAMS,CAAG,GACFA;AAAA,QACX;AACJ,eAAO;AAAA,UACH,cAAcgB,EAAI;AAAA,UAClB,eAAeG,EAAQH,EAAI,aAAa;AAAA,UACxC,QAAQG,EAAQH,EAAI,MAAM;AAAA,UAC1B,SAASG,EAAQH,EAAI,OAAO;AAAA,UAC5B,SAASG,EAAQH,EAAI,OAAO;AAAA,UAC5B,cAAcG,EAAQH,EAAI,YAAY;AAAA,QAAA;AAAA,MAE9C,GAAA;AAAA,MACA,KAAK,CAAC3B,GAAS+B,MAAYvG,EAAI,IAAIwE,GAAS,EAAE,QAAQ5B,GAAM,GAAG2D,EAAA,CAAS;AAAA,IAAA;AAAA,EAGhF;AAAA,EAEQ,UACJvC,GACAwB,GACAd,GACArD,GACkB;AAClB,UAAMmF,IAAM,SAAS,cAAc,QAAQ;AAC3C,IAAAA,EAAI,OAAO,UACXA,EAAI,YACA,+JACJA,EAAI,aAAa,QAAQ,wBAAwBxC,EAAK,OAAO,IAAI,EAAE,GACnEwC,EAAI,QAAQ,SAASxC,EAAK,OAAO;AACjC,QAAIf,IAAqBuC,EAAE,OACvBiB,IAAS,CAAC,CAACjB,EAAE;AACjB,UAAMkB,IAAU,CAACC,MAAuB;;AACpC,MAAAH,EAAI,cAAc,IACdG,EAAK,KAAA,EAAO,WAAW,GAAG,KAC1BH,EAAI,mBAAmB,aAAaG,CAAI,IACxC9F,IAAA2F,EAAI,cAAc,KAAK,MAAvB,QAAA3F,EAA0B,aAAa,eAAe,WACnD2F,EAAI,YAAYI,EAAWD,GAAM,2CAA2C,CAAC;AAAA,IACxF,GACME,IAAa,MAAYL,EAAI,aAAa,cAAcjE,EAAQU,CAAK,CAAC,GACtE6D,IAAc,MAAY;AAC5B,MAAItB,EAAE,WAAW,UAAWgB,EAAI,aAAa,gBAAgB,OAAOC,CAAM,CAAC;AAAA,IAC/E;AACA,IAAAC,EAAQlB,EAAE,IAAI,GACdqB,EAAA,GACAC,EAAA,GACA9C,EAAK,QAAQ,KAAK6C,CAAU;AAC5B,UAAME,IAA6B;AAAA,MAC/B,IAAIP;AAAA,MACJ,IAAI,SAAS;AACT,eAAOC;AAAA,MACX;AAAA,MACA,UAAU,CAAC,MAAM;AACb,QAAAxD,IAAQ,GACR4D,EAAA;AAAA,MACJ;AAAA,MACA,SAAAH;AAAA,MACA,WAAW,CAAC5E,MAAM;AACd,QAAA2E,IAAS3E,GACT0E,EAAI,aAAa,gBAAgB,OAAO1E,CAAC,CAAC;AAAA,MAC9C;AAAA,MACA,MAAM,MAAM;AACR,QAAA0E,EAAI,MAAM,UAAU;AAAA,MACxB;AAAA,MACA,MAAM,MAAM;AACR,QAAAA,EAAI,MAAM,UAAU;AAAA,MACxB;AAAA,MACA,QAAQ,MAAMA,EAAI,OAAA;AAAA,IAAO;AAE7B,QAAIhB,EAAE,SAAS;AACX,YAAMwB,IAAQ3F,EAAM,CAACgB,MAAkBmD,EAAE,QAASnD,GAAG0E,CAAM,GAAG,gBAAgB;AAC9E,MAAAP,EAAI,iBAAiB,SAAS,CAACnE,MAAM;AACjC,QAAAA,EAAE,gBAAA,GACF2E,EAAM3E,CAAC;AAAA,MACX,CAAC;AAAA,IACL;AACA,gBAAK,IAAI,iBAAiBmE,GAAKhB,EAAE,YAAY,OAAO,GACpDd,EAAM,MAAM8B,EAAI,QAAQ,GACjBO;AAAA,EACX;AAAA,EAEQ,SAAS/C,GAAgBwB,GAAuBd,GAAmD;AACvG,UAAMuC,IAAK,SAAS,cAAc,KAAK;AACvC,IAAAA,EAAG,YAAY,mBACfA,EAAG,aAAa,QAAQ,uBAAuBjD,EAAK,OAAO,IAAI,EAAE,GACjEiD,EAAG,QAAQ,SAASjD,EAAK,OAAO,MAChCiD,EAAG,QAAQ,WAAWzB,EAAE,YAAY,QACpCyB,EAAG,gBAAgB,iBAAiB,CAAC,CAACzB,EAAE,QAAQ,GAChDyB,EAAG,gBAAgB,oBAAoB,CAAC,CAACzB,EAAE,WAAW,GACtDyB,EAAG,gBAAgB,cAAc,CAAC,CAACzB,EAAE,KAAK;AAC1C,QAAI0B,IAAU1B,EAAE,YAAY;AAC5B,IAAAyB,EAAG,SAAS,CAACC,GAET1B,EAAE,QAAO,KAAK,IAAI,UAAU,YAAYyB,CAAE,SACpC,IAAI,UAAU,aAAaA,GAAI,KAAK,IAAI,QAAQ;AAE1D,QAAIE,IAAiC;AACrC,IAAI3B,EAAE,QACF2B,IAAQ,SAAS,cAAc,OAAO,GACtCA,EAAM,cAAc3B,EAAE,KACtByB,EAAG,OAAOE,CAAK;AAEnB,UAAMC,IAAY,MAAY;AAC1B,MAAAH,EAAG,OAAA,GACHE,KAAA,QAAAA,EAAO;AAAA,IACX;AACA,QAAI3B,EAAE;AAEF,iBAAWpD,KAAM,CAAC,eAAe,aAAa,WAAW,cAAc,YAAY,SAAS,UAAU,KAAe,iBAAiBA,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AAExK,IAAAqC,EAAM0C,CAAS;AACf,UAAMC,IAAM,CAAClH,MAAqB;AAC9B,MAAA+G,IAAU/G,GACV8G,EAAG,SAAS,CAAC9G;AAAA,IACjB;AACA,WAAO;AAAA,MACH,IAAA8G;AAAA,MACA,IAAI,UAAU;AACV,eAAOC;AAAA,MACX;AAAA,MACA,MAAM,MAAMG,EAAI,EAAI;AAAA,MACpB,MAAM,MAAMA,EAAI,EAAK;AAAA,MACrB,QAAQ,CAACC,MAAUD,EAAIC,KAAS,CAACJ,CAAO;AAAA,MACxC,QAAQE;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEQ,MAAM5C,GAAiB+C,IAAa,MAAY;AACpD,IAAK,KAAK,YACN,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,mBACzB,KAAK,QAAQ,aAAa,QAAQ,cAAc,GAChD,KAAK,QAAQ,aAAa,QAAQ,QAAQ,GAC1C,KAAK,QAAQ,aAAa,aAAa,QAAQ,GAC/C,KAAK,IAAI,UAAU,YAAY,KAAK,OAAO,IAE/C,KAAK,QAAQ,cAAc/C,GAC3B,KAAK,QAAQ,aAAa,gBAAgB,EAAE,GACxC,KAAK,cAAY,aAAa,KAAK,UAAU,GACjD,KAAK,aAAa,WAAW,MAAA;;AAAM,cAAA3D,IAAA,KAAK,YAAL,gBAAAA,EAAc,gBAAgB;AAAA,OAAiB,KAAK,IAAI,KAAK0G,CAAU,CAAC;AAAA,EAC/G;AACJ;AAEA,SAAS5B,EAAeF,GAAsB+B,GAA0C;AACpF,SAAO,EAAE,SAAS/B,GAAU,QAAA+B,EAAA;AAChC;AAEA,SAAS9B,EAAM+B,GAA2C3C,GAAqB;AAC3E,QAAMuB,IAAQvB,IAAK2C,EAAO,SAASA,EAAO;AAC1C,SAAO,OAAOpB,KAAU,WAAWA,IAAQvB,IAAK,OAAO;AAC3D;AAEA,SAASsB,EAAWvD,GAAgBQ,GAAqB;AACrD,SAAO,aAAaR,CAAM,IAAIQ,CAAG;AACrC;AAGA,SAASY,EAAWtC,GAA0B;AAC1C,MAAI;AACA,WAAO,KAAK,UAAUA,KAAW,MAAM,CAAC+F,GAAIvH,MAAgB,OAAOA,KAAM,aAAa,MAAOA,EAAwB,QAAQ,EAAE,KAAKA,CAAE;AAAA,EAC1I,QAAQ;AACJ,WAAO,OAAO,KAAK,QAAQ;AAAA,EAC/B;AACJ;"}
@@ -1,7 +1,7 @@
1
1
  var w = Object.defineProperty;
2
2
  var N = (o, e, t) => e in o ? w(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
3
3
  var l = (o, e, t) => N(o, typeof e != "symbol" ? e + "" : e, t);
4
- import { c as f } from "./player-BVkwkn4b.js";
4
+ import { c as f } from "./player-DV4Hf5Cw.js";
5
5
  const b = "http://www.w3.org/2000/svg", C = 18, g = 2 * Math.PI * C, A = 10;
6
6
  function y(o) {
7
7
  const e = document.createElementNS(b, "svg");
@@ -205,4 +205,4 @@ export {
205
205
  L as RedirectScreen,
206
206
  T as installRedirectScreen
207
207
  };
208
- //# sourceMappingURL=redirectScreen-CFZKtEdv.js.map
208
+ //# sourceMappingURL=redirectScreen-BT_26-5g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redirectScreen-CFZKtEdv.js","sources":["../../src/plugins/redirect-screen/RedirectScreen.ts","../../src/plugins/redirect-screen/index.ts"],"sourcesContent":["import type { RedirectScreenOptions, RedirectScreenSuggestion } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\n\nexport interface RedirectScreenPlayerContext {\n /** hp:redirect olayları ve postroll'un bitişini (hp:adend) dinlemek için. */\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst RING_R = 18;\nconst RING_C = 2 * Math.PI * RING_R;\nconst DEFAULT_SHOW_BEFORE = 10;\n\n/** Dairesel geri sayım halkası (SVG) — `set(oran)` ile 1 → 0 boşalır. */\nfunction ring(className: string): { el: SVGSVGElement; set(fraction: number): void } {\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', '0 0 40 40');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('class', className);\n const track = document.createElementNS(SVG_NS, 'circle');\n const bar = document.createElementNS(SVG_NS, 'circle');\n for (const c of [track, bar]) {\n c.setAttribute('cx', '20');\n c.setAttribute('cy', '20');\n c.setAttribute('r', String(RING_R));\n }\n track.setAttribute('class', 'hp-redirect-ring-track');\n bar.setAttribute('class', 'hp-redirect-ring-bar');\n bar.setAttribute('stroke-dasharray', String(RING_C));\n svg.append(track, bar);\n return {\n el: svg,\n set: (fraction) => bar.setAttribute('stroke-dashoffset', String(RING_C * (1 - Math.min(1, Math.max(0, fraction))))),\n };\n}\n\n/** Görsel + süre rozeti + oynat ikonu + halka — kart ve tam ekran aynı parçayı kullanır. */\nfunction thumb(image: string | undefined, duration: string | undefined, className: string): { el: HTMLSpanElement; ring: ReturnType<typeof ring> } {\n const el = document.createElement('span');\n el.className = className;\n if (image) {\n const img = document.createElement('img');\n img.src = image;\n img.alt = '';\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const r = ring('hp-redirect-ring');\n const play = document.createElement('span');\n play.className = 'hp-redirect-play';\n play.appendChild(createIcon('play'));\n el.append(r.el, play);\n if (duration) {\n const d = document.createElement('span');\n d.className = 'hp-redirect-duration';\n d.textContent = duration;\n el.appendChild(d);\n }\n return { el, ring: r };\n}\n\n/**\n * Sıradaki videoya yönlendirme. İki mod:\n * - 'screen' (varsayılan): video bitince tam alan ekran + `time` sn geri sayım; iptal → öneriler.\n * - 'card': bitime `showBefore` sn kala köşede küçük \"Sıradaki\" kartı; geri sayım videoyla birlikte işler (duraklatınca\n * durur), video bitince yönlendirilir. Karta tıklamak hemen yönlendirir, X iptal eder.\n * Bitişte postroll oynuyorsa yönlendirme reklam bitene kadar bekler. `hp:redirect` (state: redirect) iptal edilirse\n * (`preventDefault`) sayfa değişmez.\n */\nexport class RedirectScreen {\n private counterTimer: ReturnType<typeof setInterval> | null = null;\n private wrapper: HTMLElement | null = null;\n private card: HTMLDivElement | null = null;\n private cardRing: ReturnType<typeof ring> | null = null;\n private cardLabel: HTMLSpanElement | null = null;\n private cancelled = false;\n private waitingForAd = false;\n private readonly mode: 'screen' | 'card';\n\n constructor(\n private readonly ctx: RedirectScreenPlayerContext,\n private readonly options: RedirectScreenOptions\n ) {\n this.mode = options.mode === 'card' ? 'card' : 'screen';\n if (options.enabled === false) return;\n ctx.videoEl.addEventListener('ended', this.onEnded);\n ctx.videoEl.addEventListener('play', this.onPlay);\n if (this.mode === 'card') ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n /** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */\n refreshLabels(): void {\n this.card?.querySelector('.hp-redirect-close')?.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('ended', this.onEnded);\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.remove();\n this.hideCard();\n }\n\n private emit(state: 'shown' | 'cancel' | 'redirect', reason?: 'auto' | 'click'): boolean {\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:redirect', { detail: { state, url: this.options.url, mode: this.mode, reason }, cancelable: state === 'redirect' })\n );\n }\n\n private go(reason: 'auto' | 'click'): void {\n this.remove();\n this.hideCard();\n if (!this.emit('redirect', reason)) return; // entegratör kendisi yönlendirecek\n if (this.options.newTab) window.open(this.options.url, '_blank', 'noopener');\n else window.location.href = this.options.url;\n }\n\n private readonly onPlay = (): void => {\n this.remove();\n };\n\n private readonly onEnded = (): void => {\n // Postroll oynuyorsa (ya da birazdan başlayacaksa) reklam bitince devam.\n if (this.ctx.isAdActive()) {\n this.waitForAd();\n return;\n }\n this.finish();\n };\n\n private waitForAd(): void {\n if (this.waitingForAd) return;\n this.waitingForAd = true;\n this.ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n }\n\n private readonly onAdEnd = (): void => {\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.waitingForAd = false;\n if (this.ctx.videoEl.ended) this.finish();\n };\n\n private finish(): void {\n if (this.mode === 'card') {\n this.hideCard();\n if (!this.cancelled) this.go('auto');\n else if (this.options.suggestions?.length) this.showSuggestions(this.options.suggestions);\n return;\n }\n this.createScreen();\n }\n\n // ── 'card' modu ─────────────────────────────────────────────────────────\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n const showBefore = Math.max(1, this.options.showBefore ?? DEFAULT_SHOW_BEFORE);\n const d = v.duration;\n if (!Number.isFinite(d) || d <= 0) return; // canlı yayında kart yok\n const remaining = d - v.currentTime;\n if (remaining > showBefore) {\n // Geri sarıldı (eşiğin belirgin üstüne): iptal unutulur — tekrar yaklaşınca kart yine gelir.\n if (remaining > showBefore + 1) this.cancelled = false;\n this.hideCard();\n return;\n }\n if (this.cancelled || this.ctx.isAdActive() || v.ended || remaining <= 0) {\n if (this.ctx.isAdActive()) this.hideCard();\n return;\n }\n if (!this.card) this.showCard();\n const secs = Math.ceil(remaining);\n this.cardRing?.set(remaining / showBefore);\n if (this.cardLabel) this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${secs}`;\n };\n\n private showCard(): void {\n const o = this.options;\n const card = document.createElement('div');\n card.className = 'hp-redirect-card';\n card.setAttribute('part', 'redirect-card');\n card.setAttribute('data-position', o.position ?? 'bottom-right');\n\n const main = document.createElement('button');\n main.type = 'button';\n main.className = 'hp-redirect-card-main';\n main.addEventListener('click', () => this.go('click'));\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n const text = document.createElement('span');\n text.className = 'hp-redirect-text';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n text.appendChild(label);\n if (o.title) {\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n text.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('span');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n text.appendChild(sub);\n }\n // Erişilebilir ad görünen metinden oluşur (\"Sıradaki · 4 Başlık Alt başlık\"); sonuna yalnızca ekran okuyucunun\n // duyduğu \"Şimdi oynat\" eklenir — görsel / süre rozeti okunmaz.\n t.el.setAttribute('aria-hidden', 'true');\n const action = document.createElement('span');\n action.className = 'hp-sr-only';\n action.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`;\n text.appendChild(action);\n main.append(t.el, text);\n\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-redirect-close';\n close.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => {\n this.cancelled = true;\n this.hideCard();\n this.emit('cancel');\n });\n\n card.append(main, close);\n // Karta dokunmak videoyu oynat / duraklat yapmasın.\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) card.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(card);\n this.card = card;\n this.cardRing = t.ring;\n this.cardLabel = label;\n this.emit('shown');\n }\n\n private hideCard(): void {\n this.card?.remove();\n this.card = null;\n this.cardRing = null;\n this.cardLabel = null;\n }\n\n // ── 'screen' modu ───────────────────────────────────────────────────────\n\n private remove(): void {\n if (this.counterTimer) {\n clearInterval(this.counterTimer);\n this.counterTimer = null;\n }\n this.wrapper?.remove();\n this.wrapper = null;\n }\n\n private createScreen(): void {\n this.remove();\n const o = this.options;\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-screen');\n wrapper.className = 'hp-redirect-screen';\n\n if (o.image) {\n const bg = document.createElement('img');\n bg.className = 'hp-redirect-bg';\n bg.src = o.image;\n bg.alt = '';\n bg.addEventListener('error', () => bg.remove());\n wrapper.appendChild(bg);\n }\n\n const panel = document.createElement('div');\n panel.className = 'hp-redirect-panel';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n label.textContent = o.label ?? this.ctx.i18n.redirectUpNext;\n panel.appendChild(label);\n\n const poster = document.createElement('button');\n poster.type = 'button';\n poster.className = 'hp-redirect-poster';\n poster.setAttribute('aria-label', this.ctx.i18n.redirectPlayNow);\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n poster.appendChild(t.el);\n poster.addEventListener('click', () => this.go('click'));\n panel.appendChild(poster);\n\n if (o.title) {\n const title = document.createElement('div');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n panel.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('div');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n panel.appendChild(sub);\n }\n\n const counter = document.createElement('div');\n counter.className = 'hp-redirect-counter';\n counter.setAttribute('aria-live', 'polite');\n panel.appendChild(counter);\n\n const actions = document.createElement('div');\n actions.className = 'hp-redirect-actions';\n const cancelBtn = document.createElement('button');\n cancelBtn.type = 'button';\n cancelBtn.className = 'hp-redirect-btn';\n cancelBtn.textContent = this.ctx.i18n.redirectCancel;\n const acceptBtn = document.createElement('button');\n acceptBtn.type = 'button';\n acceptBtn.className = 'hp-redirect-btn hp-redirect-btn-primary';\n acceptBtn.textContent = this.ctx.i18n.redirectPlayNow;\n acceptBtn.addEventListener('click', () => this.go('click'));\n cancelBtn.addEventListener('click', () => {\n this.remove();\n this.emit('cancel');\n if (o.suggestions?.length) this.showSuggestions(o.suggestions);\n });\n actions.append(cancelBtn, acceptBtn);\n panel.appendChild(actions);\n wrapper.appendChild(panel);\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n this.emit('shown');\n\n const total = Math.max(0, o.time);\n let remaining = total;\n const render = (): void => {\n counter.textContent = this.ctx.i18n.redirectCountdown(remaining);\n t.ring.set(total > 0 ? remaining / total : 0);\n };\n render();\n this.counterTimer = setInterval(() => {\n remaining--;\n if (remaining > 0) {\n render();\n return;\n }\n if (this.counterTimer) clearInterval(this.counterTimer);\n this.counterTimer = null;\n counter.textContent = this.ctx.i18n.redirectNowPlaying;\n t.ring.set(0);\n this.go('auto');\n }, 1000);\n }\n\n private showSuggestions(items: RedirectScreenSuggestion[]): void {\n this.remove();\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-suggestions');\n wrapper.className = 'hp-redirect-suggestions';\n for (const item of items) {\n const box = document.createElement('a');\n box.href = item.url;\n if (this.options.newTab) {\n box.target = '_blank';\n box.rel = 'noopener';\n }\n box.className = 'hp-redirect-suggestion';\n const t = thumb(item.image, item.duration, 'hp-redirect-thumb');\n t.el.querySelector('.hp-redirect-ring')?.remove();\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = item.title;\n box.append(t.el, title);\n wrapper.appendChild(box);\n }\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n}\n","import { RedirectScreen, type RedirectScreenPlayerContext } from './RedirectScreen';\nimport type { RedirectScreenOptions } from '../../types';\n\nexport function installRedirectScreen(ctx: RedirectScreenPlayerContext, options: RedirectScreenOptions): RedirectScreen {\n return new RedirectScreen(ctx, options);\n}\n\nexport { RedirectScreen };\nexport type { RedirectScreenPlayerContext };\n"],"names":["SVG_NS","RING_R","RING_C","DEFAULT_SHOW_BEFORE","ring","className","svg","track","bar","c","fraction","thumb","image","duration","el","img","r","play","createIcon","d","RedirectScreen","ctx","options","__publicField","v","showBefore","remaining","secs","_a","_b","state","reason","o","card","main","t","text","label","title","sub","action","close","ev","e","wrapper","bg","panel","poster","counter","actions","cancelBtn","acceptBtn","total","render","items","item","box","installRedirectScreen"],"mappings":"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"}
1
+ {"version":3,"file":"redirectScreen-BT_26-5g.js","sources":["../../src/plugins/redirect-screen/RedirectScreen.ts","../../src/plugins/redirect-screen/index.ts"],"sourcesContent":["import type { RedirectScreenOptions, RedirectScreenSuggestion } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\n\nexport interface RedirectScreenPlayerContext {\n /** hp:redirect olayları ve postroll'un bitişini (hp:adend) dinlemek için. */\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst RING_R = 18;\nconst RING_C = 2 * Math.PI * RING_R;\nconst DEFAULT_SHOW_BEFORE = 10;\n\n/** Dairesel geri sayım halkası (SVG) — `set(oran)` ile 1 → 0 boşalır. */\nfunction ring(className: string): { el: SVGSVGElement; set(fraction: number): void } {\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', '0 0 40 40');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('class', className);\n const track = document.createElementNS(SVG_NS, 'circle');\n const bar = document.createElementNS(SVG_NS, 'circle');\n for (const c of [track, bar]) {\n c.setAttribute('cx', '20');\n c.setAttribute('cy', '20');\n c.setAttribute('r', String(RING_R));\n }\n track.setAttribute('class', 'hp-redirect-ring-track');\n bar.setAttribute('class', 'hp-redirect-ring-bar');\n bar.setAttribute('stroke-dasharray', String(RING_C));\n svg.append(track, bar);\n return {\n el: svg,\n set: (fraction) => bar.setAttribute('stroke-dashoffset', String(RING_C * (1 - Math.min(1, Math.max(0, fraction))))),\n };\n}\n\n/** Görsel + süre rozeti + oynat ikonu + halka — kart ve tam ekran aynı parçayı kullanır. */\nfunction thumb(image: string | undefined, duration: string | undefined, className: string): { el: HTMLSpanElement; ring: ReturnType<typeof ring> } {\n const el = document.createElement('span');\n el.className = className;\n if (image) {\n const img = document.createElement('img');\n img.src = image;\n img.alt = '';\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const r = ring('hp-redirect-ring');\n const play = document.createElement('span');\n play.className = 'hp-redirect-play';\n play.appendChild(createIcon('play'));\n el.append(r.el, play);\n if (duration) {\n const d = document.createElement('span');\n d.className = 'hp-redirect-duration';\n d.textContent = duration;\n el.appendChild(d);\n }\n return { el, ring: r };\n}\n\n/**\n * Sıradaki videoya yönlendirme. İki mod:\n * - 'screen' (varsayılan): video bitince tam alan ekran + `time` sn geri sayım; iptal → öneriler.\n * - 'card': bitime `showBefore` sn kala köşede küçük \"Sıradaki\" kartı; geri sayım videoyla birlikte işler (duraklatınca\n * durur), video bitince yönlendirilir. Karta tıklamak hemen yönlendirir, X iptal eder.\n * Bitişte postroll oynuyorsa yönlendirme reklam bitene kadar bekler. `hp:redirect` (state: redirect) iptal edilirse\n * (`preventDefault`) sayfa değişmez.\n */\nexport class RedirectScreen {\n private counterTimer: ReturnType<typeof setInterval> | null = null;\n private wrapper: HTMLElement | null = null;\n private card: HTMLDivElement | null = null;\n private cardRing: ReturnType<typeof ring> | null = null;\n private cardLabel: HTMLSpanElement | null = null;\n private cancelled = false;\n private waitingForAd = false;\n private readonly mode: 'screen' | 'card';\n\n constructor(\n private readonly ctx: RedirectScreenPlayerContext,\n private readonly options: RedirectScreenOptions\n ) {\n this.mode = options.mode === 'card' ? 'card' : 'screen';\n if (options.enabled === false) return;\n ctx.videoEl.addEventListener('ended', this.onEnded);\n ctx.videoEl.addEventListener('play', this.onPlay);\n if (this.mode === 'card') ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n /** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */\n refreshLabels(): void {\n this.card?.querySelector('.hp-redirect-close')?.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('ended', this.onEnded);\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.remove();\n this.hideCard();\n }\n\n private emit(state: 'shown' | 'cancel' | 'redirect', reason?: 'auto' | 'click'): boolean {\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:redirect', { detail: { state, url: this.options.url, mode: this.mode, reason }, cancelable: state === 'redirect' })\n );\n }\n\n private go(reason: 'auto' | 'click'): void {\n this.remove();\n this.hideCard();\n if (!this.emit('redirect', reason)) return; // entegratör kendisi yönlendirecek\n if (this.options.newTab) window.open(this.options.url, '_blank', 'noopener');\n else window.location.href = this.options.url;\n }\n\n private readonly onPlay = (): void => {\n this.remove();\n };\n\n private readonly onEnded = (): void => {\n // Postroll oynuyorsa (ya da birazdan başlayacaksa) reklam bitince devam.\n if (this.ctx.isAdActive()) {\n this.waitForAd();\n return;\n }\n this.finish();\n };\n\n private waitForAd(): void {\n if (this.waitingForAd) return;\n this.waitingForAd = true;\n this.ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n }\n\n private readonly onAdEnd = (): void => {\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.waitingForAd = false;\n if (this.ctx.videoEl.ended) this.finish();\n };\n\n private finish(): void {\n if (this.mode === 'card') {\n this.hideCard();\n if (!this.cancelled) this.go('auto');\n else if (this.options.suggestions?.length) this.showSuggestions(this.options.suggestions);\n return;\n }\n this.createScreen();\n }\n\n // ── 'card' modu ─────────────────────────────────────────────────────────\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n const showBefore = Math.max(1, this.options.showBefore ?? DEFAULT_SHOW_BEFORE);\n const d = v.duration;\n if (!Number.isFinite(d) || d <= 0) return; // canlı yayında kart yok\n const remaining = d - v.currentTime;\n if (remaining > showBefore) {\n // Geri sarıldı (eşiğin belirgin üstüne): iptal unutulur — tekrar yaklaşınca kart yine gelir.\n if (remaining > showBefore + 1) this.cancelled = false;\n this.hideCard();\n return;\n }\n if (this.cancelled || this.ctx.isAdActive() || v.ended || remaining <= 0) {\n if (this.ctx.isAdActive()) this.hideCard();\n return;\n }\n if (!this.card) this.showCard();\n const secs = Math.ceil(remaining);\n this.cardRing?.set(remaining / showBefore);\n if (this.cardLabel) this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${secs}`;\n };\n\n private showCard(): void {\n const o = this.options;\n const card = document.createElement('div');\n card.className = 'hp-redirect-card';\n card.setAttribute('part', 'redirect-card');\n card.setAttribute('data-position', o.position ?? 'bottom-right');\n\n const main = document.createElement('button');\n main.type = 'button';\n main.className = 'hp-redirect-card-main';\n main.addEventListener('click', () => this.go('click'));\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n const text = document.createElement('span');\n text.className = 'hp-redirect-text';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n text.appendChild(label);\n if (o.title) {\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n text.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('span');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n text.appendChild(sub);\n }\n // Erişilebilir ad görünen metinden oluşur (\"Sıradaki · 4 Başlık Alt başlık\"); sonuna yalnızca ekran okuyucunun\n // duyduğu \"Şimdi oynat\" eklenir — görsel / süre rozeti okunmaz.\n t.el.setAttribute('aria-hidden', 'true');\n const action = document.createElement('span');\n action.className = 'hp-sr-only';\n action.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`;\n text.appendChild(action);\n main.append(t.el, text);\n\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-redirect-close';\n close.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => {\n this.cancelled = true;\n this.hideCard();\n this.emit('cancel');\n });\n\n card.append(main, close);\n // Karta dokunmak videoyu oynat / duraklat yapmasın.\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) card.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(card);\n this.card = card;\n this.cardRing = t.ring;\n this.cardLabel = label;\n this.emit('shown');\n }\n\n private hideCard(): void {\n this.card?.remove();\n this.card = null;\n this.cardRing = null;\n this.cardLabel = null;\n }\n\n // ── 'screen' modu ───────────────────────────────────────────────────────\n\n private remove(): void {\n if (this.counterTimer) {\n clearInterval(this.counterTimer);\n this.counterTimer = null;\n }\n this.wrapper?.remove();\n this.wrapper = null;\n }\n\n private createScreen(): void {\n this.remove();\n const o = this.options;\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-screen');\n wrapper.className = 'hp-redirect-screen';\n\n if (o.image) {\n const bg = document.createElement('img');\n bg.className = 'hp-redirect-bg';\n bg.src = o.image;\n bg.alt = '';\n bg.addEventListener('error', () => bg.remove());\n wrapper.appendChild(bg);\n }\n\n const panel = document.createElement('div');\n panel.className = 'hp-redirect-panel';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n label.textContent = o.label ?? this.ctx.i18n.redirectUpNext;\n panel.appendChild(label);\n\n const poster = document.createElement('button');\n poster.type = 'button';\n poster.className = 'hp-redirect-poster';\n poster.setAttribute('aria-label', this.ctx.i18n.redirectPlayNow);\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n poster.appendChild(t.el);\n poster.addEventListener('click', () => this.go('click'));\n panel.appendChild(poster);\n\n if (o.title) {\n const title = document.createElement('div');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n panel.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('div');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n panel.appendChild(sub);\n }\n\n const counter = document.createElement('div');\n counter.className = 'hp-redirect-counter';\n counter.setAttribute('aria-live', 'polite');\n panel.appendChild(counter);\n\n const actions = document.createElement('div');\n actions.className = 'hp-redirect-actions';\n const cancelBtn = document.createElement('button');\n cancelBtn.type = 'button';\n cancelBtn.className = 'hp-redirect-btn';\n cancelBtn.textContent = this.ctx.i18n.redirectCancel;\n const acceptBtn = document.createElement('button');\n acceptBtn.type = 'button';\n acceptBtn.className = 'hp-redirect-btn hp-redirect-btn-primary';\n acceptBtn.textContent = this.ctx.i18n.redirectPlayNow;\n acceptBtn.addEventListener('click', () => this.go('click'));\n cancelBtn.addEventListener('click', () => {\n this.remove();\n this.emit('cancel');\n if (o.suggestions?.length) this.showSuggestions(o.suggestions);\n });\n actions.append(cancelBtn, acceptBtn);\n panel.appendChild(actions);\n wrapper.appendChild(panel);\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n this.emit('shown');\n\n const total = Math.max(0, o.time);\n let remaining = total;\n const render = (): void => {\n counter.textContent = this.ctx.i18n.redirectCountdown(remaining);\n t.ring.set(total > 0 ? remaining / total : 0);\n };\n render();\n this.counterTimer = setInterval(() => {\n remaining--;\n if (remaining > 0) {\n render();\n return;\n }\n if (this.counterTimer) clearInterval(this.counterTimer);\n this.counterTimer = null;\n counter.textContent = this.ctx.i18n.redirectNowPlaying;\n t.ring.set(0);\n this.go('auto');\n }, 1000);\n }\n\n private showSuggestions(items: RedirectScreenSuggestion[]): void {\n this.remove();\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-suggestions');\n wrapper.className = 'hp-redirect-suggestions';\n for (const item of items) {\n const box = document.createElement('a');\n box.href = item.url;\n if (this.options.newTab) {\n box.target = '_blank';\n box.rel = 'noopener';\n }\n box.className = 'hp-redirect-suggestion';\n const t = thumb(item.image, item.duration, 'hp-redirect-thumb');\n t.el.querySelector('.hp-redirect-ring')?.remove();\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = item.title;\n box.append(t.el, title);\n wrapper.appendChild(box);\n }\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n}\n","import { RedirectScreen, type RedirectScreenPlayerContext } from './RedirectScreen';\nimport type { RedirectScreenOptions } from '../../types';\n\nexport function installRedirectScreen(ctx: RedirectScreenPlayerContext, options: RedirectScreenOptions): RedirectScreen {\n return new RedirectScreen(ctx, options);\n}\n\nexport { RedirectScreen };\nexport type { RedirectScreenPlayerContext };\n"],"names":["SVG_NS","RING_R","RING_C","DEFAULT_SHOW_BEFORE","ring","className","svg","track","bar","c","fraction","thumb","image","duration","el","img","r","play","createIcon","d","RedirectScreen","ctx","options","__publicField","v","showBefore","remaining","secs","_a","_b","state","reason","o","card","main","t","text","label","title","sub","action","close","ev","e","wrapper","bg","panel","poster","counter","actions","cancelBtn","acceptBtn","total","render","items","item","box","installRedirectScreen"],"mappings":";;;;AAaA,MAAMA,IAAS,8BACTC,IAAS,IACTC,IAAS,IAAI,KAAK,KAAKD,GACvBE,IAAsB;AAG5B,SAASC,EAAKC,GAAuE;AACjF,QAAMC,IAAM,SAAS,gBAAgBN,GAAQ,KAAK;AAClD,EAAAM,EAAI,aAAa,WAAW,WAAW,GACvCA,EAAI,aAAa,eAAe,MAAM,GACtCA,EAAI,aAAa,SAASD,CAAS;AACnC,QAAME,IAAQ,SAAS,gBAAgBP,GAAQ,QAAQ,GACjDQ,IAAM,SAAS,gBAAgBR,GAAQ,QAAQ;AACrD,aAAWS,KAAK,CAACF,GAAOC,CAAG;AACvB,IAAAC,EAAE,aAAa,MAAM,IAAI,GACzBA,EAAE,aAAa,MAAM,IAAI,GACzBA,EAAE,aAAa,KAAK,OAAOR,CAAM,CAAC;AAEtC,SAAAM,EAAM,aAAa,SAAS,wBAAwB,GACpDC,EAAI,aAAa,SAAS,sBAAsB,GAChDA,EAAI,aAAa,oBAAoB,OAAON,CAAM,CAAC,GACnDI,EAAI,OAAOC,GAAOC,CAAG,GACd;AAAA,IACH,IAAIF;AAAA,IACJ,KAAK,CAACI,MAAaF,EAAI,aAAa,qBAAqB,OAAON,KAAU,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGQ,CAAQ,CAAC,EAAE,CAAC;AAAA,EAAA;AAE1H;AAGA,SAASC,EAAMC,GAA2BC,GAA8BR,GAA2E;AAC/I,QAAMS,IAAK,SAAS,cAAc,MAAM;AAExC,MADAA,EAAG,YAAYT,GACXO,GAAO;AACP,UAAMG,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,MAAMH,GACVG,EAAI,MAAM,IACVA,EAAI,WAAW,SACfA,EAAI,iBAAiB,SAAS,MAAMA,EAAI,QAAQ,GAChDD,EAAG,YAAYC,CAAG;AAAA,EACtB;AACA,QAAMC,IAAIZ,EAAK,kBAAkB,GAC3Ba,IAAO,SAAS,cAAc,MAAM;AAI1C,MAHAA,EAAK,YAAY,oBACjBA,EAAK,YAAYC,EAAW,MAAM,CAAC,GACnCJ,EAAG,OAAOE,EAAE,IAAIC,CAAI,GAChBJ,GAAU;AACV,UAAMM,IAAI,SAAS,cAAc,MAAM;AACvC,IAAAA,EAAE,YAAY,wBACdA,EAAE,cAAcN,GAChBC,EAAG,YAAYK,CAAC;AAAA,EACpB;AACA,SAAO,EAAE,IAAAL,GAAI,MAAME,EAAA;AACvB;AAUO,MAAMI,EAAe;AAAA,EAUxB,YACqBC,GACAC,GACnB;AAZM,IAAAC,EAAA,sBAAsD;AACtD,IAAAA,EAAA,iBAA8B;AAC9B,IAAAA,EAAA,cAA8B;AAC9B,IAAAA,EAAA,kBAA2C;AAC3C,IAAAA,EAAA,mBAAoC;AACpC,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,sBAAe;AACN,IAAAA,EAAA;AA0CA,IAAAA,EAAA,gBAAS,MAAY;AAClC,WAAK,OAAA;AAAA,IACT;AAEiB,IAAAA,EAAA,iBAAU,MAAY;AAEnC,UAAI,KAAK,IAAI,cAAc;AACvB,aAAK,UAAA;AACL;AAAA,MACJ;AACA,WAAK,OAAA;AAAA,IACT;AAQiB,IAAAA,EAAA,iBAAU,MAAY;AACnC,WAAK,IAAI,OAAO,oBAAoB,YAAY,KAAK,OAAO,GAC5D,KAAK,eAAe,IAChB,KAAK,IAAI,QAAQ,cAAY,OAAA;AAAA,IACrC;AAciB;AAAA,IAAAA,EAAA,sBAAe,MAAY;;AACxC,YAAMC,IAAI,KAAK,IAAI,SACbC,IAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,cAActB,CAAmB,GACvEgB,IAAIK,EAAE;AACZ,UAAI,CAAC,OAAO,SAASL,CAAC,KAAKA,KAAK,EAAG;AACnC,YAAMO,IAAYP,IAAIK,EAAE;AACxB,UAAIE,IAAYD,GAAY;AAExB,QAAIC,IAAYD,IAAa,MAAG,KAAK,YAAY,KACjD,KAAK,SAAA;AACL;AAAA,MACJ;AACA,UAAI,KAAK,aAAa,KAAK,IAAI,gBAAgBD,EAAE,SAASE,KAAa,GAAG;AACtE,QAAI,KAAK,IAAI,WAAA,UAAmB,SAAA;AAChC;AAAA,MACJ;AACA,MAAK,KAAK,QAAM,KAAK,SAAA;AACrB,YAAMC,IAAO,KAAK,KAAKD,CAAS;AAChC,OAAAE,IAAA,KAAK,aAAL,QAAAA,EAAe,IAAIF,IAAYD,IAC3B,KAAK,cAAW,KAAK,UAAU,cAAc,GAAG,KAAK,QAAQ,SAAS,KAAK,IAAI,KAAK,cAAc,MAAME,CAAI;AAAA,IACpH;AA5FI,IAJiB,KAAA,MAAAN,GACA,KAAA,UAAAC,GAEjB,KAAK,OAAOA,EAAQ,SAAS,SAAS,SAAS,UAC3CA,EAAQ,YAAY,OACxBD,EAAI,QAAQ,iBAAiB,SAAS,KAAK,OAAO,GAClDA,EAAI,QAAQ,iBAAiB,QAAQ,KAAK,MAAM,GAC5C,KAAK,SAAS,UAAQA,EAAI,QAAQ,iBAAiB,cAAc,KAAK,YAAY;AAAA,EAC1F;AAAA;AAAA,EAGA,gBAAsB;;AAClB,KAAAQ,KAAAD,IAAA,KAAK,SAAL,gBAAAA,EAAW,cAAc,0BAAzB,QAAAC,EAAgD,aAAa,cAAc,KAAK,IAAI,KAAK;AAAA,EAC7F;AAAA,EAEA,UAAgB;AACZ,UAAML,IAAI,KAAK,IAAI;AACnB,IAAAA,EAAE,oBAAoB,SAAS,KAAK,OAAO,GAC3CA,EAAE,oBAAoB,QAAQ,KAAK,MAAM,GACzCA,EAAE,oBAAoB,cAAc,KAAK,YAAY,GACrD,KAAK,IAAI,OAAO,oBAAoB,YAAY,KAAK,OAAO,GAC5D,KAAK,OAAA,GACL,KAAK,SAAA;AAAA,EACT;AAAA,EAEQ,KAAKM,GAAwCC,GAAoC;AACrF,WAAO,KAAK,IAAI,OAAO;AAAA,MACnB,IAAI,YAAY,eAAe,EAAE,QAAQ,EAAE,OAAAD,GAAO,KAAK,KAAK,QAAQ,KAAK,MAAM,KAAK,MAAM,QAAAC,EAAA,GAAU,YAAYD,MAAU,YAAY;AAAA,IAAA;AAAA,EAE9I;AAAA,EAEQ,GAAGC,GAAgC;AAGvC,IAFA,KAAK,OAAA,GACL,KAAK,SAAA,GACA,KAAK,KAAK,YAAYA,CAAM,MAC7B,KAAK,QAAQ,SAAQ,OAAO,KAAK,KAAK,QAAQ,KAAK,UAAU,UAAU,IACtE,OAAO,SAAS,OAAO,KAAK,QAAQ;AAAA,EAC7C;AAAA,EAeQ,YAAkB;AACtB,IAAI,KAAK,iBACT,KAAK,eAAe,IACpB,KAAK,IAAI,OAAO,iBAAiB,YAAY,KAAK,OAAO;AAAA,EAC7D;AAAA,EAQQ,SAAe;;AACnB,QAAI,KAAK,SAAS,QAAQ;AACtB,WAAK,SAAA,GACA,KAAK,aACDH,IAAA,KAAK,QAAQ,gBAAb,QAAAA,EAA0B,eAAa,gBAAgB,KAAK,QAAQ,WAAW,IADnE,KAAK,GAAG,MAAM;AAEnC;AAAA,IACJ;AACA,SAAK,aAAA;AAAA,EACT;AAAA,EA0BQ,WAAiB;AACrB,UAAMI,IAAI,KAAK,SACTC,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY,oBACjBA,EAAK,aAAa,QAAQ,eAAe,GACzCA,EAAK,aAAa,iBAAiBD,EAAE,YAAY,cAAc;AAE/D,UAAME,IAAO,SAAS,cAAc,QAAQ;AAC5C,IAAAA,EAAK,OAAO,UACZA,EAAK,YAAY,yBACjBA,EAAK,iBAAiB,SAAS,MAAM,KAAK,GAAG,OAAO,CAAC;AACrD,UAAMC,IAAIxB,EAAMqB,EAAE,OAAOA,EAAE,UAAU,mBAAmB,GAClDI,IAAO,SAAS,cAAc,MAAM;AAC1C,IAAAA,EAAK,YAAY;AACjB,UAAMC,IAAQ,SAAS,cAAc,MAAM;AAG3C,QAFAA,EAAM,YAAY,qBAClBD,EAAK,YAAYC,CAAK,GAClBL,EAAE,OAAO;AACT,YAAMM,IAAQ,SAAS,cAAc,MAAM;AAC3C,MAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAcN,EAAE,OACtBI,EAAK,YAAYE,CAAK;AAAA,IAC1B;AACA,QAAIN,EAAE,UAAU;AACZ,YAAMO,IAAM,SAAS,cAAc,MAAM;AACzC,MAAAA,EAAI,YAAY,mBAChBA,EAAI,cAAcP,EAAE,UACpBI,EAAK,YAAYG,CAAG;AAAA,IACxB;AAGA,IAAAJ,EAAE,GAAG,aAAa,eAAe,MAAM;AACvC,UAAMK,IAAS,SAAS,cAAc,MAAM;AAC5C,IAAAA,EAAO,YAAY,cACnBA,EAAO,cAAc,MAAM,KAAK,IAAI,KAAK,eAAe,IACxDJ,EAAK,YAAYI,CAAM,GACvBN,EAAK,OAAOC,EAAE,IAAIC,CAAI;AAEtB,UAAMK,IAAQ,SAAS,cAAc,QAAQ;AAC7C,IAAAA,EAAM,OAAO,UACbA,EAAM,YAAY,qBAClBA,EAAM,aAAa,cAAc,KAAK,IAAI,KAAK,kBAAkB,GACjEA,EAAM,YAAYvB,EAAW,OAAO,CAAC,GACrCuB,EAAM,iBAAiB,SAAS,MAAM;AAClC,WAAK,YAAY,IACjB,KAAK,SAAA,GACL,KAAK,KAAK,QAAQ;AAAA,IACtB,CAAC,GAEDR,EAAK,OAAOC,GAAMO,CAAK;AAEvB,eAAWC,KAAM,CAAC,eAAe,SAAS,UAAU,EAAY,CAAAT,EAAK,iBAAiBS,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AACpH,SAAK,IAAI,mBAAmB,YAAYV,CAAI,GAC5C,KAAK,OAAOA,GACZ,KAAK,WAAWE,EAAE,MAClB,KAAK,YAAYE,GACjB,KAAK,KAAK,OAAO;AAAA,EACrB;AAAA,EAEQ,WAAiB;;AACrB,KAAAT,IAAA,KAAK,SAAL,QAAAA,EAAW,UACX,KAAK,OAAO,MACZ,KAAK,WAAW,MAChB,KAAK,YAAY;AAAA,EACrB;AAAA;AAAA,EAIQ,SAAe;;AACnB,IAAI,KAAK,iBACL,cAAc,KAAK,YAAY,GAC/B,KAAK,eAAe,QAExBA,IAAA,KAAK,YAAL,QAAAA,EAAc,UACd,KAAK,UAAU;AAAA,EACnB;AAAA,EAEQ,eAAqB;AACzB,SAAK,OAAA;AACL,UAAMI,IAAI,KAAK,SACTY,IAAU,SAAS,cAAc,KAAK;AAI5C,QAHAA,EAAQ,aAAa,QAAQ,iBAAiB,GAC9CA,EAAQ,YAAY,sBAEhBZ,EAAE,OAAO;AACT,YAAMa,IAAK,SAAS,cAAc,KAAK;AACvC,MAAAA,EAAG,YAAY,kBACfA,EAAG,MAAMb,EAAE,OACXa,EAAG,MAAM,IACTA,EAAG,iBAAiB,SAAS,MAAMA,EAAG,QAAQ,GAC9CD,EAAQ,YAAYC,CAAE;AAAA,IAC1B;AAEA,UAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY;AAClB,UAAMT,IAAQ,SAAS,cAAc,MAAM;AAC3C,IAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAcL,EAAE,SAAS,KAAK,IAAI,KAAK,gBAC7Cc,EAAM,YAAYT,CAAK;AAEvB,UAAMU,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,OAAO,UACdA,EAAO,YAAY,sBACnBA,EAAO,aAAa,cAAc,KAAK,IAAI,KAAK,eAAe;AAC/D,UAAMZ,IAAIxB,EAAMqB,EAAE,OAAOA,EAAE,UAAU,mBAAmB;AAKxD,QAJAe,EAAO,YAAYZ,EAAE,EAAE,GACvBY,EAAO,iBAAiB,SAAS,MAAM,KAAK,GAAG,OAAO,CAAC,GACvDD,EAAM,YAAYC,CAAM,GAEpBf,EAAE,OAAO;AACT,YAAMM,IAAQ,SAAS,cAAc,KAAK;AAC1C,MAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAcN,EAAE,OACtBc,EAAM,YAAYR,CAAK;AAAA,IAC3B;AACA,QAAIN,EAAE,UAAU;AACZ,YAAMO,IAAM,SAAS,cAAc,KAAK;AACxC,MAAAA,EAAI,YAAY,mBAChBA,EAAI,cAAcP,EAAE,UACpBc,EAAM,YAAYP,CAAG;AAAA,IACzB;AAEA,UAAMS,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY,uBACpBA,EAAQ,aAAa,aAAa,QAAQ,GAC1CF,EAAM,YAAYE,CAAO;AAEzB,UAAMC,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY;AACpB,UAAMC,IAAY,SAAS,cAAc,QAAQ;AACjD,IAAAA,EAAU,OAAO,UACjBA,EAAU,YAAY,mBACtBA,EAAU,cAAc,KAAK,IAAI,KAAK;AACtC,UAAMC,IAAY,SAAS,cAAc,QAAQ;AACjD,IAAAA,EAAU,OAAO,UACjBA,EAAU,YAAY,2CACtBA,EAAU,cAAc,KAAK,IAAI,KAAK,iBACtCA,EAAU,iBAAiB,SAAS,MAAM,KAAK,GAAG,OAAO,CAAC,GAC1DD,EAAU,iBAAiB,SAAS,MAAM;;AACtC,WAAK,OAAA,GACL,KAAK,KAAK,QAAQ,IACdtB,IAAAI,EAAE,gBAAF,QAAAJ,EAAe,UAAQ,KAAK,gBAAgBI,EAAE,WAAW;AAAA,IACjE,CAAC,GACDiB,EAAQ,OAAOC,GAAWC,CAAS,GACnCL,EAAM,YAAYG,CAAO,GACzBL,EAAQ,YAAYE,CAAK;AAEzB,eAAWJ,KAAM,CAAC,eAAe,SAAS,UAAU,EAAY,CAAAE,EAAQ,iBAAiBF,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AACvH,SAAK,IAAI,mBAAmB,YAAYC,CAAO,GAC/C,KAAK,UAAUA,GACf,KAAK,KAAK,OAAO;AAEjB,UAAMQ,IAAQ,KAAK,IAAI,GAAGpB,EAAE,IAAI;AAChC,QAAIN,IAAY0B;AAChB,UAAMC,IAAS,MAAY;AACvB,MAAAL,EAAQ,cAAc,KAAK,IAAI,KAAK,kBAAkBtB,CAAS,GAC/DS,EAAE,KAAK,IAAIiB,IAAQ,IAAI1B,IAAY0B,IAAQ,CAAC;AAAA,IAChD;AACA,IAAAC,EAAA,GACA,KAAK,eAAe,YAAY,MAAM;AAElC,UADA3B,KACIA,IAAY,GAAG;AACf,QAAA2B,EAAA;AACA;AAAA,MACJ;AACA,MAAI,KAAK,gBAAc,cAAc,KAAK,YAAY,GACtD,KAAK,eAAe,MACpBL,EAAQ,cAAc,KAAK,IAAI,KAAK,oBACpCb,EAAE,KAAK,IAAI,CAAC,GACZ,KAAK,GAAG,MAAM;AAAA,IAClB,GAAG,GAAI;AAAA,EACX;AAAA,EAEQ,gBAAgBmB,GAAyC;;AAC7D,SAAK,OAAA;AACL,UAAMV,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,aAAa,QAAQ,sBAAsB,GACnDA,EAAQ,YAAY;AACpB,eAAWW,KAAQD,GAAO;AACtB,YAAME,IAAM,SAAS,cAAc,GAAG;AACtC,MAAAA,EAAI,OAAOD,EAAK,KACZ,KAAK,QAAQ,WACbC,EAAI,SAAS,UACbA,EAAI,MAAM,aAEdA,EAAI,YAAY;AAChB,YAAMrB,IAAIxB,EAAM4C,EAAK,OAAOA,EAAK,UAAU,mBAAmB;AAC9D,OAAA3B,IAAAO,EAAE,GAAG,cAAc,mBAAmB,MAAtC,QAAAP,EAAyC;AACzC,YAAMU,IAAQ,SAAS,cAAc,MAAM;AAC3C,MAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAciB,EAAK,OACzBC,EAAI,OAAOrB,EAAE,IAAIG,CAAK,GACtBM,EAAQ,YAAYY,CAAG;AAAA,IAC3B;AACA,eAAWd,KAAM,CAAC,eAAe,SAAS,UAAU,EAAY,CAAAE,EAAQ,iBAAiBF,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AACvH,SAAK,IAAI,mBAAmB,YAAYC,CAAO,GAC/C,KAAK,UAAUA;AAAA,EACnB;AACJ;AC3XO,SAASa,EAAsBpC,GAAkCC,GAAgD;AACpH,SAAO,IAAIF,EAAeC,GAAKC,CAAO;AAC1C;"}
@@ -1,7 +1,7 @@
1
1
  var y = Object.defineProperty;
2
2
  var x = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
3
  var u = (r, t, e) => x(r, typeof t != "symbol" ? t + "" : t, e);
4
- import { L as E } from "./player-BVkwkn4b.js";
4
+ import { L as E } from "./player-DV4Hf5Cw.js";
5
5
  const k = "https://securepubads.g.doubleclick.net/tag/js/gpt.js";
6
6
  let b = null;
7
7
  function C() {
@@ -261,4 +261,4 @@ export {
261
261
  K as RewardedUnlock,
262
262
  R as installRewardedUnlock
263
263
  };
264
- //# sourceMappingURL=rewardedUnlock-Cn4_68a3.js.map
264
+ //# sourceMappingURL=rewardedUnlock-jFOdzfSq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rewardedUnlock-Cn4_68a3.js","sources":["../../src/plugins/rewarded/gpt.ts","../../src/plugins/rewarded/RewardedUnlock.ts","../../src/plugins/rewarded/index.ts"],"sourcesContent":["import type { RewardedResult } from '../../types';\n\n/** Google Publisher Tag'in kullanılan yüzeyi (minimal tipler). */\ninterface GptSlot {\n addService(service: unknown): GptSlot;\n}\ninterface GptEvent {\n slot: GptSlot;\n isEmpty?: boolean;\n makeRewardedVisible?: () => boolean | void;\n}\ninterface GptPubAds {\n addEventListener(type: string, listener: (e: GptEvent) => void): void;\n removeEventListener?(type: string, listener: (e: GptEvent) => void): void;\n}\ninterface GoogleTag {\n cmd: Array<() => void> | { push(fn: () => void): void };\n apiReady?: boolean;\n enums: { OutOfPageFormat: { REWARDED: unknown } };\n pubads(): GptPubAds;\n defineOutOfPageSlot(path: string, format: unknown): GptSlot | null;\n enableServices(): void;\n display(slot: GptSlot): void;\n destroySlots(slots: GptSlot[]): void;\n}\n\n/** Google'ın güncel örneklerindeki adres (eski securepagead2 adresi bazı ağlarda sertifika hatası veriyordu). */\nconst GPT_SRC = 'https://securepubads.g.doubleclick.net/tag/js/gpt.js';\nlet gptLoading: Promise<void> | null = null;\n\n/** GPT sayfada yoksa yükler; sayfa GPT'yi (hangi adresten olursa olsun) zaten yüklüyorsa onu paylaşır. */\nfunction loadGpt(): Promise<void> {\n const w = window as unknown as { googletag?: Partial<GoogleTag> };\n w.googletag ??= { cmd: [] } as Partial<GoogleTag>;\n w.googletag.cmd ??= [];\n if (w.googletag.apiReady || document.querySelector('script[src*=\"/tag/js/gpt.js\"]')) return Promise.resolve();\n gptLoading ??= new Promise<void>((resolve, reject) => {\n const s = document.createElement('script');\n s.async = true;\n s.src = GPT_SRC;\n s.onload = () => resolve();\n s.onerror = () => {\n gptLoading = null;\n s.remove();\n reject(new Error('gpt.js could not be loaded (ad blocker / network / certificate)'));\n };\n document.head.appendChild(s);\n });\n return gptLoading;\n}\n\n/**\n * GPT web rewarded akışı (Google'ın örneğiyle aynı): slot tanımla → display → `rewardedSlotReady` gelince göster →\n * `rewardedSlotGranted` ödül → `rewardedSlotClosed` kapandı → slotu yok et. Kullanıcı onayı bu fonksiyon çağrılmadan\n * ÖNCE alınmış olmalı (player'ın onay penceresi).\n *\n * `timeoutMs` betiğin yüklenmesi DAHİL en baştan sayar: GPT hiç yüklenemez ya da çalışmazsa (engelleyici, ağ,\n * sertifika) da 'nofill' döner — bekleme ekranı asla takılı kalmaz. `signal` iptal edilirse (kullanıcı \"Vazgeç\") slot\n * temizlenip 'closed' döner. Reklam görünür olduktan sonra zaman aşımı işlemez; kapanışı GPT bildirir.\n */\nexport function showGptRewarded(adUnitPath: string, timeoutMs: number, signal?: AbortSignal): Promise<RewardedResult> {\n return new Promise<RewardedResult>((resolve) => {\n let done = false;\n let granted = false;\n let videoCompleted = false;\n let slot: GptSlot | null = null;\n let googletag: GoogleTag | null = null;\n const listeners: Array<[string, (e: GptEvent) => void]> = [];\n\n const finish = (result: RewardedResult): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n if (googletag) {\n const pubads = googletag.pubads();\n for (const [type, fn] of listeners) pubads.removeEventListener?.(type, fn);\n if (slot) {\n try {\n googletag.destroySlots([slot]);\n } catch {\n /* zaten yok edildi */\n }\n }\n }\n resolve(result);\n };\n const onAbort = (): void => finish('closed');\n const timer = setTimeout(() => finish('nofill'), timeoutMs);\n if (signal?.aborted) {\n finish('closed');\n return;\n }\n signal?.addEventListener('abort', onAbort);\n\n loadGpt()\n .then(() => {\n if (done) return;\n const gt = (window as unknown as { googletag: GoogleTag }).googletag;\n gt.cmd.push(() => {\n if (done) return;\n googletag = gt;\n slot = gt.defineOutOfPageSlot(adUnitPath, gt.enums.OutOfPageFormat.REWARDED);\n // null: sayfa formatı desteklemiyor (ör. mobil uyumlu viewport yok) — reklam yok sayılır.\n if (!slot) {\n finish('nofill');\n return;\n }\n slot.addService(gt.pubads());\n const pubads = gt.pubads();\n const on = (type: string, fn: (e: GptEvent) => void): void => {\n listeners.push([type, fn]);\n pubads.addEventListener(type, fn);\n };\n on('rewardedSlotReady', (e) => {\n if (e.slot !== slot || done) return;\n // Reklam hazır: artık bekleme yok — kapanışı GPT bildirecek.\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n e.makeRewardedVisible?.();\n });\n // Google: \"You need to close out ads rather than relying on GPT to do so.\" — ödül verilip video reklam\n // sonuna kadar oynayınca reklam player tarafından kapatılır (slot yok edilir); kullanıcı X'e basmak\n // zorunda kalmaz. Ödülü video bitmeden veren reklamlarda kapanış video bitince olur.\n on('rewardedSlotGranted', (e) => {\n if (e.slot !== slot) return;\n granted = true;\n if (videoCompleted) finish('granted');\n });\n on('rewardedSlotVideoCompleted', (e) => {\n if (e.slot !== slot) return;\n videoCompleted = true;\n if (granted) finish('granted');\n });\n on('rewardedSlotClosed', (e) => {\n if (e.slot === slot) finish(granted ? 'granted' : 'closed');\n });\n on('slotRenderEnded', (e) => {\n if (e.slot === slot && e.isEmpty) finish('nofill');\n });\n gt.enableServices();\n gt.display(slot);\n });\n })\n .catch(() => finish('nofill'));\n });\n}\n","import type { RewardedResult, RewardedUnlockOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { LOCK_SVG } from '../../controls/SettingsMenu';\nimport { showGptRewarded } from './gpt';\n\nexport interface RewardedUnlockContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Onay penceresinin ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n /** Buton kontrollerle birlikte görünüp gizlensin diye kontrol katmanına eklenir. */\n chromeEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; details?: Record<string, string | number | boolean | undefined> }): void;\n play(): void;\n exitFullscreen(): void;\n /** Kilitli kalitelerin en yükseği (ör. \"1080p\") — yoksa null (buton gizlenir). */\n lockedQualityLabel(): string | null;\n /** İçeriğin kimliği (kaynak listesi) — kalite değişince değişmez, başka video yüklenince değişir. */\n contentKey(): string;\n /** Kilit açıldı / geri geldi: player menüleri yeniden kurar; `upgrade` → en iyi kaliteye geç. */\n onLockChange(upgrade: boolean): void;\n}\n\nconst DEFAULT_MAX_FREE_HEIGHT = 480;\nconst DEFAULT_STORAGE_KEY = 'hope-rewarded-unlock';\nconst DEFAULT_GPT_TIMEOUT_MS = 8000;\nconst TOAST_MS = 2600;\n\ntype Phase = 'idle' | 'prompt' | 'loading' | 'nofill';\n\n/**\n * Ödüllü reklamla kalite kilidi. Akış (Google'ın ödüllü reklam politikasına göre): kullanıcı kilitli bir kaliteye ya da\n * \"Yüksek kaliteyi aç\" butonuna dokunur → ödülü açıkça yazan onay penceresi → yalnızca \"Reklamı izle\" ile reklam istenir\n * → ödül verildiyse kilit açılır. Vazgeçmek videoyu izlemeyi engellemez (düşük kalitede devam eder).\n */\n/** Diyalog başlık id'leri — aynı sayfada birden çok player olabilir. */\nlet dialogSeq = 0;\n\nexport class RewardedUnlock {\n private options: RewardedUnlockOptions;\n private readonly button: HTMLButtonElement;\n private dialog: HTMLDivElement | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private phase: Phase = 'idle';\n /** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */\n private videoUnlockedKey: string | null = null;\n private lastKey = '';\n\n constructor(\n private readonly ctx: RewardedUnlockContext,\n options: RewardedUnlockOptions\n ) {\n this.options = options;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-rw-button';\n btn.setAttribute('part', 'rewarded-button');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.requestUnlock();\n });\n btn.addEventListener('pointerdown', (e) => e.stopPropagation());\n ctx.chromeEl.appendChild(btn);\n this.button = btn;\n ctx.videoEl.addEventListener('loadstart', this.onSourceChange);\n this.refreshLabels();\n this.onQualitiesChanged();\n }\n\n update(options: RewardedUnlockOptions): void {\n const before = this.unlocked;\n this.options = options;\n if (before !== this.unlocked) this.ctx.onLockChange(false);\n this.onQualitiesChanged();\n }\n\n // ── Kilit durumu ────────────────────────────────────────────────────\n\n private get maxFreeHeight(): number {\n const h = this.options.maxFreeHeight;\n return typeof h === 'number' && h > 0 ? h : DEFAULT_MAX_FREE_HEIGHT;\n }\n\n private get storageKey(): string {\n return this.options.storageKey || DEFAULT_STORAGE_KEY;\n }\n\n private get unlockFor(): 'video' | 'session' | number {\n const u = this.options.unlockFor;\n return typeof u === 'number' && u > 0 ? u : u === 'video' ? 'video' : 'session';\n }\n\n get unlocked(): boolean {\n const mode = this.unlockFor;\n if (mode === 'video') return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();\n try {\n if (mode === 'session') return sessionStorage.getItem(this.storageKey) === '1';\n const until = Number(localStorage.getItem(this.storageKey));\n return Number.isFinite(until) && until > Date.now();\n } catch {\n return false; // depolama kapalı (gizli mod vb.)\n }\n }\n\n private grant(): void {\n const mode = this.unlockFor;\n if (mode === 'video') this.videoUnlockedKey = this.ctx.contentKey();\n try {\n if (mode === 'session') sessionStorage.setItem(this.storageKey, '1');\n else if (typeof mode === 'number') localStorage.setItem(this.storageKey, String(Date.now() + mode * 60_000));\n } catch {\n // Depolama yoksa yalnızca bu video için açık kalır.\n this.videoUnlockedKey = this.ctx.contentKey();\n }\n }\n\n /** Player için: bu yükseklikteki kalite kilitli mi? */\n isLocked(height: number | null): boolean {\n if (this.unlocked) return false;\n return height !== null && height > this.maxFreeHeight;\n }\n\n /** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */\n private readonly onSourceChange = (): void => {\n const key = this.ctx.contentKey();\n if (key === this.lastKey) return;\n this.lastKey = key;\n this.onQualitiesChanged();\n };\n\n /** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */\n onQualitiesChanged(): void {\n const label = this.ctx.lockedQualityLabel();\n const show = this.options.button !== false && !!label && !this.unlocked;\n this.button.hidden = !show;\n if (!show) return;\n const text = this.fill(this.ctx.i18n.rewardedButton, label!);\n this.button.innerHTML = `${LOCK_SVG}<span>${escapeHtml(text)}</span>`;\n // Erişilebilir ad görünen metinle aynı (sesli komutla \"720p kilidini aç\" dendiğinde bulunabilsin).\n this.button.setAttribute('aria-label', text);\n }\n\n // ── Akış ────────────────────────────────────────────────────────────\n\n /** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */\n requestUnlock(): void {\n if (this.unlocked || this.phase !== 'idle') return;\n const label = this.ctx.lockedQualityLabel() ?? 'HD';\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedprompt', { detail: { quality: label } }));\n this.showDialog('prompt', label);\n }\n\n private async watch(label: string): Promise<void> {\n const v = this.ctx.videoEl;\n const wasPlaying = !v.paused;\n v.pause();\n // GPT reklamı sayfanın kendi katmanında açılır — player tam ekrandaysa görünmez.\n this.ctx.exitFullscreen();\n this.abort = new AbortController();\n const signal = this.abort.signal;\n this.showDialog('loading', label);\n let result: RewardedResult;\n try {\n result = await this.runProvider(signal);\n } catch (err) {\n this.ctx.log({ message: `Rewarded ad failed: ${String(err)}` });\n result = 'nofill';\n }\n this.abort = null;\n // Kullanıcı hazırlanırken \"Vazgeç\" dedi — sonuç ne olursa olsun ödül yok, video devam eder.\n if (signal.aborted) {\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, cancelled: true } }));\n if (wasPlaying) this.ctx.play();\n return;\n }\n // Reklam yok / boş / hata: kusur kullanıcıda değil — varsayılan olarak kilit yine de açılır (grantOnNoFill: false kapatır).\n let noAd = false;\n if (result === 'nofill' && this.options.grantOnNoFill !== false) {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: true } }));\n result = 'granted';\n noAd = true;\n }\n if (result === 'granted') {\n this.grant();\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedgranted', { detail: { quality: label, noAd } }));\n this.ctx.onLockChange(true);\n this.onQualitiesChanged();\n this.showToast(this.fill(noAd ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, label));\n if (wasPlaying) this.ctx.play();\n return;\n }\n if (result === 'nofill') {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / unsupported page / timeout)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: false } }));\n this.showDialog('nofill', label);\n this.resumeAfterDialog = wasPlaying;\n return;\n }\n // Kullanıcı reklamı ödül kazanmadan kapattı — video kaldığı kalitede devam eder.\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false } }));\n if (wasPlaying) this.ctx.play();\n }\n\n private resumeAfterDialog = false;\n /** Reklam hazırlanırken \"Vazgeç\" — sağlayıcıya iletilir (GPT slotu temizlenir). */\n private abort: AbortController | null = null;\n\n private async runProvider(signal: AbortSignal): Promise<RewardedResult> {\n const p = this.options.provider;\n if (p?.type === 'gpt') return showGptRewarded(p.adUnitPath, p.timeoutMs ?? DEFAULT_GPT_TIMEOUT_MS, signal);\n if (p?.type === 'custom') {\n // İptal edilirse kendi reklam sisteminizin sonucu beklenmez (sinyali kendi tarafınızda da dinleyebilirsiniz).\n const aborted = new Promise<RewardedResult>((resolve) => signal.addEventListener('abort', () => resolve('closed'), { once: true }));\n const r = await Promise.race([p.show({ signal }), aborted]);\n return r === true ? 'granted' : r === false ? 'closed' : r;\n }\n throw new Error('rewardedUnlock.provider is missing');\n }\n\n // ── Arayüz ─────────────────────────────────────────────────────────\n\n private fill(template: string, quality: string): string {\n const mode = this.unlockFor;\n const i = this.ctx.i18n;\n const duration =\n mode === 'video' ? i.rewardedForVideo : mode === 'session' ? i.rewardedForSession : i.rewardedForMinutes.replace('{n}', String(mode));\n return template.replace('{quality}', quality).replace('{duration}', duration);\n }\n\n private showDialog(phase: Exclude<Phase, 'idle'>, label: string): void {\n this.phase = phase;\n const i = this.ctx.i18n;\n if (!this.dialog) {\n const d = document.createElement('div');\n d.className = 'hp-rw-dialog';\n d.setAttribute('part', 'rewarded-dialog');\n d.setAttribute('role', 'dialog');\n d.setAttribute('aria-modal', 'true');\n for (const t of ['click', 'pointerdown', 'dblclick'] as const) d.addEventListener(t, (e) => e.stopPropagation());\n d.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key !== 'Escape') return;\n if (this.phase === 'loading') this.abort?.abort();\n else this.dismiss();\n });\n this.ctx.overlayEl.appendChild(d);\n this.dialog = d;\n }\n const d = this.dialog;\n d.setAttribute('data-phase', phase);\n d.innerHTML = '';\n const card = document.createElement('div');\n card.className = 'hp-rw-card';\n const icon = document.createElement('div');\n icon.className = 'hp-rw-icon';\n icon.innerHTML = LOCK_SVG;\n const title = document.createElement('div');\n title.className = 'hp-rw-title';\n // Diyaloğun erişilebilir adı başlığı (ekran okuyucu \"720p kilidini aç\" diye okur).\n title.id = `hp-rw-title-${++dialogSeq}`;\n d.setAttribute('aria-labelledby', title.id);\n const text = document.createElement('div');\n text.className = 'hp-rw-text';\n const actions = document.createElement('div');\n actions.className = 'hp-rw-actions';\n card.append(icon, title, text, actions);\n d.appendChild(card);\n\n const button = (labelText: string, primary: boolean, onClick: () => void): HTMLButtonElement => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = primary ? 'hp-rw-btn hp-rw-btn-primary' : 'hp-rw-btn';\n b.textContent = labelText;\n b.addEventListener('click', onClick);\n actions.appendChild(b);\n return b;\n };\n\n if (phase === 'prompt') {\n title.textContent = this.fill(i.rewardedTitle, label);\n // Ödül, reklamdan ÖNCE açıkça yazılır (politika şartı).\n text.textContent = this.fill(i.rewardedBody, label);\n button(i.rewardedDecline, false, () => this.dismiss());\n button(i.rewardedWatch, true, () => void this.watch(label)).focus();\n } else if (phase === 'loading') {\n title.textContent = i.rewardedLoading;\n const spin = document.createElement('div');\n spin.className = 'hp-rw-spinner';\n text.appendChild(spin);\n // Hazırlanma ne kadar sürerse sürsün kullanıcı takılı kalmaz.\n button(i.rewardedDecline, false, () => this.abort?.abort());\n } else {\n title.textContent = this.fill(i.rewardedTitle, label);\n text.textContent = i.rewardedNoFill;\n button(i.rewardedOk, true, () => this.dismiss()).focus();\n }\n }\n\n private dismiss(): void {\n const wasNoFill = this.phase === 'nofill';\n this.closeDialog();\n if (!wasNoFill) this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, declined: true } }));\n if (this.resumeAfterDialog) this.ctx.play();\n this.resumeAfterDialog = false;\n }\n\n private closeDialog(): void {\n this.phase = 'idle';\n this.dialog?.remove();\n this.dialog = null;\n }\n\n private showToast(message: string): void {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n const t = document.createElement('div');\n t.className = 'hp-rw-toast';\n t.setAttribute('part', 'rewarded-toast');\n t.setAttribute('role', 'status');\n t.textContent = message;\n this.ctx.overlayEl.appendChild(t);\n this.toast = t;\n this.toastTimer = setTimeout(() => {\n this.toast?.remove();\n this.toast = null;\n }, TOAST_MS);\n }\n\n refreshLabels(): void {\n this.onQualitiesChanged();\n }\n\n destroy(): void {\n this.abort?.abort();\n this.ctx.videoEl.removeEventListener('loadstart', this.onSourceChange);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n this.closeDialog();\n this.button.remove();\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!);\n}\n","import { RewardedUnlock, type RewardedUnlockContext } from './RewardedUnlock';\nimport type { RewardedUnlockOptions } from '../../types';\n\n/** Ödüllü reklamla kalite kilidini kurar. */\nexport function installRewardedUnlock(ctx: RewardedUnlockContext, options: RewardedUnlockOptions): RewardedUnlock {\n return new RewardedUnlock(ctx, options);\n}\n\nexport { RewardedUnlock };\nexport type { RewardedUnlockContext };\n"],"names":["GPT_SRC","gptLoading","loadGpt","w","_a","resolve","reject","showGptRewarded","adUnitPath","timeoutMs","signal","done","granted","videoCompleted","slot","googletag","listeners","finish","result","timer","onAbort","pubads","type","fn","gt","on","e","DEFAULT_MAX_FREE_HEIGHT","DEFAULT_STORAGE_KEY","DEFAULT_GPT_TIMEOUT_MS","TOAST_MS","dialogSeq","RewardedUnlock","ctx","options","__publicField","key","btn","before","h","u","mode","until","height","label","show","text","LOCK_SVG","escapeHtml","v","wasPlaying","err","noAd","p","aborted","r","template","quality","i","duration","phase","d","t","card","icon","title","actions","button","labelText","primary","onClick","b","spin","wasNoFill","message","_b","s","c","installRewardedUnlock"],"mappings":"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"}
1
+ {"version":3,"file":"rewardedUnlock-jFOdzfSq.js","sources":["../../src/plugins/rewarded/gpt.ts","../../src/plugins/rewarded/RewardedUnlock.ts","../../src/plugins/rewarded/index.ts"],"sourcesContent":["import type { RewardedResult } from '../../types';\n\n/** Google Publisher Tag'in kullanılan yüzeyi (minimal tipler). */\ninterface GptSlot {\n addService(service: unknown): GptSlot;\n}\ninterface GptEvent {\n slot: GptSlot;\n isEmpty?: boolean;\n makeRewardedVisible?: () => boolean | void;\n}\ninterface GptPubAds {\n addEventListener(type: string, listener: (e: GptEvent) => void): void;\n removeEventListener?(type: string, listener: (e: GptEvent) => void): void;\n}\ninterface GoogleTag {\n cmd: Array<() => void> | { push(fn: () => void): void };\n apiReady?: boolean;\n enums: { OutOfPageFormat: { REWARDED: unknown } };\n pubads(): GptPubAds;\n defineOutOfPageSlot(path: string, format: unknown): GptSlot | null;\n enableServices(): void;\n display(slot: GptSlot): void;\n destroySlots(slots: GptSlot[]): void;\n}\n\n/** Google'ın güncel örneklerindeki adres (eski securepagead2 adresi bazı ağlarda sertifika hatası veriyordu). */\nconst GPT_SRC = 'https://securepubads.g.doubleclick.net/tag/js/gpt.js';\nlet gptLoading: Promise<void> | null = null;\n\n/** GPT sayfada yoksa yükler; sayfa GPT'yi (hangi adresten olursa olsun) zaten yüklüyorsa onu paylaşır. */\nfunction loadGpt(): Promise<void> {\n const w = window as unknown as { googletag?: Partial<GoogleTag> };\n w.googletag ??= { cmd: [] } as Partial<GoogleTag>;\n w.googletag.cmd ??= [];\n if (w.googletag.apiReady || document.querySelector('script[src*=\"/tag/js/gpt.js\"]')) return Promise.resolve();\n gptLoading ??= new Promise<void>((resolve, reject) => {\n const s = document.createElement('script');\n s.async = true;\n s.src = GPT_SRC;\n s.onload = () => resolve();\n s.onerror = () => {\n gptLoading = null;\n s.remove();\n reject(new Error('gpt.js could not be loaded (ad blocker / network / certificate)'));\n };\n document.head.appendChild(s);\n });\n return gptLoading;\n}\n\n/**\n * GPT web rewarded akışı (Google'ın örneğiyle aynı): slot tanımla → display → `rewardedSlotReady` gelince göster →\n * `rewardedSlotGranted` ödül → `rewardedSlotClosed` kapandı → slotu yok et. Kullanıcı onayı bu fonksiyon çağrılmadan\n * ÖNCE alınmış olmalı (player'ın onay penceresi).\n *\n * `timeoutMs` betiğin yüklenmesi DAHİL en baştan sayar: GPT hiç yüklenemez ya da çalışmazsa (engelleyici, ağ,\n * sertifika) da 'nofill' döner — bekleme ekranı asla takılı kalmaz. `signal` iptal edilirse (kullanıcı \"Vazgeç\") slot\n * temizlenip 'closed' döner. Reklam görünür olduktan sonra zaman aşımı işlemez; kapanışı GPT bildirir.\n */\nexport function showGptRewarded(adUnitPath: string, timeoutMs: number, signal?: AbortSignal): Promise<RewardedResult> {\n return new Promise<RewardedResult>((resolve) => {\n let done = false;\n let granted = false;\n let videoCompleted = false;\n let slot: GptSlot | null = null;\n let googletag: GoogleTag | null = null;\n const listeners: Array<[string, (e: GptEvent) => void]> = [];\n\n const finish = (result: RewardedResult): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n if (googletag) {\n const pubads = googletag.pubads();\n for (const [type, fn] of listeners) pubads.removeEventListener?.(type, fn);\n if (slot) {\n try {\n googletag.destroySlots([slot]);\n } catch {\n /* zaten yok edildi */\n }\n }\n }\n resolve(result);\n };\n const onAbort = (): void => finish('closed');\n const timer = setTimeout(() => finish('nofill'), timeoutMs);\n if (signal?.aborted) {\n finish('closed');\n return;\n }\n signal?.addEventListener('abort', onAbort);\n\n loadGpt()\n .then(() => {\n if (done) return;\n const gt = (window as unknown as { googletag: GoogleTag }).googletag;\n gt.cmd.push(() => {\n if (done) return;\n googletag = gt;\n slot = gt.defineOutOfPageSlot(adUnitPath, gt.enums.OutOfPageFormat.REWARDED);\n // null: sayfa formatı desteklemiyor (ör. mobil uyumlu viewport yok) — reklam yok sayılır.\n if (!slot) {\n finish('nofill');\n return;\n }\n slot.addService(gt.pubads());\n const pubads = gt.pubads();\n const on = (type: string, fn: (e: GptEvent) => void): void => {\n listeners.push([type, fn]);\n pubads.addEventListener(type, fn);\n };\n on('rewardedSlotReady', (e) => {\n if (e.slot !== slot || done) return;\n // Reklam hazır: artık bekleme yok — kapanışı GPT bildirecek.\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n e.makeRewardedVisible?.();\n });\n // Google: \"You need to close out ads rather than relying on GPT to do so.\" — ödül verilip video reklam\n // sonuna kadar oynayınca reklam player tarafından kapatılır (slot yok edilir); kullanıcı X'e basmak\n // zorunda kalmaz. Ödülü video bitmeden veren reklamlarda kapanış video bitince olur.\n on('rewardedSlotGranted', (e) => {\n if (e.slot !== slot) return;\n granted = true;\n if (videoCompleted) finish('granted');\n });\n on('rewardedSlotVideoCompleted', (e) => {\n if (e.slot !== slot) return;\n videoCompleted = true;\n if (granted) finish('granted');\n });\n on('rewardedSlotClosed', (e) => {\n if (e.slot === slot) finish(granted ? 'granted' : 'closed');\n });\n on('slotRenderEnded', (e) => {\n if (e.slot === slot && e.isEmpty) finish('nofill');\n });\n gt.enableServices();\n gt.display(slot);\n });\n })\n .catch(() => finish('nofill'));\n });\n}\n","import type { RewardedResult, RewardedUnlockOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { LOCK_SVG } from '../../controls/SettingsMenu';\nimport { showGptRewarded } from './gpt';\n\nexport interface RewardedUnlockContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Onay penceresinin ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n /** Buton kontrollerle birlikte görünüp gizlensin diye kontrol katmanına eklenir. */\n chromeEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; details?: Record<string, string | number | boolean | undefined> }): void;\n play(): void;\n exitFullscreen(): void;\n /** Kilitli kalitelerin en yükseği (ör. \"1080p\") — yoksa null (buton gizlenir). */\n lockedQualityLabel(): string | null;\n /** İçeriğin kimliği (kaynak listesi) — kalite değişince değişmez, başka video yüklenince değişir. */\n contentKey(): string;\n /** Kilit açıldı / geri geldi: player menüleri yeniden kurar; `upgrade` → en iyi kaliteye geç. */\n onLockChange(upgrade: boolean): void;\n}\n\nconst DEFAULT_MAX_FREE_HEIGHT = 480;\nconst DEFAULT_STORAGE_KEY = 'hope-rewarded-unlock';\nconst DEFAULT_GPT_TIMEOUT_MS = 8000;\nconst TOAST_MS = 2600;\n\ntype Phase = 'idle' | 'prompt' | 'loading' | 'nofill';\n\n/**\n * Ödüllü reklamla kalite kilidi. Akış (Google'ın ödüllü reklam politikasına göre): kullanıcı kilitli bir kaliteye ya da\n * \"Yüksek kaliteyi aç\" butonuna dokunur → ödülü açıkça yazan onay penceresi → yalnızca \"Reklamı izle\" ile reklam istenir\n * → ödül verildiyse kilit açılır. Vazgeçmek videoyu izlemeyi engellemez (düşük kalitede devam eder).\n */\n/** Diyalog başlık id'leri — aynı sayfada birden çok player olabilir. */\nlet dialogSeq = 0;\n\nexport class RewardedUnlock {\n private options: RewardedUnlockOptions;\n private readonly button: HTMLButtonElement;\n private dialog: HTMLDivElement | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private phase: Phase = 'idle';\n /** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */\n private videoUnlockedKey: string | null = null;\n private lastKey = '';\n\n constructor(\n private readonly ctx: RewardedUnlockContext,\n options: RewardedUnlockOptions\n ) {\n this.options = options;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-rw-button';\n btn.setAttribute('part', 'rewarded-button');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.requestUnlock();\n });\n btn.addEventListener('pointerdown', (e) => e.stopPropagation());\n ctx.chromeEl.appendChild(btn);\n this.button = btn;\n ctx.videoEl.addEventListener('loadstart', this.onSourceChange);\n this.refreshLabels();\n this.onQualitiesChanged();\n }\n\n update(options: RewardedUnlockOptions): void {\n const before = this.unlocked;\n this.options = options;\n if (before !== this.unlocked) this.ctx.onLockChange(false);\n this.onQualitiesChanged();\n }\n\n // ── Kilit durumu ────────────────────────────────────────────────────\n\n private get maxFreeHeight(): number {\n const h = this.options.maxFreeHeight;\n return typeof h === 'number' && h > 0 ? h : DEFAULT_MAX_FREE_HEIGHT;\n }\n\n private get storageKey(): string {\n return this.options.storageKey || DEFAULT_STORAGE_KEY;\n }\n\n private get unlockFor(): 'video' | 'session' | number {\n const u = this.options.unlockFor;\n return typeof u === 'number' && u > 0 ? u : u === 'video' ? 'video' : 'session';\n }\n\n get unlocked(): boolean {\n const mode = this.unlockFor;\n if (mode === 'video') return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();\n try {\n if (mode === 'session') return sessionStorage.getItem(this.storageKey) === '1';\n const until = Number(localStorage.getItem(this.storageKey));\n return Number.isFinite(until) && until > Date.now();\n } catch {\n return false; // depolama kapalı (gizli mod vb.)\n }\n }\n\n private grant(): void {\n const mode = this.unlockFor;\n if (mode === 'video') this.videoUnlockedKey = this.ctx.contentKey();\n try {\n if (mode === 'session') sessionStorage.setItem(this.storageKey, '1');\n else if (typeof mode === 'number') localStorage.setItem(this.storageKey, String(Date.now() + mode * 60_000));\n } catch {\n // Depolama yoksa yalnızca bu video için açık kalır.\n this.videoUnlockedKey = this.ctx.contentKey();\n }\n }\n\n /** Player için: bu yükseklikteki kalite kilitli mi? */\n isLocked(height: number | null): boolean {\n if (this.unlocked) return false;\n return height !== null && height > this.maxFreeHeight;\n }\n\n /** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */\n private readonly onSourceChange = (): void => {\n const key = this.ctx.contentKey();\n if (key === this.lastKey) return;\n this.lastKey = key;\n this.onQualitiesChanged();\n };\n\n /** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */\n onQualitiesChanged(): void {\n const label = this.ctx.lockedQualityLabel();\n const show = this.options.button !== false && !!label && !this.unlocked;\n this.button.hidden = !show;\n if (!show) return;\n const text = this.fill(this.ctx.i18n.rewardedButton, label!);\n this.button.innerHTML = `${LOCK_SVG}<span>${escapeHtml(text)}</span>`;\n // Erişilebilir ad görünen metinle aynı (sesli komutla \"720p kilidini aç\" dendiğinde bulunabilsin).\n this.button.setAttribute('aria-label', text);\n }\n\n // ── Akış ────────────────────────────────────────────────────────────\n\n /** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */\n requestUnlock(): void {\n if (this.unlocked || this.phase !== 'idle') return;\n const label = this.ctx.lockedQualityLabel() ?? 'HD';\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedprompt', { detail: { quality: label } }));\n this.showDialog('prompt', label);\n }\n\n private async watch(label: string): Promise<void> {\n const v = this.ctx.videoEl;\n const wasPlaying = !v.paused;\n v.pause();\n // GPT reklamı sayfanın kendi katmanında açılır — player tam ekrandaysa görünmez.\n this.ctx.exitFullscreen();\n this.abort = new AbortController();\n const signal = this.abort.signal;\n this.showDialog('loading', label);\n let result: RewardedResult;\n try {\n result = await this.runProvider(signal);\n } catch (err) {\n this.ctx.log({ message: `Rewarded ad failed: ${String(err)}` });\n result = 'nofill';\n }\n this.abort = null;\n // Kullanıcı hazırlanırken \"Vazgeç\" dedi — sonuç ne olursa olsun ödül yok, video devam eder.\n if (signal.aborted) {\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, cancelled: true } }));\n if (wasPlaying) this.ctx.play();\n return;\n }\n // Reklam yok / boş / hata: kusur kullanıcıda değil — varsayılan olarak kilit yine de açılır (grantOnNoFill: false kapatır).\n let noAd = false;\n if (result === 'nofill' && this.options.grantOnNoFill !== false) {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: true } }));\n result = 'granted';\n noAd = true;\n }\n if (result === 'granted') {\n this.grant();\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedgranted', { detail: { quality: label, noAd } }));\n this.ctx.onLockChange(true);\n this.onQualitiesChanged();\n this.showToast(this.fill(noAd ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, label));\n if (wasPlaying) this.ctx.play();\n return;\n }\n if (result === 'nofill') {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / unsupported page / timeout)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: false } }));\n this.showDialog('nofill', label);\n this.resumeAfterDialog = wasPlaying;\n return;\n }\n // Kullanıcı reklamı ödül kazanmadan kapattı — video kaldığı kalitede devam eder.\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false } }));\n if (wasPlaying) this.ctx.play();\n }\n\n private resumeAfterDialog = false;\n /** Reklam hazırlanırken \"Vazgeç\" — sağlayıcıya iletilir (GPT slotu temizlenir). */\n private abort: AbortController | null = null;\n\n private async runProvider(signal: AbortSignal): Promise<RewardedResult> {\n const p = this.options.provider;\n if (p?.type === 'gpt') return showGptRewarded(p.adUnitPath, p.timeoutMs ?? DEFAULT_GPT_TIMEOUT_MS, signal);\n if (p?.type === 'custom') {\n // İptal edilirse kendi reklam sisteminizin sonucu beklenmez (sinyali kendi tarafınızda da dinleyebilirsiniz).\n const aborted = new Promise<RewardedResult>((resolve) => signal.addEventListener('abort', () => resolve('closed'), { once: true }));\n const r = await Promise.race([p.show({ signal }), aborted]);\n return r === true ? 'granted' : r === false ? 'closed' : r;\n }\n throw new Error('rewardedUnlock.provider is missing');\n }\n\n // ── Arayüz ─────────────────────────────────────────────────────────\n\n private fill(template: string, quality: string): string {\n const mode = this.unlockFor;\n const i = this.ctx.i18n;\n const duration =\n mode === 'video' ? i.rewardedForVideo : mode === 'session' ? i.rewardedForSession : i.rewardedForMinutes.replace('{n}', String(mode));\n return template.replace('{quality}', quality).replace('{duration}', duration);\n }\n\n private showDialog(phase: Exclude<Phase, 'idle'>, label: string): void {\n this.phase = phase;\n const i = this.ctx.i18n;\n if (!this.dialog) {\n const d = document.createElement('div');\n d.className = 'hp-rw-dialog';\n d.setAttribute('part', 'rewarded-dialog');\n d.setAttribute('role', 'dialog');\n d.setAttribute('aria-modal', 'true');\n for (const t of ['click', 'pointerdown', 'dblclick'] as const) d.addEventListener(t, (e) => e.stopPropagation());\n d.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key !== 'Escape') return;\n if (this.phase === 'loading') this.abort?.abort();\n else this.dismiss();\n });\n this.ctx.overlayEl.appendChild(d);\n this.dialog = d;\n }\n const d = this.dialog;\n d.setAttribute('data-phase', phase);\n d.innerHTML = '';\n const card = document.createElement('div');\n card.className = 'hp-rw-card';\n const icon = document.createElement('div');\n icon.className = 'hp-rw-icon';\n icon.innerHTML = LOCK_SVG;\n const title = document.createElement('div');\n title.className = 'hp-rw-title';\n // Diyaloğun erişilebilir adı başlığı (ekran okuyucu \"720p kilidini aç\" diye okur).\n title.id = `hp-rw-title-${++dialogSeq}`;\n d.setAttribute('aria-labelledby', title.id);\n const text = document.createElement('div');\n text.className = 'hp-rw-text';\n const actions = document.createElement('div');\n actions.className = 'hp-rw-actions';\n card.append(icon, title, text, actions);\n d.appendChild(card);\n\n const button = (labelText: string, primary: boolean, onClick: () => void): HTMLButtonElement => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = primary ? 'hp-rw-btn hp-rw-btn-primary' : 'hp-rw-btn';\n b.textContent = labelText;\n b.addEventListener('click', onClick);\n actions.appendChild(b);\n return b;\n };\n\n if (phase === 'prompt') {\n title.textContent = this.fill(i.rewardedTitle, label);\n // Ödül, reklamdan ÖNCE açıkça yazılır (politika şartı).\n text.textContent = this.fill(i.rewardedBody, label);\n button(i.rewardedDecline, false, () => this.dismiss());\n button(i.rewardedWatch, true, () => void this.watch(label)).focus();\n } else if (phase === 'loading') {\n title.textContent = i.rewardedLoading;\n const spin = document.createElement('div');\n spin.className = 'hp-rw-spinner';\n text.appendChild(spin);\n // Hazırlanma ne kadar sürerse sürsün kullanıcı takılı kalmaz.\n button(i.rewardedDecline, false, () => this.abort?.abort());\n } else {\n title.textContent = this.fill(i.rewardedTitle, label);\n text.textContent = i.rewardedNoFill;\n button(i.rewardedOk, true, () => this.dismiss()).focus();\n }\n }\n\n private dismiss(): void {\n const wasNoFill = this.phase === 'nofill';\n this.closeDialog();\n if (!wasNoFill) this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, declined: true } }));\n if (this.resumeAfterDialog) this.ctx.play();\n this.resumeAfterDialog = false;\n }\n\n private closeDialog(): void {\n this.phase = 'idle';\n this.dialog?.remove();\n this.dialog = null;\n }\n\n private showToast(message: string): void {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n const t = document.createElement('div');\n t.className = 'hp-rw-toast';\n t.setAttribute('part', 'rewarded-toast');\n t.setAttribute('role', 'status');\n t.textContent = message;\n this.ctx.overlayEl.appendChild(t);\n this.toast = t;\n this.toastTimer = setTimeout(() => {\n this.toast?.remove();\n this.toast = null;\n }, TOAST_MS);\n }\n\n refreshLabels(): void {\n this.onQualitiesChanged();\n }\n\n destroy(): void {\n this.abort?.abort();\n this.ctx.videoEl.removeEventListener('loadstart', this.onSourceChange);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n this.closeDialog();\n this.button.remove();\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[c]!);\n}\n","import { RewardedUnlock, type RewardedUnlockContext } from './RewardedUnlock';\nimport type { RewardedUnlockOptions } from '../../types';\n\n/** Ödüllü reklamla kalite kilidini kurar. */\nexport function installRewardedUnlock(ctx: RewardedUnlockContext, options: RewardedUnlockOptions): RewardedUnlock {\n return new RewardedUnlock(ctx, options);\n}\n\nexport { RewardedUnlock };\nexport type { RewardedUnlockContext };\n"],"names":["GPT_SRC","gptLoading","loadGpt","w","_a","resolve","reject","showGptRewarded","adUnitPath","timeoutMs","signal","done","granted","videoCompleted","slot","googletag","listeners","finish","result","timer","onAbort","pubads","type","fn","gt","on","e","DEFAULT_MAX_FREE_HEIGHT","DEFAULT_STORAGE_KEY","DEFAULT_GPT_TIMEOUT_MS","TOAST_MS","dialogSeq","RewardedUnlock","ctx","options","__publicField","key","btn","before","h","u","mode","until","height","label","show","text","LOCK_SVG","escapeHtml","v","wasPlaying","err","noAd","p","aborted","r","template","quality","i","duration","phase","d","t","card","icon","title","actions","button","labelText","primary","onClick","b","spin","wasNoFill","message","_b","s","c","installRewardedUnlock"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  var m = Object.defineProperty;
2
2
  var v = (r, t, e) => t in r ? m(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
3
  var n = (r, t, e) => v(r, typeof t != "symbol" ? t + "" : t, e);
4
- import { f as E } from "./player-BVkwkn4b.js";
4
+ import { f as E } from "./player-DV4Hf5Cw.js";
5
5
  class u {
6
6
  constructor(t, e) {
7
7
  n(this, "chapters", []);
@@ -60,4 +60,4 @@ export {
60
60
  u as Segments,
61
61
  g as installSegments
62
62
  };
63
- //# sourceMappingURL=segments-DXARAkpS.js.map
63
+ //# sourceMappingURL=segments--hl_QVrI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"segments-DXARAkpS.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}
1
+ {"version":3,"file":"segments--hl_QVrI.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}