From a0e116f24ece9488348adc627f579a208e847054 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 21 Jul 2026 19:14:20 +0200 Subject: [PATCH] feat: add lab-rv32i-c-machine-timer card --- .gitignore | 11 + Makefile | 59 + README.md | 65 + crt0.S | 25 + doc/generated/.gitkeep | 1 + doc/generated/main.tex | 478 +++ doc/pdf/.gitkeep | 1 + ...1-45f57fde-fc7b-5f41-a3af-f153202dff0f.pdf | Bin 0 -> 258421 bytes json/card_source.json | 667 +++++ json/card_spec.json | 233 ++ scripts/render_card_layouts.sh | 10 + scripts/render_new_pdf.sh | 14 + src/tasks/machine_timer.h | 85 + src/tasks/task01_mtime_consistent_read.c | 66 + src/tasks/task02_oneshot_timer_irq.c | 66 + src/tasks/task03_periodic_absolute_deadline.c | 105 + tests/test_card.sh | 49 + tests/test_hazard3.sh | 102 + web/app.css | 1 + web/app.js | 61 + web/card-data.json | 2567 +++++++++++++++++ web/index.html | 15 + web/style.css | 39 + 23 files changed, 4720 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 crt0.S create mode 100644 doc/generated/.gitkeep create mode 100644 doc/generated/main.tex create mode 100644 doc/pdf/.gitkeep create mode 100644 doc/pdf/mpabi-inf-c-11-machine-timer-v00.01-45f57fde-fc7b-5f41-a3af-f153202dff0f.pdf create mode 100644 json/card_source.json create mode 100644 json/card_spec.json create mode 100755 scripts/render_card_layouts.sh create mode 100755 scripts/render_new_pdf.sh create mode 100644 src/tasks/machine_timer.h create mode 100644 src/tasks/task01_mtime_consistent_read.c create mode 100644 src/tasks/task02_oneshot_timer_irq.c create mode 100644 src/tasks/task03_periodic_absolute_deadline.c create mode 100755 tests/test_card.sh create mode 100755 tests/test_hazard3.sh create mode 100644 web/app.css create mode 100644 web/app.js create mode 100644 web/card-data.json create mode 100644 web/index.html create mode 100644 web/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..da04578 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +/build/ +/doc/generated/* +!/doc/generated/.gitkeep +!/doc/generated/main.tex +*.aux +*.fdb_latexmk +*.fls +*.log +*.out +*.upa +*.upb diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0c5d9e3 --- /dev/null +++ b/Makefile @@ -0,0 +1,59 @@ +RISCV_PREFIX ?= riscv64-unknown-elf- +CC := $(RISCV_PREFIX)gcc +OBJCOPY := $(RISCV_PREFIX)objcopy +OBJDUMP := $(RISCV_PREFIX)objdump +SIZE := $(RISCV_PREFIX)size + +RV_ENV_ROOT ?= /home/user/dev/edu/rv32i-hazard3-student-env +H3_ROOT ?= $(RV_ENV_ROOT)/vendor/Hazard3 +H3_COMMON ?= $(H3_ROOT)/test/sim/common +H3_INIT ?= $(H3_COMMON)/init.S +LDSCRIPT ?= $(H3_COMMON)/link_hazard3.ld +MEMOPS ?= $(RV_ENV_ROOT)/vendor/lab-runtime/memops.c + +BUILD_ROOT ?= build +TASKS := task01_mtime_consistent_read task02_oneshot_timer_irq task03_periodic_absolute_deadline +ARCH ?= rv32i_zicsr_zifencei +ABI ?= ilp32 +CFLAGS := -std=gnu11 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles \ + -ffreestanding -fno-builtin -fno-stack-protector -fno-pic -mno-relax \ + -O0 -g3 -Wall -Wextra -Isrc/tasks -isystem $(H3_COMMON) +LDFLAGS := -Wl,--no-relax -T $(LDSCRIPT) +LIBS := -lgcc + +.PHONY: all tasks clean check test card-test task1 task2 task3 +all: tasks +tasks: $(TASKS) +task1: $(word 1,$(TASKS)) +task2: $(word 2,$(TASKS)) +task3: $(word 3,$(TASKS)) +test: tasks + ./tests/test_hazard3.sh +card-test: + ./tests/test_card.sh + +check: + @test -f "$(H3_INIT)" || { echo "Missing $(H3_INIT)" >&2; exit 1; } + @test -f "$(LDSCRIPT)" || { echo "Missing $(LDSCRIPT)" >&2; exit 1; } + @test -f "$(MEMOPS)" || { echo "Missing $(MEMOPS)" >&2; exit 1; } + +define TASK_RULES +$(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.lst + +$(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/machine_timer.h $(H3_INIT) $(LDSCRIPT) $(MEMOPS) | check + mkdir -p $$(@D) + $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map \ + -o $$@ $(H3_INIT) crt0.S $(MEMOPS) src/tasks/$(1).c $(LIBS) + $(SIZE) -A -x $$@ + +$(BUILD_ROOT)/$(1)/prog.bin: $(BUILD_ROOT)/$(1)/prog.elf + $(OBJCOPY) -O binary $$< $$@ + +$(BUILD_ROOT)/$(1)/prog.lst: $(BUILD_ROOT)/$(1)/prog.elf + $(OBJDUMP) -d -S -M no-aliases,numeric $$< > $$@ +endef + +$(foreach task,$(TASKS),$(eval $(call TASK_RULES,$(task)))) + +clean: + rm -rf $(BUILD_ROOT) diff --git a/README.md b/README.md new file mode 100644 index 0000000..4474bd0 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# C11 — machine timer na RV32I/Hazard3 + +Karta pokazuje trzy osobne, wykonywalne przykłady obsługi 64-bitowego timera +z 32-bitowego rdzenia: + +1. spójny odczyt `mtime` sekwencją high–low–high, również przez rollover; +2. jednorazowe przerwanie machine timer z `mtimecmp`, `mie.MTIE`, + `mstatus.MIE`, wektorem 7 i powrotem `mret`; +3. okresowe deadline’y `deadline += period`, z zapisem czasu planowanego, + obserwowanego i spóźnienia każdego ticka. + +To nie jest model hostowy. Programy są kompilowane jako freestanding +RV32I+Zicsr+Zifencei i wykonywane przez RTL Hazard3/Verilator. Testbench +inkrementuje `mtime` w każdym kroku oraz wystawia poziomowe żądanie timera, +gdy `mtime >= mtimecmp[hart]`. + +## Budowanie i dowód wykonania + +```sh +make tasks +./tests/test_hazard3.sh +``` + +Test zewnętrzny wymaga kodu wyjścia 0, braku nieobsłużonej pułapki i braku +timeoutu, a następnie sprawdza raportowane relacje. Przy bieżącym RTL uzyskano: + +- Task01: wybrany offset `0x13`, 2 próby, poprawny high po rolloverze; +- Task02: dokładnie 1 ISR, `mcause=0x80000007`, pending 0 przed i po, + wznowienie po `wfi`; +- Task03: 4 ISR, okres `0x640` (1600), deadline’y oddalone dokładnie o okres, + obserwowane spóźnienie `0x28` (40) dla każdego ticka. + +Wartość 40 nie jest kontraktem architektury — zależy od RTL, magistrali, +prologu wygenerowanego przez kompilator i chwili próbkowania. Kontraktem karty +jest `observed >= scheduled`, poprawna arytmetyka spóźnienia i stały krok +deadline’ów. + +## Granice i ważne rozróżnienia + +- Zapis do `mtime` w Task01 jest wyłącznie fixture’em dostępnego testbencha; + kod produkcyjny nie powinien zakładać, że licznik czasu jest zapisywalny. +- `mtime` i `mtimecmp` są urządzeniami 64-bitowymi widzianymi przez cztery + rejestry 32-bitowe. Zwykłe C `uint64_t` nie daje atomowej transakcji MMIO. +- Źródłem zdarzenia jest porównanie `mtime >= mtimecmp`. Bity MTIE i MIE tylko + przepuszczają pending do rdzenia; nie tworzą zdarzenia i go nie kasują. +- Machine timer jest poziomowy. Handler przesuwa `mtimecmp`; samo wejście do + ISR ani odczyt `mcause` nie czyści źródła. +- `common/init.S` ustawia `mtvec` w tryb wektorowy. Slot 7 wybiera symbol + `isr_machine_timer`; atrybut GCC `interrupt("machine")` generuje `mret`. +- Model `deadline += period` zachowuje fazę. `now + period` użyte jako jedyna + reguła przenosi każde spóźnienie na kolejne wyzwolenie i powoduje dryf. +- Karta nie obejmuje jeszcze sterownika RP2350, ticka RTOS, współdzielenia + danych z wieloma hartami ani polityki nadrabiania wielu pominiętych okresów. + +## Materiały karty + +```sh +./scripts/render_card_layouts.sh +./scripts/render_new_pdf.sh +./tests/test_card.sh +``` + +Każdy z trzech przykładów ma dokładnie widoki A1–A8. Widok A3 jest N/D tylko +w Task01; w Task02 i Task03 dowodem dispatchu jest faktyczny wybór slotu +`mtvec` na podstawie przyczyny przerwania. diff --git a/crt0.S b/crt0.S new file mode 100644 index 0000000..60038a2 --- /dev/null +++ b/crt0.S @@ -0,0 +1,25 @@ + .text + .global _start + .type _start, @function + +_start: +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + # common/init.S has already installed sp and the vectored mtvec table. + # Clear BSS before C code observes ISR-owned globals. + la a0, __bss_start + la a1, __bss_end +1: + bgeu a0, a1, 2f + sb zero, 0(a0) + addi a0, a0, 1 + j 1b +2: + call main + tail _exit + + .size _start, .-_start + diff --git a/doc/generated/.gitkeep b/doc/generated/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/doc/generated/.gitkeep @@ -0,0 +1 @@ + diff --git a/doc/generated/main.tex b/doc/generated/main.tex new file mode 100644 index 0000000..4862b23 --- /dev/null +++ b/doc/generated/main.tex @@ -0,0 +1,478 @@ +% Generated from json/card_source.json by tools/render_card.py. +% Do not edit manually; update the JSON and regenerate. + +\documentclass[12pt,a4paper]{article} + +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[utf8]{inputenc} +\usepackage[polish]{babel} +\usepackage{csquotes} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{xcolor} +\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry} +\usepackage{eso-pic} +\usepackage{marginnote} +\usepackage{array} +\usepackage{tabularx} +\usepackage{graphicx} +\usepackage{pdflscape} +\usepackage{float} +\usepackage{silence} +\WarningFilter{soulutf8}{This package is obsolete} +\usepackage{pdfcomment} +\usepackage{enumitem} +\usepackage{needspace} +\usepackage{fancyhdr} +\usepackage{lastpage} +\usepackage{microtype} +\usepackage[most]{tcolorbox} +\usepackage{qrcode} +\IfFileExists{references.bib}{% + \usepackage[backend=biber,style=numeric,sorting=none]{biblatex}% + \addbibresource{references.bib}% +}{} + +\hypersetup{hidelinks} + +\IfFileExists{build-meta.tex}{% + \input{build-meta.tex}% +}{% + \newcommand{\BuildCommit}{lokalna}% +} + +\newcommand{\DocumentAuthor}{M. Pabiszczak} +\newcommand{\DocumentYear}{2026} +\newcommand{\CardSeries}{c} +\newcommand{\CardNumber}{11} +\newcommand{\CardCount}{13} +\newcommand{\CardSlug}{machine-timer} +\newcommand{\CardVersion}{v00.01} +\newcommand{\DocumentUUID}{45f57fde-fc7b-5f41-a3af-f153202dff0f} + +\newcommand{\EmptyCheck}{\(\square\)} +\newcommand{\EscAnswerLines}[1][3]{\par\noindent\dotfill\par\noindent\dotfill\par\noindent\dotfill} +\newcommand{\EscWriteRow}[1][2.8em]{\rule{0pt}{#1}} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.45em} +\setlength{\headheight}{24mm} +\setlength{\headsep}{3mm} +\setlength{\footskip}{8mm} +\setlength{\marginparwidth}{1.5cm} +\setlength{\marginparsep}{0.25cm} +\renewcommand{\arraystretch}{1.22} +% Margin separator lines disabled for layout trial. + +\newcommand{\ESCPageResourceHeader}{% + \begingroup% + \setlength{\parskip}{0pt}% + \setlength{\fboxsep}{0pt}% + \setlength{\fboxrule}{0.35pt}% + \setlength{\arrayrulewidth}{0.35pt}% + \noindent\fbox{% + \begin{minipage}[c][23.5mm][c]{\dimexpr\textwidth-2\fboxrule\relax}% + \begin{minipage}[c][23mm][c]{24mm}\centering% + \href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer}}% + \end{minipage}% + \vrule width0.35pt% + \begin{minipage}[c][23mm][c]{\dimexpr\linewidth-48mm-0.7pt\relax}% + \setlength{\tabcolsep}{0pt}% + \renewcommand{\arraystretch}{0}% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.15126050\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries TITLE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Machine timer: od mtime do okresowego deadline'u}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries VER.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.6}{6.8}\selectfont\ttfamily\bfseries v00.01}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries DATETIME}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 2026-07-20T00:00:00+02:00}\hspace{0.45mm}}\par} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.25210084\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14285714\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries PROJECT}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Freestanding C na RV32I}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SERIES}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries C · Freestanding RV32I and K\&R}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries CARD}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 11/13}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SHEET}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries \thepage/\pageref{LastPage}}\hspace{0.45mm}}\par} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 45f57fde-fc7b-5f41-a3af-f153202dff0f}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily f37170be-e988-5f5d-b3cf-6ea179a9cd54}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}X@{}}% + \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries GITEA} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer}}}} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}X@{}}% + \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries HTML} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}}}} \\% + \end{tabularx}% + \end{minipage}% + \vrule width0.35pt% + \begin{minipage}[c][23mm][c]{24mm}\centering% + \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54}}% + \end{minipage}% + \end{minipage}% + }% + \endgroup% +} + +\pagestyle{fancy} +\fancyhf{} +\fancyhead[C]{\ESCPageResourceHeader} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} + +\newcommand{\ESCMarginTag}[4]{% + \hspace*{#1}\textcolor{#2}{#3~#4}% +} +\newcommand{\ESCSectionBlockStart}{% + \Needspace{8\baselineskip}% + \par\vspace{0.35em}% + \noindent\textcolor{black!28}{\rule{\textwidth}{0.35pt}}% + \par\vspace{0.15em}% +} +\newcommand{\ESCSectionBlockEnd}{% + \par\vspace{0.45em}% +} +\newcommand{\ESCTinyStepSeparator}{% + \par\vspace{0.10em}% + \noindent{\color{black!18}\leaders\hbox{\rule{0.60em}{0.22pt}\hspace{0.38em}}\hfill\kern0pt}% + \par\vspace{0.10em}% +} +\newtcolorbox{ESCTaskFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black,boxsep=0pt,left=1.4mm,right=1.4mm,top=0.8mm,bottom=0.8mm,colbacktitle=black!7,coltitle=black,title={\ttfamily\bfseries TASK\quad #1}} +\newtcolorbox{ESCBlockFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!55,boxsep=0pt,left=1.0mm,right=1.0mm,top=0.6mm,bottom=0.6mm,colbacktitle=black!4,coltitle=black,title={\ttfamily\bfseries BLOCK\quad #1}} +\newtcolorbox{ESCStepFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!28,boxsep=0pt,left=0.8mm,right=0.8mm,top=0.45mm,bottom=0.45mm,colbacktitle=black!2,coltitle=black,title={\ttfamily STEP\quad #1}} +\newtcolorbox{ESCConclusionFrame}{enhanced,breakable,arc=0pt,boxrule=0.45pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries WNIOSEK}} + +\newcommand{\ESCLearningTreeWidget}{% + \reversemarginpar + \marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń buduje obrazy RV32I, uruchamia je z limitem cykli i sprawdza raport MMIO, mcause,\textCR liczbę ISR, powrót z pułapki oraz arytmetykę deadline'ów.}}\par% + \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% + \end{minipage}% + }% + \end{minipage}% + ]{} + \normalmarginpar + + \marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \hspace*{0.28em}\textcolor{green!50!black}{EN~LOCAL~EN~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń dla każdego zachowania wskazuje osobno source, pending, enabled, decyzję dispatchera i\textCR efekt handlera, zamiast nazywać cały łańcuch jednym słowem timer.}}\par% + \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~KW~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% + \end{minipage}% + }% + \end{minipage}% + } + +} + +\begin{document} +\sloppy + +\vspace{1.0em} +\noindent{\Large\bfseries Cel karty}\par +\vspace{0.35em} +Uczeń rozdziela źródło czasu, warunek pending, dwa poziomy enable, wybór handlera i jego efekt. Potrafi spójnie odczytać 64-bitowy licznik na RV32, uruchomić jednorazowe przerwanie oraz utrzymać fazę okresowego zegara przez deadline += period. + +\vspace{0.8em} +\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} +\vspace{0.7em} +\noindent{\Large\bfseries Zakres i zachowane przykłady}\par +\vspace{0.35em} +Trzy przykłady wykonują się na rzeczywistym modelu RTL Hazard3. Task01 wymusza rollover dolnego słowa mtime. Task02 dowodzi wejścia przez slot 7 wektora, skasowania poziomowego źródła przez przesunięcie mtimecmp i wznowienia po mret. Task03 zapisuje cztery planowane i obserwowane czasy oraz spóźnienia. Host nie jest używany jako substytut urządzenia MMIO i przerwań.\par\textbf{Układ każdego przykładu:} pełny profil A1--A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód. +\vspace{0.55em} +\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}@{}} +\textbf{Typ} & \textbf{Task} & \textbf{Idea} & \textbf{Waga} \\ \hline +\hline +\textbf{\texttt{MMIO}} & \textbf{\texttt{Task01}} & \textbf{RV32 split-register MMIO i high--low--high} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{IRQ}} & \textbf{\texttt{Task02}} & \textbf{mtimecmp, pending, MTIE/MIE, mtvec, mret i rearm} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{TICK}} & \textbf{\texttt{Task03}} & \textbf{deadline += period, tick sequence i lateness} & \textbf{kluczowe} \\ \hline +\end{tabularx} +\normalsize + + +\vspace{0.8em} +\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} + +\clearpage + +\ESCSectionBlockStart +\section{1 — Jeden timer, pięć różnych ról} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +\texttt{mtime} jest źródłem rosnącego czasu, a relacja \texttt{mtime >= mtimecmp} wytwarza poziomowy stan pending. \texttt{mie.MTIE} dopuszcza tę klasę przerwań lokalnie, \texttt{mstatus.MIE} dopuszcza przerwania globalnie, a \texttt{mtvec} wybiera kod według przyczyny. Dopiero handler zmienia stan programu i przesuwa komparator. Żaden z bitów enable nie kasuje źródła. + +W testbenchu Hazard3 \texttt{mtime} rośnie raz na krok, a linia timera jest aktywna tak długo, jak licznik nie jest mniejszy od komparatora. Dlatego powrót bez zapisu przyszłego \texttt{mtimecmp} wywołałby następną pułapkę niemal natychmiast. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{2 — 64 bity urządzenia na 32-bitowym rdzeniu} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +Dwa odczyty 32-bitowe nie tworzą automatycznie spójnego odczytu 64-bitowego MMIO. Sekwencja high--low--high akceptuje parę dopiero wtedy, gdy oba odczyty high są równe; zmiana high oznacza rollover między transakcjami i wymusza powtórzenie. Przy zapisie komparatora kolejność high=UINT32\_MAX, low, docelowe high usuwa niebezpieczne okno z przejściowo zbyt małym \texttt{mtimecmp}. + +Task01 zapisuje \texttt{mtime} tylko po to, aby fixture testbencha deterministycznie doprowadził do rolloveru. Nie jest to obietnica, że licznik czasu będzie zapisywalny w innym SoC. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{3 — Okres to oś czasu, nie odstęp od spóźnionego now} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +Dla periodycznego zegara handler wykonuje \texttt{deadline += period}. Wtedy planowana sekwencja zachowuje fazę nawet wtedy, gdy wejście do ISR następuje później niż deadline. Reguła \texttt{now + period} użyta jako jedyny model przenosi aktualne spóźnienie do następnego terminu i tworzy dryf. + +Karta mierzy \texttt{lateness = observed - scheduled}; nie obiecuje stałej wartości opóźnienia. Bieżący RTL i build dają 40 taktów, lecz wynik zależy od magistrali, prologu ISR i punktu próbkowania. Przykład nie definiuje jeszcze polityki nadrabiania wielu całkowicie pominiętych okresów. +\ESCSectionBlockEnd + +\clearpage +\ESCSectionBlockStart +\section{Zadania — zachowane przykłady w profilu A1–A8} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +\begin{ESCTaskFrame}{TASK01 · Spójny odczyt mtime przez rollover} +{\scriptsize\ttfamily c33548e4-07c8-599c-9457-8ba457701659}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — atomowość C nie jest atomowością MMIO} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task01_mtime_consistent_read.c}.\par Urządzenie ma 64-bitowy licznik, lecz RV32 wykonuje trzy jawne odczyty 32-bitowych rejestrów. Typ \texttt{uint64\_t} służy do złożenia zaakceptowanych połówek; nie zamienia dwóch transakcji magistrali w jeden atomowy odczyt. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — dwa słowa jednego licznika} +\texttt{timer\_hw\_t} mapuje kolejno \texttt{mtime}, \texttt{mtimeh}, \texttt{mtimecmp} i \texttt{mtimecmph} od adresu 0xc0000100. \texttt{volatile} wymusza obserwowalne dostępy C, ale regułę spójności dostarcza dopiero algorytm. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · N/D} +\textbf{N/D.} Task01 ma wyłączone przerwania i wykonuje bezpośredni odczyt MMIO; nie ma ISR, callbacku, tablicy funkcji ani wyboru odbiorcy. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — kontrolowane przejście przez 0xffffffff} +Fixture ustawia high=0 i low blisko \texttt{UINT32\_MAX}, a następnie wyszukuje małe okno, w którym high zmieni się między pierwszym i drugim odczytem. Zaakceptowany wynik musi pochodzić już z epoki high=1; kolejny odczyt nie może być mniejszy. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — read, validate, retry} +Jedna próba czyta \texttt{high\_before}, \texttt{low}, \texttt{high\_after}. Równość high kończy pętlę i pozwala złożyć wynik. Nierówność odrzuca low należące do niejednoznacznej granicy epok i powtarza wszystkie trzy transakcje. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — epoka 0, rollover, epoka 1} +Stan urządzenia przechodzi z high=0 i low blisko maksimum przez rollover do high=1 i małego low. Pierwsza para high opisuje zmianę stanu, więc nie wolno do niej przypisać jednego snapshotu; druga próba stabilizuje się w epoce 1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — dwa dostępy high są widocznym dowodem} +Oracle raportuje offset, liczbę prób, retry, high wyniku i monotoniczność. Bieżący RTL daje offset 0x13 i attempts=2. Listing ma pokazać dwa osobne \texttt{lw} z rejestru high, rozdzielone odczytem low, oraz gałąź powrotną przy nierówności. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — stabilny snapshot z licznika split-register} +Wzorzec high--low--high stosuj, gdy dokumentacja urządzenia gwarantuje monotoniczny licznik i zgodne zachowanie połówek. Fixture zapisujący czas pozostaje poza produkcyjnym API odczytu. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Wyjaśnij, jaki błędny 64-bitowy wynik może utworzyć pojedyncze low--high podczas rolloveru. Następnie wskaż w raporcie próbę odrzuconą przez high--low--high i rozdziel kod produkcyjnego odczytu od zapisywalnego fixture'u testbencha. +\par\textbf{Evidence:} Przewidywany błąd na granicy rolloveru, log z RTL Hazard3 z kodem wyjścia i limitem cykli, fragment listingu z dwoma odczytami high oraz wniosek o spójności zaakceptowanego snapshotu. +\par\textbf{Acceptance:} Oracle Hazard3: retry=1, attempts > 1, value\_high=1, monotonic=1, pass=1 i kod wyjścia 0. W bieżącym buildzie okno znaleziono dla offsetu 0x13 i po dwóch próbach; sam offset nie jest kontraktem architektury. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log wykonania RTL Hazard3 i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód w listingu: high--low--high i retry}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK02 · Jednorazowe przerwanie machine timer} +{\scriptsize\ttfamily dc7f8696-19db-55b6-8fd9-cb676b399ec7}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — enable nie jest źródłem} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task02_oneshot_timer_irq.c}.\par Źródłem jest relacja \texttt{mtime >= mtimecmp}; \texttt{mip.MTIP} reprezentuje pending. \texttt{mie.MTIE} i \texttt{mstatus.MIE} są dwiema bramkami. Program najpierw ustawia przyszły komparator, a dopiero potem otwiera obie bramki. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — wspólny driver i stan dowodowy} +Wspólny nagłówek zawiera dostęp MMIO, bezpieczny zapis komparatora i operacje CSR. Task przechowuje osobno deadline, czas zaobserwowany, mcause, liczbę ISR, pending przed i po oraz znacznik wznowienia. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — przyczyna 7 wybiera handler timera} +Startup zapisuje do \texttt{mtvec} adres tablicy z bitem trybu vectored. Machine timer ma cause=7, więc rdzeń wybiera slot 7, którego skok wiąże się z silnym symbolem \texttt{isr\_machine\_timer} zamiast słabego handlera domyślnego. Atrybut GCC kończy funkcję instrukcją \texttt{mret}. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — one-shot z jawnym kryterium zakończenia} +Main planuje deadline 1200 taktów po spójnym odczycie. Sukces wymaga dokładnie jednego wejścia, poprawnego mcause, obserwacji nie wcześniejszej niż deadline, skasowanego pending po rearmie i wykonania instrukcji po \texttt{wfi}. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — source → pending → enable → handler → effect} +Rosnące mtime osiąga comparator i ustawia pending. Otwarty MTIE oraz MIE pozwalają wejść do wektora. Handler zapisuje obserwację i mcause, przesuwa comparator na \texttt{UINT64\_MAX}, publikuje count, a \texttt{mret} przywraca przerwany przepływ. Main ustawia resumed i zamyka maski. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — DISARMED, ARMED, PENDING, HANDLED, RESUMED} +Komparator maksimum reprezentuje DISARMED. Przyszły deadline tworzy ARMED. Po osiągnięciu terminu urządzenie jest PENDING, handler ponownie zapisuje maksimum i publikuje HANDLED, a kod po pętli \texttt{wfi} potwierdza RESUMED. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — mcause, mip i mret} +Raport z RTL ma: count=1, mcause=0x80000007, pending 0/0, resumed=1 i deadline\_reached=1. Objdump ma pokazać zapis trzech połówek mtimecmp w handlerze oraz końcowe \texttt{mret}; zwykłe \texttt{ret} nie byłoby poprawnym powrotem z pułapki. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — arm before unmask, clear source before publish} +Najpierw ustaw bezpieczny stan urządzenia, potem włącz źródło w \texttt{mie}, na końcu globalne MIE. W ISR usuń poziomowe źródło przed opublikowaniem zakończenia; inaczej powrót może natychmiast wejść ponownie. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Ułóż w poprawnej kolejności: wyłącz maski, ustaw przyszły mtimecmp, sprawdź pending, włącz MTIE i MIE, czekaj w wfi, przesuń komparator w ISR, wróć przez mret. Dla każdego kroku nazwij source, pending, enable, decyzję dispatchera albo efekt. +\par\textbf{Evidence:} Przewidywana sekwencja source--pending--enable--dispatch--effect, log RTL Hazard3 z mcause i kodem wyjścia, fragment listingu z wektorem oraz mret i wniosek o skasowaniu poziomowego źródła. +\par\textbf{Acceptance:} Oracle Hazard3: count=1, mcause=0x80000007, pending\_before=0, pending\_after=0, resumed=1, deadline\_reached=1, pass=1 i kod wyjścia 0. Listing ISR kończy się mret. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log wykonania RTL: mcause, pending i resume}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód w CSR i listingu: slot 7 oraz mret}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK03 · Okresowe deadline'y bez dryfu fazy} +{\scriptsize\ttfamily 6c330959-1a78-5068-8c59-6b18f712122c}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — harmonogram i wykonanie to dwie osie} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task03_periodic_absolute_deadline.c}.\par Scheduled opisuje idealną oś czasu usługi, observed chwilę rzeczywistego wejścia do pomiaru w ISR, a lateness ich różnicę. Okres ma aktualizować harmonogram, nie kopiować opóźnienia wykonania do przyszłej fazy. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — cztery rekordy ticków} +Trzy tablice po cztery elementy zapisują deadline, obserwację i lateness. \texttt{g\_task03\_next\_deadline} jest stanem planisty, a count publikuje liczbę kompletnych rekordów. Stała period wynosi 1600 taktów modelu. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — każdy MTIP trafia przez slot 7} +Dla każdego z czterech terminów rdzeń koduje interrupt bit i cause=7 w mcause, a tryb vectored wybiera ten sam \texttt{isr\_machine\_timer}. Handler sprawdza mcause przy każdym wejściu; licznik causes=4 dowodzi czterech decyzji dispatchera. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — stała faza i zmierzone spóźnienie} +Dla i>0 musi zachodzić \texttt{scheduled[i]-scheduled[i-1]=1600}. Dla każdego rekordu observed nie może być wcześniejsze od scheduled, a lateness musi być dokładnie ich różnicą. Po czwartym ticku comparator wraca do maksimum. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — sample, record, advance, rearm, publish} +ISR najpierw pobiera indeks i aktualny deadline, potem czyta czas oraz zapisuje rekord. Następnie oblicza deadline+period, uzbraja ten bezwzględny termin albo rozbraja po ostatnim ticku, a count publikuje dopiero na końcu. Main czeka w \texttt{wfi} do czterech rekordów. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — TICK0 → TICK4 i niezmienna faza} +Stan count przechodzi 0,1,2,3,4; razem z każdym przejściem next\_deadline rośnie dokładnie o period. Po count=4 urządzenie jest DISARMED. Tablice pozostają historią czterech zakończonych przejść i są analizowane dopiero po zamknięciu masek. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — cztery terminy i 40 taktów bieżącego RTL} +Bieżący raport podaje deadline low 0x96b, 0xfab, 0x15eb, 0x1c2b; obserwacje są o 0x28 późniejsze. Ważne są relacje step\_ok, ordered i late\_math, ponieważ absolutne wartości oraz 40 taktów mogą się zmienić po zmianie RTL, optymalizacji lub prologu ISR. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — absolute periodic deadline} +\texttt{deadline += period} zachowuje fazę. Gdyby następny termin powstał wyłącznie jako \texttt{observed + period}, jego przesunięcie względem osi absolutnej byłoby równe bieżącemu lateness; powtarzanie tej reguły kumuluje dryf. Osobna polityka musi zdecydować, czy po dużym opóźnieniu nadrabiać, pomijać, czy zgłaszać błąd. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Dla czterech ticków porównaj scheduled, observed i lateness. Udowodnij stały krok 1600 oraz wyprowadź, o ile przesunąłby następną fazę model now+period. Wyjaśnij granicę: przykład nie nadrabia dowolnej liczby całkowicie pominiętych okresów. +\par\textbf{Evidence:} Przewidywana sekwencja czterech deadline'ów, log RTL Hazard3 z planowanymi i obserwowanymi czasami, kontrola różnic i kodu wyjścia oraz wniosek porównujący deadline+period z now+period. +\par\textbf{Acceptance:} Oracle Hazard3: count=causes=4, period=1600, step\_ok=ordered=late\_math=naive\_shift\_ok=pass=1. Bieżący pomiar daje cztery lateness po 40 taktów, ale test nie uznaje liczby 40 za kontrakt sprzętowy. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: deadline, observed i lateness}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód stałego kroku i braku dryfu fazy}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\ESCSectionBlockEnd + +\end{document} diff --git a/doc/pdf/.gitkeep b/doc/pdf/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/doc/pdf/.gitkeep @@ -0,0 +1 @@ + diff --git a/doc/pdf/mpabi-inf-c-11-machine-timer-v00.01-45f57fde-fc7b-5f41-a3af-f153202dff0f.pdf b/doc/pdf/mpabi-inf-c-11-machine-timer-v00.01-45f57fde-fc7b-5f41-a3af-f153202dff0f.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c0ef8cf31402c53a9ac281a2c9c6407de1bafa6d GIT binary patch literal 258421 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%0A}+Y=71l0_z-z`+)ZNPaW(zZWv;TC;pT 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

UE2y12x{a8 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
  • jDqnhh zB{y|?WS=VBXhTZ!MIg2x-XNV}6xh95Hw_zg-R|2RELi?3SBv;!Jwq!7PtlwK4+BtC z#CVHK-*Sl6?aFW|SDDhXTO_ZXqZS97aX2_z+KzxWnl|fSKt|Y0st3{?it&B8$LWSJ znO|g+Bw(d3*tW7=w+3$-FT4MuiwE#r|2(?GOGZ$V_Yo-4!;y{~so@1fAI z@iV}n^FVQ$tfgmlG$F-lP+4uH7Dkq@Md%q$Y@TQ_s)~|IoRubYb26-6)e|VAJcaKo zcF}+pi6m|z5o^atK=+8UomHD4z4v}ZS_*SI!`=CATmS)%Q$Di;ouZvb8)aToCl{|* z-P0>%oX#+g`DQBuDDY4D+i#Mca^PbLn*bB9;$pJsQhUbH*=D)T)g zTtxfD7_(p+x(s*DVL!FS>NU&E+&Xo$22SBtvrp9>MCsUh-Z(Xrd}E9GiC0JgKjAtR zuS>B_RhnAvLY>_4aG44Mv^#j#x%~Nbh;?AnmevXhou+O=wuLfr5=6JK$`Xr;!895O zr4t}Kfaelfc0ez=2p59AxDp33t3yS{+J(toBkOQ{ucvX%M}hI+wd)JbR|OT!*svZ| zirpuvlN6F&P4G7a>Lfio7~7^>U^|obswt}s^(C|R)SwBW@7dnK?#uFB zk5~|%Y7L$*U0GnVfHjHu1G`+B%czXeCt$%;EF(r31GjMk1#6<K zhY|N3K(%7}{pF7=jY!E6&+rR%Vog1)hniPt5)#c)s{U?S6(?W{IgHWbnLrX*Ys>i? z2U3P-Yo+=z;xkR3KZ7tEO0P6Qz-ZJ2^S2ZxIzt?T{8RESxd7B7$#|P#K>;>&Y`5X& zSXIauBN#o3i(@vnT?IcO+b1Va*bV7~DY&wmK^r|SpND2llhgzWeL#^l>3cO6KlWcT zRZq2;w{n{KoiD*R`_DdZX*doP*i)ZSZq{-?3p9Q;;3^_uco$MR^R@&eXW^cZ4tb~! z5a*D~ijDGvqA7ITGU~P1(b)5@8^qLZT^ROQbD(kZh=fGD+o4sl&K4UJVGIiV!nszl zont_Ga2f2;wL2MMMPEJ6z*s+miCu-cQP(ke&U&$b;`Uu`MKsk;x*v&t%5Bdd&L{-+Y~vAHvMU=r7L>Knv=<9 zD=p1F)#E1K$49V;)>Sl9+zGN*ladr9kA0jYlTFKgP574lV*jjuw9bCQE7hch5c>@b zDA2LDPiRhKnzE9*Y%XQ)X~*SnK7p*kleKA4fY)+J%Kn~`LFpl=RGDKuI*-s5dAlMOpPkKFw6_6o4&4MPOtJ7~ zBei|qg)&^fwwtkihaH0L?R#kf{NVO_a`wQA<1;kPDly4(1j%*Tq!1YFE0Fl2`Vlx4 zCo5v3JQLR-8povI9?0q?zgMn!6XDu!iJ`SN_8oOs4yAj-n&G&-6DR#MvszZPktdvn zs*n9>qqe6Jr1^xH8+6-nqWjH*+_5lBv!ZFDv?2dyk|?_?w!u$2O()q^%GI8(M{?|j zQVLy8`R`*Lh%gh}H~og2QaYOR{Ejh^E<`Ln^x-Acls+8!aUDCoXu%$>Zz|C?hxwYZ zR&idJ$-TJ#0ctetyc3GsJ2PZ~bwZo@EzVHi@i{my#;&AI$>#=ZKHsbXh8FhgDGLK~ zujVaz8N9@>UlBL`atzz$A%jR;N_KH7f2l<#x~trOGPh96oNLl>;JMjN4k*Wmy3S&*pR?>?V!w5ON9*L*F{TW zId)?+6eUrM=~JuYeTBBc1cz=`;}op}wR0MSh~%Yg($ydXO8*3=JDplCt+_JFVOe}b zA&!NmEL2;u&ZVj%Bul9R20^&T@pU{@Si>=S#k6GvKTJHzj2KPT9nUXmJqQsvfve-a zd&@GSG~HQ;l%&0t1*l66=3>&t2^9E|ZeNMFYPNi;c`i6W<$2{$u zYwE^tIR5xsQF3AI9nrO4^e}KW$7sY!J~NsUgWoprZl7^`K3pN9C}pkcUG|1>1V_ef z!4h0-n}>?4buht(HMge*n!=>CCyf@DO zYG(Ib{1t9Kef98L_H|EM9hGSzUf3aX{%U3RG;W5pFxOmnl+j&?Y4K;cE)#R8#*|dMw2DM3 zhJ`hc!L2mSQ0`ch{GZAl7<6{eMObTi;jtK^6b8m6gc>6_MzyjZqbMdcJ|Lc8lXF1g zjPuw8L^ot@rDwsRfF1JUO{ssp)Oadtul^w+p*eF%1i|KEFB2X`tEWzsifzbRT3A_R z@x)b^RK74WDeXSno6O;3%OYHgzpfyCKdd$P!#dB1@fvGYC{%;BZldk^p01O3i@g&A z$qrHZQxEaP^yoj|{C+-L6T{ARB5w}I(?ITm9$wb_oa8-C1}Wq5PG!z~>Q!7FQFKJ% zF|ugUA74mJBCXpF`myU$ly?f+p#kbjrgWj z5hGVWJKGl`A-;2IlvfTG(Ln||YmfFSEF&Y8EA}1W_9ym8c1v4hTjM@ivj!An{0O!CwhwEaA83`lOqv9Tk4Q@ze0~*_yTNf@X_xo&;9#e0tyS*5pS96;#Ww#~xt5mEy z?R*!j3HV{p=XF<{_k|(vXM=i7sA^szX@bynet968AK3JWNjR47HdFtorOu*Qn=^r> zxeO`leM8d*FPR)eLf7cZsz9aKYRH=WI3kLZ8x->v0c9u;Q;#!(P`Eo(C|mi?63?oe z>twYoa%6y+0~wr8!3imSG7F-qr=KKQ1*7E##bNDEy#Hu69DgYjix6CIroZaJmV!Kr z7y+~Q_#6A#As9NJ##-CdgWt1Q*Auft^nKIi%Pt>2!C`NTm7xuK4B|e=_(lXjepB_M zjNIEc#46HhwAftT>UGmqE;O$wG(W}}{LVq%)3~?A&6fw`&udR~y>6oP9{V>wjUMMB z)GD#<9Wfs-7S~7LljT0z(V?T%g_ui&JAuj4(en$)4{Jw*ju&R+pElzsE964bVUaBkg{)r%nfhQlT5FfUu|l?xV6g& z1bNW7T@~mtYb}rZw4;=+Gkq+07M?#?CBxkr!+NN)tP`rEnG9e zz+Y#+(Ww*1^^7RpnV_>CpsKg!5RGx?xey3S$$p}c(YmC>5ZC$8@4lgoLl~i;Jed)w zy6kjPXYPYu=X1!+g`3_D(DQhc3}+c-1t9kIDqQWZMEiuJK(gRt*;HAuIOGb%QE72U zz&pP$yu-APSLo&&cQPhNMl5L=pmfH7FhUj&r`xMR#zUiQtb2W*t_wzBfP)ad|E};$ z&0?0VbjEvqQADP~%Wbr)(wp=RLT9ANF6lO@Ef+j)lfBy8NbOqVLe}teujOZ>t5(Q& z9<}+ud|QtA!kfR_hUb@l%#M8Pn~6ABtJTK3)kU@6ch@Pr{LJ({?K_IAaLco?xWCuQVyViLa3g%1hRW6b^HFxEK5`%#D` zyuoq+^C(i%0b0d)MLnS}ib+I)hqP$fnMJ1foNaJP#{d_iS?=_NVOL(D<%?*y*s&N= z&Ac6$PHVE$=}*H&Aa45V>zY#A`4x6AuVhcRWjt@Prj=Z1<>bTAZc(E2&PwTO*RL*4 z{Ml2f%RT(d%uCX8zj?HoI~Fy16cZ+~fmIG7cLqY3e1{Tnktu5|v0luxYOqixk%1h2R!M=!Tav^}-8^@7s1Vs1f z$~lKyKwG(x;Z26$GDiobsZazrl(zf3>6w}iYwa81XFmYet)7EQHV=ROFjf-H)lr$7 zHznOOE&oZH#M-dbJdxV1%ifOiX%_hbdstwY{@VpP1i2?X zKU%s%f}k8n3Z-W`Vi{W_cHb2>a#M_?G4Ua%2iC^!7bkGKaAh|f^ZMk}G|o9osefoD4@1`{ae>YWXdZ7?z zOSSywnH=)mpnw!je+ZpfeJj@8qKzZjYjzx1!l(U&3x4ozTk;=Ir7z|5hHJw@Ti1Ct z7PZ8zc?cY2>W@%Hv6RM%C(jp{@UM-8oIPOfmu)Zb^g6!FkT`RKEgl$R1dvmW67`)h zd)7CxtTUEJaPDe4gc)~9b26dSS{73i#Rj3B^}bKY=q#V6lz~WnqEV|Jb6mE+)}fl< z)Z@lhq6VktK5f8lO|T}Q3X0f~i6?Xx$)j5b;1XNaC|P_X*mMjt@AtA&hc%jW|Hj~G zi4V5ST!%mE*ed2Em@jTmr$BtX&dAw}V(QbcL8%!aqVRb-&A4*E56&4a{+ApO6o|vsTNXM zl#|bV-bYQFGV|*xn;MT5`z5JoJt`ljYmYI1v!BRb@N_``xAXPaC_hHpXJn_?Eg)Bb z{(jH&HQIQj&+d7jEpeDFWb}ZWa14sz=acX(Y!}vd83!&hk(Xu>{0?CozDnONQ{3r4 z#Kk#;NWdeBn85o_wGm#p91E$IKKEO!NDf!yWZ7bAop;pqaYw2WcoP03<;HeuDo{vn zKBVAmkJGDI%<|>ZSzmLr$QOw`@h0g6Xi4L_=2At7fyg=yS`L8Z`+(_U;(tUo zYcD8XcSSXwR+0LG7M$?DF@Vt3fGs!1tGAzNGFN|pI?<@@P%qWVCHbLz(Q1Zz`}&5| zt3#cmQd`rP4?s+PDTO*gU_9m4l(Xc!CjzxgforaQ(v2F@lJ_P$@8Atn-_1EcDj{O_z=_lur3RyJQWBNz-?dzieVvjE=G@%%~TemX%WSLMbx$Gm1^b z6w)G{3lYhXrk?}dH`SA)8D#Z)GZt~P_cupi=*IKe>lG9r zr?h8MB_)aP=&vDs{NVU^1Iec1I?5!xzXJU}oEyHsKl4Wp;)rZT#>pky zNrF7*gWyc^4&#O!M%^xH`{)$~A~@GfV3KT$ zR-+F?UwwbtrmVh&T2~X?}fEJ=>@23`kR#%oIw!Lt=|t zUbhiq7nqjPNgpk@YKxaRy`WymoJGPt#9e`&W&bflunxZ^CXG6N3ro@!mE*Ql7xvJ< z4$qjUIYjaSgK}y>2d7q#MPI(M=j15U*RpYGJFe_@$7{d7H9RfqZNPl0iz_9&wih*M zMLIDKtP+e;B_L4OxIzPF(P?Pws*s5@d6)vaGJ!(tqo7-K2!q|c>CQTQ{AkA4BG^!4 z)O^~&16jB+`W=26GBRHeHU)KTl@+iQFtxJSx;Pct8SV%|+pq^Z1kzS$Z$n>FhTKn7hR-1LO^}8@P zH&`)mEm>AzR{YBfLc6gl&21iKeVAe$8=Y%=XqdS-HlMt5jwBSn)Fm(~y*@Y` zKMW*QbVtI$Ii17c3RWK%i=4~z<1DC|6YOF&m;Z`7%NZ|hjLEj#Z8q`krAXGG7cG$0 zj-`^9bpA#@yo^*NQ$f@9!SBL2-yOo%)fp-F2gJ{Kg{r~P!-NmO z+$G=AiOrO&I{g_{qz*N(eUr+N3}5c7_(pi)X)MtazE#2Jl~{*yhr>K1Dl3L!qc)J``0;0jn2Rx3r|!QP$0^Kj@%bJxeuMFVEq$8^QKEQG;24&I zc!}MGs#eL`qMY}m*J~TyMda;mUD;p|OdqxGB`)Y%5|?|v9{4iuxkv-sFxcUt)r^0b z8yHe;A^fI(}x$R{<$!eXaBUv(#S{f>Zr5_Aho?f|i?+dj}6-?NG8YzFH5egjr2KqV_3Z*74p)&8hS2@;lq4iL=^}@KW%+i5l@4R%}xrt3mqa919d7-j{piu4S6s zKYhr;YS~s?yq0c&Fm79Sp(?odQ<_qpQ?wltwN~Zn+`u_We#U@}bK3(Jv|{nL3D;A^ zWnW<8l#+-(nsQr5F3A$UN2$?D`Wjf{Z4Zh3;eP!Z@Q|%E?OzJ+t~yxHFBvzd5lGH5_0zN!lIpC{g>2qDqK_=dh^3fy6MnFH$Xc*taW(s)lNull?x)bEutmfIztXEW49ab7Q3M z%#kQn0O{zP+2qQuzzh@DAw*2lnW}Oo=6RPyU`Bvmu)%=p2>x4`_fV#L;yZXhWjD~7 zwZ*u>EN47LUz8<3FDWf`JO$0re(fQ4i%=LQTg|u&)ld6nfWb5mI(J4sM|BQGl0F|m z$x(nn7qq_~4a?(U2)@(J@IBqK*2E8LnGJF8fKQ6;PM6rOxwi!1bDdL0zQ2zB%7Off zFRhWmjfb{BiGSL9w!tYKk zPFwW9lSo+nsqP+Ulh%;8a=`;%Vj?KT%3;9~yZXsmi5ZsY48FgvVT zFx=MUkShIy^n>}=`I1j!q3QJV7uCw?CfyJ&(2Z3hZG%lcQ5l}8Kep}faTNs*w~9Q1 z39Sr?p@bMi5hMv)^q6ZQ8@H!z{#xyxEW;9IPI+W# zI}3Ryg~uNRR?9}1AZo|8yMUz13#+(@qonwTBUq1`)ZW6TW#U;LpOs371Gt~9Dr~gG z?+H*bMxB-VW%&K!hD!4>YOCr6j>+y(hhsR3U)LxK>tN4vd9(2$94~-@)68;uSrx5> za8fpag(h&nj3Ydt;1IL)RH`AT;6_Vw%^l5o4GrFMq*is@Ao3-0TBZLpl9{;x4MX&n ziRM=Oyvnked|4MlXgFlxp9dpX8J&=hqbXF- zUW`>dA}2|7Si_-0(1;0qgJ?9i+LT{rFgZ=;a=Y;N<((U*cJAd?P4Zl+0$DRXtT(dHgA0Dd`WdMw@k?+L{42nQWGNV2{Ifdhxj^Qusc@?YFhmG1N2P^ zGfoGC@OR-p^E0r+<;#*4!Op?CqYDLo>P$eZ(qdlPTJo#29eWf?#vuR#GBFFJ zR$&AWwFkv4Sh8Kj3?BH7bHa=V9ms-hBY>5+^)rW3nE7I*9Tz`6nq-OJcu|#zWoeZ2 z|Gxlw9);mJY#+Q65tSbUpBkRjN|J=kNiAQz8a?|k1*r$Q0XBO%)NnHV9F7m zzJ52Xf%(%uK={NB`!I6Bm086mPYtG#sS?G&-`hTRTkkTCkY%-eGaTPP{kr}LHA?)4!%)-nT8J_9y=^~ z=^!BY`38B=0<921KU^|GEb37M@d86d3%ypq+r`c!M#whR!*f5#??W1tErmE4Y87+h zwnKCB4VAVS6D6+sbK~^o@u5z?f_=(3%lV{CaR&Xq((M6;`x}5hYDKnKZsRPQ#gr3i z|4e_p-bV4+=I1*b)?%~8nRzPKZ8-lap?3{9L>fqJdo-<(x*w#&BAX$DRyz5e@MVzn zMnsGqUR4XC0MfoqwkRTi(Vf%qwEhJ*_3^NWX8z5rFqbC8m$SqM7aOY@PTti0JL?Ef ze!391XHhMS@Nf0!0elY5nf-uCY$q0%VUWyo03!Ef#GmQ38v(gw01-&Rokpf{dkWra?a)TSxBoat&%V!LkeeT#2=3$=MWCToNKjcIVk-<`CSZ^$js;4|Z0 zw3(_x>SL(QRJh+xsOJp>eOn)`ZIl^5M{EK$^UW>C z!GIopB)0_G9mRydKV~aF933T~Vqivsm8b39XuGLnS?+|B1)yKKn2^-MP)OOE>q7-s z%ovN*PvT{w+$tAjV)ZX4i-HU0`%M?S+!u=fu->#uJuB|sJE`k~Lc(`Efzs8ut$ZHPZvp+Za*0?*8X7N$0(cAh&sEN&RLaG1Y$C z=T>;-ec|`#^B-`UOK}xy=dIiqPoM%^EwWOf)CB*uPv)s|iOba{OetyIiTGDC5m)%+ zx`au$nplD20?S+XYah0!S4BAa@Kb0PIsfwPw20;Q6h0ynbsMZ2Qyveqs2jo#PgMKrv!Z z3dJ~`K!aYzpu_5 zW%=hlhH{uk?VR*(=G-1J7Mw`Ffs`-UfH8!c=nBCxHUvB%gM=ha`M6@9dlT=$k^{3)ICXc5BXgb5}2e z2yoC}Let}MFhcC(led25FHqWUiA3;1R0%%;<3I{z)>Y9dL$(%(h_Vbkhd z9dU}>I3DPhyXUKd3HO*7d+1wN4?43f{z<@znxFV$q~6!=`PS3l#Bx_-0KwhQNI5=J z0Xe=G+iD)(Lt!^rwv7=@9?0%tx4%x$B~f_N(!{s-g?@ika^0`c@-gnv1sUuxLwB4gG-M00~xzwr%u$ z?x5Hy8Y?TcbY63tOf18Z zU#-L8Gi!&+3$aqba((_Z0Xg&7bly!6<72U2BtdDh zC}j5Hu-navE);1b$5`t*wP*V`X^Mb{h3!VNAYGfv>V?|*-?2|n`pMg^rpW&8Oz|I- z5VH(S)gyAlxut`^b$Ee7z;x(_05!I-WpBS-O_zbD10^ra3z8>JA2mXoH|pD3FrBP( zdUPAFKqxVW z)^jJ#NPCx$)eW1npt&hTLV*>t?hI3fr z^}>7sYaqC1`jv5cD5ZR}c=-VMJw=8j>*lA>27WbW9S-M5JZ=JwV$pNdT5T7!q0!kE z6#bu10sDt3Dw~m{vN#9p421gn3}=JEIKXP(x^y3!o)6vG7@g(A@}OLIxa>*$+oCD< z^g|W{KkEuYMD##c3Hsnpx_4(9I#l&Of7!BskQOWF7N|{OF{#nLv&`&1x890v<;x=Ge;VyUS2W7N@K4-fxN1P^YwcaJ6KMj{cQ2N!Yd%E z@cF`b9kE8!(1E&}|G6fXogaydUz&a6Z}X!sYbmhnT&Dnrp%t!*_v)NC8_qy{mV^mc z<7y}56Ae<~sL;Vc*@p~Ox0!JUVzmA}w@kmoAIYk|e#)hA8x19OuZo41B~Fwn;&W@= zHli+Je_}uEz(Yq`57vO)p&Y7~V}~>;tU{T0`oYL|tm`QJM;x!RG4j#*+mv%~AF-4g zb`(_kfzlG7_K_lClboh+Gj+AY%sJUs3;_xgWA`DfN*pxHOZb2}mmI$ffgPpLMK=LC zIHQho4Ds7%?bFuH{vshcZ!Hz|)(<05QIhRmNR@-cE|hg%u!Tuu(`6%S#KkCT*RBGp zTBbN6Q_Cx+>&*MYYc;q-Q2V0U=ITQ7;^>ZyX3)oLDnL&haKieqmxCP{B*uF#5Vjz74lG3F%bm`2ekpH$c5A>}<=G)4))R4T*ajz1 z9llWBD}uV7)x?86v@=1fH^1Tqj9K9zKDs*Am;P^sNW0;(V(MTbIL+1u}KM`LYWwSF3`+dvd{zH%(yZOF4ooS`+=m{ zy$b}bJ+4%)i?_@%6>b9+^9E!;3;zb|4WJeVYW*^6xR$Qt63YcnguOIE(`L*8zTJ}x zAbpU+Be{6c(n^9sd-ai$UReiZ^I*rpa>dhLHJdhSxUWS zM<)gS{h3UMOQ;fi&B7{g#sndtrI8ktiyU1LTyXV#Q>gGuRU!&z>ky)-rFs;%^3;J| z2Q!zOpXc^Ih_0*q_K}@`{T_V_FQtNk9NK;B0x6bvKLWMXAHD65>sX**H>aF5B;{%( z^iXXU2~HT<$9%G01O+|?QqflemNK*Wo@~q=K=+C$?8%aap9oq7CN9PcTdo*P*bt-Q zEW6Fj|2sGP5Bli!wVOy112g0ywM#CS}ft>z%$Uxv%g|+VlM9B0$GU80t|G9 zZLX?Q(bx)MSOGG6VXZW@>!5r-@;#QBQ0FPSrY&)$h*yS9Y~+GyUunDyJSuh5g2(sk zjlksrV-2J(nwzAsdO1J3OxmMNtGCenX;Ied{@;HB8TNPa0qw^*Wf#vM)0FXT zLn4{@c_S`sFwVkk#Q+-ESwSD90AZm}gd?r12U^3~e_IXlUj zS<^SKFIWO-6oECUgTENxwOH+mic4p69mK6vh#AmSG+psTa~;w%D-VBOgv4s`a`n1O z`8!QnMDF^=kpCPP+C58a%8sQSCk0g*5~!UrbDiQiK1E`PCqr7vkv!U7VA3Bq`f&9qzxc)Xz0Rxp*`v|~jWF+i;>NAn5`82gxD->`(GpKdUzUww{iWH#)Y2K!m0(oTy)Z#Ebvnt9Y#OjYgiCbv^2_ZLd-} z=8Q8E%^Dd#gpXS*sJ?w+HpOeGGY*7N zeku7)>EX3ohF)^jAaMQMiMO6u1oLyM!h2{QD+6b?KiDST4*`9RKeTZ&YOQjBCH zpmcPw6+rAolfZCRthXLU?e(fuoFR+m#7AUL%zYw-wsL!`zm`e6w!id|>z3!^>AG@z ziNR5+h!g5ywg^ONKDi~mYwf+W$PhX)osZgBhR#EGR9FSN_gKL+7uabT57PKegQGWk z&u}tOE_8LhFE{yhWR|yirQjLx)K&{`0nc!|Pm#NR zLF>LmC-(2&)0GW-N5Lf0+Ku^-hQGz)z2FwCZkoVZh_0a$x*<{|MG(epgm7V)+T)&x z5e-7`{mPw+TVI9xbsegkDOTmwzd+mwUAW5a{C3@waVDkbV1cRP_~jdN76Xwa^)vWMlVxqG|2p~raz7Hy! z@T@5X45nMT}P{w1E>lY1<2h!sg^Eopo?!C}}vM821__CUl0>^j#~pM zqREnygp&KIij~bsss_FlKE1u1zX34VK=Uk==XZojEi#6M_SDL1wJfR=k9kaiJxt@T zo7p|0+{f@h_kC*~u2m1_0!!$xKTbw&@J^X>>{YwS(REjI>m2Y17E3Qv{6&Lct_bGu z`rbCeWNYW5H|bFB-lC`rn}$)`>2sHcfw0JX)3SaLec5DS?wbO7gxwYk$xEz9t*pOB zT7F$aO*UG+6|`%C>S&u^=b-TU8@-$(i{z{Q{5wo&)sK+6Z2JEDOrqrrO`pKLD z8_DcNyMw=|O%D##DbO)vqW>zrVZ2{q4`yZrxGT0XvwiRP$aCSPe1uG z&LwX|+sPR1c&!d0YG5Dl++*J^&YjzB~tn*6t#`ivG57pD|L*2z8YZ>DDb+ z+T}Aqi@5o@2yPsrb9bl~#wtOLVKIyWA3vjrC^W}}83_?O3u4Te+K!?wquDhzA+1HCN{d5Cn04oB5Iw zyH$hQiG=iTg_WcJgxIS8$%DG9C*aShv)#G4PdR5rabRSc{3_VBCfHF2M=uc-(QXiI z>Z8bsDFX81dTVM0vPWA!SP;7??!~@RLMm;tpiL72p^6j?zzz^t%OLGlSh|yg62rg& z`r!)6uhm91MqS2|?ZlZM6ES84bXU+xugj3}K!6gWR_7`Um#>NA-B&33t&$lm^D_l8 zhqkKDW_RJQ=YmmFB0E|71J-}j46S#90=ZL@M~16`RExE{MzrnQJltiA&#UluTH0VA zxck`htJ#WS2<>xurV+z>NvLe+LWznRV3Ve!($@5RXMp|H^B~K~EWXPc2zlOJd8wpJ`Sil?s++S|Q=|0GXzl)78VIGS1hxkyME>T0r0aigE^O#WD)T~d z^SD$Tc|`DZwrJI(Xi}a4UXI_3~ir>tL zuVI-y(Q_Zb&G)2Ogt?=l2TgZjS8m80XlJQcRNX6b-b#B#bmfcaIj3)rfB*;#d$?E9 zrE6l9`GYJ`wgDNMc~dbqslM=nj*qe2STk8H($2*<|FePfuhP?(|zWPiH;`#H3LbI~Qz zs?|>3G~55fxI*T=sp_dvHK-l!GT)Bc51J*z4YnWL)u-_{UE1&jd@20LZb1&kiz3Fz16q}Sff{i@n!;L0#(Yugx>(Zs< ziJ4!bN|9-VXf8h&Wjy-fDCViD9KfQD>!wRBu6(RWmxxTTfVF?3hOp9>BpL8M!QN1K zEgk8u<+plm-2GJ*lArc1oRn#(BLh5?17C)EZsFzK2;)W5PPSvEo-nS(XljMKwCFl| zW^kn)9NuKn2o9KphPob&qW;oX;wy9T50a!(Y~T@A$uU*&_p>zaIHhx+Y9uND z_|h@YBTqnjI(QBc0caCAXE)b0KrS~R6hAt$vm7`9wBN=NeIAU1i@}@m!PgDghL-v| zu=$SC5I_LY^96&p?L|S}Yx4P~$7e>{?`ur@S|_LHx6z;9b}Oa0?#ATC$j4qPAixvV zmOj3#?BA>O&z5>JEcamX9xQaYEQWyLJw!-RbYS?V0VI4CZTE z934P^hknW5wn2Vdr-9CZ^uYjd0r}yTq)Pave-F8O*a0dTYohg zy_hWr)z>#L`lR3O#FDYT@}HRjkWJ~;?t8`jLf?Mv|0RUhS6ql&MO`iawC(;vB{i^x zVrpz?1*mhd1Cq|llIGq|-xcYb=m)$raaU`^oI9ld$GT!%3((zC0)VTb>-lkvLH^9j zIy?ZRk^H3n2ySTukX8SRaNmv{{cGda|9E2am}UOf8@j(?23_x=f8IqyGcf^3T<81u zVnM#Sa-VX2NTK?I*8!zX{le*cimBTCj=dd%wR3(G@AC{D;K$+i8Nc_&Wgp_YbN(Bb z<7e9@&+uo53s-U2SZLMg5vzNZddasxl!t3Nfrc(5PfCI;@Or+2NN-rjKhSz$)mfZyOivk8SGj=g+rdHz2sx}yawn}N3 zFFj!Bu5)}yJC=CeP@q zj`l$70L@iXJGM)|5DEO0rBe7`@ldwf{(U*2=y#9GQINBh%#KXkZY ze^gBX(7878Rq8)~#465vZLocDm2cISdhc_Yu>n9l0A%)8Qv^!92v^Rl4U&D3h8tDp zP`IN`S=RzK8p7o*H5#`;+73WFi}>>s`d<93CXnK~SZe+CEb_e5|A;`OTwkh+NnTG? zr$^l7gy#m}12zPW8TXJCipsYPSn#XRQ%;9l`NYd|e0sT<8j>UO8$BpTm3H1zrZ|7V zUXw*D_f|MIB5ZU!#TUaaj-zcGp`!MN>N~f9ZyjGlGV_iY%Ns|#^tVyKcq*ce805jL z+`boTt5k6Jz<|rb_*gN(F*#3rSn^6I=Q(AT6oZcY0kQo7TalBiRCqbb)%016|KNXA zhikslw`Z8Wk=i;0dXk1HVY~x9m9!+_EO7~*_%@y0oyjzumVL>2iqQc4zR_bs@r640 z)Va3_-b16ivlBalf(vFW)ykdSdB1g*G#;>S>MRP*FNKii^YC)kCZ{1$Pv>;{lm1r+ zhBi-vIXc;dZ8;Bke!JZ)zK>+Op;33I0M2O%Xxz{JX0Ka3& zUpnksFA-I0Q}RxRa?l|m-CC=$mSI>BuNRFX zKXp`Rm?lVcV#Dq+vyW(Jq7V+W?bxuWEp;IxWe9rH)9X4u_;4KtU7|P$>>H;B@+0R} zhb$LieQJ@~cmR3>sQf|`@ejQ-m}b!}($92ii1}Ny5uJisUp;Ke`xvm#q|ij|Dci@| z%7R&H=&DSRstHA?UDXIt0$MRJkOD|ME-WWf5My%f0_vJP3`qAT*k0Cn556 zT7KbKrg_y~HUA^s^6s7cCU^|~Z3(`1ZnQtb5^=D75t&VR6lfd;2gpu*Q<~f$}#1vQh!07|7_DOvuk(jr}yVYbh2ZaSLeq5gc zqp3y#URwCjjC0gGgY^BMkSKyz;Z)bI1;Xlekg+Y3o-yuREoM-i6!i75scyFLdFC5f z{GzM;!6y6dvKaKCsPc_l;#J)_zhWa`nNx@yW+H1m_6><);opwIPItAn(32+>nM(m9 zcG;5^kqI~YO5`nHlYKU?b1<9qsXDX!zYlPw+30(rvuqH8rRDH%Rv5ha6`<@ET;mBm zn1OhN-%6xUm*Q|3nRJ=Xl+&Q~wAYjGQV?~ts_v_8hLX$rBc_E4R%?1bK9hX2$ssdQ zS|mIVH{zFf^yFYyKg+dsNOCD4AA!isTG0-NKn$UHg=i(cc!uS%tZuL*A<;uQ9q3`0 zcv)>CtrNwSLLh&m_8;XQ6#xa9Wx-w|~aB3`XmBsRc zLAEwoVxd5VEJFC@z`qP_`-%vvL~lraTzjxZg2vGBRc!Y-%%ekFf=r?)R#{~j&~6ab z2+D=?ibbFv4%w<460Y>xPw-o0KUC+0C%HZP0N76_tXPp$a?r(Jf*)Zdw0rJH50gg_ zWnA?O6>E|uyC;k-dt7tbxjd@HP+3#u_c6lTW*NW*UZn3KOZ8J~U0%$_Z^J=^xb}Mx z0xW^KFxs4VK}mItu2}38UYH$NpXEb$O}Rv)8{^H5#lK zX@_{cNcwSm&W6Rx;C+P5Ym!7bVF zoC!?XHK61U*hzf`LTpydxKDT*!JtRh!Ih@0X!vVL8vlbmFlGJ_3Q(La>r>o7KkB^D z_;PCJ`Wsn6d^`fLH!8ZmP45s~q=UUktI%83U#z}E8{dS0ebh8?#Jy;GpiSJ_Ufrma zamh))T{Bo^ALGUe&CU_`=;+bigc*2SFI_*pnAjv^BU39TMNL~%=nE2xPNxa8b)+R= zQ=HLk{)Zyg9-P%K(`-@r@ZuE2TYT{!bC^-klHB~!g%Po1j($cCCo~R{Y)Wdf+i*e6 z^rPaAt}rU}nsr8b5RNkVSA~O%*@@QNNSOv-0s~7d$c(iwD4JP>AS@g)5ZwWIKeEGk zB0T@OJGNESOAvX#+Cz?vUBpJAtf&6==uMNW#_a7a!ViXB3tOw^W!BE9triT>L7jU| z`)zlSU_O~pTcpJBh~#c~%Zj+w1>Rlx2;21PUM)#L10HYsUzV2+Izx_VJT*pD>Jt(U zGdZAfUdc<(g5w}7)qro4bB!IC7%tt^j1z0*JhO=Mp+`aqfXX=PQ@p{?r61#5)%8!p zpK@j>A{e$VSon71G;T)uVdj4P@wX>wwen^q`{eF7Nd{~n$a08)XnCj(aKsQu&!%E) zeej1|mm8cB;JMTz{FX)ObGOb-TBz_TwTVp|IUcE;Z*Bc}_+CU!(+%ZqR3t}T|8k+N zS~XRC-dW;N4Da61&aj#^xW7lWiP~+j2miiX!`7^yf6%60xwZp|8s(~=NCvuVq{87g zCOubANNCFqCW0{_U>F%)*|$$7;9?R7S!`w|1cKM_BLtwr-Z=NHJIlZ*!|&G*u?aIn zbMJ|q{AJHw_6&;AWYB9HrRYt8nj&@>vv*{z1&Pu1b3!n) zLEDdhiu+%OKaf>8Y~#T)`m7Q9$D~F|osj_FZV?~`)jAB?!TYB)roK!q#mF!BjdHhY z6F(xtm^%88)!C@yRBH#!d@Ft%cmi9fQI-?d!FgACC%02RfD#?<8#2Zjue?7cIeU-n zGWXXwt&okp(UvfWIQLN%M^NwgJv#TSJom|VZ{6}B0U@U>{rAFOiD?o;u zi>TEeA{D}sw3gIIc9+3g!uTqAEZE zi1;DrNOHg5P1Jq{QSbdmO%&>LT}<#k(+)-(b2#zh`k3K+kV0pRckb7Wbq!`ng6I zn+uXtObIkpatUW-M60qh9Qgwh8&4BL{)F~%P$sW&J@N7}?j+u;-0YwN?MeBX7w%f_ z_Ah#)G7>2-)7C>_+J`B#Ev%WxE|*ZDBE*81dOhAM_RK%jf!O%6%kblLp77WBi*%gh zi7&O4%4HJRW@V}b@CeRnlbXYyvxmtWp$R7cO;O}hq4FwtbQ#Ik^U6Zn_QjJ5Wyw$H z#T-1`_LRRBb=+T3Brprs!vUn7?h=lR#MDc*z#X$6!s(b7!M+bk=pRX&yW=U zpWN#Z9Pn+?MUF+p*?l_j+rSpy(rh_R;e zzj-Sg$fAi>1 zu##A`G-lokpH~Uo-xzQd4M74j!KEV*Wg% zi;k@z|CODSJ__&SYr*5myE>r0-AWPN*vsbxtN%f>SF_7yIyn7W#PFC!P~LT}OTt_H z6C`5!X$qLgRe*J76hz>WC@mbE>B-2mhIa(1c;t_lhDWs9BfksnBK8}oyA=RWZRP&j z0Wyw=6B1C3PFB;g%Zd`Q{aOO^+qD&u)6rIYak>GV+buw+xetm#iUQ9^;QZ-!ynbDv-C%4(* zgNBRRs?LI#9fmm_);?T#)D4B5R-Jd&2lR|=9(9F7E)Ow#)HPv-e~@L%0g;RGPKP|L z@gI6M{+zvpDVXtNoFLD)8vT81MSpdRa-U82b4ai3VPNimeq!?JybhUr9b zG1kBKP#HFddYK*2i65o-YXU@INRA9v6;*HoSX|>p9)-PmqsWU%NgA`d$1URR>sH5XzUgFPO7+{@(98QQ@Iz?^MG()28aU-MBON{8yKg7z&jf47~thJF`~8%>w=h z`5P~bP6trmp=nXcIW$g-Ks`WLe4v;LSySXAvWvQ$0bo_);3(0Hx}d))yfm7DNv3%} zt5C84G{1Ql$H27e%bgBZ`a4xOGnVZ0Yt>sB>!_i#P*EyWBAf)gs&M3Cjw8GKNrOr{ z=feBd7@l6xGWtpk9#@9RR6istN3(Nj(p;7JZ`{`_LzN*autcLxmlC}*F$LUV@yD_4 zS;QCQDbt(=Tc4g@BN_1t6wiQLl&2_HsBvDo!MEr|Ot_v|HjE8GDywii+u3qDp2en^RZzy|) zHEP#YeD4uvRGUF<&u@0|RX5fc_}UDOr`534!71c@>CXVz;iUhC7-P_N4{mVhQ3H9z z__Kmw(ee}mz3LR>yovS#bUm0Te)_4B?SPVqzTx>a;W$@cPSyZDHcmcdQ&_(LNmm^pW(S+}%8|TFB zt>&^*j&mlpC6mkNz-h#m7x#9O2zaI=VJ(lGr{(xe7W>wC;K!ycaDQ!;eog|Laq`m^&& z8z-eA*qaQM<{;gd?13|5#{_|Wg}u^QSRxKN6>|L>>WBps(1Sj=*dtT(=0gp|%rdUl zffU^Qh05>H74e8s4e^boP6;gAinnx?moJ;D)~yYD(f($RVv_uSwN?8=(Mj%MG9jZb z-TCfQ&%65jG0;$|Iut=sb@!~soDzrK6@?}vynM*8`QDAW_*&!rMH$T?)tJz>2&p;eTPqK4;2-qTbc<#S3oLm--u z8H3j6PO1#Vyu1S4g|XJ)SCvBc(Gykn(ertwM#@+X4_llUq;ka4+BUoMdKKf5SJ8$x zNM*NY_=?c17$N74psCJ#Vo7v!x^B~}V(G>upZxY%+nW;~eM0SeOZL#rky1c6uRq7X zffw#vB7sJp=(a}>IXPgsUm9oZVE&}XByRr5=2nE)Y1Qj>I^2qH)RqQsqbs1|#)vyJ zw6q>{PgR`D*Ky&Zr5Qy>#xl(2PN_w?cRuUQYGyB|@M|AA6hDr(`m zCZv-W8rFzU+^}Cka47v)aESP}`z$XT0oVj&Sp|H3dw_dej*L7*7|J;y}*P&j9$Jzdv+#9vFH2}(cx`l5y=&<_ZG!_AMpxu zn-f{1EtMPLiKollcJmV;S8kAcqrD0b`ESwj)hI3=U%S?D?WP%k=v{3%^%!p>i(%6v zx{J~c3(!E(aV8xDS@FOcEjK*O*v9PgVuRr0Bm^}^rV_sCDS+%#Nb$-^J}tl6a@S-asAlEjasQ6^;cP`2b~XFv!r zG+v%d&QL&uX{AcE(0CKZ-5%Z29bro6Q^z0~ZBIKhXTPVNZos%=INI~}UV~<0gE5he zt`JM77os44&*ub%*M5Dy;`dI^rmU19KzNSrxLZK!_h6{WD2IT@ zWw|Bh*Rg_Q_ROEEnF=xDr#!!HST6TECCggGGo%-o#N66>rQFP7$@TVeU3v5fV~g_O zr2z>MTs+302&VEziC)!tRjza)(b}n@#P^ZEpA#*Npoaj1&V=&;U&@^GU`gV??r;mdZlWGYa6+dq`G}@!6x|CkJv)4g z-Ocp~r)edLZH3?-{vwZ@lqdKYyhbh%3kIZQDoQ$)J={|CmymqtVeFGxiJO!MUD7)Z zJF1F+?$?yiP!naXV}`!@MR%?i!olT!o*e=f7|q+TH^|z5HjpP&sl;*laqNePrh0~n zN1qjxUzX_-|N>VvbFaJloG?MQl;_u|%MpI4897b9 z+rL6@pZe#!#rqr5-qBrouE9---8KY2HMC^7OK3lN8Yye7+jTj6tQyv@`qyF>A%V}S zG>PKFG^y?q2o=TVndeRSF3frJpKobWEk*B=*T?dAKM>-_^s5wMpYS_a$TSNXE6Ne; z6H|kfRiS&htdHTQXoTEwwv1d~NQE-^6CpmD2F1o)QdVgEvCMP?-?dP9=cIAFY|9!k z|D*>Jjz2Ep{<6O3#-4Dw#^Au;Z*!gWPM)T-_eaK1xnRBP1K_C$AkY1m3yD!gl6Y6_ z3O}5Uz$mar#HZ4B!x(;Nrpe=XK(NE&f;O^L%@qyg#BJI=Q@(E+fvj2zd>VQYIyh zex=+gFpyS2rQ1vxUtzO>!qf26d73~eroch&3S6sEp8OHQTZHmxmfU7w zW!R7XTnl4G%>8Aj0S}uEcSC(oJCFVQ%}OAff$_u|9fIXOf{4&T4a*9ywhxDmryIK0 zBwm`9QpKA&9Cm0*ufDmdAua&AnotMwH2;l}W;T8X^?=!jr@i8h%a*@GSGnMpLO-=O z+*l`2v=Uw#t~MO>SZU})QZ~(vY*_3%axD~pqD0t0`@Nil$9>Qw4Ydfg$gmwc&h)Kv zkw{**seq6g^uAn8dfgbS^+|u(;}6lM15IC1n?bMQ*^eD}WDd%JIH`VPi27FA9ozSr zn$Y60X6)yZ%*Th==9T=^Fo?7mS2mZn*^B%+ROLUSTLdPx_l3sPMEH!U9#>_W>UH6% z*9`+Nu8HP8EY4bxiM!6Y+2{%_=K}d}fEDKBp*vW1W=m-wi6xnlZCH6|fACzS$7iZ> zrq*fv`ZGK@u&vB~cVxy`nC{;w#4`BSs}yOzw#E@l+0~LvC9Zy|;5|oQVEjha7oR<~ z`6}2ETe;VRZdhGKG2yIhv3*2>FNWXhl0*->?=aK6yRClM_S;MA7<#*dPg~gyaT95v zc3pvyWQ|NRG)sEP3meJ`GxYdp@>bDs01x z5{hZ)#2-|{GU=8)`Lmt3XlgGF<--wCKZj#H@yZOz1Fx_IvbW^rLouZ!KjmLg8ymzE zv>1(QZSq~s0v5gJ?ni;8q<~cP^=DEzrKW)|8?L%=C|yS z)wrNQJ6l+^XZI57(YEp))W19M69{kx&Q1q|_{l&{MC~(`CVJ+NU^+)aWNv~_7~kja z)U&8LzCTHX#=7fDmcM{p8IIh1K{fGmW?7M4Ywb8czT3b7Um*u>L?8!Kp20IZT~77?YoX3s6B|VOtafw7}kD8^Q^G>3k-O^CE&?Y!rhK5_+s&4HjqR z*Lyp4MGX5$ppku^YspxtBetLnD>{xj5G_UYqd`-LTVQD#?%!2-TKnwYh_t$byf;s# zB>odMw8A6lq%i*AzO0ZS?*Z)gLa zpLz_28AB-rv0Wv{l@slLgBNWytdVATKY$z)lZMAe=1?v?WFj9TkXW$a*`5rGtq#=Rc0^lA+WA5{V0=fJcEaDE-18l zZfV9VCmIo8R9=O|S*G)Z)E}nuYcs3}Wx7BNNB>jOXHjN<&~o`9c-lZZ-v>-xu0em( z-i?w`TKB9`nOVmytF3{h=_@LTq}ngb0ulcB+yDk&i%E{@JlU~%oie--0Z-pYWqT(< zT$cVGCi81=F0){R*gc;~$5x0dH$IU=3cJz6uPrrtC`+-Hgah-ugvk7;Yp`jjQ!i%@ zmhvoB2gzYds#4LaL~UbQ@ZXUjT@5_;3-P{SMSR6&6#i9S*I=j8UbYBoM z7M&*f>VP+{O&BJJ8p`^+?Q@7Npy4Mmh;X<<#Wo6p=0?AOG`ZB?sk+C%jZV6AAMnRe z6`yoJrX;hApxJX-R>`V^#OvOieyci+Ft6EG&?4Z*9uG%ZCgPhu#DUv)i9+~e{0C($ zHikPZhe*$@;;N-A#B9;n=iII6iG5x|B3T10yu=H9G`@9h7Xb0KUU^qiP9CZ41+lpR z+m>g;ra&`_AbH}v7@SZTMKln`F<{L4o0*%4r7m9^6fP{88#j3CuGR^;^c#!AcbHaV zhud%4TFwkN?>B670Tu)AHjLAEV1(iy;l13$@wHa}`KRJlq?vWU=UVG%kqSuFKhrC8 z0w=C3*|_tFV^tdF=l~F~WcAE$?&^&8gH@UIykDRr=OBDqr89y&rjlNW^4}8%Q|^mU znlYA*Rec++_Q5uMV`is`c9t#o1_YWjj3n=s)%6=W11_f~N<`@tduln!k0+(57PfC=dwnHa(RIN+$>uXU zPLuZ7>O@vi&~Ds*%EW5uh@q91_DBUxuBT0Jg00MaStF?Z@(IR_Jh?2djIDxh<3IAe z?oO7X0)*(=h7-*9WJhK#(TdSpvGI4uoW7}TB~ieaMzCxs88*bCJA1~&)*#=7YC zt5B`0Mcn_GKwU>~=Nm5*K))Py^1fct9y;JvAK@*?=#Gj(MBzNIVkV$7`Q}aZJSH3a zHk9JIDPEMmT5)nzLz}D&WKI3mH>&x*CUHRS2vQBu5GR}4ZN)I|0VrVq@?gH}k7Qq?Ws5y9z{9bq zrwK*O2+Z=ZFFGY`v>lI_`r7L-<7Lq?NL{}A+P21jhO*-RJYl;R9mWDh)cs{) zl#8b(*!fB6B5IM)7j$beL1)yBaMBTs;!j%Z6nLLjUf68{@jP3YcqB`R{O+;zFAYnL zBK`b##(cj>Q@(VG`rm=0_A)ADs3$C7_SnlIB}j~I1IUJzVp?T8RCs*NJ!CnFwIKO(65IYha0})rU><3_ zbckULA|o$dz?)N15e9;v8=Q(9 z8JBf7Hy@atPdY>#0Wt<3wph|x??%TQPAsY;;HjU4H-|`;B?^83iV$SU)Qhvwbfl0j ziH0-cupQJaB=}ZM)Txct**Am35ut3TUMZY<2Ld-L*$YY|7#rS&7ks12{N1W|X!&Jg zO4z+Acc}Bxrn)+ZB~G$(bOS~PXwG1&&S9*S;kutre)o3t_{jnt_y!8rWQJJt#180K z*YD>x_YgeAJ@+MP3XXHxm47?|u2%7KZ?Pv7NCtVf!OVJuL#KekNrz39SE!>3Lp7Nr z&MwR>n#f9t&Hbn&ncHFES>g5iE!s7}>r=(xqu^H5)m7{S7IM zv`*Bh7@h48x;0*TO|CjA8m_V%#Kh-ZuP`RgGms*E+H`&~s^ViKennCVQ#D?OZv$P= z)gTY~>*^=Hv(V42nV*5l1Ra`U&Dn~FvHfl20(Ixn;a)kB#nZX;#Ubb|IOU(Hm9DBD z7lhQ6I_OIH0v^JJ0zA|OU|OSFfbaQo*&@Vp=15FQePU>2pgJPF8bZe#dedSUQx3={ zubudH(#*WaMDalvC%LjK4nqe`q7<>R6Oha!_Oh17y(5UuOO4U1lUqK-sh@E_dbAgK zy#RrZAE`tL&2otFkQ}o`$BY4^I-rX+#M^IG^i)sVLv=X??i_WaA-^~=x@vV~Rrt&& z8c>9S5Pu&HTg*dsC@X$AX0Fkq41IjoFN8O5!9GAyqe6F6c3%&Ai~q_wZ0$s41S7Me zxjkx1&{?qmI0$((QjvFXGcxs$+?>D=z;%Cabs^jV?>23;(8SKHZqq|K6Q3KcP5vE( zeHF5YsG0;7g(O@)xOt$X>h>je?8GFfHs@9C(@+yVv!2`SNE%O6-dqS&)7S>{KJMEk z^&d~?jrALSpevT#Zsb%MFIR5UkWYYe;nB@K!NdAScO{dZ2JU=Q*}ydMQP$=&e0spl z+vv({^I(^4L3idDs5y#1CW#%kcFp~A88|3d^#retB0p8W~ zQ&E&;27rkp-wfHu9*PdomKzJuz|i52D5Hn*Ao6+r*Zc(A-Ia4 zjUp;jvCJZcGyZQ%eTy_>oKi?F;@ zIz?$$)}2jLa(_A@m&GOg9Nkoy^5Z{0B_k4jx)DT;|w{4Rfa4#(Rqmw$=11IU5BImP%cRLVGzF$Yl12$MY(tx%(l?!Y2&GUDvEdF z8f()&Ch1I=QEdQQYEKTzR&6fADdYBm#71o_LeynnyLCHS2g&AZk z77^&x4wAG-B%c~Bl*&B95HsHA*yu(loPXkByovy5>f407CYB8go_V+M|FR+CDA9@n9+1y6B+fs*erulpW%9n>O(&&8IAc^7A0 zrXz6|LcxR3Q`q9D~H!rO4am$+zq|It+`9|$G96# zIQb^SMQXHH05Rk z7%7RDKf#Fa!N8+|0yA$bpB{cGGG)1^HHPb4JDO`G-$aZtO?Brh*Sf~?n%~yV_SAfO zh=`f(b`yJ}8g_|f8LA!)G3e)}6wqs<+Wh_NreTs+a>&!86llv?L=8zyRqssQPBZmV zk?@yM+IGeGeSDBB@%d1AxtWc%H2QkTEq%tWiyf#Pw{l*Ru8(D{);RVdu8S( zbhED7^BYth))ni_e<>dng8&x+tqwi+)(-CaZ0IFkpV(YGya{VPWuf|Upn}dax8Ys2 zafJRV^ZsUAuch!1toE#hS_PINKVdumf_U~jp^r`6WztoMRe1Nu_S&DfY!*gho>tJl zI|hI2f3JB&5hR=isN#wQgM-zI`jM9#U~aJ;T8~on{;Y4IPZtRUq@rnhOr>u{J2F6b z1BFK{SH+vT0&s7YUG`*@S{#PAZ82k7!V3h&ZJtHG-I=oDYSd0KviqUWK11=I9E6)m zQFHsKoF9PGZcJlWTlUrnz0;rc!eXDS4w)9H?_s_+Kx@i%Q5Vr1Uj{kVKBUO?zK*hy z{9#{CEtX8bWvdp0oX=S!P2lqthva;NQ>nx~m8{4&>`in0IctA3p#mF6jdNusVOdTk zR$eX)O)R7zQdVfEvcbI#IwYEQ>`1iwgXOFOM`4o`Rw>+IOqr~6< zfK4{$L#`T=d?_?7#kp>S-rGbp?Y}^(?58JCEU);AeiI~k!v$u0v5~1XcRhs$l;hZk zrKkt-3w+`O{=V(tO`D0BGTzg5FpJYL$G+Yxh1UC7e3Ez>@pTu99|tBcJz%Z^M-xbp zv)oo$P2;OH3QxD?2cPj>1mr4O8WA64p>OiwTllH)_i-tl^NL_3wIs}^9IFvoGS!73 z1O&V@JZjp;fzUNpY9Dsq+TI-vZ^RT$9|f?gg&_6R&IJ5NP9;#FtzFB-w0S>%fm~6u z1${3+;v2`qYLSrwR(2aR-4>^T=d_^FOL-3Wurz8ZXgf6w%R2u*v250$r?R*1h{8Q7Kk6#p&?7e8DWoZme09X+peKY_p9?ZRu;Iq3~3f zf1^*fTES7%;jsls#L7n|gK0?>4`G%qCE{x<=b^ zyO0b?-7twuD3U6;TuBXvUor842SKX1v8EhWcFbXs-2X@fa>!9IP3DkDFt@;r(BqK& zso=q}LQSxes91ZDE5cnn@W?#wkT$@`Q@;B9Y15)s;eb{h5)g$f!MbJLME-(W4BO3Y8ju*kJ z$Hv|e-L_rzSPO;7Fjs*V8^U}@%9Eo7-I%+Arl3H$CX!biE00iE5v(owEc+BjaLQ$I z@E4J+r~rp{x^vYK!uK?B)?^I2ysArqtWI}!ik%mQ;q8ruKt{NKkTJ66*dX8iHc3dQOdokJ^^q$C(A&@?&?6LYR@H z=t*4<2P!d3NC%a!?+Z6XvoUHBCy~;a5WZi8*hh;fj*oN$w``=?xau)7bCRZSI!hXp zomHb(b(;ZiMctlmuJn(DmUaR|Na}0|>}xwbvXXsvX+&`OML55P(0e6EEt-k;4KgV> zMD7Mgv`i?DP>bs@o}pcT^LxA%rz8PqH;dHK1J}x~ic@WY9d0#RN zB0B`~&_y4{4TiUuELJ;>bk8gRBSZRce^YMyP(o);qejASZ9`EOBJyZ+5eOc&+7_yx z3cZzKDyazkk`D74QucaqHq{j3Mx`%#FM~=;=6jHY|70m$O|UASHtMn4tEnp9Pd z`t1nOU(C$z)>dIX%I zZ!_&-Qd^Ae8P$$PAB0mzeP+=*RlZf$d$&BjIwhZIZBHDPQQf@%Gr^EZP*Z$+ldVO# zDEw$vB{GNrH^Us(V&qQ(K?QQQla3=-*nU3!ga8L2!RZ1D#m+7nkMNQH{w?QA$re{m zYsGMjQ7W;Q9aR^!ok{i`DTIC07@H|b8?;0LiMyq0x`gW+j= z4ocHbejQzXzn@E)Q9pZN-pe#ez;hAkYx=H)rHkN`0$}`%JF52YJJhu&qONx7oHtg# zo>_hPjUC{6^;^4V4zho-e&0{4~Uf>(H-Tff2AR)!z|riEDyssqJZ!B1!0 z2WnoHbFS}H^thk_0S(3l4!hR=xLOQXdnMZV;UMaTw$K&X%?xZ7)3v6eyMuAme8)Yi z#CbX{2KGf)Z+kTKF%T;#k8D1DXd62XdY{TcETScy&R#HD)j#>b2}cBNNuqO0kgEu` z8yWQCidW_uN^(OiA>nh~(^@zwx#-3mpcseTRSK2o)z}uf)(1WY6~hi&s)kn8Fn03u z_&dx`-@NEwJ_4j#?3;8Z?ZIUi2kb)BQp4W;GEU`NKEkDY)Fb9cZ`e_%#!{+3NW}9* zv%U~FHrgcu(u!+R3hG&}>Jm591?z51Gk+DC4riWoqH?m~sffSOv_Y2=p`e4Af#$2| zG(F2S^QTKL)}#qm-B`IU_qU{_{yAFTA{v(~+x-apnn^xaCtamYI^ zzaH3x*!|VHk#m&QksLCap)+ROOAXDf7@`yjm33~Xb?j~6M}X~wauzoA#>G2CCt>eH zoUDPT_EWy7BOIRXrqD5XUlhLB_>v)tw@>VwhOfC(FJS|HQcrExAsJ2p$<6LX%3DmB z!j&%&&ege45xcLw&Ze2y{*a;cdpsvZf_48oA<5xY8K;>emxeewg?1GcyQ=-&kfR;E z_Uv=Sa@4KuBH!p)pfRU$$_CY)4r)N2Ba)Nc%|{r$j3yzxLX-$D2E4wO&v$M=LQ;rz zG+Nn5)s(7sbHA<~8Pne-Vb?Jex_!eLa$RQG{-_-cG7M-*p{#I5wNy;J(Y>z3$bPPI z@cX}|k;^C^@g6)Tpf0g4`9*OhDo`=dpDF*ac;|hP0GTxy%hh8D+7|did#?we|EU_M zF*)41NuKZ%EG*d$J+{4ln@JAijli^RaFd+D@sZ7BZh_FnB@*@~K3xjwRMd zy>$rIef`joL{X%(dyk$4BuZhCgxKq>#Sbg>nQR?NS+_<69eJm58o!eZ9|y z+FHxck0InuDia9}5;Y#62{SE=PYW%vGo)~ShEqe+#~q@rldX1*5}N{VGmF0*@6??( zGB@$_WT^x{yd5nW&3OP$<#`Yph9h?G3c5du0nuyH3%VCWmBtaqy{OmVu)_2?UQR3F zzkS=9V#Q3ZXp~bv{sw&{3c{M$$ZZtjTpln_`vcs_^he?YMQMm{uBeSxhOri~+n_*J zFr-8?qN{O)&?boAevAQ=-0zbI8TC;W3~ZQSk0yc;b>SS5yxAYP)BT`?3; zkZ}5e2uN>(HOiep_EM=e=4x&Wov|+}#rwC$T@bYDDw^Ia@~;(7m#H-FvJ0x>m3ya~bs&7xPTM%05!nVTArL!iOV!0hi2hxb^{v`FY3W7gK zFhDXU8Mkoi1u1KnT7Y4!-;DA_C;hk`tq^dP+MydVdTVS)?4y;#Q8YaZKBGQTTHlIe zuk6BQefD__86|GrjX~^>>5U)jFP}-`WF(qb7tZ=F5M8|=oKDpAn$gB5c5sOg9i2Fo zj{*{9epCC@q`{LX-p@MzB{5%8a-gxgQZGdzMQ+l_-ZX^GuHq@zvgXpm>0`Y=bR%I~ zqD8QglXf4zO>80*gv;KMXV~q6>#N-D<*V6wIi#8v%#5-!-Zc%pcMYHKlvH)-MmxJF8zel zYGhsG1k65Ke_?{e)ss)srR;k|h*`5MZs61_uF3)CBq3H%M#@fRcKbp2^?U6*K8ZAs@QNS*57V#48;4s?gl$|9H@OYX_U zvv^^rOR5u%s9P-kw91Jcc`4|Q)?cwZsS&_X-0LeQSR$nOJ zI0T+X-&~T-Cr04H-7}(FVO*@-nQH@GJnM~Ps6MAlVS3PI>NUY**T8d;rDr)#`m{K}sY9C{YkBq^#Qk|uB<>wcd}b^`0-1xGI?NOvOA>8HB?!otqd1Z9=Y-OEXO` zLWyYYp(R?8YHrEQH8hqp>XUM?gSGvV_+I_3jty=STe9@`UtDlHp=Z>vpMJC?!ZlhB zrCENkIxkXe^I#4qSPpNKBGlQ=Q@kubF@NZv+r=>uIV*X7OPrYG2cC}eZ80J=Ze9Q#y-!0)XAhCUfH@C zJxgdF7Z_1i)4E8sxq&R zuRD(j_TypCdcO@UxY2hCm7kUmJKTnt1xhkWoNW}(IXF7X?Sm$&^Mw8&LW-LnYd5tjU%`qdl7ThL;*3_2r*2MvUQ7 zdz54u1?eH`co^qi4&SAdARWn_1%`m@1g&475~pp4MkO?ypA{<=Cc40hMQmVG8lTc< zYROOe`E+jckjX7*@J_}GFoUvN2@bP2f6QP}$Vg|%Xp(pyL_siJaX@z?!Yw&R&=)OX zH{^rv7UI>9u8nr(hA{IC#Og*VGn*4RZiT~%CL_T*Te4^m4(VcK9#(Q%JG?vDZgC{# zxsk-mW-99WS@TH4SIYa>w_wl6p`bq#WYac9d)Z(ey99X@8sxtyhy{Ad@qx_QVTl5&GnH`$WAr<=7;!9xKZ- zJ~Xb`&HDvhx55YEB5zuil_TZi-4jbGdpJuXEg~EIU7C;ZSl<_}52**v3p}K7yuTy2 zp>PL%a@%|XUDF-3VAkyM@Fd@?Am^&_UD(IRFpu;~y0F1UP&JYmnhP9WPIpdGP|pZw z)fv;bB#N)#dWX%T(P$=6XS(gn#5La6K?=g`>X;PQFlko^)T6mD-)t2n0&-B=71ufW)&Q&Q%N$ay2KRV7cX>F>A z`DnEuOW3`n3eDJtv=7>X3CrvLS#?2MC{PV6lb9gnY`$r`iNkqeCk16=LVM7P`qiXbh05hu3{v!& zSwfzio}H0OiA_H_T2sH#e!TDmQjZ+H)aS@>YSLgyedFiY7H1>jU4D4o-PCI`sk6O2 z7xfG6xq4{b$yNc3qy=JnMpp@p3s)T8_t5b5*LyhBg3jQH zUtvi<=SRxET-;!cFazji91K+QJH`jCx-JT#0$;FWulJcO1_^cIv#lm{Q5dZ$>=9w$ zSIN_J3R{ya*LOS(pLuKfs34A2L`EJi&9fy{x!>CR84?r2=9dQ;NArP(gvxtRSdsWx zh2IOA)EX6_)5ht$kIBy8L5M~D?(Cp?xcB6LvR zwdoyz&^3;l$1L4LEMAmWRc|Hzykada6`}rqVb>RC%+Hhi2m^8t#O{zkHK-}2{urk*7K==68dUZ)KtxQE6s^|o z%`bkBkk`o^m8EAjcuo+hkVI8KkXZk`JV(r*88y7MSK{B@Z&7PQcbdU9EFYs+QzsG-{nyi-g*zyM-dvnD^5sFELT5KHO^qMbKG)DQG}B@z=dp@ zU1=EY;3KbuPU-Ow*Uij3OJMx15>7N_C5eB!LqEWo{|uFjZ)B)K%~nRMtgro;N5!W| zMcpVr4iZfb4h?=gYfRZr^veV#tt>UA`m6o^a&B;CbC84iCw|`MWOVb#?Y->~?h*O9 zA*iOcN83;Xt5e-i0hk{uL9V2d+ApV`_cGDK6>#~9SV04;6tXD|7bOgq=ZJWxqZJ|M01CT zQZ4R6SOSw62iE9bM-{V$kB2+ru}iV9*WI6{L7R5!`M}KwwADYK{M#v6l;WDRhPH1m z=fqUd>AXGKI-+YndO(<~us>e%|C}x`Kq0UrR!fC+^6R<@4#G| zOl(HcKs+l)QLw2g2bxYP%DA?;86ue*Khz}3YiKjFiBjVIrlrCo%LEe)wgDz|Z2 zcty)pZV&S(Hh6Ek1r0z=n3^1;Y%{BCfI!`A=|2P|KU1S_PbRSB|yI0J7+#Dtsk zM!iQXh$?IJ4(T2jtj7!8I4sw#A(>DHJ*?175IFCP5pz^7I(O&Mfki}da2<5Y z9{FYG1~v?K>f2LZT10`Z=i~oMexU;cp3NgnoLO41QK6B&2)g|4>}jDthb%9n*CMqL zu)k%{l|b513sEWa_#U*a<8G1Rw9a?E93+?!mGilw$MqaIDkg3dde0H+A|N&X;G%rY zqY{VJKNK0et8_{&2YE{$EERv{F`zd+!{Z2rR)Ec5^m4ocF^*f|dKPL?*;i;-DPn@f z!|JBo#lQw7(Q-Gw9iak#C#_Jg7Nf5Szfp78xnTSImNa3xIOr1RbW@*<$a9U{mN^{z zr-C&B5hT%<`m~>zM{#eWze`ay)LjF};LnuJkYmEJqL{OnhdUk*;4CjW8Emf9A3h{4 zde83MchGGRLrKQy@nOTB@Fndm5{<~-#~=K<$efTt%Q@dbJv`{@eY*n}nvxrix0j;I zfw^@#)1dFr_#K?ghn;iKyntHD8Z+|F77MJpsVtGHR$&Mb1yNqP=*S-9aEjN8r%BAL zKpjqLO%gYx`la7tVg=4X6 zJcFt#ceb)(`nI9Qbe`;mUba98^(OluZ){VTDYG`EVoW6MuFG9+78xuyEZBC^ODvDM`<8inxcByJ_rf_iJz-*llSx zm^qz)h(N$vfK6H_jrOC8ari^1nsp+Bs(hlAV)``h68P3Y$Sm3IjNVenQyq#N*7@+f zWKWcp0Iw#pGw#cx;>D}P!Rcu6hR-VE9k<}cSOtA&;wIK%HLGO12{bd1h7sx|rN~Wp zUr_jySifxai@*}X{kW>ZM3|_NN^d5dMnQgP4Lax(!9u_=Y) zCr{);q!fqY8QVc6q$q9TI0vrQYmT~xT1=8;!=Nj^A$U`ZbNZ-&f)*%W>noT_ zmCoiFlE;Sxgg!=eRrBpa`!OM2oUx*yxZm=QCDGmLW;qrL#Sm=WOKLI1gtqb|Y-?RPN>!aq-Y2ImWtrr(qPhn&d z+2uDdKHa`pY2rXg>?Nb!2hQ4+$W^qc563GwrxR%Qyvj;hTsi;46JR{V` z*#G=2?hv~zyAm)-SOMExO0hg=T1j~tq-cpzCj)= zH#hI%*0kD_oDW$7E&8eOx}jdRA&{~5UtV|tE^NHDV;-3V!@y4v)9i5Z=VJ8j-zQd+ z`tLrys$8ln(g}L0Zl5b)aIO^^RrbxI*_Efq#qA0y`f` z2K);=JW=(|(s?jy7r1ePaBwTf5A+81aaayaLP zEx4z_oWvz_X3ySY&~o~W^$ZeMkELXf>VZ=QD$F?=dz}r90(9}7YZlu+QgdMEu@!2& z5caqAm@m6VdB;WX)KCEW`AU;yBV3BL#}(=$xIl_L`ET?drhxlj{G>IPxyJX%UToc;YAdEXaYxUDHFyg+5b&`X|fVaN`C()J*k~;Pe=cr~hYk7RK&J;84_Ux$4?G2?X zgh>|iFm4f9B@JZ`+YQE2cY2ecw7-sR6O34KNZ&$Mp0|{VeJS0MH;Hz(Bo8XB@~9XP z`$H-T&!;V;|Ez67h-`4aB@CTxZakJCDiHwI{T^4%zN;j3}B!n|xvK~HJ8 z6Y3W4k0cwy;bbzg@IxubJ@;rP-uf) zr^VTdedj76h)G;wY1F0>&AHGtEPX~qUrXLwf(asc=rR&xG2<~Yrwu&A7U~S+bHmeNi-BiOSZFo14&^y|PoYc};Q6_K_D0(7s)P|Qzr-2NgfuqM zoWao3GP3YZ9VsytQUN;MmwGFdx(um9D)Z>1J#cE}8@tZx6SU$r{saY(tjnIPz(SqP zYGw+U2qe*TirDJFz_83Tl!J%~GY$7zkX`!^wq=mL!TXO+&Vhb%_#*?gR@7*=Coyq*a96bjHI6e~hkobpJokc{RTIN4#@5s%0 zr=e%NTXy#-`bG;&?j`okrO37vMy#CmJ;PtlUH@pvLS(QiBlegUMNAer>#SU=7A$TMPpt4N2s<)}2MW)sjM`=%8(RUKud|IDYkf>sLj!_5#!f6_vS7v z3yFR*I*-P@x%VETn_o-2+ zuas{G>&wMHc2~dT2NHI6yFFXD7k7-=1}t7E3R`;-0=53;^Nqkv!8%SU$zyZ%(kk8p(fH-+?`O2?Mz$jQ6hs7dW|1Ge<#5=4o$I|7@#;q&FTT$Dob6?}1&f?WPj@4P(ND8N>{2A>EUp6&Z-pqTWrIoVO~U@?b$H2e)R?t;*Q1A7NK6iZP&)Gc1IOnhqa*4^t%tQzF>d-g7GBEmp~fbm zu6_P4!YK(s<#wYy%zopP32~eD$G7k_WYM&H@FOvbT%yF8<2)bL63<`$m##RZ_AFmH zZEt)-^ya}DI9hnuqZBCmV0%wCehpbQ2$OwarTZ5blk$@Bi%#~ccLY*NAi;_?#h~`^ zs>jZ4?#KecXdGqYNh<>FZm8{DbXt+CUp}u{YZW*)DTI{XSUeiy020%jt|tw$J5^!+ zZdpT#_Axs@m>)YT%t;&Z+D?f~Z5re&0j6vVkr!uXw$sMMdwg8;OT_;D0NsJA1(GZK z5>SU>$WoouB$RlRgMWAqS5T_lD=N2Z|73qk)+$9}7>LW!*;u_%cCX7> z;mS3GO4hsB-%VcvqsQWCpbX-JH?~!xftWQ#^az%cc^g_>fQAknclU6HO4*`ReiCoz zE6nH_KW$VE8@H>ih*ZLQWfgM0K@c5v;CCzLnLYJQ;qL9^ZerNbRw$TMz9GbJrLioXtHld=(#de&hI9k!#tR^YkN=c~Il5J-% zT-cs}CexaYl2%ao-x#7nFoZndwfGKG9#sZ>_!_{z$}qD@>W{8s@vPYtFL_LqmR4^h55s_i_4!dX0E!?hnjQ;?Kx~*g`>@w zpG$4EYzbz+(mY1dtmB`%eDlZQYni}Mv*1K_o%mSv&bbC+$n-f55oUs~j}UwAuB5=b zYtG-`%D0UcI%K#^S;8Gr%-gRa>ouJd>}&BAL0>i^ zhH@jd~;+Hxk=hJJyInN7~=eL#J16iG1Je~ky1{s7~Ta>Gdj+-g8 zB$&JKytz{DLx;x6J_dYaex6DBgxUCcDp0{>koZm$UyM*~6MDUqw28;W>G!F%nN^eepb zN{VYGvAaW4&w0$*Uf1s0Q+!yN0_vc?zK5cNs6d6*U9NV#U#$>ea&pjgu<~SvQLfFr zC0r&XZwS>=eI!*3A9bmDYzOd2lf%Z9uAax&c8ldhUNfcJhgN8tUlr%RI3;lqoP`}v z1lT|9s0z3=xvtyBrUiM(b_?I~EIGKiV=K%w>AY5?uDebvrul1F;RnDcJeU0XO|u)~ z{k4~TjUu@UI4vU;8at)FnfY9Frlxj|pi4ZGFNv9xk-tao_~z8*30djf=znZ>EXo+l z2%&j`oKx0nyt^*P4DOBAjQ!T_syUxjn}q&e!6=7wDKQ>+Rtp@u%bVW2mfs|@R8JJd zrk8Ss?VdZ`&!dvAVm(kFv5_O4+VQF^$wqNJpvk}r+CcK9%tsg#qL$A)PoAy3c%Bf2 z{63DIAvG=MK3?^U(6fLv^okGvB;3XJU~W^o8!s@gaORh0dkVCa#;7mph7xvzLO9rl zx+I~-5dr>0)`p;WEpvZY=qrT$DLpy#JA_;nN6CL^l+VcUKQ+oHknF zSr{YTFOQA6%gtNulFl^?4ct#l`3_09Z-=Ps>&iY(yzQ5_18s{R@H4#?iVSA5pv!4hcaF64kj@OknP`||& zN`DnJ=Gk&wy*e-O{D=!B^otZd9~?6irS88YIv435NaYGtAd)xg+a> z;AayrEzxUvk@NK6=0y9mTw7maxAD?wv0i(ktHZG5nSbcg1qt||Wilg`TDy_BowT(- z^5@6iiZZZEun~dDLhQ@FF{+aT zburYQ5kzc{ixy=&+#U?&KAHo4{5X9N&AxvbxHLNp*bJA#cdCuG_JAXM5v)c!J8=)p zen_{lB!UCOVE`MtpUQ!yi|~;(kRtR+3W?uZ-4%4q!(sK zhXclfz7`(Dwg9UzPuUfO=l7`9Ue&`gL+FymDCTN?IOC}q^RTr3?P@%RMnC35Lo%ZS z(BB7xCH_QS~bQDxqv!qltL z@tB66P+KLx;1%bYe8luC%5K9HYNpd-#xCAbC3AuHBGwPOGnRXUx@q(-^&2c+%^OZ| zKzAS#KBMn6d`5bjH&|zYUti6e431r9&z4>0d#xKRuBzwg&8lbEt;%Pahat0Lz+z|g zUFOB_gJ#z-H(2jN-l4fd-X+>MSX~&q%r`@3yJp@@h^Y;bU8uYKo>YT==L16TrJ3(l z>g8iwl7cRSe)iP5G@%G+BYThtvE&&f6HY4MDNu7HILaNGI`u#%T`=F_1fLLc-Z*Za za=dy9KVlW?g8&@+JniFPTSE^eIj&s(ho}Yr zhW+N#MiA4JrWJv@tIZ0*>=kCzlI9A-sbq zecO0zA?S4E0L*}3kOYKaa7>^o-p7E6z1Bm4Ll7uTDwRbjOioOXSbxbr$~vhbRv!36 zG)%NoWqsN*DA@oqOxDQ7Y{f$JnB?~TZ;GeTK-D{ps|0ToW=30+SCfS39uAb1a65+J z(Zeq4MU1G8* z4s^Srtf;|CyXKyP=T@NduuE}2`|LkR`+^)^7)#i7e4@*yZV5g|%f8|QF#0>}(f{b` zFpKe*orAk4CoBzXoz)q@)-=R3Hku$A%}<*~r}geP5z*HN1Hh#++BIJ1XEELd ztCH4D$MPP79-hfgiQf64%2@I`-xEb|$IeGuTnX zFL2XoF%LQKfnv}shl&M&=@9pnhM7p)KX|n`9x%-N?pX(*v2oW4mX;4i+A~q|V?tUpq`x@5R}BAJ4hwmfXMNGCQ%>qh3Oo(}+E(sVg(aYl9YMm! zm1Po7KPuOhqvT4kSKhPq=mF0>V|d01yd>aya@f7%e)1K~c}1x|&hN14lxOs;4C1>#*oI)GGlozxJ! zw}szCAm#7Lo4Tw$aTBi9E`LeNK`^`+qw`f#-6M6UG@Z8Ra78G5qTi%g zwe}L({q=UySN77v>uayO87CLQ!d6*+euB7XR z;&uT@)fxry7ix8E(yVyk5)nc%!X1HqkbEF90joG4!aI&?&iEGrU@@r_7ho}Xv0M^; zMFy!#MF+UJAQLdLAu2RXD@!3IeK@h00@l)bN==etI!^!Ob|HT&_vpt`zPq7$w>vZL zNKsu}Xe;4X^>2j^c&SkKBCUZ?o`SehCe9N#&>RNV0ZLP{0nD)|{7389%Z|8mXMsy( za$`5Zt%fx}=0viiS`Fa9c9Jd`dnySg(M9%?Wvq zcKJI|!Fv$%@=Fo(sMNg0t^mM#-();v<-rCY&!&EnJDEuc<0kfY7?F=oUd3gRc9O}Plz~i=S42Yd)G|R&N``hWs zm1_E!KS^P(^JU{fMQdV3N`-93;xB|hyR$b`{(y6i;?tR>HIPJhzCK>FG+bQon$A|K z#$B>#4-ZfNzFIS~cTs_xJlKA{Lpai0l4~gCeqex~OyaIMb5ycd$|%nz$K6uok3rSF`3#!P|qE18rfguEE@R>AcQnyZ%^1r*7G$INq)cR&B@s4_00O zX7w)vR;gwAFB|aq-v+$+mjPq{M+27kIgBa;7_ckqKMlC<+rJrb;Qvhn{y^~C{igx9 zLjG?J7-rb&e`UbH|8E(v3GTdxjvqQ{S(bAbBRKM#&XYTT+9Mu#%k1smF8_O~p4;P!qrCFNvMkfT z-E3=Y{UyNk00Hh<|4V>#m|Ff4V7Gq?a1=Ic-u>SK`~V#g0HxAlC-zSPetG%eY2PaW z2(V+>p}g-c5BycpEqOXW>|e!dR{LkcOTdzLf_)QEWoLM3vlIM0?hg!1vu|@0z+wQ zGVkKQ2{6#V2{73I4FTr-OMqj`rd|m?2md9&NdH>_Mvq?lUkNbS|2qQw(h8nA{yzw? z!+#Utc7Oo?3hDue*~usR`6&G#@T0S25mWaH+;9*O?|?2-_n(qct{HQTWP z!5{yA@0M5IZ(%@^|E@! zWRmY_55iedLLCjx-Ulo%f#zaX=LrPuylR9(?43Hv=(T_1D&;)zzcZJ0%}#83CvY%z^$Z`C?>qvCFJ%?dGkau-NEolXRya zio$6((rc4^^l^f;wY{z8y42z3<5KH*<>BTDKkBYnv_)-Mq1J1fbUzxaXkNv$ax?wN zGv4r;)1^8lvDMp{9^?2mX3PJn`sZs_BJgW9ntS>!k{HnNAQDFEW9K#hWECR+vN)Mf zq0wdWqAr&xJ(nfoMB|{@;_Q=Drc==LXXCFdOP-ixt&1*330*(f!nK-J8w^@>!`EGk zu(~h8Vz<8gvKpPO#;e`OBrg6AK74p?2r?n?@#0?_ix>~OJhqQ=GCi8-A&;*P_Cj;& zb?xO98}`e})qpMN)Fs+bqw2N6tE;{;qB!?#yb3~phDLlzoH*1nFvm@<`!&u(7On2F zkcE!$DY#psK|mAK>MzGz`5XKg7)HHbhF}7PhBq!ct0aV;jx5*9`Yh7<4Ovy(o*HjX z?1B!YM4w~U%ZzU5e}p?7Kr&2aKhefmyTftgv0(v~?Z^Yvyq?B^HS*nFu90xDA(SH1#j;Ygffd`6<<+tZ(hPT`ou#Arhf>e*E}rEvtkaa} zN9{I8<7B?x2v}$4QS=W#-CBGwZ6}2HW>VwzBAv-OowmJ%9**{netRVu+R>gN{FuwVguho`wA;yP>SPc0 z_@ZPlb)s@|S7V~vn~V90Cd$|KKhVJR@42PmXlLwVWa3CjX>V+*Y@+_1k&cCdj){{BnqJVw+1$>Nl8Rp0 z!r9sc@TlZsXlY{P4ERgf(Zs+R@S2PPU=u<&3ukjea}RqHM@JJ=Dtc)X4>vnUV<$?$ zKK`+yg`KU4fwKuAr3e=j0}~qqI}-yVGXnzy3k?Gk1p@;GU_Dton)`kYQwtt;~vblv5A>ill6QLzkHF0zTyfq;+9U}`PD<=~h zEAw|II<|kEAz%Z*vCCMvnh^eVRP-Vyh8704RD@Rc2F~VACI*DA|J=}{oB@>uO)HfxF!iiE~eZ5|Q3qU8+YUGxU*)EhAvN+5SGo9p*d-k1o$KetJE*?zNeAQc2vo3RU!zJ-O3q|6cG zk1ojQO^r6MVnL;qM7xF@mdum{1CwOR?ZcEwf|cU!V=@e$pD~P(Yy*z@slS1m*^5I; zTZc`?Y&ZuC3Rfp)LMqIffe1>z54)0|#GJ9JTQY-B2C3hxF`U2QfCJA~u&9q8hP*sl ziTaZsy;mD9)V_o^;D&Q~3d*v7R=e+eLB6OwB@;%|bK331}g=(z*J}*{*tQ^aYB0#EznxW2<%qG|cmQarsC=Sw4s2B;}tA#AChE z{l7&TP*2GjrGU0hHdNq@{uJKaGjI5Ou1^ZMK|Hi(|55Vvy~WNmV|U@r`bzrq_EO}> zTOGyImUE!CXUvvAbY0D#8+%OJbE>9Sg!u&VvF2^hoQwY9>8+*AO|N^ueI;K;j{+G= ziv|@)tTcmPKq)Pom|050kBho;{2TslB?a^0L1Cp^)@e4a%~*Jh$<<`Ozd9j!*-%Zi zr*`=MK?31T&5_}>RCJ0tYpqYAg5NGviupPmOv}ArNwg6aN)38fog(v#;gTEM?OTAU zV(nq@Ok9r+q74d6#t39mFNd)wdxkc+uF%uCq(;uvtsoH8RD}2FS^KY&_($!BgO=CQ zIj$NQ0Z<&z``YZq{TC-81WuH6d)zIeut6Xya%Dn4f!!OlNe0;$CS!OB6?Jg9>aC`OFH?`fI(yxCOtND^dEs!q#Gk7#LNmEMpPJEJ|Wlh)h#j#@ei`L2%0^N#mcC z)Pjmw`#Oy;$kufnu{g42v`7KO;_DPKptgF$-8OlI7rzMTOEg)r)8`#}1DO&7c53N^ z@G?TJg_(%*hnT=THI{8sWKiI(a1UsmAk}lXZ7+5IzsAly8VbMr*s_I$h)C!gHA&VOLy}=+8AN0qlkAK=`=j&w=XcKYobxPT!Ib<&6kgsP7nL->lUaUT8o7D<4up zDrozt5974_ zscXgUx1;uN4@mXV`Y~s$$P6M0$7-Rh_F*40p!7oTtB#XZm~$Yw{J z{VKr2hB%-76>-6AG^ti52fs#-4`gMZY-V5rSiu04NHW2_PrN?r<7r zLBc;@md!{6fiEL~Ub487iX5qEPBvH^r)bbc2%HqsH|oGct;a`g)N)zWAE`XislpjN z4lpNll!JoC2`Om~h!3Ta*cJ~0w0>2J#M0b5@pqIarq)-loHWN^V zX&N1sFuz zW@jD$+JiR76>N;VOf=~pw)YV-*1<1>hbAw{8oB2D`fjHR6g&^4I+;EeN;fviS zhi=g-BZ-UQmz+L^^VS`P91OI9{3swK<}`jusk=KxI&s`m=QJoO|fZuy=OU5wN|f~j#fl_xbSzD-Fj*n9pDg1*se zxs$wB9-BV4nJ@7P6b^#Kw~mLvZ*Lgb3n;2K>57VMHkEb;;1b?2cl7Pkk|C>-`V(0L z>!lMf_-mvh$>x7j<(8$i;G!aaJi>k!aG_lj_)@shkL&HdW@~GCF7tI$I1Ch2o1SiG zvpcBmwm2jHe*c=Q9}l;$dkc{}wMbs$X*40WXVZ;Db>;Z8j^q*Rxwfr(f`e zaYV0OWQPT4nKHfef68rm@caUGhqN;l9I}1=-nszs?Rv{>Q2~E(gIu^WU?Q)3;SQnX zoXG5{Z$pH;qsV%;$UXkKwB9sDPDQ58-#ow6{qQj5r&MWPl1;1*4fN|{1IxO7gWzuV zisrR1zv{j& z!Ms;Ym@vXzW(#vi%1$Q^TAA?XvAld$XWXN0(csgQ2yI-{c=h=~uOTV!N*=rRW&Y6W z(Jxjxb@rj$8vWJeXR)4m)5HNv9#XQ3T2t|)hW^brvp#|0`X4-|KL1TWt}jc^`3DD}7a2Ok_g!GL z^io0j%1;EPvJ!jE{-f=Pp9pehAj`SgQOP&&vTyR z5tUfxpE)?G&Z*UztHIfiM83acvmIsB8h_A`)B4P5f_i!~20NoF!xa#zEoNx={pdzc zJhM{XUL76M@rf;Tc_CZGgL}~f*R|44htR+&Za`tas|Nyg(&;n;mT7-RXDZ&#eLN&V zypK^-uh2)jz2cY$R52#4)ln^tF)oosYpPyzrFT*E@=x!2&xVotYHW)} znUmgCk1{t9!hJz)xu)mK1=?~ID{S7)Fc$Tcj-^tIg+KTdE26DNn|Ebm#e@J)0TtBO zD_O{;hs*J z?|i7OH+Cn78` zFyuu1`wId4d%`2|B>D@Cf1|4sjyf7@*Hl%n8i5TBH8mkul}~!KRg5&04IwIqnpcdC z)s3JM|2^fTjyW>G^Mo4JHP!xS7Y3AJ>Sy65^yqlCV7s<%aH1#1){&Th%NlV1orA;1 z@Y^CEc0qT8ul-Mqi%eL-3JE3(iNhTuW(o>GLBWf>W{$QC;S&V(dgJVi)x+NU-D7UU z7C)(2jWfae<#A6q1IVtn1N=IcmvULcCCuO^kI6;chE)7{jwJngd|atzSe1?~_d|J) zaQt@8mZ8f0$05YFW}9eQw^#-!=?F;HtIUjh0e|Kxx${*!S*l#!t*ww5Kjm=x5(~0W^fvB>OKJAtUbRD(V>AAzKOB7SJI>)& zprm?fSi$uxkZCP_^Uk-7h#-Mdfc;oL7m$dFmA-ECGDsvty*@v4zG{>Bz7V7a_Y(fm z;J-QV{0#RRib`r4$aVgWvaKCkj>ew~iB_!ORj5@Caf}>yRfp5~&XqNke5?t`MlOz( zld<|ra4s;;MzCiRW+N`dAQCyPWs?CM{e?0D&!OzV%qJ5wT}9^V?#+IDTN@2>eRFfH zc%g}es@Kh2Mukg_p4yI%bY=Fdql00C%0euFh-o>SUN!LVZ6_3E`SlXF20N*Rc{q?t zbFl$Yn*%?mM$w?#Nlia;b*bCN?Mn0vVG|td-HkCTJ#2nU(P~B}Y3Zv5%ep?)b+UbF z`x9@)46WM!ce+ec*FO(BlDdx~GqT{*ol5p)*EIPmRg-&4?#>7j7wOWI4?`n9&F8EH zN8|=Y6a+`i58e0c`@~bR<-V*A(#wZ{Dp1KDrz57rWDWq>i09w_{ps8faSIMXpO_eI Ss_GDRhzgsu^tGGDZ2tm5#$EgX literal 0 HcmV?d00001 diff --git a/json/card_source.json b/json/card_source.json new file mode 100644 index 0000000..5654244 --- /dev/null +++ b/json/card_source.json @@ -0,0 +1,667 @@ +{ + "$schema": "../../../tools/card-layouts/schemas/card-source.schema.json", + "schema": "esc-card-source.v1", + "card": { + "id": "mpabi-inf-c-11-machine-timer", + "series": "c", + "series_title": "C · Freestanding RV32I and K&R", + "number": "11", + "count": "13", + "slug": "machine-timer", + "title": "Machine timer: od mtime do okresowego deadline'u", + "topic": "RV32I/Hazard3: spójny odczyt mtime, mtimecmp i przerwania machine timer", + "project": "Freestanding C na RV32I", + "subject": "Informatyka", + "level": "Rok 1 · C11 · RV32I/Hazard3", + "revision_date": "2026-07-20T00:00:00+02:00", + "status": "Gotowa", + "version": "v00.01", + "uuid": "45f57fde-fc7b-5f41-a3af-f153202dff0f", + "author": "M. Pabiszczak", + "year": "2026" + }, + "generated": { + "tex": "doc/generated/main.tex", + "html": "web/index.html", + "html_css": "web/style.css", + "html_tree_inspector": false, + "react_app": true + }, + "render_dictionary": false, + "template": "templates/karta-klasyczna.json", + "title_block": { + "category": "KARTA PRACY · INFORMATYKA", + "prepared_by": "M. Pabiszczak", + "prepared_on": "2026-07-20T00:00:00+02:00", + "title": "Machine timer: od mtime do okresowego deadline'u", + "url": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54", + "repository_url": "https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer", + "url_host_uuid": "dce7fb9d-7b2f-5d49-96a2-3a30d3070b84", + "url_domain": "mpabi.pl", + "doc_uuid": "f37170be-e988-5f5d-b3cf-6ea179a9cd54", + "revision": "v00.01", + "issued_on": "2026-07-20T00:00:00+02:00", + "series": "C-11", + "document_type": "karta pracy", + "tool": "card-layouts", + "show_qr": true, + "show_repository_qr": true, + "height_cm": 2.6, + "repeat_on_every_page": true, + "replace_front_matter": true + }, + "front_page_break": true, + "front_page_scope": { + "title": "Cel karty", + "content_tex": "Uczeń rozdziela źródło czasu, warunek pending, dwa poziomy enable, wybór handlera i jego efekt. Potrafi spójnie odczytać 64-bitowy licznik na RV32, uruchomić jednorazowe przerwanie oraz utrzymać fazę okresowego zegara przez deadline += period.", + "scope_title": "Zakres i zachowane przykłady", + "scope_content_tex": "Trzy przykłady wykonują się na rzeczywistym modelu RTL Hazard3. Task01 wymusza rollover dolnego słowa mtime. Task02 dowodzi wejścia przez slot 7 wektora, skasowania poziomowego źródła przez przesunięcie mtimecmp i wznowienia po mret. Task03 zapisuje cztery planowane i obserwowane czasy oraz spóźnienia. Host nie jest używany jako substytut urządzenia MMIO i przerwań.\\par\\textbf{Układ każdego przykładu:} pełny profil A1--A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód.", + "scope_table": { + "headers": [ + "Typ", + "Task", + "Idea", + "Waga" + ], + "rows": [ + { + "chapter": "MMIO", + "task": "Task01", + "idea_tex": "RV32 split-register MMIO i high--low--high", + "priority": "kluczowe", + "key": true + }, + { + "chapter": "IRQ", + "task": "Task02", + "idea_tex": "mtimecmp, pending, MTIE/MIE, mtvec, mret i rearm", + "priority": "kluczowe", + "key": true + }, + { + "chapter": "TICK", + "task": "Task03", + "idea_tex": "deadline += period, tick sequence i lateness", + "priority": "kluczowe", + "key": true + } + ] + } + }, + "side_margin_tree_layout": { + "columns": [ + { + "id": "zawodowe", + "label": "TECH", + "side": "left", + "tree": "WE -> EK -> KW", + "description": "Kod C, ABI i obserwacja RV32I." + }, + { + "id": "ogolne", + "label": "OG", + "side": "right", + "tree": "WE -> EN -> KW", + "description": "Przewidywanie, pomiar i wniosek." + } + ] + }, + "learning_effects": { + "C11.EN01": { + "bloom_level": "Analiza", + "label": "Od źródła do efektu ISR", + "text": "Uczeń dla każdego zachowania wskazuje osobno source, pending, enabled, decyzję dispatchera i efekt handlera, zamiast nazywać cały łańcuch jednym słowem timer.", + "assessment_criteria": [ + "C11.KW01" + ] + }, + "C11.EK01": { + "bloom_level": "Zastosowanie", + "label": "Dowód na RTL Hazard3", + "text": "Uczeń buduje obrazy RV32I, uruchamia je z limitem cykli i sprawdza raport MMIO, mcause, liczbę ISR, powrót z pułapki oraz arytmetykę deadline'ów.", + "assessment_criteria": [ + "C11.KW01" + ] + } + }, + "assessment_criteria": { + "C11.KW01": { + "text": "Wszystkie trzy programy kończą się kodem 0 bez nieobsłużonej pułapki i timeoutu. Task01 wykazuje co najmniej dwie próby przez rollover, high=1 i monotoniczny drugi odczyt. Task02 ma dokładnie jeden ISR, mcause=0x80000007, pending=0 przed uzbrojeniem i po obsłudze oraz resume=1. Task03 ma cztery ISR, planowane czasy różniące się dokładnie o 1600, observed >= scheduled, lateness=observed-scheduled i fazowe przesunięcie modelu now+period równe bieżącemu spóźnieniu.", + "learning_effects": [ + "C11.EN01", + "C11.EK01" + ] + } + }, + "educational_requirements": { + "C11.WE01": { + "text": "Obsługa split-register MMIO i machine timer interrupt na RV32I z jawnym kontraktem poziomowego źródła, maskowania i bezwzględnego deadline'u.", + "label": "RV32I/Hazard3: spójny odczyt mtime, mtimecmp i przerwania machine timer", + "learning_effects": [ + "C11.EN01", + "C11.EK01" + ], + "learning_tree": { + "schema": "we-learning-tree.v1", + "policy": "Najpierw przewidywanie, następnie wykonanie i odczyt dowodu.", + "ogolne": [ + { + "effect_ref": "C11.EN01", + "display": "EN C11 01", + "source": "LOCAL", + "official": "C", + "local": "01", + "kind": "EN", + "tree_id": "C11.WE01.OG.LOCAL.C.01", + "text": "Uczeń dla każdego zachowania wskazuje osobno source, pending, enabled, decyzję dispatchera i efekt handlera, zamiast nazywać cały łańcuch jednym słowem timer.", + "kw": [ + { + "criterion_ref": "C11.KW01", + "display": "KW C11 01", + "source": "LOCAL", + "kind": "KW", + "official": "C", + "local": "01", + "text": "Kod, przewidywanie i pomiar tworzą jeden dowód." + } + ] + } + ], + "zawodowe": [ + { + "effect_ref": "C11.EK01", + "display": "EK C11 01", + "source": "LOCAL", + "official": "C", + "local": "01", + "kind": "EK", + "tree_id": "C11.WE01.TECH.LOCAL.C.01", + "text": "Uczeń buduje obrazy RV32I, uruchamia je z limitem cykli i sprawdza raport MMIO, mcause, liczbę ISR, powrót z pułapki oraz arytmetykę deadline'ów.", + "kw": [ + { + "criterion_ref": "C11.KW01", + "display": "KW C11 01", + "source": "LOCAL", + "kind": "KW", + "official": "C", + "local": "01", + "text": "Kod, przewidywanie i pomiar tworzą jeden dowód." + } + ] + } + ] + } + } + }, + "sections": [ + { + "title": "1 — Jeden timer, pięć różnych ról", + "order": 10, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "\\texttt{mtime} jest źródłem rosnącego czasu, a relacja \\texttt{mtime >= mtimecmp} wytwarza poziomowy stan pending. \\texttt{mie.MTIE} dopuszcza tę klasę przerwań lokalnie, \\texttt{mstatus.MIE} dopuszcza przerwania globalnie, a \\texttt{mtvec} wybiera kod według przyczyny. Dopiero handler zmienia stan programu i przesuwa komparator. Żaden z bitów enable nie kasuje źródła.\n\nW testbenchu Hazard3 \\texttt{mtime} rośnie raz na krok, a linia timera jest aktywna tak długo, jak licznik nie jest mniejszy od komparatora. Dlatego powrót bez zapisu przyszłego \\texttt{mtimecmp} wywołałby następną pułapkę niemal natychmiast.", + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_refs": [ + "C11.KW01" + ] + }, + { + "title": "2 — 64 bity urządzenia na 32-bitowym rdzeniu", + "order": 20, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "Dwa odczyty 32-bitowe nie tworzą automatycznie spójnego odczytu 64-bitowego MMIO. Sekwencja high--low--high akceptuje parę dopiero wtedy, gdy oba odczyty high są równe; zmiana high oznacza rollover między transakcjami i wymusza powtórzenie. Przy zapisie komparatora kolejność high=UINT32\\_MAX, low, docelowe high usuwa niebezpieczne okno z przejściowo zbyt małym \\texttt{mtimecmp}.\n\nTask01 zapisuje \\texttt{mtime} tylko po to, aby fixture testbencha deterministycznie doprowadził do rolloveru. Nie jest to obietnica, że licznik czasu będzie zapisywalny w innym SoC.", + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_refs": [ + "C11.KW01" + ] + }, + { + "title": "3 — Okres to oś czasu, nie odstęp od spóźnionego now", + "order": 30, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "Dla periodycznego zegara handler wykonuje \\texttt{deadline += period}. Wtedy planowana sekwencja zachowuje fazę nawet wtedy, gdy wejście do ISR następuje później niż deadline. Reguła \\texttt{now + period} użyta jako jedyny model przenosi aktualne spóźnienie do następnego terminu i tworzy dryf.\n\nKarta mierzy \\texttt{lateness = observed - scheduled}; nie obiecuje stałej wartości opóźnienia. Bieżący RTL i build dają 40 taktów, lecz wynik zależy od magistrali, prologu ISR i punktu próbkowania. Przykład nie definiuje jeszcze polityki nadrabiania wielu całkowicie pominiętych okresów.", + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_refs": [ + "C11.KW01" + ] + }, + { + "title": "Zadania — zachowane przykłady w profilu A1–A8", + "order": 40, + "content_kind": "tasks", + "page_orientation": "portrait", + "task_refs": [ + "task01", + "task02", + "task03" + ], + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_refs": [ + "C11.KW01" + ] + } + ], + "tasks": { + "task01": { + "title": "Spójny odczyt mtime przez rollover", + "uuid": "c33548e4-07c8-599c-9457-8ba457701659", + "prompt_tex": "Wyjaśnij, jaki błędny 64-bitowy wynik może utworzyć pojedyncze low--high podczas rolloveru. Następnie wskaż w raporcie próbę odrzuconą przez high--low--high i rozdziel kod produkcyjnego odczytu od zapisywalnego fixture'u testbencha.", + "criterion": "Oracle Hazard3: retry=1, attempts > 1, value_high=1, monotonic=1, pass=1 i kod wyjścia 0. W bieżącym buildzie okno znaleziono dla offsetu 0x13 i po dwóch próbach; sam offset nie jest kontraktem architektury.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — atomowość C nie jest atomowością MMIO", + "content_tex": "Urządzenie ma 64-bitowy licznik, lecz RV32 wykonuje trzy jawne odczyty 32-bitowych rejestrów. Typ \\texttt{uint64\\_t} służy do złożenia zaakceptowanych połówek; nie zamienia dwóch transakcji magistrali w jeden atomowy odczyt." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — dwa słowa jednego licznika", + "content_tex": "\\texttt{timer\\_hw\\_t} mapuje kolejno \\texttt{mtime}, \\texttt{mtimeh}, \\texttt{mtimecmp} i \\texttt{mtimecmph} od adresu 0xc0000100. \\texttt{volatile} wymusza obserwowalne dostępy C, ale regułę spójności dostarcza dopiero algorytm." + }, + { + "id": "A3", + "status": "unavailable", + "title": "DISPATCH", + "reason": "Task01 ma wyłączone przerwania i wykonuje bezpośredni odczyt MMIO; nie ma ISR, callbacku, tablicy funkcji ani wyboru odbiorcy." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — kontrolowane przejście przez 0xffffffff", + "content_tex": "Fixture ustawia high=0 i low blisko \\texttt{UINT32\\_MAX}, a następnie wyszukuje małe okno, w którym high zmieni się między pierwszym i drugim odczytem. Zaakceptowany wynik musi pochodzić już z epoki high=1; kolejny odczyt nie może być mniejszy." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — read, validate, retry", + "content_tex": "Jedna próba czyta \\texttt{high\\_before}, \\texttt{low}, \\texttt{high\\_after}. Równość high kończy pętlę i pozwala złożyć wynik. Nierówność odrzuca low należące do niejednoznacznej granicy epok i powtarza wszystkie trzy transakcje." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — epoka 0, rollover, epoka 1", + "content_tex": "Stan urządzenia przechodzi z high=0 i low blisko maksimum przez rollover do high=1 i małego low. Pierwsza para high opisuje zmianę stanu, więc nie wolno do niej przypisać jednego snapshotu; druga próba stabilizuje się w epoce 1." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — dwa dostępy high są widocznym dowodem", + "content_tex": "Oracle raportuje offset, liczbę prób, retry, high wyniku i monotoniczność. Bieżący RTL daje offset 0x13 i attempts=2. Listing ma pokazać dwa osobne \\texttt{lw} z rejestru high, rozdzielone odczytem low, oraz gałąź powrotną przy nierówności." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — stabilny snapshot z licznika split-register", + "content_tex": "Wzorzec high--low--high stosuj, gdy dokumentacja urządzenia gwarantuje monotoniczny licznik i zgodne zachowanie połówek. Fixture zapisujący czas pozostaje poza produkcyjnym API odczytu." + } + ], + "flow": [ + { + "kind": "block", + "id": "task01.a1", + "title": "A1 CONTEXT · AKTYWNE — atomowość C nie jest atomowością MMIO", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task01_mtime_consistent_read.c}.\\par Urządzenie ma 64-bitowy licznik, lecz RV32 wykonuje trzy jawne odczyty 32-bitowych rejestrów. Typ \\texttt{uint64\\_t} służy do złożenia zaakceptowanych połówek; nie zamienia dwóch transakcji magistrali w jeden atomowy odczyt." + }, + { + "kind": "block", + "id": "task01.a2", + "title": "A2 STRUCTURE · AKTYWNE — dwa słowa jednego licznika", + "content_tex": "\\texttt{timer\\_hw\\_t} mapuje kolejno \\texttt{mtime}, \\texttt{mtimeh}, \\texttt{mtimecmp} i \\texttt{mtimecmph} od adresu 0xc0000100. \\texttt{volatile} wymusza obserwowalne dostępy C, ale regułę spójności dostarcza dopiero algorytm." + }, + { + "kind": "block", + "id": "task01.a3", + "title": "A3 DISPATCH · N/D", + "content_tex": "\\textbf{N/D.} Task01 ma wyłączone przerwania i wykonuje bezpośredni odczyt MMIO; nie ma ISR, callbacku, tablicy funkcji ani wyboru odbiorcy." + }, + { + "kind": "block", + "id": "task01.a4", + "title": "A4 APPLICATION · AKTYWNE — kontrolowane przejście przez 0xffffffff", + "content_tex": "Fixture ustawia high=0 i low blisko \\texttt{UINT32\\_MAX}, a następnie wyszukuje małe okno, w którym high zmieni się między pierwszym i drugim odczytem. Zaakceptowany wynik musi pochodzić już z epoki high=1; kolejny odczyt nie może być mniejszy." + }, + { + "kind": "block", + "id": "task01.a5", + "title": "A5 FLOW · AKTYWNE — read, validate, retry", + "content_tex": "Jedna próba czyta \\texttt{high\\_before}, \\texttt{low}, \\texttt{high\\_after}. Równość high kończy pętlę i pozwala złożyć wynik. Nierówność odrzuca low należące do niejednoznacznej granicy epok i powtarza wszystkie trzy transakcje." + }, + { + "kind": "block", + "id": "task01.a6", + "title": "A6 STATE · AKTYWNE — epoka 0, rollover, epoka 1", + "content_tex": "Stan urządzenia przechodzi z high=0 i low blisko maksimum przez rollover do high=1 i małego low. Pierwsza para high opisuje zmianę stanu, więc nie wolno do niej przypisać jednego snapshotu; druga próba stabilizuje się w epoce 1." + }, + { + "kind": "block", + "id": "task01.a7", + "title": "A7 RUNTIME · AKTYWNE — dwa dostępy high są widocznym dowodem", + "content_tex": "Oracle raportuje offset, liczbę prób, retry, high wyniku i monotoniczność. Bieżący RTL daje offset 0x13 i attempts=2. Listing ma pokazać dwa osobne \\texttt{lw} z rejestru high, rozdzielone odczytem low, oraz gałąź powrotną przy nierówności." + }, + { + "kind": "block", + "id": "task01.a8", + "title": "A8 PATTERNS · AKTYWNE — stabilny snapshot z licznika split-register", + "content_tex": "Wzorzec high--low--high stosuj, gdy dokumentacja urządzenia gwarantuje monotoniczny licznik i zgodne zachowanie połówek. Fixture zapisujący czas pozostaje poza produkcyjnym API odczytu." + }, + { + "kind": "exercise", + "id": "task01.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Wyjaśnij, jaki błędny 64-bitowy wynik może utworzyć pojedyncze low--high podczas rolloveru. Następnie wskaż w raporcie próbę odrzuconą przez high--low--high i rozdziel kod produkcyjnego odczytu od zapisywalnego fixture'u testbencha.", + "evidence_tex": "Przewidywany błąd na granicy rolloveru, log z RTL Hazard3 z kodem wyjścia i limitem cykli, fragment listingu z dwoma odczytami high oraz wniosek o spójności zaakceptowanego snapshotu.", + "criterion": "Oracle Hazard3: retry=1, attempts > 1, value_high=1, monotonic=1, pass=1 i kod wyjścia 0. W bieżącym buildzie okno znaleziono dla offsetu 0x13 i po dwóch próbach; sam offset nie jest kontraktem architektury." + }, + { + "kind": "block", + "id": "task01.worksheet", + "title": "TASK01 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log wykonania RTL Hazard3 i kod wyjścia}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Dowód w listingu: high--low--high i retry}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_ref": "C11.KW01" + }, + "task02": { + "title": "Jednorazowe przerwanie machine timer", + "uuid": "dc7f8696-19db-55b6-8fd9-cb676b399ec7", + "prompt_tex": "Ułóż w poprawnej kolejności: wyłącz maski, ustaw przyszły mtimecmp, sprawdź pending, włącz MTIE i MIE, czekaj w wfi, przesuń komparator w ISR, wróć przez mret. Dla każdego kroku nazwij source, pending, enable, decyzję dispatchera albo efekt.", + "criterion": "Oracle Hazard3: count=1, mcause=0x80000007, pending_before=0, pending_after=0, resumed=1, deadline_reached=1, pass=1 i kod wyjścia 0. Listing ISR kończy się mret.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — enable nie jest źródłem", + "content_tex": "Źródłem jest relacja \\texttt{mtime >= mtimecmp}; \\texttt{mip.MTIP} reprezentuje pending. \\texttt{mie.MTIE} i \\texttt{mstatus.MIE} są dwiema bramkami. Program najpierw ustawia przyszły komparator, a dopiero potem otwiera obie bramki." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — wspólny driver i stan dowodowy", + "content_tex": "Wspólny nagłówek zawiera dostęp MMIO, bezpieczny zapis komparatora i operacje CSR. Task przechowuje osobno deadline, czas zaobserwowany, mcause, liczbę ISR, pending przed i po oraz znacznik wznowienia." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — przyczyna 7 wybiera handler timera", + "content_tex": "Startup zapisuje do \\texttt{mtvec} adres tablicy z bitem trybu vectored. Machine timer ma cause=7, więc rdzeń wybiera slot 7, którego skok wiąże się z silnym symbolem \\texttt{isr\\_machine\\_timer} zamiast słabego handlera domyślnego. Atrybut GCC kończy funkcję instrukcją \\texttt{mret}." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — one-shot z jawnym kryterium zakończenia", + "content_tex": "Main planuje deadline 1200 taktów po spójnym odczycie. Sukces wymaga dokładnie jednego wejścia, poprawnego mcause, obserwacji nie wcześniejszej niż deadline, skasowanego pending po rearmie i wykonania instrukcji po \\texttt{wfi}." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — source → pending → enable → handler → effect", + "content_tex": "Rosnące mtime osiąga comparator i ustawia pending. Otwarty MTIE oraz MIE pozwalają wejść do wektora. Handler zapisuje obserwację i mcause, przesuwa comparator na \\texttt{UINT64\\_MAX}, publikuje count, a \\texttt{mret} przywraca przerwany przepływ. Main ustawia resumed i zamyka maski." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — DISARMED, ARMED, PENDING, HANDLED, RESUMED", + "content_tex": "Komparator maksimum reprezentuje DISARMED. Przyszły deadline tworzy ARMED. Po osiągnięciu terminu urządzenie jest PENDING, handler ponownie zapisuje maksimum i publikuje HANDLED, a kod po pętli \\texttt{wfi} potwierdza RESUMED." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — mcause, mip i mret", + "content_tex": "Raport z RTL ma: count=1, mcause=0x80000007, pending 0/0, resumed=1 i deadline\\_reached=1. Objdump ma pokazać zapis trzech połówek mtimecmp w handlerze oraz końcowe \\texttt{mret}; zwykłe \\texttt{ret} nie byłoby poprawnym powrotem z pułapki." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — arm before unmask, clear source before publish", + "content_tex": "Najpierw ustaw bezpieczny stan urządzenia, potem włącz źródło w \\texttt{mie}, na końcu globalne MIE. W ISR usuń poziomowe źródło przed opublikowaniem zakończenia; inaczej powrót może natychmiast wejść ponownie." + } + ], + "flow": [ + { + "kind": "block", + "id": "task02.a1", + "title": "A1 CONTEXT · AKTYWNE — enable nie jest źródłem", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task02_oneshot_timer_irq.c}.\\par Źródłem jest relacja \\texttt{mtime >= mtimecmp}; \\texttt{mip.MTIP} reprezentuje pending. \\texttt{mie.MTIE} i \\texttt{mstatus.MIE} są dwiema bramkami. Program najpierw ustawia przyszły komparator, a dopiero potem otwiera obie bramki." + }, + { + "kind": "block", + "id": "task02.a2", + "title": "A2 STRUCTURE · AKTYWNE — wspólny driver i stan dowodowy", + "content_tex": "Wspólny nagłówek zawiera dostęp MMIO, bezpieczny zapis komparatora i operacje CSR. Task przechowuje osobno deadline, czas zaobserwowany, mcause, liczbę ISR, pending przed i po oraz znacznik wznowienia." + }, + { + "kind": "block", + "id": "task02.a3", + "title": "A3 DISPATCH · AKTYWNE — przyczyna 7 wybiera handler timera", + "content_tex": "Startup zapisuje do \\texttt{mtvec} adres tablicy z bitem trybu vectored. Machine timer ma cause=7, więc rdzeń wybiera slot 7, którego skok wiąże się z silnym symbolem \\texttt{isr\\_machine\\_timer} zamiast słabego handlera domyślnego. Atrybut GCC kończy funkcję instrukcją \\texttt{mret}." + }, + { + "kind": "block", + "id": "task02.a4", + "title": "A4 APPLICATION · AKTYWNE — one-shot z jawnym kryterium zakończenia", + "content_tex": "Main planuje deadline 1200 taktów po spójnym odczycie. Sukces wymaga dokładnie jednego wejścia, poprawnego mcause, obserwacji nie wcześniejszej niż deadline, skasowanego pending po rearmie i wykonania instrukcji po \\texttt{wfi}." + }, + { + "kind": "block", + "id": "task02.a5", + "title": "A5 FLOW · AKTYWNE — source → pending → enable → handler → effect", + "content_tex": "Rosnące mtime osiąga comparator i ustawia pending. Otwarty MTIE oraz MIE pozwalają wejść do wektora. Handler zapisuje obserwację i mcause, przesuwa comparator na \\texttt{UINT64\\_MAX}, publikuje count, a \\texttt{mret} przywraca przerwany przepływ. Main ustawia resumed i zamyka maski." + }, + { + "kind": "block", + "id": "task02.a6", + "title": "A6 STATE · AKTYWNE — DISARMED, ARMED, PENDING, HANDLED, RESUMED", + "content_tex": "Komparator maksimum reprezentuje DISARMED. Przyszły deadline tworzy ARMED. Po osiągnięciu terminu urządzenie jest PENDING, handler ponownie zapisuje maksimum i publikuje HANDLED, a kod po pętli \\texttt{wfi} potwierdza RESUMED." + }, + { + "kind": "block", + "id": "task02.a7", + "title": "A7 RUNTIME · AKTYWNE — mcause, mip i mret", + "content_tex": "Raport z RTL ma: count=1, mcause=0x80000007, pending 0/0, resumed=1 i deadline\\_reached=1. Objdump ma pokazać zapis trzech połówek mtimecmp w handlerze oraz końcowe \\texttt{mret}; zwykłe \\texttt{ret} nie byłoby poprawnym powrotem z pułapki." + }, + { + "kind": "block", + "id": "task02.a8", + "title": "A8 PATTERNS · AKTYWNE — arm before unmask, clear source before publish", + "content_tex": "Najpierw ustaw bezpieczny stan urządzenia, potem włącz źródło w \\texttt{mie}, na końcu globalne MIE. W ISR usuń poziomowe źródło przed opublikowaniem zakończenia; inaczej powrót może natychmiast wejść ponownie." + }, + { + "kind": "exercise", + "id": "task02.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Ułóż w poprawnej kolejności: wyłącz maski, ustaw przyszły mtimecmp, sprawdź pending, włącz MTIE i MIE, czekaj w wfi, przesuń komparator w ISR, wróć przez mret. Dla każdego kroku nazwij source, pending, enable, decyzję dispatchera albo efekt.", + "evidence_tex": "Przewidywana sekwencja source--pending--enable--dispatch--effect, log RTL Hazard3 z mcause i kodem wyjścia, fragment listingu z wektorem oraz mret i wniosek o skasowaniu poziomowego źródła.", + "criterion": "Oracle Hazard3: count=1, mcause=0x80000007, pending_before=0, pending_after=0, resumed=1, deadline_reached=1, pass=1 i kod wyjścia 0. Listing ISR kończy się mret." + }, + { + "kind": "block", + "id": "task02.worksheet", + "title": "TASK02 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log wykonania RTL: mcause, pending i resume}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Dowód w CSR i listingu: slot 7 oraz mret}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_ref": "C11.KW01" + }, + "task03": { + "title": "Okresowe deadline'y bez dryfu fazy", + "uuid": "6c330959-1a78-5068-8c59-6b18f712122c", + "prompt_tex": "Dla czterech ticków porównaj scheduled, observed i lateness. Udowodnij stały krok 1600 oraz wyprowadź, o ile przesunąłby następną fazę model now+period. Wyjaśnij granicę: przykład nie nadrabia dowolnej liczby całkowicie pominiętych okresów.", + "criterion": "Oracle Hazard3: count=causes=4, period=1600, step_ok=ordered=late_math=naive_shift_ok=pass=1. Bieżący pomiar daje cztery lateness po 40 taktów, ale test nie uznaje liczby 40 za kontrakt sprzętowy.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — harmonogram i wykonanie to dwie osie", + "content_tex": "Scheduled opisuje idealną oś czasu usługi, observed chwilę rzeczywistego wejścia do pomiaru w ISR, a lateness ich różnicę. Okres ma aktualizować harmonogram, nie kopiować opóźnienia wykonania do przyszłej fazy." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — cztery rekordy ticków", + "content_tex": "Trzy tablice po cztery elementy zapisują deadline, obserwację i lateness. \\texttt{g\\_task03\\_next\\_deadline} jest stanem planisty, a count publikuje liczbę kompletnych rekordów. Stała period wynosi 1600 taktów modelu." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — każdy MTIP trafia przez slot 7", + "content_tex": "Dla każdego z czterech terminów rdzeń koduje interrupt bit i cause=7 w mcause, a tryb vectored wybiera ten sam \\texttt{isr\\_machine\\_timer}. Handler sprawdza mcause przy każdym wejściu; licznik causes=4 dowodzi czterech decyzji dispatchera." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — stała faza i zmierzone spóźnienie", + "content_tex": "Dla i>0 musi zachodzić \\texttt{scheduled[i]-scheduled[i-1]=1600}. Dla każdego rekordu observed nie może być wcześniejsze od scheduled, a lateness musi być dokładnie ich różnicą. Po czwartym ticku comparator wraca do maksimum." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — sample, record, advance, rearm, publish", + "content_tex": "ISR najpierw pobiera indeks i aktualny deadline, potem czyta czas oraz zapisuje rekord. Następnie oblicza deadline+period, uzbraja ten bezwzględny termin albo rozbraja po ostatnim ticku, a count publikuje dopiero na końcu. Main czeka w \\texttt{wfi} do czterech rekordów." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — TICK0 → TICK4 i niezmienna faza", + "content_tex": "Stan count przechodzi 0,1,2,3,4; razem z każdym przejściem next\\_deadline rośnie dokładnie o period. Po count=4 urządzenie jest DISARMED. Tablice pozostają historią czterech zakończonych przejść i są analizowane dopiero po zamknięciu masek." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — cztery terminy i 40 taktów bieżącego RTL", + "content_tex": "Bieżący raport podaje deadline low 0x96b, 0xfab, 0x15eb, 0x1c2b; obserwacje są o 0x28 późniejsze. Ważne są relacje step\\_ok, ordered i late\\_math, ponieważ absolutne wartości oraz 40 taktów mogą się zmienić po zmianie RTL, optymalizacji lub prologu ISR." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — absolute periodic deadline", + "content_tex": "\\texttt{deadline += period} zachowuje fazę. Gdyby następny termin powstał wyłącznie jako \\texttt{observed + period}, jego przesunięcie względem osi absolutnej byłoby równe bieżącemu lateness; powtarzanie tej reguły kumuluje dryf. Osobna polityka musi zdecydować, czy po dużym opóźnieniu nadrabiać, pomijać, czy zgłaszać błąd." + } + ], + "flow": [ + { + "kind": "block", + "id": "task03.a1", + "title": "A1 CONTEXT · AKTYWNE — harmonogram i wykonanie to dwie osie", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task03_periodic_absolute_deadline.c}.\\par Scheduled opisuje idealną oś czasu usługi, observed chwilę rzeczywistego wejścia do pomiaru w ISR, a lateness ich różnicę. Okres ma aktualizować harmonogram, nie kopiować opóźnienia wykonania do przyszłej fazy." + }, + { + "kind": "block", + "id": "task03.a2", + "title": "A2 STRUCTURE · AKTYWNE — cztery rekordy ticków", + "content_tex": "Trzy tablice po cztery elementy zapisują deadline, obserwację i lateness. \\texttt{g\\_task03\\_next\\_deadline} jest stanem planisty, a count publikuje liczbę kompletnych rekordów. Stała period wynosi 1600 taktów modelu." + }, + { + "kind": "block", + "id": "task03.a3", + "title": "A3 DISPATCH · AKTYWNE — każdy MTIP trafia przez slot 7", + "content_tex": "Dla każdego z czterech terminów rdzeń koduje interrupt bit i cause=7 w mcause, a tryb vectored wybiera ten sam \\texttt{isr\\_machine\\_timer}. Handler sprawdza mcause przy każdym wejściu; licznik causes=4 dowodzi czterech decyzji dispatchera." + }, + { + "kind": "block", + "id": "task03.a4", + "title": "A4 APPLICATION · AKTYWNE — stała faza i zmierzone spóźnienie", + "content_tex": "Dla i>0 musi zachodzić \\texttt{scheduled[i]-scheduled[i-1]=1600}. Dla każdego rekordu observed nie może być wcześniejsze od scheduled, a lateness musi być dokładnie ich różnicą. Po czwartym ticku comparator wraca do maksimum." + }, + { + "kind": "block", + "id": "task03.a5", + "title": "A5 FLOW · AKTYWNE — sample, record, advance, rearm, publish", + "content_tex": "ISR najpierw pobiera indeks i aktualny deadline, potem czyta czas oraz zapisuje rekord. Następnie oblicza deadline+period, uzbraja ten bezwzględny termin albo rozbraja po ostatnim ticku, a count publikuje dopiero na końcu. Main czeka w \\texttt{wfi} do czterech rekordów." + }, + { + "kind": "block", + "id": "task03.a6", + "title": "A6 STATE · AKTYWNE — TICK0 → TICK4 i niezmienna faza", + "content_tex": "Stan count przechodzi 0,1,2,3,4; razem z każdym przejściem next\\_deadline rośnie dokładnie o period. Po count=4 urządzenie jest DISARMED. Tablice pozostają historią czterech zakończonych przejść i są analizowane dopiero po zamknięciu masek." + }, + { + "kind": "block", + "id": "task03.a7", + "title": "A7 RUNTIME · AKTYWNE — cztery terminy i 40 taktów bieżącego RTL", + "content_tex": "Bieżący raport podaje deadline low 0x96b, 0xfab, 0x15eb, 0x1c2b; obserwacje są o 0x28 późniejsze. Ważne są relacje step\\_ok, ordered i late\\_math, ponieważ absolutne wartości oraz 40 taktów mogą się zmienić po zmianie RTL, optymalizacji lub prologu ISR." + }, + { + "kind": "block", + "id": "task03.a8", + "title": "A8 PATTERNS · AKTYWNE — absolute periodic deadline", + "content_tex": "\\texttt{deadline += period} zachowuje fazę. Gdyby następny termin powstał wyłącznie jako \\texttt{observed + period}, jego przesunięcie względem osi absolutnej byłoby równe bieżącemu lateness; powtarzanie tej reguły kumuluje dryf. Osobna polityka musi zdecydować, czy po dużym opóźnieniu nadrabiać, pomijać, czy zgłaszać błąd." + }, + { + "kind": "exercise", + "id": "task03.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Dla czterech ticków porównaj scheduled, observed i lateness. Udowodnij stały krok 1600 oraz wyprowadź, o ile przesunąłby następną fazę model now+period. Wyjaśnij granicę: przykład nie nadrabia dowolnej liczby całkowicie pominiętych okresów.", + "evidence_tex": "Przewidywana sekwencja czterech deadline'ów, log RTL Hazard3 z planowanymi i obserwowanymi czasami, kontrola różnic i kodu wyjścia oraz wniosek porównujący deadline+period z now+period.", + "criterion": "Oracle Hazard3: count=causes=4, period=1600, step_ok=ordered=late_math=naive_shift_ok=pass=1. Bieżący pomiar daje cztery lateness po 40 taktów, ale test nie uznaje liczby 40 za kontrakt sprzętowy." + }, + { + "kind": "block", + "id": "task03.worksheet", + "title": "TASK03 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log RTL: deadline, observed i lateness}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Dowód stałego kroku i braku dryfu fazy}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C11.WE01" + ], + "learning_effect_refs": [ + "C11.EN01", + "C11.EK01" + ], + "assessment_criterion_ref": "C11.KW01" + } + }, + "tasks_order": [ + "task01", + "task02", + "task03" + ] +} diff --git a/json/card_spec.json b/json/card_spec.json new file mode 100644 index 0000000..4397ff7 --- /dev/null +++ b/json/card_spec.json @@ -0,0 +1,233 @@ +{ + "card": { + "number": "11", + "slug": "machine-timer", + "title": "Machine timer: od mtime do okresowego deadline'u", + "topic": "RV32I/Hazard3: spójny odczyt mtime, mtimecmp i przerwania machine timer", + "status": "Gotowa", + "version": "v00.01", + "revision_date": "2026-07-20T00:00:00+02:00", + "level": "Rok 1 · C11 · RV32I/Hazard3" + }, + "front": { + "goal": "Uczeń rozdziela źródło czasu, warunek pending, dwa poziomy enable, wybór handlera i jego efekt. Potrafi spójnie odczytać 64-bitowy licznik na RV32, uruchomić jednorazowe przerwanie oraz utrzymać fazę okresowego zegara przez deadline += period.", + "scope": "Trzy przykłady wykonują się na rzeczywistym modelu RTL Hazard3. Task01 wymusza rollover dolnego słowa mtime. Task02 dowodzi wejścia przez slot 7 wektora, skasowania poziomowego źródła przez przesunięcie mtimecmp i wznowienia po mret. Task03 zapisuje cztery planowane i obserwowane czasy oraz spóźnienia. Host nie jest używany jako substytut urządzenia MMIO i przerwań." + }, + "scope_headers": ["Typ", "Task", "Idea", "Waga"], + "learning": { + "reasoning_label": "Od źródła do efektu ISR", + "reasoning": "Uczeń dla każdego zachowania wskazuje osobno source, pending, enabled, decyzję dispatchera i efekt handlera, zamiast nazywać cały łańcuch jednym słowem timer.", + "practice_label": "Dowód na RTL Hazard3", + "practice": "Uczeń buduje obrazy RV32I, uruchamia je z limitem cykli i sprawdza raport MMIO, mcause, liczbę ISR, powrót z pułapki oraz arytmetykę deadline'ów.", + "criterion": "Wszystkie trzy programy kończą się kodem 0 bez nieobsłużonej pułapki i timeoutu. Task01 wykazuje co najmniej dwie próby przez rollover, high=1 i monotoniczny drugi odczyt. Task02 ma dokładnie jeden ISR, mcause=0x80000007, pending=0 przed uzbrojeniem i po obsłudze oraz resume=1. Task03 ma cztery ISR, planowane czasy różniące się dokładnie o 1600, observed >= scheduled, lateness=observed-scheduled i fazowe przesunięcie modelu now+period równe bieżącemu spóźnieniu.", + "requirement": "Obsługa split-register MMIO i machine timer interrupt na RV32I z jawnym kontraktem poziomowego źródła, maskowania i bezwzględnego deadline'u." + }, + "sections": [ + { + "title": "1 — Jeden timer, pięć różnych ról", + "content_tex": "\u005ctexttt{mtime} jest źródłem rosnącego czasu, a relacja \u005ctexttt{mtime >= mtimecmp} wytwarza poziomowy stan pending. \u005ctexttt{mie.MTIE} dopuszcza tę klasę przerwań lokalnie, \u005ctexttt{mstatus.MIE} dopuszcza przerwania globalnie, a \u005ctexttt{mtvec} wybiera kod według przyczyny. Dopiero handler zmienia stan programu i przesuwa komparator. Żaden z bitów enable nie kasuje źródła.\n\nW testbenchu Hazard3 \u005ctexttt{mtime} rośnie raz na krok, a linia timera jest aktywna tak długo, jak licznik nie jest mniejszy od komparatora. Dlatego powrót bez zapisu przyszłego \u005ctexttt{mtimecmp} wywołałby następną pułapkę niemal natychmiast." + }, + { + "title": "2 — 64 bity urządzenia na 32-bitowym rdzeniu", + "content_tex": "Dwa odczyty 32-bitowe nie tworzą automatycznie spójnego odczytu 64-bitowego MMIO. Sekwencja high--low--high akceptuje parę dopiero wtedy, gdy oba odczyty high są równe; zmiana high oznacza rollover między transakcjami i wymusza powtórzenie. Przy zapisie komparatora kolejność high=UINT32\\_MAX, low, docelowe high usuwa niebezpieczne okno z przejściowo zbyt małym \u005ctexttt{mtimecmp}.\n\nTask01 zapisuje \u005ctexttt{mtime} tylko po to, aby fixture testbencha deterministycznie doprowadził do rolloveru. Nie jest to obietnica, że licznik czasu będzie zapisywalny w innym SoC." + }, + { + "title": "3 — Okres to oś czasu, nie odstęp od spóźnionego now", + "content_tex": "Dla periodycznego zegara handler wykonuje \u005ctexttt{deadline += period}. Wtedy planowana sekwencja zachowuje fazę nawet wtedy, gdy wejście do ISR następuje później niż deadline. Reguła \u005ctexttt{now + period} użyta jako jedyny model przenosi aktualne spóźnienie do następnego terminu i tworzy dryf.\n\nKarta mierzy \u005ctexttt{lateness = observed - scheduled}; nie obiecuje stałej wartości opóźnienia. Bieżący RTL i build dają 40 taktów, lecz wynik zależy od magistrali, prologu ISR i punktu próbkowania. Przykład nie definiuje jeszcze polityki nadrabiania wielu całkowicie pominiętych okresów." + } + ], + "tasks": [ + { + "id": "task01", + "source": "src/tasks/task01_mtime_consistent_read.c", + "chapter": "MMIO", + "title": "Spójny odczyt mtime przez rollover", + "idea_tex": "RV32 split-register MMIO i high--low--high", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Wyjaśnij, jaki błędny 64-bitowy wynik może utworzyć pojedyncze low--high podczas rolloveru. Następnie wskaż w raporcie próbę odrzuconą przez high--low--high i rozdziel kod produkcyjnego odczytu od zapisywalnego fixture'u testbencha.", + "evidence_tex": "Przewidywany błąd na granicy rolloveru, log z RTL Hazard3 z kodem wyjścia i limitem cykli, fragment listingu z dwoma odczytami high oraz wniosek o spójności zaakceptowanego snapshotu.", + "worksheet_step2": "Log wykonania RTL Hazard3 i kod wyjścia", + "worksheet_step3": "Dowód w listingu: high--low--high i retry", + "criterion": "Oracle Hazard3: retry=1, attempts > 1, value_high=1, monotonic=1, pass=1 i kod wyjścia 0. W bieżącym buildzie okno znaleziono dla offsetu 0x13 i po dwóch próbach; sam offset nie jest kontraktem architektury.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — atomowość C nie jest atomowością MMIO", + "content_tex": "Urządzenie ma 64-bitowy licznik, lecz RV32 wykonuje trzy jawne odczyty 32-bitowych rejestrów. Typ \u005ctexttt{uint64\\_t} służy do złożenia zaakceptowanych połówek; nie zamienia dwóch transakcji magistrali w jeden atomowy odczyt." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — dwa słowa jednego licznika", + "content_tex": "\u005ctexttt{timer\\_hw\\_t} mapuje kolejno \u005ctexttt{mtime}, \u005ctexttt{mtimeh}, \u005ctexttt{mtimecmp} i \u005ctexttt{mtimecmph} od adresu 0xc0000100. \u005ctexttt{volatile} wymusza obserwowalne dostępy C, ale regułę spójności dostarcza dopiero algorytm." + }, + { + "id": "A3", + "status": "unavailable", + "title": "DISPATCH", + "reason": "Task01 ma wyłączone przerwania i wykonuje bezpośredni odczyt MMIO; nie ma ISR, callbacku, tablicy funkcji ani wyboru odbiorcy." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — kontrolowane przejście przez 0xffffffff", + "content_tex": "Fixture ustawia high=0 i low blisko \u005ctexttt{UINT32\\_MAX}, a następnie wyszukuje małe okno, w którym high zmieni się między pierwszym i drugim odczytem. Zaakceptowany wynik musi pochodzić już z epoki high=1; kolejny odczyt nie może być mniejszy." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — read, validate, retry", + "content_tex": "Jedna próba czyta \u005ctexttt{high\\_before}, \u005ctexttt{low}, \u005ctexttt{high\\_after}. Równość high kończy pętlę i pozwala złożyć wynik. Nierówność odrzuca low należące do niejednoznacznej granicy epok i powtarza wszystkie trzy transakcje." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — epoka 0, rollover, epoka 1", + "content_tex": "Stan urządzenia przechodzi z high=0 i low blisko maksimum przez rollover do high=1 i małego low. Pierwsza para high opisuje zmianę stanu, więc nie wolno do niej przypisać jednego snapshotu; druga próba stabilizuje się w epoce 1." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — dwa dostępy high są widocznym dowodem", + "content_tex": "Oracle raportuje offset, liczbę prób, retry, high wyniku i monotoniczność. Bieżący RTL daje offset 0x13 i attempts=2. Listing ma pokazać dwa osobne \u005ctexttt{lw} z rejestru high, rozdzielone odczytem low, oraz gałąź powrotną przy nierówności." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — stabilny snapshot z licznika split-register", + "content_tex": "Wzorzec high--low--high stosuj, gdy dokumentacja urządzenia gwarantuje monotoniczny licznik i zgodne zachowanie połówek. Fixture zapisujący czas pozostaje poza produkcyjnym API odczytu." + } + ] + }, + { + "id": "task02", + "source": "src/tasks/task02_oneshot_timer_irq.c", + "chapter": "IRQ", + "title": "Jednorazowe przerwanie machine timer", + "idea_tex": "mtimecmp, pending, MTIE/MIE, mtvec, mret i rearm", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Ułóż w poprawnej kolejności: wyłącz maski, ustaw przyszły mtimecmp, sprawdź pending, włącz MTIE i MIE, czekaj w wfi, przesuń komparator w ISR, wróć przez mret. Dla każdego kroku nazwij source, pending, enable, decyzję dispatchera albo efekt.", + "evidence_tex": "Przewidywana sekwencja source--pending--enable--dispatch--effect, log RTL Hazard3 z mcause i kodem wyjścia, fragment listingu z wektorem oraz mret i wniosek o skasowaniu poziomowego źródła.", + "worksheet_step2": "Log wykonania RTL: mcause, pending i resume", + "worksheet_step3": "Dowód w CSR i listingu: slot 7 oraz mret", + "criterion": "Oracle Hazard3: count=1, mcause=0x80000007, pending_before=0, pending_after=0, resumed=1, deadline_reached=1, pass=1 i kod wyjścia 0. Listing ISR kończy się mret.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — enable nie jest źródłem", + "content_tex": "Źródłem jest relacja \u005ctexttt{mtime >= mtimecmp}; \u005ctexttt{mip.MTIP} reprezentuje pending. \u005ctexttt{mie.MTIE} i \u005ctexttt{mstatus.MIE} są dwiema bramkami. Program najpierw ustawia przyszły komparator, a dopiero potem otwiera obie bramki." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — wspólny driver i stan dowodowy", + "content_tex": "Wspólny nagłówek zawiera dostęp MMIO, bezpieczny zapis komparatora i operacje CSR. Task przechowuje osobno deadline, czas zaobserwowany, mcause, liczbę ISR, pending przed i po oraz znacznik wznowienia." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — przyczyna 7 wybiera handler timera", + "content_tex": "Startup zapisuje do \u005ctexttt{mtvec} adres tablicy z bitem trybu vectored. Machine timer ma cause=7, więc rdzeń wybiera slot 7, którego skok wiąże się z silnym symbolem \u005ctexttt{isr\\_machine\\_timer} zamiast słabego handlera domyślnego. Atrybut GCC kończy funkcję instrukcją \u005ctexttt{mret}." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — one-shot z jawnym kryterium zakończenia", + "content_tex": "Main planuje deadline 1200 taktów po spójnym odczycie. Sukces wymaga dokładnie jednego wejścia, poprawnego mcause, obserwacji nie wcześniejszej niż deadline, skasowanego pending po rearmie i wykonania instrukcji po \u005ctexttt{wfi}." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — source → pending → enable → handler → effect", + "content_tex": "Rosnące mtime osiąga comparator i ustawia pending. Otwarty MTIE oraz MIE pozwalają wejść do wektora. Handler zapisuje obserwację i mcause, przesuwa comparator na \u005ctexttt{UINT64\\_MAX}, publikuje count, a \u005ctexttt{mret} przywraca przerwany przepływ. Main ustawia resumed i zamyka maski." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — DISARMED, ARMED, PENDING, HANDLED, RESUMED", + "content_tex": "Komparator maksimum reprezentuje DISARMED. Przyszły deadline tworzy ARMED. Po osiągnięciu terminu urządzenie jest PENDING, handler ponownie zapisuje maksimum i publikuje HANDLED, a kod po pętli \u005ctexttt{wfi} potwierdza RESUMED." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — mcause, mip i mret", + "content_tex": "Raport z RTL ma: count=1, mcause=0x80000007, pending 0/0, resumed=1 i deadline\\_reached=1. Objdump ma pokazać zapis trzech połówek mtimecmp w handlerze oraz końcowe \u005ctexttt{mret}; zwykłe \u005ctexttt{ret} nie byłoby poprawnym powrotem z pułapki." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — arm before unmask, clear source before publish", + "content_tex": "Najpierw ustaw bezpieczny stan urządzenia, potem włącz źródło w \u005ctexttt{mie}, na końcu globalne MIE. W ISR usuń poziomowe źródło przed opublikowaniem zakończenia; inaczej powrót może natychmiast wejść ponownie." + } + ] + }, + { + "id": "task03", + "source": "src/tasks/task03_periodic_absolute_deadline.c", + "chapter": "TICK", + "title": "Okresowe deadline'y bez dryfu fazy", + "idea_tex": "deadline += period, tick sequence i lateness", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Dla czterech ticków porównaj scheduled, observed i lateness. Udowodnij stały krok 1600 oraz wyprowadź, o ile przesunąłby następną fazę model now+period. Wyjaśnij granicę: przykład nie nadrabia dowolnej liczby całkowicie pominiętych okresów.", + "evidence_tex": "Przewidywana sekwencja czterech deadline'ów, log RTL Hazard3 z planowanymi i obserwowanymi czasami, kontrola różnic i kodu wyjścia oraz wniosek porównujący deadline+period z now+period.", + "worksheet_step2": "Log RTL: deadline, observed i lateness", + "worksheet_step3": "Dowód stałego kroku i braku dryfu fazy", + "criterion": "Oracle Hazard3: count=causes=4, period=1600, step_ok=ordered=late_math=naive_shift_ok=pass=1. Bieżący pomiar daje cztery lateness po 40 taktów, ale test nie uznaje liczby 40 za kontrakt sprzętowy.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — harmonogram i wykonanie to dwie osie", + "content_tex": "Scheduled opisuje idealną oś czasu usługi, observed chwilę rzeczywistego wejścia do pomiaru w ISR, a lateness ich różnicę. Okres ma aktualizować harmonogram, nie kopiować opóźnienia wykonania do przyszłej fazy." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — cztery rekordy ticków", + "content_tex": "Trzy tablice po cztery elementy zapisują deadline, obserwację i lateness. \u005ctexttt{g\\_task03\\_next\\_deadline} jest stanem planisty, a count publikuje liczbę kompletnych rekordów. Stała period wynosi 1600 taktów modelu." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — każdy MTIP trafia przez slot 7", + "content_tex": "Dla każdego z czterech terminów rdzeń koduje interrupt bit i cause=7 w mcause, a tryb vectored wybiera ten sam \u005ctexttt{isr\\_machine\\_timer}. Handler sprawdza mcause przy każdym wejściu; licznik causes=4 dowodzi czterech decyzji dispatchera." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — stała faza i zmierzone spóźnienie", + "content_tex": "Dla i>0 musi zachodzić \u005ctexttt{scheduled[i]-scheduled[i-1]=1600}. Dla każdego rekordu observed nie może być wcześniejsze od scheduled, a lateness musi być dokładnie ich różnicą. Po czwartym ticku comparator wraca do maksimum." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — sample, record, advance, rearm, publish", + "content_tex": "ISR najpierw pobiera indeks i aktualny deadline, potem czyta czas oraz zapisuje rekord. Następnie oblicza deadline+period, uzbraja ten bezwzględny termin albo rozbraja po ostatnim ticku, a count publikuje dopiero na końcu. Main czeka w \u005ctexttt{wfi} do czterech rekordów." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — TICK0 → TICK4 i niezmienna faza", + "content_tex": "Stan count przechodzi 0,1,2,3,4; razem z każdym przejściem next\\_deadline rośnie dokładnie o period. Po count=4 urządzenie jest DISARMED. Tablice pozostają historią czterech zakończonych przejść i są analizowane dopiero po zamknięciu masek." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — cztery terminy i 40 taktów bieżącego RTL", + "content_tex": "Bieżący raport podaje deadline low 0x96b, 0xfab, 0x15eb, 0x1c2b; obserwacje są o 0x28 późniejsze. Ważne są relacje step\\_ok, ordered i late\\_math, ponieważ absolutne wartości oraz 40 taktów mogą się zmienić po zmianie RTL, optymalizacji lub prologu ISR." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — absolute periodic deadline", + "content_tex": "\u005ctexttt{deadline += period} zachowuje fazę. Gdyby następny termin powstał wyłącznie jako \u005ctexttt{observed + period}, jego przesunięcie względem osi absolutnej byłoby równe bieżącemu lateness; powtarzanie tej reguły kumuluje dryf. Osobna polityka musi zdecydować, czy po dużym opóźnieniu nadrabiać, pomijać, czy zgłaszać błąd." + } + ] + } + ] +} diff --git a/scripts/render_card_layouts.sh b/scripts/render_card_layouts.sh new file mode 100755 index 0000000..e8f3248 --- /dev/null +++ b/scripts/render_card_layouts.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH= cd "$(dirname "$0")" && pwd) +repo_root=$(CDPATH= cd "$script_dir/.." && pwd) +layouts_root=$repo_root/../../../tools/card-layouts + +python3 "$layouts_root/tools/build_kr_c_card.py" "$repo_root" +exec python3 "$layouts_root/tools/render_card.py" "$repo_root" "$@" + diff --git a/scripts/render_new_pdf.sh b/scripts/render_new_pdf.sh new file mode 100755 index 0000000..731d149 --- /dev/null +++ b/scripts/render_new_pdf.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH= cd "$(dirname "$0")" && pwd) +repo_root=$(CDPATH= cd "$script_dir/.." && pwd) +layouts_root=$repo_root/../../../tools/card-layouts + +if git -C "$repo_root" rev-parse --verify HEAD >/dev/null 2>&1; then + exec "$layouts_root/tools/render_card_pdf_preserving.sh" "$repo_root" +fi + +GITEA_SHA=0000000000000000000000000000000000000000 \ + exec "$layouts_root/tools/render_card_pdf_preserving.sh" "$repo_root" + diff --git a/src/tasks/machine_timer.h b/src/tasks/machine_timer.h new file mode 100644 index 0000000..e0b2177 --- /dev/null +++ b/src/tasks/machine_timer.h @@ -0,0 +1,85 @@ +#ifndef MACHINE_TIMER_H +#define MACHINE_TIMER_H + +#include +#include + +#include "hazard3_csr.h" +#include "tb_cxxrtl_io.h" + +#define MTIP_MASK UINT32_C(0x00000080) +#define MACHINE_TIMER_CAUSE UINT32_C(0x80000007) + +static inline __attribute__((always_inline)) void global_irq_enable(bool enable) +{ + if (enable) { + set_csr(mstatus, UINT32_C(0x8)); + } else { + clear_csr(mstatus, UINT32_C(0x8)); + } +} + +static inline __attribute__((always_inline)) void timer_irq_enable(bool enable) +{ + if (enable) { + set_csr(mie, MTIP_MASK); + } else { + clear_csr(mie, MTIP_MASK); + } +} + +/* + * The Hazard3 teaching testbench maps one 64-bit mtime and one comparator per + * hart as four 32-bit MMIO words at 0xc0000100. On RV32, a C uint64_t load + * is not one atomic device transaction, so the access order is part of the + * driver contract. + */ +static inline __attribute__((always_inline)) uint64_t timer_read64(void) +{ + uint32_t high_before; + uint32_t low; + uint32_t high_after; + + do { + high_before = mm_timer->mtimeh; + low = mm_timer->mtime; + high_after = mm_timer->mtimeh; + } while (high_before != high_after); + + return ((uint64_t)high_after << 32) | low; +} + +/* Avoid a transient low comparator while replacing its two RV32 halves. */ +static inline __attribute__((always_inline)) void timer_set_compare(uint64_t value) +{ + mm_timer->mtimecmph = UINT32_MAX; + mm_timer->mtimecmp = (uint32_t)value; + mm_timer->mtimecmph = (uint32_t)(value >> 32); +} + +/* Writable mtime is a testbench fixture, not a portable production API. */ +static inline __attribute__((always_inline)) void timer_fixture_set_time(uint32_t high, + uint32_t low) +{ + mm_timer->mtimeh = high; + mm_timer->mtime = low; +} + +static inline __attribute__((always_inline)) void timer_disable_all_irqs(void) +{ + global_irq_enable(false); + timer_irq_enable(false); +} + +static inline __attribute__((always_inline)) void cpu_wait_for_interrupt(void) +{ + __asm__ volatile("wfi" ::: "memory"); +} + +static inline void report_u32(const char *label, uint32_t value) +{ + tb_puts(label); + tb_put_u32(value); +} + +#endif diff --git a/src/tasks/task01_mtime_consistent_read.c b/src/tasks/task01_mtime_consistent_read.c new file mode 100644 index 0000000..388739e --- /dev/null +++ b/src/tasks/task01_mtime_consistent_read.c @@ -0,0 +1,66 @@ +#include "machine_timer.h" + +volatile uint32_t g_task01_attempts; +volatile uint32_t g_task01_selected_offset; +volatile uint32_t g_task01_retry_seen; +volatile uint32_t g_task01_value_high; +volatile uint32_t g_task01_monotonic; +volatile uint32_t g_task01_pass; + +/* noinline keeps the three MMIO reads visible as one inspectable operation. */ +__attribute__((noinline)) static uint64_t timer_read64_counted(void) +{ + uint32_t high_before; + uint32_t low; + uint32_t high_after; + + do { + ++g_task01_attempts; + high_before = mm_timer->mtimeh; + low = mm_timer->mtime; + high_after = mm_timer->mtimeh; + } while (high_before != high_after); + + return ((uint64_t)high_after << 32) | low; +} + +int main(void) +{ + uint64_t value = 0; + uint64_t after; + uint32_t offset; + + timer_disable_all_irqs(); + timer_set_compare(UINT64_MAX); + + /* + * Search a narrow deterministic testbench window around the 32-bit wrap. + * A real application must never write mtime just to test a reader. + */ + for (offset = 2U; offset <= 96U; ++offset) { + g_task01_attempts = 0U; + timer_fixture_set_time(0U, UINT32_MAX - offset); + value = timer_read64_counted(); + if (g_task01_attempts > 1U) { + g_task01_selected_offset = offset; + g_task01_retry_seen = 1U; + break; + } + } + + after = timer_read64(); + g_task01_value_high = (uint32_t)(value >> 32); + g_task01_monotonic = after >= value; + g_task01_pass = g_task01_retry_seen != 0U && + g_task01_value_high == 1U && + g_task01_monotonic != 0U; + + report_u32("T01 offset=", g_task01_selected_offset); + report_u32("T01 attempts=", g_task01_attempts); + report_u32("T01 retry=", g_task01_retry_seen); + report_u32("T01 value_high=", g_task01_value_high); + report_u32("T01 monotonic=", g_task01_monotonic); + report_u32("T01 pass=", g_task01_pass); + return g_task01_pass ? 0 : 1; +} + diff --git a/src/tasks/task02_oneshot_timer_irq.c b/src/tasks/task02_oneshot_timer_irq.c new file mode 100644 index 0000000..1dbabc8 --- /dev/null +++ b/src/tasks/task02_oneshot_timer_irq.c @@ -0,0 +1,66 @@ +#include "machine_timer.h" + +volatile uint32_t g_task02_isr_count; +volatile uint32_t g_task02_mcause; +volatile uint32_t g_task02_pending_before; +volatile uint32_t g_task02_pending_after; +volatile uint32_t g_task02_resumed; +volatile uint32_t g_task02_deadline_reached; +volatile uint32_t g_task02_pass; +volatile uint64_t g_task02_deadline; +volatile uint64_t g_task02_observed; + +/* common/init.S vector 7 selects this symbol; GCC emits mret for this ABI. */ +void __attribute__((interrupt("machine"))) isr_machine_timer(void) +{ + uint64_t observed = timer_read64(); + + g_task02_mcause = read_csr(mcause); + g_task02_observed = observed; + + /* The source is level-sensitive. Move mtimecmp before publishing count. */ + timer_set_compare(UINT64_MAX); + g_task02_isr_count = g_task02_isr_count + 1U; +} + +int main(void) +{ + uint32_t settle; + + timer_disable_all_irqs(); + timer_set_compare(UINT64_MAX); + g_task02_deadline = timer_read64() + UINT64_C(1200); + timer_set_compare(g_task02_deadline); + g_task02_pending_before = (read_csr(mip) & MTIP_MASK) != 0U; + + timer_irq_enable(true); + global_irq_enable(true); + + while (g_task02_isr_count == 0U) { + cpu_wait_for_interrupt(); + } + g_task02_resumed = 1U; + + timer_disable_all_irqs(); + for (settle = 0U; settle < 16U; ++settle) { + __asm__ volatile("nop"); + } + g_task02_pending_after = (read_csr(mip) & MTIP_MASK) != 0U; + g_task02_deadline_reached = g_task02_observed >= g_task02_deadline; + g_task02_pass = g_task02_isr_count == 1U && + g_task02_mcause == MACHINE_TIMER_CAUSE && + g_task02_pending_before == 0U && + g_task02_pending_after == 0U && + g_task02_resumed == 1U && + g_task02_deadline_reached == 1U; + + report_u32("T02 count=", g_task02_isr_count); + report_u32("T02 mcause=", g_task02_mcause); + report_u32("T02 pending_before=", g_task02_pending_before); + report_u32("T02 pending_after=", g_task02_pending_after); + report_u32("T02 resumed=", g_task02_resumed); + report_u32("T02 deadline_reached=", g_task02_deadline_reached); + report_u32("T02 pass=", g_task02_pass); + return g_task02_pass ? 0 : 1; +} + diff --git a/src/tasks/task03_periodic_absolute_deadline.c b/src/tasks/task03_periodic_absolute_deadline.c new file mode 100644 index 0000000..c28170f --- /dev/null +++ b/src/tasks/task03_periodic_absolute_deadline.c @@ -0,0 +1,105 @@ +#include "machine_timer.h" + +#define TASK03_TICKS 4U +#define TASK03_PERIOD UINT64_C(1600) + +volatile uint32_t g_task03_count; +volatile uint32_t g_task03_mcause_ok; +volatile uint32_t g_task03_step_ok; +volatile uint32_t g_task03_ordered; +volatile uint32_t g_task03_late_math_ok; +volatile uint32_t g_task03_naive_shift_ok; +volatile uint32_t g_task03_pass; +volatile uint64_t g_task03_next_deadline; +volatile uint64_t g_task03_scheduled[TASK03_TICKS]; +volatile uint64_t g_task03_observed[TASK03_TICKS]; +volatile uint64_t g_task03_lateness[TASK03_TICKS]; +volatile uint64_t g_task03_naive_phase_shift; + +void __attribute__((interrupt("machine"))) isr_machine_timer(void) +{ + uint32_t index = g_task03_count; + uint64_t scheduled = g_task03_next_deadline; + uint64_t observed = timer_read64(); + + if (read_csr(mcause) == MACHINE_TIMER_CAUSE) { + g_task03_mcause_ok = g_task03_mcause_ok + 1U; + } + if (index < TASK03_TICKS) { + g_task03_scheduled[index] = scheduled; + g_task03_observed[index] = observed; + g_task03_lateness[index] = observed - scheduled; + } + + /* Preserve phase: advance the previous deadline, not the observation. */ + g_task03_next_deadline = scheduled + TASK03_PERIOD; + if (index + 1U < TASK03_TICKS) { + timer_set_compare(g_task03_next_deadline); + } else { + timer_set_compare(UINT64_MAX); + } + g_task03_count = index + 1U; +} + +int main(void) +{ + uint32_t i; + + timer_disable_all_irqs(); + timer_set_compare(UINT64_MAX); + g_task03_next_deadline = timer_read64() + TASK03_PERIOD; + timer_set_compare(g_task03_next_deadline); + + timer_irq_enable(true); + global_irq_enable(true); + while (g_task03_count < TASK03_TICKS) { + cpu_wait_for_interrupt(); + } + timer_disable_all_irqs(); + + g_task03_step_ok = 1U; + g_task03_ordered = 1U; + g_task03_late_math_ok = 1U; + for (i = 0U; i < TASK03_TICKS; ++i) { + if (i != 0U && + g_task03_scheduled[i] - g_task03_scheduled[i - 1U] != TASK03_PERIOD) { + g_task03_step_ok = 0U; + } + if (g_task03_observed[i] < g_task03_scheduled[i]) { + g_task03_ordered = 0U; + } + if (g_task03_observed[i] - g_task03_scheduled[i] != g_task03_lateness[i]) { + g_task03_late_math_ok = 0U; + } + } + + /* now + period would copy the last lateness into the next phase. */ + g_task03_naive_phase_shift = + (g_task03_observed[TASK03_TICKS - 1U] + TASK03_PERIOD) - + (g_task03_scheduled[TASK03_TICKS - 1U] + TASK03_PERIOD); + g_task03_naive_shift_ok = + g_task03_naive_phase_shift == g_task03_lateness[TASK03_TICKS - 1U]; + + g_task03_pass = g_task03_count == TASK03_TICKS && + g_task03_mcause_ok == TASK03_TICKS && + g_task03_step_ok == 1U && + g_task03_ordered == 1U && + g_task03_late_math_ok == 1U && + g_task03_naive_shift_ok == 1U; + + report_u32("T03 count=", g_task03_count); + report_u32("T03 causes=", g_task03_mcause_ok); + report_u32("T03 period_low=", (uint32_t)TASK03_PERIOD); + for (i = 0U; i < TASK03_TICKS; ++i) { + report_u32("T03 deadline_low=", (uint32_t)g_task03_scheduled[i]); + report_u32("T03 observed_low=", (uint32_t)g_task03_observed[i]); + report_u32("T03 lateness_low=", (uint32_t)g_task03_lateness[i]); + } + report_u32("T03 step_ok=", g_task03_step_ok); + report_u32("T03 ordered=", g_task03_ordered); + report_u32("T03 late_math=", g_task03_late_math_ok); + report_u32("T03 naive_shift_ok=", g_task03_naive_shift_ok); + report_u32("T03 pass=", g_task03_pass); + return g_task03_pass ? 0 : 1; +} + diff --git a/tests/test_card.sh b/tests/test_card.sh new file mode 100755 index 0000000..1bdc761 --- /dev/null +++ b/tests/test_card.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +tmp_dir="$(mktemp -d /tmp/c11-card.XXXXXX)" +cleanup() { + rm -rf -- "$tmp_dir" +} +trap cleanup EXIT HUP INT TERM + +"$root/scripts/render_card_layouts.sh" >/dev/null +"$root/scripts/render_new_pdf.sh" >/dev/null + +pdf="$(find "$root/doc/pdf" -maxdepth 1 -type f \ + -name 'mpabi-inf-c-11-machine-timer-*.pdf' -print -quit)" +test -n "$pdf" +qpdf --check "$pdf" >/dev/null +pdftotext -layout "$pdf" "$tmp_dir/card.txt" + +blocks="$(rg -o 'A[1-8] (CONTEXT|STRUCTURE|DISPATCH|APPLICATION|FLOW|STATE|RUNTIME|PATTERNS)' \ + "$tmp_dir/card.txt" | wc -l)" +test "$blocks" -eq 24 + +if awk 'BEGIN { RS="\f" } { compact=$0; gsub(/[[:space:]]/, "", compact); if (length(compact) < 100) exit 1 }' \ + "$tmp_dir/card.txt"; then + : +else + echo "FAIL: empty or nearly empty PDF page" >&2 + exit 1 +fi + +if awk 'BEGIN { RS="\f" } \ + /A[1-8] (CONTEXT|STRUCTURE|DISPATCH|APPLICATION|FLOW|STATE|RUNTIME|PATTERNS)/ && !/TASK0[1-3]/ { exit 1 }' \ + "$tmp_dir/card.txt"; then + : +else + echo "FAIL: A1-A8 block on a page without its TASK heading" >&2 + exit 1 +fi + +jq -e ' + .tasks_order == ["task01", "task02", "task03"] and + all(.tasks[]; + [.viewpoints[].id] == ["A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8"] and + all(.viewpoints[]; .status == "enabled" or .status == "unavailable")) +' "$root/json/card_source.json" >/dev/null +node --check "$root/web/app.js" + +printf 'PASS card: 3 tasks, 24 A blocks, valid PDF, no empty/anonymous page\n' diff --git a/tests/test_hazard3.sh b/tests/test_hazard3.sh new file mode 100755 index 0000000..67eb171 --- /dev/null +++ b/tests/test_hazard3.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +env_root="${RV_ENV_ROOT:-/home/user/dev/edu/rv32i-hazard3-student-env}" +tb="${HAZARD3_TB:-$env_root/vendor/Hazard3/test/sim/tb_verilator/tb}" +objdump="${RISCV_PREFIX:-riscv64-unknown-elf-}objdump" + +if [[ ! -x "$tb" ]]; then + make -C "$(dirname -- "$tb")" tb >/dev/null +fi + +make -C "$root" -s tasks "RV_ENV_ROOT=$env_root" + +run_task() { + local task="$1" + shift + local log="$root/build/$task/oracle.log" + "$tb" --bin "$root/build/$task/prog.bin" --cycles 500000 --cpuret --logfile "$log" + if grep -Eq 'Unhandled trap|Max cycles reached' "$log"; then + printf 'FAIL %s: trap or timeout\n' "$task" >&2 + sed -n '1,160p' "$log" >&2 + return 1 + fi + local expected + for expected in "$@"; do + grep -Fqx "$expected" "$log" || { + printf 'FAIL %s: missing <%s>\n' "$task" "$expected" >&2 + sed -n '1,160p' "$log" >&2 + return 1 + } + done + printf 'PASS Hazard3 oracle: %s\n' "$task" +} + +run_task task01_mtime_consistent_read \ + 'T01 retry=00000001' \ + 'T01 value_high=00000001' \ + 'T01 monotonic=00000001' \ + 'T01 pass=00000001' + +run_task task02_oneshot_timer_irq \ + 'T02 count=00000001' \ + 'T02 mcause=80000007' \ + 'T02 pending_before=00000000' \ + 'T02 pending_after=00000000' \ + 'T02 resumed=00000001' \ + 'T02 deadline_reached=00000001' \ + 'T02 pass=00000001' + +run_task task03_periodic_absolute_deadline \ + 'T03 count=00000004' \ + 'T03 causes=00000004' \ + 'T03 period_low=00000640' \ + 'T03 step_ok=00000001' \ + 'T03 ordered=00000001' \ + 'T03 late_math=00000001' \ + 'T03 naive_shift_ok=00000001' \ + 'T03 pass=00000001' + +# Independent relations: do not accept a program's pass flag as the only oracle. +t01_attempts_hex="$(sed -n 's/^T01 attempts=//p' \ + "$root/build/task01_mtime_consistent_read/oracle.log")" +(( 16#$t01_attempts_hex > 1 )) || { + echo "FAIL task01: rollover did not force a retry" >&2 + exit 1 +} + +mapfile -t t03_deadline < <(sed -n 's/^T03 deadline_low=//p' \ + "$root/build/task03_periodic_absolute_deadline/oracle.log") +mapfile -t t03_observed < <(sed -n 's/^T03 observed_low=//p' \ + "$root/build/task03_periodic_absolute_deadline/oracle.log") +mapfile -t t03_lateness < <(sed -n 's/^T03 lateness_low=//p' \ + "$root/build/task03_periodic_absolute_deadline/oracle.log") +[[ ${#t03_deadline[@]} -eq 4 && ${#t03_observed[@]} -eq 4 && ${#t03_lateness[@]} -eq 4 ]] +for i in 0 1 2 3; do + d=$((16#${t03_deadline[$i]})) + o=$((16#${t03_observed[$i]})) + l=$((16#${t03_lateness[$i]})) + (( o >= d && o - d == l )) || { + echo "FAIL task03: invalid observed/deadline/lateness relation at tick $i" >&2 + exit 1 + } + if (( i > 0 )); then + previous=$((16#${t03_deadline[$((i - 1))]})) + (( d - previous == 1600 )) || { + echo "FAIL task03: deadline step is not 1600 at tick $i" >&2 + exit 1 + } + fi +done + +for task in task02_oneshot_timer_irq task03_periodic_absolute_deadline; do + "$objdump" -d "$root/build/$task/prog.elf" | + sed -n '/:/,/^$/p' | + grep -Eq '[[:space:]]mret$' || { + echo "FAIL $task: ISR does not end in mret" >&2 + exit 1 + } +done + +printf 'PASS independent oracle: rollover retry, periodic arithmetic, ISR mret\n' diff --git a/web/app.css b/web/app.css new file mode 100644 index 0000000..eac8d78 --- /dev/null +++ b/web/app.css @@ -0,0 +1 @@ +.paper{display:flex;flex-direction:column;gap:3.3cm}.paper>.sheet,.paper>.sheet-spread>.sheet{width:210mm;height:297mm;min-height:297mm;max-height:297mm;margin:0 auto;overflow:hidden}.paper>.sheet.sheet--landscape,.paper>.sheet-spread>.sheet.sheet--landscape{width:297mm;min-width:297mm;max-width:297mm;height:210mm;min-height:210mm;max-height:210mm}.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet>.sheet-content{height:297mm;min-height:297mm;max-height:297mm;overflow-x:hidden;overflow-y:hidden}.paper>.sheet.sheet--landscape>.sheet-content,.paper>.sheet-spread>.sheet.sheet--landscape>.sheet-content{height:210mm;min-height:210mm;max-height:210mm}.sheet-spread{display:contents}.paper.is-diagram-spread .sheet-spread{display:grid;grid-template-columns:repeat(var(--spread-columns, 1),max-content);width:max-content;max-width:none;margin:0 auto;align-items:flex-start;gap:2mm;zoom:var(--spread-fit-scale, 1)}.paper.is-diagram-spread .sheet-spread>.sheet{flex:0 0 auto}.viewer-chrome{position:sticky;top:0;z-index:80;width:100%}.viewer-action-toast{position:absolute;z-index:12;right:9px;bottom:9px;max-width:min(720px,calc(100vw - 18px));box-sizing:border-box;overflow:hidden;border:1px solid #42b8e7;border-radius:3px;background:#102c38ee;color:#dff7ff;padding:5px 9px;box-shadow:0 4px 14px #0007;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.25 ui-monospace,monospace}.viewer-chrome .topbar{position:sticky;top:0;z-index:90}.viewpoint-bar{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:1px;min-height:31px;border-top:1px solid #9aa8ae;border-bottom:1px solid #718087;background:#718087;box-shadow:0 2px 5px #0002}.viewpoint-bar button{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:5px;min-width:0;border:0;background:#f7f9fa;color:#1f3038;padding:5px 7px;text-align:left;cursor:pointer}.viewpoint-bar button:hover,.viewpoint-bar button:focus-visible{z-index:1;background:#e9f3f7;outline:2px solid #287495;outline-offset:-2px}.viewpoint-bar button[aria-current=location]{background:#dcecf3;box-shadow:inset 0 -3px #167ca4}.viewpoint-bar button>span{color:#1b6785;font:850 10px/1 ui-monospace,monospace}.viewpoint-bar button>strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.1 system-ui,sans-serif}.viewpoint-bar button.is-unavailable{background:#eef0f1;color:#5d686d;cursor:not-allowed}.viewpoint-bar button.is-unavailable>span{color:#68747a}.viewpoint-bar button.is-unavailable>small{border:1px solid #9da7ab;border-radius:2px;padding:1px 3px;font:750 7px/1 ui-monospace,monospace}.card-library-toggle{display:inline-flex;align-items:center;flex:none;height:28px;gap:6px;border:1px solid #6e7d84;border-radius:3px;background:#f6f8f9;color:#26373f;padding:2px 8px;font:750 11px/1 ui-monospace,monospace;cursor:pointer}.card-library-toggle:hover,.card-library-toggle:focus-visible{border-color:#1d7799;background:#edf7fa;outline:none}.card-library-toggle.is-active{border-color:#126d8f;background:#174f67;color:#fff}.card-library-toggle-icon{font:700 16px/1 system-ui,sans-serif}.card-library-toggle kbd{color:#267697;font:inherit}.card-library-toggle.is-active kbd{color:#aee9ff}:root{--side-panel-top: 36px;--side-panel-width: min(960px, calc(100vw - 28px) );--side-panel-trigger-length: 56px}.side-panel-dock{position:fixed;z-index:240;top:var(--side-panel-top);bottom:0;width:0;pointer-events:none}.side-panel-dock--left{left:0}.side-panel-dock--right{right:0}.side-panel-rail{position:fixed;z-index:243;top:calc(var(--side-panel-top) + 8px);display:flex;width:13px;flex-direction:column;gap:10px;pointer-events:auto}.side-panel-dock--left .side-panel-rail{left:0}.side-panel-dock--right .side-panel-rail{right:0}.side-panel-trigger{--side-panel-accent: #167ca4;position:relative;display:grid;width:13px;height:var(--side-panel-trigger-length);place-items:center;border:0;border-radius:0;background:transparent;padding:0;cursor:pointer}.side-panel-trigger:before{content:"";display:block;width:3px;height:calc(var(--side-panel-trigger-length) - 8px);border-radius:999px;background:var(--side-panel-accent);box-shadow:0 0 0 1px #ffffff73,0 3px 10px -5px var(--side-panel-accent);opacity:.78;transition:width .14s ease,opacity .14s ease,box-shadow .14s ease}.side-panel-trigger:hover:before,.side-panel-trigger:focus-visible:before,.side-panel-trigger.is-open:before{width:4px;opacity:1}.side-panel-trigger.is-pinned:before{width:5px;box-shadow:0 0 0 1px #ffffff9e,0 3px 12px -4px var(--side-panel-accent)}.side-panel-trigger:focus-visible{outline:2px solid var(--side-panel-accent);outline-offset:-2px}.side-panel-trigger>span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.side-panel{position:fixed;z-index:241;top:var(--side-panel-top);bottom:0;display:flex;width:var(--side-panel-width);max-width:calc(100vw - 20px);box-sizing:border-box;flex-direction:column;overflow:hidden;border-color:#819098;background:#f7f9fa;color:#17252c;pointer-events:none;transition:transform .18s cubic-bezier(.22,.78,.24,1);will-change:transform}.side-panel-dock--left .side-panel{left:0;border-right:1px solid #819098;box-shadow:15px 0 34px -24px #101b218c;transform:translate(calc(-100% - 14px))}.side-panel-dock--right .side-panel{right:0;border-left:1px solid #819098;box-shadow:-15px 0 34px -24px #101b218c;transform:translate(calc(100% + 14px))}.side-panel.is-open{transform:translate(0);pointer-events:auto}.side-panel:after{content:"";position:absolute;top:10px;width:4px;height:48px;border-radius:999px;background:var(--side-panel-accent);pointer-events:none}.side-panel-dock--left .side-panel:after{right:-2px}.side-panel-dock--right .side-panel:after{left:-2px}.side-panel-header{display:flex;min-height:38px;box-sizing:border-box;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid #aebbc1;background:#e7edef;padding:4px 7px 4px 10px}.side-panel-header>div:first-child{display:flex;min-width:0;align-items:baseline;gap:7px}.side-panel-header small{color:#52666f;font:600 16px/1 ui-monospace,monospace;letter-spacing:.08em}.side-panel-header strong{overflow:hidden;color:#11191d;text-overflow:ellipsis;white-space:nowrap;font:600 16px/1.2 system-ui,sans-serif}.side-panel-actions{display:flex;flex:none;gap:4px}.side-panel-actions button{display:grid;min-width:38px;height:24px;place-items:center;border:1px solid #8b999f;border-radius:3px;background:#fff;color:#26373f;padding:0 6px;font:650 16px/1 ui-monospace,monospace;cursor:pointer}.side-panel-actions button:last-child{min-width:24px;padding:0;font-size:18px}.side-panel-actions button:hover,.side-panel-actions button:focus-visible,.side-panel-actions button.is-pinned{border-color:var(--side-panel-accent);background:#edf7fa;outline:none}.side-panel-body,.card-library-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden}.card-library-header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 18px 15px;border-bottom:1px solid #bdc9ce;background:#e8eef1}.card-library-header small{color:#52666f;font:600 16px/1.25 ui-monospace,monospace;letter-spacing:.09em;text-transform:uppercase}.card-library-header h2{margin:4px 0 2px;font:750 22px/1.15 system-ui,sans-serif}.card-library-header p{margin:0;color:#607078;font:500 16px/1.35 system-ui,sans-serif}.card-library-header>button{display:grid;width:34px;height:34px;place-items:center;flex:none;border:1px solid #77878e;border-radius:3px;background:#fff;color:#25353c;padding:0;font:25px/1 system-ui,sans-serif;cursor:pointer}.card-library-header>button:hover,.card-library-header>button:focus-visible{border-color:#126d8f;background:#edf7fa;outline:2px solid #85c5dc;outline-offset:1px}.card-library-tree{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:6px 0 18px;scrollbar-color:#8a9aa1 #edf1f3}.card-library-tree details{border:0}.card-library-tree summary{display:grid;grid-template-columns:14px minmax(0,1fr) auto;align-items:center;gap:6px;min-height:30px;box-sizing:border-box;padding:5px 10px 5px 4px;list-style:none;cursor:pointer;user-select:none}.card-library-tree summary::-webkit-details-marker{display:none}.card-library-tree summary:hover,.card-library-tree summary:focus-visible{background:#eaf1f4;outline:none}.card-library-branch{color:#25363d;font:16px/1 ui-monospace,monospace;transform:rotate(-90deg);transition:transform .12s ease}.card-library-tree details[open]>summary .card-library-branch{transform:rotate(0)}.card-library-tree summary strong,.card-library-tree summary small{display:block}.card-library-tree summary strong{color:#070a0b;font:550 16px/1.3 system-ui,sans-serif}.card-library-tree summary small{margin-top:2px;color:#303b40;font:500 16px/1.25 ui-monospace,monospace;letter-spacing:.04em}.card-library-tree summary output{min-width:22px;color:#26363d;padding:0 2px;text-align:center;font:550 16px/1.2 ui-monospace,monospace}.card-library-subject>summary{min-height:42px;border-bottom:1px solid #9eacb2;background:#dfe8ec;padding:7px 14px}.card-library-subject>summary:hover,.card-library-subject>summary:focus-visible{background:#d5e1e5}.card-library-subject>summary strong{color:#000;font:600 16px/1.3 system-ui,sans-serif}.card-library-subject>summary small{color:#28353a;font:500 16px/1.25 ui-monospace,monospace}.card-library-level-list{margin-left:18px;border-left:1px solid #8e9da4}.card-library-level>summary{min-height:38px;border-bottom:1px solid #cbd4d8;padding-left:8px}.card-library-level>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series-list{margin-left:18px;border-left:1px solid #a5b1b6;padding:2px 0 6px}.card-library-series>summary{min-height:34px;padding-left:8px}.card-library-series>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series>summary small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-cards,.card-library-tasks{list-style:none;margin-top:0;margin-bottom:2px;padding:0}.card-library-cards{margin-left:18px;border-left:1px solid #bac3c7}.card-library-card-entry{margin:0}.card-library-card{display:grid;grid-template-columns:19px minmax(0,1fr) auto;align-items:start;gap:5px;min-height:38px;box-sizing:border-box;border:0;border-left:3px solid transparent;color:#000;padding:5px 8px 5px 3px;text-decoration:none}.card-library-node{color:#536168;font:16px/1.35 ui-monospace,monospace}.card-library-card-copy,.card-library-card-copy strong,.card-library-card-copy>span{display:block;min-width:0}.card-library-card-copy strong{color:#000;font:550 16px/1.3 ui-monospace,monospace}.card-library-card-copy>span{margin-top:2px;color:#0b0d0e;font:500 16px/1.35 system-ui,sans-serif;white-space:normal}.card-library-card-meta{display:flex;align-items:flex-end;flex-direction:column;gap:2px}.card-library-card-meta small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-card.is-available{cursor:pointer}.card-library-card.is-available:hover,.card-library-card.is-available:focus-visible{background:#eaf5f8;outline:none}.card-library-card.is-current{border-left-color:#16769b;background:#dff1f7}.card-library-card.is-current:hover,.card-library-card.is-current:focus-visible{background:#cfeaf3;outline:1px solid #5ba9c4;outline-offset:-1px}.card-library-card.is-unavailable{color:#000}.card-library-card.is-unavailable .card-library-card-copy strong,.card-library-card.is-unavailable .card-library-card-meta small{color:#1d292e}.card-library-card.is-unavailable .card-library-card-copy>span{color:#0b0d0e}.card-library-tasks{margin-left:36px;border-left:1px solid #c3cacc}.card-library-tasks li>a,.card-library-tasks li>span{display:grid;grid-template-columns:19px auto minmax(0,1fr);gap:5px;align-items:start;color:#000;padding:4px 8px 5px 3px;text-decoration:none}.card-library-tasks li>a:hover,.card-library-tasks li>a:focus-visible{background:#eaf5f8;outline:none}.card-library-tasks strong{color:#000;font:550 16px/1.35 ui-monospace,monospace}.card-library-tasks li>a>span:last-child,.card-library-tasks li>span>span:last-child{color:#111;font:500 16px/1.35 system-ui,sans-serif}.card-library-footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 16px;border-top:1px solid #bdc9ce;background:#edf1f3;color:#5a6a72;font:500 16px/1.3 system-ui,sans-serif}.card-library-footer span{display:inline-flex;align-items:center;gap:4px}.card-library-footer i{width:7px;height:7px;border-radius:50%;background:#929da2}.card-library-footer i.is-online{background:#26815b}.card-library-footer kbd{margin-left:auto;border:1px solid #a2afb5;border-radius:2px;background:#fff;padding:2px 5px;font:600 16px/1 ui-monospace,monospace}.card-library-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.card-library-treegrid-row{display:grid;min-width:760px;min-height:38px;box-sizing:border-box;grid-template-columns:minmax(500px,1fr) 110px 120px;align-items:stretch;border-bottom:1px solid rgb(31 35 40 / 9%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.card-library-treegrid-row>[role=gridcell],.card-library-treegrid-row>[role=columnheader]{display:flex;min-width:0;align-items:center;overflow:hidden;padding:7px 9px;text-overflow:ellipsis;white-space:nowrap}.card-library-treegrid-row>[role=gridcell]+[role=gridcell],.card-library-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 9%)}.card-library-treegrid-head{position:sticky;z-index:3;top:0;min-height:34px;border-bottom-color:#1f232833;background:#eef1f2;color:#3e525b;font-weight:700;letter-spacing:.045em}.card-library-treegrid-row:not(.card-library-treegrid-head):hover{background:#1f23280a}.card-library-treegrid-row.is-subject{background:#dfe8e5}.card-library-treegrid-row.is-level{background:#f5f8f8}.card-library-treegrid-row.is-series{background:#f9fbfb}.card-library-treegrid-row.is-card{min-height:42px;background:#fff}.card-library-treegrid-row.is-task{background:#fbfcfc}.card-library-treegrid-row.is-current{box-shadow:inset 3px 0 #1680a5;background:#e1f1f6}.card-library-tree-title{gap:6px;padding-left:calc(8px + (var(--card-library-depth, 0) * 21px))!important;font-family:system-ui,sans-serif}.card-library-tree-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.card-library-tree-expander:hover,.card-library-tree-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.card-library-tree-expander.is-empty{cursor:default}.card-library-tree-link,.card-library-tree-label{display:flex;min-width:0;align-items:baseline;gap:7px;overflow:hidden;color:#10181c;text-decoration:none;white-space:nowrap}.card-library-tree-link:hover,.card-library-tree-link:focus-visible{color:#075d7c;outline:none;text-decoration:underline;text-underline-offset:2px}.card-library-tree-link strong,.card-library-tree-label strong{flex:none;color:inherit;font:700 16px/1.25 ui-monospace,monospace}.card-library-tree-link>span,.card-library-tree-label>span{min-width:0;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap;font:500 16px/1.25 system-ui,sans-serif}.card-library-treegrid-row.is-subject .card-library-tree-label strong,.card-library-treegrid-row.is-level .card-library-tree-label strong,.card-library-treegrid-row.is-series .card-library-tree-label strong{font-family:system-ui,sans-serif;font-weight:650}.card-library-tree-state{display:inline-flex;min-width:76px;min-height:24px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid transparent;border-radius:5px;color:#33474f;padding:2px 7px;font:650 14px/1 ui-monospace,monospace;white-space:nowrap}.card-library-tree-state[data-state=current]{border-color:#3184a0;background:#e9f5f8;color:#075d7c}.card-library-tree-state[data-state=online]{border-color:#4b9a7a;background:#edf8f2;color:#176144}.card-library-tree-state[data-state=plan]{border-color:#c59a49;background:#fff7e5;color:#775313}.card-library-treegrid-row.is-unavailable .card-library-tree-label,.card-library-treegrid-row.is-unavailable .card-library-tree-label strong{color:#10181c}.side-toc,.side-progress{min-height:0;flex:1;overflow-y:auto;background:#fff;color:#11191d}.side-toc>header,.side-progress>header{padding:16px 18px 13px;border-bottom:1px solid #bdc9ce;background:#f0f4f5}.side-toc>header small,.side-progress>header small{color:#53666f;font:750 9px/1 ui-monospace,monospace;letter-spacing:.08em}.side-toc>header h2,.side-progress>header h2{margin:4px 0 0;color:#10181c;font:750 21px/1.15 system-ui,sans-serif}.side-toc ol{margin:0;padding:7px 0 20px;list-style:none}.side-toc li{border-bottom:1px solid #e2e7e9}.side-toc a{display:grid;grid-template-columns:34px minmax(0,1fr);gap:9px;align-items:baseline;padding:10px 16px;color:#11191d;text-decoration:none}.side-toc a:hover,.side-toc a:focus-visible{background:#eaf5f8;outline:none}.side-toc a span{color:#267493;font:800 10px/1 ui-monospace,monospace}.side-toc a strong{font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:16px;border:1px solid #b6c2c7;background:#f4f7f8;padding:14px;font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary strong{color:#1d617b;font:850 20px/1 ui-monospace,monospace}.side-progress-links{display:grid;gap:8px;padding:0 16px 18px}.side-progress-links a{border:1px solid #87979e;border-radius:3px;background:#fff;color:#174f67;padding:10px 12px;text-decoration:none;font:700 12px/1.2 system-ui,sans-serif}.side-progress-links a:hover,.side-progress-links a:focus-visible{border-color:#167ca4;background:#edf7fa;outline:none}.side-progress-error{margin:0 16px 14px;border-left:3px solid #a52d2d;background:#fff1f1;color:#7d1f1f;padding:8px 10px;font:12px/1.35 system-ui,sans-serif}.classroom-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden;background:#f7f9fa;color:#11191d}.classroom-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.classroom-treegrid-row{display:grid;min-width:920px;box-sizing:border-box;grid-template-columns:minmax(410px,1fr) 100px 150px 150px 110px;align-items:center;border-bottom:1px solid rgb(31 35 40 / 8%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.classroom-treegrid-row>[role=gridcell],.classroom-treegrid-row>[role=columnheader]{min-width:0;overflow:hidden;padding:8px;text-overflow:ellipsis;white-space:nowrap}.classroom-treegrid-row>[role=gridcell]+[role=gridcell],.classroom-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 8%)}.classroom-treegrid-head{position:sticky;z-index:2;top:0;border-bottom-color:#1f23282e;background:#eef1f2;color:#3e525b;font-weight:650;letter-spacing:.04em}.classroom-node-row:hover{background:#1f23280a}.classroom-node-row.is-class{background:#dfe8e5}.classroom-node-row.is-student{background:#f8faf9}.classroom-node-row.is-task{background:#edf3f5}.classroom-node-row.is-block,.classroom-node-row.is-exercises{background:#f5f7f8}.classroom-node-row.is-phase{background:#fafbfb}.classroom-node-title{display:flex;align-items:center;gap:6px;padding-left:calc(8px + (var(--classroom-depth, 0) * 20px))!important;font-family:system-ui,sans-serif}.classroom-node-title strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:500}.classroom-node-row.is-class .classroom-node-title strong,.classroom-node-row.is-student .classroom-node-title strong,.classroom-node-row.is-task .classroom-node-title strong{font-weight:650}.classroom-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.classroom-expander:hover,.classroom-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.classroom-expander.is-empty{cursor:default}.classroom-status,.classroom-sync,.classroom-visit,.classroom-commit{display:inline-flex;min-width:92px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid;border-radius:5px;padding:4px 6px;font:550 16px/1 ui-monospace,monospace;letter-spacing:.015em}.classroom-status[data-status=online]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-status[data-status=away]{border-color:#baa06a;background:#fff5d9;color:#765510}.classroom-status[data-status=offline]{border-color:#a5afb3;background:#f0f2f3;color:#596970}.classroom-status[data-status=error]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-sync[data-sync=follow]{border-color:#6c98aa;background:#e8f3f7;color:#155c77}.classroom-sync[data-sync=paused]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-sync[data-sync=local]{border-color:#9a86ae;background:#f4eef9;color:#65427c}.classroom-visit[data-visit=present],.classroom-commit[data-commit=committed]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-visit[data-visit=missed],.classroom-commit[data-commit=missing]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-visit[data-visit=pending],.classroom-commit[data-commit=working]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-legend{display:flex;flex:none;flex-wrap:wrap;gap:7px 12px;border-top:1px solid #aebbc1;background:#edf1f2;padding:9px 11px;color:#485c65;font:500 16px/1.35 system-ui,sans-serif}.classroom-legend span{display:inline-flex;align-items:center;gap:4px}.classroom-legend i{width:12px;height:12px;border:1px solid #73858c;border-radius:50%;background:#aeb7bb}.classroom-legend i[data-status=online]{border-color:#3e7c63;background:#45a27b}.classroom-legend i[data-status=away]{border-color:#a0782d;background:#dcae51}.classroom-legend i[data-status=offline]{border-color:#859399;background:#b6c0c4}.classroom-legend b{color:#65427c;font:600 16px/1 ui-monospace,monospace}.viewer-chrome.is-nvim-fit{display:flex;width:100%;height:100vh;height:100dvh;max-height:100dvh;flex-direction:column;overflow:hidden;background:#11171a}.viewer-chrome.is-nvim-fit .topbar,.viewer-chrome.is-nvim-fit .viewpoint-bar,.viewer-chrome.is-nvim-fit .allocator-panel{flex:none}.viewer-chrome.is-nvim-fit .nvim-panel{display:flex;min-height:0;flex:1;flex-direction:column}.viewer-chrome.is-nvim-fit .nvim-screen-scroll{min-height:0;height:auto!important;flex:1}.viewer-chrome.is-nvim-fit .nvim-resize-handle{display:none}.viewer-chrome.is-nvim-fit .nvim-screen-stage{width:100%;height:100%;margin:0;zoom:1}.viewer-chrome.is-nvim-fit .nvim-screen-content{right:1mm;overflow:hidden;scrollbar-width:none}.viewer-chrome.is-nvim-fit .nvim-screen-grid{display:flex;width:100%;min-height:0;height:100%;align-items:center;justify-content:center}.viewer-chrome.is-nvim-fit .nvim-screen{width:auto!important;height:auto!important;max-width:100%;max-height:100%}.viewer-chrome.is-nvim-fit .nvim-screen-content::-webkit-scrollbar{display:none}.topbar-nvim-section{display:flex;align-items:center;min-width:0;gap:6px}.nvim-toolbar-boundary{flex:none;color:#6f7d83;font:700 14px/1 ui-monospace,monospace}.nvim-toolbar-context{flex:none;width:5ch;color:#263238;font:800 12px/1 ui-monospace,monospace;letter-spacing:.08em;text-align:center}.nvim-toolbar-actions{display:flex;align-items:center;gap:3px}.nvim-toolbar-button{display:inline-flex;align-items:center}.nvim-toolbar-key{flex:0 0 2ch;color:#267697;font:inherit;text-align:center}.nvim-toolbar-label{flex:0 0 5ch;max-width:5ch;overflow:hidden;text-align:left;white-space:nowrap}.topbar-nvim-meta{display:flex;align-items:baseline;min-width:0;max-width:min(44vw,720px);gap:6px}.topbar-nvim-meta strong,.topbar-nvim-meta small{overflow:auto;text-overflow:ellipsis;white-space:nowrap}.topbar-nvim-meta strong{color:#263238;font:700 12px/1.25 system-ui,sans-serif}.topbar-nvim-meta small{color:#66747a;font:500 10px/1.25 system-ui,sans-serif}.viewer-nvim-toggle{border:1px solid #68747a;border-radius:3px;background:#fff;color:#263238;padding:2px 8px;font:650 16px/1.3 system-ui,sans-serif;cursor:pointer}.viewer-nvim-toggle[aria-pressed=true]{border-color:#267697;background:#eaf6fb;color:#174d64}.allocator-panel{width:100%;box-sizing:border-box;border-top:1px solid #40515a;border-bottom:1px solid #40515a;background:#f7f9f5;color:#182127;box-shadow:0 4px 12px #0002;font:11px/1.25 system-ui,sans-serif}.allocator-panel>header{display:grid;grid-template-columns:125px minmax(260px,auto) 1fr;gap:8px;align-items:baseline;min-height:22px;padding:3px 8px;border-bottom:1px solid #b7c1c4;background:#e8eef0}.allocator-panel>header>span{color:#166987;font:800 9px/1.2 ui-monospace,monospace;letter-spacing:.06em}.allocator-panel>header>strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 11px/1.2 ui-monospace,monospace}.allocator-panel>header>small{overflow:hidden;color:#536168;text-overflow:ellipsis;white-space:nowrap}.allocator-panel-body{display:grid;grid-template-columns:230px minmax(420px,1fr) minmax(310px,.8fr);gap:9px;align-items:stretch;padding:5px 8px 7px}.allocator-metrics{display:grid;grid-template-columns:1fr 1fr;gap:3px 8px;margin:0}.allocator-metrics>div{min-width:0;border-left:2px solid #8ea2ab;padding-left:5px}.allocator-metrics dt{color:#627077;font:750 7px/1.2 ui-monospace,monospace;letter-spacing:.05em}.allocator-metrics dd{margin:1px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:700 10px/1.2 ui-monospace,monospace}.allocator-arena-view{min-width:0}.allocator-arena-view.is-inactive{opacity:.42}.allocator-arena-labels{display:flex;justify-content:space-between;gap:8px;margin-bottom:3px;color:#536168;font:700 8px/1.2 ui-monospace,monospace}.allocator-arena-labels strong{color:#075f80}.allocator-pinned-arena{position:relative;display:grid;grid-template-columns:repeat(var(--allocator-size),minmax(2px,1fr));height:32px;border:1px solid #28343a;background:#fff}.allocator-pinned-arena i{min-width:0;border-right:1px solid #e1e5e6;background:#fbfcfc}.allocator-pinned-arena i:nth-child(8n){border-right-color:#87969d}.allocator-pinned-arena i.is-allocated{border-right-color:#b2d8e6;background:#43a8ce}.allocator-cursor{position:absolute;z-index:2;top:-4px;bottom:-4px;width:2px;background:#d02d25;transform:translate(-1px);box-shadow:0 0 0 1px #fff9}.allocator-cursor:before{content:"allocp";position:absolute;top:1px;left:4px;color:#8d1d17;font:800 7px/1 ui-monospace,monospace}.allocator-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 7px;min-width:0}.allocator-facts>div{display:flex;min-width:0;justify-content:space-between;gap:5px;border-bottom:1px dotted #b4bec2}.allocator-facts span{overflow:hidden;color:#46565e;text-overflow:ellipsis;white-space:nowrap}.allocator-facts code{overflow:hidden;color:#142e39;text-overflow:ellipsis;white-space:nowrap;font:700 9px/1.3 ui-monospace,monospace}.allocator-facts p{grid-column:1 / -1;margin:0;color:#647278}.nvim-panel{width:100%;box-sizing:border-box;border-bottom:1px solid #52616a;background:var(--desk, #eee);color:#e7eef1;box-shadow:0 5px 16px #0004;font:12px/1.3 system-ui,sans-serif}.nvim-status{flex:none;border:1px solid #66757c;border-radius:999px;padding:1px 6px;color:#c9d3d8;font:750 9px/1.35 ui-monospace,monospace;letter-spacing:.04em}.nvim-status--connected,.nvim-status--ready{border-color:#31a86d;background:#173b2a;color:#8aefb7}.nvim-status--connecting,.nvim-status--replaying,.nvim-status--verifying{border-color:#c38f2a;background:#3e321b;color:#ffd47d}.nvim-status--failed,.nvim-status--offline,.nvim-status--unselected{border-color:#a34b4b;background:#3b2020;color:#faa}.nvim-control-indicator{flex:none;border:1px solid #60747e;border-radius:3px;background:#222e34;color:#b9c6cc;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.04em;white-space:nowrap;cursor:pointer}.nvim-control-indicator.is-active{border-color:#3cb3e2;background:#17465a;color:#d9f5ff}.nvim-control-indicator.is-engaged{box-shadow:inset 0 0 0 1px #8ee4ff}.nvim-work-indicator{flex:none;border:1px solid #7a878d;border-radius:3px;background:#f4f6f7;color:#56646a;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-work-indicator.is-active{border-color:#cf3d31;background:#fff0ee;color:#9f241b}.nvim-work-indicator.is-engaged{box-shadow:inset 0 0 0 1px #cf3d31}.nvim-work-indicator:disabled{border-color:#a8b0b4;background:#e6e9ea;color:#7c878c;cursor:not-allowed;opacity:.8}.nvim-height-toggle{flex:none;border:1px solid #75848b;border-radius:3px;background:#f4f6f7;color:#425159;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-height-toggle.is-active{border-color:#267697;background:#eaf6fb;color:#174d64}.topbar-nvim-section .nvim-toolbar-button{flex:0 0 9.5ch;width:9.5ch;min-width:9.5ch;max-width:9.5ch;height:24px;box-sizing:border-box;justify-content:flex-start;gap:.55ch;padding:2px .55ch;font:750 12px/1 ui-monospace,monospace;letter-spacing:0}.nvim-shortcut-strip{flex:none;color:#536168;font:650 10px/1.2 ui-monospace,monospace;white-space:nowrap}.nvim-shortcut-strip kbd{color:#263238;font:inherit}.nvim-screen-scroll{position:relative;width:100%;box-sizing:border-box;height:var(--nvim-panel-height, 75vh);max-height:none;min-height:240px;overflow:auto;overscroll-behavior:contain;background:var(--desk, #eee);outline:none;scrollbar-color:#58666d #171d20}.nvim-screen-stage{position:relative;width:210mm;margin:0 auto;background:#fff;zoom:var(--viewer-canvas-scale)}.nvim-screen-surface{position:absolute;inset:0 4mm;box-sizing:border-box;padding:1mm;background:#fff}.nvim-screen-frame{position:relative;height:100%;box-sizing:border-box;border:1px solid #267697;background:#101315;box-shadow:0 0 0 3px #000}.nvim-screen-scroll[data-sync=on] .nvim-screen-frame{border-color:#35b9ef}.nvim-screen-scroll[data-control=true] .nvim-screen-frame{box-shadow:0 0 0 3px #cf3d31}.nvim-screen-scroll[data-control=true]{cursor:text}.nvim-screen-content{position:absolute;inset:1mm -5mm 1mm 1mm;overflow-x:hidden;overflow-y:scroll;overscroll-behavior:contain;background:transparent;scrollbar-width:thin;scrollbar-color:#829097 #fff}.nvim-screen-grid{width:calc(100% - 6mm);min-height:100%;background:#101315}.nvim-screen-content::-webkit-scrollbar{width:.8mm}.nvim-screen-content::-webkit-scrollbar-track{background:#fff}.nvim-screen-content::-webkit-scrollbar-thumb{border:.12mm solid #fff;border-radius:99px;background:#829097}.nvim-screen-content::-webkit-scrollbar-thumb:hover{background:#aeb9be}.nvim-screen{display:block;max-width:none;margin:0;outline:none;image-rendering:auto}.nvim-screen:focus{box-shadow:none}.nvim-screen-empty{position:absolute;inset:0;display:grid;place-content:center;gap:5px;padding:16px;color:#9cabb2;text-align:center}.nvim-screen-empty strong{color:#e0e8eb;font:750 11px/1.3 ui-monospace,monospace}.nvim-resize-handle{position:relative;width:100%;height:12px;border-top:1px solid #46565e;background:#182126;cursor:ns-resize;touch-action:none}.nvim-resize-handle:after{content:"";position:absolute;top:4px;left:50%;width:min(160px,22vw);height:3px;border-radius:999px;background:#6c7e87;transform:translate(-50%)}.nvim-resize-handle:hover,.nvim-resize-handle:focus-visible{background:#23323a;outline:none}.nvim-resize-handle:hover:after,.nvim-resize-handle:focus-visible:after{background:#35b9ef}.shortcut-help-backdrop{position:fixed;z-index:200;inset:0;display:grid;place-items:center;padding:20px;background:#10171dcc}.shortcut-help{width:min(680px,calc(100vw - 40px));max-height:calc(100vh - 40px);overflow:auto;border:1px solid #71818a;border-radius:6px;background:#f8fafb;color:#172127;box-shadow:0 18px 60px #0008;font:14px/1.4 system-ui,sans-serif}.shortcut-help>header{display:flex;align-items:start;justify-content:space-between;gap:16px;padding:16px 18px;border-bottom:1px solid #c8d1d5;background:#e8eef1}.shortcut-help header small{color:#52646d;font:750 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.shortcut-help h2{margin:4px 0 0;font-size:17px}.shortcut-help header button{width:32px;height:32px;border:1px solid #71818a;border-radius:3px;background:#fff;font:22px/1 system-ui,sans-serif;cursor:pointer}.shortcut-help dl{margin:0;padding:10px 18px}.shortcut-help dl>div{display:grid;grid-template-columns:minmax(180px,.8fr) 1.5fr;gap:14px;align-items:center;padding:8px 0;border-bottom:1px solid #dde3e6}.shortcut-help dt,.shortcut-help dd{margin:0}.shortcut-help kbd{display:inline-block;border:1px solid #839198;border-bottom-width:2px;border-radius:3px;background:#fff;padding:3px 7px;font:700 12px/1.2 ui-monospace,monospace}.shortcut-help>p{margin:0;padding:4px 18px 16px;color:#526068}.memory-react{border:1px solid #555;background:#fff;font:14px/1.35 system-ui,sans-serif;padding:10px;color:#1b1b1b}.memory-react>header{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid #bbb;padding-bottom:7px}.memory-react>header small{display:block;margin-bottom:2px;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.memory-react h3{font-size:15px;margin:0}.memory-actions{display:flex;gap:5px;flex-wrap:wrap;justify-content:flex-end}.memory-actions button{border:1px solid #777;background:#fff;padding:4px 8px;cursor:pointer}.memory-actions button[aria-pressed=true]{background:#dff3fb;border-color:#237da1;font-weight:700}.memory-lanes{display:grid;grid-template-columns:repeat(auto-fit,minmax(125px,1fr));gap:6px;margin:8px 0}.memory-lane{min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:3px;border:1px solid #999;background:#fafafa;padding:7px;text-align:left}.memory-lane.compile{background:#fff8dc}.memory-lane.bss{background:#edf7fb}.memory-lane.stack{background:#f3f8ef}.memory-lane.registers{background:#f4f4f4}.memory-lane.text{background:#f7f0fa}.memory-lane>b{font-size:11px;letter-spacing:.04em}.memory-lane button{border:1px solid transparent;background:transparent;padding:3px;text-align:left;cursor:pointer}.memory-lane button:hover,.memory-lane button.active{border-color:#238bb7;background:#fff}.memory-lane code{font-size:10px;white-space:normal}.arena-wrap{margin:12px 0 6px}.arena-label{display:flex;justify-content:space-between;margin-bottom:4px}.arena{--allocp: 0;--arena-size: 64;position:relative;display:grid;grid-template-columns:repeat(var(--arena-size),1fr);height:40px;border:1px solid #222;margin-bottom:28px}.arena i{border-right:1px solid #ddd}.arena .allocp{position:absolute;left:calc(var(--allocp) / var(--arena-size) * 100%);top:43px;transform:translate(-50%);color:#087da8;font:700 11px/1.2 ui-monospace,monospace;white-space:nowrap}.memory-stage{border-top:1px solid #ddd;padding-top:7px;margin:0}.memory-inspector{display:grid;grid-template-columns:auto 1fr;gap:2px 10px;margin-top:7px;padding:7px;border-left:3px solid #238bb7;background:#f5fbfd}.memory-inspector strong{grid-row:1/3}.memory-inspector code{font-size:11px}.memory-inspector span{font-size:12px}.asset-static-fallback{display:none}.uml-react{border:1px solid #555;background:#fff;font:13px/1.35 system-ui,sans-serif;color:#1b1b1b}.uml-react>header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-bottom:1px solid #bbb;background:#fafafa}.uml-react>header small{display:block;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.06em}.uml-react h3{margin:2px 0 0;font-size:15px}.uml-actions{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end}.uml-actions button{border:1px solid #aaa;border-radius:2px;background:#fcfcfc;color:#444;padding:2px 6px;font:600 10px/1.25 ui-monospace,monospace;cursor:pointer}.uml-actions button:hover{border-color:#64879a;background:#f5fafc}.uml-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64;box-shadow:inset 0 0 0 1px #b9dce9}.uml-canvas{display:block;overflow-x:hidden;overflow-y:visible;box-sizing:border-box;padding:8px 10px;text-align:center}.uml-svg-host{width:max-content;min-width:100%}.uml-canvas img,.uml-svg-host svg{display:block;width:auto!important;max-width:none!important;height:auto!important;max-height:none;margin-inline:auto;object-fit:contain}.uml-svg-host{cursor:pointer}.uml-svg-host.is-tiled{position:relative;width:var(--uml-tile-page-width);min-width:var(--uml-tile-page-width);height:var(--uml-tile-page-height);overflow:hidden;cursor:default}.uml-svg-host.is-tiled>svg{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);margin:0}.uml-static-crop{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);overflow:hidden}.uml-static-crop>img{display:block;max-width:none!important;max-height:none!important;margin:0!important;object-fit:fill!important;transform-origin:0 0}.uml-tile-part{display:inline-block;margin-left:.65em;color:#607985;font:650 9px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap}.uml-phase-actions>span{display:inline-flex;align-items:center;border:1px solid #9eb2bd;border-radius:2px;background:#f1f5f7;color:#3d5967;padding:2px 6px;font:700 10px/1.25 ui-monospace,monospace}.uml-stage-region{cursor:pointer;transition:fill .14s ease,stroke .14s ease,stroke-width .14s ease}.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important;fill-opacity:1!important;stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-completed.uml-stage-region-outline{stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-bg{fill:#e7f6fc!important;fill-opacity:1!important;stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-outline{stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important}.uml-stage-region:focus{outline:none;stroke:#005f87!important;stroke-width:4px!important}.uml-inline-warning{display:block;padding-top:5px;color:#8b2d20;font-size:11px}.uml-stage{display:grid;grid-template-columns:auto 1fr;gap:3px 10px;margin:0 8px 8px;padding:8px;border-left:3px solid #315f78;background:#eef7fb}.uml-stage strong{grid-row:1/3}.uml-stage code{grid-column:2;font-size:11px}.uml-approval{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 8px 8px;padding-top:6px;border-top:1px solid #d2d2d2;color:#555;font-size:11px}.uml-approval button{flex:0 0 auto;border:1px solid #477a5d;border-radius:2px;background:#edf8f1;color:#174e30;padding:3px 7px;font:600 10px/1.25 system-ui,sans-serif;cursor:pointer}.uml-approval button:disabled{border-color:#bbb;background:#f3f3f3;color:#888;cursor:not-allowed}.uml-react>.uml-snapshot-header{display:block;padding:5px 8px 4px}.uml-header-first-line{display:flex;align-items:center;justify-content:space-between;gap:10px}.uml-header-first-line h3{flex:1 1 auto;min-width:0;margin:0;color:#20282c;text-align:left;font-size:12px;line-height:1.25}.uml-header-first-line h3>span{color:#245f7a;font-family:ui-monospace,monospace;letter-spacing:.04em}.uml-header-description{max-width:620px;margin:2px 0 0;color:#555;text-align:left;font-size:8px}.uml-header-navigation{display:flex;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:6px}.uml-page-continuation{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;min-height:22px;border:1px solid #86a5b3;border-radius:3px;background:#edf7fa;padding:1px 5px;color:#126b8c;font:850 15px/1 ui-monospace,monospace;animation:uml-continuation-pulse 1.15s ease-in-out infinite alternate}.uml-page-continuation i{display:inline-grid;min-width:14px;place-items:center;font-style:normal}@keyframes uml-continuation-pulse{0%{border-color:#9fb5be;background:#f6fafb;color:#4c7180;box-shadow:none}to{border-color:#167ca4;background:#dff2f8;color:#075c7c;box-shadow:0 0 0 2px #8dcde433}}@media(prefers-reduced-motion:reduce){.uml-page-continuation{animation:none}}.uml-phase-actions,.uml-step-actions{display:flex;align-items:center;flex-wrap:wrap;gap:3px}.uml-phase-actions{flex:0 0 auto;flex-wrap:nowrap;justify-content:flex-end;white-space:nowrap}.uml-phase-actions button,.uml-step-actions button,.uml-edit-toggle,.uml-snapshot-cursor button{border:1px solid #aaa;border-radius:2px;background:#fff;color:#444;cursor:pointer;font:600 9px/1.2 ui-monospace,monospace}.uml-edit-toggle{min-width:42px;padding:3px 7px;border:1px solid #8a9ca5;border-radius:2px;background:#f7f9fa;color:#334d59;cursor:pointer;font:750 9px/1.2 ui-monospace,monospace;letter-spacing:.04em}.uml-edit-toggle.is-active{border-color:#b56b16;background:#fff3df;color:#713c00;box-shadow:inset 0 0 0 1px #f0c78f}.uml-phase-actions button{padding:3px 7px}.uml-phase-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64}.uml-step-actions{min-height:0;padding:0;border:0;background:transparent}.uml-step-actions>span{margin-right:4px;color:#555;font:700 9px/1.2 ui-monospace,monospace}.uml-step-actions button{min-width:25px;padding:2px 4px}.uml-step-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-step-actions button[aria-pressed=true]{border-color:#287495;background:#287495;color:#fff}.uml-step-actions button[data-mode=CODE]:after,.uml-step-actions button[data-mode=RUN]:after{margin-left:3px;font-size:7px;letter-spacing:.02em}.uml-step-actions button[data-mode=CODE]:after{content:"C"}.uml-step-actions button[data-mode=RUN]:after{content:"R"}.uml-snapshot-layout{background:#fff;border-bottom:1px solid #ddd}.uml-step-canvas{min-width:0}.uml-step-canvas .uml-svg-host svg{max-height:none}.uml-step-hit{cursor:pointer;fill:transparent}.uml-step-hit-active{fill:#3ea6ce!important;fill-opacity:.08!important}.uml-step-element{transition:fill .12s ease,stroke .12s ease,stroke-width .12s ease}line.uml-step-element-completed:not(.uml-step-element-active){stroke:#258154!important;stroke-width:1.8px!important}polygon.uml-step-element-completed:not(.uml-step-element-active){fill:#258154!important;stroke:#258154!important}text.uml-step-element-completed:not(.uml-step-element-active){fill:#1d7049!important}line.uml-step-element-active{stroke:#087ca8!important;stroke-width:2.6px!important}polygon.uml-step-element-active{fill:#087ca8!important;stroke:#087ca8!important}text.uml-step-element-active{fill:#075d7d!important;font-weight:700!important}.uml-step-hit:focus{outline:none;stroke:#bd554d;stroke-width:.8px;stroke-dasharray:3 3}.uml-class-svg-active>g>*:not(.uml-class-focus-region):not(.uml-class-step-hit):not(.uml-layout-hit):not(.uml-layout-resize){opacity:.62;transition:opacity .12s ease}.uml-class-svg-active .uml-step-element:not(.uml-step-element-active){opacity:.98!important}.uml-class-svg-active text.uml-step-element-tone-a:not(.uml-step-element-active){fill:#174f69!important}.uml-class-svg-active text.uml-step-element-tone-b:not(.uml-step-element-active){fill:#586581!important}.uml-class-svg-active rect.uml-step-element-tone-a:not(.uml-step-element-active){fill:#eaf5f8!important;stroke:#3f7890!important}.uml-class-svg-active rect.uml-step-element-tone-b:not(.uml-step-element-active){fill:#f2eef8!important;stroke:#7b86a1!important}.uml-class-svg-active path.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-a:not(.uml-step-element-active){stroke:#3f7890!important}.uml-class-svg-active path.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-b:not(.uml-step-element-active){stroke:#7b86a1!important}.uml-class-svg-active .uml-step-element-active{opacity:1!important}.uml-class-svg-active text.uml-step-element-active{fill:#b42318!important;font-weight:700!important}.uml-class-svg-active path.uml-step-element-active,.uml-class-svg-active line.uml-step-element-active,.uml-class-svg-active polygon.uml-step-element-active,.uml-class-svg-active rect.uml-step-element-active{stroke:#bd554d!important;stroke-width:1.35px!important}.uml-class-svg-active polygon.uml-step-element-active{fill:#bd554d!important}.uml-class-focus-region{display:none}.uml-step-canvas.is-layout-editing{position:relative;touch-action:none;background-color:#fbfcfd;background-image:linear-gradient(#7d98a20d 1px,transparent 1px),linear-gradient(90deg,#7d98a20d 1px,transparent 1px);background-size:12px 12px}.uml-layout-editing .uml-step-hit,.uml-layout-editing .uml-class-focus-region{pointer-events:none}.uml-layout-hit{fill:#4e9ec4;fill-opacity:.035;stroke:#247a9e;stroke-width:1.1px;stroke-dasharray:5 3;vector-effect:non-scaling-stroke;cursor:grab;pointer-events:all}.uml-layout-hit:hover{fill-opacity:.09;stroke-width:1.6px}.uml-layout-hit.is-selected{fill:#f7a928;fill-opacity:.08;stroke:#b66b00;stroke-width:1.8px;stroke-dasharray:none}.uml-layout-hit:active{cursor:grabbing}.uml-layout-resize{fill:#fff;stroke:#b66b00;stroke-width:1.5px;vector-effect:non-scaling-stroke;cursor:nwse-resize;pointer-events:all}.uml-layout-editor{display:grid;grid-template-columns:minmax(140px,.8fr) minmax(240px,1.8fr) minmax(260px,1.4fr);gap:7px 10px;align-items:end;padding:8px 10px 9px;border-top:2px solid #b97822;background:#f7f5f0;color:#26343a;text-align:left;font:10px/1.3 system-ui,sans-serif}.uml-layout-editor-title{grid-column:1/-1;display:flex;align-items:baseline;gap:9px}.uml-layout-editor-title strong{color:#713c00;font:800 11px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor-title span{color:#65737a}.uml-layout-editor-title b{margin-left:auto;color:#9c2f1b;font-size:9px}.uml-layout-editor label{display:grid;gap:2px;color:#52636b;font:700 8px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor input,.uml-layout-editor select,.uml-layout-editor textarea{box-sizing:border-box;width:100%;min-width:0;border:1px solid #9ca9ae;border-radius:2px;background:#fff;color:#172126;padding:4px 5px;font:10px/1.25 ui-monospace,monospace;text-transform:none}.uml-layout-editor textarea{resize:vertical;line-height:1.35}.uml-layout-number-grid,.uml-layout-style-grid{display:grid;gap:5px}.uml-layout-number-grid{grid-template-columns:repeat(4,minmax(48px,1fr))}.uml-layout-style-grid{grid-template-columns:repeat(5,minmax(54px,1fr))}.uml-layout-editor-text{align-self:stretch}.uml-layout-editor input[type=color]{min-height:27px;padding:2px}.uml-layout-editor-actions{grid-column:1/-1;display:flex;gap:5px}.uml-layout-editor-actions button{border:1px solid #87979f;border-radius:2px;background:#fff;color:#283940;padding:4px 8px;cursor:pointer;font:700 9px/1.2 ui-monospace,monospace}.uml-layout-editor-actions button.is-primary{border-color:#287495;background:#287495;color:#fff}.uml-layout-editor-actions button.is-danger{margin-left:auto;border-color:#a26156;color:#812b1c}.uml-layout-editor-actions button:disabled{opacity:.45;cursor:not-allowed}.uml-layout-editor output{grid-column:1/-1;min-height:1.2em;color:#52636b;font:9px/1.25 ui-monospace,monospace}@media(max-width:900px){.uml-layout-editor{grid-template-columns:1fr}.uml-layout-editor-title,.uml-layout-editor-actions,.uml-layout-editor output{grid-column:1}}@media print{.uml-edit-toggle,.uml-layout-editor,.uml-layout-hit,.uml-layout-resize{display:none!important}}.uml-snapshot-panel{display:grid;gap:8px;min-width:0;padding:8px;background:#fafafa;font-size:10px}.uml-snapshot-panel>header{display:flex;justify-content:space-between;gap:8px;align-items:center}.uml-snapshot-panel>header>div:first-child>span,.uml-snapshot-panel>header>div:first-child>strong{display:block}.uml-snapshot-panel>header>div:first-child>span{color:#5a5a5a;font:700 9px/1.2 ui-monospace,monospace}.uml-snapshot-panel>header>div:first-child>strong{font-size:12px}.uml-snapshot-panel>header>div:first-child>strong code{display:inline-block;min-width:24px;color:#075d7d}.uml-snapshot-cursor{display:flex;align-items:center;gap:4px}.uml-snapshot-cursor button{width:23px;height:23px;padding:0}.uml-snapshot-cursor button:disabled{opacity:.35;cursor:default}.uml-snapshot-cursor output{min-width:34px;text-align:center;font:700 9px/1 ui-monospace,monospace}.uml-snapshot-description{margin:0;color:#333}.uml-snapshot-panel section{min-width:0;border:1px solid #d0d0d0;background:#fff;padding:7px}.uml-snapshot-panel h4{margin:0 0 4px;color:#315f78;font:700 9px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-state-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;min-width:0}.uml-snapshot-registers dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;margin:0}.uml-snapshot-registers dl>div{display:grid;grid-template-columns:auto 1fr;gap:5px;min-width:0;padding:2px 4px;border-left:2px solid #bbb;background:#f6f6f6}.uml-snapshot-registers dl>div.primary{grid-column:1/-1;border-color:#287495;background:#edf7fb}.uml-snapshot-registers dt{color:#555;font-weight:700}.uml-snapshot-registers dd,.uml-snapshot-variables dd,.uml-snapshot-memory dd{min-width:0;margin:0;overflow-wrap:anywhere;text-align:right;font:600 9px/1.25 ui-monospace,monospace}.uml-snapshot-variables dl{display:grid;gap:3px;margin:0}.uml-snapshot-variables dl>div{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:5px;padding:3px 5px;border-left:2px solid #5f899b;background:#f5f8f9}.uml-snapshot-variables dt{font-weight:700}.uml-snapshot-variables dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-variables [data-state=uninitialised],.uml-stack-lane article[data-state=uninitialised]{color:#777;background:#f5f5f5}.uml-snapshot-variables [data-state=uninitialised] dt:after,.uml-stack-lane article[data-state=uninitialised]>strong:after{content:" ?";color:#9a6a00}.uml-arena-snapshot>div{position:relative;height:10px;border:1px solid #666;background:repeating-linear-gradient(90deg,#fff 0 7px,#eee 7px 8px)}.uml-arena-snapshot>div span{display:block;height:100%;background:#b8ddeb}.uml-arena-snapshot>div i{position:absolute;top:-3px;bottom:-3px;width:2px;background:#075d7d;transform:translate(-1px)}.uml-arena-snapshot>p{display:grid;grid-template-columns:1fr auto 1fr;gap:4px;margin:3px 0;font-size:8px}.uml-arena-snapshot>p code:last-child{text-align:right}.uml-arena-bytes{display:block;margin-bottom:4px;overflow-wrap:anywhere;color:#666;font-size:8px}.uml-snapshot-memory dl{display:grid;gap:2px;margin:0}.uml-snapshot-memory dl>div{display:grid;grid-template-columns:1fr auto;gap:4px;padding-top:2px;border-top:1px solid #eee}.uml-snapshot-memory dt{font-weight:700}.uml-snapshot-memory dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-stack>header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.uml-snapshot-stack>header>p{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px 9px;margin:0;color:#555;font-size:8px}.uml-stack-axis{display:flex;justify-content:space-between;gap:8px;margin:3px 89px 2px;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-stack-lane{display:flex;align-items:stretch;min-width:0;overflow-x:auto;border:1px solid #66757c;background:#eef1f2}.uml-stack-boundary{display:grid;place-content:center;flex:0 1 82px;min-width:64px;padding:5px;background:#273941;color:#fff;text-align:center;font:700 8px/1.25 ui-monospace,monospace}.uml-stack-boundary small{color:#a9d9eb;font-size:8px;text-transform:uppercase}.uml-stack-gap{display:grid;place-content:center;flex:.7 1 70px;min-width:60px;min-height:52px;border-right:1px dashed #9da8ad;color:#78858b;text-align:center;font:8px/1.2 ui-monospace,monospace}.uml-stack-gap strong,.uml-stack-gap small{display:block}.uml-stack-gap strong{color:#52636b}.uml-stack-gap small{color:#78858b;font-size:8px}.uml-stack-lane article{display:grid;align-content:center;flex:1 1 92px;min-width:76px;padding:5px 7px;border-right:1px solid #9da8ad;background:#fff;text-align:center}.uml-stack-lane article[data-state=initialised]{border-top:3px solid #2c8060}.uml-stack-lane article[data-state=saved]{border-top:3px solid #6d7196;background:#f7f6fb}.uml-stack-lane article strong,.uml-stack-lane article code,.uml-stack-lane article small{display:block;overflow-wrap:anywhere}.uml-stack-lane article strong{font:700 9px/1.2 ui-monospace,monospace}.uml-stack-lane article code{margin:2px 0;color:#1f4555;font-size:8px}.uml-stack-lane article small{color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-observation p{margin:0 0 3px}.uml-snapshot-observation small{display:block;overflow-wrap:anywhere;color:#666;font:8px/1.3 ui-monospace,monospace}.task-conclusion{margin:8px 0 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;color:#315f78;font:700 10px/1.2 ui-monospace,monospace}.task-conclusion p{margin:0}.asset-source-link{display:inline-block;margin:5px 0;color:#315f78;font:600 11px/1.3 system-ui,sans-serif}.section-sheet--asset .section-heading{align-items:baseline;margin:0 0 1.5mm}.section-sheet--asset .section-heading .section-index{margin-right:4mm;color:#68757b;font-size:10px;font-weight:600}.section-sheet--asset .section-heading .section-title{color:#20282c;font:750 13px/1.2 system-ui,sans-serif}.section-sheet--asset .card-section>p{max-width:110ch;margin:0 0 2mm;color:#58656b;font:9px/1.3 system-ui,sans-serif}.section-sheet--asset .card-asset{margin-top:2mm}.lesson-progress-control{display:inline-flex;align-items:center;margin-right:7px;padding:2px 7px;border:1px solid #8c8c8c;border-radius:12px;background:#fff;cursor:pointer}.lesson-progress-control:disabled{cursor:wait;opacity:.6}.lesson-progress-control[data-status=approved]{background:#e7f6ed;border-color:#18794e}.lesson-progress-topbar{display:flex;flex:none;align-items:center;gap:5px;min-width:0;padding-left:7px;border-left:1px solid #a9b3b8;color:#33444c;font:650 10px/1.2 system-ui,sans-serif;white-space:nowrap}.lesson-progress-topbar strong{color:#52636b;font:800 9px/1 ui-monospace,monospace;letter-spacing:.05em}.lesson-progress-topbar output{min-width:3.8ch;border:1px solid #91a1a8;border-radius:999px;background:#fff;padding:2px 6px;color:#1e566e;text-align:center;font:800 9px/1 ui-monospace,monospace}.lesson-progress-topbar a{color:#245f7a;text-decoration:none}.lesson-progress-topbar a:hover,.lesson-progress-topbar a:focus-visible{text-decoration:underline}.lesson-progress-error{color:#9b1c1c;font-weight:900}.step-row{display:flex;align-items:center;margin:4px 0}.section-anchor{position:relative;top:-45px}.app-load-error{max-width:760px;margin:10vh auto;padding:24px;border:1px solid #9b1c1c;background:#fff;font-family:system-ui,sans-serif}.app-load-error pre{white-space:pre-wrap}@media(max-width:800px){.viewpoint-bar{grid-template-columns:repeat(4,minmax(0,1fr))}.viewpoint-bar button{min-height:28px}.card-library-toggle>span:last-child{display:none}.card-library-toggle{gap:4px;padding-inline:6px}.topbar-nvim-meta{display:none}.topbar-nvim-section .nvim-control-indicator{max-width:42vw;overflow:hidden;text-overflow:ellipsis}.nvim-shortcut-strip,.nvim-work-indicator{display:none}.allocator-panel>header{grid-template-columns:auto 1fr}.allocator-panel>header>small{display:none}.allocator-panel-body{grid-template-columns:1fr}.allocator-metrics,.allocator-facts{display:none}.memory-lanes{grid-template-columns:1fr 1fr}.memory-react>header,.uml-react>header{align-items:flex-start;flex-direction:column}.uml-header-first-line,.uml-header-navigation{width:100%;align-items:flex-start;flex-direction:column}.uml-header-navigation{gap:4px}.memory-actions{justify-content:flex-start}.uml-snapshot-layout{display:block}.uml-step-canvas{border:0}.uml-phase-actions{width:100%;justify-content:flex-end}.uml-state-grid{grid-template-columns:1fr}.uml-snapshot-stack>header{align-items:flex-start;flex-direction:column}.uml-snapshot-stack>header>p{justify-content:flex-start}.uml-stack-axis{margin-right:0;margin-left:0}}@media print{@page card-portrait{size:A4 portrait;margin:0}@page card-landscape{size:A4 landscape;margin:0}.sheet--portrait{page:card-portrait}.sheet--landscape{page:card-landscape}.paper{display:block;gap:0}.paper>.sheet,.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet,.paper>.sheet-spread>.sheet>.sheet-content{height:auto;min-height:0;max-height:none;overflow:visible}.sheet-spread{display:contents!important}.viewer-chrome,.side-panel-dock,.memory-react{display:none!important}.asset-static-fallback{display:block!important;width:100%}.uml-actions,.uml-phase-actions,.uml-step-actions,.uml-snapshot-panel,.uml-stage,.uml-approval,.asset-source-link,.lesson-progress-topbar,.lesson-progress-control,.uml-page-continuation{display:none!important}} diff --git a/web/app.js b/web/app.js new file mode 100644 index 0000000..c1573ef --- /dev/null +++ b/web/app.js @@ -0,0 +1,61 @@ +var Pp=Object.create;var ks=Object.defineProperty;var Tp=Object.getOwnPropertyDescriptor;var Mp=Object.getOwnPropertyNames;var Rp=Object.getPrototypeOf,Op=Object.prototype.hasOwnProperty;var $t=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var $p=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Mp(t))!Op.call(e,o)&&o!==n&&ks(e,o,{get:()=>t[o],enumerable:!(r=Tp(t,o))||r.enumerable});return e};var bo=(e,t,n)=>(n=e!=null?Pp(Rp(e)):{},$p(t||!e||!e.__esModule?ks(n,"default",{value:e,enumerable:!0}):n,e));var Rs=$t(W=>{"use strict";var xr=Symbol.for("react.element"),Ip=Symbol.for("react.portal"),Fp=Symbol.for("react.fragment"),Dp=Symbol.for("react.strict_mode"),jp=Symbol.for("react.profiler"),Up=Symbol.for("react.provider"),Vp=Symbol.for("react.context"),Bp=Symbol.for("react.forward_ref"),Hp=Symbol.for("react.suspense"),Kp=Symbol.for("react.memo"),Wp=Symbol.for("react.lazy"),Ss=Symbol.iterator;function Gp(e){return e===null||typeof e!="object"?null:(e=Ss&&e[Ss]||e["@@iterator"],typeof e=="function"?e:null)}var _s={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Cs=Object.assign,Ls={};function Vn(e,t,n){this.props=e,this.context=t,this.refs=Ls,this.updater=n||_s}Vn.prototype.isReactComponent={};Vn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Vn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function zs(){}zs.prototype=Vn.prototype;function Qi(e,t,n){this.props=e,this.context=t,this.refs=Ls,this.updater=n||_s}var qi=Qi.prototype=new zs;qi.constructor=Qi;Cs(qi,Vn.prototype);qi.isPureReactComponent=!0;var Ns=Array.isArray,As=Object.prototype.hasOwnProperty,Xi={current:null},Ps={key:!0,ref:!0,__self:!0,__source:!0};function Ts(e,t,n){var r,o={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)As.call(t,r)&&!Ps.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1{"use strict";Os.exports=Rs()});var Ks=$t(le=>{"use strict";function nl(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(0>>1;rEo(s,n))uEo(d,s)?(e[r]=d,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else if(uEo(d,n))e[r]=d,e[u]=n,r=u;else break e}}return t}function Eo(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?($s=performance,le.unstable_now=function(){return $s.now()}):(Ji=Date,Is=Ji.now(),le.unstable_now=function(){return Ji.now()-Is});var $s,Ji,Is,At=[],Zt=[],Zp=1,mt=null,Oe=3,Lo=!1,kn=!1,wr=!1,js=typeof setTimeout=="function"?setTimeout:null,Us=typeof clearTimeout=="function"?clearTimeout:null,Fs=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function rl(e){for(var t=wt(Zt);t!==null;){if(t.callback===null)Co(Zt);else if(t.startTime<=e)Co(Zt),t.sortIndex=t.expirationTime,nl(At,t);else break;t=wt(Zt)}}function ol(e){if(wr=!1,rl(e),!kn)if(wt(At)!==null)kn=!0,ll(il);else{var t=wt(Zt);t!==null&&al(ol,t.startTime-e)}}function il(e,t){kn=!1,wr&&(wr=!1,Us(kr),kr=-1),Lo=!0;var n=Oe;try{for(rl(t),mt=wt(At);mt!==null&&(!(mt.expirationTime>t)||e&&!Hs());){var r=mt.callback;if(typeof r=="function"){mt.callback=null,Oe=mt.priorityLevel;var o=r(mt.expirationTime<=t);t=le.unstable_now(),typeof o=="function"?mt.callback=o:mt===wt(At)&&Co(At),rl(t)}else Co(At);mt=wt(At)}if(mt!==null)var i=!0;else{var l=wt(Zt);l!==null&&al(ol,l.startTime-t),i=!1}return i}finally{mt=null,Oe=n,Lo=!1}}var zo=!1,_o=null,kr=-1,Vs=5,Bs=-1;function Hs(){return!(le.unstable_now()-Bse||125r?(e.sortIndex=n,nl(Zt,e),wt(At)===null&&e===wt(Zt)&&(wr?(Us(kr),kr=-1):wr=!0,al(ol,n-r))):(e.sortIndex=o,nl(At,e),kn||Lo||(kn=!0,ll(il))),e};le.unstable_shouldYield=Hs;le.unstable_wrapCallback=function(e){var t=Oe;return function(){var n=Oe;Oe=t;try{return e.apply(this,arguments)}finally{Oe=n}}}});var Gs=$t((uh,Ws)=>{"use strict";Ws.exports=Ks()});var Xd=$t(lt=>{"use strict";var Jp=No(),ot=Gs();function z(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Al=Object.prototype.hasOwnProperty,em=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Ys={},Qs={};function tm(e){return Al.call(Qs,e)?!0:Al.call(Ys,e)?!1:em.test(e)?Qs[e]=!0:(Ys[e]=!0,!1)}function nm(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function rm(e,t,n,r){if(t===null||typeof t>"u"||nm(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function We(e,t,n,r,o,i,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=l}var Me={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Me[e]=new We(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Me[t]=new We(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Me[e]=new We(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Me[e]=new We(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Me[e]=new We(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Me[e]=new We(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Me[e]=new We(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Me[e]=new We(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Me[e]=new We(e,5,!1,e.toLowerCase(),null,!1,!1)});var ka=/[\-:]([a-z])/g;function Sa(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Me[e]=new We(e,1,!1,e.toLowerCase(),null,!1,!1)});Me.xlinkHref=new We("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Me[e]=new We(e,1,!1,e.toLowerCase(),null,!0,!0)});function Na(e,t,n,r){var o=Me.hasOwnProperty(t)?Me[t]:null;(o!==null?o.type!==0:r||!(2s||o[l]!==i[s]){var u=` +`+o[l].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=l&&0<=s);break}}}finally{ul=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Pr(e):""}function om(e){switch(e.tag){case 5:return Pr(e.type);case 16:return Pr("Lazy");case 13:return Pr("Suspense");case 19:return Pr("SuspenseList");case 0:case 2:case 15:return e=cl(e.type,!1),e;case 11:return e=cl(e.type.render,!1),e;case 1:return e=cl(e.type,!0),e;default:return""}}function Rl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Wn:return"Fragment";case Kn:return"Portal";case Pl:return"Profiler";case Ea:return"StrictMode";case Tl:return"Suspense";case Ml:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case nc:return(e.displayName||"Context")+".Consumer";case tc:return(e._context.displayName||"Context")+".Provider";case _a:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Ca:return t=e.displayName||null,t!==null?t:Rl(e.type)||"Memo";case en:t=e._payload,e=e._init;try{return Rl(e(t))}catch{}}return null}function im(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Rl(t);case 8:return t===Ea?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function gn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function oc(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function lm(e){var t=oc(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(l){r=""+l,i.call(this,l)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Po(e){e._valueTracker||(e._valueTracker=lm(e))}function ic(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=oc(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function ii(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ol(e,t){var n=t.checked;return ve({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Xs(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=gn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function lc(e,t){t=t.checked,t!=null&&Na(e,"checked",t,!1)}function $l(e,t){lc(e,t);var n=gn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Il(e,t.type,n):t.hasOwnProperty("defaultValue")&&Il(e,t.type,gn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Zs(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Il(e,t,n){(t!=="number"||ii(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Tr=Array.isArray;function rr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=To.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Kr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Or={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},am=["Webkit","ms","Moz","O"];Object.keys(Or).forEach(function(e){am.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Or[t]=Or[e]})});function cc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Or.hasOwnProperty(e)&&Or[e]?(""+t).trim():t+"px"}function dc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=cc(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var sm=ve({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jl(e,t){if(t){if(sm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(z(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(z(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(z(61))}if(t.style!=null&&typeof t.style!="object")throw Error(z(62))}}function Ul(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Vl=null;function La(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Bl=null,or=null,ir=null;function tu(e){if(e=uo(e)){if(typeof Bl!="function")throw Error(z(280));var t=e.stateNode;t&&(t=Mi(t),Bl(e.stateNode,e.type,t))}}function pc(e){or?ir?ir.push(e):ir=[e]:or=e}function mc(){if(or){var e=or,t=ir;if(ir=or=null,tu(e),t)for(e=0;e>>=0,e===0?32:31-(xm(e)/bm|0)|0}var Mo=64,Ro=4194304;function Mr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ui(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,l=n&268435455;if(l!==0){var s=l&~o;s!==0?r=Mr(s):(i&=l,i!==0&&(r=Mr(i)))}else l=n&~o,l!==0?r=Mr(l):i!==0&&(r=Mr(i));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,i=t&-t,o>=i||o===16&&(i&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function ao(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-_t(t),e[t]=n}function Nm(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Ir),cu=" ",du=!1;function Mc(e,t){switch(e){case"keyup":return Zm.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Rc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Gn=!1;function ef(e,t){switch(e){case"compositionend":return Rc(t);case"keypress":return t.which!==32?null:(du=!0,cu);case"textInput":return e=t.data,e===cu&&du?null:e;default:return null}}function tf(e,t){if(Gn)return e==="compositionend"||!$a&&Mc(e,t)?(e=Pc(),qo=Ma=on=null,Gn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=fu(n)}}function Fc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Fc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dc(){for(var e=window,t=ii();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ii(e.document)}return t}function Ia(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function df(e){var t=Dc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Fc(n.ownerDocument.documentElement,n)){if(r!==null&&Ia(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=r.end===void 0?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=gu(n,i);var l=gu(n,r);o&&l&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Yn=null,Ql=null,Dr=null,ql=!1;function hu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ql||Yn==null||Yn!==ii(r)||(r=Yn,"selectionStart"in r&&Ia(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Dr&&Xr(Dr,r)||(Dr=r,r=pi(Ql,"onSelect"),0Xn||(e.current=na[Xn],na[Xn]=null,Xn--)}function ae(e,t){Xn++,na[Xn]=e.current,e.current=t}var hn={},De=vn(hn),Xe=vn(!1),An=hn;function cr(e,t){var n=e.type.contextTypes;if(!n)return hn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},i;for(i in n)o[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Ze(e){return e=e.childContextTypes,e!=null}function fi(){de(Xe),de(De)}function Eu(e,t,n){if(De.current!==hn)throw Error(z(168));ae(De,t),ae(Xe,n)}function Yc(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(z(108,im(e)||"Unknown",o));return ve({},n,r)}function gi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||hn,An=De.current,ae(De,e),ae(Xe,Xe.current),!0}function _u(e,t,n){var r=e.stateNode;if(!r)throw Error(z(169));n?(e=Yc(e,t,An),r.__reactInternalMemoizedMergedChildContext=e,de(Xe),de(De),ae(De,e)):de(Xe),ae(Xe,n)}var Ft=null,Ri=!1,wl=!1;function Qc(e){Ft===null?Ft=[e]:Ft.push(e)}function wf(e){Ri=!0,Qc(e)}function xn(){if(!wl&&Ft!==null){wl=!0;var e=0,t=ee;try{var n=Ft;for(ee=1;e>=l,o-=l,Dt=1<<32-_t(t)+o|n<R?(j=T,T=null):j=T.sibling;var I=g(p,T,h[R],k);if(I===null){T===null&&(T=j);break}e&&T&&I.alternate===null&&t(p,T),c=i(I,c,R),P===null?C=I:P.sibling=I,P=I,T=j}if(R===h.length)return n(p,T),pe&&Sn(p,R),C;if(T===null){for(;RR?(j=T,T=null):j=T.sibling;var ke=g(p,T,I.value,k);if(ke===null){T===null&&(T=j);break}e&&T&&ke.alternate===null&&t(p,T),c=i(ke,c,R),P===null?C=ke:P.sibling=ke,P=ke,T=j}if(I.done)return n(p,T),pe&&Sn(p,R),C;if(T===null){for(;!I.done;R++,I=h.next())I=y(p,I.value,k),I!==null&&(c=i(I,c,R),P===null?C=I:P.sibling=I,P=I);return pe&&Sn(p,R),C}for(T=r(p,T);!I.done;R++,I=h.next())I=f(T,p,R,I.value,k),I!==null&&(e&&I.alternate!==null&&T.delete(I.key===null?R:I.key),c=i(I,c,R),P===null?C=I:P.sibling=I,P=I);return e&&T.forEach(function(re){return t(p,re)}),pe&&Sn(p,R),C}function _(p,c,h,k){if(typeof h=="object"&&h!==null&&h.type===Wn&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Ao:e:{for(var C=h.key,P=c;P!==null;){if(P.key===C){if(C=h.type,C===Wn){if(P.tag===7){n(p,P.sibling),c=o(P,h.props.children),c.return=p,p=c;break e}}else if(P.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===en&&zu(C)===P.type){n(p,P.sibling),c=o(P,h.props),c.ref=Cr(p,P,h),c.return=p,p=c;break e}n(p,P);break}else t(p,P);P=P.sibling}h.type===Wn?(c=zn(h.props.children,p.mode,k,h.key),c.return=p,p=c):(k=oi(h.type,h.key,h.props,null,p.mode,k),k.ref=Cr(p,c,h),k.return=p,p=k)}return l(p);case Kn:e:{for(P=h.key;c!==null;){if(c.key===P)if(c.tag===4&&c.stateNode.containerInfo===h.containerInfo&&c.stateNode.implementation===h.implementation){n(p,c.sibling),c=o(c,h.children||[]),c.return=p,p=c;break e}else{n(p,c);break}else t(p,c);c=c.sibling}c=zl(h,p.mode,k),c.return=p,p=c}return l(p);case en:return P=h._init,_(p,c,P(h._payload),k)}if(Tr(h))return E(p,c,h,k);if(Sr(h))return b(p,c,h,k);Ko(p,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,c!==null&&c.tag===6?(n(p,c.sibling),c=o(c,h),c.return=p,p=c):(n(p,c),c=Ll(h,p.mode,k),c.return=p,p=c),l(p)):n(p,c)}return _}var pr=Jc(!0),ed=Jc(!1),vi=vn(null),xi=null,er=null,Ua=null;function Va(){Ua=er=xi=null}function Ba(e){var t=vi.current;de(vi),e._currentValue=t}function ia(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function ar(e,t){xi=e,Ua=er=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(qe=!0),e.firstContext=null)}function vt(e){var t=e._currentValue;if(Ua!==e)if(e={context:e,memoizedValue:t,next:null},er===null){if(xi===null)throw Error(z(308));er=e,xi.dependencies={lanes:0,firstContext:e}}else er=er.next=e;return t}var _n=null;function Ha(e){_n===null?_n=[e]:_n.push(e)}function td(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Ha(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ht(e,r)}function Ht(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var tn=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function nd(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ut(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function dn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Y&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ht(e,n)}return o=r.interleaved,o===null?(t.next=t,Ha(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ht(e,n)}function Zo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Aa(e,n)}}function Au(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var l={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?o=i=l:i=i.next=l,n=n.next}while(n!==null);i===null?o=i=t:i=i.next=t}else o=i=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function bi(e,t,n,r){var o=e.updateQueue;tn=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(s!==null){o.shared.pending=null;var u=s,d=u.next;u.next=null,l===null?i=d:l.next=d,l=u;var m=e.alternate;m!==null&&(m=m.updateQueue,s=m.lastBaseUpdate,s!==l&&(s===null?m.firstBaseUpdate=d:s.next=d,m.lastBaseUpdate=u))}if(i!==null){var y=o.baseState;l=0,m=d=u=null,s=i;do{var g=s.lane,f=s.eventTime;if((r&g)===g){m!==null&&(m=m.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var E=e,b=s;switch(g=t,f=n,b.tag){case 1:if(E=b.payload,typeof E=="function"){y=E.call(f,y,g);break e}y=E;break e;case 3:E.flags=E.flags&-65537|128;case 0:if(E=b.payload,g=typeof E=="function"?E.call(f,y,g):E,g==null)break e;y=ve({},y,g);break e;case 2:tn=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,g=o.effects,g===null?o.effects=[s]:g.push(s))}else f={eventTime:f,lane:g,tag:s.tag,payload:s.payload,callback:s.callback,next:null},m===null?(d=m=f,u=y):m=m.next=f,l|=g;if(s=s.next,s===null){if(s=o.shared.pending,s===null)break;g=s,s=g.next,g.next=null,o.lastBaseUpdate=g,o.shared.pending=null}}while(!0);if(m===null&&(u=y),o.baseState=u,o.firstBaseUpdate=d,o.lastBaseUpdate=m,t=o.shared.interleaved,t!==null){o=t;do l|=o.lane,o=o.next;while(o!==t)}else i===null&&(o.shared.lanes=0);Mn|=l,e.lanes=l,e.memoizedState=y}}function Pu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Sl.transition;Sl.transition={};try{e(!1),t()}finally{ee=n,Sl.transition=r}}function xd(){return xt().memoizedState}function Ef(e,t,n){var r=mn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},bd(e))wd(t,n);else if(n=td(e,t,n,r),n!==null){var o=Ke();Ct(n,e,r,o),kd(n,t,r)}}function _f(e,t,n){var r=mn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(bd(e))wd(t,o);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var l=t.lastRenderedState,s=i(l,n);if(o.hasEagerState=!0,o.eagerState=s,Lt(s,l)){var u=t.interleaved;u===null?(o.next=o,Ha(t)):(o.next=u.next,u.next=o),t.interleaved=o;return}}catch{}finally{}n=td(e,t,o,r),n!==null&&(o=Ke(),Ct(n,e,r,o),kd(n,t,r))}}function bd(e){var t=e.alternate;return e===ye||t!==null&&t===ye}function wd(e,t){jr=ki=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function kd(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Aa(e,n)}}var Si={readContext:vt,useCallback:$e,useContext:$e,useEffect:$e,useImperativeHandle:$e,useInsertionEffect:$e,useLayoutEffect:$e,useMemo:$e,useReducer:$e,useRef:$e,useState:$e,useDebugValue:$e,useDeferredValue:$e,useTransition:$e,useMutableSource:$e,useSyncExternalStore:$e,useId:$e,unstable_isNewReconciler:!1},Cf={readContext:vt,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:vt,useEffect:Mu,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ei(4194308,4,fd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ei(4194308,4,e,t)},useInsertionEffect:function(e,t){return ei(4,2,e,t)},useMemo:function(e,t){var n=Tt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Tt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Ef.bind(null,ye,e),[r.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:Tu,useDebugValue:Ja,useDeferredValue:function(e){return Tt().memoizedState=e},useTransition:function(){var e=Tu(!1),t=e[0];return e=Nf.bind(null,e[1]),Tt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ye,o=Tt();if(pe){if(n===void 0)throw Error(z(407));n=n()}else{if(n=t(),Ae===null)throw Error(z(349));(Tn&30)!==0||ld(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Mu(sd.bind(null,r,i,e),[e]),r.flags|=2048,io(9,ad.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Tt(),t=Ae.identifierPrefix;if(pe){var n=jt,r=Dt;n=(r&~(1<<32-_t(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ro++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),n==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[Mt]=t,e[eo]=r,Td(e,t,!1,!1),t.stateNode=e;e:{switch(l=Ul(n,r),n){case"dialog":ce("cancel",e),ce("close",e),o=r;break;case"iframe":case"object":case"embed":ce("load",e),o=r;break;case"video":case"audio":for(o=0;ogr&&(t.flags|=128,r=!0,Lr(i,!1),t.lanes=4194304)}else{if(!r)if(e=wi(l),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Lr(i,!0),i.tail===null&&i.tailMode==="hidden"&&!l.alternate&&!pe)return Ie(t),null}else 2*we()-i.renderingStartTime>gr&&n!==1073741824&&(t.flags|=128,r=!0,Lr(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(n=i.last,n!==null?n.sibling=l:t.child=l,i.last=l)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=we(),t.sibling=null,n=he.current,ae(he,r?n&1|2:n&1),t):(Ie(t),null);case 22:case 23:return is(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(tt&1073741824)!==0&&(Ie(t),t.subtreeFlags&6&&(t.flags|=8192)):Ie(t),null;case 24:return null;case 25:return null}throw Error(z(156,t.tag))}function Of(e,t){switch(Da(t),t.tag){case 1:return Ze(t.type)&&fi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return mr(),de(Xe),de(De),Ya(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ga(t),null;case 13:if(de(he),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(z(340));dr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return de(he),null;case 4:return mr(),null;case 10:return Ba(t.type._context),null;case 22:case 23:return is(),null;case 24:return null;default:return null}}var Go=!1,Fe=!1,$f=typeof WeakSet=="function"?WeakSet:Set,$=null;function tr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){be(e,t,r)}else n.current=null}function fa(e,t,n){try{n()}catch(r){be(e,t,r)}}var Hu=!1;function If(e,t){if(Xl=ci,e=Dc(),Ia(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var l=0,s=-1,u=-1,d=0,m=0,y=e,g=null;t:for(;;){for(var f;y!==n||o!==0&&y.nodeType!==3||(s=l+o),y!==i||r!==0&&y.nodeType!==3||(u=l+r),y.nodeType===3&&(l+=y.nodeValue.length),(f=y.firstChild)!==null;)g=y,y=f;for(;;){if(y===e)break t;if(g===n&&++d===o&&(s=l),g===i&&++m===r&&(u=l),(f=y.nextSibling)!==null)break;y=g,g=y.parentNode}y=f}n=s===-1||u===-1?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Zl={focusedElem:e,selectionRange:n},ci=!1,$=t;$!==null;)if(t=$,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,$=e;else for(;$!==null;){t=$;try{var E=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(E!==null){var b=E.memoizedProps,_=E.memoizedState,p=t.stateNode,c=p.getSnapshotBeforeUpdate(t.elementType===t.type?b:St(t.type,b),_);p.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(z(163))}}catch(k){be(t,t.return,k)}if(e=t.sibling,e!==null){e.return=t.return,$=e;break}$=t.return}return E=Hu,Hu=!1,E}function Ur(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,i!==void 0&&fa(t,n,i)}o=o.next}while(o!==r)}}function Ii(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ga(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Od(e){var t=e.alternate;t!==null&&(e.alternate=null,Od(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Mt],delete t[eo],delete t[ta],delete t[xf],delete t[bf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Ku(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ha(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=mi));else if(r!==4&&(e=e.child,e!==null))for(ha(e,t,n),e=e.sibling;e!==null;)ha(e,t,n),e=e.sibling}function ya(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ya(e,t,n),e=e.sibling;e!==null;)ya(e,t,n),e=e.sibling}var Pe=null,Nt=!1;function Jt(e,t,n){for(n=n.child;n!==null;)Id(e,t,n),n=n.sibling}function Id(e,t,n){if(Rt&&typeof Rt.onCommitFiberUnmount=="function")try{Rt.onCommitFiberUnmount(zi,n)}catch{}switch(n.tag){case 5:Fe||tr(n,t);case 6:var r=Pe,o=Nt;Pe=null,Jt(e,t,n),Pe=r,Nt=o,Pe!==null&&(Nt?(e=Pe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Pe.removeChild(n.stateNode));break;case 18:Pe!==null&&(Nt?(e=Pe,n=n.stateNode,e.nodeType===8?bl(e.parentNode,n):e.nodeType===1&&bl(e,n),Qr(e)):bl(Pe,n.stateNode));break;case 4:r=Pe,o=Nt,Pe=n.stateNode.containerInfo,Nt=!0,Jt(e,t,n),Pe=r,Nt=o;break;case 0:case 11:case 14:case 15:if(!Fe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var i=o,l=i.destroy;i=i.tag,l!==void 0&&((i&2)!==0||(i&4)!==0)&&fa(n,t,l),o=o.next}while(o!==r)}Jt(e,t,n);break;case 1:if(!Fe&&(tr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){be(n,t,s)}Jt(e,t,n);break;case 21:Jt(e,t,n);break;case 22:n.mode&1?(Fe=(r=Fe)||n.memoizedState!==null,Jt(e,t,n),Fe=r):Jt(e,t,n);break;default:Jt(e,t,n)}}function Wu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new $f),t.forEach(function(r){var o=Wf.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function kt(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=l),r&=~i}if(r=o,r=we()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Df(r/1960))-r,10e?16:e,ln===null)var r=!1;else{if(e=ln,ln=null,_i=0,(Y&6)!==0)throw Error(z(331));var o=Y;for(Y|=4,$=e.current;$!==null;){var i=$,l=i.child;if(($.flags&16)!==0){var s=i.deletions;if(s!==null){for(var u=0;uwe()-rs?Ln(e,0):ns|=n),Je(e,t)}function Kd(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ro,Ro<<=1,(Ro&130023424)===0&&(Ro=4194304)));var n=Ke();e=Ht(e,t),e!==null&&(ao(e,t,n),Je(e,n))}function Kf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Kd(e,n)}function Wf(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(z(314))}r!==null&&r.delete(t),Kd(e,n)}var Wd;Wd=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Xe.current)qe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return qe=!1,Mf(e,t,n);qe=(e.flags&131072)!==0}else qe=!1,pe&&(t.flags&1048576)!==0&&qc(t,yi,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ti(e,t),e=t.pendingProps;var o=cr(t,De.current);ar(t,n),o=qa(null,t,r,e,o,n);var i=Xa();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ze(r)?(i=!0,gi(t)):i=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Ka(t),o.updater=$i,t.stateNode=o,o._reactInternals=t,aa(t,r,e,n),t=ca(null,t,r,!0,i,n)):(t.tag=0,pe&&i&&Fa(t),He(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ti(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=Yf(r),e=St(r,e),o){case 0:t=ua(null,t,r,e,n);break e;case 1:t=Uu(null,t,r,e,n);break e;case 11:t=Du(null,t,r,e,n);break e;case 14:t=ju(null,t,r,St(r.type,e),n);break e}throw Error(z(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),ua(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),Uu(e,t,r,o,n);case 3:e:{if(zd(t),e===null)throw Error(z(387));r=t.pendingProps,i=t.memoizedState,o=i.element,nd(e,t),bi(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){o=fr(Error(z(423)),t),t=Vu(e,t,r,n,o);break e}else if(r!==o){o=fr(Error(z(424)),t),t=Vu(e,t,r,n,o);break e}else for(nt=cn(t.stateNode.containerInfo.firstChild),rt=t,pe=!0,Et=null,n=ed(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(dr(),r===o){t=Kt(e,t,n);break e}He(e,t,r,n)}t=t.child}return t;case 5:return rd(t),e===null&&oa(t),r=t.type,o=t.pendingProps,i=e!==null?e.memoizedProps:null,l=o.children,Jl(r,o)?l=null:i!==null&&Jl(r,i)&&(t.flags|=32),Ld(e,t),He(e,t,l,n),t.child;case 6:return e===null&&oa(t),null;case 13:return Ad(e,t,n);case 4:return Wa(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=pr(t,null,r,n):He(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),Du(e,t,r,o,n);case 7:return He(e,t,t.pendingProps,n),t.child;case 8:return He(e,t,t.pendingProps.children,n),t.child;case 12:return He(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,l=o.value,ae(vi,r._currentValue),r._currentValue=l,i!==null)if(Lt(i.value,l)){if(i.children===o.children&&!Xe.current){t=Kt(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var s=i.dependencies;if(s!==null){l=i.child;for(var u=s.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Ut(-1,n&-n),u.tag=2;var d=i.updateQueue;if(d!==null){d=d.shared;var m=d.pending;m===null?u.next=u:(u.next=m.next,m.next=u),d.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),ia(i.return,n,t),s.lanes|=n;break}u=u.next}}else if(i.tag===10)l=i.type===t.type?null:i.child;else if(i.tag===18){if(l=i.return,l===null)throw Error(z(341));l.lanes|=n,s=l.alternate,s!==null&&(s.lanes|=n),ia(l,n,t),l=i.sibling}else l=i.child;if(l!==null)l.return=i;else for(l=i;l!==null;){if(l===t){l=null;break}if(i=l.sibling,i!==null){i.return=l.return,l=i;break}l=l.return}i=l}He(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,ar(t,n),o=vt(o),r=r(o),t.flags|=1,He(e,t,r,n),t.child;case 14:return r=t.type,o=St(r,t.pendingProps),o=St(r.type,o),ju(e,t,r,o,n);case 15:return _d(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),ti(e,t),t.tag=1,Ze(r)?(e=!0,gi(t)):e=!1,ar(t,n),Sd(t,r,o),aa(t,r,o,n),ca(null,t,r,!0,e,n);case 19:return Pd(e,t,n);case 22:return Cd(e,t,n)}throw Error(z(156,t.tag))};function Gd(e,t){return bc(e,t)}function Gf(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ht(e,t,n,r){return new Gf(e,t,n,r)}function as(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Yf(e){if(typeof e=="function")return as(e)?1:0;if(e!=null){if(e=e.$$typeof,e===_a)return 11;if(e===Ca)return 14}return 2}function fn(e,t){var n=e.alternate;return n===null?(n=ht(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function oi(e,t,n,r,o,i){var l=2;if(r=e,typeof e=="function")as(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case Wn:return zn(n.children,o,i,t);case Ea:l=8,o|=8;break;case Pl:return e=ht(12,n,t,o|2),e.elementType=Pl,e.lanes=i,e;case Tl:return e=ht(13,n,t,o),e.elementType=Tl,e.lanes=i,e;case Ml:return e=ht(19,n,t,o),e.elementType=Ml,e.lanes=i,e;case rc:return Di(n,o,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case tc:l=10;break e;case nc:l=9;break e;case _a:l=11;break e;case Ca:l=14;break e;case en:l=16,r=null;break e}throw Error(z(130,e==null?e:typeof e,""))}return t=ht(l,n,t,o),t.elementType=e,t.type=r,t.lanes=i,t}function zn(e,t,n,r){return e=ht(7,e,r,t),e.lanes=n,e}function Di(e,t,n,r){return e=ht(22,e,r,t),e.elementType=rc,e.lanes=n,e.stateNode={isHidden:!1},e}function Ll(e,t,n){return e=ht(6,e,null,t),e.lanes=n,e}function zl(e,t,n){return t=ht(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Qf(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=pl(0),this.expirationTimes=pl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=pl(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function ss(e,t,n,r,o,i,l,s,u){return e=new Qf(e,t,n,s,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=ht(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ka(i),e}function qf(e,t,n){var r=3{"use strict";function Zd(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Zd)}catch(e){console.error(e)}}Zd(),Jd.exports=Xd()});var np=$t(ps=>{"use strict";var tp=ep();ps.createRoot=tp.createRoot,ps.hydrateRoot=tp.hydrateRoot;var ph});var op=$t(Hi=>{"use strict";var tg=No(),ng=Symbol.for("react.element"),rg=Symbol.for("react.fragment"),og=Object.prototype.hasOwnProperty,ig=tg.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,lg={key:!0,ref:!0,__self:!0,__source:!0};function rp(e,t,n){var r,o={},i=null,l=null;n!==void 0&&(i=""+n),t.key!==void 0&&(i=""+t.key),t.ref!==void 0&&(l=t.ref);for(r in t)og.call(t,r)&&!lg.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)o[r]===void 0&&(o[r]=t[r]);return{$$typeof:ng,type:e,key:i,ref:l,props:o,_owner:ig.current}}Hi.Fragment=rg;Hi.jsx=rp;Hi.jsxs=rp});var ms=$t((yh,ip)=>{"use strict";ip.exports=op()});var N=bo(No(),1),bp=bo(np(),1);var a=bo(ms(),1),wp={hidden:"UKRYTY",connecting:"\u0141\u0104CZENIE",connected:"ONLINE \xB7 LIVE",replaying:"ONLINE \xB7 REPLAY",verifying:"ONLINE \xB7 WERYFIKACJA",ready:"ONLINE \xB7 GOTOWY",failed:"ONLINE \xB7 B\u0141\u0104D STANU",offline:"OFFLINE \xB7 ZAPIS",unselected:"OFFLINE \xB7 BRAK CELU"},lp=.25,Fn=1,ap=4;function ag(e){let t=window.getComputedStyle(e).overflowY;return t==="auto"||t==="scroll"||t==="hidden"||t==="clip"}function kp(e){let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1,o=t.top+e.clientTop*r;return{top:o,bottom:o+e.clientHeight*r}}function Sp(e){let t=document.querySelector(".viewer-chrome");if(t?.classList.contains("is-nvim-fit"))return null;let n=0,r=window.innerHeight;if(t){let o=t.getBoundingClientRect(),i=e.getBoundingClientRect();o.lefti.left&&o.bottom>0&&o.topFn?{top:n,bottom:r}:null}function sg(e){let t=Sp(e);if(!t)return null;let{top:n,bottom:r}=t;for(let o=e.parentElement;o&&o!==document.body&&o!==document.documentElement;o=o.parentElement){if(!ag(o))continue;let i=kp(o);n=Math.max(n,i.top),r=Math.min(r,i.bottom)}return r-n>Fn?{top:n,bottom:r}:null}function Gi(){return document.scrollingElement??document.documentElement}function ug(e){let t=[];for(let r=e.parentElement;r&&r!==document.body&&r!==document.documentElement;r=r.parentElement){let o=window.getComputedStyle(r).overflowY;(o==="auto"||o==="scroll")&&r.scrollHeight-r.clientHeight>1&&t.push(r)}let n=Gi();return t.includes(n)||t.push(n),t}function cg(e){if(e===Gi())return 1;let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1;return Number.isFinite(r)&&r>0?r:1}function Ki(e,t){let n=e.style.scrollBehavior;e.style.scrollBehavior="auto",t.left!=null&&(e.scrollLeft=t.left),t.top!=null&&(e.scrollTop=t.top),e.style.scrollBehavior=n}function dg(e,t){let n=e.closest(".sheet-content");if(!n)return 0;let r=kp(n),o=0;if(r.bottom<=t.top?o=r.bottom-t.bottom:r.top>=t.bottom&&(o=r.top-t.top),Math.abs(o)<=Fn)return 0;let i=Gi(),l=i.scrollTop,s=Math.max(0,i.scrollHeight-i.clientHeight);return Ki(i,{top:Math.max(0,Math.min(s,l+o))}),i.scrollTop-l}function sp(e,t){let n=t;for(let r of ug(e)){if(Math.abs(n)<=Fn)break;let o=cg(r),i=Math.max(0,r.scrollHeight-r.clientHeight),l=r.scrollTop,s=Math.max(0,Math.min(i,l+n/o));Ki(r,{top:s}),n-=(r.scrollTop-l)*o}return t-n}function up(e,t){let n=e.getBoundingClientRect(),r=(n.top+n.bottom)/2,o=t.bottom-t.top,i=t.top+o*lp,l=t.bottom-o*lp;return rl?r-l:0}var Yt=({html:e,className:t})=>(0,a.jsx)("div",{className:t,dangerouslySetInnerHTML:{__html:e}});function Np(e,t){e.setAttribute("preserveAspectRatio","xMinYMin meet"),t&&(e.setAttribute("viewBox",`${t.x} ${t.y} ${t.width} ${t.height}`),e.setAttribute("width",`${t.width}px`),e.setAttribute("height",`${t.height}px`),e.dataset.tileIndex=String(t.index),e.dataset.tileRow=String(t.row),e.dataset.tileColumn=String(t.column))}function pg(e){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9_.:-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,120)||"uml-element"}function gs(e){let t=e;if(typeof t.getBBox!="function")return null;try{let n=t.getBBox();return[n.x,n.y,n.width,n.height].every(Number.isFinite)?{x:n.x,y:n.y,width:n.width,height:n.height}:null}catch{return null}}function mg(e){let t=gs(e);if(!t)return null;let n=Number(e.dataset.umlLayoutOriginX),r=Number(e.dataset.umlLayoutOriginY),o=Number(e.dataset.umlLayoutDx),i=Number(e.dataset.umlLayoutDy),l=Number(e.dataset.umlLayoutSx),s=Number(e.dataset.umlLayoutSy);return[n,r,o,i,l,s].every(Number.isFinite)?{x:n+(t.x-n)*l+o,y:r+(t.y-r)*s+i,width:t.width*l,height:t.height*s}:t}function Ep(e){e.dataset.umlLayoutRemembered!=="true"&&(e.dataset.umlLayoutRemembered="true",e.dataset.umlLayoutOriginalTransform=e.getAttribute("transform")??"",e.dataset.umlLayoutOriginalVisibility=e.getAttribute("visibility")??"",e.dataset.umlLayoutOriginalStyle=e.getAttribute("style")??"",e instanceof SVGTextElement&&(e.dataset.umlLayoutOriginalText=e.textContent??"",e.dataset.umlLayoutOriginalX=e.getAttribute("x")??"",e.dataset.umlLayoutOriginalTextAnchor=e.getAttribute("text-anchor")??"",e.dataset.umlLayoutOriginalFontFamily=e.getAttribute("font-family")??"",e.dataset.umlLayoutOriginalFontSize=e.getAttribute("font-size")??"",e.dataset.umlLayoutOriginalFontWeight=e.getAttribute("font-weight")??""),e instanceof SVGRectElement&&(e.dataset.umlLayoutOriginalFill=e.getAttribute("fill")??"",e.dataset.umlLayoutOriginalStroke=e.getAttribute("stroke")??"",e.dataset.umlLayoutOriginalStrokeWidth=e.getAttribute("stroke-width")??""))}function fg(e){e.querySelectorAll(".uml-layout-hit,.uml-layout-resize,.uml-layout-generated").forEach(t=>t.remove()),e.querySelectorAll("[data-uml-layout-remembered='true']").forEach(t=>{let n=(r,o)=>{o?t.setAttribute(r,o):t.removeAttribute(r)};n("transform",t.dataset.umlLayoutOriginalTransform),n("visibility",t.dataset.umlLayoutOriginalVisibility),n("style",t.dataset.umlLayoutOriginalStyle),t instanceof SVGTextElement&&(t.textContent=t.dataset.umlLayoutOriginalText??"",n("x",t.dataset.umlLayoutOriginalX),n("text-anchor",t.dataset.umlLayoutOriginalTextAnchor),n("font-family",t.dataset.umlLayoutOriginalFontFamily),n("font-size",t.dataset.umlLayoutOriginalFontSize),n("font-weight",t.dataset.umlLayoutOriginalFontWeight)),t instanceof SVGRectElement&&(n("fill",t.dataset.umlLayoutOriginalFill),n("stroke",t.dataset.umlLayoutOriginalStroke),n("stroke-width",t.dataset.umlLayoutOriginalStrokeWidth)),delete t.dataset.umlLayoutOriginX,delete t.dataset.umlLayoutOriginY,delete t.dataset.umlLayoutDx,delete t.dataset.umlLayoutDy,delete t.dataset.umlLayoutSx,delete t.dataset.umlLayoutSy,delete t.dataset.umlLayoutId})}function gg(e,t){let n=e.querySelector(":scope > g")??e,r=Array.from(n.children).filter(s=>s instanceof SVGElement),o=r.filter(s=>s instanceof SVGRectElement).map(s=>({rect:s,box:gs(s)})).filter(s=>!!(s.box&&s.box.width>=30&&s.box.height>=14)).sort((s,u)=>s.box.width*s.box.height-u.box.width*u.box.height),i=new Map;for(let s of r){let u=gs(s);if(!u)continue;let d=u.x+u.width/2,m=u.y+u.height/2,y=o.find(({box:g})=>d>=g.x-.5&&d<=g.x+g.width+.5&&m>=g.y-.5&&m<=g.y+g.height+.5);y&&i.set(s,y.rect)}let l=new Set;return o.map(({rect:s,box:u},d)=>{let m=r.filter(c=>i.get(c)===s);m.includes(s)||m.unshift(s);let y=m.filter(c=>c instanceof SVGTextElement).sort((c,h)=>Number(c.getAttribute("y"))-Number(h.getAttribute("y"))),g=(y[0]?.textContent??s.id??`element-${d+1}`).trim(),f=/^(\d{1,3})\b/.exec(g)?.[1]?.padStart(2,"0"),E=s.id||(f?t.get(f):"")||g,b=pg(E),_=b,p=2;for(;l.has(_);)_=`${b}-${p++}`;return l.add(_),m.forEach(Ep),{id:_,box:u,rect:s,members:m,texts:y}})}function po(e){let t=e.texts[0],n=e.rect.getAttribute("style")??"",r=i=>new RegExp(`${i}\\s*:\\s*([^;]+)`,"i").exec(n)?.[1]?.trim(),o=Number(t?.getAttribute("font-size")??12);return{...e.box,z:0,scale:1,rotation:0,text:{title:(e.texts[0]?.textContent??"").trim(),description:e.texts.slice(1).map(i=>(i.textContent??"").trim()).join(` +`),lines:e.texts.map(i=>(i.textContent??"").trim()),font_family:t?.getAttribute("font-family")??"Monospace",font_size:Number.isFinite(o)?o:12,font_weight:Number(t?.getAttribute("font-weight")??400)||400,align:"left"},style:{fill:e.rect.getAttribute("fill")??r("fill")??"#edf6fa",stroke:e.rect.getAttribute("stroke")??r("stroke")??"#2c7794",stroke_width:Number(e.rect.getAttribute("stroke-width")??r("stroke-width")??1.5)}}}function hg(e,t){let n=Math.max(12,Number(t.width)||e.box.width),r=Math.max(12,Number(t.height)||e.box.height),o=Number.isFinite(Number(t.x))?Number(t.x):e.box.x,i=Number.isFinite(Number(t.y))?Number(t.y):e.box.y,l=n/Math.max(1,e.box.width),s=r/Math.max(1,e.box.height),u=o-e.box.x,d=i-e.box.y,m=`translate(${u} ${d}) translate(${e.box.x} ${e.box.y}) scale(${l} ${s}) translate(${-e.box.x} ${-e.box.y})`;e.members.forEach(f=>{Ep(f);let E=f.dataset.umlLayoutOriginalTransform??"";f.setAttribute("transform",`${m}${E?` ${E}`:""}`),f.dataset.umlLayoutOriginX=String(e.box.x),f.dataset.umlLayoutOriginY=String(e.box.y),f.dataset.umlLayoutDx=String(u),f.dataset.umlLayoutDy=String(d),f.dataset.umlLayoutSx=String(l),f.dataset.umlLayoutSy=String(s),f.dataset.umlLayoutId=e.id});let y=t.text??{},g=y.lines??[y.title??"",...y.description?y.description.split(` +`):[]];e.texts.forEach((f,E)=>{E(e.tile?.page_height??0)?"landscape":"portrait",scale:1},elements:{},relations:{}}}function hs(e){if(!e)return{};let t=e.column===1&&e.columns>1?e.page_width-e.width:e.column===e.columns?0:Math.max(0,(e.page_width-e.width)/2),n=e.row===1&&e.rows>1?e.page_height-e.height:e.row===e.rows?0:Math.max(0,(e.page_height-e.height)/2);return{"--uml-tile-page-width":`${e.page_width}px`,"--uml-tile-page-height":`${e.page_height}px`,"--uml-tile-left":`${t}px`,"--uml-tile-top":`${n}px`}}function yg({html:e}){return(0,a.jsx)(Yt,{html:e})}function vg(e){let t=e.spread_count??1;if(t<=1)return null;let n=Math.max(1,Math.min(t,e.spread_index??1)),r=Math.max(1,Math.min(t,e.spread_columns??1)),o=n-1,i=Math.floor(o/r),l=o%r;return{left:l>0,right:l+10,down:n+r<=t,index:n,count:t}}function _p({continuation:e}){if(!e)return null;let t=[e.left&&["left","\u2190","kontynuacja po lewej"],e.up&&["up","\u2191","kontynuacja powy\u017Cej"],e.down&&["down","\u2193","kontynuacja poni\u017Cej"],e.right&&["right","\u2192","kontynuacja po prawej"]].filter(Boolean);return(0,a.jsx)("span",{className:"uml-page-continuation","aria-label":`Logiczny diagram: strona ${e.index} z ${e.count}`,title:`Ten sam diagram \xB7 strona ${e.index}/${e.count}`,children:t.map(([n,r,o])=>(0,a.jsx)("i",{"data-direction":n,"aria-label":o,children:r},n))})}function cp({side:e,html:t}){return(0,a.jsx)("aside",{className:`pdf-margin ${e}`,dangerouslySetInnerHTML:{__html:t}})}function ys({header:e,left:t="",right:n="",children:r,className:o=""}){return(0,a.jsx)("article",{className:`sheet ${o}`,children:(0,a.jsxs)("div",{className:"sheet-content",children:[(0,a.jsx)(yg,{html:e}),(0,a.jsx)(cp,{side:"left",html:t}),(0,a.jsx)("section",{className:"pdf-main card-section",children:r}),(0,a.jsx)(cp,{side:"right",html:n})]})})}function xg({viewpoints:e}){let t=e.filter(i=>i.status==="enabled"&&i.target_id),[n,r]=(0,N.useState)(t[0]?.id??"");(0,N.useEffect)(()=>{if(!t.length)return;let i=0,l=()=>{window.cancelAnimationFrame(i),i=window.requestAnimationFrame(()=>{let s=document.querySelector(".viewer-chrome")?.getBoundingClientRect().bottom??0,u=t.map(m=>({viewpoint:m,element:document.getElementById(m.target_id)})).filter(m=>!!m.element);if(!u.length)return;let d=u.reduce((m,y)=>{let g=Math.abs(y.element.getBoundingClientRect().top-s-18);return g{window.cancelAnimationFrame(i),window.removeEventListener("scroll",l),window.removeEventListener("resize",l)}},[e]);let o=i=>{if(i.status!=="enabled"||!i.target_id)return;let l=document.getElementById(i.target_id);if(!l)return;let u=document.querySelector(".viewer-chrome")?.getBoundingClientRect().height??0;r(i.id),window.scrollTo({top:Math.max(0,window.scrollY+l.getBoundingClientRect().top-u-8),behavior:"smooth"})};return(0,a.jsx)("nav",{className:"viewpoint-bar","aria-label":"Perspektywy architektury A1\u2013A8",children:e.map(i=>{let l=i.status==="unavailable";return(0,a.jsxs)("button",{type:"button",className:l?"is-unavailable":"","aria-current":!l&&n===i.id?"location":void 0,disabled:l,title:l?i.reason:i.subtitle,onClick:()=>o(i),children:[(0,a.jsx)("span",{children:i.id}),(0,a.jsx)("strong",{children:i.label}),l&&(0,a.jsx)("small",{children:"N/D"})]},i.id)})})}function bg({toc:e,libraryAvailable:t,libraryOpen:n,setLibraryOpen:r,scale:o,setScale:i,nvimVisible:l,setNvimVisible:s,nvimSyncMode:u,setNvimSyncMode:d,nvimControlMode:m,setNvimControlMode:y,nvimExpanded:g,setNvimExpanded:f,nvimFit:E,setNvimFit:b,allocatorVisible:_,setAllocatorVisible:p,hasAllocatorModel:c,diagramSpread:h,setDiagramSpread:k,hasDiagramSpread:C,nvimSummary:P,progress:T,progressError:R}){return(0,a.jsx)("nav",{className:"topbar",children:(0,a.jsxs)("div",{className:"topbar-inner",children:[t&&(0,a.jsxs)("button",{type:"button",className:`card-library-toggle${n?" is-active":""}`,"aria-controls":"side-panel-left-library","aria-expanded":n,"aria-label":n?"Alt+0: zamknij serie i karty":"Alt+0: poka\u017C serie i karty",title:n?"Alt+0 \xB7 Zamknij serie i karty":"Alt+0 \xB7 Serie i karty",onClick:()=>r(!n),children:[(0,a.jsx)("span",{"aria-hidden":"true",className:"card-library-toggle-icon",children:"\u2630"}),(0,a.jsx)("kbd",{children:"A0"}),(0,a.jsx)("span",{children:"KARTY"})]}),(0,a.jsxs)("details",{children:[(0,a.jsx)("summary",{children:"Spis tre\u015Bci"}),(0,a.jsx)("div",{className:"toc-links",children:e.map(j=>(0,a.jsx)("a",{href:`#${j.id}`,children:j.label},j.id))})]}),(0,a.jsxs)("div",{className:"topbar-nvim-section","aria-label":"Panel Neovima",children:[(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),(0,a.jsx)("span",{className:"nvim-toolbar-context",children:"NVIM"}),(0,a.jsxs)("div",{className:"nvim-toolbar-actions","aria-label":"Narz\u0119dzia okna Neovima",children:[(0,a.jsxs)("button",{className:"viewer-nvim-toggle nvim-toolbar-button","aria-label":l?"Alt+1: ukryj Neovim":"Alt+1: poka\u017C Neovim",title:l?"Alt+1 \xB7 Ukryj Neovim":"Alt+1 \xB7 Poka\u017C Neovim","aria-pressed":l,onClick:()=>s(!l),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A1"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"PANEL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-control-indicator nvim-toolbar-button${P.syncMode?" is-active":""}${P.syncReady?" is-engaged":""}`,"aria-label":`Alt+2: synchronizacja ${u?"w\u0142\u0105czona":"wy\u0142\u0105czona"}`,title:`Alt+2 \xB7 SYNC ${u?"ON":"OFF"}`,"aria-pressed":u,onClick:()=>d(!u),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A2"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"SYNC"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-work-indicator nvim-toolbar-button${m?" is-active":""}${P.controlEnabled?" is-engaged":""}`,"aria-label":`Alt+3: sterowanie ${u?m?"w\u0142\u0105czone":"wy\u0142\u0105czone":"niedost\u0119pne"}`,title:u?`Alt+3 \xB7 Sterowanie ${m?"ON":"OFF"}`:"Alt+3 \xB7 Sterowanie wymaga SYNC ON","aria-pressed":m,disabled:!u,onClick:()=>y(!m),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A3"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"CTRL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${g?" is-active":""}`,"aria-label":`Alt+4: ${g?"przywr\xF3\u0107 normaln\u0105 wysoko\u015B\u0107":"ustaw wysoki panel"}`,title:g?"Alt+4 \xB7 Normalna wysoko\u015B\u0107":"Alt+4 \xB7 Wysoki panel 90%","aria-pressed":g,onClick:()=>f(!g),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A4"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"HIGH"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${E?" is-active":""}`,"aria-label":`Alt+5: automatyczne dopasowanie ${E?"w\u0142\u0105czone":"wy\u0142\u0105czone"}`,title:E?"Alt+5 \xB7 Wy\u0142\u0105cz auto-fit":"Alt+5 \xB7 Poka\u017C ca\u0142y Neovim","aria-pressed":E,onClick:()=>b(!E),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A5"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"FIT"})]}),c&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${_?" is-active":""}`,"aria-label":`Alt+6: model alokatora ${_?"przypi\u0119ty":"ukryty"}`,title:_?"Alt+6 \xB7 Ukryj model alokatora":"Alt+6 \xB7 Przypnij model alokatora","aria-pressed":_,onClick:()=>p(!_),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A6"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"MODEL"})]}),C&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${h?" is-active":""}`,"aria-label":`Alt+7: diagram UML ${h?"jako osobne kartki A4":"jako po\u0142\u0105czony spread"}`,title:h?"Alt+7 \xB7 Osobne kartki A4":"Alt+7 \xB7 Po\u0142\u0105cz strony UML","aria-pressed":h,onClick:()=>k(!h),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A7"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"UML"})]})]}),(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),l&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:`nvim-status nvim-status--${P.state}`,children:wp[P.state]}),(0,a.jsxs)("span",{className:"topbar-nvim-meta",title:P.message,children:[(0,a.jsx)("strong",{children:P.instance??"Neovim MCP"}),P.detail&&(0,a.jsx)("small",{children:P.detail})]}),(0,a.jsxs)("span",{className:"nvim-shortcut-strip","aria-label":"Skr\xF3ty panelu Neovima",children:[(0,a.jsx)("kbd",{children:"F1"})," reset \xB7 ",(0,a.jsx)("kbd",{children:"F2"})," sync \xB7 ",(0,a.jsx)("kbd",{children:"Alt+W"})," okna \xB7 ",(0,a.jsx)("kbd",{children:"F12"})," skr\xF3ty"]})]})]}),(0,a.jsx)(Gg,{progress:T,error:R}),(0,a.jsxs)("div",{className:"viewer-zoom-controls",children:[(0,a.jsxs)("output",{className:"viewer-zoom-status",children:["P\u0142\xF3tno ",Math.round(o*100),"% \xB7 Tre\u015B\u0107 100%"]}),(0,a.jsx)("button",{className:"viewer-zoom-reset",onClick:()=>i(2.18),children:"Reset zoom"})]})]})})}function dp(e,t){for(let n of e.sections)for(let r of n.assets){let o=r.interactive;if(!(o?.kind!=="uml-sequence"||!o.phases?.length)&&!(t?.task.id&&o.task?.id!==t.task.id)&&!(t?.block.id&&o.block?.id!==t.block.id))for(let i of o.phases){if(t?.phase.id&&i.id!==t.phase.id)continue;let l=t?.step.id?i.steps.find(s=>s.id===t.step.id):i.steps[0];if(l)return{task:o.task??null,block:o.block??null,phase:{id:i.id,label:i.label},step:l,focusLevel:t?.focus_level??"step",activate:!1}}}return null}function wg({visible:e,model:t}){let[n,r]=(0,N.useState)(null);if((0,N.useEffect)(()=>{let g=f=>{r(f.detail??null)};return window.addEventListener("stem:nvim-step",g),r(dp(t)),fetch("/api/navigation/current",{cache:"no-store"}).then(f=>f.ok?f.json():Promise.reject()).then(f=>{let E=dp(t,f.current??null);E&&r(E)}).catch(()=>{}),()=>window.removeEventListener("stem:nvim-step",g)},[t]),!e)return null;let o=n?.focusLevel??"card",i=n?.step.snapshot?.memory.arena,l=!!(n&&o!=="card"&&o!=="task"),s=Math.max(1,Number(i?.size_bytes??64)),u=i?.offset==null?null:Math.max(0,Math.min(s,Number(i.offset))),d=i?.bytes.trim().split(/\s+/).filter(Boolean)??[],m=Math.min(s,64),y=n?[...(n.step.snapshot?.memory.items??[]).map(g=>({name:g.name,value:g.value})),...(n.step.snapshot?.frame.fields??[]).map(g=>({name:g.name,value:g.value}))].filter((g,f,E)=>E.findIndex(b=>b.name===g.name)===f).slice(0,8):[];return(0,a.jsxs)("section",{className:"allocator-panel","aria-label":"Przypi\u0119ty model alokatora",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:"ALLOCATOR \xB7 PINNED"}),(0,a.jsx)("strong",{children:n?`${n.phase.label} \xB7 ${String(n.step.number).padStart(2,"0")} ${n.step.label}`:"Oczekiwanie na diagram UML"}),(0,a.jsx)("small",{children:l?n.step.snapshot?.description??n.step.description:"Wybierz co najmniej BLOCK. F2 wybierze jego pierwszy krok i wykona synchronizacj\u0119."})]}),(0,a.jsxs)("div",{className:"allocator-panel-body",children:[(0,a.jsxs)("dl",{className:"allocator-metrics",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"FOCUS"}),(0,a.jsx)("dd",{children:o.toUpperCase()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"BASE"}),(0,a.jsx)("dd",{children:i?.base??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"ALLOCP"}),(0,a.jsx)("dd",{children:i?.cursor??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"USED / FREE"}),(0,a.jsx)("dd",{children:u==null?"\u2014":`${u} / ${s-u} B`})]})]}),(0,a.jsxs)("div",{className:`allocator-arena-view${l?"":" is-inactive"}`,children:[(0,a.jsxs)("div",{className:"allocator-arena-labels",children:[(0,a.jsx)("span",{children:"allocbuf[0]"}),(0,a.jsx)("strong",{children:u==null?"allocp jeszcze nieustawiony":`offset ${u}`}),(0,a.jsxs)("span",{children:["allocbuf[",s-1,"]"]})]}),(0,a.jsxs)("div",{className:"allocator-pinned-arena",style:{"--allocator-size":m},children:[Array.from({length:m},(g,f)=>(0,a.jsx)("i",{className:u!=null&&f(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{children:g.name}),(0,a.jsx)("code",{children:g.value})]},g.name)):(0,a.jsx)("p",{children:"Brak snapshotu."})})]})]})}var Wi=()=>({text:" ",highlight:0});function pp(e=1,t=1){return{width:e,height:t,cells:Array.from({length:t},()=>Array.from({length:e},Wi)),highlights:new Map,foreground:15263976,background:1053461,cursor:{row:0,column:0}}}function kg(e,t,n){if(t<=0||n<=0)return;let r=e.cells;e.width=t,e.height=n,e.cells=Array.from({length:n},(o,i)=>Array.from({length:t},(l,s)=>r[i]?.[s]??Wi()))}function Cp(e){return`stem-card:nvim-grid:${e}`}function Sg(e,t){if(t.width<=1||t.height<=1)return;let n={schema:"stem-nvim-grid.v1",snapshot_ref:e,saved_at:new Date().toISOString(),width:t.width,height:t.height,cells:t.cells.map(r=>r.map(o=>[o.text,o.highlight])),highlights:Array.from(t.highlights.entries()),foreground:t.foreground,background:t.background,cursor:{...t.cursor}};try{localStorage.setItem(Cp(e),JSON.stringify(n))}catch{}}function Lp(e,t){try{return e?.schema!=="stem-nvim-grid.v1"||e.snapshot_ref!==t||!Number.isInteger(e.width)||!Number.isInteger(e.height)||e.width<2||e.height<2||e.width>400||e.height>200||e.cells.length!==e.height?null:{width:e.width,height:e.height,cells:e.cells.map(n=>n.map(([r,o])=>({text:typeof r=="string"?r:" ",highlight:Number.isInteger(o)?o:0}))),highlights:new Map(e.highlights),foreground:e.foreground,background:e.background,cursor:e.cursor}}catch{return null}}function Ng(e){try{return Lp(JSON.parse(localStorage.getItem(Cp(e))??"null"),e)}catch{return null}}async function mp(e){let t=e.snapshot_ref;if(!t)return null;let n=Ng(t);if(n)return n;let r=e.view?.recorded_grid_ref;if(!r||/^(?:[a-z]+:|\/\/)/i.test(r))return null;try{let o=await fetch(r,{cache:"no-store"});return o.ok?Lp(await o.json(),t):null}catch{return null}}var Eg=[1842207,12590120,3064446,16106001,1997028,9978299,702940,12631996,6184036,15545147,5759881,16311388,5349887,12607947,5231357,16184820];function go(e){let t=Number(e);if(!Number.isInteger(t)||t<0||t>255)return;if(t<16)return Eg[t];if(t<232){let r=t-16,o=[0,95,135,175,215,255],i=o[Math.floor(r/36)],l=o[Math.floor(r%36/6)],s=o[r%6];return i<<16|l<<8|s}let n=8+(t-232)*10;return n<<16|n<<8|n}function _g(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t,foreground:go(t.foreground),background:go(t.background),special:go(t.special)}:null}function Cg(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t}:null}function Lg(e,t){for(let n of t){if(!Array.isArray(n)||typeof n[0]!="string")continue;let r=n[0],o=n.slice(1);for(let i of o)if(Array.isArray(i)){if(r==="grid_resize"){let[l,s,u]=i.map(Number);l===1&&kg(e,s,u)}else if(r==="default_colors_set"){let l=Number(i[0]),s=Number(i[1]),u=l>=0?l:go(i[3]),d=s>=0?s:go(i[4]);typeof u=="number"&&Number.isFinite(u)&&u>=0&&(e.foreground=u),typeof d=="number"&&Number.isFinite(d)&&d>=0&&(e.background=d)}else if(r==="hl_attr_define"){let l=Number(i[0]),s=_g(i[2])??Cg(i[1]);Number.isInteger(l)&&s&&typeof s=="object"&&e.highlights.set(l,s)}else if(r==="grid_clear"&&Number(i[0])===1)e.cells=Array.from({length:e.height},()=>Array.from({length:e.width},Wi));else if(r==="grid_cursor_goto"&&Number(i[0])===1)e.cursor={row:Number(i[1]),column:Number(i[2])};else if(r==="grid_line"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=i[3];if(!e.cells[l]||!Array.isArray(u))continue;let d=0;for(let m of u){if(!Array.isArray(m))continue;let y=typeof m[0]=="string"?m[0]:" ";Number.isInteger(m[1])&&(d=Number(m[1]));let g=Number.isInteger(m[2])?Number(m[2]):1;for(let f=0;f=0&&(e.cells[l][s]={text:y,highlight:d}),s+=1}}else if(r==="grid_scroll"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=Number(i[3]),d=Number(i[4]),m=Number(i[5]),y=Number(i[6]),g=e.cells.map(f=>f.map(E=>({...E})));for(let f=l;f=l&&b=u&&_i.text||" ").join(""),r=[],o=0;for(;o=n&&t.cursor.rowR.column-T.column||T.row-R.row):["asm","reg","memory"].includes(C??"")&&k.sort((T,R)=>T.column-R.column||T.row-R.row);let P=k[Math.max(0,Number(d.occurrence??1)-1)];m=P?.row??-1,y=P?.column??-1,f=d.text.length}if(m<0||y<0||m>=t.height||y>=t.width)continue;let E=Math.max(0,Number(d.padding_cells??1)),b=Math.max(0,y-E)*i,_=Math.max(0,m-E)*l,p=Math.min(t.width-y+E,f+E*2)*i,c=Math.min(t.height-m+E,g+E*2)*l,h=s[u.tone??"danger"];if(o.strokeStyle=h,o.lineWidth=2,u.shape==="underline"?(o.beginPath(),o.moveTo(b,_+c-2),o.lineTo(b+p,_+c-2),o.stroke()):o.strokeRect(b+1,_+1,Math.max(1,p-2),Math.max(1,c-2)),u.label){o.font="700 10px system-ui, sans-serif";let k=o.measureText(u.label).width+8;o.fillStyle=h,o.fillRect(b+1,Math.max(0,_-15),k,14),o.fillStyle="#fff",o.fillText(u.label,b+5,Math.max(10,_-4))}}}function Tg(e){if(e.nativeEvent.isComposing||e.metaKey)return null;let n={Enter:"CR",Escape:"Esc",Backspace:"BS",Delete:"Del",Tab:"Tab",ArrowLeft:"Left",ArrowRight:"Right",ArrowUp:"Up",ArrowDown:"Down",Home:"Home",End:"End",PageUp:"PageUp",PageDown:"PageDown",Insert:"Insert"}[e.key]??(/^F\d{1,2}$/.test(e.key)?e.key:null),r=[e.ctrlKey?"C":"",e.altKey?"M":"",e.shiftKey&&n?"S":""].filter(Boolean).join("-");return n?`<${r?`${r}-`:""}${n}>`:e.key.length!==1?null:e.ctrlKey||e.altKey?`<${r}-${e.key==="<"?"lt":e.key}>`:e.key==="<"?"":e.key}function Mg({visible:e,syncMode:t,controlMode:n,expanded:r,fit:o,scale:i,onSummaryChange:l}){let s=(0,N.useRef)(null),u=(0,N.useRef)(null),d=(0,N.useRef)(null),m=(0,N.useRef)(0),y=(0,N.useRef)(0),g=(0,N.useRef)(0),f=(0,N.useRef)(pp()),E=(0,N.useRef)(null),b=(0,N.useRef)(null),_=(0,N.useRef)(null),p=(0,N.useRef)(0),c=(0,N.useRef)(null),h=(0,N.useRef)(null),[k,C]=(0,N.useState)(null),[P,T]=(0,N.useState)(!1),[R,j]=(0,N.useState)(0),[I,ke]=(0,N.useState)(!1),[re,G]=(0,N.useState)(()=>{let A=Number(localStorage.getItem("stem-card-nvim-height-vh"));return Number.isFinite(A)&&A>=25&&A<=90?A:75}),[U,Le]=(0,N.useState)({state:"hidden"}),[Ne,Q]=(0,N.useState)({state:"idle"}),et=Ne.state==="replaying"||Ne.state==="verifying",Ge=t&&U.state==="connected"&&!et,je=n&&I&&U.state==="connected"&&!et,me=()=>{s.current&&Pg(s.current,f.current,_.current===b.current?.step.snapshot_ref?b.current?.step.view?.annotations??[]:[])},Dn=()=>{m.current||(m.current=window.requestAnimationFrame(()=>{m.current=0,me()}))};if((0,N.useEffect)(()=>{let A=F=>{let B=F.detail;b.current=B,C(B),_.current=null;let te=B.step.snapshot_ref;if(U.state!=="connected"&&te&&mp(B.step).then(ie=>{!ie||b.current?.step.snapshot_ref!==te||(f.current=ie,T(!0),_.current=te,Q({state:"idle",snapshot_ref:te,message:"Pokazano ostatni zapisany, zweryfikowany ekran."}),me())}),me(),!B.activate)return;let at=B.step.mode??"RUN",zt=async()=>{if(!B.step.code_ref)return null;let ie=await fetch("/api/nvim/open",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code_ref:B.step.code_ref,actor:document.documentElement.dataset.cardClientId??"browser"})}),q=await ie.json().catch(()=>({}));if(!ie.ok)throw new Error(q.message??q.error??`HTTP ${ie.status}`);return q};if(at==="CODE"||!te){zt().then(()=>{Q({state:"ready",phase:"code",message:B.step.code_ref?`Otwarto ${B.step.code_ref}; program nie zosta\u0142 zrestartowany.`:"Krok CODE nie ma przypisanego code_ref."})}).catch(ie=>{Q({state:"failed",phase:"code",message:ie instanceof Error?ie.message:String(ie)})});return}if(!e||U.state!=="connected"){Q({state:"failed",snapshot_ref:te,message:"Cel jest offline; pozostaje zapisany wynik tego kroku."});return}let Ee=zt(),ne=Math.max(p.current+1,Date.now());p.current=ne,c.current?.abort();let st=new AbortController;c.current=st,Q({state:"replaying",phase:"dispatch",generation:ne,snapshot_ref:te,message:"Resetuj\u0119 cel i odtwarzam wykonanie do wybranego kroku."});let Ye=0,wn=async()=>{try{let ie=await fetch("/api/checkpoint/status",{cache:"no-store",signal:st.signal});if(!ie.ok)return;let q=await ie.json(),bt=q.active?.generation===ne?q.active:null;if(!bt||p.current!==ne)return;Q({state:bt.phase==="verify"?"verifying":"replaying",phase:bt.phase,generation:ne,snapshot_ref:te,message:bt.message})}catch{}};Ye=window.setInterval(wn,120),wn(),Ee.then(()=>fetch("/api/checkpoint/activate",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({snapshot_ref:te,generation:ne}),signal:st.signal})).then(async ie=>{let q=await ie.json();if(p.current!==ne)return;if(!ie.ok||q.status!=="ready")throw new Error(q.message??`Replay zako\u0144czy\u0142 si\u0119 kodem HTTP ${ie.status}.`);let bt=d.current;if(bt?.readyState!==WebSocket.OPEN)throw new Error("Replay zako\u0144czony, ale most Neovima jest offline.");let fe=y.current;bt.send(JSON.stringify({type:"refresh"}));let Qt=Date.now()+1800;for(;y.current<=fe&&Date.now()window.setTimeout(qt,20));if(y.current<=fe)throw new Error("Neovim nie potwierdzi\u0142 pe\u0142nego redraw po replay.");if(p.current!==ne)return;_.current=te,Q({state:"ready",phase:q.phase,generation:ne,snapshot_ref:te,message:q.message??"Stan maszyny zosta\u0142 odtworzony i zweryfikowany."}),Sg(te,f.current),me(),await new Promise(qt=>window.requestAnimationFrame(()=>qt()));let jn=s.current;if(jn&&b.current?.step.snapshot_ref===te)try{fetch("/api/evidence",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:document.documentElement.dataset.cardClientId??"browser",snapshot_ref:te,event_id:B.step.event_id??null,strategy_ref:B.step.strategy_ref??null,code_ref:B.step.code_ref??null,caption:`${String(B.step.number).padStart(2,"0")} ${B.step.label}`,data_url:jn.toDataURL("image/png")})}).catch(()=>{})}catch{}}).catch(ie=>{st.signal.aborted||p.current!==ne||(mp(B.step).then(q=>{!q||b.current?.step.snapshot_ref!==te||(f.current=q,T(!0),_.current=te,me())}),Q({state:"failed",generation:ne,snapshot_ref:te,message:ie instanceof Error?ie.message:String(ie)}))}).finally(()=>{window.clearInterval(Ye),c.current===st&&(c.current=null)})};return window.addEventListener("stem:nvim-step",A),()=>{window.removeEventListener("stem:nvim-step",A),c.current?.abort()}},[U.state,e]),(0,N.useEffect)(()=>{localStorage.setItem("stem-card-nvim-height-vh",re.toFixed(2))},[re]),(0,N.useEffect)(()=>{let A=window.requestAnimationFrame(me);return()=>window.cancelAnimationFrame(A)},[r,o,i]),(0,N.useEffect)(()=>{let A=()=>{let F=d.current;F?.readyState===WebSocket.OPEN&&F.send(JSON.stringify({type:"refresh"})),me()};return window.addEventListener("stem:nvim-refresh",A),()=>window.removeEventListener("stem:nvim-refresh",A)},[]),(0,N.useEffect)(()=>{let A=U.state;U.state==="connected"&&(A=Ne.state==="idle"?"connected":Ne.state),l({state:A,message:Ne.message??U.message,instance:U.target?.instance??U.target?.container_name,detail:[U.target?.profile??k?.step.view?.connection_ref,k?`${String(k.step.number).padStart(2,"0")} ${k.step.label}`:void 0,Ne.phase].filter(Boolean).join(" \xB7 "),syncMode:t,syncReady:Ge,controlMode:n,controlEnabled:je,screenCursor:{...f.current.cursor},grid:{columns:f.current.width,rows:f.current.height}})},[k,Ne,je,n,R,l,U,t,Ge]),(0,N.useEffect)(()=>()=>window.clearTimeout(g.current),[]),(0,N.useEffect)(()=>{if(!je)return;let A=F=>{let B=d.current;if(B?.readyState!==WebSocket.OPEN)return;if(F.altKey&&!F.ctrlKey&&!F.metaKey&&F.key.toLowerCase()==="w"){F.preventDefault(),F.stopImmediatePropagation(),F.repeat||B.send(JSON.stringify({type:"input",keys:""}));return}let te={ArrowLeft:"h",ArrowDown:"j",ArrowUp:"k",ArrowRight:"l"};F.altKey&&!F.ctrlKey&&!F.metaKey&&te[F.key]&&(F.preventDefault(),F.stopImmediatePropagation(),F.repeat||B.send(JSON.stringify({type:"input",keys:`${te[F.key]}`})))};return window.addEventListener("keydown",A,!0),()=>window.removeEventListener("keydown",A,!0)},[je]),(0,N.useEffect)(()=>{if(!e||!t){d.current?.close(),d.current=null,ke(!1),Le(e?{state:"offline",message:"SYNC OFF: pokazuj\u0119 zapisany ekran bez po\u0142\u0105czenia z kontenerem."}:{state:"hidden"});return}let A=!1,F=0,B=()=>{if(A)return;let te=window.location.protocol==="https:"?"wss:":"ws:",at=new WebSocket(`${te}//${window.location.host}/api/nvim-ui`);d.current=at,Le({state:"connecting"}),at.addEventListener("message",zt=>{try{let Ee=JSON.parse(String(zt.data));if(Ee.type==="status"){typeof Ee.epoch=="string"&&E.current&&E.current!==Ee.epoch&&(f.current=pp(),T(!1),_.current=null),typeof Ee.epoch=="string"&&(E.current=Ee.epoch),Le(Ee);return}Ee.type==="redraw"&&Array.isArray(Ee.events)&&(Lg(f.current,Ee.events),f.current.width>1&&f.current.height>1&&T(!0),Ee.events.some(ne=>Array.isArray(ne)&&ne[0]==="flush")&&(y.current+=1,Dn(),g.current||(g.current=window.setTimeout(()=>{g.current=0,j(ne=>ne+1)},120))))}catch{}}),at.addEventListener("close",()=>{d.current===at&&(d.current=null),A||(F=window.setTimeout(B,1200))}),at.addEventListener("error",()=>{Le(zt=>({...zt,state:"offline",message:"Most Neovima jest chwilowo niedost\u0119pny."}))})};return B(),()=>{A=!0,window.clearTimeout(F),window.cancelAnimationFrame(m.current),m.current=0,d.current?.close(),d.current=null}},[t,e]),!e)return null;let xe=A=>{let F=d.current;F?.readyState===WebSocket.OPEN&&F.send(JSON.stringify(A))},bn=A=>{let F=A.currentTarget.getBoundingClientRect();return{row:Math.max(0,Math.min(f.current.height-1,Math.floor((A.clientY-F.top)/F.height*f.current.height))),column:Math.max(0,Math.min(f.current.width-1,Math.floor((A.clientX-F.left)/F.width*f.current.width)))}},se=A=>[A.shiftKey?"S":"",A.ctrlKey?"C":"",A.altKey?"A":""].filter(Boolean).join("-");return(0,a.jsxs)("section",{className:"nvim-panel","aria-label":"Neovim po\u0142\u0105czony z kontenerem",onWheel:A=>{A.stopPropagation();let F=A.target;(!(F instanceof Element)||!F.closest(".nvim-screen-scroll"))&&A.preventDefault()},children:[(0,a.jsxs)("div",{ref:u,className:"nvim-screen-scroll",style:o?void 0:{height:`${r?90:re}vh`},"data-sync":t?"on":"off","data-control":je?"true":"false",tabIndex:0,onPointerEnter:A=>{ke(!0),A.currentTarget.focus({preventScroll:!0})},onPointerLeave:A=>{ke(!1),A.currentTarget.blur()},onMouseDown:A=>A.currentTarget.focus({preventScroll:!0}),onKeyDown:A=>{if(!je)return;let F=Tg(A);F&&(A.preventDefault(),A.stopPropagation(),xe({type:"input",keys:F}))},children:[(0,a.jsx)("div",{className:"nvim-screen-stage",style:o?void 0:{height:`${(r?90:re)/Math.max(i,.25)}vh`},children:(0,a.jsx)("div",{className:"nvim-screen-surface",children:(0,a.jsx)("div",{className:"nvim-screen-frame",children:(0,a.jsx)("div",{className:"nvim-screen-content",children:(0,a.jsx)("div",{className:"nvim-screen-grid",children:(0,a.jsx)("canvas",{ref:s,className:"nvim-screen",tabIndex:-1,"aria-label":je?"Interaktywny ekran Neovima":"Ekran Neovima",onMouseDown:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A),B=A.button===1?"middle":A.button===2?"right":"left";xe({type:"mouse",button:B,action:"press",modifier:se(A),...F})},onMouseUp:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A),B=A.button===1?"middle":A.button===2?"right":"left";xe({type:"mouse",button:B,action:"release",modifier:se(A),...F})},onWheel:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A);xe({type:"mouse",button:"wheel",action:A.deltaY<0?"up":"down",modifier:se(A),...F})},onContextMenu:A=>je&&A.preventDefault()})})})})})}),!P&&(0,a.jsxs)("div",{className:"nvim-screen-empty",children:[(0,a.jsx)("strong",{children:wp[U.state]}),(0,a.jsx)("span",{children:U.message??"Oczekiwanie na ekran Neovima lub zapisany stan kroku."})]})]}),(0,a.jsx)("div",{className:"nvim-resize-handle",role:"separator","aria-label":"Zmie\u0144 wysoko\u015B\u0107 panelu Neovima","aria-orientation":"horizontal","aria-valuemin":25,"aria-valuemax":90,"aria-valuenow":Math.round(re),tabIndex:0,title:"Przeci\u0105gnij, aby zmieni\u0107 wysoko\u015B\u0107. Dwuklik: 75%.",onPointerDown:A=>{A.preventDefault(),h.current={y:A.clientY,heightVh:re},A.currentTarget.setPointerCapture(A.pointerId)},onPointerMove:A=>{let F=h.current;if(!F)return;let B=(A.clientY-F.y)/window.innerHeight*100;G(Math.max(25,Math.min(90,F.heightVh+B)))},onPointerUp:A=>{h.current=null,A.currentTarget.hasPointerCapture(A.pointerId)&&A.currentTarget.releasePointerCapture(A.pointerId)},onPointerCancel:()=>{h.current=null},onDoubleClick:()=>G(75),onKeyDown:A=>{if(A.key==="ArrowUp"||A.key==="ArrowDown"){A.preventDefault();let F=A.key==="ArrowUp"?-2:2;G(B=>Math.max(25,Math.min(90,B+F)))}else A.key==="Home"&&(A.preventDefault(),G(75))}})]})}function Rg({column:e,row:t}){return e==="chapter"||e==="task"||e==="version"?(0,a.jsx)("td",{children:(0,a.jsx)("code",{children:t[e]})}):e==="idea"?(0,a.jsx)("td",{dangerouslySetInnerHTML:{__html:t.idea_html}}):e==="status"?(0,a.jsx)("td",{children:(0,a.jsx)("span",{className:"scope-status","data-status":t.status,title:t.status,children:t.status_label})}):(0,a.jsx)("td",{children:t[e]})}function Og({front:e}){let t=e.scope_columns??["chapter","task","idea","priority"];return(0,a.jsxs)(ys,{header:e.header_html,left:e.left_margin_html,right:e.right_margin_html,className:"front-sheet",children:[(0,a.jsxs)("section",{className:"front-scope front-goal",children:[(0,a.jsx)("h2",{children:e.goal_title}),(0,a.jsx)(Yt,{html:e.goal_html})]}),(0,a.jsxs)("section",{className:"front-scope front-card-scope",children:[(0,a.jsx)("h2",{children:e.scope_title}),e.scope_html&&(0,a.jsx)(Yt,{html:e.scope_html}),(0,a.jsx)("div",{className:"scope-table-wrap",children:(0,a.jsxs)("table",{className:"scope-table scope-table--task",children:[(0,a.jsx)("thead",{children:(0,a.jsx)("tr",{children:e.scope_headers.map(n=>(0,a.jsx)("th",{children:n},n))})}),(0,a.jsx)("tbody",{children:e.scope_rows.map(n=>(0,a.jsx)("tr",{className:n.key?"scope-row--key":"",children:t.map(r=>(0,a.jsx)(Rg,{column:r,row:n},r))},`${n.chapter}-${n.task}`))})]})})]})]})}function $g({taskRef:e,step:t}){return(0,a.jsxs)("li",{id:`${e}-${t.id}`,children:[(0,a.jsx)("strong",{children:t.title}),(0,a.jsx)(Yt,{html:t.content_html})]})}function Ig({taskRef:e,block:t}){let n=t.kind==="exercise"?"\u0106wiczenie":"Block";return(0,a.jsxs)("section",{className:`task-block task-block--${t.kind}`,id:`${e}-${t.id}`,"data-stem-nav":"block",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:n}),(0,a.jsx)("h4",{children:t.title})]}),(0,a.jsx)(Yt,{html:t.content_html}),t.steps.length>0&&(0,a.jsx)("ol",{className:"block-steps",children:t.steps.map(r=>(0,a.jsx)($g,{taskRef:e,step:r},r.id))})]})}function Fg({task:e}){return e.flow.length?(0,a.jsxs)("article",{className:"task-flow",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsxs)("header",{className:"task-flow-header",children:[(0,a.jsx)("span",{children:e.ref.toUpperCase()}),(0,a.jsx)("h3",{children:e.title}),e.uuid&&(0,a.jsx)("code",{children:e.uuid})]}),e.flow.map(t=>(0,a.jsx)(Ig,{taskRef:e.ref,block:t},t.id)),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]}):(0,a.jsxs)("article",{className:"task-legacy",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsx)("strong",{children:e.ref.toUpperCase()}),(0,a.jsx)(Yt,{html:e.prompt_html??""}),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]})}var fp={compile:"KOMPILACJA",bss:".BSS",stack:"STOS",registers:"REJESTRY",text:".TEXT"},gp=["#9bcfe2","#c4dfc0","#f4c889","#d2b6dc"];function Dg({config:e,title:t}){let n=e.arena_size??64,r=e.allocations??[5,7],o=e.symbols??[],i=`${e.storage_key??"allocator-memory-flow"}-stage`,[l,s]=(0,N.useState)(()=>Math.min(r.length,Number(localStorage.getItem(i)??0))),[u,d]=(0,N.useState)(o[0]?.id??"");(0,N.useEffect)(()=>localStorage.setItem(i,String(l)),[l,i]);let m=r.slice(0,l).reduce((_,p)=>_+p,0),y=o.find(_=>_.id===u)??o[0],g=Array.from({length:n},(_,p)=>p),f=_=>{let p=0;for(let c=0;co.some(p=>p.area===_));return(0,a.jsxs)("div",{className:"memory-react","aria-label":`Interaktywny diagram: ${t}`,children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"INTERAKTYWNY MODEL PAMI\u0118CI"}),(0,a.jsx)("h3",{children:t})]}),(0,a.jsxs)("div",{className:"memory-actions",children:[(0,a.jsx)("button",{"aria-pressed":l===0,onClick:()=>s(0),children:"definicje / reset"}),r.map((_,p)=>(0,a.jsxs)("button",{"aria-pressed":l===p+1,onClick:()=>s(p+1),children:["alloc(",_,")"]},`${_}-${p}`))]})]}),(0,a.jsx)("div",{className:"memory-lanes",children:b.map(_=>(0,a.jsxs)("section",{className:`memory-lane ${_}`,children:[(0,a.jsx)("b",{children:fp[_]}),o.filter(p=>p.area===_).map(p=>(0,a.jsx)("button",{className:u===p.id?"active":"",onClick:()=>d(p.id),children:(0,a.jsx)("code",{children:p.declaration})},p.id))]},_))}),(0,a.jsxs)("div",{className:"arena-wrap",children:[(0,a.jsxs)("div",{className:"arena-label",children:[(0,a.jsxs)("code",{children:["allocbuf[",n,"]"]}),(0,a.jsxs)("span",{children:["u\u017Cyte ",m," B / wolne ",n-m," B"]})]}),(0,a.jsxs)("div",{className:"arena",style:{"--allocp":m,"--arena-size":n},children:[g.map(_=>{let p=f(_);return(0,a.jsx)("i",{style:p>=0?{background:gp[p%gp.length]}:void 0},_)}),(0,a.jsxs)("span",{className:"allocp",children:["allocp \u2191 ",m]})]})]}),(0,a.jsxs)("p",{className:"memory-stage",children:[(0,a.jsxs)("strong",{children:[l+1,"/",r.length+1]})," ",(0,a.jsx)("code",{children:E})]}),y&&(0,a.jsxs)("aside",{className:"memory-inspector",children:[(0,a.jsx)("strong",{children:y.id}),(0,a.jsx)("code",{children:y.declaration}),(0,a.jsx)("span",{children:y.description})]})]})}function jg({config:e,asset:t,progress:n,onSetStatus:r}){let o=e.stages??[],i=`${e.storage_key??t.label}-uml-stage`,l=(0,N.useRef)(null),[s,u]=(0,N.useState)(""),[d,m]=(0,N.useState)(!1),[y,g]=(0,N.useState)(!1),[f,E]=(0,N.useState)(()=>Math.max(0,Math.min(o.length-1,Number(localStorage.getItem(i)??0))));(0,N.useEffect)(()=>localStorage.setItem(i,String(f)),[f,i]),(0,N.useEffect)(()=>{let c=!0;return m(!1),fetch(t.href,{cache:"no-store"}).then(h=>{if(!h.ok)throw new Error(`HTTP ${h.status}`);return h.text()}).then(h=>{let k=new DOMParser().parseFromString(h,"image/svg+xml"),C=k.documentElement;if(C.nodeName.toLowerCase()!=="svg"||k.querySelector("parsererror"))throw new Error("Niepoprawny SVG");k.querySelectorAll("script, foreignObject").forEach(P=>P.remove()),Np(C,t.tile),c&&u(C.outerHTML)}).catch(()=>{c&&m(!0)}),()=>{c=!1}},[t.href,t.tile]),(0,N.useEffect)(()=>{let c=l.current?.querySelector("svg");if(!c)return;c.setAttribute("role","img"),c.setAttribute("aria-label",t.alt),c.querySelectorAll("[data-uml-stage]").forEach(C=>{C.classList.remove("uml-stage-region","uml-stage-region-bg","uml-stage-region-outline","uml-stage-region-active","uml-stage-region-completed"),C.removeAttribute("data-uml-stage"),C.removeAttribute("data-uml-stage-label"),C.removeAttribute("role"),C.removeAttribute("tabindex"),C.removeAttribute("aria-label")});let h=Array.from(c.querySelectorAll("text")),k=Array.from(c.querySelectorAll("rect"));o.forEach((C,P)=>{if(!C.svg_label)return;let T=h.find(G=>(G.textContent??"").trim().startsWith(C.svg_label)),R=Number(T?.getAttribute("y"));if(!T||!Number.isFinite(R))return;let j=k.map(G=>{let U=Number(G.getAttribute("y")),Le=Number(G.getAttribute("height")),Ne=Number(G.getAttribute("width")),Q=G.getAttribute("style")??"",et=Number(Q.match(/stroke-width:\s*([\d.]+)/)?.[1]??G.getAttribute("stroke-width")??0);return{rect:G,y:U,height:Le,width:Ne,strokeWidth:et,area:Ne*Le}}).filter(({y:G,height:U,width:Le,strokeWidth:Ne})=>Number.isFinite(G)&&Number.isFinite(U)&&Number.isFinite(Le)&&Ne>=2&&G<=R&&G+U>=R).sort((G,U)=>G.area-U.area),I=j[0];if(!I)return;let ke=j.filter(({y:G,height:U,width:Le})=>Math.abs(G-I.y)<.1&&Math.abs(U-I.height)<.1&&Math.abs(Le-I.width)<.1),re=!!(C.progress_id&&n?.items?.[C.progress_id]?.status==="approved");ke.forEach(({rect:G},U)=>{let Le=G.getAttribute("fill")!=="none";G.dataset.umlStage=String(P),G.dataset.umlStageLabel=C.label,G.classList.add("uml-stage-region",Le?"uml-stage-region-bg":"uml-stage-region-outline"),G.classList.toggle("uml-stage-region-active",P===f),G.classList.toggle("uml-stage-region-completed",re),U===0&&(G.setAttribute("role","button"),G.setAttribute("tabindex","0"),G.setAttribute("aria-label",`Poka\u017C etap ${C.label}`))})})},[t.alt,n,f,o,s]);let b=(c,h)=>{let k=l.current?.querySelector("svg");if(!k)return;let C=Array.from(k.querySelectorAll(".uml-stage-region-bg[data-uml-stage]")).filter(T=>{let R=T.getBoundingClientRect();return c>=R.left&&c<=R.right&&h>=R.top&&h<=R.bottom}).sort((T,R)=>{let j=T.getBoundingClientRect(),I=R.getBoundingClientRect();return j.width*j.height-I.width*I.height})[0],P=Number(C?.dataset.umlStage);Number.isInteger(P)&&E(P)},_=c=>{if(c.key!=="Enter"&&c.key!==" ")return;let h=c.target,k=Number(h.dataset?.umlStage);Number.isInteger(k)&&(c.preventDefault(),E(k))},p=o[f];return(0,a.jsxs)("div",{className:"uml-react",children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"KANONICZNY DIAGRAM UML \xB7 PLANTUML"}),(0,a.jsx)("h3",{children:"Reset i dwa przydzia\u0142y liniowe"})]}),(0,a.jsx)("div",{className:"uml-actions",children:o.map((c,h)=>(0,a.jsxs)("button",{"aria-pressed":f===h,"data-completed":c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"?"true":"false",onClick:()=>E(h),children:[c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"&&(0,a.jsx)("span",{"aria-hidden":"true",children:"\u2713 "}),c.label]},c.id))})]}),(0,a.jsxs)("div",{ref:l,className:"uml-canvas",onClick:c=>b(c.clientX,c.clientY),onKeyDown:_,children:[s?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:hs(t.tile),dangerouslySetInnerHTML:{__html:s}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),d&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 nie uda\u0142o si\u0119 wczyta\u0107 interaktywnego SVG."})]}),p&&(0,a.jsxs)("aside",{className:"uml-stage",children:[(0,a.jsx)("strong",{children:p.label}),(0,a.jsx)("span",{children:p.description}),p.code_ref&&(0,a.jsx)("code",{children:p.code_ref})]}),p?.progress_id&&(0,a.jsxs)("footer",{className:"uml-approval",children:[(0,a.jsx)("span",{children:n?.items?.[p.progress_id]?.status==="approved"?"Ten stan jest zatwierdzony i zapisany w JSON-ie zaj\u0119\u0107.":"Kursor wybiera stan; zatwierdzenie zapisuje go w JSON-ie zaj\u0119\u0107."}),(0,a.jsx)("button",{disabled:!n||y,onClick:async()=>{if(!p.progress_id||!n)return;let c=n.items?.[p.progress_id]?.status==="approved";g(!0);try{await r(p.progress_id,c?"pending":"approved")}finally{g(!1)}},children:y?"Zapisywanie\u2026":n?.items?.[p.progress_id]?.status==="approved"?"Cofnij zatwierdzenie":"Zatwierd\u017A stan"})]})]})}function Ug({config:e,asset:t,progress:n,onSetStatus:r,continuation:o}){let i=e.phases??[],l=i.flatMap(x=>x.steps.map(S=>({phase:x,step:S}))),s=`${e.storage_key??t.label}-uml-step`,u=`${e.storage_key??t.label}-navigation-level`,d=(0,N.useRef)(null),m=(0,N.useRef)(null),y=(0,N.useRef)(new Map),g=(0,N.useRef)(null),f=(0,N.useRef)(0),E=(0,N.useRef)(!1),b=(0,N.useRef)(null),_=(0,N.useRef)(!0),[p,c]=(0,N.useState)(""),[h,k]=(0,N.useState)(!1),[C,P]=(0,N.useState)(!1),[T,R]=(0,N.useState)(null),[j,I]=(0,N.useState)(null),[ke,re]=(0,N.useState)(!1),[G,U]=(0,N.useState)(""),[Le,Ne]=(0,N.useState)(!1),[Q,et]=(0,N.useState)(null),[Ge,je]=(0,N.useState)([]),[me,Dn]=(0,N.useState)(0),[xe,bn]=(0,N.useState)(()=>Math.max(0,Math.min(l.length-1,Number(localStorage.getItem(s)??0)))),[se,A]=(0,N.useState)(()=>{let x=localStorage.getItem(u);return x==="card"||x==="task"||x==="block"||x==="phase"||x==="step"||x==="snapshot"?x:"step"});(0,N.useEffect)(()=>localStorage.setItem(s,String(xe)),[xe,s]),(0,N.useEffect)(()=>localStorage.setItem(u,se),[se,u]),(0,N.useEffect)(()=>{let x=!0;return k(!1),fetch(t.href,{cache:"no-store"}).then(S=>{if(!S.ok)throw new Error(`HTTP ${S.status}`);return S.text()}).then(S=>{let M=new DOMParser().parseFromString(S,"image/svg+xml"),O=M.documentElement;if(O.nodeName.toLowerCase()!=="svg"||M.querySelector("parsererror"))throw new Error("Niepoprawny SVG");M.querySelectorAll("script, foreignObject").forEach(v=>v.remove()),Np(O,t.tile),x&&c(O.outerHTML)}).catch(()=>{x&&k(!0)}),()=>{x=!1}},[t.href,t.tile]),(0,N.useEffect)(()=>{let x=!0,S=fs(t,e);if(U("Wczytywanie uk\u0142adu\u2026"),Ne(!1),!t.source_href)return R(S),I(S),U("Brak \u017Ar\xF3d\u0142a PlantUML \u2014 zapis wy\u0142\u0105czony."),()=>{x=!1};let M=t.source_href.replace(/\.puml(?:\?.*)?$/,".layout.json");return fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}`,{cache:"no-store"}).then(async O=>{if(!O.ok)throw new Error(`HTTP ${O.status}`);return O.json()}).catch(async()=>{let O=await fetch(M,{cache:"no-store"});return O.ok?{layout:await O.json(),source_digest:"",stale:!1}:{layout:null,source_digest:"",stale:!1}}).then(O=>{if(!x)return;let v=O.layout??fs(t,e,O.source_digest??"");R(v),I(v),re(!1),Ne(!!O.stale),U(O.layout?"Uk\u0142ad wczytany z JSON.":"Uk\u0142ad PlantUML \u2014 brak r\u0119cznych zmian.")}).catch(O=>{x&&(R(S),I(S),U(`Nie wczytano uk\u0142adu: ${O instanceof Error?O.message:String(O)}`))}),()=>{x=!1}},[t.source_href,t.label,e.block?.id,e.task?.id]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(!x||!j)return;fg(x);let S=new Map(l.map(({step:L})=>[String(L.number).padStart(2,"0"),L.id])),M=gg(x,S),O=new Map(M.map(L=>[L.id,L]));y.current=O;let v=M.map(L=>L.id);je(L=>L.join("\0")===v.join("\0")?L:v),M.forEach(L=>{let H=j.elements[L.id];H&&hg(L,H)});let w=x.viewBox.baseVal;(j.canvas.width<=0||j.canvas.height<=0)&&I(L=>L&&{...L,canvas:{...L.canvas,width:w?.width||Number(x.getAttribute("width")?.replace("px",""))||0,height:w?.height||Number(x.getAttribute("height")?.replace("px",""))||0}})},[l,p,j]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(!x)return;let S=e.kind==="uml-class"&&x.contains(document.activeElement);x.setAttribute("role","img"),x.setAttribute("aria-label",t.alt),x.classList.toggle("uml-class-svg",e.kind==="uml-class"),x.classList.toggle("uml-class-svg-active",e.kind==="uml-class"&&se!=="card"),x.querySelectorAll(".uml-step-hit, .uml-class-focus-region").forEach(K=>K.remove()),x.querySelectorAll("[data-uml-step-element]").forEach(K=>{K.classList.remove("uml-step-element","uml-step-element-active","uml-step-element-completed","uml-step-element-tone-a","uml-step-element-tone-b"),K.removeAttribute("data-uml-step-element"),K.removeAttribute("data-uml-step-claim-area")});let M=Array.from(x.querySelectorAll("text")),O=Array.from(x.querySelectorAll("line")),v=Array.from(x.querySelectorAll("polygon"));if(e.kind==="uml-class"){let K=V=>V?mg(V):null,X=V=>{if(!V.length)return null;let oe=Math.min(...V.map(J=>J.x)),ct=Math.min(...V.map(J=>J.y)),Ue=Math.max(...V.map(J=>J.x+J.width)),ue=Math.max(...V.map(J=>J.y+J.height));return{x:oe,y:ct,width:Ue-oe,height:ue-ct}},D=Array.from(x.querySelectorAll("g > *")),Z=Array.from(x.querySelectorAll("[id]"));l.forEach(({step:V},oe)=>{let ct=V.svg_label??String(V.number).padStart(2,"0"),Ue=M.find(ge=>(ge.textContent??"").trim().startsWith(ct));if(!Ue)return;let ue=K(Ue);if(!ue)return;let J=Number(Ue.getAttribute("y")),Re=M.filter(ge=>Number.isFinite(J)&&Math.abs(Number(ge.getAttribute("y"))-J)<.8),Ve=V.svg_target?Z.find(ge=>ge.id===V.svg_target||ge.id.startsWith(`${V.svg_target}-`))??null:null,dt=K(Ve)??X(Re.map(ge=>K(ge)).filter(ge=>ge!==null))??ue,vr=Ve?.tagName.toLowerCase()==="rect",vs=Ve?[Ve,Ue]:Re;vr&&D.forEach(ge=>{let Xt=K(ge);if(!Xt||ge===Ve)return;let bs=Xt.x+Xt.width/2,ws=Xt.y+Xt.height/2;bs>=dt.x&&bs<=dt.x+dt.width&&ws>=dt.y&&ws<=dt.y+dt.height&&vs.push(ge)});let Ap=!!(V.progress_id&&n?.items?.[V.progress_id]?.status==="approved"),xs=Math.max(1,dt.width*dt.height);vs.forEach(ge=>{let Xt=Number(ge.dataset.umlStepClaimArea);Number.isFinite(Xt)&&Xt{let D=K.svg_label??String(K.number).padStart(2,"0"),Z=M.find(J=>(J.textContent??"").trim()===D),V=Number(Z?.getAttribute("y"));if(!Z||!Number.isFinite(V))return;let oe=V+5,ct=!!(K.progress_id&&n?.items?.[K.progress_id]?.status==="approved"),Ue=M.filter(J=>Math.abs(Number(J.getAttribute("y"))-V)<.8);Ue.push(...O.filter(J=>{let Re=Number(J.getAttribute("y1")),Ve=Number(J.getAttribute("y2"));return Number.isFinite(Re)&&Number.isFinite(Ve)&&Math.abs(Re-Ve)<.8&&Math.abs((Re+Ve)/2-oe)<=14})),Ue.push(...v.filter(J=>{let Re=(J.getAttribute("points")??"").trim().split(/\s+/).map(vr=>Number(vr.split(",")[1])).filter(Number.isFinite);if(!Re.length)return!1;let Ve=Math.min(...Re),dt=Math.max(...Re);return dt-Ve<=16&&Math.abs((Ve+dt)/2-oe)<=14})),Ue.forEach(J=>{J.dataset.umlStepElement=String(X),J.classList.add("uml-step-element"),J.classList.toggle("uml-step-element-active",X===xe),J.classList.toggle("uml-step-element-completed",ct)});let ue=document.createElementNS("http://www.w3.org/2000/svg","rect");ue.setAttribute("x",String(L)),ue.setAttribute("y",String(V-12)),ue.setAttribute("width",String(H)),ue.setAttribute("height","31"),ue.setAttribute("fill","transparent"),ue.setAttribute("pointer-events","all"),ue.setAttribute("role","button"),ue.setAttribute("tabindex","0"),ue.setAttribute("aria-label",`Poka\u017C krok ${String(K.number).padStart(2,"0")}: ${K.label}`),ue.dataset.umlStep=String(X),ue.classList.add("uml-step-hit"),ue.classList.toggle("uml-step-hit-active",se!=="card"&&X===xe),ue.classList.toggle("uml-step-hit-completed",ct),x.appendChild(ue)})},[t.alt,e.kind,l,se,n,xe,p,j]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(x&&(x.querySelectorAll(".uml-layout-hit,.uml-layout-resize").forEach(S=>S.remove()),x.classList.toggle("uml-layout-editing",C),!(!C||!j)))for(let S of y.current.values()){let M=j.elements[S.id]??po(S),O=document.createElementNS("http://www.w3.org/2000/svg","rect");O.setAttribute("x",String(M.x)),O.setAttribute("y",String(M.y)),O.setAttribute("width",String(Math.max(12,M.width))),O.setAttribute("height",String(Math.max(12,M.height))),O.setAttribute("tabindex","0"),O.setAttribute("role","button"),O.setAttribute("aria-label",`Edytuj element UML ${S.id}`),O.dataset.umlLayoutId=S.id,O.dataset.umlLayoutAction="move",O.classList.add("uml-layout-hit"),S.id===Q&&O.classList.add("is-selected");let v=document.createElementNS("http://www.w3.org/2000/svg","title");if(v.textContent=`${S.id} \xB7 przeci\u0105gnij, aby zmieni\u0107 po\u0142o\u017Cenie`,O.appendChild(v),x.appendChild(O),S.id===Q){let w=Math.max(8,Math.min(14,Math.min(M.width,M.height)*.1)),L=document.createElementNS("http://www.w3.org/2000/svg","rect");L.setAttribute("x",String(M.x+M.width-w/2)),L.setAttribute("y",String(M.y+M.height-w/2)),L.setAttribute("width",String(w)),L.setAttribute("height",String(w)),L.dataset.umlLayoutId=S.id,L.dataset.umlLayoutAction="resize",L.classList.add("uml-layout-resize"),x.appendChild(L)}}},[p,C,j,Q,Ge]),(0,N.useEffect)(()=>{C&&(!Q||!y.current.has(Q))&&et(Ge[0]??null)},[C,Ge,Q]),(0,N.useEffect)(()=>{if(me===0||f.current===me)return;let x=!1,S=0,M=v=>{if(x)return;let w=m.current?.querySelector(`.uml-step-hit[data-uml-step="${xe}"]`);if(!w)return;if(document.querySelector(".viewer-chrome")?.classList.contains("is-nvim-fit")){f.current=me;return}let H=Sp(w);if(!H){f.current=me;return}let K=sg(w);if(!K){let Z=dg(w,H),V=Z===0?up(w,H):0,oe=Z===0?sp(w,V):Z;if(vFn){S=window.requestAnimationFrame(()=>M(v+1));return}f.current=me;return}let X=up(w,K);if(Math.abs(X)<=Fn){f.current=me;return}let D=sp(w,X);if(vFn){S=window.requestAnimationFrame(()=>M(v+1));return}f.current=me},O=window.requestAnimationFrame(()=>M(0));return()=>{x=!0,window.cancelAnimationFrame(O),window.cancelAnimationFrame(S)}},[me,xe,p]);let F=(x,S,M=se,O=!0)=>{let v={task:e.task??null,block:e.block??null,phase:{id:x.phase.id,label:x.phase.label},step:x.step,focusLevel:M,activate:S&&document.documentElement.dataset.nvimSyncMode==="on"},w=()=>{window.dispatchEvent(new CustomEvent("stem:nvim-step",{detail:v}))};if(!O){w();return}let L=fetch("/api/navigation/current",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({task:v.task,block:v.block,phase:v.phase,step:{id:v.step.id,number:v.step.number,label:v.step.label,mode:v.step.mode??(v.step.snapshot_ref?"RUN":"CODE"),code_ref:v.step.code_ref??null,event_id:v.step.event_id??null,strategy_ref:v.step.strategy_ref??null},snapshot_ref:v.step.snapshot_ref??null,focus_level:v.focusLevel,sync_requested:!!v.activate,actor:document.documentElement.dataset.cardClientId??"browser"})});v.activate?L.then(w,w):(w(),L.catch(()=>{}))},B=(x,S=!1,M=se,O=!0)=>{let v=Math.max(0,Math.min(l.length-1,x)),w=l[v];if(w){if(A(M),v===xe){F(w,S,M,O);return}Dn(L=>L+1),E.current=S,b.current=M,_.current=O,bn(v)}},te=(x,S)=>{let M=m.current?.querySelector("svg"),O=M?.getScreenCTM();if(!M||!O)return null;let v=M.createSVGPoint();return v.x=x,v.y=S,v.matrixTransform(O.inverse())},at=x=>{if(!C||!j)return;let S=x.target?.closest(".uml-layout-hit[data-uml-layout-id],.uml-layout-resize[data-uml-layout-id]"),M=S?.dataset.umlLayoutId,O=M?y.current.get(M):null,v=te(x.clientX,x.clientY);if(!M||!O||!v)return;x.preventDefault(),x.stopPropagation();let w=j.elements[M]??po(O);g.current={id:M,action:S?.dataset.umlLayoutAction==="resize"?"resize":"move",pointerId:x.pointerId,startX:v.x,startY:v.y,initial:w},et(M),I(L=>L&&{...L,elements:{...L.elements,[M]:w}}),x.currentTarget.setPointerCapture(x.pointerId)},zt=x=>{let S=g.current;if(!S||S.pointerId!==x.pointerId)return;let M=te(x.clientX,x.clientY);if(!M)return;x.preventDefault();let O=M.x-S.startX,v=M.y-S.startY,w=S.action==="resize"?{...S.initial,width:Math.max(24,S.initial.width+O),height:Math.max(18,S.initial.height+v)}:{...S.initial,x:S.initial.x+O,y:S.initial.y+v};I(L=>L&&{...L,elements:{...L.elements,[S.id]:w}}),re(!0)},Ee=x=>{let S=g.current;!S||S.pointerId!==x.pointerId||(g.current=null,x.currentTarget.hasPointerCapture(x.pointerId)&&x.currentTarget.releasePointerCapture(x.pointerId))},ne=(x,S)=>{let M=y.current.get(x);M&&(I(O=>{if(!O)return O;let v=O.elements[x]??po(M);return{...O,elements:{...O.elements,[x]:S(v)}}}),re(!0))},st=async()=>{if(!j||!t.source_href)return;let x=Object.fromEntries(Array.from(y.current.values()).map(M=>[M.id,j.elements[M.id]??po(M)])),S={...j,elements:x};U("Zapisywanie uk\u0142adu\u2026");try{let M=await fetch("/api/uml-layout",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({source:t.source_href,layout:S,actor:document.documentElement.dataset.cardClientId??"browser"})});if(!M.ok)throw new Error((await M.json().catch(()=>null))?.message??`HTTP ${M.status}`);let O=await M.json();R(O.layout),I(O.layout),re(!1),Ne(!1),U(`Zapisano ${Object.keys(O.layout.elements).length} element\xF3w w JSON.`)}catch(M){U(`B\u0142\u0105d zapisu: ${M instanceof Error?M.message:String(M)}`)}},Ye=()=>{T&&(I(T),re(!1),U("Przywr\xF3cono ostatnio zapisany uk\u0142ad."))},wn=async()=>{if(!(!t.source_href||!window.confirm("Usun\u0105\u0107 r\u0119czny uk\u0142ad i wr\xF3ci\u0107 do geometrii PlantUML?"))){U("Resetowanie uk\u0142adu\u2026");try{let x=await fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}&actor=${encodeURIComponent(document.documentElement.dataset.cardClientId??"browser")}`,{method:"DELETE"});if(!x.ok)throw new Error(`HTTP ${x.status}`);let S=fs(t,e,T?.source_digest??"");R(S),I(S),re(!1),et(null),U("Przywr\xF3cono automatyczny uk\u0142ad PlantUML.")}catch(x){U(`B\u0142\u0105d resetu: ${x instanceof Error?x.message:String(x)}`)}}},ie=(x,S)=>{if(C)return;let M=Array.from(m.current?.querySelectorAll(".uml-step-hit[data-uml-step]")??[]).filter(v=>{let w=v.getBoundingClientRect();return x>=w.left&&x<=w.right&&S>=w.top&&S<=w.bottom}).sort((v,w)=>{let L=v.getBoundingClientRect(),H=w.getBoundingClientRect();return Math.abs(S-(L.top+L.bottom)/2)-Math.abs(S-(H.top+H.bottom)/2)}),O=Number(M[0]?.dataset.umlStep);Number.isInteger(O)&&B(O,!1,"step")},q=x=>{if(C||x.key!=="Enter"&&x.key!==" ")return;let S=x.target,M=Number(S.dataset?.umlStep);Number.isInteger(M)&&(x.preventDefault(),B(M,x.key==="Enter","step"))},bt=x=>{let S=l.findIndex(M=>M.phase.id===x.id);S>=0&&B(S,!1,"phase")},fe=l[xe];if((0,N.useEffect)(()=>{fe&&(F(fe,E.current,b.current??se,_.current),E.current=!1,b.current=null,_.current=!0)},[fe?.phase.id,fe?.step.id,e.block]),(0,N.useEffect)(()=>{let x=S=>{let M=S.detail;if(!M||e.task?.id&&M.task.id!==e.task.id||e.block?.id&&M.block.id!==e.block.id)return;let O=l.findIndex(v=>v.phase.id===M.phase.id&&v.step.id===M.step.id);if(O<0){A("card");return}B(O,!1,M.focus_level,!1)};return window.addEventListener("stem:navigation-command",x),()=>window.removeEventListener("stem:navigation-command",x)},[e.block?.id,e.task?.id,l,se,xe]),(0,N.useEffect)(()=>{let x=S=>{if(S.metaKey||C||S.target?.closest("input, textarea, select, [contenteditable='true']"))return;let O=d.current;if(!O)return;let v=Array.from(document.querySelectorAll("[data-stem-nav='uml-block']")),w=window.innerHeight/2;if(v.sort((D,Z)=>{let V=D.getBoundingClientRect(),oe=Z.getBoundingClientRect();return Math.abs((V.top+V.bottom)/2-w)-Math.abs((oe.top+oe.bottom)/2-w)})[0]!==O)return;if(S.key==="Enter"&&S.ctrlKey&&!S.altKey&&!S.shiftKey){if(!fe?.step.progress_id||!n)return;S.preventDefault(),S.stopPropagation();let D=n.items?.[fe.step.progress_id]?.status==="approved";r(fe.step.progress_id,D?"pending":"approved");return}if(S.key==="Enter"&&!S.altKey&&!S.shiftKey){if(!fe)return;S.preventDefault(),S.stopPropagation(),F(fe,!0,se);return}let H=["card","task","block","phase","step","snapshot"];if((S.key==="ArrowLeft"||S.key==="ArrowRight"||S.key==="Escape")&&!S.altKey&&!S.ctrlKey&&!S.shiftKey){let D=S.key==="ArrowRight"?1:-1,Z=H[Math.max(0,Math.min(H.length-1,H.indexOf(se)+D))];S.preventDefault(),S.stopPropagation(),A(Z),fe&&F(fe,!1,Z);return}if(S.key!=="ArrowUp"&&S.key!=="ArrowDown"||se==="card"&&!S.altKey&&!S.ctrlKey&&!S.shiftKey)return;let K=S.key==="ArrowUp"?-1:1,X=se;if(S.altKey&&S.shiftKey&&!S.ctrlKey)X="snapshot";else if(S.ctrlKey&&S.shiftKey&&!S.altKey)X="step";else if(S.altKey&&!S.ctrlKey&&!S.shiftKey)X="task";else if(S.ctrlKey&&!S.altKey&&!S.shiftKey)X="block";else if(S.shiftKey&&!S.altKey&&!S.ctrlKey)X="phase";else if(S.altKey||S.ctrlKey||S.shiftKey)return;S.preventDefault(),S.stopPropagation(),fetch("/api/navigation/move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({level:X,delta:K,sync_requested:!1,actor:document.documentElement.dataset.cardClientId??"browser"})}).then(D=>D.ok?D.json():Promise.reject(new Error(`HTTP ${D.status}`))).then(D=>{D.current&&window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:D.current}))}).catch(()=>{})};return window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)},[fe,l,se,r,n,C]),!fe)return null;let{phase:Qt,step:jn}=fe,qt=l.filter(x=>x.phase.id===Qt.id),ho=e.block?.label.match(/^A[1-8]\b/)?.[0]??"UML",yo=(e.title??e.block?.label??t.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,""),Un=Q?y.current.get(Q)??null:null,ut=Un?j?.elements[Un.id]??po(Un):null;return(0,a.jsxs)("div",{ref:d,className:"uml-react uml-snapshot-react","data-stem-nav":"uml-block","data-task-id":e.task?.id,"data-block-id":e.block?.id,"data-navigation-level":se,children:[(0,a.jsxs)("header",{className:"uml-snapshot-header",children:[(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:ho})," \u2014 ",yo,t.tile&&(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",t.tile.index,"/",t.tile.count," \xB7 r",t.tile.row," c",t.tile.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(_p,{continuation:o}),t.source_href&&(0,a.jsx)("button",{className:`uml-edit-toggle${C?" is-active":""}`,"aria-pressed":C,title:"R\u0119czna edycja po\u0142o\u017Cenia i parametr\xF3w blok\xF3w UML",onClick:()=>P(x=>!x),children:C?"ZAMKNIJ EDIT":"EDIT"}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy diagramu",children:i.map(x=>(0,a.jsx)("button",{"aria-pressed":Qt.id===x.id,onClick:()=>bt(x),children:x.label},x.id))}),(0,a.jsx)("div",{className:"uml-step-actions","aria-label":`Checkpointy fazy ${Qt.label}`,children:qt.map(x=>{let S=l.indexOf(x),M=!!(x.step.progress_id&&n?.items?.[x.step.progress_id]?.status==="approved");return(0,a.jsx)("button",{"aria-label":`Krok ${x.step.number}: ${x.step.label}`,"aria-pressed":se!=="card"&&S===xe,"data-completed":M?"true":"false","data-mode":x.step.mode??"RUN",title:`${x.step.mode??"RUN"} \xB7 ${x.step.label}`,onClick:()=>B(S),children:String(x.step.number).padStart(2,"0")},x.step.id)})})]})]}),e.block?.description&&(0,a.jsx)("p",{className:"uml-header-description",children:e.block.description})]}),(0,a.jsxs)("div",{className:"uml-snapshot-layout",children:[(0,a.jsxs)("div",{ref:m,className:`uml-canvas uml-step-canvas${C?" is-layout-editing":""}`,onClick:x=>ie(x.clientX,x.clientY),onKeyDown:q,onPointerDown:at,onPointerMove:zt,onPointerUp:Ee,onPointerCancel:Ee,children:[p?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:hs(t.tile),dangerouslySetInnerHTML:{__html:p}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),h&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 wybierz krok przyciskiem nad diagramem."})]}),C&&j&&(0,a.jsxs)("aside",{className:"uml-layout-editor","aria-label":"Edytor uk\u0142adu UML",children:[(0,a.jsxs)("div",{className:"uml-layout-editor-title",children:[(0,a.jsx)("strong",{children:"UML layout"}),(0,a.jsx)("span",{children:ke?"niezapisane zmiany":"zapisany"}),Le&&(0,a.jsx)("b",{children:"\u0179r\xF3d\u0142o PlantUML zmieni\u0142o si\u0119"})]}),(0,a.jsxs)("label",{children:["Element",(0,a.jsx)("select",{value:Q??"",onChange:x=>et(x.target.value||null),children:Ge.map(x=>(0,a.jsx)("option",{value:x,children:x},x))})]}),Q&&ut&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"uml-layout-number-grid",children:["x","y","width","height"].map(x=>(0,a.jsxs)("label",{children:[x,(0,a.jsx)("input",{type:"number",step:"1",min:x==="width"||x==="height"?12:void 0,value:Math.round(ut[x]*100)/100,onChange:S=>ne(Q,M=>({...M,[x]:Number(S.target.value)}))})]},x))}),(0,a.jsxs)("label",{className:"uml-layout-editor-text",children:["Tekst bloku \u2014 jeden wiersz SVG na lini\u0119",(0,a.jsx)("textarea",{rows:Math.max(3,Math.min(10,ut.text?.lines?.length??3)),value:(ut.text?.lines??[]).join(` +`),onChange:x=>ne(Q,S=>({...S,text:{...S.text,title:x.target.value.split(` +`)[0]??"",description:x.target.value.split(` +`).slice(1).join(` +`),lines:x.target.value.split(` +`)}}))})]}),(0,a.jsxs)("div",{className:"uml-layout-style-grid",children:[(0,a.jsxs)("label",{children:["Font",(0,a.jsx)("input",{type:"number",min:"4",max:"96",step:"0.5",value:ut.text?.font_size??12,onChange:x=>ne(Q,S=>({...S,text:{...S.text,font_size:Number(x.target.value)}}))})]}),(0,a.jsxs)("label",{children:["Wyr\xF3wnanie",(0,a.jsxs)("select",{value:ut.text?.align??"left",onChange:x=>ne(Q,S=>({...S,text:{...S.text,align:x.target.value}})),children:[(0,a.jsx)("option",{value:"left",children:"left"}),(0,a.jsx)("option",{value:"center",children:"center"}),(0,a.jsx)("option",{value:"right",children:"right"})]})]}),(0,a.jsxs)("label",{children:["Wype\u0142nienie",(0,a.jsx)("input",{type:"color",value:ut.style?.fill??"#edf6fa",onChange:x=>ne(Q,S=>({...S,style:{...S.style,fill:x.target.value}}))})]}),(0,a.jsxs)("label",{children:["Obramowanie",(0,a.jsx)("input",{type:"color",value:ut.style?.stroke??"#2c7794",onChange:x=>ne(Q,S=>({...S,style:{...S.style,stroke:x.target.value}}))})]}),(0,a.jsxs)("label",{children:["Linia",(0,a.jsx)("input",{type:"number",min:"0.5",max:"12",step:"0.25",value:ut.style?.stroke_width??1.5,onChange:x=>ne(Q,S=>({...S,style:{...S.style,stroke_width:Number(x.target.value)}}))})]})]})]}),(0,a.jsxs)("div",{className:"uml-layout-editor-actions",children:[(0,a.jsx)("button",{className:"is-primary",disabled:!ke,onClick:()=>void st(),children:"Zapisz uk\u0142ad"}),(0,a.jsx)("button",{disabled:!ke,onClick:Ye,children:"Cofnij zmiany"}),(0,a.jsx)("button",{className:"is-danger",onClick:()=>void wn(),children:"Reset PlantUML"})]}),(0,a.jsx)("output",{children:G})]})]})]})}function Vg(e){return e.config.phases?.length?(0,a.jsx)(Ug,{...e}):(0,a.jsx)(jg,{...e})}function Bg({asset:e,continuation:t}){let n=e.tile;if(!n)return(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy"});let r=e.diagram_block_label?.match(/^A[1-8]\b/)?.[0]??e.diagram_title?.match(/^A[1-8]\b/)?.[0]??e.caption.match(/^A[1-8]\b/)?.[0]??"UML",o=(e.diagram_title??e.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,"");return(0,a.jsxs)("div",{className:"uml-react uml-snapshot-react uml-static-tile",children:[(0,a.jsxs)("header",{className:"uml-snapshot-header",children:[(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:r})," \u2014 ",o,(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",n.index,"/",n.count," \xB7 r",n.row," c",n.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(_p,{continuation:t}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy logicznego diagramu",children:(e.diagram_phase_labels??[]).map(i=>(0,a.jsx)("span",{children:i},i))})]})]}),e.diagram_description&&(0,a.jsx)("p",{className:"uml-header-description",children:e.diagram_description})]}),(0,a.jsx)("div",{className:"uml-snapshot-layout",children:(0,a.jsx)("div",{className:"uml-canvas uml-step-canvas",children:(0,a.jsx)("div",{className:"uml-svg-host is-tiled is-static",style:hs(n),children:(0,a.jsx)("div",{className:"uml-static-crop",style:{width:`${n.width}px`,height:`${n.height}px`},children:(0,a.jsx)("img",{src:e.href,alt:e.alt,style:{width:`${n.full_width}px`,height:`${n.full_height}px`,transform:`translate(${-(n.x-n.full_x)}px, ${-(n.y-n.full_y)}px)`}})})})})})]})}function Hg({asset:e,number:t,progress:n,onSetStatus:r,continuation:o}){let i=e.interactive?.kind,l=!!i;return(0,a.jsxs)("figure",{className:`card-asset asset-${e.kind} ${l?"asset-interactive":""}`,id:e.label.replace(":","-"),children:[i==="uml-sequence"||i==="uml-class"?(0,a.jsx)(Vg,{config:e.interactive,asset:e,progress:n,onSetStatus:r,continuation:o}):i==="allocator-memory-flow"?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Dg,{config:e.interactive,title:e.caption}),(0,a.jsx)("img",{className:"asset-static-fallback",src:e.href,alt:e.alt})]}):e.tile?(0,a.jsx)(Bg,{asset:e,continuation:o}):(0,a.jsx)("a",{href:e.href,target:"_blank",rel:"noopener",children:(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy",style:{width:`${e.width*100}%`}})}),e.source_href&&(0,a.jsx)("a",{className:"asset-source-link",href:e.source_href,target:"_blank",rel:"noopener",children:"\u0179r\xF3d\u0142o PlantUML"}),(0,a.jsxs)("figcaption",{children:["Rys. ",e.figure_number??t,". ",e.caption]})]})}function Kg({steps:e,progress:t,onCycle:n}){if(!e.length)return null;let r={pending:"\u25CB niezatwierdzony",approved:"\u25CF zatwierdzony"};return(0,a.jsx)("div",{className:"step-map",children:e.map(o=>{let i=t?.items?.[o.id]?.status??"pending";return(0,a.jsxs)("div",{className:`step-row ${i==="approved"?"lesson-progress-completed":""}`,children:[(0,a.jsx)("button",{className:"lesson-progress-control","data-status":i,onClick:()=>n(o.id,i),disabled:!t,children:r[i]}),(0,a.jsx)("span",{className:"step-title",children:o.title})]},o.id)})})}function Wg({section:e,progress:t,onCycle:n,onSetStatus:r,figureOffset:o}){let i=vg(e);return(0,a.jsxs)(ys,{header:e.header_html,left:e.left_margin_html,right:e.right_margin_html,className:`section-sheet${e.assets.length?" section-sheet--asset":""} sheet--${e.page_orientation||"portrait"}`,children:[(0,a.jsx)("div",{id:e.id,className:"section-anchor"}),e.show_heading&&(0,a.jsxs)("h2",{className:"section-heading",children:[(0,a.jsx)("span",{className:"section-index",children:e.index}),(0,a.jsx)("span",{className:"section-title",children:e.title})]}),(0,a.jsx)(Kg,{steps:e.steps,progress:t,onCycle:n}),e.content_html&&(0,a.jsx)(Yt,{html:e.content_html}),(0,a.jsx)("div",{className:"tasks",children:e.tasks.map(l=>(0,a.jsx)(Fg,{task:l},l.ref))}),e.assets.map((l,s)=>(0,a.jsx)(Hg,{asset:l,number:o+s+1,progress:t,onSetStatus:r,continuation:i},l.label)),e.tasks.map(l=>l.conclusion_html&&(0,a.jsxs)("aside",{className:"task-conclusion",children:[(0,a.jsx)("strong",{children:"WNIOSEK"}),(0,a.jsx)(Yt,{html:l.conclusion_html})]},`${l.ref}-conclusion`))]})}function Gg({progress:e,error:t}){if(!e?.summary&&!t)return null;let n=e?.summary.counts;return(0,a.jsxs)("section",{className:"lesson-progress-topbar","aria-label":"Przebieg zaj\u0119\u0107",children:[(0,a.jsx)("strong",{children:"PRZEBIEG"}),n&&(0,a.jsxs)("output",{title:"Zatwierdzone kroki",children:[n.approved,"/",e.summary.total]}),t&&(0,a.jsx)("span",{className:"lesson-progress-error",title:t,children:"!"}),(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",title:"Otw\xF3rz raport do Teams",children:"Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",title:"Otw\xF3rz \u015Blad lekcji ze zrzutami",children:"\u015Alad"})]})}var In=[{id:"u01",name:"Alicja Nowak",laptop:3,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u02",name:"Bartosz Kowalski",laptop:7,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u03",name:"Celina Wi\u015Bniewska",laptop:11,connection:"away",sync:"paused",position:"A5\xB705"},{id:"u04",name:"Dawid W\xF3jcik",laptop:14,connection:"offline",sync:"follow",position:"\u2014"},{id:"u05",name:"Emilia Kami\u0144ska",laptop:18,connection:"online",sync:"local",position:"A3\xB702"},{id:"u06",name:"Filip Lewandowski",laptop:22,connection:"error",sync:"follow",position:"A5\xB706"},{id:"u07",name:"Gabriela Zieli\u0144ska",laptop:24,connection:"online",sync:"follow",position:"A5\xB708"}];function Yg(e){let t=new Map,n=(r,o)=>{let i=r.trim()||"task",l=t.get(i);return l||(l={id:i,label:o.trim()||i.toUpperCase(),blocks:[],exercises:[]},t.set(i,l)),l};for(let r of e.sections){for(let o of r.assets){let i=o.interactive;if(!i?.task||!i.block)continue;let l=n(i.task.id,i.task.label),s=`diagram:${i.block.id}`,u=l.blocks.find(d=>d.id===s);u||(u={id:s,label:i.block.label,kind:"diagram",phases:[],steps:[]},l.blocks.push(u));for(let d of i.phases??[]){let m=u.phases.find(y=>y.id===d.id);m||(m={...d,steps:[]},u.phases.push(m));for(let y of d.steps)m.steps.some(g=>g.id===y.id)||m.steps.push(y)}}for(let o of r.tasks){let i=n(o.ref,o.title);i.label=o.title||i.label;for(let l of o.flow){if(l.kind==="exercise"){i.exercises.some(u=>u.id===l.id)||i.exercises.push(l);continue}let s=`flow:${l.id}`;i.blocks.some(u=>u.id===s)||i.blocks.push({id:s,label:l.title,kind:"flow",phases:[],steps:l.steps.map((u,d)=>({id:u.id,number:d+1,label:u.title,description:u.title,mode:"RUN"}))})}}}return[...t.values()]}function hp({side:e,panels:t,activeId:n,pinnedId:r,onActiveChange:o,onPinnedChange:i}){let l=(0,N.useRef)(0),s=t.find(f=>f.id===n)??null,u=(0,N.useCallback)(()=>{window.clearTimeout(l.current)},[]),d=(0,N.useCallback)(()=>{u(),!r&&(l.current=window.setTimeout(()=>o(null),150))},[u,o,r]),m=(0,N.useCallback)(f=>{u(),r||o(f)},[u,o,r]),y=(0,N.useCallback)(f=>{if(u(),r===f){i(null),o(null);return}i(f),o(f)},[u,o,i,r]),g=(0,N.useCallback)(()=>{u(),i(null),o(null)},[u,o,i]);return(0,N.useEffect)(()=>()=>window.clearTimeout(l.current),[]),t.length?(0,a.jsxs)("div",{className:`side-panel-dock side-panel-dock--${e}`,"data-side":e,children:[(0,a.jsx)("nav",{className:"side-panel-rail","aria-label":`Panele ${e==="left"?"lewe":"prawe"}`,children:t.map(f=>{let E=n===f.id,b=r===f.id;return(0,a.jsx)("button",{type:"button",className:`side-panel-trigger${E?" is-open":""}${b?" is-pinned":""}`,style:{"--side-panel-accent":f.accent},"aria-controls":`side-panel-${e}-${f.id}`,"aria-expanded":E,"aria-pressed":b,"aria-label":`${f.title}: ${b?"odpnij":"przypnij"} panel`,title:`${f.title} \xB7 ${b?"Fixed":"Auto"}`,onMouseEnter:()=>m(f.id),onMouseLeave:d,onFocus:()=>m(f.id),onClick:()=>y(f.id),children:(0,a.jsx)("span",{children:f.railLabel})},f.id)})}),(0,a.jsx)("aside",{id:s?`side-panel-${e}-${s.id}`:void 0,className:`side-panel${s?" is-open":""}`,"aria-hidden":!s,"aria-label":s?.title,style:s?{"--side-panel-accent":s.accent}:void 0,onMouseEnter:u,onMouseLeave:d,onFocusCapture:u,children:s&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("header",{className:"side-panel-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:e==="left"?"LEWY PANEL":"PRAWY PANEL"}),(0,a.jsx)("strong",{children:s.title})]}),(0,a.jsxs)("div",{className:"side-panel-actions",children:[(0,a.jsx)("button",{type:"button",className:r===s.id?"is-pinned":"",onClick:()=>y(s.id),title:r===s.id?"Tryb Fixed \u2014 kliknij, aby przej\u015B\u0107 do Auto":"Tryb Auto \u2014 kliknij, aby przypi\u0105\u0107",children:r===s.id?"Fixed":"Auto"}),(0,a.jsx)("button",{type:"button",onClick:g,"aria-label":`Zamknij ${s.title}`,children:"\xD7"})]})]}),(0,a.jsx)("div",{className:"side-panel-body",children:s.content})]})})]}):null}function fo({id:e,depth:t,kind:n,title:r,label:o,refValue:i,stateValue:l,stateKind:s,hasChildren:u=!1,expanded:d=!1,onToggle:m,href:y,current:g=!1,unavailable:f=!1,onNavigate:E}){let b=y?(0,a.jsx)("a",{className:"card-library-tree-link",href:y,onClick:E,"aria-current":g?"page":void 0,title:g?"Poka\u017C bie\u017C\u0105c\u0105 kart\u0119":`Otw\xF3rz: ${r}`,children:o}):(0,a.jsx)("span",{className:"card-library-tree-label",title:r,children:o});return(0,a.jsxs)("div",{className:`card-library-treegrid-row is-${n}${g?" is-current":""}${f?" is-unavailable":""}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"aria-disabled":f||void 0,"data-node-id":e,style:{"--card-library-depth":t},children:[(0,a.jsxs)("span",{className:"card-library-tree-title",role:"gridcell",children:[u?(0,a.jsx)("button",{className:"card-library-tree-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${r}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"card-library-tree-expander is-empty","aria-hidden":"true"}),b]}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:(0,a.jsx)("b",{className:"card-library-tree-state","data-state":s,children:l})})]})}function Qg({library:e,onNavigate:t}){if(!e)return null;let n=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.length,0),0),r=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.reduce((f,E)=>f+E.cards.filter(b=>b.available).length,0),0),0),o=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.reduce((f,E)=>f+E.cards.length,0),0),0),[i,l]=(0,N.useState)(()=>{let d=new Set;return e.subjects.forEach(m=>{let y=`subject:${m.id}`;m.current&&d.add(y),m.levels.forEach(g=>{let f=`${y}:level:${g.id}`;g.current&&d.add(f),g.series.forEach(E=>{let b=`${f}:series:${E.id}`;E.current&&d.add(b),E.cards.forEach(_=>{_.current&&(_.tasks?.length??0)>0&&d.add(`${b}:card:${_.id}`)})})})}),d}),s=d=>i.has(d),u=d=>{l(m=>{let y=new Set(m);return y.has(d)?y.delete(d):y.add(d),y})};return(0,a.jsxs)("div",{className:"card-library-panel",children:[(0,a.jsxs)("div",{className:"card-library-treegrid",role:"treegrid","aria-label":"Serie, karty i taski","aria-colcount":3,children:[(0,a.jsxs)("div",{className:"card-library-treegrid-row card-library-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"STATUS"})]}),e.subjects.map(d=>{let m=`subject:${d.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:m,depth:0,kind:"subject",title:d.title,label:(0,a.jsx)("strong",{children:d.title}),refValue:"PRZEDMIOT",stateValue:`${d.levels.length} POZ.`,hasChildren:d.levels.length>0,expanded:s(m),onToggle:()=>u(m)}),s(m)&&d.levels.map(y=>{let g=`${m}:level:${y.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:g,depth:1,kind:"level",title:y.title,label:(0,a.jsx)("strong",{children:y.title}),refValue:"ROK",stateValue:`${y.series.length} SERII`,hasChildren:y.series.length>0,expanded:s(g),onToggle:()=>u(g)}),s(g)&&y.series.map(f=>{let E=`${g}:series:${f.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:E,depth:2,kind:"series",title:f.title,label:(0,a.jsx)("strong",{children:f.title}),refValue:f.role==="reference"?"REF.":"SERIA",stateValue:`${f.cards.length} KART`,hasChildren:f.cards.length>0,expanded:s(E),onToggle:()=>u(E)}),s(E)&&f.cards.map(b=>{let _=`${E}:card:${b.id}`,p=b.tasks??[],c=b.current||b.available,h=b.current?"current":b.available?"online":"plan";return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:_,depth:3,kind:"card",title:`${b.id} \xB7 ${b.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:b.id}),(0,a.jsx)("span",{children:b.title})]}),refValue:b.version||"\u2014",stateValue:b.current?"BIE\u017B\u0104CA":b.available?"ONLINE":"PLAN",stateKind:h,hasChildren:p.length>0,expanded:s(_),onToggle:()=>u(_),href:c?b.current?"#":b.href:void 0,current:b.current,unavailable:!c,onNavigate:t}),s(_)&&p.map(k=>{let C=b.current?`#${k.id}`:`${b.href}#${k.id}`;return(0,a.jsx)(fo,{id:`${_}:task:${k.id}`,depth:4,kind:"task",title:`${k.id.toUpperCase()} \xB7 ${k.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:k.id.toUpperCase()}),(0,a.jsx)("span",{children:k.title})]}),refValue:"TASK",stateValue:c?"GOTOWY":"PLAN",stateKind:c?"online":"plan",href:c?C:void 0,unavailable:!c,onNavigate:t},`${_}:task:${k.id}`)})]},_)})]},E)})]},g)})]},m)})]}),(0,a.jsxs)("footer",{className:"card-library-footer",children:[(0,a.jsx)("span",{children:e.workspace||"STEM"}),(0,a.jsxs)("span",{children:[n," serii"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("i",{className:"is-online"})," ",r,"/",o," online"]}),(0,a.jsx)("kbd",{children:"Esc"})]})]})}function qg({toc:e,onNavigate:t}){return(0,a.jsxs)("nav",{className:"side-toc","aria-label":"Spis tre\u015Bci karty",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"KARTA PRACY"}),(0,a.jsx)("h2",{children:"Spis tre\u015Bci"})]}),(0,a.jsx)("ol",{children:e.map((n,r)=>(0,a.jsx)("li",{children:(0,a.jsxs)("a",{href:`#${n.id}`,onClick:t,children:[(0,a.jsx)("span",{children:String(r+1).padStart(2,"0")}),(0,a.jsx)("strong",{children:n.label})]})},n.id))})]})}function Xg({progress:e,error:t}){let n=e?.summary?.counts;return(0,a.jsxs)("section",{className:"side-progress","aria-label":"Przebieg zaj\u0119\u0107 i raport",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"DOWODY I RAPORT"}),(0,a.jsx)("h2",{children:"Przebieg zaj\u0119\u0107"})]}),(0,a.jsxs)("div",{className:"side-progress-summary",children:[(0,a.jsx)("span",{children:"Zatwierdzone kroki"}),(0,a.jsx)("strong",{children:n?`${n.approved}/${e.summary.total}`:"\u2014"})]}),t&&(0,a.jsx)("p",{className:"side-progress-error",children:t}),(0,a.jsxs)("div",{className:"side-progress-links",children:[(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",children:"Raport do Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",children:"\u015Alad lekcji ze zrzutami"})]})]})}var Zg={online:"ONLINE",away:"ZAJ\u0118TY",offline:"OFFLINE",error:"B\u0141\u0104D"},Jg={follow:"SYNC",paused:"PAUZA",local:"LOKAL."},yp={present:"BY\u0141",missed:"NIE BY\u0141",pending:"OCZEK."},eh={committed:"COMMIT",working:"PRACA",missing:"BRAK"};function zp(e){let t=2166136261;for(let n=0;n>>0}function vp(e,t,n){let r=zp(`${e.id}:step:${t}`),o=r%8,i=o===0?"missed":o===1?"pending":"present",l=8+n*4+r%3,s=10+Math.floor(l/60),u=l%60,d=(e.laptop*7+r)%60;return{state:i,timestamp:i==="present"?`${String(s).padStart(2,"0")}:${String(u).padStart(2,"0")}:${String(d).padStart(2,"0")}`:"\u2014"}}function xp(e,t){let n=zp(`${e.id}:exercise:${t}`),r=n%6,o=r===0?"missing":r===1?"working":"committed";return{state:o,commit:o==="committed"?n.toString(16).padStart(8,"0").slice(0,7):"\u2014"}}function Gt({id:e,depth:t,title:n,kind:r,refValue:o,session:i,evidence:l,state:s,hasChildren:u=!1,expanded:d=!1,onToggle:m}){return(0,a.jsxs)("div",{className:`classroom-treegrid-row classroom-node-row is-${r}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"data-node-id":e,style:{"--classroom-depth":t},children:[(0,a.jsxs)("span",{className:"classroom-node-title",role:"gridcell",title:n,children:[u?(0,a.jsx)("button",{className:"classroom-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${n}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"classroom-expander is-empty","aria-hidden":"true"}),(0,a.jsx)("strong",{children:n})]}),(0,a.jsx)("span",{role:"gridcell",children:o}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:l}),(0,a.jsx)("span",{role:"gridcell",children:s})]})}function th({model:e}){let t=Yg(e),n=In[0]?.id,r=t[0]?.id,[o,i]=(0,N.useState)(()=>new Set(["class",...n?[`student:${n}`]:[],...n&&r?[`student:${n}:task:${r}`]:[]])),l=m=>o.has(m),s=m=>{i(y=>{let g=new Set(y);return g.has(m)?g.delete(m):g.add(m),g})},u=In.filter(m=>m.connection==="online"||m.connection==="away").length,d=In.filter(m=>m.sync==="follow").length;return(0,a.jsxs)("section",{className:"classroom-panel","aria-label":"Klasa i stanowiska uczni\xF3w",children:[(0,a.jsxs)("div",{className:"classroom-treegrid",role:"treegrid","aria-label":"Uczniowie, struktura karty, obecno\u015B\u0107 i commity","aria-colcount":5,children:[(0,a.jsxs)("div",{className:"classroom-treegrid-row classroom-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"SESJA"}),(0,a.jsx)("span",{role:"columnheader",children:"DOW\xD3D"}),(0,a.jsx)("span",{role:"columnheader",children:"STAN"})]}),(0,a.jsx)(Gt,{id:"class",depth:0,kind:"class",title:"2TP \xB7 grupa A",refValue:`${In.length} ucz.`,session:`${u}/${In.length}`,evidence:`${d}/${In.length} SYNC`,state:`${t.length} TASK`,hasChildren:!0,expanded:l("class"),onToggle:()=>s("class")}),l("class")&&In.map(m=>{let y=`student:${m.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:y,depth:1,kind:"student",title:m.name,refValue:`L${String(m.laptop).padStart(2,"0")}`,session:(0,a.jsx)("b",{className:"classroom-status","data-status":m.connection,children:Zg[m.connection]}),evidence:(0,a.jsx)("b",{className:"classroom-sync","data-sync":m.sync,children:Jg[m.sync]}),state:m.position,hasChildren:t.length>0,expanded:l(y),onToggle:()=>s(y)}),l(y)&&t.map(g=>{let f=`${y}:task:${g.id}`,E=g.exercises.filter(b=>xp(m,b.id).state==="committed").length;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:f,depth:2,kind:"task",title:g.label,refValue:g.id.toUpperCase(),session:`${g.blocks.length} BLOCK`,evidence:`${E}/${g.exercises.length} COMMIT`,state:"TASK",hasChildren:g.blocks.length+g.exercises.length>0,expanded:l(f),onToggle:()=>s(f)}),l(f)&&g.blocks.map(b=>{let _=`${f}:block:${b.id}`,p=b.phases.length||b.steps.length;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:_,depth:3,kind:"block",title:b.label,refValue:b.kind==="diagram"?"BLOCK":"TASK BLOCK",session:`${p} ${b.phases.length?"PHASE":"STEP"}`,evidence:"\u2014",state:b.kind==="diagram"?"UML":"FLOW",hasChildren:p>0,expanded:l(_),onToggle:()=>s(_)}),l(_)&&b.phases.map(c=>{let h=`${_}:phase:${c.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:h,depth:4,kind:"phase",title:`PHASE \xB7 ${c.label}`,refValue:`${c.steps.length} STEP`,session:"\u2014",evidence:"\u2014",state:"PHASE",hasChildren:c.steps.length>0,expanded:l(h),onToggle:()=>s(h)}),l(h)&&c.steps.map(k=>{let C=vp(m,`${b.id}:${c.id}:${k.id}`,k.number);return(0,a.jsx)(Gt,{id:`${h}:step:${k.id}`,depth:5,kind:"step",title:`STEP ${String(k.number).padStart(2,"0")} \xB7 ${k.label}`,refValue:k.mode??"CODE",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":C.state,children:yp[C.state]}),evidence:C.timestamp,state:C.state==="present"?"OK":C.state==="missed"?"BRAK":"\u2014"},`${h}:step:${k.id}`)})]},h)}),l(_)&&b.steps.map(c=>{let h=vp(m,`${b.id}:${c.id}`,c.number);return(0,a.jsx)(Gt,{id:`${_}:step:${c.id}`,depth:4,kind:"step",title:`STEP ${String(c.number).padStart(2,"0")} \xB7 ${c.label}`,refValue:c.mode??"RUN",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":h.state,children:yp[h.state]}),evidence:h.timestamp,state:h.state==="present"?"OK":h.state==="missed"?"BRAK":"\u2014"},`${_}:step:${c.id}`)})]},_)}),l(f)&&g.exercises.length>0&&(()=>{let b=`${f}:exercises`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:b,depth:3,kind:"exercises",title:"EXERCISES",refValue:`${g.exercises.length} EX`,session:`${E}/${g.exercises.length}`,evidence:"GIT",state:E===g.exercises.length?"DONE":"TODO",hasChildren:!0,expanded:l(b),onToggle:()=>s(b)}),l(b)&&g.exercises.map(_=>{let p=xp(m,_.id);return(0,a.jsx)(Gt,{id:`${b}:${_.id}`,depth:4,kind:"exercise",title:`EXERCISE \xB7 ${_.title}`,refValue:_.id,session:(0,a.jsx)("b",{className:"classroom-commit","data-commit":p.state,children:eh[p.state]}),evidence:p.commit,state:p.state==="committed"?"DONE":p.state==="working"?"W TOKU":"TODO"},`${b}:${_.id}`)})]},b)})()]},f)})]},m.id)})]}),(0,a.jsxs)("footer",{className:"classroom-legend",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"BY\u0141"})," obecny przy omawianym STEP"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"COMMIT"})," rozwi\u0105zanie EXERCISE zapisane w Git"]})]})]})}function nh({open:e,onClose:t}){return e?(0,a.jsx)("div",{className:"shortcut-help-backdrop",role:"presentation",onMouseDown:t,children:(0,a.jsxs)("section",{className:"shortcut-help",role:"dialog","aria-modal":"true","aria-labelledby":"shortcut-help-title",onMouseDown:r=>r.stopPropagation(),children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"F12 \xB7 NAWIGACJA DYDAKTYCZNA"}),(0,a.jsx)("h2",{id:"shortcut-help-title",children:"CARD \u2192 TASK \u2192 BLOCK \u2192 PHASE \u2192 STEP \u2192 SNAPSHOT"})]}),(0,a.jsx)("button",{onClick:t,"aria-label":"Zamknij skorowidz",children:"\xD7"})]}),(0,a.jsx)("dl",{children:[["Alt + \u2191 / \u2193","poprzedni / nast\u0119pny TASK"],["Ctrl + \u2191 / \u2193","poprzedni / nast\u0119pny BLOCK"],["Shift + \u2191 / \u2193","poprzednia / nast\u0119pna PHASE"],["Ctrl + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny STEP"],["Alt + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny unikalny SNAPSHOT"],["\u2191 / \u2193","poprzedni / nast\u0119pny element aktywnego poziomu"],["\u2192","zejd\u017A poziom ni\u017Cej"],["\u2190 / Esc","wr\xF3\u0107 poziom wy\u017Cej"],["Enter","wybierz element; przy SYNC ON odtw\xF3rz stan"],["F1","reset aktualnego celu Neovima/kontenera"],["F2","synchronizuj cel z kursorem drzewa UML"],["Ctrl + `","maksymalizuj pane, dopasuj siatk\u0119 i od\u015Bwie\u017C Neovima"],["Ctrl + Enter","zatwierd\u017A lub cofnij zatwierdzenie kroku"],["Alt + 0","wysu\u0144 lub schowaj panel serii i kart"],["Alt + 1","poka\u017C lub ukryj panel Neovima"],["Alt + 2","prze\u0142\u0105cz SYNC OFF / SYNC ON"],["Alt + 3","uzbr\xF3j lub rozbr\xF3j sterowanie Neovimem"],["Alt + 4","wysoki panel 90% / zapisana wysoko\u015B\u0107 normalna"],["Alt + 5","dopasuj ca\u0142y ekran Neovima; wy\u0142\u0105cz r\u0119czny suwak"],["Alt + 6","przypnij lub ukryj model alokatora"],["Alt + 7","po\u0142\u0105cz segmenty UML w szeroki spread / wr\xF3\u0107 do A4"],["Alt + 3, potem najed\u017A","przeka\u017C klawiatur\u0119 i mysz do aktywnej sesji"],["Alt + W","prefiks polece\u0144 okien Neovima ()"],["Alt + strza\u0142ka","przejd\u017A do s\u0105siedniego okna Neovima"],["F12","poka\u017C lub ukryj ten skorowidz"]].map(([r,o])=>(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:(0,a.jsx)("kbd",{children:r})}),(0,a.jsx)("dd",{children:o})]},r))}),(0,a.jsx)("p",{children:"Przy SYNC ON wyb\xF3r stepu odtwarza i weryfikuje przypi\u0119ty stan maszyny. SYNC OFF nie resetuje debuggera. Po najechaniu panel przekazuje do Neovima wy\u0142\u0105cznie kontrolowane zdarzenia klawiatury i myszy, wi\u0119c mo\u017Cna normalnie kontynuowa\u0107 debugowanie."})]})}):null}function rh({model:e}){let t=!!e.has_allocator_model,n=(0,N.useRef)(null),r=(0,N.useRef)(null),o=(0,N.useRef)(`browser-${globalThis.crypto?.randomUUID?.()??Math.random().toString(36).slice(2)}`),i=(0,N.useRef)(0),l=(0,N.useRef)(0),s=(0,N.useRef)(!1),u=(0,N.useRef)(!1),d=(0,N.useRef)(0),m=(0,N.useRef)(0),y=(0,N.useRef)(0),[g,f]=(0,N.useState)(2.18),[E,b]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-visible")!=="false"),[_,p]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"),[c,h]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"&&localStorage.getItem("stem-card-nvim-control-mode")==="true"),[k,C]=(0,N.useState)(!1),[P,T]=(0,N.useState)(!1),[R,j]=(0,N.useState)(()=>t&&localStorage.getItem("stem-card-allocator-visible")!=="false"),[I,ke]=(0,N.useState)(()=>{let v=localStorage.getItem("stem-card-diagram-spread");return v===null?!!e.has_spread:v==="true"}),[re,G]=(0,N.useState)({state:"hidden",syncMode:!1,syncReady:!1,controlMode:!1,controlEnabled:!1}),[U,Le]=(0,N.useState)(null),[Ne,Q]=(0,N.useState)(""),[et,Ge]=(0,N.useState)(null),[je,me]=(0,N.useState)(null),[Dn,xe]=(0,N.useState)(null),[bn,se]=(0,N.useState)(null),[A,F]=(0,N.useState)(!1),[B,te]=(0,N.useState)(""),[at,zt]=(0,N.useState)(()=>window.innerWidth),Ee=et==="library",ne=!!(et||Dn),st=(0,N.useCallback)(v=>{if(v){Ge("library"),me("library");return}Ge(w=>w==="library"?null:w),me(w=>w==="library"?null:w)},[]),Ye=(0,N.useCallback)(v=>{window.clearTimeout(y.current),te(v),y.current=window.setTimeout(()=>te(""),4200)},[]),wn=(0,N.useCallback)(async v=>{Ye(`${v} \xB7 wykonywanie\u2026`);try{let L=await fetch(v==="F1"?"/api/nvim/reset":"/api/navigation/sync",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current})}),H=await L.json().catch(()=>({}));if(!L.ok)throw new Error(H.message??H.error??`HTTP ${L.status}`);v==="F2"&&H.current?(l.current=Math.max(l.current,Number(H.current.revision??0)),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:H.current})),Ye(`F2 \xB7 ${String(H.current.step.number).padStart(2,"0")} ${H.current.step.label} \xB7 READY`)):Ye("F1 \xB7 reset przyj\u0119ty"),window.setTimeout(()=>window.dispatchEvent(new Event("stem:nvim-refresh")),120)}catch(w){Ye(`${v} \xB7 ${w instanceof Error?w.message:String(w)}`)}},[Ye]),ie=(0,N.useCallback)(async()=>{Ye("Ctrl+` \xB7 przeliczanie widoku\u2026");try{let v=await fetch("/api/nvim/redraw",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current})}),w=await v.json().catch(()=>({}));if(!v.ok)throw new Error(w.message??w.error??`HTTP ${v.status}`);let L=w.external_ui?.grid,H=L?` \xB7 ${L.width}\xD7${L.height}`:"";Ye(`Ctrl+\` \xB7 widok od\u015Bwie\u017Cony${H}`),window.dispatchEvent(new Event("stem:nvim-refresh"))}catch(v){Ye(`Ctrl+\` \xB7 ${v instanceof Error?v.message:String(v)}`)}},[Ye]),q=(0,N.useCallback)(async v=>{try{let w=await fetch("/api/viewer/state",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current,viewer:v})});if(!w.ok)return;let L=await w.json();i.current=Math.max(i.current,Number(L.viewer?.revision??0))}catch{}},[]),bt=v=>{let w=Math.max(.25,Math.min(3,v));f(w),q({scale:w})};(0,N.useEffect)(()=>{document.documentElement.style.setProperty("--viewer-canvas-scale",g.toFixed(3))},[g]),(0,N.useEffect)(()=>{if(!I)return;let v=r.current;if(!v)return;let w=0,L=()=>{window.cancelAnimationFrame(w),w=window.requestAnimationFrame(()=>{v.scrollLeft=Math.max(0,(v.scrollWidth-v.clientWidth)/2)})},H=window.requestAnimationFrame(L);return window.addEventListener("resize",L),()=>{window.cancelAnimationFrame(H),window.cancelAnimationFrame(w),window.removeEventListener("resize",L)}},[I,g,at]),(0,N.useEffect)(()=>{let v=()=>zt(window.innerWidth);return window.addEventListener("resize",v),()=>window.removeEventListener("resize",v)},[]),(0,N.useEffect)(()=>{document.documentElement.dataset.nvimSyncMode=_?"on":"off"},[_]),(0,N.useEffect)(()=>{document.documentElement.dataset.cardClientId=o.current},[]);let fe=v=>{b(v),v||(C(!1),T(!1)),localStorage.setItem("stem-card-nvim-visible",String(v)),q({nvim:{visible:v,...v?{}:{expanded:!1,fit:!1}}})},Qt=v=>{let w=v&&_;h(w),localStorage.setItem("stem-card-nvim-control-mode",String(w)),q({nvim:{control:w}})},jn=v=>{p(v),localStorage.setItem("stem-card-nvim-sync-mode",String(v)),v||(h(!1),localStorage.setItem("stem-card-nvim-control-mode","false")),q({nvim:{sync:v,control:v?c:!1}})},qt=v=>{v&&fe(!0),v&&T(!1),C(v),q({nvim:{visible:v||E,expanded:v,fit:!1}})},ho=v=>{v&&(fe(!0),C(!1)),T(v),q({nvim:{visible:v||E,fit:v,expanded:!1}})},yo=v=>{let w=t&&v;j(w),localStorage.setItem("stem-card-allocator-visible",String(w)),q({allocator:{visible:w}})},Un=v=>{let w=!!(e.has_spread&&v);ke(w),localStorage.setItem("stem-card-diagram-spread",String(w))};(0,N.useEffect)(()=>{let v=0,w=window.requestAnimationFrame(()=>{v=window.requestAnimationFrame(()=>{window.dispatchEvent(new Event("stem:nvim-refresh"))})});return()=>{window.cancelAnimationFrame(w),window.cancelAnimationFrame(v)}},[k,P]),(0,N.useEffect)(()=>{fetch("/api/progress").then(v=>v.ok?v.json():Promise.reject(new Error(`HTTP ${v.status}`))).then(v=>Le(v.progress)).catch(v=>Q(`Post\u0119p dzia\u0142a tylko przez serwer karty (${v.message}).`))},[]),(0,N.useEffect)(()=>{let v=!1,w=!1,L={scale:g,viewport:{width:window.innerWidth,height:window.innerHeight},nvim:{visible:E,sync:_,control:c,expanded:k,fit:P},allocator:{visible:R}},H=D=>{let Z=D.nvim.visible&&D.nvim.fit,V=D.nvim.visible&&!Z&&D.nvim.expanded;f(Math.max(.25,Math.min(3,D.scale))),b(D.nvim.visible),p(D.nvim.sync),h(D.nvim.sync&&D.nvim.control),C(V),T(Z);let oe=t&&(D.allocator?.visible??!0);j(oe),localStorage.setItem("stem-card-nvim-visible",String(D.nvim.visible)),localStorage.setItem("stem-card-nvim-sync-mode",String(D.nvim.sync)),localStorage.setItem("stem-card-nvim-control-mode",String(D.nvim.sync&&D.nvim.control)),localStorage.setItem("stem-card-allocator-visible",String(oe));let ct=++m.current;s.current=!0,window.cancelAnimationFrame(d.current),d.current=window.requestAnimationFrame(()=>{if(ct!==m.current)return;let Ue=Gi();Ki(Ue,{left:D.scroll.x,top:D.scroll.y});let ue=Array.from(document.querySelectorAll(".paper .sheet")),Re=ue[Math.max(0,Math.min(ue.length-1,D.scroll.page_index))]?.querySelector(".sheet-content");Re&&Number.isFinite(D.scroll.sheet_scroll_top)&&Ki(Re,{top:D.scroll.sheet_scroll_top??0}),d.current=window.requestAnimationFrame(()=>{ct===m.current&&(s.current=!1,u.current&&(u.current=!1,window.dispatchEvent(new Event("stem:viewer-scroll-settled"))))})})},K=async()=>{try{let D=await fetch("/api/control/state",{cache:"no-store"});if(!D.ok||v)return;let Z=await D.json(),V=Z.viewer;w||(w=!0,Number(V?.revision??0)===0&&q(L)),V&&V.revision>i.current&&(i.current=V.revision,V.actor!==o.current&&H(V));let oe=Z.navigation;oe&&oe.revision>l.current&&(l.current=oe.revision,oe.actor!==o.current&&(s.current&&(u.current=!0),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:oe}))))}catch{}};K();let X=window.setInterval(K,300);return()=>{v=!0,window.clearInterval(X),m.current+=1,window.cancelAnimationFrame(d.current),s.current=!1,u.current=!1}},[]),(0,N.useEffect)(()=>{q({nvim:{connection:re.state,screen_cursor:re.screenCursor,grid:re.grid}})},[re.grid?.columns,re.grid?.rows,re.screenCursor?.column,re.screenCursor?.row,re.state,q]),(0,N.useEffect)(()=>{let v=0,w=null,L=Array.from(document.querySelectorAll(".paper .sheet")),H=L.map(X=>X.querySelector(".sheet-content")).filter(X=>!!X),K=X=>{if(s.current)return;let D=X?.currentTarget;D instanceof HTMLElement&&D.classList.contains("sheet-content")&&(w=D),window.clearTimeout(v),v=window.setTimeout(()=>{let Z=w?.closest(".sheet"),V=Z?L.indexOf(Z):-1,oe=V>=0?V:L.reduce((Ue,ue,J)=>{let Re=ue.getBoundingClientRect(),Ve=Math.abs((Re.top+Re.bottom)/2-window.innerHeight/2);return Ve=0?w:L[oe]?.querySelector(".sheet-content")??null;q({scroll:{x:window.scrollX,y:window.scrollY,page_index:oe,sheet_scroll_top:ct?.scrollTop??0},viewport:{width:window.innerWidth,height:window.innerHeight}}),w=null},120)};return window.addEventListener("scroll",K,{passive:!0}),window.addEventListener("resize",K),window.addEventListener("stem:viewer-scroll-settled",K),H.forEach(X=>X.addEventListener("scroll",K,{passive:!0})),K(),()=>{window.clearTimeout(v),window.removeEventListener("scroll",K),window.removeEventListener("resize",K),window.removeEventListener("stem:viewer-scroll-settled",K),H.forEach(X=>X.removeEventListener("scroll",K))}},[q]),(0,N.useEffect)(()=>{let v=w=>{if(w.repeat)return;let L=w.altKey&&!w.ctrlKey&&!w.metaKey?w.code:"";if(L==="Digit0"&&e.library){w.preventDefault(),w.stopImmediatePropagation(),F(!1),st(!Ee);return}if(L==="Digit1"){w.preventDefault(),w.stopImmediatePropagation(),fe(!E);return}if(L==="Digit2"){w.preventDefault(),w.stopImmediatePropagation(),jn(!_);return}if(L==="Digit3"){if(w.preventDefault(),w.stopImmediatePropagation(),!_)return;fe(!0),Qt(!c);return}if(L==="Digit4"){w.preventDefault(),w.stopImmediatePropagation(),qt(!k);return}if(L==="Digit5"){w.preventDefault(),w.stopImmediatePropagation(),ho(!P);return}if(L==="Digit6"&&t){w.preventDefault(),w.stopImmediatePropagation(),yo(!R);return}if(L==="Digit7"&&e.has_spread){w.preventDefault(),w.stopImmediatePropagation(),Un(!I);return}if((w.key==="F1"||w.key==="F2")&&!w.altKey&&!w.ctrlKey&&!w.metaKey&&!w.shiftKey){w.preventDefault(),w.stopImmediatePropagation(),wn(w.key);return}if(w.ctrlKey&&!w.altKey&&!w.metaKey&&!w.shiftKey&&(w.code==="Backquote"||w.key==="`")){w.preventDefault(),w.stopImmediatePropagation(),ie();return}if(w.key==="F12"){w.preventDefault(),w.stopImmediatePropagation(),st(!1),Ge(null),me(null),xe(null),se(null),F(H=>!H);return}if(w.key==="Escape"&&(ne||A)){w.preventDefault(),w.stopImmediatePropagation(),Ge(null),me(null),xe(null),se(null),F(!1);return}};return window.addEventListener("keydown",v,!0),()=>window.removeEventListener("keydown",v,!0)},[R,I,t,Ee,e.has_spread,e.library,c,k,P,_,E,wn,ie,A,ne]),(0,N.useEffect)(()=>{let v=n.current?.querySelector(".topbar");if(!v)return;let w=()=>{document.documentElement.style.setProperty("--side-panel-top",`${Math.ceil(v.getBoundingClientRect().bottom)}px`)};w();let L=new ResizeObserver(w);return L.observe(v),window.addEventListener("resize",w),()=>{L.disconnect(),window.removeEventListener("resize",w),document.documentElement.style.removeProperty("--side-panel-top")}},[]),(0,N.useEffect)(()=>()=>window.clearTimeout(y.current),[]),(0,N.useEffect)(()=>{let v=w=>{!w.altKey||w.ctrlKey||(w.preventDefault(),f(L=>{let H=Math.max(.25,Math.min(3,L*Math.exp(-Math.max(-120,Math.min(120,w.deltaY))*.001)));return q({scale:H}),H}))};return window.addEventListener("wheel",v,{passive:!1}),()=>window.removeEventListener("wheel",v)},[q]);let ut=async(v,w)=>{try{let L=await fetch(`/api/progress/${encodeURIComponent(v)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({status:w})});if(!L.ok)throw new Error(await L.text());Le((await L.json()).progress),Q("")}catch(L){Q(`Nie zapisano post\u0119pu: ${L instanceof Error?L.message:String(L)}`)}},x=(v,w)=>{ut(v,{pending:"approved",approved:"pending"}[w])},S=0,M=e.sections.map(v=>{let w=S;return S+=v.assets.length,{section:v,figureOffset:w}}),O=[];return M.forEach(v=>{let w=v.section.spread_group??"",L=O[O.length-1];if(w&&L?.spreadGroup===w){L.pages.push(v);return}O.push({key:w||v.section.id,spreadGroup:w,spreadLabel:v.section.spread_label??"",spreadColumns:v.section.spread_columns??1,pages:[v]})}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{ref:n,className:`viewer-chrome${k?" is-nvim-expanded":""}${P?" is-nvim-fit":""}`,children:[(0,a.jsx)(bg,{toc:e.toc,libraryAvailable:!!e.library,libraryOpen:Ee,setLibraryOpen:st,scale:g,setScale:bt,nvimVisible:E,setNvimVisible:fe,nvimSyncMode:_,setNvimSyncMode:jn,nvimControlMode:c,setNvimControlMode:Qt,nvimExpanded:k,setNvimExpanded:qt,nvimFit:P,setNvimFit:ho,allocatorVisible:R,setAllocatorVisible:yo,hasAllocatorModel:t,diagramSpread:I,setDiagramSpread:Un,hasDiagramSpread:!!e.has_spread,nvimSummary:re,progress:U,progressError:Ne}),e.viewpoints?.length?(0,a.jsx)(xg,{viewpoints:e.viewpoints}):null,(0,a.jsx)(wg,{visible:t&&R,model:e}),(0,a.jsx)(Mg,{visible:E,syncMode:_,controlMode:c,expanded:k,fit:P,scale:g,onSummaryChange:G}),B&&(0,a.jsx)("output",{className:"viewer-action-toast",children:B})]}),(0,a.jsxs)("main",{ref:r,className:`paper${I?" is-diagram-spread":""}`,children:[(0,a.jsx)(Og,{front:e.front}),O.map(v=>{let w=Array.from({length:Math.ceil(v.pages.length/v.spreadColumns)},(D,Z)=>v.pages.slice(Z*v.spreadColumns,(Z+1)*v.spreadColumns)),H=Math.max(1,...w.map(D=>D.reduce((Z,V)=>Z+(V.section.page_orientation==="landscape"?297:210),Math.max(0,D.length-1)*2)))*(96/25.4)*g,K=Math.min(1,Math.max(.25,(at-24)/H)),X=v.pages.map(({section:D,figureOffset:Z})=>(0,a.jsx)(Wg,{section:D,progress:U,onCycle:x,onSetStatus:ut,figureOffset:Z},D.id));return v.spreadGroup?(0,a.jsx)("section",{className:"sheet-spread","data-spread-group":v.spreadGroup,"aria-label":v.spreadLabel||"Wielostronicowy diagram UML",style:{"--spread-columns":v.spreadColumns,"--spread-fit-scale":K},children:X},v.key):X[0]}),e.dictionary&&(0,a.jsxs)(ys,{header:e.dictionary.header_html,className:"dictionary-sheet",children:[(0,a.jsx)("h2",{children:"S\u0142ownik WE/EN/EK/KW"}),(0,a.jsx)(Yt,{html:e.dictionary.content_html})]})]}),(0,a.jsx)(hp,{side:"left",panels:[...e.library?[{id:"library",railLabel:"K",title:"Serie i karty",accent:"#167ca4",content:(0,a.jsx)(Qg,{library:e.library,onNavigate:()=>st(!1)})}]:[],{id:"contents",railLabel:"S",title:"Spis tre\u015Bci",accent:"#16805d",content:(0,a.jsx)(qg,{toc:e.toc,onNavigate:()=>{Ge(null),me(null)}})}],activeId:et,pinnedId:je,onActiveChange:Ge,onPinnedChange:me}),(0,a.jsx)(hp,{side:"right",panels:[{id:"classroom",railLabel:"U",title:"Klasa i stanowiska",accent:"#267357",content:(0,a.jsx)(th,{model:e})},{id:"progress",railLabel:"R",title:"Przebieg i raport",accent:"#b45b26",content:(0,a.jsx)(Xg,{progress:U,error:Ne})}],activeId:Dn,pinnedId:bn,onActiveChange:xe,onPinnedChange:se}),(0,a.jsx)(nh,{open:A,onClose:()=>F(!1)})]})}async function oh(){let e=(0,bp.createRoot)(document.getElementById("root"));try{let t=await fetch("./card-data.json",{cache:"no-store"});if(!t.ok)throw new Error(`Nie mo\u017Cna wczyta\u0107 card-data.json: ${t.status}`);let n=await t.json();e.render((0,a.jsx)(rh,{model:n}))}catch(t){e.render((0,a.jsxs)("main",{className:"app-load-error",children:[(0,a.jsx)("h1",{children:"Nie uda\u0142o si\u0119 uruchomi\u0107 karty"}),(0,a.jsx)("pre",{children:t instanceof Error?t.message:String(t)})]}))}}oh(); +/*! Bundled license information: + +react/cjs/react.production.min.js: + (** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +scheduler/cjs/scheduler.production.min.js: + (** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react-dom/cjs/react-dom.production.min.js: + (** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react/cjs/react-jsx-runtime.production.min.js: + (** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) +*/ diff --git a/web/card-data.json b/web/card-data.json new file mode 100644 index 0000000..8a7c0ed --- /dev/null +++ b/web/card-data.json @@ -0,0 +1,2567 @@ +{ + "schema": "esc-card-react-view.v1", + "card": { + "id": "mpabi-inf-c-11-machine-timer", + "series": "c", + "series_title": "C · Freestanding RV32I and K&R", + "number": "11", + "count": "13", + "slug": "machine-timer", + "title": "Machine timer: od mtime do okresowego deadline'u", + "topic": "RV32I/Hazard3: spójny odczyt mtime, mtimecmp i przerwania machine timer", + "project": "Freestanding C na RV32I", + "subject": "Informatyka", + "level": "Rok 1 · C11 · RV32I/Hazard3", + "revision_date": "2026-07-20T00:00:00+02:00", + "status": "Gotowa", + "version": "v00.01", + "uuid": "45f57fde-fc7b-5f41-a3af-f153202dff0f", + "author": "M. Pabiszczak", + "year": "2026" + }, + "library": { + "schema": "stem-card-library.v2", + "workspace": "edu", + "subjects": [ + { + "id": "inf", + "title": "INF · Informatyka", + "current": false, + "levels": [ + { + "id": "year-1", + "title": "Rok 1", + "current": false, + "series": [ + { + "id": "console-bash", + "title": "Bash · Console Tools", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "L01", + "title": "BusyBox — the Swiss Army Knife", + "repo": "lab-console-busybox", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L02", + "title": "Tmux — sessions, windows and panes", + "repo": "lab-console-tmux", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L03", + "title": "Neovim — navigation and editing", + "repo": "lab-console-neovim", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L04", + "title": "Git Basics I — status, add and commit", + "repo": "lab-console-git-basics-1", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L05", + "title": "Git Basics II — log, diff and restore", + "repo": "lab-console-git-basics-2", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L06", + "title": "Git Branching I — branch, switch and merge", + "repo": "lab-console-git-branching-1", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L07", + "title": "Git Branching II — rebase and conflicts", + "repo": "lab-console-git-branching-2", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L08", + "title": "Docker Fundamentals", + "repo": "lab-console-docker", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "rv32i-asm", + "title": "ASM · RV32I From Blinker to RISC-V", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "L01", + "title": "Number Systems and Storage", + "repo": "lab-rv32i-asm-number-systems", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L02", + "title": "FPGA Bring-up and Programming", + "repo": "lab-rv32i-asm-fpga-bringup", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L03", + "title": "Blinker and Synchronous Logic", + "repo": "lab-rv32i-asm-blinker", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L04", + "title": "The RISC-V ISA and Instruction Decoder", + "repo": "lab-rv32i-asm-decoder", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L05", + "title": "ALU and the Verilog Assembler", + "repo": "lab-rv32i-asm-alu", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L06", + "title": "Control Flow — Jumps and Branches", + "repo": "lab-rv32i-asm-control-flow", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L07", + "title": "Addresses and Memory", + "repo": "lab-rv32i-asm-addresses-memory", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L08", + "title": "Subroutines and the RISC-V ABI", + "repo": "lab-rv32i-asm-subroutines-abi", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L09", + "title": "Load and Store", + "repo": "lab-rv32i-asm-load-store", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "c", + "title": "C · Freestanding RV32I and K&R", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "C01", + "title": "ASM, C and GCC", + "repo": "lab-rv32i-strlen-asm-c-gcc", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/852fa3c7-8329-583a-a244-b639d2e04495", + "available": true, + "current": false, + "number": "01", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Ręczna implementacja RV32I ASM" + }, + { + "id": "task02", + "title": "Referencyjna implementacja w C" + }, + { + "id": "task03", + "title": "ASM wyemitowany przez GCC" + } + ] + }, + { + "id": "C02", + "title": ".bss, .data and static storage", + "repo": "lab-rv32i-strlen-bss-data-stack", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/74afa921-fb51-5017-bcdb-f6e84fb444d8", + "available": true, + "current": false, + "number": "02", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Wynik strlen w .bss" + }, + { + "id": "task02", + "title": "Wynik i napis w .data" + }, + { + "id": "task03", + "title": "Nieużyta tablica lokalna" + }, + { + "id": "task04", + "title": "Użyta tablica lokalna i stack frame" + } + ] + }, + { + "id": "C03", + "title": "ABI and Stack Frame", + "repo": "lab-rv32i-strlen-abi-stack", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/72b22a0a-3297-5d75-a6ff-d1af48132d6c", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Argument i wynik bez powrotu z main" + }, + { + "id": "task02", + "title": "Pełny stack frame i zachowanie ra" + } + ] + }, + { + "id": "C04", + "title": "Types, Operators and Expressions", + "repo": "lab-rv32i-c-types-operators-expressions", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7818aa68-4983-5aca-bf7f-541cfce5c601", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Nazwy i stałe symboliczne" + }, + { + "id": "task02", + "title": "Typy i zakresy" + }, + { + "id": "task03", + "title": "Stałe, długość i enum" + }, + { + "id": "task04", + "title": "Deklaracje, inicjalizacja i const" + }, + { + "id": "task05", + "title": "Arytmetyka i rok przestępny" + }, + { + "id": "task06", + "title": "Porównania i logika" + }, + { + "id": "task07", + "title": "Konwersje: atoi, lower i htoi" + }, + { + "id": "task08", + "title": "Inkrementacja i operacje na napisach" + }, + { + "id": "task09", + "title": "Operatory bitowe" + }, + { + "id": "task10", + "title": "Przypisania i bitcount" + }, + { + "id": "task11", + "title": "Operator warunkowy" + }, + { + "id": "task12", + "title": "Priorytet i kolejność obliczeń" + } + ] + }, + { + "id": "C05", + "title": "Control Flow", + "repo": "lab-rv32i-c-control-flow", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7512361d-e5e6-5c08-ab18-8be29dacdc10", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Instrukcje i bloki" + }, + { + "id": "task02", + "title": "if-else i dangling else" + }, + { + "id": "task03", + "title": "else-if i wyszukiwanie binarne" + }, + { + "id": "task04", + "title": "switch: escape i unescape" + }, + { + "id": "task05", + "title": "while, for i Shell sort" + }, + { + "id": "task06", + "title": "do-while i itoa" + }, + { + "id": "task07", + "title": "break i continue" + }, + { + "id": "task08", + "title": "goto i etykiety" + } + ] + }, + { + "id": "C06", + "title": "Functions and Program Structure", + "repo": "lab-rv32i-c-functions-program-structure", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/9667818d-b691-501d-817c-b58be4cbd594", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Funkcje i strindex" + }, + { + "id": "task02", + "title": "double i atof z wykładnikiem" + }, + { + "id": "task03", + "title": "Zewnętrzny stos RPN" + }, + { + "id": "task04", + "title": "Scope i extern" + }, + { + "id": "task05", + "title": "Nagłówki i prototypy" + }, + { + "id": "task06", + "title": "Static storage" + }, + { + "id": "task07", + "title": "Zmienne register" + }, + { + "id": "task08", + "title": "Struktura blokowa" + }, + { + "id": "task09", + "title": "Inicjalizacja" + }, + { + "id": "task10", + "title": "Rekurencja i quicksort" + }, + { + "id": "task11", + "title": "Preprocesor i makra" + } + ] + }, + { + "id": "C07", + "title": "Pointers, Arrays and Linear Allocator", + "repo": "lab-rv32i-c-pointers-arrays", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/98dbe323-c624-53d6-9fe2-4ee688c44b38", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "task01" + }, + { + "id": "task02", + "title": "task02" + }, + { + "id": "task03", + "title": "task03" + }, + { + "id": "task04", + "title": "K&R 5.4 -- Linear Memory Allocator" + }, + { + "id": "task05", + "title": "task05" + }, + { + "id": "task06", + "title": "task06" + }, + { + "id": "task07", + "title": "task07" + }, + { + "id": "task08", + "title": "task08" + }, + { + "id": "task09", + "title": "task09" + }, + { + "id": "task10", + "title": "task10" + }, + { + "id": "task11", + "title": "task11" + }, + { + "id": "task12", + "title": "task12" + } + ] + }, + { + "id": "C08", + "title": "Structures and Linked State", + "repo": "lab-rv32i-c-structures", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f60fbba3-a788-5f1e-bc24-52af82f227c9", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Układ BlockHeader" + }, + { + "id": "task02", + "title": "Nagłówek, payload i odzyskanie właściciela" + }, + { + "id": "task03", + "title": "Intruzywna lista wolnych bloków" + }, + { + "id": "task04", + "title": "Wyrównana arena dwóch bloków" + } + ] + }, + { + "id": "C09", + "title": "smalloc, sbrk and minimal libc", + "repo": "lab-rv32i-c-smalloc-sbrk-libc", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "strlen z libc bez sterty" + }, + { + "id": "task02", + "title": "Kontrolowany brak dostawcy sbrk" + }, + { + "id": "task03", + "title": "Bounded sbrk i atomowy błąd" + }, + { + "id": "task04", + "title": "Wyrównany smalloc append-only" + }, + { + "id": "task05", + "title": "malloc/free picolibc jako czarna skrzynka" + } + ] + }, + { + "id": "C10", + "title": "RV32I Traps and Interrupt Control", + "repo": "lab-rv32i-c-interrupts", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "ECALL i wznowienie pod mepc+4" + }, + { + "id": "task02", + "title": "Machine software IRQ i clear źródła" + }, + { + "id": "task03", + "title": "Macierz pending, MSIE i MIE" + } + ] + }, + { + "id": "C11", + "title": "Machine Timer and Periodic Work", + "repo": "lab-rv32i-c-timer", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "C12", + "title": "UART — polling and interrupts", + "repo": "lab-rv32i-c-uart", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "Polling jednego bajtu" + }, + { + "id": "task02", + "title": "Odbiór R przez external IRQ 16" + }, + { + "id": "task03", + "title": "Jednokomórkowa skrzynka drop-newest" + } + ] + }, + { + "id": "C13", + "title": "GPIO, Edges and Debounce", + "repo": "lab-rv32i-c-gpio", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-2", + "title": "Rok 2", + "current": false, + "series": [ + { + "id": "cpp", + "title": "C++", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "CPP01", + "title": "Translation Units, Linkage and Namespaces", + "repo": "lab-cpp-build-namespaces", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP02", + "title": "Classes, Encapsulation and Invariants", + "repo": "lab-cpp-classes-invariants", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP03", + "title": "Construction, Destruction and RAII", + "repo": "lab-cpp-lifetime-raii", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP04", + "title": "References, const and Value Categories", + "repo": "lab-cpp-references-const", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP05", + "title": "Copy, Move and the Rule of Zero/Five", + "repo": "lab-cpp-copy-move", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP06", + "title": "Ownership and Resource Types", + "repo": "lab-cpp-ownership", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP07", + "title": "Function and Class Templates", + "repo": "lab-cpp-templates", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP08", + "title": "Static Polymorphism and CRTP", + "repo": "lab-cpp-static-polymorphism", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP09", + "title": "Inheritance, Interfaces and Dynamic Dispatch", + "repo": "lab-cpp-dynamic-polymorphism", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP10", + "title": "Operator Overloading and Strong Types", + "repo": "lab-cpp-strong-types", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP11", + "title": "Containers, Iterators and Algorithms", + "repo": "lab-cpp-containers-iterators", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP12", + "title": "Lambdas, Function Objects and Callables", + "repo": "lab-cpp-lambdas-callables", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP13", + "title": "Error Models with and without Exceptions", + "repo": "lab-cpp-error-models", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP14", + "title": "Object Layout, ABI and Binary Evidence", + "repo": "lab-cpp-abi-evidence", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP15", + "title": "Resource-type Integration Project", + "repo": "lab-cpp-resource-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "freertos-c", + "title": "FreeRTOS C", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "FC01", + "title": "heap_4: From Linear Cursor to Reusable Blocks", + "repo": "lab-rv32i-freertos-heap4", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7", + "available": true, + "current": false, + "number": "01", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Predict and prove reusable heap_4 blocks" + } + ] + }, + { + "id": "FC02", + "title": "First Task, TCB and Task Stack", + "repo": "lab-rv32i-freertos-c-first-task", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/a2538a1a-3c37-4c14-a6ea-db5aba8fd038", + "available": true, + "current": false, + "number": "02", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Pierwszy task FreeRTOS — callback, context, TCB i stos" + } + ] + }, + { + "id": "FC03", + "title": "Tick, Scheduler, Priorities and Time Slicing", + "repo": "lab-rv32i-freertos-c-scheduler", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/2214a13f-34c6-40a1-a561-70a00ec98285", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Kontrolowany eksperyment schedulera FreeRTOS" + } + ] + }, + { + "id": "FC04", + "title": "Delay, Blocking and Task States", + "repo": "lab-rv32i-freertos-c-delay-state", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/4a7ef04c-ab08-5783-9192-5b02a90f05f8", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Delay, blokowanie, zawieszenie i self-delete" + } + ] + }, + { + "id": "FC05", + "title": "Queues and Byte-copy Semantics", + "repo": "lab-rv32i-freertos-c-queue", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8ee8f36a-471b-51bc-97b8-e204bd541c61", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Kolejka długości 1: empty, full, copy i FIFO" + } + ] + }, + { + "id": "FC06", + "title": "Software Timers and the Daemon Task", + "repo": "lab-rv32i-freertos-c-software-timers", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/ab188300-f03d-5ddb-8316-b9534876a5bc", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "One-shot, auto-reload i timer daemon" + } + ] + }, + { + "id": "FC07", + "title": "Interrupt-safe API and Semaphore Handoff", + "repo": "lab-rv32i-freertos-c-isr-semaphore", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/a6da1075-8d1f-5615-b0e6-0fc33e59e1e3", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "External IRQ → FromISR semaphore → high-priority task" + } + ] + }, + { + "id": "FC08", + "title": "Critical Sections, Mutexes and Priority Inheritance", + "repo": "lab-rv32i-freertos-c-resource-management", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/2392f81a-ed6c-510b-86b5-06c5e2f1c6aa", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Low/Medium/High: ownership i dziedziczenie priorytetu" + } + ] + }, + { + "id": "FC09", + "title": "Event Groups and Multi-event Synchronization", + "repo": "lab-rv32i-freertos-c-event-groups", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/3f4c1b8b-d54b-58d5-b92d-87a7233cbd9f", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "ALL-ready i trzyosobowa bariera" + } + ] + }, + { + "id": "FC10", + "title": "Direct-to-task Notifications", + "repo": "lab-rv32i-freertos-c-notifications", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/3b57334e-2c35-5207-a51d-9321906db078", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Count, overwrite i bit flags na jednym slocie" + } + ] + }, + { + "id": "FC11", + "title": "Static Allocation and Bounded Storage", + "repo": "lab-rv32i-freertos-c-static-allocation", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f4d7caf3-d665-5a2d-b9eb-39a120a64ff7", + "available": true, + "current": false, + "number": "11", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Same behavior, two storage policies" + } + ] + }, + { + "id": "FC12", + "title": "Assertions, Hooks, Stack Checks and Runtime Diagnostics", + "repo": "lab-rv32i-freertos-c-diagnostics", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c3027314-85a4-5e4a-af13-0939c7467a62", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Diagnose before changing the program" + } + ] + }, + { + "id": "FC13", + "title": "UART Interrupt-to-task Pipeline", + "repo": "lab-rv32i-freertos-c-uart", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/6a838fd1-ab1b-52b6-baaf-659120a4d60a", + "available": true, + "current": false, + "number": "13", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Build and prove a bounded UART RX pipeline" + } + ] + }, + { + "id": "FC14", + "title": "GPIO, Hardware Timer and Deferred Work", + "repo": "lab-rv32i-freertos-c-gpio-timer", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/0cc561df-bf81-5bba-9df1-c872d5b42eb8", + "available": true, + "current": false, + "number": "14", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Prove one machine-timer event from ISR to daemon GPIO work" + } + ] + }, + { + "id": "FC15", + "title": "Integrated Deterministic FreeRTOS C Application", + "repo": "lab-rv32i-freertos-c-integration", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/fe92efeb-3c38-5975-86d8-ed630e1ad3bb", + "available": true, + "current": false, + "number": "15", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Prove one complete FreeRTOS C architecture" + } + ] + } + ] + }, + { + "id": "freertos-cpp", + "title": "FreeRTOS C++", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "K02", + "title": "C++ Task Wrapper, CRTP and Lifecycle", + "repo": "lab-rv32i-freertos-task-stack-vector", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/948ce9fd-3d0c-5721-a0ae-ef422008fec8", + "available": true, + "current": false, + "number": "02", + "version": "v00.04", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "C++ Task wrapper — OOP i debugowanie cyklu życia" + } + ] + }, + { + "id": "K03", + "title": "Vector V1 — Destructor, Move, Ownership and RAII", + "repo": "lab-rv32i-freertos-vector-raii", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/de1a2818-4c30-5760-8b31-255114f82e90", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Vector V1 — transfer własności i powrót heapu" + } + ] + }, + { + "id": "K04", + "title": "Scheduler States, Priorities and Typed Ticks", + "repo": "lab-rv32i-freertos-scheduler-states", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/853a7dd7-b00b-4f4a-96e8-c160fc5bb04a", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Osiem snapshotów decyzji schedulera" + } + ] + }, + { + "id": "K05", + "title": "C++ Heap Bridge, Heap Models and HeapStats", + "repo": "lab-rv32i-freertos-heap-models", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c456b505-dc5c-4894-b832-bb4c5afd0feb", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Fragmentacja, koalescencja i historyczny watermark" + } + ] + }, + { + "id": "K06", + "title": "MemoryResource and FreeRtosAllocator", + "repo": "lab-rv32i-freertos-allocator-resource", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/1af48a2e-8564-4e18-8115-b2c0208169d6", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Dwa zasoby, jeden typed allocator" + } + ] + }, + { + "id": "K07", + "title": "TaskHandle_t, Explicit Start and Static Trampoline", + "repo": "lab-rv32i-freertos-task-wrapper", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/9bffead0-4341-4350-806d-e975b1a3a08f", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Stabilny obiekt przez statyczny trampoline" + } + ] + }, + { + "id": "K08", + "title": "DynamicTask, StaticTask, Deletion and Lifetime", + "repo": "lab-rv32i-freertos-static-task", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/d9e45417-a37f-487c-813f-fc7a44d4b4f3", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Dwie polityki storage i pełna oś delete" + } + ] + }, + { + "id": "K09", + "title": "Scheduler Facade and Scoped Kernel Guards", + "repo": "lab-rv32i-freertos-kernel-facade", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/6a2ab068-17e7-4bfa-b726-2df37787ed69", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Fasada kernela i restore na każdej ścieżce" + } + ] + }, + { + "id": "K10", + "title": "Queue and StaticQueue", + "repo": "lab-rv32i-freertos-queue", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/66967c2d-bb34-4344-8064-f54d06cce47a", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Typed byte-copy queue z dwiema politykami storage" + } + ] + }, + { + "id": "K11", + "title": "Mutex, LockGuard and Priority Inheritance", + "repo": "lab-rv32i-freertos-mutex", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/34d7ad61-6b03-4922-8e58-b8b98316e5f7", + "available": true, + "current": false, + "number": "11", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "LockGuard i zmierzone priority inheritance" + } + ] + }, + { + "id": "K12", + "title": "Semaphores and Task Notifications", + "repo": "lab-rv32i-freertos-semaphore-notify", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/fcb6107c-268f-4e86-a8cc-092e5875f6f0", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Semaphore slots i jednoodbiorcza notification" + } + ] + }, + { + "id": "K13", + "title": "EventGroup and Coordinated State", + "repo": "lab-rv32i-freertos-event-group", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/5fbcd7c6-3a73-4cd2-b76c-bdb016d1daaa", + "available": true, + "current": false, + "number": "13", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Typed EventGroup i trzy źródła stanu" + } + ] + }, + { + "id": "K14", + "title": "Software Timer and the Timer Daemon Task", + "repo": "lab-rv32i-freertos-sw-timer", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/78db37df-63e5-4c5b-80ce-f73a411f0b50", + "available": true, + "current": false, + "number": "14", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Static one-shot i periodic timer na daemon tasku" + } + ] + }, + { + "id": "K15", + "title": "Explicit FromISR, UART and GPIO Wrappers", + "repo": "lab-rv32i-freertos-isr-drivers", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/02f6cd71-5c85-4883-a237-1d4ba08d9469", + "available": true, + "current": false, + "number": "15", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "UART queue i GPIO notify z realnego IRQ" + } + ] + }, + { + "id": "K16", + "title": "Integrated Real-time Application and Evidence", + "repo": "lab-rv32i-freertos-integration", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/05b4f486-a27c-455d-a315-f4e51a4c66b3", + "available": true, + "current": false, + "number": "16", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "End-to-end RTOS service i evidence report" + } + ] + } + ] + }, + { + "id": "posix-threads", + "title": "POSIX Threads", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "PT01", + "title": "Process and Thread Execution Context", + "repo": "lab-posix-process-thread", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT02", + "title": "pthread_create, pthread_join and Lifecycle", + "repo": "lab-posix-pthread-create-join", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT03", + "title": "Arguments, Return Values and Ownership", + "repo": "lab-posix-thread-arguments", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT04", + "title": "Data Races and the Happens-before Question", + "repo": "lab-posix-data-races", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT05", + "title": "Mutex, Critical Section and Deadlock", + "repo": "lab-posix-mutex", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT06", + "title": "Condition Variables and Predicates", + "repo": "lab-posix-condition-variable", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT07", + "title": "Bounded Producer–Consumer Queue", + "repo": "lab-posix-producer-consumer", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT08", + "title": "POSIX Semaphores", + "repo": "lab-posix-semaphore", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT09", + "title": "Reader–Writer Lock", + "repo": "lab-posix-rwlock", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT10", + "title": "C Atomics and Memory Ordering", + "repo": "lab-posix-atomics", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT11", + "title": "Cancellation, Cleanup and Safe Shutdown", + "repo": "lab-posix-cancellation-cleanup", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT12", + "title": "Thread-local Storage", + "repo": "lab-posix-thread-local", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT13", + "title": "Scheduling Policy, Priority and Affinity", + "repo": "lab-posix-scheduling", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT14", + "title": "GDB, Sanitizers and Race Evidence", + "repo": "lab-posix-thread-debugging", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT15", + "title": "POSIX Threads vs FreeRTOS Integration", + "repo": "lab-posix-freertos-comparison", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "oop", + "title": "OOP and Design Patterns", + "current": false, + "catalog_only": true, + "role": "reference", + "status": "", + "cards": [ + { + "id": "OOP01", + "title": "Strategy — Replaceable Behaviour", + "repo": "lab-cpp-oop-strategy", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "design", + "tasks": [] + }, + { + "id": "OOP02", + "title": "Adapter — Stable Boundary", + "repo": "lab-cpp-oop-adapter", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP03", + "title": "Template Method — Fixed Skeleton", + "repo": "lab-cpp-oop-template-method", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP04", + "title": "Static vs Dynamic Dispatch", + "repo": "lab-cpp-oop-dispatch", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP05", + "title": "RAII and Ownership", + "repo": "lab-cpp-oop-raii", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP06", + "title": "State — Explicit Behaviour", + "repo": "lab-cpp-oop-state", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP07", + "title": "Facade — Subsystem Boundary", + "repo": "lab-cpp-oop-facade", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP08", + "title": "Command — Request as Object", + "repo": "lab-cpp-oop-command", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP09", + "title": "Observer — Subscription and Telemetry", + "repo": "lab-cpp-oop-observer", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP10", + "title": "Factory Method — Resource Policy", + "repo": "lab-cpp-oop-factory-method", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP11", + "title": "Builder — Valid Configuration", + "repo": "lab-cpp-oop-builder", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP12", + "title": "Decorator — Measurement and Diagnostics", + "repo": "lab-cpp-oop-decorator", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP13", + "title": "Composite — Component Tree", + "repo": "lab-cpp-oop-composite", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP14", + "title": "Chain of Responsibility", + "repo": "lab-cpp-oop-chain", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP15", + "title": "Pattern-language Integration", + "repo": "lab-cpp-oop-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-3", + "title": "Rok 3 · plan", + "current": false, + "series": [ + { + "id": "modern-cpp-stl", + "title": "Modern C++ / STL", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "std-threads", + "title": "std::thread / std::jthread", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "boost-asio", + "title": "Boost.Asio", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "oop", + "title": "OOP and Design Patterns", + "current": false, + "catalog_only": true, + "role": "reference", + "status": "", + "cards": [ + { + "id": "OOP01", + "title": "Strategy — Replaceable Behaviour", + "repo": "lab-cpp-oop-strategy", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "design", + "tasks": [] + }, + { + "id": "OOP02", + "title": "Adapter — Stable Boundary", + "repo": "lab-cpp-oop-adapter", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP03", + "title": "Template Method — Fixed Skeleton", + "repo": "lab-cpp-oop-template-method", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP04", + "title": "Static vs Dynamic Dispatch", + "repo": "lab-cpp-oop-dispatch", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP05", + "title": "RAII and Ownership", + "repo": "lab-cpp-oop-raii", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP06", + "title": "State — Explicit Behaviour", + "repo": "lab-cpp-oop-state", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP07", + "title": "Facade — Subsystem Boundary", + "repo": "lab-cpp-oop-facade", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP08", + "title": "Command — Request as Object", + "repo": "lab-cpp-oop-command", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP09", + "title": "Observer — Subscription and Telemetry", + "repo": "lab-cpp-oop-observer", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP10", + "title": "Factory Method — Resource Policy", + "repo": "lab-cpp-oop-factory-method", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP11", + "title": "Builder — Valid Configuration", + "repo": "lab-cpp-oop-builder", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP12", + "title": "Decorator — Measurement and Diagnostics", + "repo": "lab-cpp-oop-decorator", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP13", + "title": "Composite — Component Tree", + "repo": "lab-cpp-oop-composite", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP14", + "title": "Chain of Responsibility", + "repo": "lab-cpp-oop-chain", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP15", + "title": "Pattern-language Integration", + "repo": "lab-cpp-oop-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-4", + "title": "Rok 4 · plan", + "current": false, + "series": [ + { + "id": "transformers-gpu", + "title": "Transformers on GPU", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + } + ] + } + ] + }, + { + "id": "fiz", + "title": "FIZ · Fizyka", + "current": false, + "levels": [ + { + "id": "all", + "title": "Katalog", + "current": false, + "series": [ + { + "id": "fiz", + "title": "Fizyka", + "current": false, + "catalog_only": false, + "role": "", + "status": "", + "cards": [ + { + "id": "ruch-1d", + "title": "Ruch 1D", + "repo": "ruch-1d", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + }, + { + "id": "ruch-2d", + "title": "Ruch 2D", + "repo": "ruch-2d", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + }, + { + "id": "ruch-po-okregu", + "title": "Ruch po okręgu", + "repo": "ruch-po-okregu", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + } + ] + } + ] + } + ] + } + ] + }, + "total_pages": 7, + "front": { + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET1/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "goal_title": "Cel karty", + "goal_html": "

    Uczeń rozdziela źródło czasu, warunek pending, dwa poziomy enable, wybór handlera i jego efekt. Potrafi spójnie odczytać 64-bitowy licznik na RV32, uruchomić jednorazowe przerwanie oraz utrzymać fazę okresowego zegara przez deadline += period.

    ", + "scope_title": "Zakres i zachowane przykłady", + "scope_html": "

    Trzy przykłady wykonują się na rzeczywistym modelu RTL Hazard3. Task01 wymusza rollover dolnego słowa mtime. Task02 dowodzi wejścia przez slot 7 wektora, skasowania poziomowego źródła przez przesunięcie mtimecmp i wznowienia po mret. Task03 zapisuje cztery planowane i obserwowane czasy oraz spóźnienia. Host nie jest używany jako substytut urządzenia MMIO i przerwań. Układ każdego przykładu: pełny profil A1-A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód.

    ", + "scope_columns": [ + "chapter", + "task", + "idea", + "priority" + ], + "scope_headers": [ + "Typ", + "Task", + "Idea", + "Waga" + ], + "scope_rows": [ + { + "chapter": "MMIO", + "task": "Task01", + "idea_html": "

    RV32 split-register MMIO i high-low-high

    ", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "IRQ", + "task": "Task02", + "idea_html": "

    mtimecmp, pending, MTIE/MIE, mtvec, mret i rearm

    ", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "TICK", + "task": "Task03", + "idea_html": "

    deadline += period, tick sequence i lateness

    ", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + } + ] + }, + "sections": [ + { + "id": "section-1-content", + "index": 1, + "title": "1 — Jeden timer, pięć różnych ról", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET2/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "

    mtime jest źródłem rosnącego czasu, a relacja mtime >= mtimecmp wytwarza poziomowy stan pending. mie.MTIE dopuszcza tę klasę przerwań lokalnie, mstatus.MIE dopuszcza przerwania globalnie, a mtvec wybiera kod według przyczyny. Dopiero handler zmienia stan programu i przesuwa komparator. Żaden z bitów enable nie kasuje źródła.

    \n

    W testbenchu Hazard3 mtime rośnie raz na krok, a linia timera jest aktywna tak długo, jak licznik nie jest mniejszy od komparatora. Dlatego powrót bez zapisu przyszłego mtimecmp wywołałby następną pułapkę niemal natychmiast.

    ", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-2-content", + "index": 2, + "title": "2 — 64 bity urządzenia na 32-bitowym rdzeniu", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET3/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "

    Dwa odczyty 32-bitowe nie tworzą automatycznie spójnego odczytu 64-bitowego MMIO. Sekwencja high-low-high akceptuje parę dopiero wtedy, gdy oba odczyty high są równe; zmiana high oznacza rollover między transakcjami i wymusza powtórzenie. Przy zapisie komparatora kolejność high=UINT32_MAX, low, docelowe high usuwa niebezpieczne okno z przejściowo zbyt małym mtimecmp.

    \n

    Task01 zapisuje mtime tylko po to, aby fixture testbencha deterministycznie doprowadził do rolloveru. Nie jest to obietnica, że licznik czasu będzie zapisywalny w innym SoC.

    ", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-3-content", + "index": 3, + "title": "3 — Okres to oś czasu, nie odstęp od spóźnionego now", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET4/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "

    Dla periodycznego zegara handler wykonuje deadline += period. Wtedy planowana sekwencja zachowuje fazę nawet wtedy, gdy wejście do ISR następuje później niż deadline. Reguła now + period użyta jako jedyny model przenosi aktualne spóźnienie do następnego terminu i tworzy dryf.

    \n

    Karta mierzy lateness = observed - scheduled; nie obiecuje stałej wartości opóźnienia. Bieżący RTL i build dają 40 taktów, lecz wynik zależy od magistrali, prologu ISR i punktu próbkowania. Przykład nie definiuje jeszcze polityki nadrabiania wielu całkowicie pominiętych okresów.

    ", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-4-task01", + "index": 4, + "title": "TASK01 — Spójny odczyt mtime przez rollover", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET5/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "", + "tasks": [ + { + "ref": "task01", + "title": "Spójny odczyt mtime przez rollover", + "uuid": "c33548e4-07c8-599c-9457-8ba457701659", + "criterion": "Oracle Hazard3: retry=1, attempts > 1, value_high=1, monotonic=1, pass=1 i kod wyjścia 0. W bieżącym buildzie okno znaleziono dla offsetu 0x13 i po dwóch próbach; sam offset nie jest kontraktem architektury.", + "conclusion_html": "", + "prompt_html": "

    Wyjaśnij, jaki błędny 64-bitowy wynik może utworzyć pojedyncze low-high podczas rolloveru. Następnie wskaż w raporcie próbę odrzuconą przez high-low-high i rozdziel kod produkcyjnego odczytu od zapisywalnego fixture'u testbencha.

    ", + "flow": [ + { + "id": "task01.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — atomowość C nie jest atomowością MMIO", + "content_html": "

    Zachowany przykład: \\nolinkurl{src/tasks/task01_mtime_consistent_read.c}. Urządzenie ma 64-bitowy licznik, lecz RV32 wykonuje trzy jawne odczyty 32-bitowych rejestrów. Typ uint64_t służy do złożenia zaakceptowanych połówek; nie zamienia dwóch transakcji magistrali w jeden atomowy odczyt.

    ", + "steps": [] + }, + { + "id": "task01.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — dwa słowa jednego licznika", + "content_html": "

    timer_hw_t mapuje kolejno mtime, mtimeh, mtimecmp i mtimecmph od adresu 0xc0000100. volatile wymusza obserwowalne dostępy C, ale regułę spójności dostarcza dopiero algorytm.

    ", + "steps": [] + }, + { + "id": "task01.a3", + "kind": "block", + "title": "A3 DISPATCH · N/D", + "content_html": "

    N/D. Task01 ma wyłączone przerwania i wykonuje bezpośredni odczyt MMIO; nie ma ISR, callbacku, tablicy funkcji ani wyboru odbiorcy.

    ", + "steps": [] + }, + { + "id": "task01.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — kontrolowane przejście przez 0xffffffff", + "content_html": "

    Fixture ustawia high=0 i low blisko UINT32_MAX, a następnie wyszukuje małe okno, w którym high zmieni się między pierwszym i drugim odczytem. Zaakceptowany wynik musi pochodzić już z epoki high=1; kolejny odczyt nie może być mniejszy.

    ", + "steps": [] + }, + { + "id": "task01.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — read, validate, retry", + "content_html": "

    Jedna próba czyta high_before, low, high_after. Równość high kończy pętlę i pozwala złożyć wynik. Nierówność odrzuca low należące do niejednoznacznej granicy epok i powtarza wszystkie trzy transakcje.

    ", + "steps": [] + }, + { + "id": "task01.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — epoka 0, rollover, epoka 1", + "content_html": "

    Stan urządzenia przechodzi z high=0 i low blisko maksimum przez rollover do high=1 i małego low. Pierwsza para high opisuje zmianę stanu, więc nie wolno do niej przypisać jednego snapshotu; druga próba stabilizuje się w epoce 1.

    ", + "steps": [] + }, + { + "id": "task01.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — dwa dostępy high są widocznym dowodem", + "content_html": "

    Oracle raportuje offset, liczbę prób, retry, high wyniku i monotoniczność. Bieżący RTL daje offset 0x13 i attempts=2. Listing ma pokazać dwa osobne lw z rejestru high, rozdzielone odczytem low, oraz gałąź powrotną przy nierówności.

    ", + "steps": [] + }, + { + "id": "task01.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — stabilny snapshot z licznika split-register", + "content_html": "

    Wzorzec high-low-high stosuj, gdy dokumentacja urządzenia gwarantuje monotoniczny licznik i zgodne zachowanie połówek. Fixture zapisujący czas pozostaje poza produkcyjnym API odczytu.

    ", + "steps": [] + }, + { + "id": "task01.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task01.worksheet", + "kind": "block", + "title": "TASK01 · Zapis dowodu ucznia", + "content_html": "

    1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log wykonania RTL Hazard3 i kod wyjścia \\noindent \\noindent 3. Dowód w listingu: high-low-high i retry \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

    ", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-5-task02", + "index": 5, + "title": "TASK02 — Jednorazowe przerwanie machine timer", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET6/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "", + "tasks": [ + { + "ref": "task02", + "title": "Jednorazowe przerwanie machine timer", + "uuid": "dc7f8696-19db-55b6-8fd9-cb676b399ec7", + "criterion": "Oracle Hazard3: count=1, mcause=0x80000007, pending_before=0, pending_after=0, resumed=1, deadline_reached=1, pass=1 i kod wyjścia 0. Listing ISR kończy się mret.", + "conclusion_html": "", + "prompt_html": "

    Ułóż w poprawnej kolejności: wyłącz maski, ustaw przyszły mtimecmp, sprawdź pending, włącz MTIE i MIE, czekaj w wfi, przesuń komparator w ISR, wróć przez mret. Dla każdego kroku nazwij source, pending, enable, decyzję dispatchera albo efekt.

    ", + "flow": [ + { + "id": "task02.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — enable nie jest źródłem", + "content_html": "

    Zachowany przykład: \\nolinkurl{src/tasks/task02_oneshot_timer_irq.c}. Źródłem jest relacja mtime >= mtimecmp; mip.MTIP reprezentuje pending. mie.MTIE i mstatus.MIE są dwiema bramkami. Program najpierw ustawia przyszły komparator, a dopiero potem otwiera obie bramki.

    ", + "steps": [] + }, + { + "id": "task02.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — wspólny driver i stan dowodowy", + "content_html": "

    Wspólny nagłówek zawiera dostęp MMIO, bezpieczny zapis komparatora i operacje CSR. Task przechowuje osobno deadline, czas zaobserwowany, mcause, liczbę ISR, pending przed i po oraz znacznik wznowienia.

    ", + "steps": [] + }, + { + "id": "task02.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — przyczyna 7 wybiera handler timera", + "content_html": "

    Startup zapisuje do mtvec adres tablicy z bitem trybu vectored. Machine timer ma cause=7, więc rdzeń wybiera slot 7, którego skok wiąże się z silnym symbolem isr_machine_timer zamiast słabego handlera domyślnego. Atrybut GCC kończy funkcję instrukcją mret.

    ", + "steps": [] + }, + { + "id": "task02.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — one-shot z jawnym kryterium zakończenia", + "content_html": "

    Main planuje deadline 1200 taktów po spójnym odczycie. Sukces wymaga dokładnie jednego wejścia, poprawnego mcause, obserwacji nie wcześniejszej niż deadline, skasowanego pending po rearmie i wykonania instrukcji po wfi.

    ", + "steps": [] + }, + { + "id": "task02.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — source → pending → enable → handler → effect", + "content_html": "

    Rosnące mtime osiąga comparator i ustawia pending. Otwarty MTIE oraz MIE pozwalają wejść do wektora. Handler zapisuje obserwację i mcause, przesuwa comparator na UINT64_MAX, publikuje count, a mret przywraca przerwany przepływ. Main ustawia resumed i zamyka maski.

    ", + "steps": [] + }, + { + "id": "task02.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — DISARMED, ARMED, PENDING, HANDLED, RESUMED", + "content_html": "

    Komparator maksimum reprezentuje DISARMED. Przyszły deadline tworzy ARMED. Po osiągnięciu terminu urządzenie jest PENDING, handler ponownie zapisuje maksimum i publikuje HANDLED, a kod po pętli wfi potwierdza RESUMED.

    ", + "steps": [] + }, + { + "id": "task02.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — mcause, mip i mret", + "content_html": "

    Raport z RTL ma: count=1, mcause=0x80000007, pending 0/0, resumed=1 i deadline_reached=1. Objdump ma pokazać zapis trzech połówek mtimecmp w handlerze oraz końcowe mret; zwykłe ret nie byłoby poprawnym powrotem z pułapki.

    ", + "steps": [] + }, + { + "id": "task02.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — arm before unmask, clear source before publish", + "content_html": "

    Najpierw ustaw bezpieczny stan urządzenia, potem włącz źródło w mie, na końcu globalne MIE. W ISR usuń poziomowe źródło przed opublikowaniem zakończenia; inaczej powrót może natychmiast wejść ponownie.

    ", + "steps": [] + }, + { + "id": "task02.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task02.worksheet", + "kind": "block", + "title": "TASK02 · Zapis dowodu ucznia", + "content_html": "

    1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log wykonania RTL: mcause, pending i resume \\noindent \\noindent 3. Dowód w CSR i listingu: slot 7 oraz mret \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

    ", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-6-task03", + "index": 6, + "title": "TASK03 — Okresowe deadline'y bez dryfu fazy", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEMachine timer: od mtime do okresowego deadline'u
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD11/13
    SHEET7/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUID45f57fde-fc7b-5f41-a3af-f153202dff0fCARD UUIDf37170be-e988-5f5d-b3cf-6ea179a9cd54AUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "", + "tasks": [ + { + "ref": "task03", + "title": "Okresowe deadline'y bez dryfu fazy", + "uuid": "6c330959-1a78-5068-8c59-6b18f712122c", + "criterion": "Oracle Hazard3: count=causes=4, period=1600, step_ok=ordered=late_math=naive_shift_ok=pass=1. Bieżący pomiar daje cztery lateness po 40 taktów, ale test nie uznaje liczby 40 za kontrakt sprzętowy.", + "conclusion_html": "", + "prompt_html": "

    Dla czterech ticków porównaj scheduled, observed i lateness. Udowodnij stały krok 1600 oraz wyprowadź, o ile przesunąłby następną fazę model now+period. Wyjaśnij granicę: przykład nie nadrabia dowolnej liczby całkowicie pominiętych okresów.

    ", + "flow": [ + { + "id": "task03.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — harmonogram i wykonanie to dwie osie", + "content_html": "

    Zachowany przykład: \\nolinkurl{src/tasks/task03_periodic_absolute_deadline.c}. Scheduled opisuje idealną oś czasu usługi, observed chwilę rzeczywistego wejścia do pomiaru w ISR, a lateness ich różnicę. Okres ma aktualizować harmonogram, nie kopiować opóźnienia wykonania do przyszłej fazy.

    ", + "steps": [] + }, + { + "id": "task03.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — cztery rekordy ticków", + "content_html": "

    Trzy tablice po cztery elementy zapisują deadline, obserwację i lateness. g_task03_next_deadline jest stanem planisty, a count publikuje liczbę kompletnych rekordów. Stała period wynosi 1600 taktów modelu.

    ", + "steps": [] + }, + { + "id": "task03.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — każdy MTIP trafia przez slot 7", + "content_html": "

    Dla każdego z czterech terminów rdzeń koduje interrupt bit i cause=7 w mcause, a tryb vectored wybiera ten sam isr_machine_timer. Handler sprawdza mcause przy każdym wejściu; licznik causes=4 dowodzi czterech decyzji dispatchera.

    ", + "steps": [] + }, + { + "id": "task03.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — stała faza i zmierzone spóźnienie", + "content_html": "

    Dla i>0 musi zachodzić scheduled[i]-scheduled[i-1]=1600. Dla każdego rekordu observed nie może być wcześniejsze od scheduled, a lateness musi być dokładnie ich różnicą. Po czwartym ticku comparator wraca do maksimum.

    ", + "steps": [] + }, + { + "id": "task03.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — sample, record, advance, rearm, publish", + "content_html": "

    ISR najpierw pobiera indeks i aktualny deadline, potem czyta czas oraz zapisuje rekord. Następnie oblicza deadline+period, uzbraja ten bezwzględny termin albo rozbraja po ostatnim ticku, a count publikuje dopiero na końcu. Main czeka w wfi do czterech rekordów.

    ", + "steps": [] + }, + { + "id": "task03.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — TICK0 → TICK4 i niezmienna faza", + "content_html": "

    Stan count przechodzi 0,1,2,3,4; razem z każdym przejściem next_deadline rośnie dokładnie o period. Po count=4 urządzenie jest DISARMED. Tablice pozostają historią czterech zakończonych przejść i są analizowane dopiero po zamknięciu masek.

    ", + "steps": [] + }, + { + "id": "task03.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — cztery terminy i 40 taktów bieżącego RTL", + "content_html": "

    Bieżący raport podaje deadline low 0x96b, 0xfab, 0x15eb, 0x1c2b; obserwacje są o 0x28 późniejsze. Ważne są relacje step_ok, ordered i late_math, ponieważ absolutne wartości oraz 40 taktów mogą się zmienić po zmianie RTL, optymalizacji lub prologu ISR.

    ", + "steps": [] + }, + { + "id": "task03.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — absolute periodic deadline", + "content_html": "

    deadline += period zachowuje fazę. Gdyby następny termin powstał wyłącznie jako observed + period, jego przesunięcie względem osi absolutnej byłoby równe bieżącemu lateness; powtarzanie tej reguły kumuluje dryf. Osobna polityka musi zdecydować, czy po dużym opóźnieniu nadrabiać, pomijać, czy zgłaszać błąd.

    ", + "steps": [] + }, + { + "id": "task03.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task03.worksheet", + "kind": "block", + "title": "TASK03 · Zapis dowodu ucznia", + "content_html": "

    1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log RTL: deadline, observed i lateness \\noindent \\noindent 3. Dowód stałego kroku i braku dryfu fazy \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

    ", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + } + ], + "viewpoints": [], + "has_spread": false, + "has_allocator_model": false, + "dictionary": null, + "toc": [ + { + "id": "section-1-content", + "label": "1. 1 — Jeden timer, pięć różnych ról" + }, + { + "id": "section-2-content", + "label": "2. 2 — 64 bity urządzenia na 32-bitowym rdzeniu" + }, + { + "id": "section-3-content", + "label": "3. 3 — Okres to oś czasu, nie odstęp od spóźnionego now" + }, + { + "id": "section-4-task01", + "label": "4. TASK01 — Spójny odczyt mtime przez rollover" + }, + { + "id": "section-5-task02", + "label": "5. TASK02 — Jednorazowe przerwanie machine timer" + }, + { + "id": "section-6-task03", + "label": "6. TASK03 — Okresowe deadline'y bez dryfu fazy" + } + ] +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..8f9f9f5 --- /dev/null +++ b/web/index.html @@ -0,0 +1,15 @@ + + + + + + + Karta pracy + + + + +
    + + + diff --git a/web/style.css b/web/style.css new file mode 100644 index 0000000..cd830d9 --- /dev/null +++ b/web/style.css @@ -0,0 +1,39 @@ + +:root{--ink:#111;--muted:#666;--line:#b9b9b9;--line-soft:#dddddd;--paper:#fff;--desk:#eeeeee;--og:#008000;--tech:#d36b00;--kw:#0018c8;--we:#e00000;--viewer-canvas-scale:1;--viewer-content-scale:1} +*{box-sizing:border-box} html{scroll-behavior:smooth} body{margin:0;background:var(--desk);color:var(--ink);font-family:"Latin Modern Roman","LM Roman 12",Georgia,"Times New Roman",serif;line-height:1.25} +.topbar{position:sticky;top:0;z-index:20;background:rgba(245,245,245,.94);border-bottom:1px solid #d0d0d0;padding:3px 0;font-family:system-ui,-apple-system,Segoe UI,sans-serif} +.topbar-inner{width:calc(100% - 8px);max-width:none;margin:0 4px;display:flex;align-items:center;justify-content:space-between;gap:6px}.topbar details{min-width:0;flex:1}.topbar summary{cursor:pointer;font-size:16px;line-height:1.35;font-weight:650}.toc-links{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}.toc-links a{font-size:16px;color:#333;text-decoration:none;border:1px solid #ccc;background:white;border-radius:3px;padding:2px 5px}.viewer-zoom-controls{display:flex;align-items:center;gap:7px;flex:none}.viewer-zoom-status{font:600 16px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace;color:#444;white-space:nowrap}.viewer-zoom-reset{border:1px solid #bbb;border-radius:3px;background:#fff;color:#333;padding:1px 6px;font:600 16px/1.35 system-ui,-apple-system,Segoe UI,sans-serif;cursor:pointer}.viewer-zoom-reset:hover{background:#eee}.viewer-zoom-reset:focus-visible{outline:2px solid #555;outline-offset:1px} +.paper{padding:18px 12px 44px;overflow-x:auto}.sheet{position:relative;width:210mm;min-height:297mm;margin:0 auto 18px;background:var(--paper);box-shadow:0 2px 12px rgba(0,0,0,.13);display:block;padding:0;overflow:visible;zoom:var(--viewer-canvas-scale)}.sheet-content{position:relative;width:100%;min-height:297mm;padding:13mm 21.5mm 15mm;transform:scale(var(--sheet-effective-scale,1));transform-origin:top left}.resource-header-enabled .sheet-content{padding-top:5mm}.sheet-content>.page-resource-header{margin-bottom:3mm} +@media(max-width:900px){.sheet{height:auto}}@media print{.sheet{height:auto}} +.pdf-main{min-width:0;width:100%}.running-header{display:flex;justify-content:space-between;gap:18px;align-items:flex-end;border-bottom:1px solid #111;padding-bottom:3px;margin-bottom:26px;font-size:15px}.running-header span{white-space:nowrap} +.hero h1{font-size:24px;line-height:1.15;margin:0 0 4px;border-bottom:1px solid #111;padding-bottom:4px}.hero .byline{float:right;margin-top:-31px;font-size:15px} +.meta{clear:both;display:grid;grid-template-columns:148px minmax(0,1fr);gap:4px 18px;padding:34px 0 24px;border-bottom:1px solid #111;font-size:17px}.meta dt{color:#333}.meta dd{margin:0;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace} +.front-scope{padding:0 0 3mm;border-bottom:1px solid var(--line-soft)}.front-scope h2{font-size:24px;line-height:1.15;margin:0 0 3mm}.front-scope p{font-size:16px} +.scope-table-wrap{margin:3mm 0;overflow:hidden}.scope-table{width:100%;border-collapse:collapse;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.22}.scope-table th,.scope-table td{border:0;border-bottom:1px solid #888;padding:4px 7px;text-align:left;vertical-align:top}.scope-table th{border-bottom:2px solid #555;background:#f3f3f3;font-weight:700}.scope-table th:first-child,.scope-table td:first-child{width:7%}.scope-table--task th:nth-child(2),.scope-table--task td:nth-child(2){width:11%}.scope-table--task th:nth-child(4),.scope-table--task td:nth-child(4){width:19%}.scope-table--task th:nth-child(5),.scope-table--task td:nth-child(5){width:14%}.scope-table--task th:nth-child(6),.scope-table--task td:nth-child(6){width:10%}.scope-table tr.scope-row--key td{font-weight:700;background:#f4f4f4;border-top:2px solid #111;border-bottom:2px solid #111}.scope-table tr.scope-row--key td:first-child{border-left:2px solid #111}.scope-table tr.scope-row--key td:last-child{border-right:2px solid #111}.scope-table td p{font:inherit;margin:0}.scope-table code{font-size:inherit}.scope-status{display:inline-block;white-space:nowrap;border:1px solid #aaa;border-radius:2px;padding:1px 4px;font-weight:600;background:#f5f5f5}.scope-status[data-status="in-progress"]{border-color:#307da1;background:#eaf5fa;color:#174f69}.scope-status[data-status="ready"]{border-color:#4c7d56;background:#edf6ee;color:#295b33}.scope-status[data-status="draft"],.scope-status[data-status="review"]{border-color:#9a7932;background:#faf4e5;color:#694f16}.scope-status[data-status="blocked"]{border-color:#9c4b4b;background:#faeded;color:#712f2f} +.card-section h2{font-size:24px;line-height:1.15;margin:0 0 4mm}.section-heading{display:flex;align-items:flex-start;gap:0}.section-heading .section-index{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:23px;margin-right:12mm;font-weight:400}.section-heading .section-title{min-width:0}.task-identity{margin-left:auto;padding-left:22px;text-align:right;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:10px;line-height:1.25;color:#555;white-space:nowrap}.task-identity strong,.task-identity-name,.task-identity code{display:block}.task-identity strong{font-size:12px;color:#111}.task-identity-name{max-width:240px;overflow:hidden;text-overflow:ellipsis}.task-identity code{font-size:9px;color:#777} +p{font-size:16px;margin:0 0 3mm}.pdf-main ul{font-size:16px;margin:2mm 0 3mm 7mm;padding:0}.pdf-main li{margin:1.2mm 0} +.pdf-margin{position:absolute;top:34mm;width:18mm;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:5px;line-height:1.12;color:#333;max-height:245mm;overflow:hidden}.pdf-margin.left{left:2mm;text-align:left}.pdf-margin.right{right:2mm;text-align:left} +.margin-title{font-weight:700;color:#666;margin-bottom:3px;letter-spacing:.02em}.margin-list{display:flex;flex-direction:column;align-items:flex-start}.margin-tag{display:block;margin:0 0 1px;padding:0;border:0;background:transparent;font:inherit;line-height:inherit;text-align:left;cursor:pointer;margin-left:var(--indent)}.margin-tag.we{color:var(--we)}.margin-tag.og,.margin-tag.tech{color:var(--og)}.margin-tag.kw{color:var(--kw)}.margin-tag .local{color:#777}.margin-tag:hover{text-decoration:underline}.margin-empty{color:#aaa} +.step-map{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.3;color:#5c5c5c;background:transparent;border:0;border-top:1px solid #cfcfcf;border-bottom:1px solid #e0e0e0;border-radius:0;padding:8px 0;margin:0 0 16px}.step-map summary{cursor:pointer;font-weight:400;color:#555} +.tree-legend{display:flex;flex-wrap:wrap;gap:4px;margin:7px 0}.steps{display:grid;gap:6px}.step-row{border-top:1px dashed #c9c9c9;padding-top:6px}.step-row:first-child{border-top:0}.step-title span{font-weight:700;margin-right:7px}.step-trees{display:flex;flex-wrap:wrap;gap:4px;margin-top:3px}.step-refs{display:flex;flex-wrap:wrap;gap:6px;margin-top:3px}.step-refs a{font-size:10px;color:#666} +.tree-token{font:10px/1 "Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;border:1px solid #c8c8c8;background:#fff;border-radius:3px;padding:3px 5px;cursor:pointer}.tree-token.active{background:#111;color:white;border-color:#111} +.equation{display:grid;grid-template-columns:1fr auto;align-items:center;gap:14px;margin:18px 0;padding:4px 0;background:transparent;border:0}.equation .display{font-size:17px}.equation-number{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:15px} +figure{margin:24px 0;text-align:center}figure img{max-width:100%;display:block;margin:0 auto;border:0;border-radius:0}figcaption{font-size:14px;color:#444;margin-top:8px;text-align:left}.card-asset.asset-screenshot img{border:1px solid #aaa}.card-asset a{display:block;cursor:zoom-in} +.table-wrap{overflow:auto;margin:14px 0}table{border-collapse:collapse;width:100%;font-size:16px}th,td{border:1px solid #111;padding:5px 8px;text-align:left;vertical-align:top}th{font-weight:400;background:white} +.empty-check{display:inline-block;width:1em;height:1em;border:1px solid #111;vertical-align:-.12em}.answer-line,.dotfill{display:block;border-bottom:1px dotted #111;height:1.45em;min-width:10em}.write-row{display:block;min-height:2.8em} +code{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace}.tasks{font-size:16px}.task-legacy{margin:2.5mm 0}.task-legacy>strong{display:block;font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#555}.task-flow{border:1px solid #222;margin:1mm 0 2mm;background:#fff}.task-flow-header{display:grid;grid-template-columns:auto 1fr auto;align-items:baseline;gap:6px;padding:5px 7px;background:#eaeaea;border-bottom:1px solid #222}.task-flow-header span{font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#222}.task-flow-header h3{font-size:18px;margin:0}.task-flow-header code{font-size:8px;color:#555}.task-block{margin:6px 7px;padding:5px 6px;border:1px solid #777;background:#fff}.task-block header,.task-exercise header{display:flex;align-items:baseline;gap:5px;margin-bottom:3px}.task-block header span,.task-exercise header span{font:700 9px/1.2 "Latin Modern Mono",ui-monospace,monospace;text-transform:uppercase;color:#555}.task-block h4,.task-exercise h4{font-size:16px;margin:0}.block-steps{margin:4px 0 0 16px!important;padding:0;display:grid;gap:3px}.block-steps li{margin:0;border:1px solid #b9b9b9;padding:4px 5px;background:#fff}.block-steps li::marker{font-family:"Latin Modern Mono",ui-monospace,monospace;font-weight:700}.block-steps li p:last-child{margin-bottom:0}.task-exercise{margin:6px 7px;border:1px solid #777;border-left:1px solid #222;padding:5px 6px;background:#fafafa}.task-exercise header{flex-wrap:wrap}.exercise-based-on{margin-left:auto;font-size:8px;color:#777}.exercise-evidence{border-top:1px dashed #bbb;margin-top:5px;padding-top:4px}.exercise-evidence>strong{font-size:11px;text-transform:uppercase}.exercise-criterion{font-size:13px;margin:4px 0 0}.task-flow>footer{padding:5px 7px;border-top:1px solid #222;font-size:12px;background:#f6f6f6}.task-conclusion{margin:8px 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#315f78}.task-conclusion p{margin:0}.we-block{border-top:1px solid #ddd;padding:8px 0}.we-block summary{cursor:pointer}.dictionary-sheet .pdf-margin{display:none} +.inspector{position:fixed;right:14px;bottom:14px;width:min(360px,calc(100vw - 28px));max-height:46vh;overflow:auto;background:white;border:1px solid #cfcfcf;box-shadow:0 4px 18px rgba(0,0,0,.18);border-radius:6px;padding:12px;font-family:system-ui,-apple-system,Segoe UI,sans-serif;font-size:13px;z-index:30}.inspector h2{font-size:14px;margin:0 0 8px}.inspector .empty{color:#777}.tree-card h3{font-size:15px;margin:6px 0}.tree-card code{display:inline-block;margin:4px 0}.tree-card .line{font-weight:700}.tree-card .line.OG{color:var(--og)}.tree-card .line.TECH{color:var(--tech)}.kw-list{padding-left:18px}.kw-list code{color:var(--kw)} +@media(max-width:900px){.sheet{display:block;min-height:0}.sheet-content{min-height:0;padding:26px 18px}.pdf-margin{position:static;max-height:none;overflow:visible;margin:10px 0;padding:8px;border:1px solid #ddd}.pdf-margin.left{border-left:3px solid var(--tech)}.pdf-margin.right{border-left:3px solid var(--og)}.hero .byline{float:none;margin:0 0 14px}.meta{grid-template-columns:1fr}.section-heading{flex-wrap:wrap}.task-identity{width:100%;padding:6px 0 0}.inspector{position:static;width:auto;max-height:none;margin:0 12px 18px}.topbar{position:sticky;top:0}.viewer-zoom-status{font-size:16px}} +@media print{html,body{background:white}.topbar,.inspector{display:none}.paper{padding:0}.sheet{position:relative;display:block;width:auto;min-height:0;margin:0;box-shadow:none;break-after:page;padding:0;overflow:visible;zoom:1!important}.sheet-content{position:relative;width:auto;min-height:0;padding:0;transform:none!important}.sheet:last-child{break-after:auto}.resource-header-enabled .sheet-content{padding:0}.sheet-content>.page-resource-header,.sheet-content>.page-resource-footer{display:none!important}.pdf-margin{position:absolute;top:0;width:18mm;max-height:none;overflow:hidden;margin:0;padding:0;border:0}.pdf-margin.left{left:-19.5mm}.pdf-margin.right{right:-19.5mm}.task-block,.task-exercise,.block-steps li,figure{break-inside:avoid}} + +.page-resource-header{width:100%;height:24mm;min-height:24mm;max-height:24mm;background:#fff;color:#111;overflow:hidden;font-family:ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;line-height:1.08} +.resource-header-table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;border:1px solid #111}.resource-header-table>tbody>tr{height:100%}.resource-header-center{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-header-grid{display:grid;grid-template-rows:3fr 3fr 3fr 2fr 2fr;width:100%;height:100%}.resource-header-row{display:grid;min-width:0;min-height:0}.resource-header-field{display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;gap:.08mm;min-width:0;padding:.28mm .55mm;border-right:1px solid #888;border-bottom:1px solid #aaa;overflow:hidden;white-space:nowrap}.resource-header-row .resource-header-field:last-child{border-right:0}.resource-header-row:last-child .resource-header-field{border-bottom:0}.resource-header-field a{display:flex;flex-direction:column;align-items:flex-start;gap:.08mm;min-width:0;color:#111;text-decoration:none}.resource-label{align-self:flex-start;font:800 3.2pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;text-transform:uppercase;flex:none}.resource-value{align-self:flex-end;max-width:100%;text-align:right;font:700 6.4pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resource-header-field--title .resource-value{font-size:7.7pt;font-weight:800}.resource-header-field--emphasis .resource-value{font-size:6.6pt;font-weight:800}.resource-header-field--compact{gap:.05mm;padding:.2mm .2mm}.resource-header-field--compact .resource-label{font-size:2.85pt}.resource-header-field--compact .resource-value{font-size:4.45pt}.resource-header-field--identity{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.15mm;padding:.12mm .45mm;font:700 3.55pt/1.1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--identity>span{display:flex;align-items:baseline;gap:.3mm;min-width:0}.resource-header-field--identity b{font-weight:800;flex:none}.resource-header-field--identity .resource-identity-value{margin-left:auto;text-align:right}.resource-header-field--identity .resource-author{margin-left:auto;text-align:right}.resource-header-field--url-row{display:flex;align-items:stretch;justify-content:center;padding:.2mm .55mm}.resource-header-field--url-row a{display:block;overflow:hidden;text-overflow:clip;font:700 4.9pt/1.05 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--url-row b{font-weight:800} +.resource-qr-cell{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-qr-cell--left{border-right:1px solid #777}.resource-qr-cell--right{border-left:1px solid #777}.resource-qr{box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:.4mm;color:#333;text-decoration:none}.resource-qr .title-qr{display:block;width:22mm;height:22mm;max-width:22mm;max-height:22mm;flex:none}.resource-qr-empty{text-align:center}.resource-qr-empty span,.resource-qr-empty strong{display:block;font:600 5pt/1.15 ui-monospace,SFMono-Regular,Consolas,monospace} + +@page{ + size:A4; + margin:29mm 21.5mm 5mm; + @top-left{content:"";width:24mm;height:24mm;box-sizing:border-box;padding:0;border:1px solid #111;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:22mm 22mm;vertical-align:middle;text-align:center;font:0/0 sans-serif;color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyBjbGFzcz0idGl0bGUtcXIiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iS29kIFFSOiBodHRwczovL3pzbC1naXRlYS5tcGFiaS5wbC9lZHUtaW5mL2xhYi1ydjMyaS1jLW1hY2hpbmUtdGltZXIiIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9Jzg1LjAzOTE5NnB0JyBoZWlnaHQ9Jzg1LjAzOTE5NnB0JyB2aWV3Qm94PSctNzIuMDAwMDA0IC03Mi4wMDAwMDQgODUuMDM5MTk2IDg1LjAzOTE5Nic+CjxnIGlkPSdwYWdlMSc+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTIuNzMwMjYxJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc1LjMwODM1NicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjUuNjE0OTg4JyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTIuNzMwMjYxJyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc1LjMwODM1NicgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTIuNzMwMjYxJyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy01OS4xMTUyNzgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy01OS4xMTUyNzgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy01OS4xMTUyNzgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy01My45NjEzODcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctNTMuOTYxMzg3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTUzLjk2MTM4NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy01My45NjEzODcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNTMuOTYxMzg3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEyLjczMDI2MScgeT0nLTUzLjk2MTM4NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzguNDk5NzE1JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUzLjk2MTM4NycgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMi40MjI0OCcgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTMuOTYxMzg3JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUzLjk2MTM4NycgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUzLjk2MTM4NycgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUzLjk2MTM4NycgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTIuNzMwMjYxJyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTMuOTYxMzg3JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01My45NjEzODcnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIzLjAzODA0MycgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMi40MjI0OCcgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMi40MjI0OCcgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMi40MjI0OCcgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNy41NzYzNzEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTQuOTk5NDI1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTQuOTk5NDI1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTQuOTk5NDI1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc1LjMwODM1NicgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzguNDk5NzE1JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PScxMC40NjIyNDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8L2c+Cjwvc3ZnPg==")} + @top-center{content:" TITLE VER. DATETIME \A \A Machine timer: od mtime do okresowego deadline'u v00.01 2026-07-20T00:00:00+02:00 \A PROJECT SERIES CARD SHEET \A \A Freestanding C na RV32I C · Freestanding RV32I and K&R 11/13 " counter(page) "/" counter(pages) " \A SUBJ. PROG. CORE SCOPE LEVEL POS. GITEA UUID 45f57fde-fc7b-5f41-a3af-f153202dff0f\A CARD UUID f37170be-e988-5f5d-b3cf-6ea179a9cd54 AUTHOR M. Pabiszczak\A Inf. — — — — — \A \A GITEA https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-machine-timer \A \A HTML https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f37170be-e988-5f5d-b3cf-6ea179a9cd54 ";width:119mm;height:24mm;box-sizing:border-box;padding:.2mm .7mm 0;border-block:1px solid #111;background-color:#fff;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMTkgMjQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxyZWN0IHdpZHRoPSIxMTkiIGhlaWdodD0iMjQiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTAgNS41Mzg0NkgxMTkgTTAgMTEuMDc2OUgxMTkgTTAgMTYuNjE1NEgxMTkgTTAgMjAuMzA3N0gxMTkgTTU5LjUgMFY1LjUzODQ2IE03Ny41IDBWNS41Mzg0NiBNNTkuNSA1LjUzODQ2VjExLjA3NjkgTTg5LjUgNS41Mzg0NlYxMS4wNzY5IE0xMDYuNSA1LjUzODQ2VjExLjA3NjkgTTcgMTEuMDc2OVYxNi42MTU0IE0xMyAxMS4wNzY5VjE2LjYxNTQgTTMwLjUgMTEuMDc2OVYxNi42MTU0IE00MS41IDExLjA3NjlWMTYuNjE1NCBNNTAuNSAxMS4wNzY5VjE2LjYxNTQgTTU5LjUgMTEuMDc2OVYxNi42MTU0IiBmaWxsPSJub25lIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMC4xNCIvPjwvc3ZnPg==");background-repeat:no-repeat;background-position:center;background-size:100% 100%;white-space:pre;vertical-align:top;text-align:left;font:700 5.2px/1.81538mm ui-monospace,SFMono-Regular,Consolas,monospace;letter-spacing:-.02px;color:#111;overflow:hidden} + @top-right{content:"";width:24mm;height:24mm;box-sizing:border-box;padding:0;border:1px solid #111;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:22mm 22mm;vertical-align:middle;text-align:center;font:0/0 sans-serif;color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyBjbGFzcz0idGl0bGUtcXIiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iS29kIFFSOiBodHRwczovL2RjZTdmYjlkLTdiMmYtNWQ0OS05NmEyLTNhMzBkMzA3MGI4NC5tcGFiaS5wbC9mMzcxNzBiZS1lOTg4LTVmNWQtYjNjZi02ZWExNzlhOWNkNTQiIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9Jzg1LjAzOTIyN3B0JyBoZWlnaHQ9Jzg1LjAzOTIyN3B0JyB2aWV3Qm94PSctNzIuMDAwMDA0IC03Mi4wMDAwMDQgODUuMDM5MjI3IDg1LjAzOTIyNyc+CjxnIGlkPSdwYWdlMSc+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctOS45NDQzNTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctOS45NDQzNTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjwvZz4KPC9zdmc+")} +}