From 70533670801afa924d07962bd71d304773621303 Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 12:39:54 +0300 Subject: [PATCH 1/7] [AUTHORS] Actual implementation --- src/authors.typ | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/authors.typ diff --git a/src/authors.typ b/src/authors.typ new file mode 100644 index 0000000..df05db4 --- /dev/null +++ b/src/authors.typ @@ -0,0 +1,115 @@ +#let _str-type = type("") +#let _dict-type = type((:)) + +#let _dict-get(dict, key, default: none, aliases: ()) = { + if key in dict { + dict.at(key) + } else { + let value = none + for alias in aliases { + if alias in dict { + value = dict.at(alias) + } + } + + if value != none { value } else { default } + } +} + +#let _normalize-author-item(item) = { + if type(item) == _dict-type { + if not ("name" in item) { + panic("Each item in `authors` must include a `name` field.") + } + + ( + name: item.at("name"), + email: _dict-get(item, "email"), + student-number: _dict-get(item, "student-number", aliases: ("student_number",)), + address: _dict-get(item, "address"), + ) + } else { + ( + name: item, + email: none, + student-number: none, + address: none, + ) + } +} + +#let normalize-authors(authors, author: none, email: none, student-number: none, address: none) = { + if authors != none { + if type(authors) != type(()) { + panic("`authors` must be an array.") + } + + let normalized = () + for item in authors { + let normalized-item = _normalize-author-item(item) + if normalized-item.at("name") == none { + panic("Author name must not be `none`.") + } + normalized.push(normalized-item) + } + + normalized + } else if author != none { + ( + ( + name: author, + email: email, + student-number: student-number, + address: address, + ), + ) + } else { + () + } +} + +#let author-name(author-item, link-names: true) = { + let name = author-item.at("name") + let email = author-item.at("email") + + if link-names and email != none and type(email) == _str-type { + link("mailto:" + email, name) + } else { + name + } +} + +#let authors-full(authors, separator: [\ ]) = { + if authors.len() == 0 { + none + } else { + authors.map(author => author-name(author)).join(separator) + } +} + +#let authors-compact(authors, link-names: true) = { + if authors.len() == 0 { + none + } else if authors.len() == 1 { + author-name(authors.first(), link-names: link-names) + } else { + [#author-name(authors.first(), link-names: link-names), et al.] + } +} + +#let author-submit-block(authors, link-names: true) = { + if authors.len() == 0 { + none + } else { + authors.map(author => [ + #let name = author-name(author, link-names: link-names) + #let student-number = author.at("student-number") + #if student-number != none { + name + [ (#student-number)] + } else { + name + } + #if author.at("address") != none [\ #author.at("address")] + ]).join([\ \ ]) + } +} From 8f8b446e6056a657d7e36c1fab9027e95ce22cc5 Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 12:42:19 +0300 Subject: [PATCH 2/7] [AUTHORS] exercises --- src/exercise.typ | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/exercise.typ b/src/exercise.typ index dcaa577..92003a1 100644 --- a/src/exercise.typ +++ b/src/exercise.typ @@ -2,6 +2,7 @@ #import "elements.typ": big-heading #import "tasks.typ": * #import "todo.typ": todo, list-todos, todo-state, hide-todos +#import "authors.typ": normalize-authors, authors-compact #let standard-box-translations = ( "task": [Task], @@ -67,6 +68,7 @@ semester: none, docent: none, author: none, + authors: none, date: datetime.today(), date-format: (date) => if type(date) == type(datetime.today()) { date.display("[day].[month].[year]") } else { date }, @@ -129,6 +131,8 @@ body ) = { let ifnn-line(e) = if e != none [#e \ ] + let normalized-authors = normalize-authors(authors, author: author) + let compact-author = authors-compact(normalized-authors) if title == none { title = if type != none or no != none [ #type #no ] + if (type != none or no != none) and suffix-title != none [ --- ] + if suffix-title != none [#suffix-title] @@ -212,7 +216,7 @@ #let h-l = if header-right != none {header-right} else [ #show: align.with(top + right) #ifnn-line(document-title) - #ifnn-line(author) + #ifnn-line(compact-author) #ifnn-line(date-format(date)) #context { if state("grape-suite-timefield").at(here()) != 1 { From be88da96a911b449c29a42bbf782bda1e7c55469 Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 12:43:40 +0300 Subject: [PATCH 3/7] [AUTHORS] slides --- src/slides.typ | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/slides.typ b/src/slides.typ index 0cd7846..da0a294 100644 --- a/src/slides.typ +++ b/src/slides.typ @@ -4,6 +4,7 @@ #import "colors.typ": * #import "todo.typ": todo, list-todos, todo-state, hide-todos #import "elements.typ": * +#import "authors.typ": normalize-authors, authors-compact, authors-full #let uncover = polylux.uncover #let only = polylux.uncover @@ -46,6 +47,7 @@ footer: none, author: none, + authors: none, email: none, page-numbering: (n, total) => { @@ -83,6 +85,10 @@ body ) = { + let normalized-authors = normalize-authors(authors, author: author, email: email) + let compact-author = authors-compact(normalized-authors) + let full-authors = authors-full(normalized-authors) + let left-footer = if footer != none { footer } else { @@ -90,7 +96,7 @@ if show-semester [#semester(short: true, date)], [#series] + if no != none [ \##no], title, - if show-author { author }).filter(e => e != none).join[ --- ] + if show-author { compact-author }).filter(e => e != none).join[ --- ] ) } @@ -147,7 +153,13 @@ ] else { title-replacement } #set text(size: 0.75em) - #if show-author [#author #if email != none [--- #email ] \ ] + #if show-author { + if authors != none { + if full-authors != none [#full-authors \ ] + } else { + [#author #if email != none [--- #email ] \ ] + } + } #if show-semester [#semester(date) \ ] #if show-date { date-format(date) } ] From 702713e84fee81130857f76759b33ad51b496afa Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 12:43:54 +0300 Subject: [PATCH 4/7] [AUTHORS] seminars --- src/seminar-paper.typ | 75 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/src/seminar-paper.typ b/src/seminar-paper.typ index a72ef7c..fee8007 100644 --- a/src/seminar-paper.typ +++ b/src/seminar-paper.typ @@ -1,6 +1,7 @@ #import "colors.typ" as colors: * #import "todo.typ": todo, list-todos, hide-todos #import "elements.typ": * +#import "authors.typ": normalize-authors, authors-compact, author-submit-block #let project( title: none, @@ -17,6 +18,7 @@ docent: "DOCENT", author: "AUTHOR", + authors: none, student-number: none, email: "EMAIL", address: "ADDRESS", @@ -57,6 +59,14 @@ body ) = { let ifnn-line(e) = if e != none [#e \ ] + let normalized-authors = normalize-authors( + authors, + author: author, + email: email, + student-number: student-number, + address: address, + ) + let compact-author = authors-compact(normalized-authors) set text(font: text-font, size: fontsize) show math.equation: set text(font: math-font) @@ -103,9 +113,13 @@ #if title-page-part-submit-by == none { ifnn-line(text(size: 0.6em, upper(strong(submit-by)))) - ifnn-line(author + if student-number != none [ (#student-number)]) - ifnn-line(email) - ifnn-line(address) + if authors != none { + ifnn-line(author-submit-block(normalized-authors)) + } else { + ifnn-line(author + if student-number != none [ (#student-number)]) + ifnn-line(email) + ifnn-line(address) + } } else { title-page-part-submit-by } @@ -134,7 +148,7 @@ #title ], align(center, if header-middle != none {header-middle} else []), if header-right != none {header-right} else [ #show: align.with(top + right) - #author, #date-format(date) + #compact-author, #date-format(date) ]) ] + if show-header-line { v(-0.5em) + line(length: 100%, stroke: purple) }, ) @@ -209,24 +223,55 @@ // declaration of independent work if show-declaration-of-independent-work { + let is-multi-author = normalized-authors.len() > 1 pagebreak(weak: true) set page(footer: []) heading(outlined: false, numbering: none, [Selbstständigkeitserklärung]) - [Hiermit versichere ich, dass ich die vorliegende schriftliche Hausarbeit (Seminararbeit, Belegarbeit) selbstständig verfasst und keine anderen als die von mir angegebenen Quellen und Hilfsmittel benutzt habe. Die Stellen der Arbeit, die anderen Werken wörtlich oder sinngemäß entnommen sind, wurden in jedem Fall unter Angabe der Quellen (einschließlich des World Wide Web und anderer elektronischer Text- und Datensammlungen) kenntlich gemacht. Dies gilt auch für beigegebene Zeichnungen, bildliche Darstellungen, Skizzen und dergleichen. Ich versichere weiter, dass die Arbeit in gleicher oder ähnlicher Fassung noch nicht Bestandteil einer Prüfungsleistung oder einer schriftlichen Hausarbeit (Seminararbeit, Belegarbeit) war. Mir ist bewusst, dass jedes Zuwiderhandeln als Täuschungsversuch zu gelten hat, aufgrund dessen das Seminar oder die Übung als nicht bestanden bewertet und die Anerkennung der Hausarbeit als Leistungsnachweis/Modulprüfung (Scheinvergabe) ausgeschlossen wird. Ich bin mir weiter darüber im Klaren, dass das zuständige Lehrerprüfungsamt/Studienbüro über den Betrugsversuch informiert werden kann und Plagiate rechtlich als Straftatbestand gewertet werden.] + if is-multi-author { + [Hiermit versichern wir, dass wir die vorliegende schriftliche Hausarbeit (Seminararbeit, Belegarbeit) selbstständig verfasst und keine anderen als die von uns angegebenen Quellen und Hilfsmittel benutzt haben. Die Stellen der Arbeit, die anderen Werken wörtlich oder sinngemäß entnommen sind, wurden in jedem Fall unter Angabe der Quellen (einschließlich des World Wide Web und anderer elektronischer Text- und Datensammlungen) kenntlich gemacht. Dies gilt auch für beigegebene Zeichnungen, bildliche Darstellungen, Skizzen und dergleichen. Wir versichern weiter, dass die Arbeit in gleicher oder ähnlicher Fassung noch nicht Bestandteil einer Prüfungsleistung oder einer schriftlichen Hausarbeit (Seminararbeit, Belegarbeit) war. Uns ist bewusst, dass jedes Zuwiderhandeln als Täuschungsversuch zu gelten hat, aufgrund dessen das Seminar oder die Übung als nicht bestanden bewertet und die Anerkennung der Hausarbeit als Leistungsnachweis/Modulprüfung (Scheinvergabe) ausgeschlossen wird. Wir sind uns weiter darüber im Klaren, dass das zuständige Lehrerprüfungsamt/Studienbüro über den Betrugsversuch informiert werden kann und Plagiate rechtlich als Straftatbestand gewertet werden.] + } else { + [Hiermit versichere ich, dass ich die vorliegende schriftliche Hausarbeit (Seminararbeit, Belegarbeit) selbstständig verfasst und keine anderen als die von mir angegebenen Quellen und Hilfsmittel benutzt habe. Die Stellen der Arbeit, die anderen Werken wörtlich oder sinngemäß entnommen sind, wurden in jedem Fall unter Angabe der Quellen (einschließlich des World Wide Web und anderer elektronischer Text- und Datensammlungen) kenntlich gemacht. Dies gilt auch für beigegebene Zeichnungen, bildliche Darstellungen, Skizzen und dergleichen. Ich versichere weiter, dass die Arbeit in gleicher oder ähnlicher Fassung noch nicht Bestandteil einer Prüfungsleistung oder einer schriftlichen Hausarbeit (Seminararbeit, Belegarbeit) war. Mir ist bewusst, dass jedes Zuwiderhandeln als Täuschungsversuch zu gelten hat, aufgrund dessen das Seminar oder die Übung als nicht bestanden bewertet und die Anerkennung der Hausarbeit als Leistungsnachweis/Modulprüfung (Scheinvergabe) ausgeschlossen wird. Ich bin mir weiter darüber im Klaren, dass das zuständige Lehrerprüfungsamt/Studienbüro über den Betrugsversuch informiert werden kann und Plagiate rechtlich als Straftatbestand gewertet werden.] + } v(1cm) - table(columns: (auto, auto, auto, auto), - stroke: white, - inset: 0cm, + if is-multi-author { + table(columns: (auto, auto), + stroke: white, + inset: 0cm, + strong([Ort:]) + h(0.5cm), + repeat("."+hide("'")), + ) - strong([Ort:]) + h(0.5cm), - repeat("."+hide("'")), - h(0.5cm) + strong([Unterschrift:]) + h(0.5cm), - repeat("."+hide("'")), - v(0.75cm) + strong([Datum:]) + h(0.5cm), - v(0.75cm) + repeat("."+hide("'")),) + for idx in range(normalized-authors.len()) { + table(columns: (auto, auto), + stroke: white, + inset: (x: 0cm, y: 0.25cm), + strong([Unterschrift #str(idx + 1):]) + h(0.5cm), + repeat("."+hide("'")), + ) + } + + table(columns: (auto, auto), + stroke: white, + inset: (top: 0.5cm), + strong([Datum:]) + h(0.5cm), + repeat("."+hide("'")), + ) + } else { + table(columns: (auto, auto, auto, auto), + stroke: white, + inset: 0cm, + + strong([Ort:]) + h(0.5cm), + repeat("."+hide("'")), + h(0.5cm) + strong([Unterschrift:]) + h(0.5cm), + repeat("."+hide("'")), + v(0.75cm) + strong([Datum:]) + h(0.5cm), + v(0.75cm) + repeat("."+hide("'")), + ) + } } } @@ -237,4 +282,4 @@ k.push((loc: (pos.page(), pos.position()), body: body)) return k }) -} \ No newline at end of file +} From a973807d113cb6adace26802ded0116f7bc38261 Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 12:44:22 +0300 Subject: [PATCH 5/7] [AUTHORS] subtypes --- src/subtypes.typ | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/subtypes.typ b/src/subtypes.typ index d929bd9..c606aab 100644 --- a/src/subtypes.typ +++ b/src/subtypes.typ @@ -1,6 +1,7 @@ #import "colors.typ": purple #import "exercise.typ" as exercise #import "todo.typ": todo +#import "authors.typ": normalize-authors, authors-full, authors-compact #let essay( title: [#todo[Title]], @@ -10,10 +11,14 @@ semester: [#todo[Semester]], docent: [#todo[Docent]], author: [#todo[Author]], + authors: none, date: [#todo[Date]], body) = { let ifnn(b) = if b != none [#b\ ] + let normalized-authors = normalize-authors(authors, author: author) + let full-authors = authors-full(normalized-authors) + let compact-authors = authors-compact(normalized-authors) show: exercise.project.with( page-margins: (right: 4cm), @@ -24,7 +29,7 @@ header: context if counter(page).get().first() > 1 [ #set text(size: 0.75em) - #title #h(1fr) #author + #title #h(1fr) #compact-authors #v(-0.5em) #line(length: 100%, stroke: purple) ], @@ -45,7 +50,7 @@ ][ #set align(right) #ifnn(semester) - #ifnn(author) + #ifnn(full-authors) #date ] @@ -71,10 +76,13 @@ semester: [#todo[Semester]], docent: [#todo[Docent]], author: [#todo[Author]], + authors: none, date: [#todo[Date]], body) = { let ifnn(b) = if b != none [#b\ ] + let normalized-authors = normalize-authors(authors, author: author) + let full-authors = authors-full(normalized-authors) show: exercise.project.with( title: none, type: none, @@ -103,7 +111,7 @@ ][ #set align(right) #ifnn(semester) - #ifnn(author) + #ifnn(full-authors) #date ] @@ -117,4 +125,4 @@ set par(first-line-indent: 1.5em, spacing: 0.65em) show heading: set par(leading: 0.65em) body -} \ No newline at end of file +} From 9f795717d3e2ee766679976d4f9e5b3c1203254e Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 13:10:12 +0300 Subject: [PATCH 6/7] [AUTHORS] Adding examples. --- examples/exercise02-multi-author.pdf | Bin 0 -> 40328 bytes examples/exercise02-multi-author.typ | 116 ++++++++++++++++++++++ examples/seminar-paper02-multi-author.pdf | Bin 0 -> 46168 bytes examples/seminar-paper02-multi-author.typ | 79 +++++++++++++++ examples/slides02-multi-author.pdf | Bin 0 -> 25421 bytes examples/slides02-multi-author.typ | 74 ++++++++++++++ 6 files changed, 269 insertions(+) create mode 100644 examples/exercise02-multi-author.pdf create mode 100644 examples/exercise02-multi-author.typ create mode 100644 examples/seminar-paper02-multi-author.pdf create mode 100644 examples/seminar-paper02-multi-author.typ create mode 100644 examples/slides02-multi-author.pdf create mode 100644 examples/slides02-multi-author.typ diff --git a/examples/exercise02-multi-author.pdf b/examples/exercise02-multi-author.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2baa8b84b44766a502d89033b3961d7785482ff7 GIT binary patch literal 40328 zcmeFa1z1&0*FUTXA|a?qNO=^cp;K@bHS2?`aailJ>UDi*CX3&pP4E2jguIW3oB66@ zMgLkX#M6&r;YQQ;aPzeE&~dZ2)^c(2fcV#PakN%7cSR7J7Ltd#hqZ^j6KG&tT9yE(Z-E$#+ofg*?^714l0pimcQ+tnH5oxX>FOhE<}gfWr6!%zTjE{KTlwW@i7 z3XG8m9Msda5GVweC?(LOSYoFD;w45v`QZ|O6auxjinT8SySjrwsUhZ#ad1I6Vhba1 z#70Bli1Pe?gR8(1`_BpqBucPEvRB9e`AhIE6g#lZEg++ZRwaQ2lO zTrCC(XD8iYIiTUfR&H>aXt>Ok8(bzDE)xy2f+l5$3q!%BpkP)|a0V2d0R?A3!9<{l z`3`>{wos0>yO6x2wG-5q+Mvg{Sb92v@keZ01hI7JCus6t${wy5OX3%%4MUO|Nlql; z!6`8$Il-)v#D#|Qp-GY<$$}&xm_s7-KPe+9=C@qwm|Hkn!z>Z&fPTs#j8}$Ts3SF@GP`iClEXN|4KHA-2R$R)L-~S|AJ3w!2Dm~lgPKo+U*Gq@c%1(68rH# z@Cl9P|6P2p8l=DKwqSt%+->2>=VvVkDed2K2d^T>^i z`K{q-ZfOnKAYhs3=wj&r2$GT__6LX-Bm(n`RRsEv<{x>YwX=%Jf0dYDtlNlI%|%kJMLzgwVg3 zpNK}`Z%O|5^(-(v(7#YSm_Jgl|E`{e{)M6^+Rnch%)hf|{Xzj?{>VOAt7rWUQGC%Py&d5vd_A0ioWCLZE*!LWwxeZwvnSbua+gpnfq#G5=B3h5m(!LIiGp zFPML02Sfd0{f7CY<@j11Y%PQs>SIK3<>x;3KT%>tf>!z%0B2CY7^_4??6;!SQJ4M8 z6adJ?63IkhVe|(Jsh^)=cw*F_l&uUG4x@7<<%=cSL_Z0E81>uow5)Bc0YGm_g41BS zphEw}SqlbSeFP_sdKz9UM+pt{9T zgcwmE;4x{f@gvD9Y>kK&|5ikYEF4LML5zIwDZfxf#76#YxuBb@*_4pt_)FLLBVF>> zru=S+|Eo<&G=+a|%0DvNS2ZP(mzAa@ED;MJA+WZR_c1?k1#c1-h`khp&(llvm!_(#6Ui+74*CPT zi_jkqj|W@hz%C|;0#zvr!dS2sCtP2P9qQ={_KqIbZs6_+ z96sc%pM}*+=<#JVPSbEt<<`8Ty2!^A$I^${E9yhvHPwy9Dj6iVkMx{tC>U2 zB!8emh#4HsZQTKdC?o;DQow-&ETB$gcc))WzAictnF>>JP>%iC{(yM80UH*wJ;V6K||jfJX={oh(IG2 zNXZ(s3A`v@E!m$Dk z>1GMslAs)W_pUfps99TESzE0Sp9C&!`-7D{GCF|k@ zsWx|NNMaBfz%~MOL9(;4ceZjPF@vyx>ZJy{#>(E(gA^jhSvmnO|DtIza4IWLS5iu% zBK@o0MOaze0Eq&buAzH>JY21RiLs#967M1q^KgG8F$@(*j3sdi6z}&aVk;uyFsTiR z0TfIkG-BLc0q*Pu7Bkk=5=ih*3L&8Y{t^A&{_-3QPa^jgHkNkgZp7p$kQ|A`%1aSL zXkrKtGDAgSh#>+R4q@RC77pRyl%jA54~Ix832;aZekKZsNcqIz5CMKB1BY;M=m0T< zM#3RkVhBgdCkLm*z|Z925Q%C9ID{fTLqP&SBJr|t2<8t5*MNfgBjDj@B>vzsQ6&Cg zs!=e1SW-%uKLV)~5`Uy;Fn?H5?J$1?m zXqZ0&+|p>6KOCucm_IZuYc$Ls29^YfB+?1rio>ep27U#VBRsL_JeD{kobe?1OkEb0Ro9-Li~XmNcF+|VPO6+ zFn<_W5`bJ{eQ-NqNc|HYTBI=qhBZ-_d>_@8o^FsMC{f`MM>RBFfs5&Po#g7`3QcCj z|3qcBq8B06rmnEoMEA2%M^f}?Q513CW35RPXs7Q>X`ms$uSaE9O#nU#p)tN1I{HjC zM`U{!lK0YUnr3xRa>|h3NEQ-)&X1_KAiKCp*u&$bf?ZYWODinOo*~wX+LB**>kaNl zcI&tvY-QfRC+H&E`SS?8If}6|^vRQi;e^885)j`qr~QHqKYdM#uH1MB_;MrHb!50*UuRh zg}-M0k%fZ6u0zPFbNx~&-`P(#6pS3p=b|iAT5`B`XLHiW-ds;8@gAFN9^E_2+>@w@ zq^%-<6X)7(WbmL(FE2Y;-?8uGChpf)L=p^NY)9b^g$L=%@!j7ZpZ-OZ>hnS@rxDvBgyR?#TkzkJ1>;U88!QOr{&) zuC5-iJyRoQ3r>3=hsHx|=MhaUEzLyZNc;NdIO{6|S3>yQcJ>N69q1j2k6vK&ckKK0 zDyBW=LbZ8X)WbIY*B)|Qj3dX`j!W&!kdO;`@`iF|M0$WmPH-u!f%Y>__?>wTg}~Pf zS{CdMbi0Q0A{&AW?1snAwYYY^#O8dsBjvV~!&0SIZz?Y3Y2P&G8Ps!Vk$&dx{i8*d z`u_VDaftoGreh`U0eoSVTc@s^zF@LF+W70Kq52TT>dJdcg}#HGyPHl+ z)ECRXrblIH7!etNdvkaht?=7s{|U9R44i$ng(8)`KUexI^^l&ZCOV$C zPj*JEr=M7^G;lrlL`!%}vygx9+u%Tk+lI2j z3$kyXrN4Moel)^VYVOwKhv%L$aWWN2o~};C*64fL9?LfmQ>{H~j5Lbq3K&EQ3O~e9 zMUvBPFuz+8{@BExp-FSV8ke~j*Q81J^sxfX@^qbdaK*;hjh`5Y8826tHh)QMPRJC~ zFxJh(J0-m|Jm_q5&YvOm`as?@m-hvCUd_CF?p3c52J-<_!lR^Av%rz~-mr^E#ZK9Dje&u!waQ$zR@9o4+}nP1Pa>==`^aXpi@Yae;2>qMS{Uqd$;P;R}O^-f#eckZ%>&Lsr7-{Lq z&f(NsyS2Wya5wJD_fl-)>s!p0yZD77eZt~_R7w1xRPRmB)PlG2$){eWGVe%zFgB<2 zPG-3Fn1pE67SaAKeOkt@8+$jijnK5L-{H5;@AE9@Vz|(AZ)Nr~{$leYv|1Y)1to4L zCIo5;ZH&JB;0{GbOTh@*X;YB7SD^ImdEuMSL>NlzYj3m%Je0l3)PGr)fPF`;k;=2@ zJbT%~t#_GhMuCeT)vFov8Z%jq7G@V?*Ts4x*mhKK3#)#;Yc_XT!|B1UstAFHTe!G; zG-T!D@8!GXY!-M-IT-LT`pr5V6Q{!ZUa~6lw8o--`ipt9kr4q?4;`EHyZ9@*eQ>?5 zN+Xg=e%jpEKewe~+)zp{2bDWd8h$iXNgU7}*mE?XCru2KeYIRP2)5>Xa zvmZNZpTW3w(yW4Uwu*XxR#~*0E>f*q?bPL(^<3dx9NQ(*RIT`DE{`3#{ISkMT&8dq z+;!@!W3z4s(HSb6OWDcLlO1Y0+5CxL{KmnZ1k{m{7d)@ZL(kniy04LSx8@nLuqT^E zjR*KssvgT4NQ(yVm`p#3IcxrUyGM-#cJ>D5^o8W$L5cC0gxZvQ;p1Z26i??bh#v17 zvSz!q`~Axp#kSO^TaJxJbxOwU{up&#`NjJf7q6EGD=gP5XHQ5*YF1sog*rLvpT#y;5<6@8ubvuvi<(bj!g zEpp=urL04mwdB2Ouc_WN6)|As6BH>2O-(y{8iLkYx=pB>gjl+1ZV~JFU`rF2pP&EE zPR(AyMomq@#$N4A?WsEaVjSL;dMxsw0U~%T|x`hvprPnk# zHArr7(OyH@?BKDE>pO8sjt&Pf~7(jZ$xC&u-VNWLa(9jh<9k1dr>tJx*A;`&|oWTFVCl&t90_l{|93 zYW%)BU97!XtB*!9TbNhi4#j>JjR(Q=Qvo{z%G3?gT5iauq%*5cVs1Ep@gVem94+6G zk+frnSbr~hnmL|aQNR>Y`z&Wygd*QEGmWzZodV|zg9+L}y+<-M^jxRP={m1;vGts* zzS7LV9FIeGEeMJyyT5dhnmeE`RjjEKP^fbJLv#Hm`n33}CmMxx{za)-%MSO{t z-8Y?Xb&Y1B&t8 zwSLMEAFz_Sdh8-*D2^u#5@|AmZ*(r_`&_VBjy|7j;L`78_9mQ1@DicsTu2ww>l+U# z6_7o$Tr9ya&(|Q3T6Bt?^H(Iqt?BE>PBt)ccAc`PXz#Jsf86loB3HGpXI#qutXOZe zWN)q96pNTGiRFS`XEz=`bzz-mL|F_?WEPu=*f_ku#K0`Pw9|do4Kdgi z)^pkO(|HU=aUFl5*V9_qqpEPcvG!~7XoGt131iw?9&P%{MN)aHZ&QcG(bwIU z$)p#i)Ye*KujR)Lt(zhAs*19T?AoyO0T)NBe-)F)6Sp;q{$r~!Y2w!6 zPw*O)Y%LJ%C%RYL0MLUUsQT~7hf;&w{~d z07Qa63;|69q%j~K0;F*OKqUgw0Fs3OX$%2i#za6`6ufQ+1JV#2yaGrQ(P#ijV;~F~ z2BblWFdz*9xiBD&gMJYKX&m&F2uOW6U+gd|qt!V058~Rl29$uGZ@ucL1am&76~tfQ9Hs<^4$)egd-V!s^-TX4v@a?^L#KU5&8NqSc^4ZP z>w2=stB*6ua96h>=x$$)rnf%L`i_V9Jn!9Pfg=}Rp0pr%*g1ymRF=yK)w?heWuZ&H z-H=g7F0}x4JG4#IE21?Vo7?GoH=xMUR`phk^g`o;)NsNzOyj5P!#E{{8&*gb#|zdJ zci-XmR`bPVO&+9~x>9a0^u5$Q_zR3`OR)W#} z%=@hc{_@u(#rehS6LsP~@C!c6yTx>m&pjq4cCbTba_oYeKNxy2Eh&@gxr0@~+3sYM%{ezB1>PO|T1>WNEMpW4fOdEeU9( z=p-oemt1Xs|4px{0=4VR3)I2nQtIZH!PxialT3?`viHk=b-EO!P!+FqbW6W?uDqvw z623z%VLt8Ftd9K);mzi@9lh?d#!6as3epKO=1+FMIG1A5W%%@=!6&|k!sqH)2~k&1 zjN}~*eLRd=xNyt_Tp(!>!kZkQ!V~CYD+?sBI%l8Gcvhvi`dAe3#~)swCz@%Z*w1?dcNr8-XF^GCUB-994C5c!Wey#=GGln z7Bw5;7JIQt>S|sN_WCBSO;SQg#e3%1%lmE<%ar9t3H6i|o+xtaJ;iaICtO#gH~mrbi-*sWUXEzkkKDeLqpY9Dd5__n z?#BZ&<1^B^j6*us&+9t6wQgRHe9q1B;Yg57=Aln1J@YIwA-;OLhfDY4_t5U9k{L)& zuEUN9w_UY!RoP*sTGOL%H?z33^rh!Rye*GIK7-{1Tg#Cz1*YR~Cckx@5@v9G!8UE= zW>i-uk)0YdB)+xgK``G8uLf05g_cjI}A)pxJarj(Tw3@tIT(Q?Z@^gVUpf_mMd!x@k6pU1g4 z%sYknS+~Ep4;sq8by4^%b9ZenoPUYI{Tp*?|3 z8u=_5kHK7j@$AmfP0k6fPpTA_Gpw06W$25`1{kOHmfr4PunmY`W_Ih?eE&(KapaM^ zeYOM0I%dxyy)BFR3!1kO$Id<%_P2FPf3H+RvG2hA(qj9IyOYzhWM42J`+{mYsrBlV zr4cb#qG%pr$r?^4gxC}XZ6OalGkR6+kvH#YEGv^@i@o?+)gbOIW`~Sh7eCI8-iR$x z9}cHB9`ILOJi@t*@h^L0Q*BUwimUTYrP<)sWCGG!l@0q{-*tHk?#D08`P0oQJTG%_i}l*m61)1;}ojI z3jLhwpFMkZOI`A*i05&1YK^tc^KIyF{vthku58rZLzCQh3M|SV(o<~dIlf1ua`4Q( z+h-^84r}n9*>y&n(SUn`Fsu(I1gR9efvG z78P^+>xfjq6Dy@n_jiXKIk!YHN_&i5=3zBk6~pbojq^LsOzmh*daHfeqzAC+8)l$1 zyw%tC*zr!zJ~98C@~0d3?TE9>SKtXa)t#~b4Dz~z;Pb;qIsCE_$pO?gh{qn;8GH7< z(Umw{E6{mo-fL5HO6sPdi^xslr@i;Z^0c#VeOe*=x@h}Qo}9}KPM4H8P4@7cl`Q1* z+j~-va<^<3%(r+J!i%1mXvlL=$iQx=i&~^@?5^+6q7*K?cvkMqq1cRbg6HqN&7Ih* zY+iTdao9`afbgZ)dS$6HvbDbWhzY-aoAvn4VOb~mPo7G%I29p~^C;WHi(q26wN#r$ zVQMCz;=y?CX!SrctG525@Y!2gRu@=hbGPq9vNAQDT4!xzGu*x*F-)a9vFrTjL&Ji* zmf7|>hqbR^mjD}Z^~4D;#s9>F*U?opQd1I;vp#CB=c#S(?5^tK>;joEf9ya8e2|E~ z%plJXV;$IhkQ?0f2Yxs(V4yx91QB;~8P*a-+j5Jn-zFa#WM>OqPMBasAA;6a7Q3X4GwV+5R-Fadaz5rLb3 zvQt+QK?VQt5W*sb(HJa-=oa+DPiS@8HJyb31VL(&6|)r$sQ6pg`x)ONtttul|5~m8 z^%YvvR|t&UwXIe>$rdH~(vYk{k}nNxbCImp6&n_|>hL5h61M7AEK}I3BYCADNxmi| zix#$8SGXp(AaH6-<(v-P1B6B7)+vLrVk#HC} z*8#_Z+MCq5Or1vjuPn6R7o0Sujb9iGu$d%l`t+seUaz<9!-TxX6N?Vnf!XC>#5b6& zdz`!VbnB$&=0r@m0oS^Zl=-chC5#2$c3C|X`JC$-vkl5q>J3}nS(3+2-n?6K|ITB- z9iPa)AlGSUW(hPrCX1tc9kA}9*5NmDmwu;kvYTo<)$7>}O}!aY?S!1|Ur=xP)L^9D7!RzgN-1q7wxf+hsj-!RBV6$BtTT|x?QT8QEg4Gkwo0#GE{Eu3OPQ3NDSJk7;O{(dc#+tFJ=NS%uBsChU8K%e9q*g zTz`%)*t4H({FRpj!9n-+Mg69W*I(D+Q`lz2uX2#x@+rb^RX3;K6W@><;ypDMN#FCl zbWYKSx{^hu@?9Z!j^)K7+t(-X$^uVNHi`^G&HAGsJR+T5F-*^RY|Li0+oAW4_fz46 zrlYF+vu<8=dKsJH5|yuRd{4x(^jOWiLg8ELO=;DAx*xTeHXP62W?D-#L(n{P`1Q@Z z*+Xp>Z#Nx&!Yz?Zg;z~1qT`QZYo$pvc0&b{bbC-|&9_RNH8Tv+toe#s~^_D^CxQR2^b3{TgH^=EocziPSN zGb>N8`HZ!YA#w^V5ZVQpEn@SGF;+UnvlCADgyn@!^lzL{m14r zdcn)pM^95MTOI#AmHKr!+w1J!hq-v0T)kY@58{Q7j^?7X+AP8gZQm0*nLkX8nXA0s z7JtRek_vyt*>Ya1&-Rq_)-57lc_%+tJi2S!KH4DsZB*-I`EKVn8~dti{x3PxRF(qk z1EPA!c`o`_3BGa-isC%x(Me}C#zgbjq-Nr7V!pDHSis%kuWV{{#f=V?W@lSA&`*hK zU#@Qs)wxA4b;a^)LN%{VwL)%7!D&7bxqS=?qfJFQ)A?5o0$NnP2c?TMbfq~Zh79_Hgw8XyF6vnd6ke0q4+cLxhcn87ECXUF!EfB9WDAK_$<)1 zF8qt9M3Lihy_zQ%99i8lgm^F6cLIjjDwYSEv=)_M{Ufx4iut_oPjyT^}Dqy-2?=YHQ-rH6Uust`e?hW>#TQ zQ0`!mEm~beK{kKCC;F9M{VTT@O2v&f8FmrXDRC-Nru3)E=^7);C-2=ITl1}vlY})x& z__-RsQG1j}+Q^0Gq4awXUEc(}@$2F5E_JJ3D)#PnmlFIm@hS0Z^*h_?OOkbUMX@g) z3Oz!(=}%!esHm<-@x+RBiYmKbI{tb5)AAm*>dqbek0+^;J$fC&gTrqu*_EewP@P}J zn>z*~G6wsxj;n+0O3LxkMr3 z@ecn_g(~-qKW5*gdD8gg+`D`4W+*-`zTr{x+PVCk3KQ7vJtrA(rRTKkliiO9&zj#I zP?5Xk@YFS4fIrrxsfbp;j$di9Lx(AnFjq6tPBHT`;jBuQbMf-h6{p$Wim_)r%u*8W zePrdw-;Iq&@s##T<*JnJT|%f`uoS$Yd~T0Q@xl{-w4k%x;|ul=QS8rpw$*%zY#Q{5 zraQ~wcIKQtUg%(v=v#D{`X}WN@2S&O7$dlMb@9nIJ6)^gzI99WSh^yQ9ZmHvucce+ zA@s~5bmU#rCqCE;oeLW~S||}v(-jiGPV$oUS@Wv{Y~yduHS?L(ypWFfBn7+DM{`(& z&%F_qD$nxv(~sMJwb|X-PhUN5`_lnV*Ah!-izcdxejb57BgW%ef`>bOrdyl3Q{z48$0mNQnWRh-yCdXaU9|tzsm|ug<56l47YlBW4x`krcvR*FGe~dlmVV=QVd6y& z?Yg1l3;_US&?Z;RbzEt1?#YPQc;f03cV^RRvchfWK1-Bz?5MqHpOn9?(x>Z8_-pK! z&9Cl;wx>JH+ELid@F@;0^pVPhw=Z=EODM?G->lQEy5_WzUOd=o zv-#Jae8ET-fSQ3grijsN7x~}GI%&HL%p6{*K2$A!N2*>d%q9tk{AH8#y za&Lga%=?UOGq;}@-I3kPA3?j%P4hwwZ|lXc_I=?U4jLCWK4Uq_bRYj@ zK1Q$sRhOJlz#e0;S^8DKU-jHFT~ssAm#l;MYXZTx5ij%=LOGNJpXwi6R+LK}rg6MW zb)Ppt_;_0QUR#G;YR<2kGiOSa8ZI)LW*_(vF2hi26so&%%qS&I>B`L$+io2U)%&81 zk#tmuVs|-t#QuRo_C1=KV!lV=gLa$z43@Gtb!u^1iJ$IB&Szoox8~KKI;zPmN58AK zBYoUvk8b8+O9j`(le`!76QdjiS`T-QD~cV}V9Ia2^vDgHs+Xd4m~H-R#(~Xxl>I&j zlES`i8#oa=PcREWzPS11gqoE)$E(NT)L4GWg@OzXCZ+H;Gcnc}sc#bg56LeG`|>_L zisj!P6*a@ZF|#evWfPj~o8;@%Ehhp`x6j(Yxh;B#{Vhkwm9puDlECFxH;iUXo`*e= z+NZ74Gr?=+E`9YiPDYRN_;RP-xvQ80T>rCtSJ&1V<9yQz&4rtLPJ7A5)L(N5Vv0jq zq}C~2zVbB&KXdUy%x$^i$CzQ-OZ{z+1b0kEm;N_Ume0fJ7ns$Iq;wr=7>^n zd*<=LrLX9Rc9k1%y2R9zZQJL&MZ4WdK&<2Ct%_)2vDo8c(M@UNXtnk)Ggspds>$jd z45YhM@^WtP&8z-6ivqv*MM`&Lp55J~kYfLd`i|Z!9m<7QbhRnX;@VO3QafblGL{d- zZyb7XQD!T*P`O+s6Cv@|d(ZX%Ep@lo&B6(T$`n__?w4H-j%i1YDquuT@illq$H}tvX zYd&Xv=DLXc5c5?=YB6ct@S3Im?DdXsrNa3)tSHRKC4Ggj4L4}W6{oXjX`~M+SxuQl zYkFFLn+Uv|E7i-N*Nird9=6cksht;bYhZiI7WbHh-Onmb1otx?Y&DQN*e8QJsBwC( zR#A8|B5N`7rowZG*>+y%o8>nT9^kx>yhTsgz7N9~)cVHCGV#9p``CMe z(JXFH?HD+QWw8P>aKxfh!n?cTvxp1F5d{-d5^BahR2lmtf!bvmcw4qvnw z*rmAZnxu`ykbtp!P*>blo3412`3sz9ir&?Ia_@Ux&WxVA^A=~j z&h}eR?0K!>2q|=&b@bu7i(P?Q3}Pw@r~IjN5tfJi>RP+HMA9!s>>Q@($K+2@pZm<# zshHw>gxmY7!LE*AN#40=iEFHJ*U~<#^u-km(0gZ==`%~TzrQD1OsNE} zT@C}PtA;-5amM?sOat#-OL~sUTE1>;w%NNNN?`g*f@s?OX5F1O~ zSzgb}?8*Z(nL>doXo0h6oZ^d^Z{C}I1@KN^C#5!ZOv*1d^!RyRtT)P6KnZ@R8$gVA zKAg=vp|)qk&^_Y<*|MIU0o#P8E{f~8smo}3E_xT^&Bbz)0O3G}kl>0Qx~1A>LnMv28K+J1x~V=nzJo|gnv={0p@Q>s z=dOId(B}+dMwVSkFO3 zUB6tW@^Y69B}Mt}k;+2X6P2nWiW z+JcS3DDNvx(3e7+iE`%AUT=j-$)FQPGL8B#E5vSh%S&&aw(KjFlioI+kR0gQJ7jaWuxdEJ@-qDn%{iJo+S^AWQ^SM?h$2~Ugqg1{ajxe7^lBlZVdD%m$Z2~ z`!QeT<&Aw@b2oy#6q>`v>io|okJU{pIWPsLg?4g|zjX@YJYh!__#l|G=eD#*MXYrG zY0k+}dg}SR$&}->la%5kCqxRIXC_|>&c7&hUE&}((cHR{ZQ7$HV_YOUrzhfctT`a) zq0oq_%&eo=FC3S$wdQ$b*gmC|R&+f3#5Dcf<|wC1@0QkqV+;tY+K>{p%)Z{iYcUuh-)$rSkF_J9Cnu3}*7|)DDhlLV}ySiG(-*pw&L#un;%0xJKKS zyu4JO!l?TjSpD&m4a08@HKQ5LDE;x>-VWrmVzta>YytRhuQst&;DVetBa`kOsE~j8 zT<}7#|K)U=5_>Xh>Uvk3sY}#xc>6s``1o|{xX6JaZF1E_RYH2$0O3XYbn9h_!y0jz z_*+zQ(E~$K3R>@#4l27%MfXKJhV<2OL`REW;wk3iOIFUka5jpE?uJ~3bG+2VMv)}m zk&VW*6^~Tf9j-0<$uN)~=CSkN?rV9!m=OMOn>>Z;dlrieq9FDq%6T5pW3}KTy1xeOqJPZb7wcP zykeDzsJ+K*@jEm%yIdp9-Ixc@ztz;-ZtXUFKHpuDT8DyA?SmpAJv+pP6UHQ{HU!5{l4&`!m#ykHF#Wz}Tm*Y<*icR~JDKUf0MC-g6V zu)rnquUl*XqugvCN0v+&UjqTmmR zcf}JHoW`?UFmV1M&3qm4NJ{|ywiRKN5BlB^@DvBsqza97st{u<%CbiW4l!eU;?oOLB=N zIl+=#O-W9$qZBqvw`ym^Wu@dv*S zPjZ4?ak~BC1pA+LdnGEFzpE56q!={uuH_Q~qQ5UmR!{6dyS-XRJL%{QZ+-fSZ0cl5 zkJB-dEj^pR&-t;h;m#XHdss*;rF`;18&}rf3ks-0+xg^X~(zV_lJ8Uhh>a6Zl$;@vL z#dGPhMaEpYZ5(y`)g9BQuWGlYoI|;LQYqu*T2A{H*AF0ub-2X%q?bLT-$V)ws;%o~ z=Bhl^|DfMR)HUJR(Mubie)|&dA369Tx2tZ_U&wptjy1Z5l6-I4T{T)&rPlYj`8%`P zE%!ZGJtKRXs-9OppO8G9VDmgq?x}{;S<@RwZmD}5`c{jwb4pcX*h%O{>9BpOKc<&( z$sPF-Js6$ZD6Ak;>Zr?gZOUbG>)fQKzG4rXXF-~ra79tx9V4lEeQpDHbXdP=U32y8 zpv6V95c`l_%qn()QBi_(K@Sd$KfDxsrh(eJ`hJ7nUA;QJB;)Qvul%sQ7ljWkEo~Vr zwT}kBrA28_sk+8@py>;voh;5cejU@M)~>vFd1&2P))D~?a#QjsA%OrfqhyVbk2NGV z*qoW8d^CMs=&S~h2BMo0NhV@Oet4Y}+w##Z8mA6O^Y49@97vIzHQ6Ab=qKXw!6G#C z9Hkl3{9s;)k{jz*85gDe9izsRx*Ipv%ryoqE8SBYOy3a6u^={NdwI4ddt+Zxd)$j6 zl_dp(__&B-1KN1~Wkv)_w${%!iEJYq27kLWYkhOQdQ{^ z)MhTwvvM&F4Y@2}_1`^z^))>;M0dJMQP8&`tbCu;8(jn8l+cWg5<5EL;?3TasH5{@ z1ioaKX1p5}YTa?V@04YLQ*(mR`6F!ijQLA$CRChSl+Raq)s(@o@>_qqUxL#3%_OktFLJoxFIJCx~p!FKeCf}tNDo%?o- zllH#r(Q^sWW#I%~eU>9_%ZalhnzXqs4;VC#QVs?2^rNzMP)}aGJF#ED(pxdfC*7z>5Tl+HFD#U7<0B;5 z?foU>xP^X<@T*ANm~{Q#kEh>t9_TmS8|Eo|Fs@W-XW=1FaqaH6JR9$tu*D+=O@rqy z%~m-EpTsn6fsVjL{iI=!Ff2h%ZxBD?Z zaY3xXCtp=vmp&*O`<^-VP={Y?$&LQ$`LErXr;J9Ldll{vb;pr&(Y_C=dt8D&e!Ei6ny72uVl;^NXW zRGlL19?r3ukLU^vIIKTbiOv=cb}gULPzlZtSl?w%aU}MLkbTaB;tNCmH+e!*zkQY; ziu97coL=0#Jx*qEaK|Ps&wE>Tw0zmr$6g;;;wv$Em{qLN{{9on=%t-cLzWtjeG>?a zUwV2hzDP0uOn-aC^G91QZqqP6WBQFzOHxhplJJaZn{ZI|Le=Q>+~!BS#fqbXOqBiD zCqIAUXcJOQQ`LMM8*|?*^#QW@p_HOqyG+i6LYHJN<%csTN5WEUuQ#43a}$15Wxcho z=dzCxyG-H%nkrPx@rX~CbLw<9YO`eH1>UJre>Q7>F197D$KvYVqb$HbnD6ZCqV)Yf z_4UUquf-fWlQ`L#8kKrECXk}(l2uZg&CQ75KKg$D*EPPb;S-NW2lg6pYfzgn?CW<4 z83~{XaNXT0FUc+CS}cw_-04N}c*jx?J3slI2jX8<2%VD4nPQ#sh>JC%%4HoNB4tF4 z^xJ)OjBlwmA8k|i>{PgLL?az3WE@0{Vs=!2zE7JnxT&35~!eSeHQWAx7rgKZo}5I;g0!qWa0+($ieftRF_^x zc6qkGtz68GHL5K1R#mn8-p&m^IAsVe-h8 z@+WJ3a^H4?LY~uysJgyxUG0lC>H-NZ;g&HYQ<8o++N+|PnyfSXWIuakt5bG_L?6<& zM~&7EuU}uHyjZdRVfX#4HEbr)6@O1-5oK9f$n3TPrYK}qtoqQ~iu2~`G^Dp+!CC}b z8&DJT{B4zh#u1$+)!+|6YC&gVL5H=$M`EtEbXe_9>KUGUuu6kPLH$yJZYG`Aoh@<+ z+vRrdPcu7g(n+mw>w~JpMdkCwm$i}(_;28N|DOBx%`oSnw`m~{N_ZbA6}x@Vsm@z$ z5c?cxHg}4)?e+%qXzs!KlG6Th@eXE3>PwjFI}!Xnna-{2qV4#uaj%#4m$JCFkTVcc z`=RIKaLM(o(bA})8JXcRuh-vXYqA8Wrce6r;NkmB{j8u_ltO@Vdzy$u&c(`i=Gj_g z4h*i3-@eY@I3@Ft(@B4Q%XZCZWxM76OPdq6?Y;8Iaj9G$r>B1+bCK05v0%yIYhCi*N~E7cV5APDz&4AeSSkwGB}eayDj-_WXL@_BaOz%6FxqsJ+YM0!)2OVx>>hh zEM%mcEAZK!QEaL)(cFlzEZOyJPzhi>(~(F=fkyiB-W#>Pgz~%0E&J}ZXVp>MEZL_S zMj@>y{PoDVhXP9_^IOcJhK=$YYE%mOe5pROe(+cYx1DDXxpPRi-lzZdn;zGF6M4}NqK4aCWgn$is?nysJ57Gv^r98d`m}h$Ez#0 zTm2H*hn=>WoO>zime8pE)IQ*IM9+HN)Se)QP3fmNUSgt3!zp7G2m=1hJ_EYhCjpypH>R01>I8S z`$?%V{2*iL0Zt4AParb^A)>1Vok0$MgC7W9Cv$M}q>H$@qqUE)n~S%(^L}d|b0=_M zs<5?{Cv<`;P!J%k0{EUMxUC$G48AG?Wkmc_wpHL00BipKF2e8l7ZVdkLvqA{AK<7{ z2+YF^BLVn>N8*IRfo1TClYeI&;7;E^ANzx9@Ub26nN`wfX^Cj(cRnN(ciU;|j=XfX#Uc*O$ zXK0X?m>!gi2S12;Kpb=;+-liC+Tw=}CpFh^`o?$Jh>8k}qVV9&`W4~eK>x##zR2=V zvLRx~t6KCY*$_`r`2Ku(|aAZZa;m8e=<*_)FNkp;zq17Fbu0DyzjhJ{5%#o%KN zRyTq>Jj;UbnSzfVYePaIjbs>$1>x@vB(_452(iL8tLAKU>7kUgC$AV&Bitj$+e+K21>T!}^OWyC za-{oi;^DiuOBZuW9;DnQztBDSyu1Bd`(SCCcT%9bTrb1Kc+tlbA4-nbXME@_?Eds% z;re{|*oomU3nkyW@{@|*c>63|i1*Z=zva|BhdibPY%aE4rUgZhR!k7o+a(>#Aw}T>U7|R4YA3P2yRpP9; zTl$GFJdh@P-(A_MLCHK5^~9G&U&o8y4=CF=Q_OEm^L$z;`&w`Zx_!Ua&UVFuB4roM zb&(FUs$+FeIU@Jm+t>H#fNVvQfo;2F^{eid(s1=;m#67bqq5BjbvDmBq?f(!G6yE~ zX;ZOV-hXN+#Yxxos6^bhyT`fZ#G9hfFEMqqKJ`z^yw6^hvaDl4QSv>WW3OS^SUdWq zukB!4*Hl=K+$be#v8p|^r;MdGuho>593WMb5befwPJ=X*LV z3ca|uT{U>oU-kl{6ua>C(uR(}8tHrcn&zkmy`#2O-w6J8UgiFtT^U9R^Lw1RX%Y@b zI%eFctd7PxC_X}0Ydzs~*6d7T_kNMVm^*8c&HdrRhuT@kZ<^M7^wa{Z6Dv&aK5G~b zG%5((>$RMBf4sUrX~Ef={gS0(cVkwpWu+2R?ZumUKGT6aJQGs-YPv^--3-0eJqa8V zViw`4DFcGTu2Dz6hWFBM2oQfG;X5K>rAOAL)9-6i_uL1O!AX0%G~$-`)Tn`Dalu^6 zw|fO~f%qLA=NP6RM`!IFFt0BUyw&yLqNXgiEd_(;|2!F+^@d}!&%~ni(#y-sGf%VL z5W0t5?zV%O?z?OR%Bh4G(eQ}-#Bjf<*%2-v@l zyD_1tbKCl>PT}Tzo;^2KIef^b-CS^aH zUHC$G-_vCFIYHSE9+usSA5&Y@JTe>T*1y2gu`{8W(xOdrxhC3vQMeaL%?q!R>ZsYiK6C3E6c)mOx)YOvR8!@HAp?>8V zllrw#?b^#ilJ(~9=V`nSdnfSxzs9aS9_r_fhjJyB5T#n1JN9tyvQ{i2$(bXBTr0=Q zuCtUYL`w3dQc4s>`BrYZQm)ETQj}YivvL!D^P#?9cKiKazy0g8&pb2p%=4L7 zRYwBD&wzLy=O$)nD<$eEQ;!X=7yi6`53Evyhf$IGS{Ow025-F$)7@mwBD}?!{{+(^ ziA^#X7r4e2sjI<0c5LzW4yB)U!v(^nJmpyz0=b;*_?|CvdA4pnF`mYld#P{+Q#Gf= zJww1SmE13$(dENBWuCl=s7RdVQ+dFAUG_XtD&fSE{;N{1J^OQu7L4rVG-n9T`)Ww&yw-B0J%p)8SuPo{>$8rGfh3>aDh}$c_A3_|w=w2oc30^Owr3h_L?)8b2yCu< z{0N(L-sE9!vRg|V#iqivx)XX{)d*Oe)jky*+eEs^=Jkw}E3Vxg-t2EsU*YWel;uNx z?6hgO@j2yDBSvGYPv>R9Letx^v#ehCGRj{V{LG!NnUwUE2hG&qR z6+v7~lEn(`dn(LG*)_q#hg&TSHX2jivc*L|CD_MK_lG9SW;drqr+pd7-OsAi{Myw( z0_XYA~T zZG!k4+K;)ts!2~-BLO4~^c8aUq*0O-n z2Q?OBVteV<)0qb-{^J$~U(f5Yoi)+FXgKS6xs#uAhGgbyO*~&FNQv+sanjsLiDNJPK;~bU#u~If9geFkd|9Y>{N7D$)X1^Gu4iY} zHQ6nn45szK<H_<4yo(K|=%$HVjeM<4$1Wn`oBA}1Qy zid()Yj~}d6;Mx`_uCFupF1^z-?o-x{tB3gNO07pc_%AIS)gQIN@7@s+XYF8VogNbw zrH=64k;hiHHz1mo13|H?s~zi)9#2nE2@caqZH@j!_Pj>cuMNt%JKqp0Vr$jr#}J>R z+B0J*Jiu3X%6LBL{)T0AJ2}y$cl}-?Q6+;Y zIsagPE6Jz;sa}VA{{!2;z8n@U;oy&mW7PWr=ZP?6y5k!t$6l$mKRqFYwe0mvLeMkV zsiY+9FQFPyWp!4c%)!^oO2pyrlTW#iL~f72_QZf!gNLhs507v}?a2HQ0gdll*$`d> zFGpA&G2A4p7s&1u&;XnUb~~+IHIM6T+~Pj6`4&2yH#3f0T?xC7nx4H^CJ|nrs$G6~ zW29Yb3+n?Sr`E?Y3~Qwv+MC~8uo5Qk=uAYU$7Rn~vvH(GSVZ?Yn>Ch2^(H%_g9W4+ zf^uDs3J8~mxg5+3xw#c73z(NwWUo{!mxm zeQ$Z^e3dvVM77@KJPZ*oyqzgJbsKi=wuDpn_5M&q>_wZ;D(B*uT&5NccteNJS!_Ia zD+Dpe%*-Jiape9>M>|$g(>lSZ?qjzT85o$*Y6i@097s{w7YzQPT2jc?aE8p?Ha#UN z=N`@IMPufvHV{(v@<@(FW=x&5(<9&%f8d#1{!-#qaQlkMLpg>%!s?-k@xCnhj{I{f1&o8IVo5dn=Y+K(8yEkem-Jp<{!%BR)G#_~qk7$PQ9 zR4X6#Dpt3*&Aub&gfaBnEbZX9HGeiK1skIA?J1k~*l1qvIf;GkZyTz+4rCdzrpOEP z6=t+FR2$TmmL|&e^m+(|W*of2F!Q4Q>+GhYg7-XP8w(%4e8e>BHQEYz9o55dOC}E+~Y8X>~_ASts5EsazE~!MMCzd_SVW6f*#CxzOX&=6mq*OQs&Pnp-%_yDgXWEVR;md3jv< z4zW!8J!<*>>MSb%LDLWJM1Ac>PJQ2RKZjiIBs%!2*hk4bL>(-fsj1eVN{F*cql1whZhbQm6N{pU9^>B>?+qG?Y+BkgZ}L-j zESc5Yh55m*mV>Vh^A)CxlMYyK_4_0>ZhNNSctFzKcB7ez4mJHyv*MfP)R{qptmKQR z`iZ2MGCzLI-85@0wFt_%vD9QV)2ANLIhr*1xw#>Ju~F@4N7+}x8A@r&Fs=xd;eX$u zdB2Ykq0Qq>aZJGbR$$K5*bN((TOAKL55&|RpeTi+v%0ba6YHBaobtCBPZk(W78p(z z9G;x&E*t1$c(RDkQQ291T5VT&>(2K*^D$4!cbDXdou<1k${dPuPA+j4nID1`gk7m{ zzPvazT>AJ;IR8m6wKv%}G&SN4ut#i2X1!m1L@qC%d^?kLCB1I>vRGT`nNlV7&IUF6 z_mPSx)B39F8Z#Cz$Wpi1_}#udmk=&~GdgWX>9VWp>z*I(@tubEPY1sLKG~II)?0je z>2cC)|CSNLTNO@AKYU9!=VG{4pnHnlbl!N^?j8=s+87%zPXI0{4d=+->HMjKif}F9cfd>KEdCNy!kt0+$ z;lxPjgCGN^!Dwm6#G4AGHhED6O=JQhS7(MxMkg$Ox@ss*Bj)rxj+NbKJ3~XU!<(gL z{P;1yuA7Ag9U0=tf*QlcsETe9>Z@(n*~)?^JQe*WEF$L1eB5cFD$atojs_NMrWWhJ`j%H8+Za%w)5(%ANz?y2R8>0KE+`6yTu0~3=Y<4p4=8k%4zLaxzBZR zW`Hzpw-8`;9oIRWk=c>{xNX8iRj)AMTlbI21fdMk^xt)1;OfCi%k6?CB zaTpBuJ?}8d8BD9*Bbp-3KU$WD%hQq19xzDq^e6ZVp)VlQr5l1qg#`0;4e-ia)Tq9A z1&@V$aA%M9T}wY*r$$K2*HwhFyllCq;3Al+0cek845^j!{G-W0Q$fqO;#Ww%L*)ur zRsC`bYNx+0g?)7X;Ifc&zPgGu*_fR(;_-9j!9;9+OvF*mXtkyHzj+ zzjG-|CIF$fBRv1k558NA#y8Z&uDvQ=MBv6>55A9S@bUD}zP@BB>3iYG^_0>vvGa=4 zXUZ))i)1_vPKo4S`Sw}nLFO=WEMH~lSjeD6+O@GU#*O^`CDVDgZZzTeGbCpmwtF<5 z*?Dd0iIyIchsR!RG(5IsNH=9vY_rfFT?&;l)A{#&o~dNAgCLL7VDa(EEZ=NG{ZHPJ zmb&DRQ}-IVl$s+*o{b-OD-XWd-hkm0ZBwo@FsdZv?u;CYF-d#vL7F>kZl$y!d4RBG za(vow+qsn2T6eDf6mVFOcS?FXmT)mLaX(X0$Ng4k%G6NCdo|xK8~n-gwx?%i!pi5t z-q`D|(*YeerxunL2c}rge0{vQ4EEK?twxOdjd@Sswdr>ofV5N^D7GoJ{UyC7;g39zdVKnXNJ zppddF42yt(N)xbr!6h`60p0*E1;PN#2waZpn^SI|f6dl8*Tt~!C5DEq4->>*}8 zW$+A%Q3&{o3e`;&0W@X&yj=m=8G?ZKc63%Y2D{j+*}ykd1c^%ZQbwWt{QQu9a!9hb z3krk7;ZSH%!~Bmh(7fF|&~hnMoNj%G?GyA#&-H9U$o74PVv><&T#d;nOm z>U<4*m(>S%SAxqiJPPt3cwBv0Nkpy71Ct3Vzucc1^PtKJ#t!hF!f$NkHL68WAfLSSejR0ztGuhk2o=UI>M31fxE8_+Q zyo85r|CI!lqOY&4>q(*71L|vCO#;>oZK!2Ta=^Lys%uh=k2w43=u!MsRaeSiulg(V zZz8z=Bl8;7Uzv>o?(7PUXrjA4g+c(_ab#fNs#P>;cwoCS0C#?opb;=gB|OxgwX)SW zw5IF-dS_rXfv0~4B;nry4eD1#c!S~kr>W~V7QPmOB7&*Ho$Rs-xB%C$gf>915$g9u z0teXRDkg+lrI2+wwlaCGqBo}APEN*TGPq6px01fSx7#`ySf3znL^LIdH;-R;EB-9=N}r&iC?w$&5BHK&9#G zmB&D^;QD&y<>>tkpkq2;0ZLLjUjem0$o^m-4qU!ZQ?CMmjOk>5@Vx@W+De-j0M2wW z1t`pAecKci>HDq%7MwVu)x*)t04XY+eTskZDIjR2Yn!4RIO#-FhoU@mZ`gYKz$Jln zwkRsnw?h%2>~wkm;8XBA=;~F%0CrcJdI84(UEfubgRtWD_9@9jNAGB43efo=8W}`E zKr6#SS6!~x!=k}?Gg=u2A~vVdlcTo}hoK(}I9Z6aetllRx=QP33~&Lh%@{d)|ADE5 zUQZt41zukVMqUX7DACHmYK>L~1w_!wlyHi4dRV|TORI;K!_oR4^fbD@hQTV)&9NAq zBHernJOz&bt+!cL0Yf(~!Frr-zLHf?qMNh9@||vc$SPsz`T+G;;zRt$1kdVd5I-1pRu0$Cbqe)H_zM uVO?2Sto#XES)}M{!mT9!+agaA{@;^U;zGbO(VM!mR*=Jj7^YQ1%KrciCA#|n literal 0 HcmV?d00001 diff --git a/examples/exercise02-multi-author.typ b/examples/exercise02-multi-author.typ new file mode 100644 index 0000000..732a5e6 --- /dev/null +++ b/examples/exercise02-multi-author.typ @@ -0,0 +1,116 @@ +#import "../src/exercise.typ": project, task, subtask + +#set text(lang: "GB") + +#show: project.with( + no: 4, + type: [Worksheet], + title: [Secure Systems Practice Sheet], + suffix-title: [Input Validation and Policy Checks], + show-outline: true, + abstract: [ + This is a complete example configuration for the `exercise.project` template + with fake metadata and multi-author input. + ], + document-title: [Systems Security Worksheet], + + show-hints: false, + show-solutions: false, + + show-namefield: true, + namefield: none, + show-timefield: true, + timefield: (time) => [Time budget: #time min], + max-time: 90, + + show-lines: true, + show-point-distribution-in-tasks: true, + show-point-distribution-in-solutions: false, + + solutions-as-matrix: false, + show-solution-matrix-comment-field: false, + solution-matrix-comment-field-value: [*Reviewer note:* #v(0.4cm)], + + university: [Northbridge Technical University], + faculty: [Faculty of Applied Computing], + institute: [Institute for Systems Engineering], + seminar: [Secure Software Seminar], + semester: [Spring 2026], + docent: [Dr. Avery Morgan], + + author: [Legacy Single Author], + authors: ( + (name: "Alex Rowan", email: "alex.rowan@example.edu"), + (name: "Samira Hale", email: "samira.hale@example.edu"), + ), + + date: datetime(year: 2026, month: 2, day: 19), + date-format: (d) => if type(d) == type(datetime.today()) { + d.display("[day].[month].[year]") + } else { + d + }, + + header: none, + header-gutter: 18%, + header-right: none, + header-middle: none, + header-left: none, + show-header-line: true, + + footer: none, + footer-right: none, + footer-middle: none, + footer-left: none, + show-footer-line: true, + + task-type: [Task], + extra-task-type: [Bonus task], + box-task-title: [Task], + box-hint-title: [Hint], + box-solution-title: [Suggested solution], + box-definition-title: [Definition], + box-notice-title: [Notice], + box-example-title: [Example], + + hint-type: [Hint], + hints-title: [Hints], + solution-type: [Suggested solution], + solutions-title: [Suggested solutions], + + solution-matrix-task-header: [Task], + solution-matrix-achieved-points-header: [Points], + distribution-header-point-value: [Points], + distribution-header-point-grade: [Grade], + + message: (points-sum, extrapoints-sum) => [ + Total available: #points-sum + #extrapoints-sum points. + ], + grade-scale: ( + ([excellent], 0.9), + ([good], 0.75), + ([pass], 0.6), + ([fail], 0.49), + ), + + page-margins: (top: 5.2cm, bottom: 2.8cm, left: 2.5cm, right: 2.5cm), + text-font: ("Atkinson Hyperlegible",), + math-font: ("New Computer Modern Math",), + fontsize: 11pt, + show-todolist: false, +) + += Multiple-Choice +#task(points: 4, [Input Validation], [ + Select the most robust validation strategy for untrusted input. +], []) + += Short Answer +#task(points: 6, lines: 4, [Authorization], [ + Explain why authorization checks should be performed server-side. +], []) + += Extra +#task(extra: true, points: 3, [Bonus], [ + Give one real-world example of policy drift. +], []) diff --git a/examples/seminar-paper02-multi-author.pdf b/examples/seminar-paper02-multi-author.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9840d8dd848446b3678b8d5e430ae21833ec7aaf GIT binary patch literal 46168 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

