Porovnat revize

...

45 Commity
v1.3 ... master

Autor SHA1 Zpráva Datum
tree 4f37ae765e Update 2022-06-29 21:04:54 +02:00
tree 9d27a52c5f Update 2022-06-29 17:52:47 +02:00
tree 99d16b367a Update 2022-06-29 17:51:38 +02:00
tree 8a0ff84408 Update 2022-06-29 17:50:04 +02:00
tree 9c58a4b25c Update 2022-06-29 17:22:43 +02:00
tree 7c1ac995c7 Update 2022-06-29 17:15:31 +02:00
tree 665071a953 Záznamy přednášek 2022-06-27 05:22:36 +02:00
tree 5d219a331f Update 2022-06-22 01:10:50 +02:00
tree e45128cb94 Update 2022-06-19 03:41:43 +02:00
tree 2620ceb2e3 Specify node version 2022-06-19 03:35:26 +02:00
tree 70c25612df Update 2022-06-06 12:40:10 +02:00
tree 831e188915 Update 2022-06-06 12:39:41 +02:00
tree 65012f7953 Update 2022-06-05 04:03:40 +02:00
tree 10267c07fe Update 2022-06-05 03:54:15 +02:00
tree c6f7b5856f Remove countdown, change text 2022-06-05 03:51:00 +02:00
tree 001f05afab Create mapa@0.5x.png 2022-06-04 17:15:17 +02:00
tree 8caa5bdbae Add map 2022-06-04 06:52:30 +02:00
tree 8505baa91f Update 2022-06-03 05:20:10 +02:00
tree 23a39b332d Add livestreams link to header 2022-06-03 05:06:18 +02:00
tree 4a03e5db97 Update 2022-06-03 04:54:07 +02:00
Vojtch159 2517d348a3 Divide sponsors 2022-06-02 19:28:52 +02:00
tree f9f6d63bc1 Update 2022-06-02 14:52:20 +02:00
tree cfb4fe9dbe Update 2022-06-01 20:33:10 +02:00
tree aa870f6cdb Fix 2022-06-01 07:26:55 +02:00
tree 685455040d QR Code visible on web 2022-06-01 07:19:16 +02:00
tree f5d019bccc Practical info (2) 2022-06-01 05:15:27 +02:00
tree e22642a961 Practical info 2022-06-01 05:14:54 +02:00
tree 6614bc917b UTXO.TV 2022-06-01 04:21:47 +02:00
tree 633ee04850 Add legend to program, various fixes 2022-06-01 03:06:46 +02:00
tree 55ff60f95c reword 2022-05-30 16:08:08 +02:00
tree c3ebf9364f Update 2022-05-30 15:10:56 +02:00
tree 5891875882 Update 2022-05-30 14:32:33 +02:00
tree 88878fed13 Minor fix 2022-05-30 13:58:50 +02:00
tree 34e0b04c8d Update 2022-05-30 04:22:00 -05:00
tree 0131e019d8 Update 2022-05-30 03:41:23 -05:00
tree 17010d9454 Update 2022-05-30 15:43:59 +08:00
tree 86a76febd7 Update 2022-05-30 02:05:05 -05:00
tree 5c03eb02cc prettier 2022-05-30 07:40:44 +02:00
tree 39f485e594 Update 2022-05-30 07:24:26 +02:00
tree 31b425b64c Update 2022-05-30 07:22:35 +02:00
tree 67b65375cb Update 2022-05-30 07:19:05 +02:00
tree 61b838a2a9 Better UX (3) 2022-05-30 06:45:08 +02:00
tree ce5219eef5 Better UX (2) 2022-05-30 06:42:15 +02:00
tree 3a5988f18d Better UX 2022-05-30 06:29:28 +02:00
tree aa07234b36 bump version 1.3 2022-05-30 05:35:01 +02:00
36 změnil soubory, kde provedl 1689 přidání a 510 odebrání

binární
mapa@0.5x.png Normal file

Binární soubor nebyl zobrazen.

Za

Šířka:  |  Výška:  |  Velikost: 166 KiB

29
package-lock.json vygenerováno
Zobrazit soubor

@ -1,12 +1,12 @@
{ {
"name": "utxo22-web", "name": "utxo22-web",
"version": "1.2.1", "version": "1.3.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "utxo22-web", "name": "utxo22-web",
"version": "1.2.1", "version": "1.3.0",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@fontsource/fira-mono": "^4.5.0", "@fontsource/fira-mono": "^4.5.0",
@ -21,7 +21,9 @@
"ethereum-blockies-base64": "^1.0.2", "ethereum-blockies-base64": "^1.0.2",
"fuse.js": "^6.5.3", "fuse.js": "^6.5.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"qrcode-svg": "^1.1.0",
"remove-markdown": "^0.3.0", "remove-markdown": "^0.3.0",
"svelte-qrcode": "^1.0.0",
"svelte-scrolling": "^1.1.1", "svelte-scrolling": "^1.1.1",
"svelte-youtube": "^0.0.2" "svelte-youtube": "^0.0.2"
}, },
@ -1742,6 +1744,14 @@
"svelte": "^3.2.0" "svelte": "^3.2.0"
} }
}, },
"node_modules/qrcode-svg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz",
"integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw==",
"bin": {
"qrcode-svg": "bin/qrcode-svg.js"
}
},
"node_modules/queue-microtask": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -1954,6 +1964,11 @@
"svelte": "^3.0.0" "svelte": "^3.0.0"
} }
}, },
"node_modules/svelte-qrcode": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/svelte-qrcode/-/svelte-qrcode-1.0.0.tgz",
"integrity": "sha512-WrOvyyxtUzu32gVIDxcFMy0A7uUpbl/8yHaTNOsUaI8W5V4wa7AmReCjffhNY2aS42CqCLJ6qdwUoj/KxmeZzA=="
},
"node_modules/svelte-scrolling": { "node_modules/svelte-scrolling": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/svelte-scrolling/-/svelte-scrolling-1.1.1.tgz", "resolved": "https://registry.npmjs.org/svelte-scrolling/-/svelte-scrolling-1.1.1.tgz",
@ -3231,6 +3246,11 @@
"dev": true, "dev": true,
"requires": {} "requires": {}
}, },
"qrcode-svg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.1.0.tgz",
"integrity": "sha512-XyQCIXux1zEIA3NPb0AeR8UMYvXZzWEhgdBgBjH9gO7M48H9uoHzviNz8pXw3UzrAcxRRRn9gxHewAVK7bn9qw=="
},
"queue-microtask": { "queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -3361,6 +3381,11 @@
"marked": "^4.0.10" "marked": "^4.0.10"
} }
}, },
"svelte-qrcode": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/svelte-qrcode/-/svelte-qrcode-1.0.0.tgz",
"integrity": "sha512-WrOvyyxtUzu32gVIDxcFMy0A7uUpbl/8yHaTNOsUaI8W5V4wa7AmReCjffhNY2aS42CqCLJ6qdwUoj/KxmeZzA=="
},
"svelte-scrolling": { "svelte-scrolling": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/svelte-scrolling/-/svelte-scrolling-1.1.1.tgz", "resolved": "https://registry.npmjs.org/svelte-scrolling/-/svelte-scrolling-1.1.1.tgz",

Zobrazit soubor

@ -1,6 +1,6 @@
{ {
"name": "utxo22-web", "name": "utxo22-web",
"version": "1.2.1", "version": "1.3.0",
"scripts": { "scripts": {
"dev": "svelte-kit dev", "dev": "svelte-kit dev",
"build": "svelte-kit build", "build": "svelte-kit build",
@ -9,7 +9,7 @@
"prepare": "svelte-kit sync", "prepare": "svelte-kit sync",
"prettier": "prettier --write --plugin-search-dir=. ./**/*.svelte", "prettier": "prettier --write --plugin-search-dir=. ./**/*.svelte",
"bump-version": "node -e 'console.log(\"export const version = \\\"\"+require(\"./package.json\").version+\"\\\";\");' > ./src/lib/version.js", "bump-version": "node -e 'console.log(\"export const version = \\\"\"+require(\"./package.json\").version+\"\\\";\");' > ./src/lib/version.js",
"postinstall": "wget -O ./src/lib/bundle.json https://spec.utxo.cz/22/bundle.json", "postinstall": "wget -O src/lib/bundle.json https://spec.utxo.cz/22/bundle.json",
"sitemaps": "node ./src/lib/sitemaps.js" "sitemaps": "node ./src/lib/sitemaps.js"
}, },
"devDependencies": { "devDependencies": {
@ -39,8 +39,13 @@
"ethereum-blockies-base64": "^1.0.2", "ethereum-blockies-base64": "^1.0.2",
"fuse.js": "^6.5.3", "fuse.js": "^6.5.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"qrcode-svg": "^1.1.0",
"remove-markdown": "^0.3.0", "remove-markdown": "^0.3.0",
"svelte-qrcode": "^1.0.0",
"svelte-scrolling": "^1.1.1", "svelte-scrolling": "^1.1.1",
"svelte-youtube": "^0.0.2" "svelte-youtube": "^0.0.2"
},
"engines": {
"node": ">=16.7"
} }
} }

Zobrazit soubor

@ -61,7 +61,7 @@
</script> </script>
{#if size === "custom"} {#if size === "custom"}
<div class="customSize} text-center pb-4 m-auto"> <div class="{customSize} text-center m-auto">
<img <img
src={currentImg} src={currentImg}
class="{customSize} rounded-full m-auto" class="{customSize} rounded-full m-auto"
@ -115,7 +115,11 @@
{#if size === "small"} {#if size === "small"}
<div class="w-16 h-16 text-center"> <div class="w-16 h-16 text-center">
<img src={currentImg} class="w-16 h-16 rounded-full m-auto" alt={speaker.name} /> <img
src={currentImg}
class="w-16 h-16 rounded-full m-auto"
alt={speaker.name}
/>
</div> </div>
{/if} {/if}

Zobrazit soubor

@ -1,11 +1,12 @@
<script> <script>
export let event; export let event;
export let hideDate = false;
import Avatar from "$lib/Avatar.svelte"; import Avatar from "$lib/Avatar.svelte";
import Tooltip from "$lib/Tooltip.svelte"; import Tooltip from "$lib/Tooltip.svelte";
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
import EventTypeLabel from "$lib/EventTypeLabel.svelte"; import EventTypeLabel from "$lib/EventTypeLabel.svelte";
import EventSchedule from '$lib/EventSchedule.svelte'; import EventSchedule from "$lib/EventSchedule.svelte";
import { bundle, userData } from "$lib/stores.js"; import { bundle, userData } from "$lib/stores.js";
import { calcDuration, addFavorite } from "$lib/events.js"; import { calcDuration, addFavorite } from "$lib/events.js";
@ -15,7 +16,9 @@
$: e = event; $: e = event;
$: duration = calcDuration(e, $bundle); $: duration = calcDuration(e, $bundle);
$: spoiler = makeSpoiler(e); $: spoiler = makeSpoiler(e);
$: schedule = $bundle ? $bundle.spec.schedule.find(s => s.event === e.id) : null $: schedule = $bundle
? $bundle.spec.schedule.find((s) => s.event === e.id)
: null;
function makeSpoiler(_e) { function makeSpoiler(_e) {
if (!_e.description) { if (!_e.description) {
@ -81,8 +84,8 @@
<div class=""> <div class="">
<div class="text-sm flex flex-wrap gap-3 flex-1"> <div class="text-sm flex flex-wrap gap-3 flex-1">
<div class="opacity-80"><EventTypeLabel event={e} /></div> <div class="opacity-80"><EventTypeLabel event={e} /></div>
{#if schedule} {#if schedule && !hideDate}
<EventSchedule item={schedule} event={e} bundle={$bundle} /> <EventSchedule item={schedule} {e} bundle={$bundle} />
{/if} {/if}
{#if duration}<div class="text-xs my-auto">{duration}m</div>{/if} {#if duration}<div class="text-xs my-auto">{duration}m</div>{/if}
{#if e.track} {#if e.track}

Zobrazit soubor

@ -1,14 +1,27 @@
<script> <script>
import { format, formatDistanceToNow } from "date-fns"; import { formatCET } from "$lib/utils.js";
import { cs } from "date-fns/locale/index.js";
export let item; export let item;
export let e; export let e;
export let bundle; export let bundle;
$: stage = bundle ? bundle.spec.stages.find(s => s.id === item.stage) : null $: stage = bundle
const start = new Date(item.period.start) ? bundle.spec.stages.find((s) => s.id === item.stage)
const end = new Date(item.period.end) : null;
$: start =
typeof item.period.start === "string"
? new Date(item.period.start)
: item.period.start;
$: end =
typeof item.period.end === "string"
? new Date(item.period.end)
: item.period.end;
</script> </script>
<div class="font-semibold">{format(start, 'iiiii', { locale: cs }).toUpperCase()} {format(start, 'HH:mm')}-{format(end, 'HH:mm')} ({stage ? stage.name : 'n/a'})</div> <div class="font-semibold">
{formatCET(start, "yyyy-MM-dd") === "2022-06-04" ? "SO" : "NE"}
{formatCET(start, "HH:mm")}-{formatCET(end, "HH:mm")} ({stage
? stage.name
: "n/a"}) @{item.id}
</div>

Zobrazit soubor

@ -3,7 +3,7 @@
export let size = null; export let size = null;
export let black = false; export let black = false;
const textColor = black ? 'text-black' : 'text-white' const textColor = black ? "text-black" : "text-white";
const config = { const config = {
panel: { title: "Panelová debata", style: "bg-orange-400" }, panel: { title: "Panelová debata", style: "bg-orange-400" },
@ -21,7 +21,11 @@
$: current = config[event.type]; $: current = config[event.type];
</script> </script>
<div class="inline-block {size === 'big' ? 'h-6 text-sm' : 'h-5 text-xs'} font-normal"> <div
class="inline-block {size === 'big'
? 'h-6 text-sm'
: 'h-5 text-xs'} font-normal"
>
<div <div
class="{size === 'big' class="{size === 'big'
? 'px-2 py-0.5' ? 'px-2 py-0.5'

Zobrazit soubor

@ -2,9 +2,10 @@
import { bundle } from "$lib/stores"; import { bundle } from "$lib/stores";
import SocialButtons from "$lib/SocialButtons.svelte"; import SocialButtons from "$lib/SocialButtons.svelte";
import { version } from "$lib/version.js"; import { version } from "$lib/version.js";
import { page } from "$app/stores";
</script> </script>
{#if $bundle} {#if $bundle && !['/kiosk','/tv-screen'].includes($page.url.pathname)}
<div class="bg-blue-web-bg text-white print:hidden"> <div class="bg-blue-web-bg text-white print:hidden">
<div <div
class="relative mx-auto px-6 pt-10 pb-2 sm:pb-6 max-w-6xl sm:flex pr-4" class="relative mx-auto px-6 pt-10 pb-2 sm:pb-6 max-w-6xl sm:flex pr-4"

25
src/lib/QRCode.svelte Normal file
Zobrazit soubor

@ -0,0 +1,25 @@
<script>
import QRCode from "qrcode-svg";
import { onMount, onDestroy, afterUpdate } from "svelte";
export let value = null;
let svg = null;
function render() {
if (value) {
svg = new QRCode({
content: value,
padding: 1,
ecl: "M",
join: true,
}).svg();
}
}
onMount(() => {
render();
});
</script>
<div>{@html svg}</div>

Zobrazit soubor

@ -0,0 +1,30 @@
<script>
import { formatCET } from "$lib/utils.js";
export let type = "break";
export let ss = null;
</script>
{#if ss}
{#if ss.breakType === "break"}
<span
>☕ Přestávka {#if ss.next[0]}do {formatCET(
new Date(ss.next[0].period.start),
"HH:mm"
)}{/if}</span
>
{/if}
{#if ss.breakType === "beforeStart"}
<span
>Zahájení přenosu {formatCET(
new Date(ss.next[0].period.start),
"d.M. HH:mm"
)}</span
>
{/if}
{#if ss.breakType === "afterEnd"}
<span>Stream skončil. Děkujeme za pozornost!</span>
{/if}
{/if}

Zobrazit soubor

@ -15,18 +15,18 @@
</script> </script>
<script> <script>
import { onMount } from 'svelte'; import { onMount } from "svelte";
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from "svelte";
import YoutubePlayer from 'youtube-player'; import YoutubePlayer from "youtube-player";
export { className as class }; // HTML class names for container element (optional) export { className as class }; // HTML class names for container element (optional)
export let id = undefined; // HTML element ID for player (optional) export let id = undefined; // HTML element ID for player (optional)
export let videoId; // Youtube video ID (required) export let videoId; // Youtube video ID (required)
export let options = undefined; // YouTube player options (optional) export let options = undefined; // YouTube player options (optional)
let className; // HTML class names for container element let className; // HTML class names for container element
let playerElem; // player DOM element reference let playerElem; // player DOM element reference
export let player; // player API instance export let player; // player API instance
// Create and tear down player as component mounts or unmounts // Create and tear down player as component mounts or unmounts
onMount(() => createPlayer()); onMount(() => createPlayer());
@ -38,11 +38,11 @@
player = YoutubePlayer(playerElem, options); player = YoutubePlayer(playerElem, options);
// Register event handlers // Register event handlers
player.on('ready', onPlayerReady); player.on("ready", onPlayerReady);
player.on('error', onPlayerError); player.on("error", onPlayerError);
player.on('stateChange', onPlayerStateChange); player.on("stateChange", onPlayerStateChange);
player.on('playbackRateChange', onPlayerPlaybackRateChange); player.on("playbackRateChange", onPlayerPlaybackRateChange);
player.on('playbackQualityChange', onPlayerPlaybackQualityChange); player.on("playbackQualityChange", onPlayerPlaybackQualityChange);
// Tear down player when done // Tear down player when done
return () => player.destroy(); return () => player.destroy();
@ -64,7 +64,7 @@
// ------------------------------------------- // -------------------------------------------
// Event handling // Event handling
// ------------------------------------------- // -------------------------------------------
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
/** /**
* https://developers.google.com/youtube/iframe_api_reference#onReady * https://developers.google.com/youtube/iframe_api_reference#onReady
@ -73,7 +73,7 @@
* @param {Object} target - player object * @param {Object} target - player object
*/ */
function onPlayerReady(event) { function onPlayerReady(event) {
dispatch('ready', event); dispatch("ready", event);
// Start playing // Start playing
play(videoId); play(videoId);
@ -87,7 +87,7 @@
* @param {Object} target - player object * @param {Object} target - player object
*/ */
function onPlayerError(event) { function onPlayerError(event) {
dispatch('error', event); dispatch("error", event);
} }
/** /**
@ -98,19 +98,19 @@
* @param {Object} target - actual YT player * @param {Object} target - actual YT player
*/ */
function onPlayerStateChange(event) { function onPlayerStateChange(event) {
dispatch('stateChange', event) dispatch("stateChange", event);
switch (event.data) { switch (event.data) {
case PlayerState.ENDED: case PlayerState.ENDED:
dispatch('end', event); dispatch("end", event);
break; break;
case PlayerState.PLAYING: case PlayerState.PLAYING:
dispatch('play', event); dispatch("play", event);
break; break;
case PlayerState.PAUSED: case PlayerState.PAUSED:
dispatch('pause', event); dispatch("pause", event);
break; break;
default: default:
@ -125,7 +125,7 @@
* @param {Object} target - actual YT player * @param {Object} target - actual YT player
*/ */
function onPlayerPlaybackRateChange(event) { function onPlayerPlaybackRateChange(event) {
dispatch('playbackRateChange', event); dispatch("playbackRateChange", event);
} }
/** /**
@ -136,10 +136,10 @@
* @param {Object} target - actual YT player * @param {Object} target - actual YT player
*/ */
function onPlayerPlaybackQualityChange(event) { function onPlayerPlaybackQualityChange(event) {
dispatch('playbackQualityChange', event); dispatch("playbackQualityChange", event);
} }
</script> </script>
<div class={className}> <div class={className}>
<div id={id} bind:this={playerElem}></div> <div {id} bind:this={playerElem} />
</div> </div>

Zobrazit soubor

@ -37,6 +37,12 @@ class API {
description: sp.desc description: sp.desc
} }
}) })
if (this.bundle.schedule) {
const schedule = this.bundle.schedule.find(s => s.event === ev.id)
if (schedule) {
ev.scheduleId = '@' + schedule.id
}
}
} }
} }
return this.bundle return this.bundle

45
src/lib/config.js Normal file
Zobrazit soubor

@ -0,0 +1,45 @@
export const EventTypes = {
panel: {
text: 'Panelová debata',
color: 'bg-orange-400',
colorLight: 'bg-orange-400/20',
colorDark: 'bg-orange-400/40'
},
talk: {
text: 'Přednáška',
color: 'bg-custom-green',
colorLight: 'bg-custom-green/20',
colorDark: 'bg-custom-green/40'
},
workshop: {
text: 'Workshop',
color: 'bg-custom-blue',
colorLight: 'bg-custom-blue/20',
colorDark: 'bg-custom-blue/40'
},
campfire: {
text: 'Campfire',
color: 'bg-purple-400',
colorLight: 'bg-purple-400/20',
colorDark: 'bg-purple-400/40'
},
lightning: {
text: 'Blesková přednáška',
color: 'bg-pink-400',
colorLight: 'bg-pink-400/20',
colorDark: 'bg-pink-400/40'
},
'lightning-series': {
text: 'Série bleskových přednášek',
color: 'bg-yellow-400',
colorLight: 'bg-yellow-400/20',
colorDark: 'bg-yellow-400/40'
},
other: {
text: 'Ostatní',
color: 'bg-rose-400',
colorLight: 'bg-rose-400/20',
colorDark: 'bg-rose-400/40'
}
}

Zobrazit soubor

@ -12,8 +12,11 @@
} }
</script> </script>
{#if !['/kiosk', '/tv-screen'].includes($page.url.pathname)}
<header <header
class="relative bg-center bg-cover {$page.url.pathname !== '/tv' ? "bg-[url('/img/bg-header.jpg')]" : ''} bg-no-repeat bg-blue-web-bg print:hidden" class="relative bg-center bg-cover {$page.url.pathname !== '/tv'
? "bg-[url('/img/bg-header.jpg')]"
: ''} bg-no-repeat bg-blue-web-bg print:hidden"
> >
<!-- <li class:active={$page.url.pathname === '/'}><a sveltekit:prefetch href="/">Home</a></li> --> <!-- <li class:active={$page.url.pathname === '/'}><a sveltekit:prefetch href="/">Home</a></li> -->
<div> <div>
@ -22,7 +25,7 @@
> >
<div class=""> <div class="">
<div class="lg:flex lg:flex-wrap lg:space-x-10"> <div class="lg:flex lg:flex-wrap lg:space-x-10">
{#if !["/","/tv"].includes($page.url.pathname)} {#if !["/", "/tv"].includes($page.url.pathname)}
<div <div
class="block justify-start lg:flex-1 my-auto text-center pb-3 lg:pb-0 pt-3 lg:pt-0" class="block justify-start lg:flex-1 my-auto text-center pb-3 lg:pb-0 pt-3 lg:pt-0"
> >
@ -36,7 +39,7 @@
> >
</div> </div>
</div> </div>
{:else if $page.url.pathname === '/tv'} {:else if $page.url.pathname === "/tv"}
<div <div
class="block justify-start lg:flex-1 my-auto text-center pb-3 lg:pb-0 pt-3 lg:pt-0" class="block justify-start lg:flex-1 my-auto text-center pb-3 lg:pb-0 pt-3 lg:pt-0"
> >
@ -56,28 +59,70 @@
<div <div
class="flex lg:space-x-10 uppercase text-sm font-bold text-white flex-wrap gap-3" class="flex lg:space-x-10 uppercase text-sm font-bold text-white flex-wrap gap-3"
> >
{#if $page.url.pathname === '/tv'} {#if $page.url.pathname === "/tv"}
<a <a
sveltekit:prefetch sveltekit:prefetch
href="/" href="/"
class="m-auto hover:text-[#E16A61] " class="m-auto hover:text-[#E16A61] "
class:text-blue-400={$page.url.pathname === "/"}>O konferenci</a class:text-blue-400={$page.url.pathname === "/"}>O konferenci</a
> >
{:else} {:else}
<a <a
sveltekit:prefetch sveltekit:prefetch
href="/" href="/"
class="m-auto hover:text-[#E16A61] " class="m-auto hover:text-[#E16A61] "
class:text-blue-400={$page.url.pathname === "/"}>Úvod</a class:text-blue-400={$page.url.pathname === "/"}>Úvod</a
> >
{/if} {/if}
{#if $page.url.pathname !== '/tv'} {#if $page.url.pathname !== "/tv"}
<!--a <!--a
sveltekit:prefetch
href="/tv"
class="m-auto hover:text-[#E16A61] text-custom-green"
class:text-blue-400={$page.url.pathname === "/tv"}
><i class="fa-solid fa-video mr-1.5" /> Livestreamy</a
-->
{/if}
{#if $page.url.pathname !== "/tv"}
<!--a
sveltekit:prefetch sveltekit:prefetch
href="/tv" href="/mapa"
class="m-auto hover:text-[#E16A61] text-custom-green" class="m-auto hover:text-[#E16A61]"
class:text-blue-400={$page.url.pathname === "/tv"}><i class="fa-solid fa-video mr-1.5"></i> Livestreamy</a class:text-blue-400={$page.url.pathname === "/mapa"}>Mapa</a
--> >
<a
sveltekit:prefetch
href="/prakticke"
class="m-auto hover:text-[#E16A61]"
class:text-blue-400={$page.url.pathname === "/prakticke"}
>Praktické</a
!-->
<a
sveltekit:prefetch
href="https://utxo.tv"
target="_blank"
class="m-auto hover:text-[#E16A61]"
>Záznamy - utxo.tv</a
>
<a
sveltekit:prefetch
href="/fotky"
class="m-auto hover:text-[#E16A61]"
class:text-blue-400={$page.url.pathname === "/fotky"}
>Fotky</a
>
<!--a
sveltekit:prefetch
href="/vstupenky"
class="m-auto border-solid border border-[#E16A61] rounded-full {$page
.url.pathname === '/vstupenky'
? 'border-0 bg-utxo-gradient m-px'
: 'hover:border-0 hover:bg-utxo-gradient hover:p-px'}"
><div class="py-1.5 px-2 lg:px-6">
Vstupenky{#if $userDataLocal.tickets && $userDataLocal.tickets.length > 0}&nbsp;({$userDataLocal
.tickets.length}){/if}
</div></a
-->
{/if} {/if}
<a <a
sveltekit:prefetch sveltekit:prefetch
@ -85,34 +130,8 @@
class="m-auto hover:text-[#E16A61]" class="m-auto hover:text-[#E16A61]"
class:text-blue-400={$page.url.pathname === "/program"}>Program</a class:text-blue-400={$page.url.pathname === "/program"}>Program</a
> >
{#if $page.url.pathname !== '/tv'}
<!--a
sveltekit:prefetch
href="/mapa"
class="m-auto hover:text-[#E16A61]"
class:text-blue-400={$page.url.pathname === "/mapa"}>Mapa</a
-->
<!--a
sveltekit:prefetch
href="/prakticke"
class="m-auto hover:text-[#E16A61]"
class:text-blue-400={$page.url.pathname === "/prakticke"}>Praktické</a
-->
<a
sveltekit:prefetch
href="/vstupenky"
class="m-auto border-solid border border-[#E16A61] rounded-full {$page
.url.pathname === '/vstupenky'
? 'border-0 bg-utxo-gradient m-px'
: 'hover:border-0 hover:bg-utxo-gradient hover:p-px'}"
><div class="py-1.5 px-2 lg:px-6">
Vstupenky{#if $userDataLocal.tickets && $userDataLocal.tickets.length > 0}&nbsp;({$userDataLocal
.tickets.length}){/if}
</div></a
>
{/if}
</div> </div>
{#if $page.url.pathname === '/'} {#if $page.url.pathname === "/"}
<div <div
class="hidden lg:block my-auto lg:flex-1 lg:pt-0 pt-4 lg:justify-end justify-center" class="hidden lg:block my-auto lg:flex-1 lg:pt-0 pt-4 lg:justify-end justify-center"
> >
@ -128,7 +147,9 @@
class="relative mx-auto lg:px-6 px-4 pt-4 sm:pt-6 sm:pb-6 pb-2 max-w-6xl text-left text-white" class="relative mx-auto lg:px-6 px-4 pt-4 sm:pt-6 sm:pb-6 pb-2 max-w-6xl text-left text-white"
> >
<div class="pl-2 sm:pl-6 lg:pl-10"> <div class="pl-2 sm:pl-6 lg:pl-10">
<div class="uppercase font-semibold text-md lg:text-lg lg:w-1/3 text-white/70"> <div
class="uppercase font-semibold text-md lg:text-lg lg:w-1/3 text-white/70"
>
Otevřená komunitní kryptoměnová konference Otevřená komunitní kryptoměnová konference
</div> </div>
<div class="mt-6"> <div class="mt-6">
@ -160,7 +181,7 @@
<div class="">Gabriel Loci, Praha</div> <div class="">Gabriel Loci, Praha</div>
</div> </div>
</div> </div>
<div class="flex mt-10 gap-4 flex-wrap"> <!--div class="flex mt-10 gap-4 flex-wrap">
<div class="text-left"> <div class="text-left">
<div class=""> <div class="">
<a <a
@ -176,6 +197,9 @@
vstupenek (za {$apiStatus.wave.price} Kč) vstupenek (za {$apiStatus.wave.price} Kč)
</div> </div>
{/if} {/if}
</div !-->
<div class="mt-10 font-bold">
Děkujeme všem za účast! Uvidíme se za rok .-)
</div> </div>
<div class="mt-8 ml-3 lg:ml-6 text-left flex m-auto"> <div class="mt-8 ml-3 lg:ml-6 text-left flex m-auto">
<a <a
@ -189,12 +213,13 @@
> >
</div> </div>
</div> </div>
<div class="mt-6 lg:mt-0 text-left sm:text-right lg:pr-20 mb-2 text-xl"> <!--div class="mt-6 lg:mt-0 text-left sm:text-right lg:pr-20 mb-2 text-xl">
<Countdown /> <Countdown />
</div> </div-->
</div> </div>
{/if} {/if}
</header> </header>
{/if}
<style> <style>
</style> </style>

Zobrazit soubor

@ -1,17 +1,20 @@
import { format, addDays } from "date-fns"; import { format, addDays } from "date-fns";
import { formatCET } from '$lib/utils.js';
const TZoffset = new Date().getTimezoneOffset()
export function parsePeriod(bundle, str) { export function parsePeriod(bundle, str) {
const [dayNumber, times, name] = str.split("/"); const [dayNumber, times, name] = str.split("/");
const [start, end] = times.split("-"); const [start, end] = times.split("-");
const date = bundle.dates[dayNumber - 1]; const date = bundle.dates[dayNumber - 1];
const endDate = end > start ? date : format(addDays(new Date(date), 1), 'yyyy-MM-dd') const endDate = end > start ? date : formatCET(addDays(new Date(date), 1), 'yyyy-MM-dd')
return { return {
date, date,
name, name,
period: { period: {
start: new Date(`${date}T${start}`), start: new Date(`${date}T${start}:00.000+02:00`),
end: new Date(`${endDate}T${end}`), end: new Date(`${endDate}T${end}:00.000+02:00`),
}, },
}; };
} }

83
src/lib/schedule.js Normal file
Zobrazit soubor

@ -0,0 +1,83 @@
import { parsePeriod } from "$lib/periods.js";
import { formatCET } from "$lib/utils.js";
function extendEvents(arr, _bundle) {
for (const ev of arr) {
ev._event = _bundle.spec.events.find((e) => e.id === ev.event);
}
return arr;
}
export function genStatus(_bundle, stageStatus, now = new Date()) {
//now = new Date(`2022-06-05T${format(new Date(), "HH:mm:ss")}`);
//now = new Date(`2022-06-04T13:25`)
let globalNextEvents = _bundle.spec.schedule.filter((ev) => {
return new Date(ev.period.end).getTime() > now.getTime();
});
const stages = _bundle.spec.stages;
for (const stage of stages.filter((s) => s.livestream)) {
let stageEvents = _bundle.spec.schedule.filter((e) => e.stage === stage.id).sort((x, y) => x.period.start > y.period.start ? 1 : -1)
let allEvents = globalNextEvents.filter((e) => e.stage === stage.id).sort((x, y) => x.period.start > y.period.start ? 1 : -1);
let nextEvents = [...allEvents];
let current = null;
if (
nextEvents.length > 0 &&
new Date(nextEvents[0].period.start).getTime() <= now.getTime()
) {
current = nextEvents[0];
nextEvents = nextEvents.slice(1);
}
let breakType = "break";
const allStreams = stage.streams.map((st) => parsePeriod(_bundle, st))
const nextStreams = allStreams.filter(
(s) => s.period.end.getTime() >= now.getTime()
);
if (nextStreams.length === 0) {
nextStreams.push(allStreams[allStreams.length - 1]);
}
let currentPercentage = null;
if (current) {
let duration =
(new Date(current.period.end).getTime() -
new Date(current.period.start).getTime()) /
1000;
let elapsed = Math.floor(
(now.getTime() - new Date(current.period.start).getTime()) / 1000
);
currentPercentage = elapsed / (duration / 100);
}
if (!current && nextEvents[0] && stageEvents[0].id === nextEvents[0].id) {
//console.log(nextEvents[0], allEvents[0])
breakType = "beforeStart";
}
if (!current && nextEvents.length === 0) {
breakType = "afterEnd";
}
const day = formatCET(
new Date(nextStreams[0].period.start),
"yyyy-MM-dd"
);
let ctime = 0;
if (day === "2022-06-05") {
ctime = 2;
}
const scheduleLink = `/program?time=${ctime}&stage=${stage.id}&desc=true`;
stageStatus[stage.id] = {
current: current ? extendEvents([current], _bundle)[0] : null,
currentPercentage,
next: extendEvents(nextEvents.slice(0, 2), _bundle),
stream: nextStreams[0],
scheduleLink,
breakType,
};
}
return stageStatus
}

Zobrazit soubor

@ -32,7 +32,7 @@ export const loadInfo = writable({ loaded: false })
export const schedulePref = writable({ export const schedulePref = writable({
stage: null, stage: null,
track: null, track: null,
time: null, time: '2',
tracks: [], tracks: [],
showDescriptions: false showDescriptions: false
}); });

12
src/lib/utils.js Normal file
Zobrazit soubor

@ -0,0 +1,12 @@
import { format, compareAsc, compareDesc } from "date-fns";
const TZoffset = (new Date()).getTimezoneOffset()
export function formatCET (...args) {
if (TZoffset !== -120) {
const co = (120-(-TZoffset))
args[0] = args[0].getTime() + (co*60*1000)
}
return format(...args)
}

Zobrazit soubor

@ -1 +1 @@
export const version = "1.3-dev"; export const version = "1.4-dev";

Zobrazit soubor

@ -134,12 +134,15 @@
return "border border-blue-web/50"; return "border border-blue-web/50";
} }
function activeStages (bundle, stages, day, pl) { function activeStages(bundle, stages, day, pl) {
return stages.filter(stage => { return stages.filter((stage) => {
const dt = format(new Date(day), 'yyyy-MM-dd') const dt = format(new Date(day), "yyyy-MM-dd");
return Boolean(pl.schedule.filter(i => i.stage === stage.id).find(i => i.date === dt) return Boolean(
) pl.schedule
}) .filter((i) => i.stage === stage.id)
.find((i) => i.date === dt)
);
});
} }
function findEvent(bundle, eventId) { function findEvent(bundle, eventId) {
@ -188,7 +191,12 @@
> >
{#each $bundle.spec["schedule-candidates"] as p, i} {#each $bundle.spec["schedule-candidates"] as p, i}
<option value={i} <option value={i}
>#{i} [{["score", "thc:themeCrossing", "tgc:tagsCrossing", "exd:exclusivityDev"] >#{i} [{[
"score",
"thc:themeCrossing",
"tgc:tagsCrossing",
"exd:exclusivityDev",
]
.map((key) => { .map((key) => {
const [title, rkey] = key.split(":"); const [title, rkey] = key.split(":");
return `${title}:${ return `${title}:${
@ -281,9 +289,14 @@
<th class="xl:w-16" /> <th class="xl:w-16" />
{#each activeStages($bundle, $bundle.spec.stages, st.date, plan) as stage} {#each activeStages($bundle, $bundle.spec.stages, st.date, plan) as stage}
{#if $schedulePref && $schedulePref.stages.includes(stage.id)} {#if $schedulePref && $schedulePref.stages.includes(stage.id)}
<th class="text-md py-1.5 px-1 sticky top-0 bg-white align-bottom"> <th
<div class="text-xs font-normal text-blue-web/60 mb-2.5">{stage.capacity.seat} <i class="fa-solid fa-chair"></i> + {stage.capacity.stand} <i class="fa-solid fa-person"></div> class="text-md py-1.5 px-1 sticky top-0 bg-white align-bottom"
<div>{stage.name}</div> >
<div class="text-xs font-normal text-blue-web/60 mb-2.5">
{stage.capacity.seat} <i class="fa-solid fa-chair" /> + {stage
.capacity.stand} <i class="fa-solid fa-person" />
</div>
<div>{stage.name}</div>
</th> </th>
{/if} {/if}
{/each} {/each}
@ -317,7 +330,8 @@
{format( {format(
new Date(si.period.start), new Date(si.period.start),
"HH:mm" "HH:mm"
)}-{format(new Date(si.period.end), "HH:mm")} <span class="opacity-70">@{si.id}</span> )}-{format(new Date(si.period.end), "HH:mm")}
<span class="opacity-70">@{si.id}</span>
{#if event.track}[{#each [$bundle.spec.tracks.find((t) => t.id === event.track)] as track}{track.shortname || {#if event.track}[{#each [$bundle.spec.tracks.find((t) => t.id === event.track)] as track}{track.shortname ||
track.name}{/each}]{/if} track.name}{/each}]{/if}
</div> </div>

349
src/routes/fotky.svelte Normal file
Zobrazit soubor

@ -0,0 +1,349 @@
<script context="module">
export const prerender = true;
</script>
<svelte:head>
<title>Fotky | UTXO.22</title>
</svelte:head>
<script src="https://cdn.jsdelivr.net/npm/publicalbum@latest/embed-ui.min.js" async></script>
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
<h1 class="uppercase text-2xl font-bold mb-4"><a href="https://photos.app.goo.gl/8ogj2Y3cdUGwMAc4A">Fotky</a></h1>
<div class="mb-4"><a href="https://photos.app.goo.gl/8ogj2Y3cdUGwMAc4A" target="_blank" class="underline hover:no-underline">Zobrazit všechny fotky</a></div>
<div class="aspect-video">
<script src="https://cdn.jsdelivr.net/npm/publicalbum@latest/embed-ui.min.js" async></script>
<div class="pa-gallery-player-widget" style="width:100%; height:100%; display:none;"
data-link="https://photos.app.goo.gl/8ogj2Y3cdUGwMAc4A"
data-title="UTXO.22"
data-description="357 new items · Album by Tereza Starostová"
data-delay="3">
<object data="https://lh3.googleusercontent.com/YecFDgIC0ffjWQRSt7Jm9Du7dvpiYJ2mh-s3hHKlGeljwFg38K1RGHXOHEBrmaZMn6DOk-7dDNLZWqhDLCs09FPQjz_dO1-xsuhrH-P1gbTmdYeIvoqZAjKseX-V5BdZ_c3bgvadXc4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KUgNJUZrQg76XJDp7Gv_IVZMrdQU5QNdWF7LdJoNfCliFyMj6mMWZ32kZIoSCyzZ62512tCcMdb1ZqqOXH4Gin0gEtWCUahkFDRS4FHeo9dYDt-jRFQur-a4kpvrzD90XRZaVXKxvGk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/H7uIszqlACxTANtmao4NLwpkkwSJaCO_L18TMfrTuS20jFSTPGMzZMG7PdrQYx0hs7gYt-QxVefNEMPWVUZB5mhOLNSWrC1qwpZehWNW03o1UFCJ8Q2oCC2b7n7o0fWWHtay_mDjK2A=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CXE6xDc5TON_43pGcG1C6P0McvZTaFtNTXnPAJI0QBZDYi8h97a93g8MaiKMabyA3S9OvxGMBKBUsnY1Y9ci96A5cu6ApMWurkH44aezctN_pUQ0qTQilHEiZqWhVzMZg4Ia1kW7EX0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/be9NbKDcnA35-4f_n-ng0ijoCZgM6_I0OLxNitEpbfdOc3_mMgHt9fL1OIUnb8hslRpt3yfgUT4P-nK5BvQsJmt-S-frnwbRcb49deQCWNbR9eduMmLmiY9GuBf-duqwYDkS-8p5V0I=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/C0lt3xkrhLyT_1rDeo4HjgN9ARiGPjT-3zB1PqwYoxPhTdiJbK8FP7D9ESejhROMCx7atITyZdRX22g0U7eKCJqRa1xjdDy1adEbUOn6WJemL16QVjl0pFPdJIwZTeXHIE8QcKv7dfs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xoF43TEf-OXvSFA57mHbfJZCRKhPC_1UR0AQYOGB-xTGkWes-qxaTCe6E1mErIqd1D45dc6MJS_SEmvrQe20CnkdxJ4He-na-3Nqod_BBrmLCxMgIFBozfZh1fK8_oNlrkGEXRkDRTk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/gLDnaNqqlAE70N0yD9METMWrYvZeQdSLLdy4_Yrdf4UDSUYkqlUWHhQqImny7CZsmK59UfpMO7ggd_N_-z6o-P3y_bHvk_x_LbqW-qUhcvT7U6qwJNlasYkcSSvn0xPv_8PZbdIIhVY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/QduJWxKDnCW04PctHKDGlNNM3GkWr6ws-NmESnXsyXSu0KI8XsVplHqPKIOrx4a0XKt_W9vs8JyPmoGS1HUHw50ywYVB-arhrK3oH3Na-vgx4tWWUOha-YP2Z7F4ChUVQG2HOApfMrQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/WUtFI2t5Gj0yDhZvU8268d3CdKI3g-MsdmB1YjhZj262egUdCGzh6s5UV_3W1hDE1pc5jhAxS89Y6V7I_Xk-3osRHhyp_Hc1BKLPFzuHhSwbt7hOC6yalHPnQAOwWqam8X9pj9MK51w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/FxPOVSLodFhZuCtp36GM8VmFv_HguHUsSQ-LALTOEy0oYU3bLzYQx7kv3MyRu0ubmi3VFnmsVTBnQqm8iwkv9GpmTalYxXxasSbOFE38X0Gk-526ktvcuqywPsV4HCDEsMp_XqxCGHM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/f0DxYO3PKvat-oe-ycPg5xZPFczb8ZdIiSv6fOFnGOgW_PhpKHa39SblMg1C_rBiOFuX9HGN2xC1SgYTVpMho8Ry71BRrFl4im0-hoAwPDyHYkVROs0pmteyQkwiZi9EHne1BpQLOdE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/dIbUgMWg8RmjpL4QBvvO_J8PI1_Z-bafNltKl7PgRahpzRabtsrEaZxv7mZIpswNqnFe67PXm7n9wTb4gLuFMEHj6_apVLeLodXbIvcoo-BB4x4HHQ4fSvv7mCWVgm95mXfpSwDGAx8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/9MzjSehoGkcUZ8ZFqGj7t869GQqMytua_DTeZPdYdC_kg16Yh5ms52QHEBX0VT4YySRbYOudWdIkodxVFtWXZp7xCosRmWyjNedWBr0AWf8EWA77jnQBQwv3LI8gVe2UbEe5aq8t8TM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KXT2BhoUaNoamOwsG-ufhVoJ5yF1g46Rua9c7LY79dToNfFTPC81fLZQrmQl34ejgfX37HSGRM5GMJPYXRtPJ1AVMAvtrnX4NVFuMVrh6f0OKeu39YmYxsS4lapaDS8MoDhIZjUOTIQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/2620Yir6Z-N3Y5n4v-7_R-_Bnjtsg4OMDSNG_6Ii8IDV2bYTfdnxn3UgJ0XWKZmSWupo8T8VX3CQupLdLhapkw0JVj2eE4XpgX89eiZxK_yhNms7AltAu-cTaphDoZllLC5cChKApz8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hWB9VnfaZaiItXUfkJcgpp-ac3yiKzEZuyVkw8GPkcaqP1UeM4CaD3JIMSyc6pxHOU2U1o7K0pTsbL58KoiM0lCRurNEOyCDGTUUsqnkap92LGLLTgZ01xtKJ1FjHbhmaZn-CQJS0zE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ERHexfIgtwVFMAzRdC66e9CeLXQm_vf__XntMGOkCnW7xjX1vtcRHFGnYiWfPKRaUPdcFMBVBY2P5837k6f0MuEQcwFCCy15rRX2TBlkV8T1f4r-1EHBZglL6glhVjFgG0pfuTFuxyg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/YYfo_zDi0Ma-bCtLkgpoYrabbmXS5iA_ErSfQE3nE6FGbvSIJ3E7X4B8pMtfa8ky1cv8s9Tc_A4lMjxpNJLuWuA-YgaCNSzKsFLP0koUFRPJxz8Y7sgOcEGoksP0Dcy-8S8K2U6pr2U=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ItH0b_rEd_9HZmo-kljtqqmQiiTZr5I1H5NHDSB9sKjA6HRjVLwG5UaXhgiBHAlHFPwE5nJpIX8DH2wnC3axf6wutbIP78ujCLw0WaEITj_uTP8APRf92Qm0BKjOOL8-4X0VSb-3uKg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/fMmlsHEUIYQ2s-TrXCgYIpyL7QuFWsflm5AjX1SF3LGulPworZ5_8Hpj9xQ6b3MjSMO1vRHJSePSUoJn1uDBJ9UpIUp6cxB59OTUz9ojIJ7vvDY13Jfz59GDS8Xpr1wOer2P_ZLFCOQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/F37XdVTnOC68-M8twRiNH0fMfk38LnvhNhLZj9okyJvdQ7XnUesHlJ7Ri6TLlKFSQ1x7CJG0Y_TKbC9_3q2SwAYkLw1lzwd7-nnSmy2HGlyPxWRRhj4gYy66Cn7iyrguNVI_OEENL5k=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Lh7U-Mlb5tAPHio1t5t5SQSMeMHDxvCGE71rSid55Kq3T4KbX1mzy69TesqrIl9Nl-e3lQLaLztJ5MeaDZOjcIhj4Slq0wgooy1IXieNFY7qU-SAB2u4JgaVIsiH_nutLPy4oTb2m4M=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/5jSNXxQoo5IPdOrAuzNhW7Qw1B_ZiZ1qpV0gLMrPfyh0Ubt0vufy1DthWh0aErNknpreac8BY-ObXlb1dVV4vhOwYFA0c8edlwzamOydangtfB9JgLO-otY-6-ObMlPvwsvl7l1CWf4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/28jDe7jx301PFrkf1aKztr5NUVM9j_-KmWvF2cQD8Ss_FQVnUAZuqQmr73qfJC9DoQmXTZRaPOaKlVVQXp2bfwdyrCP8ZvT_02L4vgHj7SgaKR3pUyUI0vvBkV6Poi0xR-xEzI9tE4Y=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/z27tYAF9lgoMjLvDhpQATUaa6sy1_pB6jPQQ3kKvJx8lZPG6MH61s98HtamLrmV3Lup_JG93h7u5UHUxap6McTv82s98x5jQmZE5fJoglj8m846UV4F2tfcLICTXYUS-HdUbsq8meLo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/SxzqxA0NADNipqON7Ix9f8gI-E3GVES4GUxASWJW_fjBnTEg0scPX5wXjg5sBPHuE3A7NzuqdnC7j1qQYtyKop2RAYd3eHUuaCeo6Gsuyz9LNHK0IAEOYaNiOiUv1BxnGQ98qSr2w54=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/8oQwa9gbNBHCzJr4lqMfqtiro2VvyKfOYwPQ3H3DILuTMhuP5ml7GVxuZ9SmC8ovk-BdHRV3VEgSUq9zAIs3KbkLotcqQBUjBjLmnk9F1sNII5RKIZuA5U58rc1NIW4Ubc7WDIUgGd8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/W8a7PbTQ6cU-k9h678g6-J6fDC-SWpes3fJVjpFKDBDetlmkIPa-soI7YhyHTRIjwUFPPgBzuJDPEUhr794pBq7hFVh5eWExapPfM7GU1n6DWWDiEXxKztx9dlcROU9_POItVbw0EXY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xBbpbCh3oNbDtypB0ue7uD0FnqOYlRT7ndRIdJ8Nrdiutmpx4ExL48hN1NBRpjUEv5L_jGVdMGMT-rMWIO3FRHxi1qZTrYOuEOKmcS_x-M1Xl6NG3-wfw9aNaFs9xzzYCOCef3PoDFw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/08azgXwT1S6HzjOJXFmnATBzV3mfhW2GhbDIhmKxw_tOf3vD7hIEPTQU3EnLFTJCio120O-7947Yhc81Mn-qsJ4K9bmPtiBaEY6nIdItOiIlJqm3vk6XA7buJWAsWDHm35OfvmAi50c=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/UhNMJ15GHLlmn_VSkLCjedFsylr5M5FsGe3VAor99iybzlHGDpEoPzQMT2mOmyqgkXUCK13gNXNAGjOwaicQq0QRyYNNFiCC3EOwaTvOfTYU92nnY4xFvWsy-L40iKvfbR--NI-G3X0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/y61AQ-myXumOhP0_4lQ6sKPF-6xMmaf211sOsIYJM20ZrK4bKx55KNJlxr5zzbucYc-EHB4pc1W_CsYUKWchs6hq4pEXoJ2QwRdLWc9efjEoz3VwgEI6CYa8IRxymRmWCAyTGDGZw0w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RXg1WmnJf6J0PNzSJiaopmAnPwm67GfvPExOwzqlPfj0bjsPb8toZ_LfSwsY2Pyigx29PQl-9cvnYQ4AOg6XgXe1ondZ98tKzRyG2gi5jRPoPOd-JQMAOcuRVV7oJZzfzTMGpBkQgs0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/9No8t037rJdR1X-136nvAVVW-okPjr3lhK0zoymjZz3i-bV4wlhEjpwoCXYL8tdFC0KtKPJCQRZr_DCdXkSYQIPOBoeALd6pS0A3IAKPRWDiay_UgENKKvtSxG02NvNwC_8sdE3r84k=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/_pH8j4UCkm_s3TVt9VC3QmmrE5TN_Yz4PytbXNUVuZdEiL5dlIjOF0-C2s1Y6AJTuYJeN53Z88_9xz78YoXUGWyTMQY64JY7eMcAQ-x2BxwaAdrnohtlIZ7pv1TkzhfCCojNFceZ000=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/asPHkIMayWkfUYBz2C9KQKROpk213aeiURnSav4r2w7wWza9iLEkWvw19lKOySUL7uvggYvI-13ZjMw3du9VzxhxHTuRlRw629OeqMdxwsfcWNSCE6rtukiAukNtiMn1JVykI2egIC0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/MDwXlFm7N_DOKoe1e9xJTQq9BT4L_UrvAfh9efgMlZ57k0FCY2CfN44-tUdQ4WlYeWit59xz0Om5oMaD6AUiwCWJ8xS6pPMIqrY9bhbwJLOkpqJJj7J3EVUiJEeWQ3a6qRN399CkWLs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/QheQHdnAnLIvAdIDbG59FA9zBJikLW9AXzi5_mnr-vbhIkWUmyvFOULvmJvn9Q5JaClxTn9tWKsHCnJprGO-71D8BgFEDD9DvyiuXoLWzlgyZSQ5VRTHhbl5A1ew_ufyI-y4tXjYloo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/gM1S2Qzu-301sbwugWxh63X0klpNErJhvRz4_bjAcr1hL1mAloSXGtSI95zvt5o8Ebg35gWzDtP3pM4IZga-O4Pfr4ID_0xQ715510EFeyGD5DfMgX_o8WwHju8UYhkqvpt-IaRaym8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xVDjRFYRchmlN_nq37d4k1J1-ZlKdj0nhfwIQtgfmmZ2YEAmzRzi2ljDpI85R6RKmkYwT8iIsed51_6oarXVDtZeKSII2kJUqG6KrLb7tRtpU0uw5hrNzWLzOEmwJeT2YH2VgnVWKoo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/oPEcISf41jvYx1wRFG4YLRFDTXaDuNWmW34HhRd22usZ9IyCfOinA-I24Q9DNV6GqqpWI0fDYPYAZ5WqZF0yd08T18DZPS1cL12WacB7lpmFXxnxhKGPb5QODQB-U6DCQqNG6ncqGsE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/h_l6UccM-Udf9sPamxxMBWCl650Hi-2ysF6zkXBh3nR72mCJCLsD60CubLWl4LUGcC76KmIi49aeQko-t0oVqk5pGB6wwGf3yIz4CCuTey8UTPkY83ZBje2bJD3-v7PZFoZOTPVX9YA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/NIEM-mMBXA7T7OLYupfa_PK8D-MLZVlNYgnNr0-Xoq8uhgKYCbcrzqMjrugZt7YDIDSWb4LuVt79UOOaac2-80eLZK4boZSgbBHi1mcOse-2YCtcwSrtI9S4zeOdPzxJctGlAP1JL-Q=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/_NMv8-U_HfjwA6osW9F4TpwmxadUrGsoie9oFKm5DGoFyIwjOkRHQsbWBvT2kiscH86vZGk9DZXcg3z_Z6o-yrwK2ZIxEh6l-zZRgvwElz7m-04NQsVovRQgi8HxjrB4W2uuHqPhqeQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/AJ9DfvdeUXQmiD5Fvb_qfjRz3aCmUp3HMuSUoWS0b5orwVeljmPBJwT4cuUCFO-67O3TuVS0I6pRMJweDyMQO6A9QPg-U9-Bv6MylLIBGdhpWPRmHijdOh69ZJU6AXktR4lBP1XQ9GM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/wfVf5S-IG1ukvQLlzrCiOvAO1cN-zXmLad7WSarCs7NNucGVSqrCPyTwQSjZG67CfodlFvxQ5bzi-70-42lpKsos5TDpcCcrCp0g43cwVQL2tezsUHlakyXMWsriF3yAZHMZZAaP29M=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/6tmRgeXUammWArdp2IXEwFIC7j8Pf9LlFc5Be5G7buYqF-jPL0XcY8xEVyO1K4y7sfmCrhKXIc7zn_3jsL_adOWifPO7arDGqJEBTQUEmZzjIjuh12guwDU6VcJ9iZMU34dbnVr8AGg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/icQ9IJs0t1g2D59FI3vlT2kQiU8ngKwpSuPobw8mUgfHT0wx1VNWbK-3xaXgAIKChYkocGA8V9Upf6QMLD8W90uQmiiscmcEygRFcdGap7ad-ViQkhveTXwsifGFXrSb_YvooD3V7QQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Pp4GEw0l5nJ6BJRGwLWZAAcXljbKMTfvUnGGkRlqUEseRnEwjT5jCZBhwARMfRBKimdv8JRx4lX927S2IkEI70gjuj4vcyjeC5NBictkezy6WQftkH1zZ5D539nusi3neU34EsiF6vA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/LCMRIV1EzRbq-_EmvGNMnqWlYHvviv6jbYeazCxb3yrAoLe94x37dUVuSk91JXA3VKi_-8U0dWk3JBlGYokV422C5S1B4yB5-fFJdOxU1lefQMeiYug-2C3qgDt4FWUHVY4khMH9aCA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/d_Yg2xft14Ph4EHA2Qc2XpxDTxDU5zVtuEw25v2x2FDYhae4J4cNOy-EO5FwDlQ9db5xugaMKWlPlxadblv5cgfafNnJEkC8P7g1BBYzXabLT-6B4EkJEODxkPFGKNrj9eUje3G0n1w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/iEHc2mGU5xwuWcpY9h-NmLPzjz2XT2MEoIsrRNfdnOFhc_d0Z2sm1qseHoKCXXc4v2qaXTFqg0PEg6W9picEv0KMbw_-4z9cQmFa7G-4tTkj_c6ctBvNPvScM31QslWJGcV5Ku_Xl5o=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/lNLgcqb-DQRUi_cd23EaQPeGj_XfpmcV-QKv4D840u7IxbOkR664bcfVdP_zBVg3lmxnC8TEo1SSSTyHvWGqAFG8C5HiHyf_88sUy9uxnOUY-9LvffLbq61OQTOvNMSe_mWbzYIM3ng=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/vPL21XVRWOXGiipfEQXof6qVGTgsyMXL_koR6ICPL_ohn04lVKluHlmqxWltpQOWhM3MCq2uDaosIcx0Tvzwin1_UPaWoyNhS5oznTvKGXWio4gbhvX8fmxxI2gT0n8PsI1K1WerPMM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/pux8gvb1ntncCu0xrNlr21BeLlJngJFMWoaFs-71TvY2YDNo-SZsnMEG0j_v-8zQjTu7D3pBH0HZg6IjrQX50DOXXPhmYH2378cDPjbfxeysVRcriitIkJOEmlfkxi-Q34b7CcwCrAQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/91F7TM2fr2YVCiZbMcMx56wXAa6_yiayyl-bj0dXVzKkXQhW3U40AnUUQwjPpvsIs4O78ovgdKgHfXQzKkkakJMprpAzeazbqxD_MisWsIMKzDBmFsa5SSZyxnbUHAiaGrxyRY1mqfE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/TbwR-DqxKEVErvvDp6WKU2DMoWCCWX3loaaHYfLmyiKQe8JDTc-1aw-FiSwW36mQnhpRo_d3u1OQawTTvO8D6ZehsUuXLleK8F0U_gMC7eMNaOxVxE0vJg96XLX2HQ8_ERfbmnxmWM8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/C5Uex2Ubz40f3A1XwHsi80GkuEP1wJ-ZETFFlKbgT_Iw28N2q7agYtN8pOvxdeIziH1Xy_jwc4YSrzXPRmm2ja8_6V4AaJYbaDt-LqDB4xtH0AF1CfNnACQ5xipf_qzacVE8QhE5ZCU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/UFi7LDcfE1rRjqlfz2nJWQ_quao_t4CUedOobkNe1f80KwAqrTK5zBYPpBaiMWVvYu3HEk-3a7oBIe3DI0xFCFqKPAfLJAUbuBWjuzGtw0mcmQJ5HufV6xFyB30H2pVEeIAKU1-hBd4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/fB1oLg7mKwjfoRym0l2eMKjPIXTpYGrdAqW8VZj_QG19s3Wo4sCkxVue_85vS7Deo7uSmL_RSnpv50JJfY30iKHlr794XeTrhhrwi5KwWCA4ZAybV8ASSshY3C86iV9Kh2u2VGt6NbU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/2wQET39i71vYD8fLP0lV-cpD5qixH9Qv86-8jYCIX-mPZbR2MBIDZkcXzCs8h4aoAt75NXJCbhVc4e36V22Law8OibmtWFTLrxaj2aRSVJnDj-p9EZ0L5iIZrO3b_3MKb7j1HrH1zO4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/YTkD__ghIxzGlOZeBTZLkBKiC79RPd5JSY0-joOC2SmZP64lnOouTkBXDDHVMgnNhPL2q0W7osD_XQ7V_0sYcspQmIhSs7CYsBLQJzECjX_542G_u5BnIRe8QfQp1V4Tdfa1iC8h-wc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/HYNlqvkOUUZAp5UOPJGwA0TGzyQ8NC2m5adb3ZQASruJmFqvZtHiViXBWbSDNbmkIDptLKUXyJYRGQ36Dbgov5azHbzTPq781SoyTVyDjlffYDC45Zhtn2B3xrEsNuqDxEeG_NMUBCs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/zj1y4h0WJM_Lumo-v6qB9zlj_BdpiJ0Ki3J1fv1rQjYVBUcrsqAkD2cUND_A9DSwUvRK1kxHZNtCJjTRNpz0nowy-LWayaKzi54IlP312MNBpPs7tT6VmGWgVZ8ZqAVWJC7beH-xO6w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/VRPBeH3QAh_-m1DOTCDM-j58hqI1oDxIzSOz48MDSn6HKx6UExiI1Z4QMRHxHtIVR6wLaOdfos8djrpzN3Om1wXvvZrSo_IY74gZ3zApnuRZfENIOXSNI5qbr2Njt8JQrVAA8g4JtxA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/t4DtPlV9vrCFPkajAO5ZxHK83RZV7zb1D-Hd0cY8CEKah-63A5h8Z4fp8iH45xeXY3_RkAezIVl09yhbMM2a7kB071OSGkVpTvSuBq9T_6O6AKv8a3Lne4_1CFuxdykoLWOH_3XMZjg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ulYqHD_8ZrAkZIc_83egf0GhBAKUrKX9kFNy6a6NzarvnuTTsrdhyPqWbGMpvRluLPgiIIdAbnrdMiNqvlMCoPDKFGw2K8SD24zWuusbMrTNhsdKk6JP4lK8yFRhaoXBKZvJZfdjNHQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/D1ghoLXPmNsTEyjf51ryYTeqZVgcOq-XGnNRwLbgYKEMkKtXk869sUV8quHj8v_XUgQbNj21GKEcpO5in1S7hcccw6eDse9mF7yyDlcwzWiNsOtWNqlWl2r8ioEZosRgXY4u_gCgZao=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/40TRsGc9_h7mXzOMbhA-2trd5jD_-gNxYN2J8_mmrxca0lyRqKuraUNWrGyyhF8_JFu6iNXMSbxB96q8bEua3ryTzHuUFwD0zgtr4aV0nKgP3MvvttaKQvVF4SAewC5mIPYiMPrhn9k=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/w1joxrZZ1-BXXtXegmrGWshISYFXf2Df0Qd8FxGIrCCS61C326tGxe47qkWHi33czyfgUoKhdF56C6QA5SrNS71Je6R2lCTnuX6KA5ynLbiJ0-_7POuHG-B7p6pVa_MrWKJb4AMT_DY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/skjlXDmP2WP9wwG9mQosgBQvr9MV38NvmHFaDoJB-bAxwfJV_W0XBKdcuh8ihcgg755GJhFDeAmZX3qP1Uj-hPFGKpKHKD-HsHD4Sg2f77MQhs1mAqDNo2WuMD7bGqT8nUV0w2vfAnU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/UWwqHVYwc9OECrKEUX116mPhnF2otn7DsXGVW4Mc6yuz0cQxqFXTZXF1yKXXnDeoNeAx-nWO16WyIxJrrV5ygF5Ol2idwEtsl67X7SFlB-YVXwpaeDFL1Fm0iJlUOf3LK1WPSI8_Rrk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/3QJaoQLvJeWo9Ai8JvfEBy2bglxMDqs3mQhWn0W4XH8ABVTwtqdEssTQK0OiGvg3xmlpEKOZQcHYAtfWKGMVSOwJqu3gDC_ZqS5LM9M_PZamSJGM7Aj7BsCxx1LyLXea97SA7uRRRjo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/-LF0Dpez9BT-ytd0o2TmrZq1gtItI2rgPWZoz2vD_DDaKl0aMUCv5HXE5zxck2lvRJKd48B5b1rXzqLQya82Vfu3NRfJ9JxkPsqfjYp1vZJHHzNuC-Y1OwKCUWFnWRIkRBrFFWKRNVU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KMszwYwZ9b_oLykBbrrRRofm6x3RddWRfDzPWyGqElu0CVsTmUBjbmpka6HpGSqRJeicnc7L_Q6Aj42MoSLCoNPdeIkusIKw2KzlrFB-Hv8Dc3fqIc1wnWUlFXfIvDQHHgAMJGkkRSg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/oi77Cv1LoGQ-K7LLiQSdTsCjOcMaLRIxcBPJEYjyjC6AbbH63uwVMRXoPHDyh1EOXyTn8nWdrmG7E6qf95NpUXgRLFqQPSVRCZppNYhRl6skuAPX2HhTNvLaCMm5mxK0ZXBTI_Oqgko=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CQJpiTWwmvh6762OXapGmsIPxpLEa036mTg5kav-Cb2Z_HV5xZrc_7vK7TS7v8GZn5w8Jom_xV7R-cvutjNTPf4CdlYXrFDJFCluGDtgst23qcU07eB7vE71QbYHhMH1hF0o0kuSa9o=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/_CZgcM-iF7wgu1tr-0TlTdDpZs9KjuqplFruzEdCX20KWXnaRlDCb4VKQZFi_fVKWvr2aO_bWjmES8YLlo0_sn-Xte6Y50uYSxZHBxdcKZuy93ARN7sKy_mtd57pRlsJ31kzp4WxAR8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/aOzPnoHGJEC_IGSIp0nzFDncUYybL3oA83Ub7t_aTUudusYky2XZiqn-huC1TxAkgV-UikEh-hVK7AW_7KqXZrrcq78mzAVaLGtipFcE_SJXaCufgjzIgw258kw19x3PBSp4z54UPnU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hAwPm6hn9fmLqekF84Z2yVzhvcLHQOKqofTNRO6ODiyrh6Y4a-EnVWLTw3QjXvTDXwZhNKxJaKwc0MHzXAeAYSBrZtv8tLLxaperF7B1GueYvh4xtSUxw5MAkeemUkjMJ403UY-jQ_4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/YXxC9NXcZZmPZy0PPY96XrBPM4RXryVjfgvIwBZRK4BGdOSu5x6hW0ZueIEp3ZbD2DoOTJjREiDswWiRQ0bQviztSuFPtigSnRwoypv78nSoVXDpBCoUTymK_0aU3Nj0MrcMfD1nn5o=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Su7w3rZFPjvo3vCCd4Z7mbUalxh3CKH3_qJ0taz6b_xkaax5T79deKs27uy4t7H0o13U-45qWgcws2OzK1AOlCxmwgC9EsEWq4t3QvtsexQhdtVPgTBULPCqXBTHFTrNhCE8UsBq8_g=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/7YMryZxQp6bBLyEPjudi8pM-F9xEnDMsIhWpgGI9O5N_DMCcN7tUthwUZgYeFreDXi1WBRtlzmg0xWvvXYBld7G4R_cOhvA49O3InyW0nIND2-8z3vzmRxQsoNEFNMSxoAssmJxPka0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/3SweVKUxJlI3QOH-eKniN0_QNqZ0cerKcuOKHoZzyWeIxH9VhRQ707IlqnyNLwHBjrMX8KFB-f6E0JoTLQexFrInxhjxijvj_3HPOYmYkRImZCIkyWW-zWFHOFP2aesJ823Wb2sdp5o=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/m2cUOJcKneuLowdVzj817qO9Q1bvUrVPYn1AejtwevhydhVuXnjIQdd87lzCuOTHQsVkoVJb5ycM91GDMf50lNlau89QvwoF_MdubbK59RfFZm0RdD-rurJMmB2qI44z3nm5DzksIdA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/HvW3yxdbF6sa1GkTPNrW6XLjPuF6rjQx14KJ2n6C86exDNYSaSdTYMBVCdVRFULR7WjCqWSjEfEKEvxx_pF6fdBvAbfcdeI6EMK_Z0veN_f4VSlPBGNjpcnHwjPXPR9BtcNOIY1YYks=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/-JRaI2eJBjPNUP5YhWo6mIWTRWV8iTg4VB3OBEmw9UlkYtc29BoVzoiXLTQYSM_r1Y-g2ztRNYMbFX9giIar3tUevr7WA6uRfL3mSxp-UxfBsr2MO6QUA1bUAvoxmMdz3GUnEUAUQNM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/SUx3F8e5zlC7suL9PtTK-vvtFCnAMJq9y3yYf9EnvH6GNTdE7g0NdsMmcgnrplLD6QuWgYKlnZOh26onIuK78FD7uQFhv9nSDZc1kGAbilJa1jUPh9U38euWEqjWGzqtdOCqoY5A_QY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/JMZUPfxJB9PQqIr_klXFOSGBTB0Nxu0pUnwmcS363FeE0TgjOGQmi-XescWIAqSk_PkJivWHrxPdv30w7wTEWajAUqmrTZjsyqeo2D504ol7q-RondGioQHt3k4QYdQTaa7uqGc71zE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/XDQYdc5kElqF38J5JkgX7Imb6b9nKVrzZMwczcZwBUvJGB8mU0NhesiY6aQXjOlMXEbD0PBKdTtgUfgh1JFATkD1qHkvrantdePtMm0vbZY0KYYaonO-AygrMugUMlPiFPyRkDW2OTI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KzONpVPkieCwY70V447cstyd-v7GMwd4LlpNuVsfJiuehjkbO7NB4d6SHIISizd0DnkEhZyUTsRXDp8KjGQgaBPF1CR4IrnNUJTD1nae1KpwZCbWE-_OPy5Tzc3NBUqbJlTiAGCWYnY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/GiSoHSKZZMGboq2PtJzSYYTTo61SDRH7skIKFFMb6s92ir2DYyHyTigpFOFDSFXen9VP_1NqytdBSSBeWl9qrLZg2MwQhLh-dnkLNQK3-Kz2kHDB0IZ041G7z4JSmLKdeZKF_oZTbGo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hjygBpzV5aw7PyWWJOqtm89x1wDvPrqTJ8MbAKAmNI6Y6My_rpZVkPguMwb7X5iSOlR_hEXQU32DZSuB8lLneyRuLAZDYefpR7m-N0TXtOWpMMj0Uq1A2xRWtKYuuV_h2Lzfsbghl4I=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CFSXgrTT5yF3pyHMeAvDAtvzqChwbG5BLOG7FYTOBr_YcxZAD8jeQmyrSOS9Kl26m49ckVNftc5KzMSk-BbQu21EkbDES9-YiixR-dEsx2GFUcowO9EYCB7mAlWKKS8XRpjq_l8qAWA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/MniMc2GtzwMipR41uMC7a107xLvvOVgIHene983fjjWMeuAIWsr_4aQWMczYMQLInGZj7GXvz7JbcjVFZ6IkHl0T-XWMNPghLRcA_YUVY8F5stzTHqCIjdHBwFKgIGQW2z2pMpD5AyE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/DlhAhQROMn_0HboJlkLL9kAYbRKV_wCdZzH1A5dM-XVJJ5IpVG1039vgMmpsIjYvSh2oOJQrDUf7hg_Q8mL7MmRyHkOE3rcfRHyYJ2uk3CjTtJOAFZ8LHYNwOllCpjCj8JwEnCkMB08=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/eysZJczPIcZXq-sNnyUJfW5IAV4XKOEfmKLd59cvNKPw24-JyphL5KKO8zi_XcartyyiDhu_DrJmjYcEKn2UaU6kG2qie5tCbDCd2OzM-WWNS5skumNmi0bQATcPN5HEus3sOwQsrU0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/pcfqaN-4Ht1oNDonPstgJrNR5Z4Qur8HCcZ8HPFTVBtLBFgDGOvr7YlU9LUdFPid8M-QCHgMYQ2P0VAAHFnLh8m8bM5FJipQEqIsE1469IZajnP7f2DQGvWmImh8JqVb8wm9FXsrQjs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CtNKZvQ5EEve23vniE34t-hIxduTeHDjsl8UqUGfrOA3owBZ0WRaqbiKkJMMtYup-A1iPlB3RsobNRy9hSsD2rGigDR5yKZtBKQ_pW3EbOryP95IuBNMo5OV2GBJjRVY2U_dG_i75Yw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/DtHKVopLKpbUk114byV1xba6DjVK1X8C103W68-3MVuALEfClSYdqY3pntd-HjoSelrt6wxvadTKnJgTzc_xyBNcwup2SGWYvc8OUhaavnkAQFx3jB833xXU9TFTjX5RX7l4Y86SCkA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KOzyxM-f_LnpaiVz1gLERhwGy4d0W1_amaOeofdM2NmiJ_XHrMJH8OvKEk2wSs-0cDeR-qCPY60fPEOwmLnvnlEa3oX8-yInw33jxLFvxIRrDf1NWj4pQhLt5wcwO07z4ovtD6GlUQ8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/-w8dJoP00swRukp-ZijM-ykvSogRjrWp8wAOvnHfwhQ2YGijEPL5AkoHnrXwCRMK2Tdt9oeFvbNTFDRCNuIpAvxtO2-aED8NtMZjg-tkG2fao-RT_J0Qw9gmxapj7f5a1gqd2J5B0Go=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Mg9n1wCUprIV-SydkNY55-Bjmr8KdBRhja-xh0CAELD3gbX136mcGOCUWyPO5DqvArrFY_NNA9AzF-yf0BZauZSGUMebXshA-1EsXSgq94Cx2d4-qfI3Dr1Oy7yGbyrTvtEeJ-lzwGM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/iJYpzTk9GQ57mQHxxaTJQoo343wp9Hc1copiMeAwFt1AaZ7_AQ6ZhNa0MD5JnQPBpYqH6hkDUqcmYjY6-RBXvAuEN8nmxUunQ3qKPukSaX2ZnlQUs8jE8UCA33ylK-GPHB9D6osxfrM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/IbmZ7bvDIPCRm40huC5zYmDph-Iot0Onj6fbPdlR7n8WkNVqlgQKb7NSvntRfA01iTy9kBJNAqzA0cDtSOh-z0o4imBzYgy6ZkDb1G3IuPzUmrtER64FdWIy9iDbAIl2re3wyp68d_0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/s3tXWDn3HM_QxKVQFWs0FsQQ-4UE1M9ycmr0hhQgWFPl_vm7rV7qZlVgbGtgdOEDgg3t7GSZhKZ6I501C_eWWirHrMhkobCQP6i8c1FKo4S-rAkKghTh4VE88Kd35GjwUty2bRzdmLg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/bHK7cb9kWcmiKfFtEmjV_aCbQ9cymI5hxtwVlhropySnYaQw6-HmpIB87dGRubsmz6f9NyCvLxGH1c3vzRi9mRYPUmwx1pfC90QYyQMAV97mJGH82v006rOdvbwzlMbNzI1uYd1BcvU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ZQvmMBLfYIhv-_Vw0i7l1ony9v1opztHlmliS3OugO_n77yeHOVPkCJijBug9CNI9JS4EUHibl-sqbPrACVxkmJakHZoGK9rXux3xQHnMgNNcS7lcnA5v-HJJFU7Wp8WInYKhwNbDuk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/B0WxlBKvsFYvE745rShQXGufjEpcazBB_J0EfeoIISQ5QmpwFq3MZuisoeBULZnvXdyeBH8WAgur2njJj95Xb8_3AgJinNTB7X9KrqMOdPOjq5k45afC7EuFqNOUHZwzeunHpQAWNwU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/0wu_dV-Ivtn4c_XA7qizwv2ZiCK7AgF52VXcPA-PqECoZHHB3qAsC1wIfMW5Tpyb-SZ46AwcmwXvob1Dbs3Z-OOfkEUPuCIpcaFH98DQ9cq_fT-52qqaQaQoD40kFhsrWZU5bHR4n7A=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/5_FSwxoe8wAAEzYmoqQhPA77sk1NpoISqr3IR3w0NzEUvmz_1FxcRUg_T2xeKFG5asiKYoqNslRIT_CfOuLBv4MbkDlGLlEL1qokbbt7Dpc2igALQ6fqfpAb9FAYoD09Mi4tlTm8-kw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/vB-N9oQQmVV-w1gjtiNF4Onez4dFWhg5yU7lJon-fszGlFeV6Zg9Ii0CzFHkqFDOKTjd8SvAGbT6I0L21wND-0GSiqKkZ1rUjKv477h5JgM28fZS_B3v1buc_kXBZKaeEWcaHDaGq8A=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/LZfkyQBHznm_5u-V042lFkiM7Ptu-C9t1EgkLJZ79nEw4D204FsoBHN-n00s0gtuoOxWrY49XCWcbUvtbMuwNCpMaUVnOqAzOac_kzONs03mw9Th5DI3c9z7pi4BfTMsmRl-shuTeAw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/DzPP1oAVOLko2heq0N_rUxGZEcjTQwwV4BKBxJUlYq_7Esg7evZpOTPieefkfabqm8S6kgcf34yZ-W8G2KHbYqzB8049YeFqtfbyOJbFJ7DfRgWZDczpYqRSMzUVAZdhjxRvt2HbxTU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xW8Tk_dcyBiBzvGEsRpF2bDznuGgwBdqSlwaQ2rXYzwW5QiTRELayU4tFFjm4F8R9FBImPeQAQ7rutzwlt7Q8bohHPCTbKOGI1Y319mw8xID4icM4EEZuD7ixtR31sYpNiAU9y3BzFc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/8IXjktja4rDtPxZ1rBla3WPaBLFssMOYbNYdfuVcYCKeZ6t_XWpNXNFJQd1kJuXlLRVyDHCXasHrHLk1JrvRgXDnZfepFpbeiy0EZOszrdgZMoX6wns-HFFgNuHtVAJkag_SXgRJhpo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/5iAv9I1M2a6hszUsdBy9hN6KhMKpFPvTZCSOubsSuCmpnvmARUPExdbpTgw_tDrXPIWj1l0MbY1RFKxDOpXNlhvAQpJGxP_yOoyBykRZ0GCpFh-jTdKfRgGHBx-Em0kLUA4iBfOYahI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/QIrwVh8dkGsu1Q_kiDofPo1vjeChAcQ_V6XSr5aL0UXrKOnuA23yyHQSzfK39p7uFO42TBeqgn99ZBLmksLhOUuDckyqPp025T8YwPaqg-dEhkKhZGOt1BvQEPEmdes9vQcrcfis4PE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/BiiTKxuQ4ZihsGOBz86Og_ZPyOC2ct95y4xPJzDYdjujOmRM7Yuv68tNlX92oWCvxXyHx-SnCiCIftRl28Z_nulENFiQth97bEJQJeut_f4NKVRVMUg5osKfr6Nv23ZISqo7lrysuwo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/4-vu41Tlr-IWHgIIargiyUMxrqfXwEYLqFAs7XYNyFEXR5GntJA9IwFF_Vnngs32raycwX3EeMn3ZTxS29b3ep0FenYk1VPzSvUj0mAMrU3wkdgA5qHmLqTdrt-LC0gNdSDA5M74q5c=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/2cTYeHAFasoaZeAn8aYtpoJGWMFJU7dRX4QyAc8wNcAYY5lgxShalTFfoE49XOBG7oniMXstVgSxENU53r9r4QK3wm8KDfkbfjZYkPc8xlGPuHTl1ih3M93UkL7_SKBVEONffshVmWk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/idEY53mUONIw3U-YzokZd5aC6XXEIGmkYscyl3OKewtRRGnGuXfc7MMoGjYFVj-F_P8ac-ocaCncUa3BmaY4mvtczOm3uEPItI-EaqJ-6gaaIbribc2Kx7Vq8lrZysIcPncoOXE96-c=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/d3Oi60z2278G_FDfiRIS0Ar_7G9WNIMqNgVMeO7vzdM4GIimPrAea5PUKAeP8hiiw8bO36555sdT0Cg08TKShDfj7f22xHWD_7Ajrxly0tl45PavUEvAio_m9traNWIZNZYvTU2YkUU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KLvzcBMJBatXDJWROubT_10A1190gic8qG6VOxq7e2oQPC27Weu8wHmKDCPPLch67kg11k7ERDHaBIodYKD4E0NQr2in7Umcy73u0zHyd3vVT44qONah9Y2sbIf6WItqj7IR8BwiwTk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Hhrm9a7Ndu3ga6qhNs0qgNrSVuyJ-xAECmugOoDEEjvc3mGzYkKwRZMn8UkBBKTbHZ99UJXLBeXKj6VB0BkdndHVn8IS_7dO3_1SoI7F5ReeK1HT9QU-CyGBa6hPOOhCgkgNrBqZHoM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/5G8Oy7-5dgh6Hn77QJGaSXAetwdrqnAnZTuN0qzBlH7_2XVK1IeSJeyK6xadu4o4qbeNWBZxotKX2ugKqniNseq3D5KKOguk1BAFWhz7QIT2tS7VZTXMqDBQl3kl3AN0adDfOiVRVhs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/GQl4Xoy-DjyTB8VqbGFWEzIPnSkw_sR3PO-KD8dJI3R57FOJygEFIoxqhsiUjPDisBptA1ZZPPbs3d5lVJLZ-dnMHpkv1r3ojIAAMLg0svGZSek7nHaBLW8Sp21i5w5xOuwIcQJrlVM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/MtGrY3DMfRf_02tjJNSW6YO-WK0EC4ipKMsKt2Y1H8pRONoYI1P6z7dc7gsSzXnkUs99J-_97aYlyJt2W_gYrVrcvvGrrIrnuGCyP0Uv7J767a6E5a7QjlckqKpWJQshymScLapLErU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/XPCXXoFQCmldVJPOIRNHAGExOQlteeobCLAm3sM9S7-J5drpmJ86lf3LeZISO5gWGeO-mKWkQNUKoVgaUtQNdVU3JwqkbuF4klG8glj8rdIE20ClvuUIwbRiw303_n0hZMIyvrC64fQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CVZwdEJL6Y8AwV1EU94MA-1y1YtPOTrn6CmsbZ4fH02v5L0M0FVqgzt46frI24rhDUNACL7pQ4rTqH2PtIG3VZ19f_H55ACSvrVWa6CDaNQuUujqB1BU3-SId-yt6e8dhJsQFV5doTE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xysiRbccZ6dli7iZg2Svt37pi3-E_sE-i6rHsakG7MRUL1DlYEIeD74LDDHwrsAeVsom2-PYxsW7taeCxkfARPAztmEjomx-FciCiZWRdKq5Vjg7r0KVPAZD_qlwe3DRjmmdovXM290=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/h_C5pALkfcbmlAMiVelBtbOTvxchQMuxU16F4BXMH1w6p3jXH5mLyim-mbuX8LpIoPDAX35jkhJ3Dn6QPkXoP7QUd1U8mhCwRT3Td0cUgK5oIjNky3KcIgQDmMfFHxdX9DmGk2T-D8Y=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/fug757B90tdO-LQmwX4xi3GrThiFK6Uk4HdLOggkYgUZ66AASyG0FuWbIJrdOaYnuX7IyWPmYnttaHhLaRjmdxLUuZRHCi5ehEqVQjh4M6lKOFM09ulb7O5ytFq6iSLjkeEBqCZRTSY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/X-JzeVh5tciUiwZsgsjUfrVFseqJuxQcEx1oF6g1g5l6-x9kbUXgeYA46TNfP1eMO5jMe456Tph894X-KZPfMBW0_apChdC-mtuqzO7gNA317Uax2oiDCmYPuFPkRNYFVWUZhVDsYMM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/cARvSk-ZI-Ty9mDld_QonlwhaWQXfLr3PKo22TX77bLSwbnuxy0ZKRYw-WLgEv7C9Tsz38ZpFV8CA1tQikKgQ1eCo2Ml3RQi8uFrqCsKXhQ5ygTnoelAulhGx7BWZELJTQz_JFxyePs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Wgw81wHwB68RPppaW1eszUkku9LKRwc7nsmbJttpeKEqy5rbhnjyauVId9qBh0PyR9Vh77CMb4nueXXvqYPwpWD4kNQEao8oKZJxIKyyp2O0YP8FVFNZcEPnSgspyaqwh6Uo5DGrFBM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/qulEVd-gXfDDQV0sSCQr0ExTOTEGXHZ6gZD0K2ds8pvSgws_27VApJdHudMu8BSr4oVWr1XMtn1POJ4Kap0jwH2p4yTTZY1EbpFzXEnj9HGNPNYJcs3vcmDF6sInprhJEowpoHfR0T8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/gxpiR4ZbqPaFTTFFGx8DJN4LRolG-qLw9Nb_Kujaaby14HIsoXvB3xuWeFcORQKqMWRGJeHU6DfW9vuWCciD8RX9OV36tJ3b9i_4mmWRLdtwirGuO-YlQNb2J0sialzOTV5mZOgg3Xo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xZjofW4q-p6Xyf_PcRPyCDWSX6xQifqQhal1JN9lY0lQ5n8uNttX36Cw3P9iOS3vBNKB2OO8fSRMUK2RimGG-29n3vdlQGV-rMyLsxLKy_wBC1HP-8V3ISQplHm1Zv3yLdy2Mz9gexQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/BrTwwSXDQv086Wy9cLuel2dPzFUl0XWmr8EUmi8BT59x9h5gbpy24ZmMR8cimYHX2Dbux7kMnd-zYoARjetTt4_HXv3FO2z7ESp64giatLslK0FcdwNL7JpA2mAp-7GOS77Zp-EfY-M=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/zXU_slQVV02U494B9FkWsI55dJISZW09Bqz3YwcMvrB7GwMPsv63eruoxe-DZ2rRuDDtQZl_3SA44_78UEoT5gS9ENesyXpZ0_oafU5WdouyElJc5gTXypaROZuVcp8fffcNUCRRuMk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/G6KRkC351KFz8P1PgGsApqG5qqbYVEiFbELloeV2T4nEmA9n0kAB3-vPwU0OUQWARPXvBaBcxxAlkTYKbt0HeCdSoaRaon4Cyk0r8c4qHpbzK0yoBYPrFnUFO_n182L1jeO9tkacXYA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/PYALgFPhiV6r5-9V68qoipjslQvtUc4hKZJurfHKG_brKDSBvQG7m5iYkNwB8JrVToA5GXTl0X9TPwPbkVgQOHPrcD48BRng5xBcpMc9xMVh6DlwAblw7HiwMnC2Lxsi9H-ES-DLgsQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ov0E_HvqbwjbOqVcK_7oBS6k4nUN9RDXHMZclov63rwHgFpaW0TgGxpgvG_gcAI35yOkwxwb_xJIb59f9-ooy33KlWd_MzAryvUvXrrWXMf7A-JxvMa223bgorK_1DtBRyUkiVVoivI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/IR8o0aWboEMPVgXCjNga7xk2aUL_4WnUjYMBpTd9mnwDrhHmdksMUAN8L4UzD_kZbAEaOI0FwZU7FTDgLVGnU1TzTk1orVFvxcYn5GFII1vI_aGVCmLMamtxRl9zUz_KlMkPsHIPa0k=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Xygg-OQtSQSw3JAC5MhKY0fmW0KFXNAgA0odhAp_NUfLfEcBXVtviAsDlHcQgFmiD_CioFp0O-SgVNWY9sTGvouiFFVW084E7LhNt4xl0lI0ynKp_QHn70Fa8m5-Q98iIVo3dgvABK0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/XrrA6gNPLqlT2XYabt_1kIWyqB676COaRSajLFltyvfznDf_o5p0okNNaox92EbwYXdLSaI2ub8ECAk6YSz1ShKSbclG9ce8wOs012r_VyfxlaJV7EuNlAmCE6Afi-q04bY8vPsiR9E=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/b8RmPpIgHocXXjmDn-wqHHdvJu7UXvlfmj54PwRDbVBxrjFh9urKklEMx3diRqHGM-WU1xCxMdW3Y4QRltMM9nqhYxFIzFtCblU9fHnJmwkuFzTUOKangWS7BK1Yumoxwd8dQdhT7kY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/i6vZL6llR1Py1aeAQewfHvS7W7KdqUO3o8L8-zSEY6JWUnVXC9iX1Y8rM5shrHyQujpCsG1srBTXk3uAFbOfEY72-g09slQF6JuU-t1tETd-ImPgIW419-NwSxOezxxHxOcC9rAErzc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/-j1nvCLpTD4My-qHx8Y-MghMbjwpS_297woPSO3iW_9Z4GZeLPeNEmJ8lsB8W7mtuYoFjQgcb2jwOnkWfYQkW5FuR9p3MbuqLWLxjjWn9TEwiZ862-la5HG_0bz0wLj5T0hj9a1Mfsk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/i7R5G0MOxJLfh-73DU8-dv55MYdPsP7vHGRM-6JfqTT6LOVBq6qnG-ZbhDaUpO3zUjVTHwFiGI63LDbLV7rCQSVLIiTWwod7vOKmgpaHcZLNiH00-BPVsX6oqCOhuy6RL7wEpknLHnY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/X4yOi-2XT1a3fV2ZKHfNc5PfPWosBW3jIEFzGEy8W0sYclr4TPhjQ0b-znVnr8YAFvZxwljr6PvJPFCjK2D3gO0s--G-Ieo09TgnovcjQiJg3HB-cDJCUKBsDtm0fk19iJgFYxO0nG0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/EAVNVCIJVLvZ53A3Doi8uTBzeyUbRt831FJz70k9sNkeWYlKtpPMk-bl_PE3GHLkyqBRrljf-NO3pU_RsXrg8sSpBdAyJQw-b_pRA4KEjusEsCyoLQPOy4RyQacP-KA8IaverFOq6Vc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/MP5fkNknDrok9xTrj1-hRGjYDlTQQH9QTtsos4hCToXlK2_Kn-eJS29KFxkBHZDR-Q47DH1bogIJUqqNqG83fld-rpEEl_1gTuFx8ij78AJNWBZTg9W3Asa9tY00su4lZIaksdBOBLw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/QTIjkB65h7ppYEn5NWU3woUCJVPkqIghHXUHkogJBJ5DfcjH30955lDvlrSK3EquxZDJkLC8rQEQDgnAujhUdhuECFMUdiENj3p7BV4tmiMJtHFF3v0HVjAo2sBgM-wBOrVAE5-gMaM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/qQNQIZuVaSxjVtKmM6bYkABmtzC6hUyhTUKu-M6P8_at_plGxdvjUq0aX3TOk_RXb20RbROfwvUNiVuRU-O-hNoQSbWtvTcZ7PxoDYyulpZH1hdvrdDz-mx6NLReZX7cy7CTyf2Ddto=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/HpGC-zgMy6oSH8Mey_yaw41QXDBCEEhGzMWBHziFu8jWLHl2Tu2b8y4qT9fEzRC1RFQcvPGt1L4rSbJOpV34FjaB4PcqXUftGld33cjW66uCQA7mSQJJOE-JUvRyyB5xrh5n45FxRDI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/vBChO9UwLtN6clAQgyRz8H6J-HF8o_yxk4XrpRl70i9GaXl0fn6dFu9EvEfFKMuLd-h2O8VW4KVT35LmCuzTat3jrStIaBAiNJFar_eDiCLGW-fGtOuayAYw_Js7Z5BMcSHMOd5iCkI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CUusFRYFI72iw5wa4FTaJsPGL5UFW3jW5sYYt4JSaCiW2qc6qF3wZTV5QukQs43kopPHtBbdUwNpC9ZsbZ4Fcg-0s0i_ad7Oc6c8CZBm3DgqrjwGuNCA11knNxXcI6cUjuO2d33GdM4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/lF-liWc5qIloYnODsh5BwaI3ttsPAUPIyhclRtH5C-3ckYBdGw9OGIGdx1HD1jkjqr8m7QE2AMx-eDKk38neVBPhwLBgfZ0XMDm52WSseInuf_J_Eq1x2lL9HkojjGuYx7jUcIpxjts=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/BymvZgvEt-sDL6jh-TG-JFPTGnyP3RkpVXS07B1UFA1n3g34pFCbs1e0e6ABbchsvMAMajhWUUcQSocNXf0KDUxbh7jsvoI-UoqXAXknpvjMMT_qjzIFD3TigrKkpJygx3Izl9ruN88=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/-nb3j3XdHZsGjyZzgItcq4BKSQj-xG0E1xjPGFucnLo-KCahprEyuYo1lTrtfymwCaat2Z8AL2E-xfUjn7GY7r4UQIWkhMYF7LIhytIN6TVykoNy6eCm__oTftUfSVbaIf4gM__M6Qg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/rGsxoAgR_2-0jLTIvpsig1586ll4BMhlBkNNknRqsftbS2uzsMhdioVVFWAnFUWQM8X_Xe3S-PgrnX9AjCAXXuw8Ne6C3_g4At9Jp5qT31O66cw15tMzYvPqhPjN6HrgbzaHPlSgxLk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/2lA4MFQusM-UbkUVWxfheQJEzUMAEdwa4L0qCL__uhYPOS5s66yfbfzJRkb8LNpmCFzVhIVaQrNCY-YueXsMxiNU2pBMps0Liy0x0pNNOc-OdBH5EEnmAMyhTnVZvyPBrRe9nqU4PKQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/95x_i-FYuCammfMHPwXv2ly853TbL2ySFbQXUp4Px-8sijV_LgQkPyWEnzb2PoSi1C9T0mhu4z8cw_mgbITc_75NXUvEu5zBTVqMMSFiv3LUCgBIim9ITpTAONSuDgGWVPknPNuX54c=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KptoiOxfODeCKAl8KBr5hi3F53N5MnP0_MbFkdv8_RhFs5kVZ9to2mmha_XLJalYCl7R_55pmGcvurAXpHT-2J8EjVlM8cnMUBRD_lSTqTFdXq3fYd8gipWggR73tzsZHNpTRApevXA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/c7pDWduy92TJBvvY5xgcYDXt0e7sGN_xgUbVi7VsipOn1zodC5KXQusVfKyko3VwKaQRQxmcz9AA1PTIt9Jh9KzTCr0_jiC6ufiYPhyMTzmjlX6fUbFLfw6gph_qBgxQ-AeqCdkcsRY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/_LUBg5vgVFki16VQilKNZSX8Czmr-ga5n_-N80b_4ZSVM7_ODLE9xvPx1CSye4YOnGvBik8iQOuoWvZF_WmGB7UxjOX-dhkPRNpX1uSKnD6bntILP11rJUuqWADzJzZRA57594aVK04=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/3Mapzd18OPKlG3QqGMm9gqN8FhkOqnbP4VDTbEcKOGBqqB_r-npj8QAvSbf57FTbF_v7d3UjXGJT5KRCaoMzb4r-mXJ07eI2yRUr6P3qHOsdMkMOPHwaloGxMZVjPxzh3bhWE-8bGWI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/DYVIox1Q-PJQAvzUBLrXtrfrjNUhEdjFFDbLJ6c3m0IiqbFf_LjLeJ-EiUb33cMP55KIl9CtyR6KJ7v9V2ftWjrEQoJhM0-zVYktPK33eJb-oZPix6pV8FQ2u6PPw2-ty9fCGxxgbrU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RC6cF1boF1zh0q72GP744wa49EAwCpjMQ8N4BqaDxwjN51ypG4aL3KFFX5YunGvs_8iMeylQasYyGvRcZWSJo31NjwXi46gv0uoyhrpg5CAD8EaeWrOHsEGjAtYz0JwY9SRmXEBvQvU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/jzZfCpVhr0RkM-PU0erc8YJYv1IgRJmsxdn7V2dQvQN0VTTRIVdSnzxynIp1Ed0mePMslc6e7eDyt_PAza0hnFCakajiv0sdlCWqAbds6xIMrWe3jX5aSSrurvMMWrut8tjkvpILZSQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/f3cfsHhFd2N4NElG9_b26GOc3ELXWFOtXQzpCJcwQ0Xhk2LpC21gu5C8Su4rNnwZxUBWW_Cuab-uR7f-02OJUA067Hg5nkd3rvmXAx_eycii5ijKY1s0KAVzVcGOngqhvYRzvdXzgKg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/NeUvsMZ3q54Nc59_qIIKR6jzXfPzOsIiGcPyHgL7T3an0XPoUQbsc3UFb9NeF2oiYROon9CLDrpbzliiQocFuXnNre68FH410dvOsJmcFq5Xu4xp-T-jQ3rs5rpX87U6O9ZmZ2XeYV8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/rco4zENKK-cV2ILaWJpzPIdefKhuQH7jk93qWl4bpPIjlYH3ZNifHGS_-s-rbrbUsW8Y1YPBiGblucaYZXo7ySHG5-coQMzFQHn2_kRfMq-w3kv3ITFtgRg5lbBJLSxI_Zu3HsFlfio=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/gkwqpdTrU9AwCaCEzGr1NZ93SMpfu25NEzwC6qAtnJCCxZQvfmKy2xbtePXSRMB5b0tQXIWZwU2aAaKic5wjgkQrIeTWh6XkzApn7qwroBoIPPZiy2vU-YxBkK3b_JP2Kx1EmE9wDis=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CbezUQjWqH6oc9TTJ_4sVw3RcO0P3WLvaaef8A5EkLEqKpodYmc2YppL-rZSeDItgX-ygZvrXEejyICYe5iDV6eEKZAzQ60UJ_BBbXrRqMQmoWAC2nqSdABmN6zRwCigJy-C58fjHek=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/1Qdl_3SMFigAB48utCCJFODyh0dpffjJA1finbV8iJtUQaMPn7Q49BrE9taDD0QYCvMaPVdKvpKNL6ENzkStwLR9kzr1nEYLSWsh9mk9M0cAjgJ1iBGBRcJHO84YcFpfPHVIJl4DR-8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/eqrafFSN4ekt6SwjxeuY2Z_mKW8uWRxGiNcsvncXjicLWROz6WTpJXzW4LA3MX18QRWI1iq2eYSsTQGC3mCwvkNbm27GiILbisPZUpx1GRR8BlXTS8drHyrRWTOuMnYdG1v81hLuaFU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/09PfJmhNC_Ld-di1TG8OtgudOsTmh3G-JIC15Ibnmh8hN6vG3rKtGQoUcwT3jRWS29uNqCzuJCUDYRTZjPMjye1rWQtcN98-mU9g2XpJUFH7NmCbWiqGJsKkafmuDVMe_A93JICtrf8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/LkCnJ769v2DbMk74aX0gVE9NrTq1i4yURDk7g2AfE2pyRzgXLRnk81uv-QezrcJSmgA2FoazkV0IJZYO2hpHaEOKQa85qt2-7W6fbWq15lWGhkq4D3--kL8j_EF7J92x5QXul8LGmbI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/qabGOHfX4HD3YElmjBt2QdWXpOW58CaY7AnVGUV6HGoZEdquoZEZW2Bn1MWHT5xW3_TgR81o6O5Rx-iTEkrdHl_c3qhiLhGRFwQ7jcWRoFkkugam9r2vrCSSIAr2XggWtLBaWvMhEtw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Ba20nqorgWohHOC1uvkr3h4-mz2SXx6UhfmwnQ-RLkEFlos4CHRh7aCM2u9GTFX7iX2gSaMfwqN-pO-9iYwPejrjArPuqD1cOAHtCx3pmHIe5fwa2szQ17BC5_CexJnSk1B-MC-ctY0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/pCpSc4C0zGWKKU-YiXwNjW7QSN0ByjEihbr3fa_jB29smUssIoCqFt_rCj547o2r16bK7Qwrx7cO4s1DVAISbTGdkgNqIlFGXrRRz1t4eG8L1ruJ1uLeiRKj3GCAdNPSarPyoxmzyks=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/cyNOOWey5gkZhJWNGlfb7MRF8xY1LHI8LRKLB9DchalCprXvb41c8qG-KranhI0rtzgvxLwPFUg3bL5j20I5RQzG4Jq6Jc3iACzso70PjXnM-5w_wYBIwK-Sr-pz1lMYBjlEWPpJgi4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hm2vbBMG74qgyYgkXfdKk23E2aXR117I80iC6pheSZW9p3BIWdpjSqRTAGO94nublstF-JKSbhU8ME5080TB4ucte-u5KGN2690RWK0w3jlfjnamU3JbYxEXeSQxti05gli3KLQSwC8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/AQalT69Y8yo7YelpWu5vpEd1b14ZXLbf4Fdq_VQ4G4Jb95z7s5WzZz-MowOF-TJnmdoy8RhGFP_x6-8_MAsZShzb2UcT7WQ8-OaogryY4zb6XLnDR9FY5L3lBv-I92uspzR0HWgVPNk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/uYwPC6T_NKwZKBrYSFgt_t2-WxkiHLyinJjtrupekHBbLGoNfdeMo76LMxMqVr6H7FXk9aqwCOEDHq1cWCenfTnzqSHatgUFTTL9jjLfFADJ3hbhWGHLMLEHEDaUSb2_AYSiP3J_6E4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/HUoC_NMkRaqJWXaH7hipSMTl1PiHeMPmBtD-BgXAjppEdUvpQlJsFlmwbZM0yLHmuQvRw-g1JZctLunZ73nofAe_PoHjZjpgd31cEQ20cKDv2etc3wHUwnwJf-quHpLwG2gwxj_ARhM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/WokNYcEECVHXAzD9nPDkGYRi55wlsQpJLeIn4cgctcf0Dw8ShKE6IAak_uUZVubW_hl5jCLTNegUt6c3GXcygvpagHxtSKY-ApyOdSk0aDTUzdGUbOYmfdzGWyK6K2XobqAGEEXUHZ4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/E51IymDZfOUQbmJlFeYDws6TRrkngAt5BaED9Ofjps3HtXz1HyAD0BjBR8t19GHUqFvDWDpHH9rFGRu6TukSl0TUpUbZpFdeEJ-1WVsW98HsmN16EbVtHGFnyXHZkvSOsGn0vNX1jhc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xhHcLXpiO0Lm9yR3ccjtxj6LV9AGS61C_ewxd3LUXTvj39wyjiDNrbMjH46s12HJN7ebKs0SfnnllWOF0okHGOAz8L8UaEOV0ufr49q7_bZUILl9iQ0V_BCxxoexp-309U0dz32uyVg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/VvDDdG2Kfzv6gYgrqCn4-2HT7G-vOhCujKYj7w_ysZgjpM0dnP7Dp9fB8y2wJhTpgLQM2BSKIGpxu2EDMr883XiRU4o-qPp-ngM_92OMHojQvrnQZd5CIz3ixD9SHrATbpBhOUwy90U=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/fvzS8l21LLTD6d0pzLfh8SXfmGWulSyUhTn1tNLlA-vik1WrFz0XQtvDsfIbgkeswLeS6nCZ9MvtIDdnOV7-W5Nvaf7IXeeNfDw7eWExoIa2FZSH70YXAI7mE1T8blr7Tm0pzESkmLs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/imLZH1bhc8M8SkAO0DK-XtqyHSc7OGtbcbXxtaGRv-Vl0Kp8nZD2vpOaIWjjiE7JuyMNy9KLz2y5Bex6IHQH-4s_XQezGHWVWyQNH4ZZ81jmz6Lft7aDxsZg95uNYA_iTUBpCojosA4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Cuyf0SO98yxvKHiva_48N30ypHlTnMCynCpxJhPbPjrC-JAJ2foVY1U0KXhrt_tMwchuWQz2bzHbG_r5K8DV5wGqiAurwmYlS6_WAgSRm29XocT7D012zawbk0kywFQnGUdLUW6Rhh0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/HroSVzObTCbo6oFsze1RaRUWN8uuOlFMv-0Q5DMc9K_Ohf4yAgMQNDM08roWs3qYMPVFcRlMBgjFNr-RfsGM_T35RcIT41QNOlSkPq5hUQPfT90eeAgQO3febG24NE8nmHPtO6fkvs8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RszX3I75uTEulPo1M4dPkFTpsu99h_8G7ckGcpHZR1dBIdgRLuZWPY5zWAtPq9dteNOX8xrDkh7YjNFcwcDHNCkzjiPByHSxi3WKP3EnOFtYfncskkL_bknkwR7-j9oZXEzNbB8uS94=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/3NK0yR2ATFOO1Dszg5fgyTcip3zh_Bpxuj5iUeZQvhEN1u9eE6HqhbZaObtpbJlEJ6_FYzcIAUopKSZRnZADhBWh2gUkwVo1EepzgJOFy6h--ZOJuKD8InmaZ9ScqfNYYIA1xR_BOyY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/X39Uo7FDI9GwpVTjPfU9zt3949GjDflpgQqbKaA3T6PIpIuxTObiLJpkutgKspwc37ont7hZi-b-b38TcrSftqhNrjaUjoj4KM3V5ljFuF2m5lqirjCzzHhD2eX9Ttp9VesNq9M0Ees=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ynzenK82RfGrt0t9Ov7FJZRF_of-1m7SoRqMByxz0GTa2cLJKi9A45LjmL0qUFRz9ilZGDCs2Z4ks48FbNgEr1mpy-fQl150ZvaS0MUQQllCLGvCgKtSkBjUOYUlr-I8svy7T5tHveg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/FqKhvm5bhFUnAHVXKJp_cdJX31u52bQmFq-WH2aizqgMpq2ibNl6L2YDXfn9mKApRJOgBv0QHGicVaU8iuAogan04By0alJecitQASiu0idkZMhuuhhiS0ZUpjZO8b2isfEnbl_alxo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/sYCSmD2NlCooBjWswx1dsANZmsKxX1pUAirFLOzGNk-Z8btz-1XVydA7Sh_5mibYKqIcH3epCwyb6hQXTh3E1fQmqxQ_mXyWvzbO-ma-4Wd4rjJUo9Xw2j4hhjfVe2AsjzrGDA9KGzM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/YUYBemo5gK8jIHVN3U3Gg3BvaZPcoyV1-JZCnTNl4zjbU4Gwmcg0j7Tt3zIAnvVjonzwNMQJqnUs2LFYJkLrNyqwaq_Ax2LdZOpqXgEj9D-HKoWvPn5G4HDOKhfVWYRlgdz0noGknVE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/vn3vL5xpzAxETUdw8ifPN1pwfmcJGzdencRH-n7ey5jXQbf4uxFJdLZUS2kq57drjmkFHr51z_Of-v1Pc2XPiUznAdQrcV3_inxx2TA9K2MdApfTmMh8ek6XiyprIowZMxIKuEX3hPk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/u_vaRMP_BxTDDAWo5BOjMtIze2SlUrYr7HIDwpJTRve_Mw9W33GHqpUJfci1bSe7blsvlT78QWDtOmPdUvVm8edJwRzlo-Coakhq0_ppwP9O4wOG6ZJ2oQiESxgqMBdJJhtU42gZNPw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hYnIKEK9Kqdycs-H54sOlxcrn7omu6RFl4GNHLJC-JpyXVhTAb2zZPx0wsonQUJTtlrNAcuuEGTpnpEFslZB6hMyB1c7FPrkPpkNWlVSgOxuUbGZA4BC08o3vswJ3uVDULAOg004pcA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/YLrWopghtvRe41odpbpbNrk_00tvGdlA1D6mgUNKyW8HqO9VO1GhJQD_SvZL_SErX3VktSgHZJsTk7I8I-xLZ8RMMwGv75gk4VwdCGB1-zSdZH6hI__5AfdMlLSouEhu05M0yDdQNzI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/mAEM5RC4KhazcNS3Zm55hkVz6IQBkbLxqy9u4qJsf_PrsmSZCT_tbZc-fCWbWpLUkK_2ygbTPF-fsFZ8qBPlv4ZoLk4PwpUR8aEWy7qqSTW95Zem7cFuQcDtoi-vrmMKVcQBVpnLIq0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/l4SPnuDoCIwiMSWs9eZD2JsgDQ45oS8PAuShfc4E-IWNRTw18XlJio16XDRSAhmmFtLkDIuzPZAKO5PxLiVWPCuzrPv6zcG-y96AwxlCJefvH6s5FpZ2ADY00iym2BD4GQl1F4xOgys=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/XU7z1I1bpcVXaBLL9ghuNitMOZ48WIGkyRpIS0ZR91ZDkS-mDP88VGU7wP__Tyk0-Ay9ugr0mDFCPQ99lHwOPmBody-u_6ngod_k5lnbGzb_rW4GwYynQ09VSToqv3O6ym5sClFISsQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/S7AeZ-KsRLEEN46qrBfbTBT84Vu5uNucMtktO57YS1ClxL9mpqhkJdVjye18z4Oi00B7kYAg1XMWiX5vhBudcgm3mWMRAaHz1FDAY5HwdYk30ipQ5U-RfMOx43IUMDC7hDMInBkouvA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/mvnKS0Xc0gym_lavOJDXGKlBaWasLiFnTgmqEyqTB5SWS4ilXUV6uir-zSqLgf6MpOqYP7PrqBJy6X3nDfbhIhpoGXwKlx8UeIpxUVaCKQVI_wXozDnUIoSomJWQRZ_fR_QpJl6THbs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/i7ZxM1zs3BBrtyfbzbunFtxqJRQOZaAq-_CgGNQ-IOxhPh9LG-XgzHbMfveI4xkajNE-TxSewmmDO0ur17PAuZGCKD4aGHCOXEXFeQIcmS_4S_TNfnHr7yp84EWLCzi5ON08UBjWc8Q=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CoIQApMFj09NahMtlDicsJlZMgKhL6dy3w_DJ8b2wr54TQ10TcjNBD1bZnm5Bvj39D0RZBJor5eBg6RP_hOS3n0SkPHL-rUfzL6U_3AZ5_d8IaT-R8q3s1mv7ta2jdCffD4ZYMmMyts=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/C7-9OrEy_LVrUC62IIWnQ_igWNFkxYsAMOu_fqSDO_SrhenEXCmbxUkZhECvcc1vk-eU8fakzf1stL6qypLiF3TZixTMubtn2VNEKfEa3ZIxj6citdLBHnkv_XK6Ot6JEuNHxZnNh8A=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/LhUL0TYpoBJ2FM1WteFIClHaLrpnd4qCXu28UofO46yjfhWLreNQkSe87md9QN4NnKkgC67_kabx7CU38HUHdBDA3Clb7G3l8WIadbk2U77DeAq1qy2v7H0kn5N-yMvz8Y96HpEJAj4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/CyBfnxqf_FYgjjBuR9CEwGtyK5fioc0FSK4SvISmDb-PiTFvGaZg0ZVgrBG3SHGFa8YOQhxmHDopArqNaZxqL0LviUx3YEcO4Rla-OjeJIhHY3cKAISezLjGIDDoKp8Xgvdv-4W48JM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/T9AvbtyipXOCZrvmYUzQM0WoAfuFX0pfDXiwtUj1vwe9pw02LwkVMxVqAcSx4bm4_5GHgFB2gtvNgCudxxWAWF99laty2ox9HJQETlOYFvMqw61Kdysan6vJQ3qIJBJ9l7FlAjiNC18=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/MsF32H_8RNGDeppek_ziiqR7M8-ovhMm1KHlYNmFDlxrNjZyGbltYmYB73gas-KUyBG3v2betBQ42nftOWNWHuXjaFIqTrV4gdncOUQE1UPWuLXCsKUFCgaD22ytGTpEPUDP3C0z0Co=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/WtEY3FvYnXcVpNR_D5NiUypML77VLOq7INqIH1XFtYxbqViYIpd9YId9pgZZqBBVpZtwFkjl_qMiLpMXISh6z-2_4PMajB0TYiRTQ1iQhFpMYQIVlqaKjbGy3JFYufS8PIme5iQ6dZk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/qkkk3UNPB361TeYdTmtZ4co6yMEXTpPnGlim_p6ojuuyxC0kJM5EkIn6EGp7j-JVKTzwLc2VtxOot591i3_B0oXCEpm6uqF8eLgcjZ0_FlVxiSkTEK266itjtv7kO5OoBl-nCsD3YHc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/cuVNWQ_1vae_mz0F0k8ntgKIujwOsQkP-X_8dx_cuFTqN5Zu9ereHFW90x4UiEc6vfXb0-D_qXtzUWwyYKhs3jVSLrV3dgt2trp7Gl4-P0mWeLGpOObpWn2_BTq4L1ldwQj4-GUgAdo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/y_5gDc8KE3x6lgHVtxALMOES2Sor79R1q0k2C1iKeZ7c3JVybKdKXSvUrdofMyXAC00ngznSnlylAB0PDQbD4IKiE440ne_8VHFemeZOjdkCxR6OlvWi2WW_gCwQQXssZ1W47StkB3E=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/BsXBoQ_jvTDJgzJZTzgfNUzrR1sP2u6jtm44KQOHAgtwmndz92vxkUPqUKNn4TEEEfRZN1yPKO5iZT6_hPiRaOF1n-DisVXUf0N5X-VEYUKzoaguz74jHwUa9L8sZjJCcEzDQTLYr5g=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/rwoahXd6zn9dSk_vtHItQoLLFo8D4SshaFphIT-5HM50DPEcPLh7B6cfsFJjJ3yW8omsB3xaBur9PSiX8l9UumbRIHyfwPudJQP4JXstBUgZ6wwHRnt731LFx_wtk9Y9sxeFpOzqKY0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/s9C7i5H83TzcP8upZeSV_jSv_3kW9q27B9TqDBQBeTn9ATIvTdgshvmD1W_uxShnU589y2W0XrL0Ew_CvjgKIfuDQgbdRbK9fn8VcjzZ0k5PBWDanS_Ay4_SqZ6xchzqKLuKgoGzovI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/EC3cAbRk1JnVGNCmUxmISbxdKrfdio909t6-TY1M2ef0KIuQ9nPguGVPyF_qcz8R72wjREr0HDqNS2FjX0ETRHZ_L2iEITxtMURCKWLtzMJcAl2htD0HTrbT1DWVQfhX_349LKLrqyU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Irocg2GXtsqLgSQ7AcR9KqHLPSD7tM7ay4vS6EuFvsrRV0MiiOhHScIYdWR8AjxgnC9DLjojIxyxef05CW4wSsep77ygAXRjvM1_O3SWVRv7DQFRRjjfoc6D3AtUWuWfcVzktPDMAus=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Z5ZTvqEh6W0W27Opw5xEurpPgjvGnd9sf-MWjC9JuQ30FQjXCX4YpcZ-xXg99M-OtqzWsvq0nLhTCZ3wswBXbPUd9mBnup2PcmQQm5nFFZzNprpAgcoCWSxL0SXdXn4Vj4-cRXBcCAA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/aTm6H2LY6LJgsJh_0LNLXi8XpWx1w-7Z1EFD8ISsN_-ZT4pS_l5mtzwICzPa35_XyL6s7erPXE5LX_o2keDLX7vHpof9G3s52qXLawvkwLeR4ZW528ndt1g5djBPsWiuc6gqZ5HyFV4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/uROFB5q5KzfTmYNLmDKu3aUAd7dioeFLELd8dlLYCLPesnEEw9AOBHzj79qOH98S9f7HDINHiadhYQGAGQlIz5ptYKA9n0dcv_xr6b1Lfbfk514pkwNOxTH8Tgj2_6yHPFFro73lxN0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Y-3U-UusfDqY5_DgwcVRa8W33W_M3wafdrJSQ-gMGmb2vPlcnRW-3kSigYLCVkg_sohlc-jaIwIBoYjyuRzU5SybUuFlxbmKkSTFVn1ToYC0fx_eDaJcRobOjefXaOhuV1qR3jL4d2w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/NakyMbUQNLQT38Tuir6BLF8rXhI0S6RE0ZTuuMLGLHAbf9yGTh9Rqfu_VbLm1swCLnOSx54aO4aPVaWjKGTT4nPfshbWnUrzByTWxPsgPtcIG9WeGSI4DFja5QLlGP_g88uIxh_lcSk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/5asPQ1UzELrtnyajvnxFgn1U8YO0zm9QMZgc3nkUakPzKx4PglOvAVao01gcuks5qihmfCdCjDXFYpebKPU19GHdWALTukD9Qvpb2AtvwS0hpCglbRT0PMQIDtKJuUYenRme7VA2f8s=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ROaCRgNveW0eZHhZLkIAafpfl6T5lb4vHVfXwWUhakBpSWUA7jRdXH_g39TefFeWOI-akZbV82DAcdyTAv50qxH844NYa64_Fty_Hdq9L-yDNTxWJc2VOwQ3E0fKa08_Lf6RHpJAhWU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/8-FoH40mLmewuxxCCHV9D7IvTsHkAHhTrnOl8cwJ6WOhQLMHm_AQfuFLa0qK8Y5jEboUHPt5Fjr_K_PQ4HVVuJYtQE8PT6QM13B53EcLSCO8wESdND0sElqLCahEAXEcFR7Ne_KvwFY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/F6IjkEpso6tQfZnT-_E2uUiLjCTJ6rz-GdM6KyJYzQkmqz9qHBwqmiV-iPtnA49FtPaVwD30_wUfk8REULtr041Tleiz1Lbe4xXeBKbWjQyesIwbiN_sNVN2Pu6cSmvksXWuHZOAbxE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Y4NZ6nMWx3lDYnhsDpLTRab3Mhtf8NLBZlVr7hFu2VaTH6dPA12ItManhKNpFzG8mm2g0KpAJBOndr-w38sPslOnrzmDf3hNMgD6kuLVit2EUCfojxydiMwjpzhHTYr_OIBsjcY-COM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/kjtfzQKcDBGLC5jU70B8xCW5D09Gvy-HJq-bu-cBgiMv_9xB4F0u-2J2FdZBQG9F7wM3VuPNLMtoLoIOUQhTBPfZJaw2Ar-W-MYUq5boN5vdy_HbDBtzOrXPOVMYg_Fm_s1PsygPWSc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RZUNpsCeWJxMCggs3nBuVTepoIo0YMXu8V4TOt2otBt9IgxMd-qDwmp2yx4x34epO6CwqkZ0u5Ldm_hHrjUbTf9NNfLBDCo4nDZn81QfkGSjSHD08fZ4nVmFIS-f6GI2aLh4OLcicDk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RwOycbDpeA8WQ00zMal2QYNUb-y2Z5tU-lKiLBgoL5SEbR-BOW7Jb8rAydHXfm40JB_93r9z68sITOh-8ZlwXGzUvD1AhU-FQ-QMDxUdj_8n5k-od_4n12xF0H_0MduQXN09YLYz8bc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/pHWeI-nJ5T62Ewx7pjcBX1ny4r3ujCUnlsnOAVOQGUlP0wE41mUPZbqGcydabHC-FGXwHP-c75UHbSMZ8GYVdb0PSYM1VWPCKtDMDV2ThqbrtVkaauio2UdKREUZriogcVlF-LgWKoY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/bhZ4ZJxpyZ1uFyXdIjosb5FOBTa4P8YuYzWdbNdAHwl7AsPQZLhMY-IrUOEGn6u7t0orLeoRos94u9B18NpTL8PU0YhymN5fMfeHsq6dELT9Nwo6CpbmP7tD-nkLGYHt5DeZ7t0MIMU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/NcKHwzIAARXP8CIqO7I6cjNDAIInlLoPKbfzx2o745Bv5ge8GdqXZiwCeI9nK7AdyTohvbIqeg_6V51_S7AiGSYLucu_PFe9xdYiC2-N8-e7SR64io60IhqecpeVgWg5Ciz11-3nRsM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/big8TV3bKsy8o2kxN6rXFIkXuPqfCIMkBgzQMmXbveFDgscOG8CbSVLTHUmDeYLkdxSp6awJVnSWGtSX_2fHcRa1dnqOFvMpxo3MS6drXGzpwXg_FUboh3OwTmY3NJy032aXfV6D9hA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/562WRqkR3IvmvM7tyuKFAMzjlw0Ri9auetQILAMCRSYW5N0gGz19dzqIybs44U6PEddgbtAW1jqNTFHweuOMOskAk3ZrTNeQjybNIWsy6mhuOsX5mPrfNe-I4uZqYjQvLo85PUHkWUo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/qt3jc3__e7lend15-hnKRKvogkbbFfhRZKhpdmPt6_s_i6su8gJWkKFAUy61NoRPa6LUbguGnrg-l2G_L2PjO-bh4KihVXnrxk8aDotC5pRva16PcPi5KgoWkjEcy69L1fZ8lYabRIk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RYSkOI_p2tYWOP97gXrXG6sz5E4gXlFJzmdAc7wI0c5YmrceUgU74dZYJ0VPZQnQ0cN-wP8VPaOar61P_WPLP5Tb4bRWMV9flRj19uYCczfhhaTvf9R9B3hYMT_eX22YM-Z7Reeiyk8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/7B2zfScwO--w1HxdcQj-_xL18boDJPvWbqvfXReNGDeqoQT0-fEFJUgKyNmWyp4t2g2l9iM6gOVrTwRC3f72iVUCKLdQGKt6WdwEp5LLJdaOcLFfiEGkAYlTwfBrg7yXLYFhFkeY8Sk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/yzmsf8A7smhBudNbC-FVg_UClXQF_mwp6plwN4FBPRJUmaoQ5UhMQxnKvDrf0EyIl7rS89yHgK4aP6AcoDtclMQwFK1Wej6RDzqSvYPLaC_Ay596re08ZyWzSOL9ZkBiMpz-lvoLJFs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/a9N4Iv4ANkLa7Uc5IS8tlBrdVqv_zGGXbBYoZtiLQJQrFz28ASes0ScBNaiyv4f6l-gcfZbkvzKBxPawtmGWarNQrXVfU8qXnlb-s6ORkxQhHPvYFVARkqs0BMbkwF9uKBOTV2YRQEM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/lhBfCDD0KjbueuK40YsYcZW0RZzVjyCxJsnVRox3EWP-15hFqI7w9U0cKgdSA4I3cRLPf_mieH1_tsISTsrFCawODdQdIAZd_qPfC5HaD9WozZuQdDyy2JivrUQy4BxScYNXWO4MHp8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/LFE_gILUWBUk6HLLyPOhDT-Qp47Zwrxg73q8OihdqDeCLWReEND6wH0ULtr20N_0CnuRwOtpG3gaDkf99pchSUpRmFs5LA_NYhk6XxT4d2u-diFsgY9sULw3Z2MhG8-SHYpQ9x2Ts-Q=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/gBi5wTo_rKK1z1lqUIyLaR2P9gab7bmF5rN632tacJkc8YGeeza9NNS2SbxtJxnMVSM5cUxOLiPwr81p28u38rQ01VLost5D3cZGrN0xch6N53O7sKJkbBFHWOFLFQfA85Q_BLpyd_I=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/zjwpxpaW0gjHD7DoRDl61FwjyY6uKX_hxgJrpKTQvxMEKI2T213bwxb6IELPPx9mVSE-k0d6SliRWq0dxxGAHhWtaaRQWmpgylUS_945kUhPMsABmuhxiwn6ISE4wOSDqP66PHrQ8u8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/xhwpwuVhzd1LGzaG9NUzDOvH1QlQkRf4kTWkANdkrYnGuwMqPqC0cZrC2r7AQ0gza-AIQnFlIOjPovGp6dP8oCbHSD0byQCsLcNng29_u5d9s0k7SFfgfkx1ZvBjDRLkRtIcuJFscCw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/roNLoA4u5QqEGZ6ZBEyhhDTjuyG-jDTuJbwg0IYcohaYfu6eHUg3-erdfrwNusGHri6w0s1ol-CBaXX7g1yC9d2yM_p1yAu2-poq_HYZ8UMsKbPkUA9oODV4Np5i6n2Miuu1NzzPxn0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/U-Knyd504jcvJ5l5SGLkKBxEdVsAcFSBryLfYVG_jCl58wqlAjYsbQLyWnXhSsmeI1uFmLgSE2uQiLJblhDSkRContLaYA3pl09KGr-vWIndMUnImp7FAlJsLef8-5NTmUX-tLgqG9A=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/3feJxFYaBhUVdltL32IWgngBJ1yZeMWQ1tgaTl1tXeyCZ6jDlJF1lc3UspLE1JKRLCT8QkT6OggKpRJ5RVjFvewToen4-Za3XPJr08Nr0uBGKKi3z2lddn9XJqfyxa_-VIrg9FJsFdM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/8aj1eD3r0fTzME12KCEB7076tyRPIdaZEUixWN1jrvmDocvaoMp4JaZhCpctdzTF3r6-gm5FKgeNHHMK1H95PjvwXvsDeVqnUbbtL7g1MFl6iXS4nAbr3_3ZX_fpBKGOkVOjMvrvgoU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/sIYgcmfI2Wki2oJoBfb-yANVyXksYXvsXwQg0y7BxLT94fQwvvyDBJeAIuMSWT4IDIx3fCyIXtbUDugccZOul8lQ5caJNuNiBzDoQm-EIH5PG3XVyxlswh18w5YhuVpulz0R8_H0wRo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/IjQd4qoO-Ep9GUIcAlnyNQyOxivNxEeLiF7vTmkw3KpP2e1v4A1q0ch0tB2VYxtyoiiH90NbFo3ICqwPtSjLFtfylc5isHIRL1JaskC8R3hpDZrG9hQYGZ8pdAnjMeYc5_RsmN2gUQs=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/43bjO35VYxAI38iIzCg220KtfhNE3_CGXArEbJ2EFRn7Sfa6lJTxl-tRrLsL5ctg-d4Kq0RUJqgYTH61l0uMDu82pKSUXPq83BXKMMeLr5CSZGVJs9b1sRZuzeFNQ_TJ2GsgNhzNSTM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/dAt7fE-BJsTqIOUt5SDcfr6nJCe1m61UAUymPFUHmjtSNNIPhMGfsNQJJVgtJFIXaaNYWn9rX4z5dlmQ-t4soPsyW6rElDGhlQOWN7XiCCcPn0T67LkvZVwKqL7jTfJEbIblz4zKRYo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/7NlI6m7uW5Jo2B2wF_HHMPvHE6VJgXsGsaAWj-ThHmfZiGpnhsCpDScW9oGjCA7_0a4S6_H1YVyIV2P5uGMqf6q6Oa2-SVrZw2ysYaZtQYIYsiT6PqjwuPvPKcLrU2u5Fl1T7XYIvEc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/UZ-LVJT_NSlY_Yji7U7WAs2OpY4UHoqpKfqoBQ9LzJQoMcnqgSLlzvDp6LPawAQVRVihrr8NXbAOjrlT5CKKSPEXOqEz0Fi15uOFebQT-f3Gn3l_c2MN1qF-3KlvDLfkS1UfvPT85gc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/KOfFdQ77C4ktlKec265_dClxipd6gBraM8go8MOarn2eOqQ_M0rWI1CilDU1zC1FPDfmrniK9-YpWcFjie9hlFJINgFbZfQYOmMOUTV0xjXKVPF5Pegr12z26Wy1vmYzE4trsSCJW3M=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/yZH8NSb7iqhrpqDddfhM0S92sHzmmDi9MAzvEBWxLNVDZ6fYpA-8228zayt8LwiaxaUKVA904UyRBxYTmA50cZauhfbdjvjpI8eOydJgr4AMt6hICv-eADr1OaBpVv80C27CMMjys8E=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Zw6PlAepPJwYEhgHCna7aFq1tcXvm8m1omiFGUroCN1GV1ufYIq-bGJOhuG52Wphbts95120qYHiZtmJkC88tc9R-ql2aN6dVjzgPSkNKogNvcyfGeRxwsaeee_qa7iocBr_KlRqAEY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/NuTCacLoj8Plx9ghKq7jaGWMfAnPmxTbK16yq1DbTFFeCk90OWAJo4hnXL-m00Ff4Gd-au6aql744qK5_gP_gxG3d5WjkgoZFEBxQt7U540za5BeET1LV7CrR2QoaeUBeTovEwjcbGM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hj4_Q1OzKEgG6X6jkIRzLvYPz27mKayFKoYLIPecONezob7upMMVBqvbXzSC6wMiKfourn2QB1nJxBycSOvyXzltfWxpfuMl-eQ6-IGdwLNSFrZzUEZ5GDKx5EPeLGkA7I5SbVf0ctM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/aSUsj6jzIjA6q99SymjyjR6TK-YuapE_OxiO61birlsQd_KYe6xBIppQURfPyC7e1sRlU0TmLif9Br8FjT2sOYTYFd-X2a2MKo2nifHqbWmY88Dzl4nOU7yHE4yVkHQs_OB5mF3fUXM=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Gv5-lIBEqKiep3KDtMv_-oVd1-62fVW3ZBf-CUvjn2bX2HOHfWT5A7KethY4hy9XFGcdCRaROtbn-gaK3KKgGMFOsQSe4CBT6GMO_psSq-80-V_yj75IDSr7WBQUg2lJzSrMb5DTp0s=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Cr19aSVOSeY76G0UFZX5jq1ofplfRGmFtZD5MRko9qfnrAqmBpWngjMn1Iltv-_Fo5dnKM0Q4maKW0qRDProAxBksE1BVthxw4gUSsOSip-Xs4iKDwOPt9pTLDqCJqDWGqCAoR1abd0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/5tavwO-V7BDg-MKnHTj9h3hRMQSA26UPKILZqQWoCMiVzhXC2qBHfi4OtkZO3JRxHu_YFLcG5U1oSIh39QKJ0vn5qLA4-w8F2yHlQ4JR5z-xfoAt-8QZf_pI3i52SjIsjJ38qnXNIyo=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/nuCyXx3xmmjVKh1dzbYzneYUjYglXwM5-dZlRjjE6-VuuVaHuiUxJMjWIprUAaLc_AEJwwW9KyJqLFUfEpO2CXdLa9jIslkCasy65m001GNYcn-QmUaOhD_CXOxHL9EJFAkCVX9nXOw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/R9kCXsNM8Ft_MTCiFenDL4e_emLMX-kWLTiknUih_qRT0QRFjZirrlZbl1taMoMrEw-U_qH9sFiWLknFhZiBX8hWN3qV6sR0usYthUZxV9n69KwcOzYH7R-FXhtN9IE0_p03621-d0U=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/1TGl0a0f8L0O9slWf0vXTuzHnnQ31bKTMYWb5c9bTeQbsT5-dphNmNOzn-KDCeV_KDXa5JF4P5xkFS0sihgk9dDCmv5PYYkWyCqnZpO4bSKo9MfLxzI8DBIhzE-FHuQmtgAMJ9Vnr8s=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/AuOKiBbiNtpks0Z6cR1Zyqrz8VFWj90sjiWciM3YYCNwvFJwpvZ9DGiSwtny7x5g9er4BsA_7y82JChQ3gKWmQ7h3knN6t3JCqaHfyTFPySA3rNY4PvzlTjNs32g8n5R_-0AyKIikAE=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/3Ow8iD4PwdHKDSS0uq_hRga5de1uUOeECgedHX6Fck4hHMZO4RZITR4kLebRD53fNu8lH6ep6mAykagZv4GnXmJ1elzLrbdKMgnuHLg5AcuCPiLJ6OjUNKvFqjgTtfwgI5c7nEcnzHc=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/B-hIGW7HfECw1waSDe64-KbWlqL1DNW-6N70b3x3eDboq1hraIr6aAdVEIoQYu8MV-3-PjOBQ9kyUZni1H53chOydRnG1RW1Y-MeHRlPVNl4SDslGkzDobax913bPHmAqPs9Xd8zVR8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/er5m-Ev-SYzEUESfPvzV5wDUHSIFH70D1qxSucj3ZGugxK1DHC9ecIpb9jDhhFRtEUfSEAclzOJNNWE1wjYi5QeUG6bqtQ6p9Y4H30ctfWFBz7VzWr77NX3WptHSQ-C-UtIH_Tu3zc0=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/JsvSL0U3NlPw6ed87qvcFepNC-wUqY11M17ygdsGsYUKIsvWnH8wvF5WW8Ebp__B5gMwUQCl3Yq6MoTwwfJwz9u_zwkL908kgVkmX5SnhPAbbN0viI3WzDMLLvKmslc3yXyvZrl-Mnk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/yt27NMcg8FaOQh9xv1lF5nhHuUUzMCyg3KyZPY8aZlpHdURsEcUe8IWu5-7te3KTYN-2R6QvH9YfqzhluPAckPw9_FD-CR2eX24_FC1XPl-M7P8SZmi1jz0tRktXTAG9opsy5NDlJuU=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/y7C3E2u0iajVTYzc27EFMymMWcOAJagBVHdD1b3oR7TDOpuHk8Bdy_t0YY7D4z4JKsZEwzYm9y40zR7IPc3IfRZl4w7PW77ygZiYF37OjGQb_IobUrtkOjQGpfv6I3EIQQh33QNz-Tk=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ERsMDJFMegVXJyRYtxKlbkstU0bUw36bnc4bsCbOAGjfGCrg_00OcanPdFgsek2oIQWM10hrd4YfvNn0pVagA_s9R49o6MGaOV6ZzlU9oM8kIQEmX6Fzh0Yixg7fhHNS_MLNZWV6qKY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/VnLgqZTN3gNKCept-q6Mo9xHW3XyThRQdq593q5GEbUB9_MUxqTu2rtb6gbgxsbgKBIlUJfL4VzZ8LYHqUAiMBWuOMDjDggLtefGEv0ewTvI3XY_GS7ek4F9eRmbQhfndvGXz1m7Wbw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/Tj_JKSypF1Exd2B4E05Kzo2DQ3hBeCtAe67CI7JczfHzpvHMTQ0JEhktTwoFjlblL5tXGbqNvyvG5FZTFrJLvum26gADZ99Ckq67ZzMnvMldmtQYTYUIHSLFU3QTu6ezP42WWG8f0zI=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/DkzKjrHO8qY3Cr4Zn0FUTPgQFnTldLQ9g1hljBxeFpq7zDDR8UQTQTECpPETyX1SXzBnyPqTuJ4BMFkWHpxNcjjhRFRgW8Gr_3fQj6lDvK8ZViplP_IhqAGT1WIxx82gYkqM-dqd1FA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/4AMaOJ4qLmlZ7FUQudYJhwNp0Kb39X-LcASzz-tUsiAmo18az6OHk0-Xc8Tzf_VTbzpthoSOwBMDXthDThjfXsgjS8qfhf4W4Oh1wMA6V9k4-TuId05YTQSMa4kKHZhTPQ8o82B0mk8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ERMLxfvYXUy-rNnxI9L8bB0OvZCU9tm5elnSrgGRLUhD0prrYrOhPsz7nyhF5FKgC7HBz-zXEMP-TLXarY7dq6elaDe6zn4eGEt_j9dkC7r1N20fFAmQxwZQ8ayxNivrhuyxdInx80s=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/gZKxyig7ga0UWQKD-IklENanlATQ83Tp7ICfps28j5IXgzpkrk2PtMRCveIunRPIddX0OpXmGwz-0ApNtsdiTfOcqOKtEWnwgBiuNrScufO9vnNSP-Dg-6f7g8ddSs5Zk2CXyYVo828=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/ntkbOQ9z0r0byC7amN0TYoeAtUTf3J4C41vlnwGADuG3bXE0_PlZJXMVV5vMFPLe-_DTagmu1tAQZKGqbC_ydltSOOR_O7hDkUl51Re2Wtr7JpQ6qMC9_KP6lbec6mTdd5hV0T5whH4=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/68xBKNRx7x5Zl7EVVmyYwGGGglsLFoQCLvdiQNqZzCuPM3Ai_tPrFK6cxZh03bAY9H2xsdbCpKydyBWmeJj_qczRMar4IOnTX6F7VLUFf_ajcP_tJr0W6tDfW-XXY899r347PApaSG8=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/A07TISNQrBd98IcQIbNdNxkXyHjYjvifPgi6lsEvLNmI2rGL3EoK4dfNybRfpwwRLT4UiW5stQp9aTyyFlLIRUH9uE4cSPkOIjL1DYdlAy4aJg5BOuCPi1GWW3U7Bjsb4QXw8gubJ5I=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/JRZcXWsruxsxkeeyxfJuVDKQeJOmLcP2GzZlf6gNiMP6aufBBLPkq9tcgQRkThyFSCdjWGpfA3Z6u_I9jd_2LPHsZZpP2ciqEYyD0YrxVeTOkQnXCM21rNPMZaf1yulyYj-GIhoV8RY=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/9e5zZFHMuCYtkieFNYX952M2ET0UIG9J4yYcROwLS16gaOA3_5bXr7JRlBL4Fz4u424Qp1R-eLjlDpQ7n64RS6m4cda3ws9yjaM9gPZO79rd84mkqyYI78QWyLhnV_tptEKHnWjl46I=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/hSazCuImVrx1QIUDd2dv4DrnjHmJBOFyz-78Kb-u99_hltb2r8k6Sfnv1LHPjmRQi0ZWRgKmz72Vx9BNeZaoWeew3_0qqqca4NgfC7vXyvuLXv1vZo0TKI2qQ9vwZVUCIDJ0GDC2LvY=w1920-h1080"></object>
</div>
</div>
<h1 class="uppercase text-2xl font-bold mt-10 mb-4"><a href="https://photos.app.goo.gl/CmLgcgntsmBgMyNd9">Komunitní fotky a videa</a></h1>
<div class="mb-4">Po přihlášení Google účtem můžete přidat svoje fotky do sdíleného alba! <a href="https://photos.app.goo.gl/CmLgcgntsmBgMyNd9" target="_blank" class="underline hover:no-underline">Odkaz na album</a></div>
<div class="aspect-video">
<div class="pa-gallery-player-widget" style="width:100%; height:100%; display:none;"
data-link="https://photos.app.goo.gl/CmLgcgntsmBgMyNd9"
data-title="UTXO.22 - komunitní fotky"
data-description="12 new items added to shared album"
data-delay="3">
<object data="https://lh3.googleusercontent.com/1-1AHfzfi6xMOo-pAb1k3Bdnxdm4FXVrmTCoS4Xud0zD6y8IJUCR2sEmPFyH5YpNLRBiv6WIH2eibO-8tNT0elTYVKgjer3OP6RX8eDkSksqoZo6Q9nYwdv_JSKekt1BrfpFgKdUJg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/E7BfuNBiciOqGsYlcssMj3AShbnUFtZbQJ-db7x9tb1JX2rVn-bacYj8oSzCN_lM91ESrxLIQ2IvGCO4zLDAWJVaxo6doN6Ja8WmPL51Q84dao_YSBSVbyCOcRa5P2DQj6jyEcJXJg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/fh-5aDW0xpRL249oRd4zz6dkGUJwNBGV2WmiDS7aw2ZuoIHzQ8vPqE0rrEGczZOlrZy1zkSNpD0s5IGucTYPpCQeiybGGPCW1G8tqAzkGGd86tp_I33dXaQm3g0vMV8Db0Pb3_hBKA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/b8P0xqNSmEqpp_C93Rv_9L1O-J3onVpFc7spLXWl-eQwIpqE-qoG8RKTkNsqY4hPLEqgUEuj-j8GaqzhgudCW0Pwfy8VSEyjOhnF7YaAQ59ow5maWhCa76IdFqotnZlpZ8pkbu9Ddw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/4BDdjtJdB12zbAR7AkpKpneHooNXbCCcvCsc47IeOMfLPBFbG0TZvHX0SYSVIzCU50HDhRvXcVDSn4gExguhHCEZLlP2xtc7TRdWjv3t3cZ7GQdfyq1jGprNdg2S6qZT3G5dxBZm5Q=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/8cdQo_Cwova1asAT8XBO_ADnOZO81alPizX_vl7q8K4cHqvXYM4p37N0N89JOBiMunNq_IBXQsUfSlEM-AP_mS32-50ua9rbXARTBzTW5t3MpK4zoZ1UVrLgg5nCVsIqghW-PXX4Rw=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/1Aw2_K8tg4bZTgViGfhRRjh5ONaAS9d9oNSbralDbjpL7J6DXMT1IYTvrvk6MQ7HZpTBFjLQI5P2SoBVwsFk3P7MOjX7h-93Oyv8otyv7CCDpzAwB-mIN0CdsDS1dlyz8F1WA39C3w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/eFO7BE0jLNgpzmN_Pt7plvWfXXsvBGsviPX7hAUdNlHG4BdRAkf78c9hmgL2Q2kPBlhmCZ8NdXqNiYe75bCbXnhGu31BcMC8kb-tSsMRrcp8K3Bs-cJcRREwGX7Uw6_U8eAr8oJBaA=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/RzuxaRs9ZzA9I9wtJXG97wfoZcQgeGwIfps1RrXArxek6Z75ZETdvN461WLlirzh8kvpNLVM2z0vEEcTwKluCEeCWc6xbN6k6PbilJJNHbXjxIMyD8Pspp73Q4pvPcB-CJmhJ9qQXQ=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/vSlagnl2Xysd-PaD9m6pykfPvsmmtFiNrJtiD0cHpPhRH7qSH_kWe_Owc1QRZbhgk4EpZ6aZo743KGxlHmDaqBTFM2cjE74fpZSEHIXupGPmbDEzqERll-nPiwD1EbSnuujtGGWj_w=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/UDuBaXhH-P_ehPub8XGoQjiBfO4h4Sa7y9dyPqi4z_t4W9jbXNyUJlLo01ispT-y0e1KcylsgKKYHSSTxYQ18K9tfGfvH7mOud7F0556rkPAYNUKItdxiXyVRBAG0-Xrqs5ZEnsNpg=w1920-h1080"></object>
<object data="https://lh3.googleusercontent.com/IHMBI8qWRddhj63VplnhHeVf97tPfYYPHURwJUWGTssECaB7XEne9KyIOyT5WBZwa3SFGwljduGEkDKtnHJu5nfEsip4FeRIlUY4MT5E07ogqd4fExojlpxJkX3KjEh2jYX6Jhbb3g=w1920-h1080"></object>
</div>
</div>
</section>

Zobrazit soubor

@ -188,9 +188,9 @@
<section class="mx-auto py-10 px-6 max-w-auto overflow-hidden"> <section class="mx-auto py-10 px-6 max-w-auto overflow-hidden">
<div class="text-blue-web lg:mt-10"> <div class="text-blue-web lg:mt-10">
<div class="text-2xl uppercase font-bold text-center">Partneři</div> <div class="text-2xl uppercase font-bold text-center">Partneři</div>
<div class="mt-6 text-center">Sponzoři</div> <div class="mt-6 text-center">Hlavní sponzoři</div>
<div class="mt-6 flex flex-wrap gap-8 justify-center"> <div class="mt-6 flex flex-wrap gap-8 justify-center">
{#each $bundle.spec.partners.filter((p) => p.type === "sponsor") as p} {#each $bundle.spec.partners.filter((p) => p.type === "sponsor").slice(0,4) as p}
<div class="w-32"> <div class="w-32">
<a href={p.web.url} target="_blank" <a href={p.web.url} target="_blank"
><Avatar ><Avatar
@ -204,6 +204,22 @@
</div> </div>
{/each} {/each}
</div> </div>
<div class="mt-6 text-center">Sponzoři</div>
<div class="mt-6 flex flex-wrap gap-8 justify-center">
{#each $bundle.spec.partners.filter((p) => p.type === "sponsor").slice(4) as p}
<div class="w-32">
<a href={p.web.url} target="_blank"
><Avatar
speaker={p}
col="partners"
size="custom"
customSize="w-20 shadow-xl"
/></a
>
<div class="text-center text-sm uppercase font-bold">{p.name}</div>
</div>
{/each}
</div>
<div class="mt-10 text-center">Komunity</div> <div class="mt-10 text-center">Komunity</div>
<div class="mt-6 flex flex-wrap gap-6 justify-center"> <div class="mt-6 flex flex-wrap gap-6 justify-center">
{#each $bundle.spec.partners.filter((p) => p.type === "community") as p} {#each $bundle.spec.partners.filter((p) => p.type === "community") as p}

90
src/routes/kiosk.svelte Normal file
Zobrazit soubor

@ -0,0 +1,90 @@
<script context="module">
export const prerender = true;
</script>
<script>
import { page } from "$app/stores";
import { onDestroy } from "svelte";
import { bundle } from "$lib/stores";
import { genStatus } from '$lib/schedule.js';
import { formatCET } from "$lib/utils.js";
import { cs } from "date-fns/locale/index.js";
const screens = [
{ type: 'main' },
{ type: 'program' },
]
let pos = 0
let stageStatus = {}
$: stageId = getParam($page.url.search, 's')
$: stage = stageId && $bundle ? $bundle.spec.stages.find(s => s.id === stageId) : null
$: ss = stageId ? stageStatus[stageId] : null
let time = getTime()
function getTime() {
return formatCET(new Date(), 'iiiiii HH:mm:ss', { locale: cs })
}
const intMain = setInterval(() => {
if (pos+1 > screens.length-1) {
pos = 0
} else {
pos++
}
//console.log(pos)
}, 2000)
const intTime = setInterval(() => { time = getTime() }, 1000)
bundle.subscribe((_bundle) => {
genStatus(_bundle, stageStatus);
});
onDestroy(() => {
clearInterval(intMain)
clearInterval(intTime)
})
function getParam(search, param = 's') {
return new URLSearchParams(search).get(param)
}
</script>
{#if $bundle && stage}
<div class="relative w-screen h-screen bg-[url('/img/bg-header.jpg')] bg-cover text-white/50 text-xl">
{#each screens as sc}
<div class="absolute top-0 uppercase text-md py-5 px-5">{stage.name}</div>
<div class="absolute top-0 right-0 uppercase text-md py-5 px-5">{time}</div>
<div class="absolute top-0 left-0 w-full h-full flex text-white text-xl transition-all duration-1000 {sc.type === screens[pos].type ? 'opacity-100' : 'opacity-0'}">
<div class="absolute bottom-0 right-0 uppercase text-md py-5 px-5 w-64 h-36 bg-blue-web">
<div></div>
</div>
{#if sc.type === 'main'}
<div class="text-center m-auto">
<div class="mb-10">Obrazovka I.</div>
<div class="mb-10 text-4xl">{stage.name}</div>
<img src="/img/logo-white.svg" class="w-100" />
<div class="mt-10">Zde budou sponzoři, partneři, atp...</div>
</div>
{/if}
{#if sc.type === 'program'}
<div class="text-center m-auto">
<div class="mb-10">Obrazovka II.</div>
<img src="/img/utxo-tv.svg" class="w-32" />
<div class="mt-10">
{#if ss.current}
<div>{ss.current.event}</div>
{/if}
</div>
</div>
{/if}
</div>
{/each}
</div>
{/if}

Zobrazit soubor

@ -15,6 +15,7 @@
<h1 class="uppercase text-2xl font-bold">Mapa</h1> <h1 class="uppercase text-2xl font-bold">Mapa</h1>
<div class="mt-6"> <div class="mt-6">
TBA <img src="/img/mapa@0.5x.png" alt="Mapa Gabriel Loci" />
</div> </div>
</section> </section>

Zobrazit soubor

@ -18,10 +18,14 @@
<h1 class="uppercase text-2xl font-bold">Praktické informace</h1> <h1 class="uppercase text-2xl font-bold">Praktické informace</h1>
{#if bundle} {#if bundle}
{#each $bundle.spec['practical-info'] as item} {#each $bundle.spec["practical-info"] as item}
<div class="mt-8"> <div class="mt-8">
<div><a id={item.id} href="#{item.id}"><h2 class="text-xl uppercase font-bold">{item.name}</h2></div> <div>
<div class="mt-4"> <a id={item.id} href="#{item.id}"
><h2 class="text-xl uppercase font-bold">{item.name}</h2></a
>
</div>
<div class="mt-4 utxo-markdown">
<SvelteMarkdown source={item.text} {renderers} /> <SvelteMarkdown source={item.text} {renderers} />
</div> </div>
</div> </div>

Zobrazit soubor

@ -9,90 +9,98 @@
import { format, compareAsc, compareDesc } from "date-fns"; import { format, compareAsc, compareDesc } from "date-fns";
import { bundle, userData, loadInfo, schedulePref } from "$lib/stores.js"; import { bundle, userData, loadInfo, schedulePref } from "$lib/stores.js";
import { cs } from "date-fns/locale/index.js"; import { cs } from "date-fns/locale/index.js";
import { parsePeriod } from '$lib/periods.js'; import { parsePeriod } from "$lib/periods.js";
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
const renderers = { link: Link }; const renderers = { link: Link };
import Link from "$lib/Link.svelte"; import Link from "$lib/Link.svelte";
let scheduleTimesArr = null let scheduleTimesArr = null;
let stagesArr = null let stagesArr = null;
let planNumber = 0; let planNumber = 0;
$: plan = $bundle ? $bundle.spec["schedule-candidates"][planNumber] : null; $: plan = $bundle ? $bundle.spec["schedule-candidates"][planNumber] : null;
const params = { const params = {
time: { key: 'time' }, time: { key: "time" },
stage: { key: 'stage' }, stage: { key: "stage" },
desc: { key: 'showDescriptions', type: 'boolean' } desc: { key: "showDescriptions", type: "boolean" },
} };
let subs = [];
let subs = [] subs.push(
page.subscribe(() => {
subs.push(page.subscribe(() => { schedulePref.update((sp) => {
for (const upk of Object.keys(params)) {
schedulePref.update(sp => { const up = params[upk];
for (const upk of Object.keys(params)) { const _sp = $page.url.searchParams.get(upk);
const up = params[upk] if (up.type === "boolean") {
const _sp = $page.url.searchParams.get(upk) if (_sp !== undefined) {
if (up.type === 'boolean') { sp[up.key] = Boolean(_sp);
if (_sp !== undefined) { }
sp[up.key] = Boolean(_sp) } else {
sp[up.key] = _sp ? _sp : "all";
} }
} else {
sp[up.key] = _sp ? _sp : 'all'
} }
} return sp;
return sp });
}) })
})) );
onMount(async () => { onMount(async () => {
const bsub = bundle.subscribe((bundle) => { const bsub = bundle.subscribe((bundle) => {
scheduleTimesArr = scheduleTimes(bundle);
scheduleTimesArr = scheduleTimes(bundle) stagesArr = bundle.spec.stages;
stagesArr = bundle.spec.stages
const pref = {}; const pref = {};
//pref.stages = bundle.spec.stages.map((s) => s.id); //pref.stages = bundle.spec.stages.map((s) => s.id);
//pref.tracks = bundle.spec.tracks.map((s) => s.id); //pref.tracks = bundle.spec.tracks.map((s) => s.id);
//pref.times = scheduleTimesArr.map((s) => s.id); //pref.times = scheduleTimesArr.map((s) => s.id);
//schedulePref.set(pref); //schedulePref.set(pref);
}); });
subs.push(bsub) subs.push(bsub);
const pref = {} const pref = {};
let schedulePrefInicialized = null let schedulePrefInicialized = null;
const spsub = schedulePref.subscribe((sp) => { const spsub = schedulePref.subscribe((sp) => {
const updates = [] const updates = [];
updates.push([ 'time', sp.time === 'all' ? undefined : sp.time ]) updates.push(["time", sp.time === "all" ? undefined : sp.time]);
updates.push([ 'stage', sp.stage === 'all' ? undefined : sp.stage ]) updates.push(["stage", sp.stage === "all" ? undefined : sp.stage]);
updates.push([ 'desc', sp.showDescriptions === null || sp.showDescriptions === false || sp.showDescriptions === undefined ? undefined : true ]) updates.push([
"desc",
sp.showDescriptions === null ||
sp.showDescriptions === false ||
sp.showDescriptions === undefined
? undefined
: true,
]);
let target = '?' let target = "?";
if (updates.length > 0) { if (updates.length > 0) {
for (const up of updates) { for (const up of updates) {
if (up[1] === undefined && $page.url.searchParams.get(up[0]) !== undefined) { if (
$page.url.searchParams.delete(up[0]) up[1] === undefined &&
$page.url.searchParams.get(up[0]) !== undefined
) {
$page.url.searchParams.delete(up[0]);
} else { } else {
$page.url.searchParams.set(up[0], up[1]) $page.url.searchParams.set(up[0], up[1]);
} }
} }
target = `?${$page.url.searchParams.toString()}` target = `?${$page.url.searchParams.toString()}`;
} }
goto(target); goto(target);
return false return false;
}) });
subs.push(spsub) subs.push(spsub);
}); });
onDestroy(() => { onDestroy(() => {
for (const unsub of subs) { for (const unsub of subs) {
unsub() unsub();
} }
}) });
function filterDateStage(arr, date, stageId) { function filterDateStage(arr, date, stageId) {
return arr return arr
@ -129,7 +137,11 @@
rowspans[stage.id]--; rowspans[stage.id]--;
continue; continue;
} }
if (schedulePref && (schedulePref.stage !== stage.id && schedulePref.stage !== 'all')) { if (
schedulePref &&
schedulePref.stage !== stage.id &&
schedulePref.stage !== "all"
) {
continue; continue;
} }
let si = pl.schedule.find( let si = pl.schedule.find(
@ -185,15 +197,15 @@
function scheduleTimes(bundle, filter = false) { function scheduleTimes(bundle, filter = false) {
let arr = bundle.scheduleTimes.map((item, i) => { let arr = bundle.scheduleTimes.map((item, i) => {
const out = parsePeriod(bundle, item); const out = parsePeriod(bundle, item);
out.id = String(i) out.id = String(i);
return out return out;
}); });
if (filter) { if (filter) {
arr = arr.filter(st => st.id === filter || filter === 'all') arr = arr.filter((st) => st.id === filter || filter === "all");
} }
return arr return arr;
} }
function eventTrackClasses(bundle, ev, selectedTracks) { function eventTrackClasses(bundle, ev, selectedTracks) {
@ -203,35 +215,32 @@
return "border border-blue-web/50"; return "border border-blue-web/50";
} }
function isPeriodOverlap(x, y) { function isPeriodOverlap(x, y) {
const xstart = new Date(x.start) const xstart = new Date(x.start);
const xend = new Date(x.end) const xend = new Date(x.end);
const ystart = new Date(y.start) const ystart = new Date(y.start);
const yend = new Date(y.end) const yend = new Date(y.end);
return (xstart.getTime() < yend.getTime() && return (
xend.getTime() > ystart.getTime()); xstart.getTime() < yend.getTime() && xend.getTime() > ystart.getTime()
);
} }
function activeStages (bundle, stages, st, pl) { function activeStages(bundle, stages, st, pl) {
return stages.filter(stage => { return stages.filter((stage) => {
return Boolean(pl.schedule.filter(i => i.stage === stage.id).find(i => isPeriodOverlap(st.period, i.period)) return Boolean(
pl.schedule
) .filter((i) => i.stage === stage.id)
}) .find((i) => isPeriodOverlap(st.period, i.period))
);
});
} }
function allScheduleTimes (bundle) { function allScheduleTimes(bundle) {
return [ return [{ id: "all", name: "Všechny dny" }, ...scheduleTimes(bundle)];
{ id: 'all', name: 'Všechny dny' },
...scheduleTimes(bundle)
]
} }
function allStages (bundle) { function allStages(bundle) {
return [ return [{ id: "all", name: "Všechny sály" }, ...bundle.spec.stages];
{ id: 'all', name: 'Všechny sály' },
...bundle.spec.stages
]
} }
function makeSpoiler(_e) { function makeSpoiler(_e) {
@ -292,7 +301,12 @@
> >
{#each $bundle.spec["schedule-candidates"] as p, i} {#each $bundle.spec["schedule-candidates"] as p, i}
<option value={i} <option value={i}
>#{i} | {p.hash.substring(0,8)} [{["score", "thc:themeCrossing", "tgc:tagsCrossing", "exd:exclusivityDev"] >#{i} | {p.hash.substring(0, 8)} [{[
"score",
"thc:themeCrossing",
"tgc:tagsCrossing",
"exd:exclusivityDev",
]
.map((key) => { .map((key) => {
const [title, rkey] = key.split(":"); const [title, rkey] = key.split(":");
return `${title}:${ return `${title}:${
@ -308,7 +322,9 @@
</div> </div>
<h1 class="uppercase text-2xl font-bold mb-2">Program</h1> <h1 class="uppercase text-2xl font-bold mb-2">Program</h1>
<div class="mb-4"> <div class="mb-4">
<a href="/seznam-udalosti" class="underline hover:no-underline">Seznam všech událostí</a> <a href="/seznam-udalosti" class="underline hover:no-underline"
>Seznam všech událostí</a
>
</div> </div>
<div> <div>
{#if $bundle} {#if $bundle}
@ -316,9 +332,12 @@
<div class="flex gap-1 flex-wrap"> <div class="flex gap-1 flex-wrap">
<div class="font-semibold uppercase my-auto mx-3">Den</div> <div class="font-semibold uppercase my-auto mx-3">Den</div>
{#each allScheduleTimes($bundle) as st} {#each allScheduleTimes($bundle) as st}
<button class="{($schedulePref.time === st.id) ? 'bg-utxo-gradient text-white' : 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-bold py-2 px-4 rounded-full" <button
on:click={() => $schedulePref.time = st.id} class="{$schedulePref.time === st.id
>{st.name}</button> ? 'bg-utxo-gradient text-white'
: 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-bold py-2 px-4 rounded-full"
on:click={() => ($schedulePref.time = st.id)}>{st.name}</button
>
{/each} {/each}
</div> </div>
</div> </div>
@ -326,9 +345,12 @@
<div class="flex gap-1 flex-wrap"> <div class="flex gap-1 flex-wrap">
<div class="font-semibold uppercase my-auto mx-3">Sál</div> <div class="font-semibold uppercase my-auto mx-3">Sál</div>
{#each allStages($bundle) as et} {#each allStages($bundle) as et}
<button class="{($schedulePref.stage === et.id) ? 'bg-utxo-gradient text-white' : 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-bold py-1.5 px-3 rounded-full text-sm" <button
on:click={() => $schedulePref.stage = et.id} class="{$schedulePref.stage === et.id
>{et.name}</button> ? 'bg-utxo-gradient text-white'
: 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-bold py-1.5 px-3 rounded-full text-sm"
on:click={() => ($schedulePref.stage = et.id)}>{et.name}</button
>
<!--div class="u-choose-div m-0.5"> <!--div class="u-choose-div m-0.5">
<label class="cursor-pointer" <label class="cursor-pointer"
><input ><input
@ -347,7 +369,12 @@
</div> </div>
</div> </div>
<div class="mb-4"> <div class="mb-4">
<label><input type="checkbox" bind:checked={$schedulePref.showDescriptions} /> Zobrazit popisy</label> <label
><input
type="checkbox"
bind:checked={$schedulePref.showDescriptions}
/> Zobrazit popisy</label
>
</div> </div>
<!--div class="mb-4"> <!--div class="mb-4">
@ -383,7 +410,6 @@
</div--> </div-->
{/if} {/if}
</div> </div>
</section> </section>
<section class="relative mx-auto pb-6 sm:pb-10 px-0 text-blue-web"> <section class="relative mx-auto pb-6 sm:pb-10 px-0 text-blue-web">
{#if $bundle} {#if $bundle}
@ -402,12 +428,21 @@
<table width="100%" class="table table-auto xl:table-fixed relative"> <table width="100%" class="table table-auto xl:table-fixed relative">
<thead class=""> <thead class="">
<tr> <tr>
<th class="xl:w-16 top-0 sticky bg-white uppercase text-sm px-0.5 text-custom-blue">{format(new Date(st.date), "iiiiii", { locale: cs })}<br />{format(new Date(st.date), "d.M.")}</th> <th
class="xl:w-16 top-0 sticky bg-white uppercase text-sm px-0.5 text-custom-blue"
>{format(new Date(st.date), "iiiiii", { locale: cs })}<br
/>{format(new Date(st.date), "d.M.")}</th
>
{#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage} {#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage}
{#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === 'all')} {#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === "all")}
<th class="text-md py-1.5 px-1 sticky top-0 bg-white align-bottom"> <th
<div class="text-xs font-normal text-blue-web/60 mb-2.5">{stage.capacity.seat} <i class="fa-solid fa-chair"></i> + {stage.capacity.stand} <i class="fa-solid fa-person"></div> class="text-md py-1.5 px-1 sticky top-0 bg-white align-bottom"
<div>{stage.name}</div> >
<div class="text-xs font-normal text-blue-web/60 mb-2.5">
{stage.capacity.seat} <i class="fa-solid fa-chair" /> + {stage
.capacity.stand} <i class="fa-solid fa-person" />
</div>
<div>{stage.name}</div>
</th> </th>
{/if} {/if}
{/each} {/each}
@ -422,7 +457,7 @@
height="60">{ds.title}</th height="60">{ds.title}</th
> >
{#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage} {#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage}
{#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === 'all')} {#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === "all")}
{#if ds.stages[stage.id] === undefined} {#if ds.stages[stage.id] === undefined}
<td /> <td />
{:else if ds.stages[stage.id] !== null} {:else if ds.stages[stage.id] !== null}
@ -441,13 +476,15 @@
{format( {format(
new Date(si.period.start), new Date(si.period.start),
"HH:mm" "HH:mm"
)}-{format(new Date(si.period.end), "HH:mm")} <span class="text-blue-web/80">@{si.id}</span> )}-{format(new Date(si.period.end), "HH:mm")}
<span class="text-blue-web/80">@{si.id}</span>
{#if event.track}[{#each [$bundle.spec.tracks.find((t) => t.id === event.track)] as track}{track.shortname || {#if event.track}[{#each [$bundle.spec.tracks.find((t) => t.id === event.track)] as track}{track.shortname ||
track.name}{/each}]{/if} track.name}{/each}]{/if}
</div> </div>
<div class="font-semibold mt-1"> <div class="font-semibold mt-1">
<a href="/udalosti?id={event.id}" class="hover:underline" <a
>{event.name}</a href="/udalosti?id={event.id}"
class="hover:underline">{event.name}</a
> >
</div> </div>
<div class="text-xs mt-1"> <div class="text-xs mt-1">
@ -458,11 +495,18 @@
</div> </div>
{#if event.description && $schedulePref.showDescriptions} {#if event.description && $schedulePref.showDescriptions}
{#each [makeSpoiler(event)] as spoiler} {#each [makeSpoiler(event)] as spoiler}
<div class="mt-2 overflow-hidden text-sm text-blue-web/90"> <div
<SvelteMarkdown source={spoiler.md} {renderers} /> class="mt-2 overflow-hidden text-sm text-blue-web/90"
>
<SvelteMarkdown
source={spoiler.md}
{renderers}
/>
{#if spoiler.stripped} {#if spoiler.stripped}
<div class="text-xs text-blue-web/60"> <div class="text-xs text-blue-web/60">
(<a href="/udalosti?id={event.id}">Zobrazit celý popis</a>) (<a href="/udalosti?id={event.id}"
>Zobrazit celý popis</a
>)
</div> </div>
{/if} {/if}
</div> </div>

Zobrazit soubor

@ -7,92 +7,106 @@
import { goto } from "$app/navigation"; import { goto } from "$app/navigation";
import { page } from "$app/stores"; import { page } from "$app/stores";
import { format, compareAsc, compareDesc } from "date-fns"; import { format, compareAsc, compareDesc } from "date-fns";
import { formatCET } from "$lib/utils.js";
import { bundle, userData, loadInfo, schedulePref } from "$lib/stores.js"; import { bundle, userData, loadInfo, schedulePref } from "$lib/stores.js";
import { parsePeriod } from "$lib/periods.js";
import { cs } from "date-fns/locale/index.js"; import { cs } from "date-fns/locale/index.js";
import { parsePeriod } from '$lib/periods.js'; import { EventTypes } from "$lib/config.js";
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
import SvelteTooltip from "$lib/SvelteTooltip.svelte";
const renderers = { link: Link }; const renderers = { link: Link };
import Link from "$lib/Link.svelte"; import Link from "$lib/Link.svelte";
let scheduleTimesArr = null let scheduleTimesArr = null;
let stagesArr = null let stagesArr = null;
let planNumber = 0; let planNumber = 0;
$: plan = $bundle ? $bundle.spec.schedule : null; $: plan = $bundle ? $bundle.spec.schedule : null;
const params = { const params = {
time: { key: 'time' }, time: { key: "time" },
stage: { key: 'stage' }, stage: { key: "stage" },
desc: { key: 'showDescriptions', type: 'boolean' } desc: { key: "showDescriptions", type: "boolean" },
} };
let subs = [];
let subs = [] subs.push(
page.subscribe(() => {
subs.push(page.subscribe(() => { schedulePref.update((sp) => {
for (const upk of Object.keys(params)) {
schedulePref.update(sp => { const up = params[upk];
for (const upk of Object.keys(params)) { const _sp = $page.url.searchParams.get(upk);
const up = params[upk] if (up.type === "boolean") {
const _sp = $page.url.searchParams.get(upk) if (_sp !== undefined) {
if (up.type === 'boolean') { sp[up.key] = Boolean(_sp);
if (_sp !== undefined) { }
sp[up.key] = Boolean(_sp) } else {
sp[up.key] = _sp ? _sp : "all";
if (up.key === 'time') {
sp[up.key] = _sp ? _sp : "2";
}
} }
} else {
sp[up.key] = _sp ? _sp : 'all'
} }
} return sp;
return sp });
}) })
})) );
onMount(async () => { onMount(async () => {
const bsub = bundle.subscribe((bundle) => { const bsub = bundle.subscribe((bundle) => {
scheduleTimesArr = scheduleTimes(bundle);
scheduleTimesArr = scheduleTimes(bundle) stagesArr = bundle.spec.stages;
stagesArr = bundle.spec.stages
const pref = {}; const pref = {};
//pref.stages = bundle.spec.stages.map((s) => s.id); //pref.stages = bundle.spec.stages.map((s) => s.id);
//pref.tracks = bundle.spec.tracks.map((s) => s.id); //pref.tracks = bundle.spec.tracks.map((s) => s.id);
//pref.times = scheduleTimesArr.map((s) => s.id); //pref.times = scheduleTimesArr.map((s) => s.id);
//schedulePref.set(pref); //schedulePref.set(pref);
}); });
subs.push(bsub) subs.push(bsub);
const pref = {} const pref = {};
let schedulePrefInicialized = null let schedulePrefInicialized = null;
const spsub = schedulePref.subscribe((sp) => { const spsub = schedulePref.subscribe((sp) => {
const updates = [] const updates = [];
updates.push([ 'time', sp.time === 'all' ? undefined : sp.time ]) updates.push(["time", sp.time === "2" ? undefined : sp.time]);
updates.push([ 'stage', sp.stage === 'all' ? undefined : sp.stage ]) updates.push(["stage", sp.stage === "all" ? undefined : sp.stage]);
updates.push([ 'desc', sp.showDescriptions === null || sp.showDescriptions === false || sp.showDescriptions === undefined ? undefined : true ]) updates.push([
"desc",
sp.showDescriptions === null ||
sp.showDescriptions === false ||
sp.showDescriptions === undefined
? undefined
: true,
]);
let target = '?' let target = "?";
if (updates.length > 0) { if (updates.length > 0) {
for (const up of updates) { for (const up of updates) {
if (up[1] === undefined && $page.url.searchParams.get(up[0]) !== undefined) { if (
$page.url.searchParams.delete(up[0]) up[1] === undefined &&
$page.url.searchParams.get(up[0]) !== undefined
) {
$page.url.searchParams.delete(up[0]);
} else { } else {
$page.url.searchParams.set(up[0], up[1]) $page.url.searchParams.set(up[0], up[1]);
} }
} }
target = `?${$page.url.searchParams.toString()}` target = `?${$page.url.searchParams.toString()}`;
} }
goto(target); goto(target);
return false return false;
}) });
subs.push(spsub) subs.push(spsub);
}); });
onDestroy(() => { onDestroy(() => {
for (const unsub of subs) { for (const unsub of subs) {
unsub() unsub();
} }
}) });
function filterDateStage(arr, date, stageId) { function filterDateStage(arr, date, stageId) {
return arr return arr
@ -129,7 +143,11 @@
rowspans[stage.id]--; rowspans[stage.id]--;
continue; continue;
} }
if (schedulePref && (schedulePref.stage !== stage.id && schedulePref.stage !== 'all')) { if (
schedulePref &&
schedulePref.stage !== stage.id &&
schedulePref.stage !== "all"
) {
continue; continue;
} }
let si = pl.find( let si = pl.find(
@ -152,7 +170,7 @@
} }
} }
} }
arr.push({ title: format(time, "HH:mm"), stages }); arr.push({ title: formatCET(time, "HH:mm"), stages });
time = new Date(time.getTime() + 30 * 60 * 1000); time = new Date(time.getTime() + 30 * 60 * 1000);
} }
return arr; return arr;
@ -185,15 +203,26 @@
function scheduleTimes(bundle, filter = false) { function scheduleTimes(bundle, filter = false) {
let arr = bundle.scheduleTimes.map((item, i) => { let arr = bundle.scheduleTimes.map((item, i) => {
const out = parsePeriod(bundle, item); const out = parsePeriod(bundle, item);
out.id = String(i) out.id = String(i);
return out switch (i) {
case 0:
out.code = "sobota";
break;
case 1:
out.code = "sobota-party";
break;
case 2:
out.code = "nedele";
break;
}
return out;
}); });
if (filter) { if (filter) {
arr = arr.filter(st => st.id === filter || filter === 'all') arr = arr.filter((st) => st.id === filter || filter === "all");
} }
return arr return arr;
} }
function eventTrackClasses(bundle, ev, selectedTracks) { function eventTrackClasses(bundle, ev, selectedTracks) {
@ -203,35 +232,42 @@
return "border border-blue-web/50"; return "border border-blue-web/50";
} }
function isPeriodOverlap(x, y) { $: eventTypes = $bundle && $bundle.spec ? extendEventTypes($bundle) : [];
const xstart = new Date(x.start)
const xend = new Date(x.end) function extendEventTypes(bundle) {
const ystart = new Date(y.start) return bundle.spec["event-types"]
const yend = new Date(y.end) .map((et) => {
return (xstart.getTime() < yend.getTime() && return Object.assign({}, et, EventTypes[et.id]);
xend.getTime() > ystart.getTime()); })
.filter((et) => !et.hidden);
} }
function activeStages (bundle, stages, st, pl) { function isPeriodOverlap(x, y) {
return stages.filter(stage => { const xstart = new Date(x.start);
return Boolean(pl.filter(i => i.stage === stage.id).find(i => isPeriodOverlap(st.period, i.period)) const xend = new Date(x.end);
const ystart = new Date(y.start);
) const yend = new Date(y.end);
}) return (
xstart.getTime() < yend.getTime() && xend.getTime() > ystart.getTime()
);
} }
function allScheduleTimes (bundle) { function activeStages(bundle, stages, st, pl) {
return [ return stages.filter((stage) => {
{ id: 'all', name: 'Všechny dny' }, return Boolean(
...scheduleTimes(bundle) pl
] .filter((i) => i.stage === stage.id)
.find((i) => isPeriodOverlap(st.period, i.period))
);
});
} }
function allStages (bundle) { function allScheduleTimes(bundle) {
return [ return [{ id: "all", name: "Všechny dny" }, ...scheduleTimes(bundle)];
{ id: 'all', name: 'Všechny sály' }, }
...bundle.spec.stages
] function allStages(bundle) {
return [{ id: "all", name: "Všechny sály" }, ...bundle.spec.stages];
} }
function makeSpoiler(_e) { function makeSpoiler(_e) {
@ -252,25 +288,9 @@
console.log(`Event not found: ${eventId}`); console.log(`Event not found: ${eventId}`);
return null; return null;
} }
switch (ev.type) { const et = EventTypes[ev.type];
case "panel": ev.color = et.color ? `${et.colorLight} hover:${et.colorDark}` : "";
ev.color = "bg-orange-400/20 hover:bg-orange-400/40"; console.log(ev.color);
break;
case "talk":
ev.color = "bg-custom-green/20 hover:bg-custom-green/40";
break;
case "workshop":
ev.color = "bg-custom-blue/20 hover:bg-custom-blue/40";
break;
case "campfire":
ev.color = "bg-purple-400/20 hover:bg-purple-400/40";
break;
case "lightning-series":
ev.color = "bg-yellow-400/20 hover:bg-yellow-400/40";
break;
default:
ev.color = "bg-rose-400/20 hover:bg-rose-400/40";
}
return ev; return ev;
} }
</script> </script>
@ -283,8 +303,13 @@
class="relative mx-auto pt-6 sm:pt-10 pb-6 px-6 max-w-6xl text-blue-web print:hidden" class="relative mx-auto pt-6 sm:pt-10 pb-6 px-6 max-w-6xl text-blue-web print:hidden"
> >
<h1 class="uppercase text-2xl font-bold mb-2">Program</h1> <h1 class="uppercase text-2xl font-bold mb-2">Program</h1>
<div class="mb-4"> <div class="mb-4 utxo-program-head">
<a href="/seznam-udalosti" class="underline hover:no-underline">Seznam všech událostí</a> <a href="/seznam-udalosti">Seznam všech událostí</a>, PDF:
<a href="https://pub.utxo.cz/22/pdf/sobota.pdf" target="_blank">sobota</a>,
<a href="https://pub.utxo.cz/22/pdf/sobota-party.pdf" target="_blank"
>sobota (party)</a
>,
<a href="https://pub.utxo.cz/22/pdf/nedele.pdf" target="_blank">neděle</a>
</div> </div>
<div> <div>
{#if $bundle} {#if $bundle}
@ -292,9 +317,12 @@
<div class="flex gap-1 flex-wrap"> <div class="flex gap-1 flex-wrap">
<div class="font-semibold uppercase my-auto mx-3">Den</div> <div class="font-semibold uppercase my-auto mx-3">Den</div>
{#each allScheduleTimes($bundle) as st} {#each allScheduleTimes($bundle) as st}
<button class="{($schedulePref.time === st.id) ? 'bg-utxo-gradient text-white' : 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-bold py-2 px-4 rounded-full" <button
on:click={() => $schedulePref.time = st.id} class="{$schedulePref.time === st.id
>{st.name}</button> ? 'bg-utxo-gradient text-white'
: 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-semibold py-1 px-2 sm:py-2 sm:px-4 rounded-full"
on:click={() => ($schedulePref.time = st.id)}>{st.name}</button
>
{/each} {/each}
</div> </div>
</div> </div>
@ -302,9 +330,12 @@
<div class="flex gap-1 flex-wrap"> <div class="flex gap-1 flex-wrap">
<div class="font-semibold uppercase my-auto mx-3">Sál</div> <div class="font-semibold uppercase my-auto mx-3">Sál</div>
{#each allStages($bundle) as et} {#each allStages($bundle) as et}
<button class="{($schedulePref.stage === et.id) ? 'bg-utxo-gradient text-white' : 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-bold py-1.5 px-3 rounded-full text-sm" <button
on:click={() => $schedulePref.stage = et.id} class="{$schedulePref.stage === et.id
>{et.name}</button> ? 'bg-utxo-gradient text-white'
: 'text-blue-web bg-blue-web-light hover:text-[#E16A61] hover:bg-[#E16A61]/20'} font-semibold py-1 px-2 rounded-full text-sm"
on:click={() => ($schedulePref.stage = et.id)}>{et.name}</button
>
<!--div class="u-choose-div m-0.5"> <!--div class="u-choose-div m-0.5">
<label class="cursor-pointer" <label class="cursor-pointer"
><input ><input
@ -323,7 +354,12 @@
</div> </div>
</div> </div>
<div class="mb-4"> <div class="mb-4">
<label><input type="checkbox" bind:checked={$schedulePref.showDescriptions} /> Zobrazit popisy</label> <label
><input
type="checkbox"
bind:checked={$schedulePref.showDescriptions}
/> Zobrazit popisy</label
>
</div> </div>
<!--div class="mb-4"> <!--div class="mb-4">
@ -359,31 +395,81 @@
</div--> </div-->
{/if} {/if}
</div> </div>
</section> </section>
<section class="relative mx-auto pb-6 sm:pb-10 px-0 text-blue-web"> <section class="relative mx-auto pb-6 sm:pb-10 px-0 text-blue-web">
{#if $bundle} {#if $bundle}
{#each scheduleTimes($bundle, $schedulePref.time) as st} {#each scheduleTimes($bundle, $schedulePref.time) as st}
<div class="max-w-6xl mx-auto px-6 mb-4 print:max-w-full"> <div
<h2 class="uppercase text-xl font-bold"> class="max-w-6xl mx-auto px-6 mb-4 print:max-w-full break-before-page flex flex-wrap gap-3"
>
<h2 class="flex-0 print:flex-1 uppercase text-xl font-bold">
{#if st.name} {#if st.name}
{st.name} {st.name}
{:else} {:else}
{format(new Date(st.date), "iiii d.M.y", { locale: cs })} {formatCET(new Date(st.date), "iiii d.M.y")}
{/if} {/if}
</h2> </h2>
<div
class="flex-1 inline-block ml-2 text-sm font-normal my-auto print:hidden"
>
<a
href="https://pub.utxo.cz/22/pdf/{st.code}.pdf"
target="_blank"
class=""><i class="fa-regular fa-file-pdf" /> PDF</a
>
</div>
<div class="flex flex-wrap sm:flex-nowrap my-auto gap-2 justify-items-end mr-4">
{#each eventTypes as et}
<div class="flex gap-1 w-1/4 text-blue-web">
<div class="w-3 h-3 {et.color} my-auto rounded-sm shrink-0" />
<div class="text-sm print:text-lg my-auto whitespace-nowrap">
{#if et.url}<a href={et.url} target="_blank"
>{et.shortname || et.name}</a
>{:else}{et.shortname || et.name}{/if}
</div>
</div>
{/each}
</div>
<div
class="text-right hidden sm:block float-right text-blue-web/50 text-sm print:text-base my-auto"
>
Aktualizováno: {formatCET(new Date($bundle.time), "d.M.y H:mm")}
</div>
</div> </div>
<div class="relative"> <div class="relative">
<div class="mt-4 mb-10 h-screen sm:h-auto overflow-scroll sm:overflow-clip"> <div
class="mt-4 mb-10 h-screen sm:h-auto overflow-scroll sm:overflow-clip"
>
<table width="100%" class="table table-auto xl:table-fixed relative"> <table width="100%" class="table table-auto xl:table-fixed relative">
<thead class=""> <thead class="">
<tr> <tr>
<th class="xl:w-16 top-0 sticky bg-white uppercase text-sm px-0.5 text-custom-blue">{format(new Date(st.date), "iiiiii", { locale: cs })}<br />{format(new Date(st.date), "d.M.")}</th> <th
class="xl:w-16 top-0 sticky bg-white uppercase text-sm px-0.5 text-custom-blue"
>{formatCET(new Date(st.date), "iiiiii", { locale: cs })}<br
/>{formatCET(new Date(st.date), "d.M.")}</th
>
{#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage} {#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage}
{#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === 'all')} {#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === "all")}
<th class="text-md py-1.5 px-1 sticky top-0 bg-white align-bottom"> <th
<div class="text-xs font-normal text-blue-web/60 mb-2.5">{stage.capacity.seat} <i class="fa-solid fa-chair"></i> + {stage.capacity.stand} <i class="fa-solid fa-person"></div> class="text-md py-1.5 px-1 sticky top-0 bg-white align-bottom"
<div>{stage.name}</div> >
<div class="text-xs font-normal text-blue-web/60 mb-2.5">
{#if stage.livestream}<SvelteTooltip
tip={"Sál je náhrávaný a livestreamovaný."}
bottom="true"
><div class="inline-block mr-2 text-sm cursor-help">
<i class="fa-solid fa-video" />
</div></SvelteTooltip
>{/if}
{stage.capacity.seat} <i class="fa-solid fa-chair" /> + {stage
.capacity.stand} <i class="fa-solid fa-person" />
</div>
<div>
<a
href="/program?stage={stage.id}&time={$schedulePref.time}"
>{stage.name}</a
>
</div>
</th> </th>
{/if} {/if}
{/each} {/each}
@ -398,7 +484,7 @@
height="60">{ds.title}</th height="60">{ds.title}</th
> >
{#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage} {#each activeStages($bundle, $bundle.spec.stages, st, plan) as stage}
{#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === 'all')} {#if $schedulePref && ($schedulePref.stage === stage.id || $schedulePref.stage === "all")}
{#if ds.stages[stage.id] === undefined} {#if ds.stages[stage.id] === undefined}
<td /> <td />
{:else if ds.stages[stage.id] !== null} {:else if ds.stages[stage.id] !== null}
@ -414,16 +500,18 @@
> >
<div class="px-2 py-1 mb-1 mt-1"> <div class="px-2 py-1 mb-1 mt-1">
<div class="text-xs"> <div class="text-xs">
{format( {formatCET(
new Date(si.period.start), new Date(si.period.start),
"HH:mm" "HH:mm"
)}-{format(new Date(si.period.end), "HH:mm")} <span class="text-blue-web/80">@{si.id}</span> )}-{formatCET(new Date(si.period.end), "HH:mm")}
<span class="text-blue-web/80">@{si.id}</span>
{#if event.track}[{#each [$bundle.spec.tracks.find((t) => t.id === event.track)] as track}{track.shortname || {#if event.track}[{#each [$bundle.spec.tracks.find((t) => t.id === event.track)] as track}{track.shortname ||
track.name}{/each}]{/if} track.name}{/each}]{/if}
</div> </div>
<div class="font-semibold mt-1"> <div class="font-bold mt-1">
<a href="/udalosti?id={event.id}" class="hover:underline" <a
>{event.name}</a href="/udalosti?id={event.id}"
class="hover:underline">{event.name}</a
> >
</div> </div>
<div class="text-xs mt-1"> <div class="text-xs mt-1">
@ -434,11 +522,18 @@
</div> </div>
{#if event.description && $schedulePref.showDescriptions} {#if event.description && $schedulePref.showDescriptions}
{#each [makeSpoiler(event)] as spoiler} {#each [makeSpoiler(event)] as spoiler}
<div class="mt-2 overflow-hidden text-sm text-blue-web/90"> <div
<SvelteMarkdown source={spoiler.md} {renderers} /> class="mt-2 overflow-hidden text-sm text-blue-web/90"
>
<SvelteMarkdown
source={spoiler.md}
{renderers}
/>
{#if spoiler.stripped} {#if spoiler.stripped}
<div class="text-xs text-blue-web/60"> <div class="text-xs text-blue-web/60">
(<a href="/udalosti?id={event.id}">Zobrazit celý popis</a>) (<a href="/udalosti?id={event.id}"
>Zobrazit celý popis</a
>)
</div> </div>
{/if} {/if}
</div> </div>
@ -458,10 +553,23 @@
</div> </div>
</div> </div>
{/each} {/each}
<div
class="print:hidden italic max-w-6xl mx-auto px-6 mb-4 print:max-w-full break-before-page flex gap-3"
>
Všechny časy jsou lokální - středoevropské časové pásmo CET (+02:00).
Všechny události jsou v češtině nebo slovenštině, pokud není uvedeno
jinak.
</div>
{:else} {:else}
Načítám .. Načítám ..
{/if} {/if}
</section> </section>
<style> <style>
.utxo-program-head a {
text-decoration: underline;
}
.utxo-program-head a:hover {
text-decoration: none;
}
</style> </style>

Zobrazit soubor

@ -106,13 +106,25 @@
arr = arr.filter((e) => e.track === f.key); arr = arr.filter((e) => e.track === f.key);
} }
if (f.type === "text") { if (f.type === "text") {
const sr = fuse.search(f.key); if (f.key.substring(0, 1) === "@") {
if (sr.length > 0) { const schedule = bd.spec.schedule.find(
arr = sr (e) => e.id === f.key.substring(1)
.map((sr) => arr.find((i) => i.id === sr.item.id)) );
.filter((sr) => sr); if (schedule) {
const ev = bd.spec.events.find((e) => e.id === schedule.event);
arr = [ev];
} else {
arr = [];
}
} else { } else {
arr = []; const sr = fuse.search(f.key);
if (sr.length > 0) {
arr = sr
.map((sr) => arr.find((i) => i.id === sr.item.id))
.filter((sr) => sr);
} else {
arr = [];
}
} }
} }
} }
@ -126,6 +138,7 @@
//minMatchCharLength: 1, //minMatchCharLength: 1,
threshold: 0.4, threshold: 0.4,
keys: [ keys: [
{ name: "scheduleId", weight: 20 },
{ name: "name", weight: 10 }, { name: "name", weight: 10 },
{ name: "description", weight: 7 }, { name: "description", weight: 7 },
{ name: "speakers", weight: 5 }, { name: "speakers", weight: 5 },
@ -160,10 +173,14 @@
</svelte:head> </svelte:head>
<section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web"> <section class="relative mx-auto py-6 sm:py-10 px-6 max-w-6xl text-blue-web">
<h1 class="uppercase text-2xl font-bold"><a href="/program">Program</a> → Seznam událostí</h1> <h1 class="uppercase text-2xl font-bold">
<a href="/program">Program</a> → Seznam událostí
</h1>
<div class="mt-2"> <div class="mt-2">
<p> <p>
<a href="/program" class="underline hover:no-underline">Časový rozpis (program)</a> <a href="/program" class="underline hover:no-underline"
>Časový rozpis (program)</a
>
| <a href="/changelog" class="underline hover:no-underline">Changelog</a> | <a href="/changelog" class="underline hover:no-underline">Changelog</a>
</p> </p>
</div> </div>
@ -228,8 +245,8 @@
</div> </div>
</div> </div>
<div class="mt-4"> <div class="mt-4">
{#each ids as id} {#each ids.map((id) => $bundle.spec.events.find((e) => e.id === id)) as ev}
<Event event={$bundle.spec.events.find((e) => e.id === id)} /> <Event event={ev} />
{/each} {/each}
</div> </div>
<!--div class="mt-4"> <!--div class="mt-4">

Zobrazit soubor

@ -0,0 +1,96 @@
<script context="module">
export const prerender = true;
</script>
<script>
import { page } from "$app/stores";
import { onDestroy } from "svelte";
import { bundle } from "$lib/stores";
import { genStatus } from '$lib/schedule.js';
import { formatCET } from "$lib/utils.js";
import { cs } from "date-fns/locale/index.js";
import Avatar from "$lib/Avatar.svelte";
import { EventTypes } from "$lib/config.js"
const screens = [
{ type: 'main' },
{ type: 'program' },
]
let pos = 0
let stageStatus = {}
$: stageId = getParam($page.url.search, 's')
$: stage = stageId && $bundle ? $bundle.spec.stages.find(s => s.id === stageId) : null
$: ss = stageId ? stageStatus[stageId] : null
$: scheduleId = getParam($page.url.search, 'id')
$: eventId = getParam($page.url.search, 'event')
$: si = $bundle ? $bundle.spec.schedule.find(i => i.id === scheduleId) : null
$: event = si ? $bundle.spec.events.find(e => e.id === si.event) : (eventId && $bundle ? $bundle.spec.events.find(e => e.id === eventId) : null)
function getSpeakers (speakers) {
return speakers.map(sId => {
return $bundle.spec.speakers.find(s => s.id === sId)
})
}
let time = getTime()
function getTime() {
return formatCET(new Date(), 'iiiiii HH:mm:ss', { locale: cs })
}
const intMain = setInterval(() => {
if (pos+1 > screens.length-1) {
pos = 0
} else {
pos++
}
//console.log(pos)
}, 2000)
const intTime = setInterval(() => { time = getTime() }, 1000)
bundle.subscribe((_bundle) => {
genStatus(_bundle, stageStatus);
});
onDestroy(() => {
clearInterval(intMain)
clearInterval(intTime)
})
function getParam(search, param = 's') {
return new URLSearchParams(search).get(param)
}
</script>
{#if $bundle && event}
<div style="width: 1920px; height: 1080px;" class="relative bg-[url('/img/tv-bg.png')] text-white/50 text-xl" id="utxo-tv">
<div class="absolute bottom-20 left-20">
<img src="/img/logo-white.svg" style="width: 520px;" />
</div>
<div class="flex" style="height: 900px;">
<div class="my-auto text-white text-8xl pl-20 pr-20">
<div class="text-5xl mb-10 flex">
<div class="inline-block px-4 py-3 rounded-xl text-black uppercase {EventTypes[event.type].color} w-auto">{EventTypes[event.type].text}</div>
</div>
<div class="font-semibold">{event.name}</div>
<div class="text-6xl flex flex-wrap mt-12 gap-6">
{#each getSpeakers(event.speakers) as speaker}
<div class="flex {event.speakers.length === 1 ? 'text-8xl gap-10' : 'gap-4'}">
<div class="m-auto">
<Avatar speaker={speaker} size="custom" customSize={event.speakers.length === 1 ? 'w-32' : 'w-20'} />
</div>
<div class="m-auto">{speaker.name}</div>
</div>
{/each}
</div>
</div>
</div>
</div>
{/if}

Zobrazit soubor

@ -3,138 +3,108 @@
</script> </script>
<script> <script>
import { onMount, onDestroy } from "svelte"; import { onMount, onDestroy, afterUpdate } from "svelte";
import { bundle, userData } from "$lib/stores.js"; import { bundle, userData } from "$lib/stores.js";
import { format, formatDistanceToNow } from "date-fns"; import { format, formatDistanceToNow } from "date-fns";
import { parsePeriod } from '$lib/periods.js'; import { formatCET } from "$lib/utils.js";
import { genStatus } from '$lib/schedule.js';
import EventTypeLabel from "$lib/EventTypeLabel.svelte"; import EventTypeLabel from "$lib/EventTypeLabel.svelte";
import TVScheduleDesc from "$lib/TVScheduleDesc.svelte";
import Avatar from "$lib/Avatar.svelte"; import Avatar from "$lib/Avatar.svelte";
import YouTube from '$lib/YouTube.svelte'; import YouTube from "$lib/YouTube.svelte";
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
import Link from "$lib/Link.svelte"; import Link from "$lib/Link.svelte";
import { scrollTo, scrollRef, scrollTop } from 'svelte-scrolling'; import { scrollTo, scrollRef, scrollTop } from "svelte-scrolling";
const renderers = { link: Link }; const renderers = { link: Link };
const YToptions = { const maxSingleWidth = 700;
let loading = true;
let clientWidth = 0;
let _clientWidth = 0;
$: width =
clientWidth <= maxSingleWidth ? clientWidth : Math.round(clientWidth / 2);
$: YToptions = {
height: (width / 16) * 9,
width: width,
playerVars: { playerVars: {
autoplay: 0 autoplay: 0,
} },
} };
const stageStatus = {}
const stagePlayers = {}
let events = []
let cachedBundle = []
function typeColor (type) { afterUpdate(async () => {
let color = null if (clientWidth > 0 && loading) {
loading = false;
_clientWidth = clientWidth;
}
if (clientWidth !== _clientWidth) {
loading = true;
setTimeout(() => {
loading = false;
}, 1000);
}
});
const stageStatus = {};
const stagePlayers = {};
let events = [];
let cachedBundle = [];
function typeColor(type) {
let color = null;
switch (type) { switch (type) {
case 'talk': case "talk":
color = 'bg-custom-green/70' color = "bg-custom-green/70";
break break;
case 'panel': case "panel":
color = 'bg-orange-400/70' color = "bg-orange-400/70";
break break;
case 'lightning-series': case "lightning-series":
color = 'bg-yellow-400/70' color = "bg-yellow-400/70";
break break;
case 'other': case "other":
color = 'bg-rose-400/70' color = "bg-rose-400/70";
break break;
} }
return color return color;
} }
bundle.subscribe(_bundle => { bundle.subscribe((_bundle) => {
events = _bundle.spec.schedule events = _bundle.spec.schedule;
cachedBundle = _bundle cachedBundle = _bundle;
genStatus(cachedBundle) genStatus(cachedBundle, stageStatus);
}) });
let interval = null let interval = null;
onMount(() => { onMount(() => {
interval = setInterval(() => { interval = setInterval(() => {
genStatus(cachedBundle) genStatus(cachedBundle, stageStatus);
}, 5000) }, 5000);
}) });
onDestroy(() => { onDestroy(() => {
clearInterval(interval) clearInterval(interval);
}) });
function startStream (stageId) { function startStream(stageId) {
const player = stagePlayers[stageId] const player = stagePlayers[stageId];
if (!player) { if (!player) {
return null return null;
} }
player.playVideo() player.playVideo();
} }
function youtubePlayed (stageId) { function youtubePlayed(stageId) {
for (const pi of Object.keys(stagePlayers)) { for (const pi of Object.keys(stagePlayers)) {
if (pi !== stageId) { if (pi !== stageId) {
console.log(`stopping player: ${pi}`) console.log(`stopping player: ${pi}`);
stagePlayers[pi].stopVideo() stagePlayers[pi].stopVideo();
} }
} }
} }
function findSpeaker (sp, _bundle) { function findSpeaker(sp, _bundle) {
return _bundle.spec.speakers.find(s => s.id === sp) return _bundle.spec.speakers.find((s) => s.id === sp);
}
function extendEvents (arr, _bundle) {
for (const ev of arr) {
ev._event = _bundle.spec.events.find(e => e.id === ev.event)
}
return arr
}
function genStatus(_bundle) {
const now = new Date(`2022-06-04T${format(new Date(), 'HH:mm:ss')}`)
//const now = new Date()
//const now = new Date(`2022-06-04T13:25`)
let globalNextEvents = events.filter(ev => {
return new Date(ev.period.end).getTime() > now.getTime()
})
const stages = _bundle.spec.stages
for (const stage of stages.filter(s => s.livestream)) {
let nextEvents = [...globalNextEvents.filter(e => e.stage === stage.id)]
let current = null
if (nextEvents.length > 0 && new Date(nextEvents[0].period.start).getTime() <= now.getTime()) {
current = nextEvents[0]
nextEvents = nextEvents.slice(1)
}
const allStreams = stage.streams.map(st => parsePeriod(_bundle, st))
const nextStreams = allStreams.filter(s => s.period.end.getTime() >= now.getTime())
if (nextStreams.length === 0) {
nextStreams.push(allStreams[allStreams.length-1])
}
let currentPercentage = null
if (current) {
let duration = (new Date(current.period.end).getTime() - new Date(current.period.start).getTime()) / 1000
let elapsed = Math.floor((now.getTime() - new Date(current.period.start).getTime()) / 1000)
currentPercentage = elapsed/(duration/100)
}
const day = format(new Date(nextStreams[0].period.start), 'yyyy-MM-dd')
let ctime = 0
if (day === '2022-06-05') {
ctime = 2
}
const scheduleLink = `/program?time=${ctime}&stage=${stage.id}&desc=true`
stageStatus[stage.id] = {
current: current ? extendEvents([current], _bundle)[0] : null,
currentPercentage,
next: extendEvents(nextEvents.slice(0,2), _bundle),
stream: nextStreams[0],
scheduleLink
}
}
console.log(stageStatus)
} }
function makeSpoiler(_e) { function makeSpoiler(_e) {
@ -157,20 +127,55 @@
<div class="w-full h-full bg-blue-web-bg/90"> <div class="w-full h-full bg-blue-web-bg/90">
{#if $bundle} {#if $bundle}
<div class="px-16 py-4"> <div class="px-16 py-4">
<div class="flex w-full justify-center lg:pt-6 text-white gap-4 flex-wrap lg:flex-nowrap"> <div
{#each $bundle.spec.stages.filter(s => s.livestream) as stage, i} class="flex w-full justify-center lg:pt-6 text-white gap-4 flex-wrap lg:flex-nowrap"
<div class="w-full md:w-1/3 lg:w-1/4 px-6 py-4 bg-blue-web-bg/70 hover:bg-blue-web-bg rounded-2xl text-center cursor-pointer transition-all shadow-xl" use:scrollTo={stage.id} on:click={() => startStream(stage.id)}> >
<div class="uppercase font-semibold text-white text-lg">#{i+1} {stage.name}</div> {#each $bundle.spec.stages.filter((s) => s.livestream) as stage, i}
<div
class="w-full md:w-1/3 lg:w-1/4 px-6 py-4 bg-blue-web-bg/70 rounded-2xl text-center transition-all shadow-xl"
>
<!--
hover:bg-blue-web-bg
on:click={() => startStream(stage.id)}
use:scrollTo={stage.id}
-->
<div class="uppercase font-semibold text-white text-lg">
<i class="fa-solid fa-video mr-1 text-white/50" />
{stage.name}
</div>
<div class="mt-2 text-sm"> <div class="mt-2 text-sm">
{#each [stageStatus[stage.id]] as ss} {#each [stageStatus[stage.id]] as ss}
{#if ss.current} {#if ss.current}
<div class="text-center mb-2"><span class="uppercase text-xs mr-2 text-white/70"></span> <EventTypeLabel event={ss.current._event} black={true} /></div> <div class="text-center mb-2">
<div class="w-full bg-gray-200 rounded-full h-2 dark:bg-gray-700 mt-4 mb-2 transition-all"> <span class="uppercase text-xs mr-2 text-white/70" />
<div class="{typeColor(ss.current._event.type)} h-2 rounded-full" style="width: {ss.currentPercentage}%"></div> <EventTypeLabel event={ss.current._event} black={true} />
</div>
<div
class="w-full bg-gray-200 rounded-full h-2 dark:bg-gray-700 mt-4 mb-2 transition-all"
>
<div
class="{typeColor(
ss.current._event.type
)} h-2 rounded-full"
style="width: {ss.currentPercentage}%"
/>
</div>
<div>
<span class="text-white/70"
>{formatCET(
new Date(ss.current.period.start),
"HH:mm"
)}-{formatCET(
new Date(ss.current.period.end),
"HH:mm"
)}</span
>
{ss.current._event.name}
</div> </div>
<div><span class="text-white/70">{format(new Date(ss.current.period.start), 'HH:mm')}-{format(new Date(ss.current.period.end), 'HH:mm')}</span> {ss.current._event.name}</div>
{:else} {:else}
<span class="italic">☕ Přestávka {#if ss.next[0]}do {format(new Date(ss.next[0].period.start), 'HH:mm')}{/if}</span> <span class="italic">
<TVScheduleDesc {ss} />
</span>
{/if} {/if}
{/each} {/each}
</div> </div>
@ -178,65 +183,174 @@
{/each} {/each}
</div> </div>
</div> </div>
<section class="relative mx-auto lg:py-6 px-6 text-white"> <section class="relative mx-auto lg:py-6 px-2 lg:px-6 text-white">
{#each $bundle.spec.stages.filter(s => s.livestream) as stage, i} {#each $bundle.spec.stages.filter((s) => s.livestream) as stage, i}
<div use:scrollRef={stage.id} id="{stage.id}" class="mb-8 bg-blue-web-bg/90 p-4 rounded-lg shadow-xl"> <div
id={stage.id}
class="mb-8 bg-blue-web-bg/90 p-4 rounded-lg shadow-xl"
>
<div class="md:flex gap-4"> <div class="md:flex gap-4">
<h1 class="uppercase text-2xl font-bold"><a use:scrollTo={stage.id} on:click={() => startStream(stage.id) }>Stream #{i+1} - {stage.name}</a></h1> <h1 class="uppercase text-2xl font-bold">
<div class="my-auto mt-2 md:mt-0 text-sm flex-1 md:text-right"><a href={stageStatus[stage.id].scheduleLink} class="hover:underline" target="_blank">Program tohoto sálu ({stage.name})</a></div> <a
</div> ><!-- use:scrollTo={stage.id} on:click={() => startStream(stage.id)}-->
<div class="flex gap-6 mt-4 flex-wrap xl:flex-nowrap"> <i class="fa-solid fa-video mr-1 text-white/50" />
<div> {stage.name}</a
<YouTube videoId={stageStatus[stage.id].stream.name} class="bg-blue-web-bg/60" id="player-{stage.id}" options={Object.assign({}, YToptions)} bind:player={stagePlayers[stage.id]} on:play={() => youtubePlayed(stage.id)} /> >
</h1>
<div class="my-auto mt-2 md:mt-0 text-sm flex-1 md:text-right">
<a
href={stageStatus[stage.id].scheduleLink}
class="hover:underline"
target="_blank">Program tohoto sálu ({stage.name})</a
>
</div> </div>
</div>
<div
class="flex gap-6 mt-4 flex-wrap md:flex-nowrap"
bind:clientWidth
>
{#if !loading}
<div use:scrollRef={stage.id}>
<YouTube
videoId={stageStatus[stage.id].stream.name}
class="bg-blue-web-bg/60"
id="player-{stage.id}"
options={Object.assign({}, YToptions)}
bind:player={stagePlayers[stage.id]}
on:play={() => youtubePlayed(stage.id)}
/>
</div>
{:else}
<div
class="w-full h-full bg-blue-web-bg/60 my-2 py-2 text-center my-auo italic text-white/50"
>
Načitám video..
</div>
{/if}
<div class="pr-2 w-full"> <div class="pr-2 w-full">
{#each [stageStatus[stage.id]] as ss} {#each [stageStatus[stage.id]] as ss}
<div> <div>
{#if ss.current} {#if ss.current}
<div class="uppercase text-xs mb-2 font-semibold flex flex-wrap gap-2"> <div
class="uppercase text-xs mb-2 font-semibold flex flex-wrap gap-2"
>
<div class="my-auto whitespace-nowrap">Právě probíhá</div> <div class="my-auto whitespace-nowrap">Právě probíhá</div>
<div class="my-auto"><EventTypeLabel event={ss.current._event} black={true} /></div> <div class="my-auto">
<EventTypeLabel
event={ss.current._event}
black={true}
/>
</div>
</div> </div>
<div class="w-full bg-gray-200 rounded-full h-3 dark:bg-gray-700 mb-3 mt-3"> <div
<div class="{typeColor(ss.current._event.type)} h-3 rounded-full transition-all" style="width: {ss.currentPercentage}%"></div> class="w-full bg-gray-200 rounded-full h-3 dark:bg-gray-700 mb-3 mt-3"
>
<div
class="{typeColor(
ss.current._event.type
)} h-3 rounded-full transition-all"
style="width: {ss.currentPercentage}%"
/>
</div>
<div class="text-xl">
<span class="text-white/70"
>{format(
new Date(ss.current.period.start),
"HH:mm"
)}-{format(
new Date(ss.current.period.end),
"HH:mm"
)}</span
>
<a
href="/udalosti?id={ss.current.event}"
class="hover:underline"
target="_blank">{ss.current._event.name}</a
>
</div> </div>
<div class="text-xl"><span class="text-white/70">{format(new Date(ss.current.period.start), 'HH:mm')}-{format(new Date(ss.current.period.end), 'HH:mm')}</span> <a href="/udalosti?id={ss.current.event}" class="hover:underline" target="_blank">{ss.current._event.name}</a></div>
<div class="flex flex-wrap mt-2 gap-3"> <div class="flex flex-wrap mt-2 gap-3">
{#each ss.current._event.speakers.map(sp => findSpeaker(sp, $bundle)) as speaker} {#each ss.current._event.speakers.map( (sp) => findSpeaker(sp, $bundle) ) as speaker}
<div class="flex gap-2"><Avatar speaker={speaker} size="extra-small" /><div><a href="/lide?id={speaker.id}" target="_blank" class="hover:underline">{speaker.name} {#if speaker.nickname}({speaker.nickname}){/if}</a></div></div> <div class="flex gap-2">
<Avatar {speaker} size="extra-small" />
<div>
<a
href="/lide?id={speaker.id}"
target="_blank"
class="hover:underline"
>{speaker.name}
{#if speaker.nickname}({speaker.nickname}){/if}</a
>
</div>
</div>
{/each} {/each}
</div> </div>
{#if ss.current._event.description} {#if ss.current._event.description}
{#each [makeSpoiler(ss.current._event)] as spoiler} {#each [makeSpoiler(ss.current._event)] as spoiler}
<div class="text-sm mt-2 text-white/80"> <div class="text-sm mt-2 text-white/80">
<SvelteMarkdown source={spoiler.md} {renderers} /> <SvelteMarkdown source={spoiler.md} {renderers} />
{#if spoiler.stripped} {#if spoiler.stripped}
<div class="text-sm text-white/30"> <div class="text-sm text-white/30">
(<a href="/udalosti?id={ss.current.event}" target="_blank">Zobrazit celý popis</a>) (<a
href="/udalosti?id={ss.current.event}"
target="_blank">Zobrazit celý popis</a
>)
</div> </div>
{/if} {/if}
</div> </div>
{/each} {/each}
{/if} {/if}
<div class="text-sm mt-3 text-white/50">{@html ss.current._event.tags.map(t => `<a href="/seznam-udalosti?tag=${t}" target="_blank" class="hover:underline">#${t}</a>`).join(' ')}</div> <div class="text-sm mt-3 text-white/50">
{@html ss.current._event.tags
.map(
(t) =>
`<a href="/seznam-udalosti?tag=${t}" target="_blank" class="hover:underline">#${t}</a>`
)
.join(" ")}
</div>
{:else} {:else}
<div class="text-xl italic">☕ Přestávka {#if ss.next[0]}do {format(new Date(ss.next[0].period.start), 'HH:mm')}{/if}</div> <div class="text-xl italic">
<TVScheduleDesc {ss} />
</div>
{/if} {/if}
</div> </div>
{/each} {/each}
<div class="uppercase text-xs mb-2 font-semibold mt-6"><a href="{stageStatus[stage.id].scheduleLink}" target="_blank">Následuje</div> <div class="uppercase text-xs mb-2 font-semibold mt-6">
<a href={stageStatus[stage.id].scheduleLink} target="_blank"
>Následuje</a
>
</div>
<div class="text-sm 2xl:text-base"> <div class="text-sm 2xl:text-base">
{#each stageStatus[stage.id].next as ne} {#each stageStatus[stage.id].next as ne}
<div><span class="text-white/70">{format(new Date(ne.period.start), 'HH:mm')}-{format(new Date(ne.period.end), 'HH:mm')}</span> <a href="/udalosti?id={ne.event}" target="_blank" class="hover:underline">{ne._event.name}</a></div> <div>
<span class="text-white/70"
>{format(new Date(ne.period.start), "HH:mm")}-{format(
new Date(ne.period.end),
"HH:mm"
)}</span
>
<a
href="/udalosti?id={ne.event}"
target="_blank"
class="hover:underline">{ne._event.name}</a
>
</div>
{/each} {/each}
</div> </div>
<div class="mt-2 text-xs"><a href="{stageStatus[stage.id].scheduleLink}" class="hover:underline" target="_blank">Zobrazit následující program v tomto sále</a></div> <div class="mt-2 text-xs">
<a
href={stageStatus[stage.id].scheduleLink}
class="hover:underline"
target="_blank">Zobrazit následující program v tomto sále</a
>
</div>
</div> </div>
</div> </div>
</div> </div>
{/each} {/each}
</section> </section>
<div class="text-center text-white/50 pb-10">
Všechny časy jsou lokální - středoevropské časové pásmo CET (+02:00).
</div>
{:else} {:else}
Načítám ... Načítám ...
{/if} {/if}

Zobrazit soubor

@ -15,16 +15,19 @@
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
import Link from "$lib/Link.svelte"; import Link from "$lib/Link.svelte";
import Paragraph from "$lib/Paragraph.svelte"; import Paragraph from "$lib/Paragraph.svelte";
import EventSchedule from '$lib/EventSchedule.svelte'; import EventSchedule from "$lib/EventSchedule.svelte";
import YouTube from "$lib/YouTube.svelte";
const renderers = { link: Link, paragraph: Paragraph }; const renderers = { link: Link, paragraph: Paragraph };
$: id = getId($page.url.search); $: id = getId($page.url.search);
$: e = $bundle ? $bundle.spec.events.find((ev) => ev.id === id) : null; $: e = $bundle ? $bundle.spec.events.find((ev) => ev.id === id) : null;
$: duration = e ? calcDuration(e, $bundle) : null; $: duration = e ? calcDuration(e, $bundle) : null;
$: childrens = e ? $bundle.spec.events.filter((i) => i.parent === e.id) : [] $: childrens = e ? $bundle.spec.events.filter((i) => i.parent === e.id) : [];
$: schedule = $bundle ? $bundle.spec.schedule.find(s => s.event === id) : null $: schedule = $bundle
? $bundle.spec.schedule.find((s) => s.event === id)
: null;
function getId(search) { function getId(search) {
const searchParams = new URLSearchParams(search); const searchParams = new URLSearchParams(search);
@ -114,6 +117,15 @@
<SvelteMarkdown source={e.description} {renderers} /> <SvelteMarkdown source={e.description} {renderers} />
</div> </div>
{/if} {/if}
{#if e.video && e.video.youtube}
<div class="mb-10 mt-10">
<div class="mb-4 text-xl font-semibold">Záznam</div>
<YouTube videoId={e.video.youtube} id="player-{e.id}" />
</div>
{/if}
<!--div>
<a href="https://ptej.se/qa/utxo-{schedule.id}" class="underline hover:no-underline" target="_blank">Otázky na přednášejícího/přednášku</a> (ptej.se)
</div-->
{#if e.parent} {#if e.parent}
<div class="mt-6"> <div class="mt-6">
<h2 class="text uppercase mb-4 font-semibold">Součást události:</h2> <h2 class="text uppercase mb-4 font-semibold">Součást události:</h2>

Zobrazit soubor

@ -8,6 +8,7 @@
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
import Link from "$lib/Link.svelte"; import Link from "$lib/Link.svelte";
import * as _ from "lodash"; import * as _ from "lodash";
import QRCode from "$lib/QRCode.svelte";
import { import {
orderTicketForm, orderTicketForm,
bundle, bundle,
@ -260,6 +261,8 @@
); );
$: totalPrice = totalBeforeTip + tip; $: totalPrice = totalBeforeTip + tip;
$: enabled = false;
const orderStatuses = { const orderStatuses = {
new: { new: {
name: "Čeká na platbu", name: "Čeká na platbu",
@ -385,6 +388,8 @@
await loadOrders($userData); await loadOrders($userData);
} }
} }
let qrVisible = null;
</script> </script>
<svelte:head> <svelte:head>
@ -409,7 +414,7 @@
<div <div
class="utxo-ticket-edit-button float-right transition-all" class="utxo-ticket-edit-button float-right transition-all"
> >
<button <!--button
class="text-blue-web/60 hover:text-blue-web/100" class="text-blue-web/60 hover:text-blue-web/100"
on:click={handleTicketEditShow( on:click={handleTicketEditShow(
ticket.id, ticket.id,
@ -417,7 +422,7 @@
ticket.orderId, ticket.orderId,
$userData $userData
)}><i class="fas fa-edit" /></button )}><i class="fas fa-edit" /></button
> -->
</div> </div>
{/if} {/if}
<div class="flex gap-3 text-sm"> <div class="flex gap-3 text-sm">
@ -571,6 +576,27 @@
> >
</div> </div>
{/if} {/if}
<div class="mt-2">
{#if qrVisible === ticket.id}
<div class="mt-2">
<QRCode value="{ticket.id}:{ticket.secret}" />
<div class="mt-2">
<a
href="#"
class="underline hover:no-underline"
on:click={() => (qrVisible = null)}>Schovat QR kód</a
>
</div>
</div>
{:else}
<a
href="#"
class="underline hover:no-underline"
on:click={() => (qrVisible = ticket.id)}
>Zobrazit QR kód</a
>
{/if}
</div>
</div> </div>
</div> </div>
{/each} {/each}
@ -583,7 +609,7 @@
<div class="mt-4">Nemáte žádnou vstupenku</div> <div class="mt-4">Nemáte žádnou vstupenku</div>
{/if} {/if}
</div> </div>
{#if $apiStatus} {#if $apiStatus && enabled}
{#if orders.length > 0} {#if orders.length > 0}
<div class="mt-10"> <div class="mt-10">
<h1 class="uppercase text-2xl font-bold">Vaše objednávky</h1> <h1 class="uppercase text-2xl font-bold">Vaše objednávky</h1>
@ -637,9 +663,11 @@
Platební metoda: <span class="font-bold" Platební metoda: <span class="font-bold"
>{$apiStatus.config.paymentMethods.find( >{$apiStatus.config.paymentMethods.find(
(pm) => pm.id === order.paymentMethod (pm) => pm.id === order.paymentMethod
) ? $apiStatus.config.paymentMethods.find( )
(pm) => pm.id === order.paymentMethod ? $apiStatus.config.paymentMethods.find(
).shortname : 'null (?)'}</span (pm) => pm.id === order.paymentMethod
).shortname
: "null (?)"}</span
> >
</div> </div>
</div> </div>
@ -722,8 +750,7 @@
vstupenky ({$apiStatus.wave.live.waiting}) se postupně vrací do vstupenky ({$apiStatus.wave.live.waiting}) se postupně vrací do
prodeje. prodeje.
{:else} {:else}
Aktuální vlna vstupenek je vyprodaná. Další budou k dispozici od Vyprodáno!
27. dubna 13:00.
{/if} {/if}
</div> </div>
{:else if !showOrder && !forceShow} {:else if !showOrder && !forceShow}
@ -949,31 +976,34 @@
<div class="mt-8"> <div class="mt-8">
<div class="uppercase text-sm font-bold">Platební metoda</div> <div class="uppercase text-sm font-bold">Platební metoda</div>
<div class="mt-2"> <div class="mt-2">
{#if $apiStatus.config.paymentMethods.find(pm => pm.id === 'btcpay') && ($apiStatus.config.paymentMethods.find(pm => pm.id === 'btcpay').hidden = true)} {#if $apiStatus.config.paymentMethods.find((pm) => pm.id === "btcpay") && $apiStatus.config.paymentMethods.find((pm) => pm.id === "btcpay").hidden === true}
<div class="mb-4 text-sm">Platba pomocí BTC není dočasně k dispozici, zkuste to prosím později. Omlouváme se :(</div> <div class="mb-4 text-sm">
Platba pomocí BTC není dočasně k dispozici, zkuste to
prosím později. Omlouváme se :(
</div>
{/if} {/if}
{#each $apiStatus.config.paymentMethods as pm} {#each $apiStatus.config.paymentMethods as pm}
{#if !pm.hidden} {#if !pm.hidden}
<div class="mb-2"> <div class="mb-2">
<label class="cursor-pointer" <label class="cursor-pointer"
><input ><input
checked={$orderTicketForm.paymentMethod === pm.id} checked={$orderTicketForm.paymentMethod === pm.id}
name="paymentMethod" name="paymentMethod"
value={pm.id} value={pm.id}
type="radio" type="radio"
on:change={selectPaymentMethod} on:change={selectPaymentMethod}
class="cursor-pointer" class="cursor-pointer"
/> />
{pm.name} {pm.name}
{#if pm.id === "btcpay"}<span class="ml-4 text-xs" {#if pm.id === "btcpay"}<span class="ml-4 text-xs"
><i class="fas fa-heart text-red-500" /> Doporučujeme</span ><i class="fas fa-heart text-red-500" /> Doporučujeme</span
>{/if} >{/if}
{#if pm.id === "card"}<img {#if pm.id === "card"}<img
src="/img/credit-card-logos.png" src="/img/credit-card-logos.png"
class="h-6 leading-7 inline ml-2" class="h-6 leading-7 inline ml-2"
/>{/if} />{/if}
</label> </label>
</div> </div>
{/if} {/if}
{/each} {/each}
</div> </div>

Zobrazit soubor

@ -77,7 +77,7 @@
}, },
partner: { title: "Partner", hostTitle: "Host partnera", col: "partners" }, partner: { title: "Partner", hostTitle: "Host partnera", col: "partners" },
host: { title: "Host" }, host: { title: "Host" },
team: { title: "Team", hostTitle: "Host organizátora" } team: { title: "Team", hostTitle: "Host organizátora" },
}; };
function makeTicketTypeInfo(c) { function makeTicketTypeInfo(c) {

binární
static/img/mapa.jpg Normal file

Binární soubor nebyl zobrazen.

Za

Šířka:  |  Výška:  |  Velikost: 2.0 MiB

binární
static/img/mapa@0.5x.png Normal file

Binární soubor nebyl zobrazen.

Za

Šířka:  |  Výška:  |  Velikost: 166 KiB

binární
static/img/tv-bg.png Normal file

Binární soubor nebyl zobrazen.

Za

Šířka:  |  Výška:  |  Velikost: 1.9 MiB