l=n?X_|JBDcZqdBx}IIA}zDX7=~&8uBL1 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 DXgTgf literal 0 HcmV?d00001 diff --git a/examples/seminar-paper02-multi-author.typ b/examples/seminar-paper02-multi-author.typ new file mode 100644 index 0000000..5020811 --- /dev/null +++ b/examples/seminar-paper02-multi-author.typ @@ -0,0 +1,79 @@ +#import "../src/seminar-paper.typ" as seminar-paper + +#set text(lang: "GB") + +#show: seminar-paper.project.with( + title: [A Comparative Survey of Sandbox Security Models], + subtitle: [Template showcase with fake metadata], + + submit-to: [Submitted to], + submit-by: [Submitted by], + + university: [Northbridge Technical University], + faculty: [Faculty of Applied Computing], + institute: [Institute for Systems Engineering], + seminar: [Secure Software Seminar], + semester: [Spring 2026], + docent: [Dr. Avery Morgan], + + author: "Legacy Single Author", + authors: ( + ( + name: "Alex Rowan", + email: "alex.rowan@example.edu", + student-number: "NTU-10482", + address: [11 Cedar Lane, Brookfield, MA 01010], + ), + ( + name: "Samira Hale", + email: "samira.hale@example.edu", + student-number: "NTU-10617", + address: [92 Pine Street, Lakeview, MA 01011], + ), + ), + student-number: "LEGACY-0000", + email: "legacy.author@example.edu", + address: [Legacy Address, Legacy City], + + title-page-part: none, + title-page-part-submit-date: none, + title-page-part-submit-to: none, + title-page-part-submit-by: none, + + sentence-supplement: [Example], + + date: datetime(year: 2026, month: 2, day: 19), + date-format: (d) => if type(d) == type(datetime.today()) { + d.display("[month repr:long] [day], [year]") + } else { + d + }, + + header: none, + header-left: none, + header-middle: none, + header-right: none, + show-header-line: true, + + footer: none, + footer-left: none, + footer-middle: none, + footer-right: none, + show-footer-line: true, + + show-outline: true, + show-todolist: true, + show-declaration-of-independent-work: true, + + page-margins: (top: 2.6cm, bottom: 2.6cm, left: 2.6cm, right: 3.8cm), + + fontsize: 11pt, +) + += Scope +This file is a full-feature example for `seminar-paper.project` using fake names and sample metadata. + +[Replace with your institution data.] + += Notes +The default header uses compact multi-author formatting (`first author, et al.`) when `authors` has more than one entry. diff --git a/examples/slides02-multi-author.pdf b/examples/slides02-multi-author.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ebdd7d18dcf98f73fa2f9357a4639a980c40fdf2 GIT binary patch literal 25421 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 literal 0 HcmV?d00001 diff --git a/examples/slides02-multi-author.typ b/examples/slides02-multi-author.typ new file mode 100644 index 0000000..1a8a482 --- /dev/null +++ b/examples/slides02-multi-author.typ @@ -0,0 +1,74 @@ +#import "../src/slides.typ": slides, slide, focus-slide + +#set text(lang: "GB") + +#show: slides.with( + no: 7, + series: [Systems Security Colloquium], + title: [Policy-Driven Access Control], + topics: ([Motivation], [Architecture], [Threat Model], [Conclusions]), + + head-replacement: none, + title-replacement: none, + footer: none, + + author: [Legacy Single Author], + authors: ( + (name: "Alex Rowan", email: "alex.rowan@example.edu"), + (name: "Samira Hale", email: "samira.hale@example.edu"), + ), + email: "legacy.author@example.edu", + + page-numbering: (n, total) => { + text(size: 0.75em, strong[#n.first()]) + text(size: 0.5em, [ \/ #total.first()]) + }, + + show-title-slide: true, + show-author: true, + show-semester: true, + show-date: true, + show-outline: true, + show-todolist: false, + show-footer: true, + show-page-numbers: true, + + box-task-title: [Task], + box-hint-title: [Hint], + box-solution-title: [Solution], + box-definition-title: [Definition], + box-notice-title: [Notice], + box-example-title: [Example], + sentence-supplement: [Example], + + outline-title-text: [Outline], + outline-depth: 2, + heading-numbering: none, + + fontsize: 24pt, + text-font: ("Atkinson Hyperlegible",), + math-font: ("New Computer Modern Math",), + + date: datetime(year: 2026, month: 2, day: 19), + date-format: (d) => if type(d) == type(datetime.today()) { + [#d.display("[month repr:short] [day], [year]")] + } else { + d + }, +) + +#slide[ + = Why This Matters + Authorization bugs often appear when policy and implementation drift over time. +] + +#slide[ + = Model + - Inputs are untrusted. + - Policy decisions are centralized. + - Enforcement is explicit at each boundary. +] + +#focus-slide[ + Defense-in-depth beats single-point trust. +] From e8088e0444f6ffdb1307ca609b7cd4b84426e60b Mon Sep 17 00:00:00 2001 From: cbr4l0k Date: Thu, 19 Feb 2026 13:11:48 +0300 Subject: [PATCH 7/7] [AUTHORS] readme update --- README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cdbaef4..b097262 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,18 @@ For protocols and essays see [subtypes module](#subtypes). ) ``` +Multi-author example: + +```typ +#show: project.with( + title: "Lorem ipsum dolor sit", + authors: ( + (name: "John Doe", email: "john@example.org"), + (name: "Jane Doe", email: "jane@example.org"), + ), +) +``` + ### Documentation | `project` | | @@ -92,6 +104,7 @@ For protocols and essays see [subtypes module](#subtypes). | `semester` | optional, content, default: `none` | | `docent` | optional, content, default: `none` | | `author` | optional, content, default: `none` | +| `authors` | optional, array, default: `none`, multi-author input (items can be `name` content or dictionaries with `name`, optional `email`, `student-number`, `address`) | | `date` | optional, datetime or content, default: `datetime.today()` | | `date-format` | optional, function, default: `(date) => if type(date) == type(datetime.today()) { date.display("[day].[month].[year]") } else { date }` | | `header-gutter` | optional, length, default: `20%`, overwrite header gutter | @@ -213,6 +226,18 @@ _Note:_ The template generates a German statement of authorship as the last page ) ``` +Multi-author example: + +```typ +#show: seminar-paper.project.with( + title: "Die Intensionalität von dass-Sätzen", + authors: ( + (name: "Max Muster", email: "max@uni-musterstadt.uni", student-number: "0123456789"), + (name: "Erika Muster", email: "erika@uni-musterstadt.uni", student-number: "1234567890"), + ), +) +``` + ### Documentation | `project` | | @@ -228,6 +253,7 @@ _Note:_ The template generates a German statement of authorship as the last page | `semester` | optional, content, default: `"SEMESTER"` | | `docent` | optional, content, default: `"DOCENT"` | | `author` | optional, content, default: `"AUTHOR"` | +| `authors` | optional, array, default: `none`, multi-author input (items can be `name` content or dictionaries with `name`, optional `email`, `student-number`, `address`) | | `student-number` | optional, content, default: `none` | | `email` | optional, content, default: `"EMAIL"` | | `address` | optional, content, default: `"ADDRESS"` | @@ -310,6 +336,18 @@ _Note:_ The template generates a German statement of authorship as the last page ) ``` +Multi-author example: + +```typ +#show: slides.with( + title: [Organisatorisches und Einführung in die Logik], + authors: ( + (name: "Tristan Pieper", email: "tristan.pieper@uni-rostock.de"), + (name: "Juan Pablo Sierra Useche", email: "juan.pablo@niuitmo.ru"), + ), +) +``` + ### Documentation | `slides` | | @@ -319,7 +357,8 @@ _Note:_ The template generates a German statement of authorship as the last page | `title` | optional, content, default: `none`, title of the presentation | | `topics` | optional, array, default: `()`, topics of the presentation | | `author` | optional, content, default: `none`, author | -| `email` | optional, content, default: `none`, author's email | +| `authors` | optional, array, default: `none`, multi-author input (items can be `name` content or dictionaries with `name`, optional `email`, `student-number`, `address`) | +| `email` | optional, content, default: `none`, legacy single-author email | | `head-replacement` | optional, content, default: `none`, replace head on title slide with given content | | `title-replacement` | optional, content, default: `none`, replace title below head on title slide with given content | | `footer` | optional, content, default: `none`, replace footer on slides with given content | @@ -408,7 +447,10 @@ Essay: seminar: [Seminar], semester: [Semester], docent: [Docent], - author: [Author], + authors: ( + (name: [Author 1], email: "author1@example.org"), + (name: [Author 2], email: "author2@example.org"), + ), date: [1#super[st] January 1970], ) ``` @@ -425,7 +467,10 @@ Protocol: seminar: [Seminar], semester: [Semester], docent: [Docent], - author: [Author], + authors: ( + (name: [Author 1], email: "author1@example.org"), + (name: [Author 2], email: "author2@example.org"), + ), date: [1#super[st] January 1970], ) ``` @@ -443,6 +488,7 @@ The base layout of these functions is provided by `exercise.project`. | `semester` | optional, content, default: `[#todo[Semester]]` | | `docent` | optional, content, default: `[#todo[Docent]]` | | `author` | optional, content, default: `[#todo[Author]]` | +| `authors` | optional, array, default: `none`, multi-author input (items can be `name` content or dictionaries with `name`, optional `email`, `student-number`, `address`) | | `date` | optional, content, default: `[#todo[Date]]` | | `body` | content, document content | @@ -455,6 +501,7 @@ The base layout of these functions is provided by `exercise.project`. | `semester` | optional, content, default: `[#todo[Semester]]` | | `docent` | optional, content, default: `[#todo[Docent]]` | | `author` | optional, content, default: `[#todo[Author]]` | +| `authors` | optional, array, default: `none`, multi-author input (items can be `name` content or dictionaries with `name`, optional `email`, `student-number`, `address`) | | `date` | optional, content, default: `[#todo[Date]]` | | `body` | content, document content |