diff --git a/404.html b/404.html index 166bfa6..c97e5d6 100644 --- a/404.html +++ b/404.html @@ -14,7 +14,7 @@ - + @@ -22,7 +22,7 @@ - + @@ -182,7 +182,7 @@
- +
sig_core/wiki @@ -229,7 +229,7 @@
- +
sig_core/wiki diff --git a/assets/stylesheets/main.3cba04c6.min.css b/assets/stylesheets/main.3cba04c6.min.css new file mode 100644 index 0000000..873f8fe --- /dev/null +++ b/assets/stylesheets/main.3cba04c6.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block;margin:0 auto}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .md-code__content{display:grid}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"ยท";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em;position:relative}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,')}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-style:normal;font-weight:400;outline:none;text-align:initial;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}:root{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.md-tooltip2{-webkit-backface-visibility:hidden;backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:"";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}[role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:-moz-fit-content;width:fit-content}.md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__alias{margin-left:.3rem;opacity:.7}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:initial}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"โŽ‡";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"โŒ˜";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"โŒƒ";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"โ—†";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"โŒฅ";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"โ‡ง";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"โ–";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"โŠž";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"โ†“";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"โ†";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"โ†’";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"โ†‘";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"โŒซ";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"โ‡ค";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"โ‡ช";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"โŒง";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"โ˜ฐ";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"โŒฆ";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-end:before{content:"โค“";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"โŽ‹";padding-right:.4em}.md-typeset .keys .key-home:before{content:"โค’";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"โŽ€";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"โ‡Ÿ";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"โ‡ž";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"โŽ™";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"โ‡ฅ";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"โŒค";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"โŽ";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.3cba04c6.min.css.map b/assets/stylesheets/main.3cba04c6.min.css.map new file mode 100644 index 0000000..0d8f7b6 --- /dev/null +++ b/assets/stylesheets/main.3cba04c6.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/templates/assets/stylesheets/main/components/_meta.scss","../../../../src/templates/assets/stylesheets/main.scss","src/templates/assets/stylesheets/main/_resets.scss","src/templates/assets/stylesheets/main/_colors.scss","src/templates/assets/stylesheets/main/_icons.scss","src/templates/assets/stylesheets/main/_typeset.scss","src/templates/assets/stylesheets/utilities/_break.scss","src/templates/assets/stylesheets/main/components/_author.scss","src/templates/assets/stylesheets/main/components/_banner.scss","src/templates/assets/stylesheets/main/components/_base.scss","src/templates/assets/stylesheets/main/components/_clipboard.scss","src/templates/assets/stylesheets/main/components/_code.scss","src/templates/assets/stylesheets/main/components/_consent.scss","src/templates/assets/stylesheets/main/components/_content.scss","src/templates/assets/stylesheets/main/components/_dialog.scss","src/templates/assets/stylesheets/main/components/_feedback.scss","src/templates/assets/stylesheets/main/components/_footer.scss","src/templates/assets/stylesheets/main/components/_form.scss","src/templates/assets/stylesheets/main/components/_header.scss","node_modules/material-design-color/material-color.scss","src/templates/assets/stylesheets/main/components/_nav.scss","src/templates/assets/stylesheets/main/components/_pagination.scss","src/templates/assets/stylesheets/main/components/_post.scss","src/templates/assets/stylesheets/main/components/_progress.scss","src/templates/assets/stylesheets/main/components/_search.scss","src/templates/assets/stylesheets/main/components/_select.scss","src/templates/assets/stylesheets/main/components/_sidebar.scss","src/templates/assets/stylesheets/main/components/_source.scss","src/templates/assets/stylesheets/main/components/_status.scss","src/templates/assets/stylesheets/main/components/_tabs.scss","src/templates/assets/stylesheets/main/components/_tag.scss","src/templates/assets/stylesheets/main/components/_tooltip.scss","src/templates/assets/stylesheets/main/components/_tooltip2.scss","src/templates/assets/stylesheets/main/components/_top.scss","src/templates/assets/stylesheets/main/components/_version.scss","src/templates/assets/stylesheets/main/extensions/markdown/_admonition.scss","src/templates/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/templates/assets/stylesheets/main/extensions/markdown/_toc.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_keys.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/templates/assets/stylesheets/main/integrations/_mermaid.scss","src/templates/assets/stylesheets/main/modifiers/_grid.scss","src/templates/assets/stylesheets/main/modifiers/_inline.scss"],"names":[],"mappings":"AA0CE,gBCqxCF,CCnyCA,KAEE,6BAAA,CAAA,0BAAA,CAAA,qBAAA,CADA,qBDzBF,CC8BA,iBAGE,kBD3BF,CC8BE,gCANF,iBAOI,yBDzBF,CACF,CC6BA,KACE,QD1BF,CC8BA,qBAIE,uCD3BF,CC+BA,EACE,aAAA,CACA,oBD5BF,CCgCA,GAME,QAAA,CALA,kBAAA,CACA,aAAA,CACA,aAAA,CAEA,gBAAA,CADA,SD3BF,CCiCA,MACE,aD9BF,CCkCA,QAEE,eD/BF,CCmCA,IACE,iBDhCF,CCoCA,MAEE,uBAAA,CADA,gBDhCF,CCqCA,MAEE,eAAA,CACA,kBDlCF,CCsCA,OAKE,gBAAA,CACA,QAAA,CAHA,mBAAA,CACA,iBAAA,CAFA,QAAA,CADA,SD9BF,CCuCA,MACE,QAAA,CACA,YDpCF,CErDA,MAIE,6BAAA,CACA,oCAAA,CACA,mCAAA,CACA,0BAAA,CACA,sCAAA,CAGA,4BAAA,CACA,2CAAA,CACA,yBAAA,CACA,qCFmDF,CE7CA,+BAIE,kBF6CF,CE1CE,oHAEE,YF4CJ,CEnCA,qCAIE,eAAA,CAGA,+BAAA,CACA,sCAAA,CACA,wCAAA,CACA,yCAAA,CACA,0BAAA,CACA,sCAAA,CACA,wCAAA,CACA,yCAAA,CAGA,0BAAA,CACA,0BAAA,CAGA,0BAAA,CACA,mCAAA,CAGA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,gCAAA,CACA,gCAAA,CAGA,8BAAA,CACA,kCAAA,CACA,qCAAA,CAGA,iCAAA,CAGA,kCAAA,CACA,gDAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,+BAAA,CACA,0BAAA,CAGA,yBAAA,CACA,qCAAA,CACA,uCAAA,CACA,8BAAA,CACA,oCAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DFKF,CG9HE,aAIE,iBAAA,CAHA,aAAA,CAEA,aAAA,CADA,YHmIJ,CIxIA,KACE,kCAAA,CACA,iCAAA,CAGA,uGAAA,CAKA,mFJyIF,CInIA,iBAIE,mCAAA,CACA,6BAAA,CAFA,sCJwIF,CIlIA,aAIE,4BAAA,CADA,sCJsIF,CI7HA,MACE,0NAAA,CACA,mNAAA,CACA,oNJgIF,CIzHA,YAGE,gCAAA,CAAA,kBAAA,CAFA,eAAA,CACA,eJ6HF,CIxHE,aAPF,YAQI,gBJ2HF,CACF,CIxHE,uGAME,iBAAA,CAAA,cJ0HJ,CItHE,eAKE,uCAAA,CAHA,aAAA,CAEA,eAAA,CAHA,iBJ6HJ,CIpHE,8BAPE,eAAA,CAGA,qBJ+HJ,CI3HE,eAEE,kBAAA,CAEA,eAAA,CAHA,oBJ0HJ,CIlHE,eAEE,gBAAA,CACA,eAAA,CAEA,qBAAA,CADA,eAAA,CAHA,mBJwHJ,CIhHE,kBACE,eJkHJ,CI9GE,eAEE,eAAA,CACA,qBAAA,CAFA,YJkHJ,CI5GE,8BAKE,uCAAA,CAFA,cAAA,CACA,eAAA,CAEA,qBAAA,CAJA,eJkHJ,CI1GE,eACE,wBJ4GJ,CIxGE,eAGE,+DAAA,CAFA,iBAAA,CACA,cJ2GJ,CItGE,cACE,+BAAA,CACA,qBJwGJ,CIrGI,mCAEE,sBJsGN,CIlGI,wCACE,+BJoGN,CIjGM,kDACE,uDJmGR,CI9FI,mBACE,kBAAA,CACA,iCJgGN,CI5FI,4BACE,uCAAA,CACA,oBJ8FN,CIzFE,iDAIE,6BAAA,CACA,aAAA,CAFA,2BJ6FJ,CIxFI,aARF,iDASI,oBJ6FJ,CACF,CIzFE,iBAIE,wCAAA,CACA,mBAAA,CACA,kCAAA,CAAA,0BAAA,CAJA,eAAA,CADA,uBAAA,CAEA,qBJ8FJ,CIxFI,qCAEE,uCAAA,CADA,YJ2FN,CIrFE,gBAEE,iBAAA,CACA,eAAA,CAFA,iBJyFJ,CIpFI,qBASE,kCAAA,CAAA,0BAAA,CADA,eAAA,CAPA,aAAA,CAEA,QAAA,CAIA,uCAAA,CAHA,aAAA,CAFA,oCAAA,CASA,yDAAA,CADA,oBAAA,CAJA,iBAAA,CADA,iBJ4FN,CInFM,2BACE,+CJqFR,CIjFM,wCAEE,YAAA,CADA,WJoFR,CI/EM,8CACE,oDJiFR,CI9EQ,oDACE,0CJgFV,CIzEE,gBAOE,4CAAA,CACA,mBAAA,CACA,mKACE,CANF,gCAAA,CAHA,oBAAA,CAEA,eAAA,CADA,uBAAA,CAIA,uBAAA,CADA,qBJ+EJ,CIpEE,iBAGE,6CAAA,CACA,kCAAA,CAAA,0BAAA,CAHA,aAAA,CACA,qBJwEJ,CIlEE,iBAGE,6DAAA,CADA,WAAA,CADA,oBJsEJ,CIhEE,kBACE,WJkEJ,CI9DE,oDAEE,qBJgEJ,CIlEE,oDAEE,sBJgEJ,CI5DE,iCACE,kBJiEJ,CIlEE,iCACE,mBJiEJ,CIlEE,iCAIE,2DJ8DJ,CIlEE,iCAIE,4DJ8DJ,CIlEE,uBAGE,uCAAA,CADA,aAAA,CAAA,cJgEJ,CI1DE,eACE,oBJ4DJ,CIxDE,kDAGE,kBJ0DJ,CI7DE,kDAGE,mBJ0DJ,CI7DE,8BAEE,SJ2DJ,CIvDI,0DACE,iBJ0DN,CItDI,oCACE,2BJyDN,CItDM,0CACE,2BJyDR,CIpDI,wDACE,kBJwDN,CIzDI,wDACE,mBJwDN,CIzDI,oCAEE,kBJuDN,CIpDM,kGAEE,aJwDR,CIpDM,0DACE,eJuDR,CInDM,4HAEE,kBJsDR,CIxDM,4HAEE,mBJsDR,CIxDM,oFACE,kBAAA,CAAA,eJuDR,CIhDE,yBAEE,mBJkDJ,CIpDE,yBAEE,oBJkDJ,CIpDE,eACE,mBAAA,CAAA,cJmDJ,CI9CE,kDAIE,WAAA,CADA,cJiDJ,CIzCI,4BAEE,oBJ2CN,CIvCI,6BAEE,oBJyCN,CIrCI,kCACE,YJuCN,CIlCE,mBACE,iBAAA,CAGA,eAAA,CADA,cAAA,CAEA,iBAAA,CAHA,sBAAA,CAAA,iBJuCJ,CIjCI,uBACE,aAAA,CACA,aJmCN,CI9BE,uBAGE,iBAAA,CADA,eAAA,CADA,eJkCJ,CI5BE,mBACE,cJ8BJ,CI1BE,+BAME,2CAAA,CACA,iDAAA,CACA,mBAAA,CAPA,oBAAA,CAGA,gBAAA,CAFA,cAAA,CACA,aAAA,CAEA,iBJ+BJ,CIzBI,aAXF,+BAYI,aJ4BJ,CACF,CIvBI,iCACE,gBJyBN,CIlBM,8FACE,YJoBR,CIhBM,4FACE,eJkBR,CIbI,8FACE,eJeN,CIZM,kHACE,gBJcR,CITI,kCAGE,eAAA,CAFA,cAAA,CACA,sBAAA,CAEA,kBJWN,CIPI,kCAGE,qDAAA,CAFA,sBAAA,CACA,kBJUN,CILI,wCACE,iCJON,CIJM,8CACE,qDAAA,CACA,sDJMR,CIDI,iCACE,iBJGN,CIEE,wCACE,cJAJ,CIGI,wDAIE,gBJKN,CITI,wDAIE,iBJKN,CITI,8CAME,UAAA,CALA,oBAAA,CAEA,YAAA,CAKA,oDAAA,CAAA,4CAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAHA,iCAAA,CAFA,0BAAA,CAHA,WJON,CIKI,oDACE,oDJHN,CIOI,mEACE,kDAAA,CACA,yDAAA,CAAA,iDJLN,CISI,oEACE,kDAAA,CACA,0DAAA,CAAA,kDJPN,CIYE,wBACE,iBAAA,CACA,eAAA,CACA,iBJVJ,CIcE,mBACE,oBAAA,CAEA,kBAAA,CADA,eJXJ,CIeI,aANF,mBAOI,aJZJ,CACF,CIeI,8BACE,aAAA,CAEA,QAAA,CACA,eAAA,CAFA,UJXN,CKnVI,0CD6WF,uBACE,iBJtBF,CIyBE,4BACE,eJvBJ,CACF,CMlhBE,uBAOE,kBAAA,CALA,aAAA,CACA,aAAA,CAEA,aAAA,CACA,eAAA,CALA,iBAAA,CAOA,sCACE,CALF,YNwhBJ,CM/gBI,2BACE,aNihBN,CM7gBI,6BAME,+CAAA,CAFA,yCAAA,CAHA,eAAA,CACA,eAAA,CACA,kBAAA,CAEA,iBNghBN,CM3gBI,6BAEE,aAAA,CADA,YN8gBN,CMxgBE,wBACE,kBN0gBJ,CMvgBI,4BAIE,kBAAA,CAHA,mCAAA,CAIA,uBNugBN,CMngBI,4DAEE,oBAAA,CADA,SNsgBN,CMlgBM,oEACE,mBNogBR,CO7jBA,WAGE,0CAAA,CADA,+BAAA,CADA,aPkkBF,CO7jBE,aANF,WAOI,YPgkBF,CACF,CO7jBE,oBAEE,2CAAA,CADA,gCPgkBJ,CO3jBE,kBAGE,eAAA,CADA,iBAAA,CADA,eP+jBJ,COzjBE,6BACE,WP8jBJ,CO/jBE,6BACE,UP8jBJ,CO/jBE,mBAEE,aAAA,CACA,cAAA,CACA,uBP2jBJ,COxjBI,0BACE,YP0jBN,COtjBI,yBACE,UPwjBN,CQ7lBA,KASE,cAAA,CARA,WAAA,CACA,iBRimBF,CK7bI,oCGtKJ,KAaI,gBR0lBF,CACF,CKlcI,oCGtKJ,KAkBI,cR0lBF,CACF,CQrlBA,KASE,2CAAA,CAPA,YAAA,CACA,qBAAA,CAKA,eAAA,CAHA,eAAA,CAJA,iBAAA,CAGA,UR2lBF,CQnlBE,aAZF,KAaI,aRslBF,CACF,CKncI,0CGhJF,yBAII,cRmlBJ,CACF,CQ1kBA,SAEE,gBAAA,CAAA,iBAAA,CADA,eR8kBF,CQzkBA,cACE,YAAA,CACA,qBAAA,CACA,WR4kBF,CQzkBE,aANF,cAOI,aR4kBF,CACF,CQxkBA,SACE,WR2kBF,CQxkBE,gBACE,YAAA,CACA,WAAA,CACA,iBR0kBJ,CQrkBA,aACE,eAAA,CACA,sBRwkBF,CQ/jBA,WACE,YRkkBF,CQ7jBA,WAGE,QAAA,CACA,SAAA,CAHA,iBAAA,CACA,ORkkBF,CQ7jBE,uCACE,aR+jBJ,CQ3jBE,+BAEE,uCAAA,CADA,kBR8jBJ,CQxjBA,SASE,2CAAA,CACA,mBAAA,CAFA,gCAAA,CADA,gBAAA,CADA,YAAA,CAMA,SAAA,CADA,uCAAA,CANA,mBAAA,CAJA,cAAA,CAYA,2BAAA,CATA,URkkBF,CQtjBE,eAEE,SAAA,CAIA,uBAAA,CAHA,oEACE,CAHF,UR2jBJ,CQ7iBA,MACE,WRgjBF,CSzsBA,MACE,+PT2sBF,CSrsBA,cASE,mBAAA,CAFA,0CAAA,CACA,cAAA,CAFA,YAAA,CAIA,uCAAA,CACA,oBAAA,CAVA,iBAAA,CAEA,UAAA,CADA,QAAA,CAUA,qBAAA,CAPA,WAAA,CADA,STgtBF,CSrsBE,aAfF,cAgBI,YTwsBF,CACF,CSrsBE,kCAEE,uCAAA,CADA,YTwsBJ,CSnsBE,qBACE,uCTqsBJ,CSjsBE,wCACE,+BTmsBJ,CS9rBE,oBAME,6BAAA,CADA,UAAA,CAJA,aAAA,CAEA,cAAA,CACA,aAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CARA,aTwsBJ,CS5rBE,sBACE,cT8rBJ,CS3rBI,2BACE,2CT6rBN,CSvrBI,kEAEE,uDAAA,CADA,+BT0rBN,CU5vBE,8BACE,YV+vBJ,CWpwBA,mBACE,GACE,SAAA,CACA,0BXuwBF,CWpwBA,GACE,SAAA,CACA,uBXswBF,CACF,CWlwBA,mBACE,GACE,SXowBF,CWjwBA,GACE,SXmwBF,CACF,CWxvBE,qBASE,2BAAA,CADA,mCAAA,CAAA,2BAAA,CAFA,0BAAA,CADA,WAAA,CAEA,SAAA,CANA,cAAA,CACA,KAAA,CAEA,UAAA,CADA,SXgwBJ,CWtvBE,mBAcE,mDAAA,CANA,2CAAA,CACA,QAAA,CACA,mBAAA,CARA,QAAA,CASA,kDACE,CAPF,eAAA,CAEA,aAAA,CADA,SAAA,CALA,cAAA,CAGA,UAAA,CADA,SXiwBJ,CWlvBE,kBACE,aXovBJ,CWhvBE,sBACE,YAAA,CACA,YXkvBJ,CW/uBI,oCACE,aXivBN,CW5uBE,sBACE,mBX8uBJ,CW3uBI,6CACE,cX6uBN,CKvoBI,0CMvGA,6CAKI,aAAA,CAEA,gBAAA,CACA,iBAAA,CAFA,UX+uBN,CACF,CWxuBE,kBACE,cX0uBJ,CY30BA,YACE,WAAA,CAIA,WZ20BF,CYx0BE,mBAEE,qBAAA,CADA,iBZ20BJ,CK9qBI,sCOtJE,4EACE,kBZu0BN,CYn0BI,0JACE,mBZq0BN,CYt0BI,8EACE,kBZq0BN,CACF,CYh0BI,0BAGE,UAAA,CAFA,aAAA,CACA,YZm0BN,CY9zBI,+BACE,eZg0BN,CY1zBE,8BACE,WZ+zBJ,CYh0BE,8BACE,UZ+zBJ,CYh0BE,8BAIE,iBZ4zBJ,CYh0BE,8BAIE,kBZ4zBJ,CYh0BE,oBAGE,cAAA,CADA,SZ8zBJ,CYzzBI,aAPF,oBAQI,YZ4zBJ,CACF,CYzzBI,gCACE,yCZ2zBN,CYvzBI,wBACE,cAAA,CACA,kBZyzBN,CYtzBM,kCACE,oBZwzBR,Caz3BA,qBAeE,Wb03BF,Caz4BA,qBAeE,Ub03BF,Caz4BA,WAOE,2CAAA,CACA,mBAAA,CANA,YAAA,CAOA,8BAAA,CALA,iBAAA,CAMA,SAAA,CALA,mBAAA,CACA,mBAAA,CALA,cAAA,CAaA,0BAAA,CAHA,wCACE,CATF,Sbs4BF,Cav3BE,aAlBF,WAmBI,Yb03BF,CACF,Cav3BE,mBAEE,SAAA,CADA,mBAAA,CAKA,uBAAA,CAHA,kEb03BJ,Can3BE,kBAEE,gCAAA,CADA,ebs3BJ,Ccx5BA,aACE,gBAAA,CACA,iBd25BF,Ccx5BE,sBAGE,WAAA,CADA,QAAA,CADA,Sd45BJ,Cct5BE,oBAEE,eAAA,CADA,edy5BJ,Ccp5BE,oBACE,iBds5BJ,Ccl5BE,mBAEE,YAAA,CACA,cAAA,CACA,6BAAA,CAHA,iBdu5BJ,Ccj5BI,iDACE,yCdm5BN,Cc/4BI,6BACE,iBdi5BN,Cc54BE,mBAGE,uCAAA,CACA,cAAA,CAHA,aAAA,CACA,cAAA,CAGA,sBd84BJ,Cc34BI,gDACE,+Bd64BN,Ccz4BI,4BACE,0CAAA,CACA,mBd24BN,Cct4BE,mBAEE,SAAA,CADA,iBAAA,CAKA,2BAAA,CAHA,8Ddy4BJ,Ccn4BI,qBAEE,aAAA,CADA,eds4BN,Ccj4BI,6BACE,SAAA,CACA,uBdm4BN,Cej9BA,WAEE,0CAAA,CADA,+Bfq9BF,Cej9BE,aALF,WAMI,Yfo9BF,CACF,Cej9BE,kBACE,6BAAA,CAEA,aAAA,CADA,afo9BJ,Ceh9BI,gCACE,Yfk9BN,Ce78BE,iBAOE,eAAA,CANA,YAAA,CAKA,cAAA,CAGA,mBAAA,CAAA,eAAA,CADA,cAAA,CAGA,uCAAA,CADA,eAAA,CAEA,uBf28BJ,Cex8BI,8CACE,Uf08BN,Cet8BI,+BACE,oBfw8BN,CK1zBI,0CUvIE,uBACE,afo8BN,Cej8BM,yCACE,Yfm8BR,CACF,Ce97BI,iCACE,gBfi8BN,Cel8BI,iCACE,iBfi8BN,Cel8BI,uBAEE,gBfg8BN,Ce77BM,iCACE,ef+7BR,Cez7BE,kBACE,WAAA,CAIA,eAAA,CADA,mBAAA,CAFA,6BAAA,CACA,cAAA,CAGA,kBf27BJ,Cev7BE,mBAEE,YAAA,CADA,af07BJ,Cer7BE,sBACE,gBAAA,CACA,Ufu7BJ,Cel7BA,gBACE,gDfq7BF,Cel7BE,uBACE,YAAA,CACA,cAAA,CACA,6BAAA,CACA,afo7BJ,Ceh7BE,kCACE,sCfk7BJ,Ce/6BI,gFACE,+Bfi7BN,Cez6BA,cAKE,wCAAA,CADA,gBAAA,CADA,iBAAA,CADA,eAAA,CADA,Ufg7BF,CKp4BI,mCU7CJ,cASI,Uf46BF,CACF,Cex6BE,yBACE,sCf06BJ,Cen6BA,WACE,mBAAA,CACA,SAAA,CAEA,cAAA,CADA,qBfu6BF,CKn5BI,mCUvBJ,WAQI,efs6BF,CACF,Cen6BE,iBACE,oBAAA,CAEA,aAAA,CACA,iBAAA,CAFA,Yfu6BJ,Cel6BI,wBACE,efo6BN,Ceh6BI,qBAGE,iBAAA,CAFA,gBAAA,CACA,mBfm6BN,CgBzkCE,uBAME,kBAAA,CACA,mBAAA,CAHA,gCAAA,CACA,cAAA,CAJA,oBAAA,CAEA,eAAA,CADA,kBAAA,CAMA,gEhB4kCJ,CgBtkCI,gCAEE,2CAAA,CACA,uCAAA,CAFA,gChB0kCN,CgBpkCI,0DAEE,0CAAA,CACA,sCAAA,CAFA,+BhBwkCN,CgBjkCE,gCAKE,4BhBskCJ,CgB3kCE,gEAME,6BhBqkCJ,CgB3kCE,gCAME,4BhBqkCJ,CgB3kCE,sBAIE,6DAAA,CAGA,8BAAA,CAJA,eAAA,CAFA,aAAA,CACA,eAAA,CAMA,sChBmkCJ,CgB9jCI,wDACE,6CAAA,CACA,8BhBgkCN,CgB5jCI,+BACE,UhB8jCN,CiBjnCA,WAOE,2CAAA,CAGA,8CACE,CALF,gCAAA,CADA,aAAA,CAHA,MAAA,CADA,eAAA,CACA,OAAA,CACA,KAAA,CACA,SjBwnCF,CiB7mCE,aAfF,WAgBI,YjBgnCF,CACF,CiB7mCE,mBAIE,2BAAA,CAHA,iEjBgnCJ,CiBzmCE,mBACE,kDACE,CAEF,kEjBymCJ,CiBnmCE,kBAEE,kBAAA,CADA,YAAA,CAEA,ejBqmCJ,CiBjmCE,mBAKE,kBAAA,CAEA,cAAA,CAHA,YAAA,CAIA,uCAAA,CALA,aAAA,CAFA,iBAAA,CAQA,uBAAA,CAHA,qBAAA,CAJA,SjB0mCJ,CiBhmCI,yBACE,UjBkmCN,CiB9lCI,iCACE,oBjBgmCN,CiB5lCI,uCAEE,uCAAA,CADA,YjB+lCN,CiB1lCI,2BAEE,YAAA,CADA,ajB6lCN,CK/+BI,0CY/GA,2BAMI,YjB4lCN,CACF,CiBzlCM,8DAIE,iBAAA,CAHA,aAAA,CAEA,aAAA,CADA,UjB6lCR,CK7gCI,mCYzEA,iCAII,YjBslCN,CACF,CiBnlCM,wCACE,YjBqlCR,CiBjlCM,+CACE,oBjBmlCR,CKxhCI,sCYtDA,iCAII,YjB8kCN,CACF,CiBzkCE,kBAEE,YAAA,CACA,cAAA,CAFA,iBAAA,CAIA,8DACE,CAFF,kBjB4kCJ,CiBtkCI,oCAGE,SAAA,CADA,mBAAA,CAKA,6BAAA,CAHA,8DACE,CAJF,UjB4kCN,CiBnkCM,8CACE,8BjBqkCR,CiBhkCI,8BACE,ejBkkCN,CiB7jCE,4BAGE,gBAAA,CAAA,kBjBikCJ,CiBpkCE,4BAGE,iBAAA,CAAA,iBjBikCJ,CiBpkCE,kBACE,WAAA,CAGA,eAAA,CAFA,aAAA,CAGA,kBjB+jCJ,CiB5jCI,4CAGE,SAAA,CADA,mBAAA,CAKA,8BAAA,CAHA,8DACE,CAJF,UjBkkCN,CiBzjCM,sDACE,6BjB2jCR,CiBvjCM,8DAGE,SAAA,CADA,mBAAA,CAKA,uBAAA,CAHA,8DACE,CAJF,SjB6jCR,CiBljCI,uCAGE,WAAA,CAFA,iBAAA,CACA,UjBqjCN,CiB/iCE,mBACE,YAAA,CACA,aAAA,CACA,cAAA,CAEA,+CACE,CAFF,kBjBkjCJ,CiB5iCI,8DACE,WAAA,CACA,SAAA,CACA,oCjB8iCN,CiBriCI,yBACE,QjBuiCN,CiBliCE,mBACE,YjBoiCJ,CKhmCI,mCY2DF,6BAQI,gBjBoiCJ,CiB5iCA,6BAQI,iBjBoiCJ,CiB5iCA,mBAKI,aAAA,CAEA,iBAAA,CADA,ajBsiCJ,CACF,CKxmCI,sCY2DF,6BAaI,kBjBoiCJ,CiBjjCA,6BAaI,mBjBoiCJ,CACF,CDnxCA,SAGE,uCAAA,CAFA,eAAA,CACA,eCuxCF,CDnxCE,eACE,mBAAA,CACA,cAAA,CAGA,eAAA,CADA,QAAA,CADA,SCuxCJ,CDjxCE,sCAEE,WAAA,CADA,iBAAA,CAAA,kBCoxCJ,CD/wCE,eACE,+BCixCJ,CD9wCI,0CACE,+BCgxCN,CD1wCA,UAKE,wBmBaa,CnBZb,oBAAA,CAFA,UAAA,CAHA,oBAAA,CAEA,eAAA,CADA,0BAAA,CAAA,2BCixCF,CmBnzCA,MACE,0MAAA,CACA,gMAAA,CACA,yNnBszCF,CmBhzCA,QACE,eAAA,CACA,enBmzCF,CmBhzCE,eAKE,uCAAA,CAJA,aAAA,CAGA,eAAA,CADA,eAAA,CADA,eAAA,CAIA,sBnBkzCJ,CmB/yCI,+BACE,YnBizCN,CmB9yCM,mCAEE,WAAA,CADA,UnBizCR,CmBzyCQ,sFAME,iBAAA,CALA,aAAA,CAGA,aAAA,CADA,cAAA,CAEA,kBAAA,CAHA,UnB+yCV,CmBpyCE,cAGE,eAAA,CADA,QAAA,CADA,SnBwyCJ,CmBlyCE,cAGE,sBAAA,CAFA,YAAA,CACA,SAAA,CAEA,iBAAA,CAEA,uBAAA,CADA,sBnBqyCJ,CmBjyCI,sBACE,uCnBmyCN,CmB5xCM,6EAEE,+BnB8xCR,CmBzxCI,2BAIE,iBnBwxCN,CmBpxCI,4CACE,gBnBsxCN,CmBvxCI,4CACE,iBnBsxCN,CmBlxCI,kBAME,iBAAA,CAFA,aAAA,CACA,YAAA,CAFA,iBnBqxCN,CmB9wCI,sGACE,+BAAA,CACA,cnBgxCN,CmB5wCI,4BACE,uCAAA,CACA,oBnB8wCN,CmB1wCI,0CACE,YnB4wCN,CmBzwCM,yDAKE,6BAAA,CAJA,aAAA,CAEA,WAAA,CACA,qCAAA,CAAA,6BAAA,CAFA,UnB8wCR,CmBvwCM,kDACE,YnBywCR,CmBnwCE,iCACE,YnBqwCJ,CmBlwCI,6CACE,WAAA,CAGA,WnBkwCN,CmB7vCE,cACE,anB+vCJ,CmB3vCE,gBACE,YnB6vCJ,CK9tCI,0CcxBA,0CASE,2CAAA,CAHA,YAAA,CACA,qBAAA,CACA,WAAA,CALA,MAAA,CADA,iBAAA,CACA,OAAA,CACA,KAAA,CACA,SnB4vCJ,CmBjvCI,+DACE,eAAA,CACA,enBmvCN,CmB/uCI,gCAQE,qDAAA,CAHA,uCAAA,CAEA,cAAA,CALA,aAAA,CAEA,kBAAA,CADA,wBAAA,CAFA,iBAAA,CAKA,kBnBmvCN,CmB9uCM,wDAGE,UnBovCR,CmBvvCM,wDAGE,WnBovCR,CmBvvCM,8CAIE,aAAA,CAEA,aAAA,CACA,YAAA,CANA,iBAAA,CACA,SAAA,CAGA,YnBkvCR,CmB7uCQ,oDAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UnBsvCV,CmB1uCM,8CAGE,2CAAA,CACA,gEACE,CAJF,eAAA,CAKA,4BAAA,CAJA,kBnB+uCR,CmBxuCQ,2DACE,YnB0uCV,CmBruCM,8CAGE,2CAAA,CADA,gCAAA,CADA,enByuCR,CmBnuCM,yCAIE,aAAA,CAFA,UAAA,CAIA,YAAA,CADA,aAAA,CAJA,iBAAA,CACA,WAAA,CACA,SnBwuCR,CmBhuCI,+BACE,MnBkuCN,CmB9tCI,+BACE,4DnBguCN,CmB7tCM,qDACE,+BnB+tCR,CmB5tCQ,sHACE,+BnB8tCV,CmBxtCI,+BAEE,YAAA,CADA,mBnB2tCN,CmBvtCM,mCACE,enBytCR,CmBrtCM,6CACE,SnButCR,CmBntCM,uDAGE,mBnBstCR,CmBztCM,uDAGE,kBnBstCR,CmBztCM,6CAIE,gBAAA,CAFA,aAAA,CADA,YnBwtCR,CmBltCQ,mDAKE,6BAAA,CADA,UAAA,CAHA,aAAA,CAEA,WAAA,CAGA,2CAAA,CAAA,mCAAA,CACA,4BAAA,CAAA,oBAAA,CACA,6BAAA,CAAA,qBAAA,CACA,yBAAA,CAAA,iBAAA,CAPA,UnB2tCV,CmB3sCM,+CACE,mBnB6sCR,CmBrsCM,4CAEE,wBAAA,CADA,enBwsCR,CmBpsCQ,oEACE,mBnBssCV,CmBvsCQ,oEACE,oBnBssCV,CmBlsCQ,4EACE,iBnBosCV,CmBrsCQ,4EACE,kBnBosCV,CmBhsCQ,oFACE,mBnBksCV,CmBnsCQ,oFACE,oBnBksCV,CmB9rCQ,4FACE,mBnBgsCV,CmBjsCQ,4FACE,oBnBgsCV,CmBzrCE,mBACE,wBnB2rCJ,CmBvrCE,wBACE,YAAA,CACA,SAAA,CAIA,0BAAA,CAHA,oEnB0rCJ,CmBprCI,kCACE,2BnBsrCN,CmBjrCE,gCACE,SAAA,CAIA,uBAAA,CAHA,qEnBorCJ,CmB9qCI,8CAEE,kCAAA,CAAA,0BnB+qCN,CACF,CKj3CI,0Cc0MA,0CACE,YnB0qCJ,CmBvqCI,yDACE,UnByqCN,CmBrqCI,wDACE,YnBuqCN,CmBnqCI,kDACE,YnBqqCN,CmBhqCE,gBAIE,iDAAA,CADA,gCAAA,CAFA,aAAA,CACA,enBoqCJ,CACF,CK96CM,+DcmRF,6CACE,YnB8pCJ,CmB3pCI,4DACE,UnB6pCN,CmBzpCI,2DACE,YnB2pCN,CmBvpCI,qDACE,YnBypCN,CACF,CKt6CI,mCc7JJ,QAgbI,oBnBupCF,CmBjpCI,kCAME,qCAAA,CACA,qDAAA,CANA,eAAA,CACA,KAAA,CAGA,SnBmpCN,CmB9oCM,6CACE,uBnBgpCR,CmB5oCM,gDACE,YnB8oCR,CmBzoCI,2CACE,kBnB4oCN,CmB7oCI,2CACE,mBnB4oCN,CmB7oCI,iCAEE,oBnB2oCN,CmBpoCI,yDACE,kBnBsoCN,CmBvoCI,yDACE,iBnBsoCN,CACF,CK/7CI,sCc7JJ,QA4dI,oBAAA,CACA,oDnBooCF,CmB9nCI,gCAME,qCAAA,CACA,qDAAA,CANA,eAAA,CACA,KAAA,CAGA,SnBgoCN,CmB3nCM,8CACE,uBnB6nCR,CmBznCM,8CACE,YnB2nCR,CmBtnCI,yCACE,kBnBynCN,CmB1nCI,yCACE,mBnBynCN,CmB1nCI,+BAEE,oBnBwnCN,CmBjnCI,uDACE,kBnBmnCN,CmBpnCI,uDACE,iBnBmnCN,CmB9mCE,wBACE,YAAA,CACA,sBAAA,CAEA,SAAA,CACA,6FACE,CAHF,mBnBknCJ,CmB1mCI,sCACE,enB4mCN,CmBvmCE,iFACE,sBAAA,CAEA,SAAA,CACA,4FACE,CAHF,kBnB2mCJ,CmBlmCE,iDACE,enBomCJ,CmBhmCE,6CACE,YnBkmCJ,CmB9lCE,uBACE,aAAA,CACA,enBgmCJ,CmB7lCI,kCACE,enB+lCN,CmB3lCI,qCACE,enB6lCN,CmB1lCM,0CACE,uCnB4lCR,CmBxlCM,6DACE,mBnB0lCR,CmBtlCM,yFAEE,YnBwlCR,CmBnlCI,yCAEE,kBnBulCN,CmBzlCI,yCAEE,mBnBulCN,CmBzlCI,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","file":"main.css"} \ No newline at end of file diff --git a/assets/stylesheets/main.6543a935.min.css b/assets/stylesheets/main.6543a935.min.css deleted file mode 100644 index f9f772d..0000000 --- a/assets/stylesheets/main.6543a935.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block;margin:0 auto}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .md-code__content{display:grid}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"ยท";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,')}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}:root{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.md-tooltip2{-webkit-backface-visibility:hidden;backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:"";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}[role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:-moz-fit-content;width:fit-content}.md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__alias{margin-left:.3rem;opacity:.7}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:initial}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"โŽ‡";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"โŒ˜";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"โŒƒ";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"โ—†";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"โŒฅ";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"โ‡ง";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"โ–";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"โŠž";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"โ†“";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"โ†";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"โ†’";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"โ†‘";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"โŒซ";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"โ‡ค";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"โ‡ช";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"โŒง";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"โ˜ฐ";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"โŒฆ";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-end:before{content:"โค“";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"โŽ‹";padding-right:.4em}.md-typeset .keys .key-home:before{content:"โค’";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"โŽ€";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"โ‡Ÿ";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"โ‡ž";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"โŽ™";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"โ‡ฅ";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"โŒค";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"โŽ";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.6543a935.min.css.map b/assets/stylesheets/main.6543a935.min.css.map deleted file mode 100644 index dcac2d5..0000000 --- a/assets/stylesheets/main.6543a935.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["src/templates/assets/stylesheets/main/components/_meta.scss","../../../../src/templates/assets/stylesheets/main.scss","src/templates/assets/stylesheets/main/_resets.scss","src/templates/assets/stylesheets/main/_colors.scss","src/templates/assets/stylesheets/main/_icons.scss","src/templates/assets/stylesheets/main/_typeset.scss","src/templates/assets/stylesheets/utilities/_break.scss","src/templates/assets/stylesheets/main/components/_author.scss","src/templates/assets/stylesheets/main/components/_banner.scss","src/templates/assets/stylesheets/main/components/_base.scss","src/templates/assets/stylesheets/main/components/_clipboard.scss","src/templates/assets/stylesheets/main/components/_code.scss","src/templates/assets/stylesheets/main/components/_consent.scss","src/templates/assets/stylesheets/main/components/_content.scss","src/templates/assets/stylesheets/main/components/_dialog.scss","src/templates/assets/stylesheets/main/components/_feedback.scss","src/templates/assets/stylesheets/main/components/_footer.scss","src/templates/assets/stylesheets/main/components/_form.scss","src/templates/assets/stylesheets/main/components/_header.scss","node_modules/material-design-color/material-color.scss","src/templates/assets/stylesheets/main/components/_nav.scss","src/templates/assets/stylesheets/main/components/_pagination.scss","src/templates/assets/stylesheets/main/components/_post.scss","src/templates/assets/stylesheets/main/components/_progress.scss","src/templates/assets/stylesheets/main/components/_search.scss","src/templates/assets/stylesheets/main/components/_select.scss","src/templates/assets/stylesheets/main/components/_sidebar.scss","src/templates/assets/stylesheets/main/components/_source.scss","src/templates/assets/stylesheets/main/components/_status.scss","src/templates/assets/stylesheets/main/components/_tabs.scss","src/templates/assets/stylesheets/main/components/_tag.scss","src/templates/assets/stylesheets/main/components/_tooltip.scss","src/templates/assets/stylesheets/main/components/_tooltip2.scss","src/templates/assets/stylesheets/main/components/_top.scss","src/templates/assets/stylesheets/main/components/_version.scss","src/templates/assets/stylesheets/main/extensions/markdown/_admonition.scss","src/templates/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/templates/assets/stylesheets/main/extensions/markdown/_toc.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_keys.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/templates/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/templates/assets/stylesheets/main/integrations/_mermaid.scss","src/templates/assets/stylesheets/main/modifiers/_grid.scss","src/templates/assets/stylesheets/main/modifiers/_inline.scss"],"names":[],"mappings":"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","file":"main.css"} \ No newline at end of file diff --git a/documentation/compose/index.html b/documentation/compose/index.html index fe78325..42a341b 100644 --- a/documentation/compose/index.html +++ b/documentation/compose/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/documentation/compose/koji/index.html b/documentation/compose/koji/index.html index 43ba9ef..ebb8c8c 100644 --- a/documentation/compose/koji/index.html +++ b/documentation/compose/koji/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/documentation/empanadas/index.html b/documentation/empanadas/index.html index 8bb4348..cd70373 100644 --- a/documentation/empanadas/index.html +++ b/documentation/empanadas/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/guidelines/index.html b/documentation/guidelines/index.html index 151cec2..39215ff 100644 --- a/documentation/guidelines/index.html +++ b/documentation/guidelines/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/documentation/guidelines/rocky_logos_guidelines/index.html b/documentation/guidelines/rocky_logos_guidelines/index.html index ac2bda8..df0056f 100644 --- a/documentation/guidelines/rocky_logos_guidelines/index.html +++ b/documentation/guidelines/rocky_logos_guidelines/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/index.html b/documentation/index.html index 13ce0c8..3f7bec0 100644 --- a/documentation/index.html +++ b/documentation/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/patching/changes/index.html b/documentation/patching/changes/index.html index 80c9560..6502065 100644 --- a/documentation/patching/changes/index.html +++ b/documentation/patching/changes/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/patching/debrand_info/index.html b/documentation/patching/debrand_info/index.html index 85599e7..0cfb8ed 100644 --- a/documentation/patching/debrand_info/index.html +++ b/documentation/patching/debrand_info/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/patching/index.html b/documentation/patching/index.html index a9e9f9f..7078069 100644 --- a/documentation/patching/index.html +++ b/documentation/patching/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/patching/patching/index.html b/documentation/patching/patching/index.html index 9c61ca3..ddc11ce 100644 --- a/documentation/patching/patching/index.html +++ b/documentation/patching/patching/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/peridot/index.html b/documentation/peridot/index.html index 149ec45..c2f318a 100644 --- a/documentation/peridot/index.html +++ b/documentation/peridot/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/documentation/rebuild/index.html b/documentation/rebuild/index.html index cc53fbb..5029db1 100644 --- a/documentation/rebuild/index.html +++ b/documentation/rebuild/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/documentation/references/empanadas_common/index.html b/documentation/references/empanadas_common/index.html index cc3a21a..1dfffbf 100644 --- a/documentation/references/empanadas_common/index.html +++ b/documentation/references/empanadas_common/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/references/empanadas_config/index.html b/documentation/references/empanadas_config/index.html index 0807e83..be28b9b 100644 --- a/documentation/references/empanadas_config/index.html +++ b/documentation/references/empanadas_config/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/references/empanadas_sig_config/index.html b/documentation/references/empanadas_sig_config/index.html index a97595a..b97b8fa 100644 --- a/documentation/references/empanadas_sig_config/index.html +++ b/documentation/references/empanadas_sig_config/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/documentation/references/index.html b/documentation/references/index.html index e1cd78e..fa09da4 100644 --- a/documentation/references/index.html +++ b/documentation/references/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/events/meeting-notes/2024-03-18/index.html b/events/meeting-notes/2024-03-18/index.html index 7673015..f49d80c 100644 --- a/events/meeting-notes/2024-03-18/index.html +++ b/events/meeting-notes/2024-03-18/index.html @@ -18,7 +18,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -191,7 +191,7 @@
- +
sig_core/wiki @@ -238,7 +238,7 @@
- +
sig_core/wiki diff --git a/include/mod_table/index.html b/include/mod_table/index.html index b2dced9..3918b00 100644 --- a/include/mod_table/index.html +++ b/include/mod_table/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/include/resources_bottom/index.html b/include/resources_bottom/index.html index f6be7df..ba49b03 100644 --- a/include/resources_bottom/index.html +++ b/include/resources_bottom/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/index.html b/index.html index ecba613..c4a116a 100644 --- a/index.html +++ b/index.html @@ -18,7 +18,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -191,7 +191,7 @@
- +
sig_core/wiki @@ -238,7 +238,7 @@
- +
sig_core/wiki diff --git a/legacy/debrand_list/index.html b/legacy/debrand_list/index.html index 08c4c95..811ada4 100644 --- a/legacy/debrand_list/index.html +++ b/legacy/debrand_list/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/legacy/index.html b/legacy/index.html index a33bffe..dfd288c 100644 --- a/legacy/index.html +++ b/legacy/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/legacy/koji_tagging/index.html b/legacy/koji_tagging/index.html index 97d69d9..3c6d516 100644 --- a/legacy/koji_tagging/index.html +++ b/legacy/koji_tagging/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/members/index.html b/members/index.html index fcc84e8..7790fbf 100644 --- a/members/index.html +++ b/members/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki @@ -1145,6 +1145,7 @@ Email Mattermost Name IRC Name +Affiliation @@ -1152,8 +1153,9 @@ Release Engineering Co-Lead and Infrastructure Louis Abel label@rockylinux.org -@nazunalika +@label Sokel/label/Sombra +Independent Release Engineering Co-Lead @@ -1161,6 +1163,7 @@ mustafa@rockylinux.org @mustafa mstg +Independent Release Engineering and Development @@ -1168,6 +1171,7 @@ skip@rockylinux.org @skip77 +CIQ Release Engineering and Development @@ -1175,6 +1179,7 @@ sherif@rockylinux.org @sherif +Independent Release Engineering and Development @@ -1182,6 +1187,7 @@ pgreco@rockylinux.org @pgreco pgreco +Independent Infrastructure Lead @@ -1189,6 +1195,7 @@ neil@resf.org @neil neil +CIQ Infrastructure Lead @@ -1196,9 +1203,15 @@ tg@resf.org @tgo tg +Independent +
+

Note

+

Some members of Release Engineering may be affiliated with a sponsor of the Rocky Linux project or the Rocky Enterprise Software Foundation, as such they are listed here for transparency.

+

Independent members are those who are not affiliated with any sponsor of the project or foundation.

+
@@ -1219,7 +1232,7 @@ - 2024-03-04 + 2024-08-14 diff --git a/rpm/index.html b/rpm/index.html index ddf5f9e..9e2af3d 100644 --- a/rpm/index.html +++ b/rpm/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/rpm/local_module_builds/index.html b/rpm/local_module_builds/index.html index d51727b..04051cc 100644 --- a/rpm/local_module_builds/index.html +++ b/rpm/local_module_builds/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/search/search_index.json b/search/search_index.json index 8c03ebf..6efe8e4 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Release Engineering (SIG/Core) Wiki","text":""},{"location":"#about","title":"About","text":"

The Rocky Linux Release Engineering Team (also known as SIG/Core) dedicates themselves to the development, building, management, production, and release of Rocky Linux. This group combines development and infrastructure in a single, cohesive unit of individuals that ultimately make the distribution happen.

The \"SIG/Core\" reference name is not a strict Special Interest Group (as defined by the Rocky Linux wiki).

The general goals (or \"interests\") is:

  • To ensure Rocky Linux is built and released in a complete and functional manner
  • To ensure proper collaboration and development of the Peridot Build System
  • To ensure all users, developers, and Special Interest Groups are have a solid, stable platform to build upon
"},{"location":"#mission","title":"Mission","text":"

Release Engineering strives to ensure a stable distribution is developed, built, tested, and provided to the community from the RESF as a compatible derivative of Red Hat Enterprise Linux. To achieve this goal, some of the things we do are:

  • Ensuring a quality and fully compatible release product
  • Developing and iterating on the build systems and architecture
  • Developing all code in the open
  • Setting the technical direction for the build system architecture
  • Release of beta and final products to the end users and mirrors
  • Release of timely updates to the end users and mirrors

See the What We Do page for a more detailed explanation of our activities.

"},{"location":"#getting-in-touch-contributing","title":"Getting In Touch / Contributing","text":"

There are various ways to get in touch with Release Engineering and provide help, assistance, or even just ideas that can benefit us or the entire community.

  • Chat

    • Mattermost: ~development on Mattermost
    • IRC: #rockylinux and #rockylinux-devel on libera.chat
  • RESF SIG/Core Issue Tracker

  • Mail List

For a list of our members, see the Members page.

"},{"location":"#resources-and-rocky-linux-policies","title":"Resources and Rocky Linux Policies","text":"
  • RESF Git Service
  • Rocky Linux GitHub
  • Rocky Linux GitLab
  • Rocky Linux Image Guide
  • Rocky Linux Repository Guide
  • Rocky Linux Release Version Guide/Policy
  • Special Interest Groups.
"},{"location":"#general-packaging-resources","title":"General Packaging Resources","text":"
  • RPM Packaging Guide
  • Fedora Packaging Guidelines
  • Basic Packaging Tutorial
"},{"location":"members/","title":"Members","text":"

Release Engineering (SIG/Core) is a mix of Development and Infrastructure members to ensure a high quality release of Rocky Linux as well as the uptime of the services provided to the community. The current members of this group are listed in the table below. Some members may also be found in various Special Interest Groups, such as SIG/AltArch and SIG/Kernel.

Role Name Email Mattermost Name IRC Name Release Engineering Co-Lead and Infrastructure Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Release Engineering Co-Lead Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Release Engineering and Development Skip Grube skip@rockylinux.org @skip77 Release Engineering and Development Sherif Nagy sherif@rockylinux.org @sherif Release Engineering and Development Pablo Greco pgreco@rockylinux.org @pgreco pgreco Infrastructure Lead Neil Hanlon neil@resf.org @neil neil Infrastructure Lead Taylor Goodwill tg@resf.org @tgo tg"},{"location":"what_we_do/","title":"What We Do","text":"

Release Engineering (SIG/Core) was brought together as a combination of varying expertise (development and infrastructure) to try to fill in gaps of knowledge but to also to ensure that the primary goal of having a stable release of Rocky Linux is reached.

Some of the things we do in pursuit of our mission goals:

  • Continuous preparation for upcoming changes from upstream (Fedora and CentOS Stream)
  • Distribution release and maintenance
  • Design and collaboration for the Peridot build system
  • Design and development work to integrate all components together
  • Maintenance of the infrastructure used to build and maintain Rocky Linux (such as ansible roles and playbooks)
  • Working with the testing team with images and a platform to test
  • Providing resources for Special Interest Groups
  • Providing assistance and resources for users within the community to meet their goals

\"Why the name SIG/Core?\"

While not an actual Special Interest Group, the reality is that Release Engineering is ultimately the \"core\" of Rocky Linux's production. The idea of \"SIG/Core\" stemmed from the thought that without this group, Rocky Linux would not exist as it is now, so we are \"core\" to its existence. The other idea was that SIG/Core would eventually branch out to elsewhere. Where this would go, it is uncertain.

"},{"location":"documentation/","title":"Release General Overview","text":"

This section goes over at a high level how we compose releases for Rocky Linux. As most of our tools are home grown, we have made sure that the tools are open source and in our git services.

This page should serve as an idea of the steps we generally take and we hope that other projects out there who wish to also use our tools can make sure they can use them in this same way, whether they want to be an Enterprise Linux derivative or another project entirely.

"},{"location":"documentation/#build-system-and-tools","title":"Build System and Tools","text":"

The tools in use for the distribution are in the table below.

Tool Maintainer Code Location srpmproc SIG/Core at RESF GitHub empanadas SIG/Core at RESF sig-core-toolkit Peridot SIG/Core at RESF GitHub MirrorManager 2 Fedora Project MirrorManager2

For Rocky Linux to be build, we use Peridot as the build system and empanadas to \"compose\" the distribution. As we do not use Koji for Rocky Linux beyond version 9, pungi can no longer be used. Peridot instead takes pungi configuration data and comps and transforms them into a format it can understand. Empanadas then comes in to do the \"compose\" and sync all the repositories down.

"},{"location":"documentation/#full-compose-major-or-minor-releases","title":"Full Compose (major or minor releases)","text":"

Step by step, it looks like this:

  • Distribution is built and maintained in Peridot
  • Comps and pungi configuration is converted into the peridot format for the project
  • Repositories are created in yumrepofs based on the configuration provided
  • A repoclosure is ran against the repositories from empanadas to ensure there are no critical issues
  • In Parallel:

    • Repositories are synced as a \"full run\" in empanadas
    • Lorax is ran using empanadas in the peridot cluster
  • Lorax results are pulled down from an S3 bucket

  • DVD images are built for each architecture
  • Compose directory is synced to staging for verification
  • Staging is synced to production to allow mirror syncing
  • Bit flip on release day
"},{"location":"documentation/#general-updates","title":"General Updates","text":"

Step by step, it looks like this:

  • Distribution is maintained in Peridot
  • Updates are built, repos are then \"hashed\" in yumrepofs
  • Empanadas syncs updates as needed, either per repo or all repos at once
  • Updates are synced to staging to be verified
  • Staging is synced to production to allow mirror syncing
"},{"location":"documentation/empanadas/","title":"Empanadas","text":"

This page goes over empanadas, which is part of the SIG/Core toolkit. Empanadas assists SIG/Core is composing repositories, creating ISO's, creating images, and various other activities in Rocky Linux. It is also used for general testing and debugging of repositories and its metadata.

"},{"location":"documentation/empanadas/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact releng@rockylinux.org Mattermost Contacts @label @neil Mattermost Channels ~Development"},{"location":"documentation/empanadas/#general-information","title":"General Information","text":"

empanadas is a python project using poetry, containing various built-in modules with the goal to try to emulate the Fedora Project's pungi to an extent. While it is not perfect, it achieves the very basic goals of creating repositories, images and ISO's for consumption by the end user. It also has interactions with peridot, the build system used by the RESF to build the Rocky Linux distribution.

For performing syncs, it relies on the use of podman to perform syncing in a parallel fashion. This was done because it is not possible to run multiple dnf transactions at once on a single system and looping one repository at a time is not sustainable (nor fast).

"},{"location":"documentation/empanadas/#requirements","title":"Requirements","text":"
  • Poetry must be installed on the system
  • Podman must be installed on the system
  • fpart must be installed on the system (available in EPEL on EL systems)
  • Enough storage should be available if repositories are being synced
  • mock must be installed if building live images
  • System must be an Enterprise Linux system or Fedora with the %rhel macro set
"},{"location":"documentation/empanadas/#features","title":"Features","text":"

As of this writing, empanadas has the following abilities:

  • Repository syncing via dnf from a peridot instance or applicable repos
  • Per profile dnf repoclosure checking for all applicable repos
  • Per profile dnf repoclosure checking for peridot instance repositories
  • Basic ISO Building via lorax
  • Extra ISO Building via xorriso for DVD and minimal images
  • Live ISO Building using livemedia-creator and mock
  • Anaconda treeinfo builder
  • Cloud Image builder
"},{"location":"documentation/empanadas/#installing-empanadas","title":"Installing Empanadas","text":"

The below is how to install empanadas from the development branch on a Fedora system.

% dnf install git podman fpart poetry mock -y\n% git clone https://git.resf.org/sig_core/toolkit.git -b devel\n% cd toolkit/iso/empanadas\n% poetry install\n
"},{"location":"documentation/empanadas/#configuring-empanadas","title":"Configuring Empanadas","text":"

Depending on how you are using empanadas will depend on how your configurations will be setup.

  • empanadas/common.py
  • empanadas/config/*.yaml
  • empanadas/sig/*.yaml

These configuration files are delicate and can control a wide variety of the moving parts of empanadas. As these configurations are fairly massive, we recommend checking the reference guides for deeper details into configuring for base distribution or \"SIG\" content.

"},{"location":"documentation/empanadas/#using-empanadas","title":"Using Empanadas","text":"

The most common way to use empanadas is to sync repositories from a peridot instance. This is performed upon each release or on each set of updates as they come from upstream. Below lists how to use empanadas, as well as the common options.

Note that for each of these commands, it is fully expected you are running poetry run in the root of empanadas.

# Syncs all repositoryes for the \"9\" release\n% poetry run sync-from-peridot --release 9 --clean-old-packages\n\n# Syncs only the BaseOS repository without syncing sources\n% poetry run sync-from-peridot --release 9 --clean-old-packages --repo BaseOS --ignore-source\n\n# Syncs only AppStream for ppc64le\n% poetry run sync-from-peridot --release 9 --clean-old-packages --repo AppStream --arch ppc64le\n
Resources Account ServicesGit (RESF Git Service)Git (Rocky Linux GitHub)Git (Rocky Linux GitLab)Mail ListsContacts

URL: https://accounts.rockylinux.org

Purpose: Account Services maintains the accounts for almost all components of the Rocky ecosystem

Technology: Noggin used by Fedora Infrastructure

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

URL: https://git.resf.org

Purpose: General projects, code, and so on for the Rocky Enterprise Software Foundation.

Technology: Gitea

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://github.com/rocky-linux

Purpose: General purpose code, assets, and so on for Rocky Linux. Some content is mirrored to the RESF Git Service.

Technology: GitHub

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://git.rockylinux.org

Purpose: Packages and light code for the Rocky Linux distribution

Technology: GitLab

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://lists.resf.org

Purpose: Users can subscribe and interact with various mail lists for the Rocky ecosystem

Technology: Mailman 3 + Hyper Kitty

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

Name Email Mattermost Name IRC Name Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Skip Grube skip@rockylinux.org @skip77 Sherif Nagy sherif@rockylinux.org @sherif Pablo Greco pgreco@rockylinux.org @pgreco pgreco Neil Hanlon neil@resf.org @neil neil Taylor Goodwill tg@resf.org @tgo tg"},{"location":"documentation/peridot/","title":"Peridot Build System","text":"

This page goes over the Peridot Build System and how SIG/Core utilizes it.

More to come.

"},{"location":"documentation/rebuild/","title":"Rebuild Version Bump","text":"

In some cases, a package has to be rebuilt. A package may be rebuilt for these reasons:

  • Underlying libraries have been rebased
  • ABI changes that require a rebuild (mass rebuilds, though they are rare)
  • New architecture added to a project

This typically applies to packages being built from a given src subgroup. Packages pulled from upstream don't fall into this category in normal circumstances. In those cases, they receive .0.1 and so on as standalone rebuilds.

"},{"location":"documentation/compose/","title":"Composing and Managing Releases","text":"

This section goes over the process of composing a release from a bunch of packages to repositories, to images. This section also goes over the basics of working with koji when necessary.

"},{"location":"documentation/compose/koji/","title":"Updates and Management in Koji, A Manual","text":"

More to come.

"},{"location":"documentation/guidelines/","title":"Guidelines","text":"

This section is primarily for documentation and useful information as it pertains to guidelines for various packages or asset usage.

Release Engineering has the final \"go/no-go\" decision on submissions, assets, images, and the general structure of the release of Rocky Linux.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/","title":"Rocky Logos Package Guidelines","text":"

This page goes over the basic guidelines for the rocky-logos package, which produces assets for anaconda, wallpapers, and other assets for the distribution.

Release Engineering has the final \"go/no-go\" decision on submissios/assets/images in the package.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#rocky-logo-assets","title":"Rocky Logo Assets","text":"

In various parts of the package, the Rocky logo will need to exist in multiple forms:

  • Green variant
  • White variant

This can be in the form of PNG, JPG, or SVG files.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#anaconda","title":"anaconda","text":"

All anaconda image assets will be in PNG form. Backgrounds should be transparent with the exception of rnotes if applicable.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#backgrounds","title":"Backgrounds","text":"

See Backgrounds Section

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#fedora","title":"fedora","text":"

SVG format of logo assets as fedora_logo (color) and fedora_logo_darkbackground (white), and a default as fedora_logo.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#firstboot","title":"firstboot","text":"

First boot assets. This is generally the sidebar (like the anaconda installer) and a workstation icon. PNG format.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#iconshicolor","title":"icons/hicolor","text":"

Rocky icons will appear here in different resolutions and must be in PNG or SVG format:

  • 16x16/apps: PNG, system-logo-icon, fedora-logo-icon
  • 22x22/apps: PNG, system-logo-icon, fedora-logo-icon
  • 24x24/apps: PNG, system-logo-icon, fedora-logo-icon
  • 32x32/apps: PNG, system-logo-icon, fedora-logo-icon
  • 36x36/apps: PNG, system-logo-icon, fedora-logo-icon
  • 48x48/apps: PNG, system-logo-icon, fedora-logo-icon
  • 96x96/apps: PNG, system-logo-icon, fedora-logo-icon
  • 256x256/apps: PNG, system-logo-icon, fedora-logo-icon
  • scalable/apps: SVG, fedora-logo-icon, org.fedoraproject.AnacondaInstaller.svg, start-here.svg, xfce4_xicon1.svg
  • symbolic/apps: SVG, org.fedoraproject.AnacondaInstaller-symbolic
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#ipa","title":"ipa","text":"

IPA specific assets, usually text. They are generally PNG or JPG:

  • header-logo.png - Text
  • login-screen-background.jpg - No text
  • login-screen-logo.png - Logo + Text
  • product-name.png - Text
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#pixmaps","title":"pixmaps","text":"

PNG format, these are usually assets used within GNOME, GDM, and other desktop environments.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#plymouthcharge","title":"plymouth/charge","text":"

Typically unchanged and is for the plymouth loading screen

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#svg","title":"svg","text":"

SVG format of logo assets as fedora_logo (color) and fedora_logo_darkbackground (white)

color file dictates background color if applicable

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#testpage","title":"testpage","text":"

index.html for httpd/nginx/etc

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#backgroundswallpapers","title":"Backgrounds/Wallpapers","text":""},{"location":"documentation/guidelines/rocky_logos_guidelines/#structure","title":"Structure","text":"

Wallpapers appear in PNG format with a backing XML file to list out all available resolutions if applicable, as well as defaults.

A defaults file looks at every other XML that is a default background provided by the backgrounds package and default options if applicable.

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE wallpapers SYSTEM \"gnome-wp-list.dtd\">\n<wallpapers>\n    <wallpaper deleted=\"false\">\n        <name>Rocky Linux 9 Default Background - Placeholder Mesh</name>\n        <filename>/usr/share/backgrounds/rocky-default-1-mesh.xml</filename>\n        <options>zoom</options>\n        <author>Louis Abel</author>\n        <email>label@rockylinux.org</email>\n        <license>CC-BY-SA 4.0</license>\n    </wallpaper>\n    <wallpaper deleted=\"false\">\n        <name>Rocky Linux 9 Default Background - Placeholder Target</name>\n        <filename>/usr/share/backgrounds/rocky-default-1-target.xml</filename>\n        <options>zoom</options>\n        <author>Louis Abel</author>\n        <email>label@rockylinux.org</email>\n        <license>CC-BY-SA 4.0</license>\n    </wallpaper>\n</wallpapers>\n

The wallpaper itself will list every applicable variant of that background if applicable.

<background>\n  <starttime>\n    <year>2021</year>\n    <month>10</month>\n    <day>29</day>\n    <hour>19</hour>\n    <minute>21</minute>\n    <second>19</second>\n  </starttime>\n\n<static>\n<duration>10000000000.0</duration>\n<file>\n  <!-- Wide 16:9 -->\n  <size width=\"1920\" height=\"1080\">/usr/share/backgrounds/rocky-default-1-mesh-16-9.png</size>\n  <!-- Wide 16:10 -->\n  <size width=\"1920\" height=\"1200\">/usr/share/backgrounds/rocky-default-1-mesh-16-10.png</size>\n  <!-- Standard 4:3 -->\n  <size width=\"2048\" height=\"1536\">/usr/share/backgrounds/rocky-default-1-mesh-4-3.png</size>\n  <!-- Normalish 5:4 -->\n  <size width=\"1280\" height=\"1024\">/usr/share/backgrounds/rocky-default-1-mesh-5-4.png</size>\n</file>\n</static>\n</background>\n

Day/Night Wallpapers have a similar configuration.

<background>\n  <starttime>\n    <year>2022</year>\n    <month>01</month>\n    <day>01</day>\n    <hour>8</hour>\n    <minute>00</minute>\n    <second>00</second>\n  </starttime>\n<!-- This animation will start at 8 AM. -->\n\n<!-- We start with day at 8 AM. It will remain up for 10 hours. -->\n<static>\n<duration>36000.0</duration>\n<file>/usr/share/backgrounds/rocky-default-1-mesh-day.png</file>\n</static>\n\n<!-- Day ended and starts to transition to night at 6 PM. The transition lasts for 2 hours, ending at 8 PM. -->\n<transition type=\"overlay\">\n<duration>7200.0</duration>\n<from>/usr/share/backgrounds/rocky-default-1-mesh-day.png</from>\n<to>/usr/share/backgrounds/rocky-default-1-mesh-night.png</to>\n</transition>\n\n<!-- It's 8 PM, we're showing the night till 6 AM. -->\n<static>\n<duration>36000.0</duration>\n<file>/usr/share/backgrounds/rocky-default-1-mesh-night.png</file>\n</static>\n\n<!-- It's 6 AM, and we're starting to transition to day. Transition completes at 8 AM. -->\n<transition type=\"overlay\">\n<duration>7200.0</duration>\n<from>/usr/share/backgrounds/rocky-default-1-mesh-night.png</from>\n<to>/usr/share/backgrounds/rocky-default-1-mesh-day.png</to>\n</transition>\n\n</background>\n
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#guidelines","title":"Guidelines","text":"

This section goes over the general guidelines for the main backgrounds included in the distribution.

Note: It is highly recommended and encouraged that a submission should be the highest resolution as noted below. See the note on minimum resolutions.

  • General Theme: Each Rocky release has a codename, and thus is the general theme. Examples.
    • Rocky 8: Green Obsidian - Submissions only to extras
    • Rocky 9: Blue Onyx - This should be generally a blue theme/color scheme. Submissions only to extras.
    • Rocky 10: Red Quartz - This should be generally a red-like theme/color scheme
  • Required Resolution(s) for Normal Submissions:

    • Resolution must not exceed nor fall below: 3072x3072
    • Example resolutions: 4800x3600, 4096x3072, 3440x3440
  • Allowed:

    • Anything related to nature, mountains, rocks, and the like (generally fitting into the \"rocky\" idea)
    • Anything related to the codename (eg. Blue Onyx)
    • Anything minimalist/abstract is allowed
    • References to the release number (like 9, and so on) are allowed
    • Complementary colors should be allowed in the image within reason
    • Contrasting colors should be allowed in the image within reason
    • Photography + Manipulation should be allowed within reason
    • Highly Encouraged: Day and Night versions of wallpapers
  • Discouraged:

    • Avoid using the Rocky logo, unless it fits with an abstract/minimalist idea for the background
      • Plain backdrops with the rocky logo are not permitted
  • Prohibited:

    • Any AI generated artwork
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#minimum-resolutions","title":"Minimum Resolutions","text":"

For general submissions, we request a high resolution to make things simpler, that way the user should be able to use a wallpaper without having to choose \"the right one\" for their monitor size. However, for the case case of extra backgrounds, this requirement is more relaxed. If a submitter wishes not to use the highest resolution but opts to make multiple resolutions instead, they should follow the below list:

  • Minimum Required Resolutions:
    • 16:9 (1920x1080)
    • 16:10 (1920x1200)
    • 5:4 (2048x1536)
    • 4:3 (1280x1024)
  • Additional (encouraged) allowed resolutions:
    • 3440x1440
    • 2560x1600
    • 2560x1440
    • 2560x1080
    • 1800x1440
    • Portrait mode versions of the above are optional

The placeholders in this commit shows an example of using the minimum resolutions.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#extras-package","title":"Extras Package","text":"

If a wallpaper does not make it to the main package (whether it doesn't meet guidelines or is simply just Rocky inspired), they should be able to be submitted for addition into the rocky-backgrounds-extras package.

"},{"location":"documentation/patching/","title":"Rocky Linux Package Patching","text":"

In Rocky Linux, some packages are patched either for build issues or removing Red Hat references. Some packages are completely self-managed by Release Engineering. Some packages have Red Hat or CentOS assets that cannot be shipped (for obvious reasons). Performing these types of changes are necessary for Rocky Linux to exist.

"},{"location":"documentation/patching/#what-is-debranding","title":"What is Debranding?","text":"

Debranding is for the case of removing Red Hat or CentOS assets from a package and either A) Using Rocky Linux or RESF assets or B) Forcing the use of generic assets. The former is the most common and the latter happens once in a blue moon. A debrand can come in the following forms:

  • Changing \"Red Hat\" to \"Rocky\"
  • Changing \"RHEL\" or \"Red Hat Enterprise Linux\" to \"Rocky Linux\"
  • Changing some \"Red Hat\" or \"RHEL\" wording to be agnostic, such as \"Enterprise Linux\"
  • Changing bug tracker URL's to our project's specific bug tracker site
  • Replacing appropriate assets (e.g. the logos packages)

The most obvious example would be httpd or nginx. While these rely on rocky-logos-httpd for specific pages, some assets are also replaced. This is particularly obvious with the test pages with distribution specific information.

"},{"location":"documentation/patching/#how-are-packages-debranded","title":"How are packages \"debranded\"?","text":"

Debrands are done using the srpmproc utility. The utility source code is here.

"},{"location":"documentation/patching/#what-are-self-managed-packages","title":"What are \"self-managed\" packages?","text":"

Rocky Linux may have packages that are self-managed. Self-managed packages are packages that Red Hat may ship themselves, but it's simply easier for Release Engineering to manage them, thus reducing srpmproc headaches.

"},{"location":"documentation/patching/#what-are-build-issues","title":"What are \"build issues\"?","text":"

Some packages have to be patched, either a source code patch or a spec file change, to address a build issue. A build issue can come in multiple forms:

  • Failing tests that should not fail in normal circumstances
  • OOM issues for heavy packages
  • Build issues where a package cannot be built properly in a container

These do not happen often. These types of changes do not affect the compatibility of the packages to our upstream.

"},{"location":"documentation/patching/#what-type-of-other-changes-can-be-done","title":"What type of other changes can be done?","text":"

There are very rare cases where Red Hat completely disables a package from being built or even being provided. In these very rare cases, if there is user demand, we may ensure these packages are built or provided in some way. A very common example is openldap-servers, which is no longer built by default. There are a couple of packages that for some reason also rely on openldap-server's existence. As a result, we enable this and provide it in our plus repository.

"},{"location":"documentation/patching/#can-i-get-a-list-of-changes","title":"Can I get a list of changes?","text":"

Of course, head to the changes page for a list of known and documented changes that we make to our packages.

"},{"location":"documentation/patching/changes/","title":"Rocky Linux Package Changes","text":"

In Rocky Linux, some packages can be patched or even self-managed. Below is a table of each package that we may modify to address branding or self-management. Click the appropriate Rocky Linux version that is of interest to you.

Rocky Linux 8Rocky Linux 9Rocky Linux 10 Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks abrt Patch Add Rocky Support anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cockpit-composer Patch, Branding Replace RHEL with Enterprise Linux cloud-init Patch Ensure the managed user is cloud-user like upstream crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL dotnet Branding Add Rocky Support dotnet3.0 Branding Add Rocky Support firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-boxes Patch Add Rocky Support gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libguestfs Patch Add Rocky Support libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported oscap-anaconda-addon Branding Replace \"Red Hat\" with \"Rocky\" PackageKit Patch Change support URL's to Rocky Linux wiki pcs Branding Replace \"Red Hat\" logo plymouth Branding Replace \"Red Hat Enterprise Linux\" python2 Patch Add Rocky Support python3 Patch Add Rocky Support python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd-efi Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot and Branding kernel-rt Patch, Branding Secure Boot and Branding rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is built and available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default"},{"location":"documentation/patching/changes/#terminology","title":"Terminology","text":"Term Definition Self-managed A package that Release Engineering manages rather than using srpmproc to patch Patch A patch done either in the source code or the spec file Branding A branding patch done to ensure Rocky Linux assets are in use rather than upstream"},{"location":"documentation/patching/debrand_info/","title":"Debranding Information","text":"

This page goes over the methodology and some packages that require changes to their material for acceptance in Rocky Linux. Usually this means there is some text or images in the package that reference upstream trademarks, and these must be swapped out before we can distribute them.

CentOS had a wiki page at one point where it was documented, but it wasn't always up to date. For example, the package nginx did not appear on their list, and still had RHEL branding in the CentOS repos. As a result, this forced us to do a deeper investigation into what needs to be changed or altered.

There are a few ways we've determined some of the changes:

  • Packages don't build because ID is not centos, rhel, or fedora
  • Packages have ?centos tags in the SPEC file to differentiate from Fedora or RHEL
  • Some packages in git.centos.org have an automatic debranding message - This won't be as helpful for 9 and beyond
  • RHEL assets were appearing in the installed package(s)

When we need to make changes, it can possibly be one or more of these things:

  • URL's should change from Red Hat to a Rocky page (if applicable)
  • URL's that are being patched to be Red Hat should be removed (systemd in 8 is an example of this)
  • ?centos is changed to ?rocky, but this isn't always consistent or sufficient
  • Assets need to be changed

    • Exceptions come when there is a file being requested from the logos package - We generally have symlinks to deal with this
  • Some patches must be made to the source code or spec file

  • Packages are built against an \"override\" release package that uses ID=\"rhel\" in /etc/os-release to force a build to pose as RHEL (older versions of dotnet and chrony are an example of this)

Current patches (for staging) are here.

"},{"location":"documentation/patching/debrand_info/#packages-that-need-debranding-changes","title":"Packages that need debranding changes:","text":"

There is a metadata file that helps track this information for us. It can be located here and is separated by section and branch.

In essence, the file goes over these sections:

  • build_patch -> Packages that may have needed patches to build properly in our environment
  • dnt or Do Not Touch -> These should not be modified or changed
  • custom -> Custom packages not provided by upstream but can be useful in obsoleting packages or providing some functionality
  • plus -> Packages that are modified versions of what's in the base or built by normal means but not shipped by Red Hat
  • previous -> Packages that may have been patched before for debranding or building - They are left as a reference
  • provides -> Common provides for release, logos, and other rocky/system specific packages
  • override_required -> Requires an \"override\" release package to build properly
  • spec_change_only -> Requires only spec changes to remove functionality that is RHEL specific
  • debrand -> Packages that are changed/patched to either remove Red Hat references, replace them, or add Rocky Linux as a supported distribution

    • Some of these packages will always need to be changed, on a minor or major release schedule.
    • Some are potentially upstreamed so then they are no longer patched by us (sos is an example)
    • Some packages may still need modification, even if upstreamed (anaconda is an example)
"},{"location":"documentation/patching/debrand_info/#packages-that-need-to-become-other-packages","title":"Packages that need to become other packages:","text":"

There is a metadata file that tracks this for us. It can be located here. The section in particular is called provides.

This is for example, redhat-logos or system-logos is provided or \"becomes\" rocky-logos.

"},{"location":"documentation/patching/debrand_info/#packages-that-exist-in-rhel-but-do-not-exist-in-most-derivatives","title":"Packages that Exist in RHEL, but do not exist in most derivatives","text":"

For sake of complete information, here is a list of packages that are in RHEL, but may not exist in derivatives. We do not need to worry about these packages:

  • insights-client
  • Red_Hat_Enterprise_Linux-Release_Notes-8-*
  • redhat-access-gui
  • redhat-bookmarks
  • rhc
  • rhc-worker-playbook
  • subscription-manager-migration
  • subscription-manager-migration-data
"},{"location":"documentation/patching/patching/","title":"Rocky Linux Patching Guide","text":"

Note

This page is kept here as a historical reference and may be out of date.

This explains how to debrand/patch a package for the Rocky Linux distribution.

"},{"location":"documentation/patching/patching/#general-instructions","title":"General Instructions","text":"
  • First, identify the files in the package that need to be changed. They could be text files, image files, or others. You can identify the file(s) by digging into git.centos.org/rpms/PACKAGE/
  • Develop replacements for these files, but with Rocky branding placed instead. Diff/patch files may be needed as well for certain types of text, depends on the content being replaced.
  • Replacement files go under https://git.rockylinux.org/patch/PACKAGE/ROCKY/_supporting/
  • Config file (specifying how to apply the patches) goes in https://git.rockylinux.org/patch/PACKAGE/ROCKY/CFG/*.cfg
  • Note: Use spaces, not tabs.
  • When srpmproc goes to import the package to Rocky, it will see the work done in https://git.rockylinux.org/patch/PACKAGE , and apply the stored patches by reading the config file(s) under ROCKY/CFG/*.cfg
"},{"location":"documentation/patching/patching/#the-patch-config-language","title":"The Patch Config Language","text":"

Patching uses simple proto3 config files. The general format is:

Action {\n    file: \"OriginalFile\"\n    with_file: \"ROCKY/_supporting/RockyReplaceFile\"\n}\n

A simple example to replace a file:

replace {\n    file: \"redhatlogo.png\"\n    with_file: \"ROCKY/_supporting/rockylogo.png\"\n}\n

The file \"redhatlogo.png\" would be located in under SOURCES/ in the project's Git repository (and SRPM).

"},{"location":"documentation/patching/patching/#patch-configuration-options","title":"Patch configuration options","text":"
  • add: Adds a file to the sources using the file or lookaside directive
  • delete: Deletes a file from the sources using the file directive
  • replace: Replaces a file from the sources using the file and with_file directives
  • patch: Performs a patch based on the diff provided in the file directive (generated using git diff)
  • spec_change: Allows for spec files to be modified
  • search_and_replace: Performs a search and replace on a given text for the spec file using the any/starts_with/ends_with (true|false), find (string to find), replace (replacement string), and n (integar, -1 for any) directives.
  • file: A file can be added to the spec file using the name directive to define the file name, the type directive (such as patch) and then an add option that is true or false
    • When patch is used, the following options are available:
    • add_to_prep (true|false)
    • n_path: N can be specified to add %patchX -pN lines into %prep assuming the rpm does not use %autosetup
  • append: Appends to a given field, such as Release with a value directive
  • changelog: Modifies the change log using author_name, author_email, and message directives

Patch configuration structure:

.\n\u2514\u2500\u2500 ROCKY\n    \u251c\u2500\u2500 CFG\n    \u2514\u2500\u2500 _supporting\n
"},{"location":"documentation/patching/patching/#case-study-nginx","title":"Case Study: Nginx","text":"

(note: all example data here is currently in the staging/ area of Rocky Linux Git. We will update it when the projects are moved to the production area)

Let's go over an example debrand, featuring the Nginx web server package.

The source repository is located here: https://git.centos.org/rpms/nginx

If we browse one of the c8-* branches, we see under SOURCES/ that there is definitely some content that needs to be debranded:

404.html\n50x.html\nindex.html\npoweredby.png  (binary file in dist-git, referred to in .nginx.metadata)\n

These files all refer to Red Hat inc., and must be replaced before they make it to Rocky Linux.

1: Come up with the patches: Each of these files has a Rocky Linux counterpart, and they must be created. Some of this should be done by the Design Team, especially logo work (#Design on chat)

2: Commit patches to the matching patch/PROJECT Git repository : For example, Nginx patches are located here: https://git.rockylinux.org/staging/patch/nginx (staging/ prefix is currently used until our production repos are set up)

3: Develop a matching config file: Our example Nginx has this here: https://git.rockylinux.org/staging/patch/nginx/-/blob/main/ROCKY/CFG/pages.cfg

It looks like this:

replace {\n    file: \"index.html\"\n    with_file: \"ROCKY/_supporting/index.html\"\n}\n\nreplace {\n    file: \"404.html\"\n    with_file: \"ROCKY/_supporting/404.html\"\n}\n\nreplace {\n    file: \"50x.html\"\n    with_file: \"ROCKY/_supporting/50x.html\"\n}\n\nreplace {\n    file: \"poweredby.png\"\n    with_file: \"ROCKY/_supporting/poweredby.png\"\n}\n

4: Test the import: Now, when the upstream is imported, we can check the main Rocky nginx repository and ensure our updates were successful: https://git.rockylinux.org/staging/rpms/nginx/ (again, staging/ group is used only for now)

5: You're Done! Great! Now do the next one... ;-)

"},{"location":"documentation/patching/patching/#more-debrand-config-language","title":"More Debrand Config Language","text":"

The Nginx example showed just the replace directive, but there are several more available. They are add, patch, and delete.

Here they are, with examples:

# Add a file to the project (file is added to SOURCES/ folder )\nadd {\n    file: \"ROCKY/_supporting/add_me.txt\"\n}\n\n# Apply a .patch file (generated using the Linux \"patch\" utility)\npatch {\n    file: \"ROCKY/_supporting/002-test-html.patch\"\n}\n\n# Delete a file from the source project\ndelete {\n    file: \"SOURCES/dontneed.txt\"\n}\n

And the .patch file example looks like this:

diff --git a/SOURCES/test.html b/SOURCES/test.html\nindex 8d91ffd..3f76c3b 100644\n--- a/SOURCES/test.html\n+++ b/SOURCES/test.html\n@@ -1,6 +1,6 @@\n <!DOCTYPE html>\n <html>\n     <body>\n-        <h1>Replace me</h1>\n+        <h1>Replace I did!</h1>\n     </body>\n </html>\n

It also supports spec file changes, as it may be necessary. For example, from the anaconda debrand patch repo.

add {\n    file: \"ROCKY/_supporting/0002-Rocky-disable-cdn-radiobutton.patch\"\n}\n\nspec_change {\n    # Adds a Patch line with the file name as listed above\n    file {\n        name: \"0002-Rocky-disable-cdn-radiobutton.patch\"\n        type: Patch\n        add: true\n    }\n\n    # Appends to the end of a field's line, in this case the Release field gets .rocky\n    append {\n        field: \"Release\"\n        value: \".rocky\"\n    }\n\n    # Adds to the change log properly\n    changelog {\n        author_name: \"Mustafa Gezen\"\n        author_email: \"mustafa@rockylinux.org\"\n        message: \"Disable CDN and add .rocky to Release\"\n    }\n}\n

At the end, the spec file should be changed.

Summary:              Graphical system installer\nName:                 anaconda\nVersion:              33.16.3.26\n                      # Our .rocky appears here\nRelease:              2%{?dist}.rocky\n\n-- snip --\n\nPatch1:               0001-network-do-not-crash-on-infiniband-devices-activated.patch\n                      # Look, our patch was added!\n                      # Luckily this RPM uses %autosetup, so no %patch lines\nPatch2:               0002-Rocky-disable-cdn-radiobutton.patch\n\n-- snip --\n\n# And below the added changelog\n%changelog\n* Thu Feb 25 2021 Mustafa Gezen <mustafa@rockylinux.org> - 33.16.3.26-2\n- Disable CDN and add .rocky to Release\n\n* Thu Oct 22 2020 Radek Vykydal <rvykydal@redhat.com> - 33.16.3.26-2\n- network: do not crash on infiniband devices activated in initramfs\n  (rvykydal)\n  Resolves: rhbz#1890261\n
"},{"location":"documentation/references/","title":"References","text":"

Use this section to locate reference configuration items for the toolkit.

"},{"location":"documentation/references/empanadas_common/","title":"Empanadas common.py Configuration","text":"

The common.py configuration contains dictionaries and classes that dictate most of the functionality of empanadas.

"},{"location":"documentation/references/empanadas_common/#config-items","title":"Config Items","text":"

type: Dictionary

"},{"location":"documentation/references/empanadas_common/#configrlmacro","title":"config.rlmacro","text":"

type: String

required: True

description: Empanadas expects to run on an EL system. This is part of the general check up. It should not be hardcoded and use the rpm python module.

"},{"location":"documentation/references/empanadas_common/#configdist","title":"config.dist","text":"

type: String

required: False

description: Was the original tag placed in mock configs. This combines el with the rpm python module expansion. This is no longer required. The option is still available for future use.

"},{"location":"documentation/references/empanadas_common/#configarch","title":"config.arch","text":"

type: String

required: True

description: The architecture of the current running system. This is checked against the supported architectures in general release configurations. This should not be hardcoded.

"},{"location":"documentation/references/empanadas_common/#configdate_stamp","title":"config.date_stamp","text":"

type: String

required: True

description: Date time stamp in the form of YYYYMMDD.HHMMSS. This should not be hardcoded.

"},{"location":"documentation/references/empanadas_common/#configcompose_root","title":"config.compose_root","text":"

type: String

required: True

description: Root path of composes on the system running empanadas.

"},{"location":"documentation/references/empanadas_common/#configstaging_root","title":"config.staging_root","text":"

type: String

required: False

description: For future use. Root path of staging repository location where content will be synced to.

"},{"location":"documentation/references/empanadas_common/#configproduction_root","title":"config.production_root","text":"

type: String

required: False

description: For future use. Root path of production repository location where content will be synced to from staging.

"},{"location":"documentation/references/empanadas_common/#configcategory_stub","title":"config.category_stub","text":"

type: String

required: True

description: For future use. Stub path that is appended to staging_root and production_root.

example: mirror/pub/rocky

"},{"location":"documentation/references/empanadas_common/#configsig_category_stub","title":"config.sig_category_stub","text":"

type: String

required: True

description: For future use. Stub path that is appended to staging_root and production_root for SIG content.

example: mirror/pub/sig

"},{"location":"documentation/references/empanadas_common/#configrepo_base_url","title":"config.repo_base_url","text":"

type: String

required: True

description: URL to the base url's where the repositories live. This is typically to a peridot instance. This is supplemented by the configuration project_id parameter.

Note that this does not have to be a peridot instance. The combination of this value and project_id can be sufficient enough for empanadas to perform its work.

"},{"location":"documentation/references/empanadas_common/#configmock_work_root","title":"config.mock_work_root","text":"

type: String

required: True

description: Hardcoded path to where ISO work is performed within a mock chroot. This is the default path created by mock and it is recommended not to change this.

example: /builddir

"},{"location":"documentation/references/empanadas_common/#configcontainer","title":"config.container","text":"

type: String

required: True

description: This is the container used to perform all operations in podman.

example: centos:stream9

"},{"location":"documentation/references/empanadas_common/#configdistname","title":"config.distname","text":"

type: String

required: True

description: Name of the distribution you are building or building for.

example: Rocky Linux

"},{"location":"documentation/references/empanadas_common/#configshortname","title":"config.shortname","text":"

type: String

required: True

description: Short name of the distribution you are building or building for.

example: Rocky

"},{"location":"documentation/references/empanadas_common/#configtranslators","title":"config.translators","text":"

type: Dictionary

required: True

description: Translates Linux architectures to golang architectures. Reserved for future use.

"},{"location":"documentation/references/empanadas_common/#configaws_region","title":"config.aws_region","text":"

type: String

required: False

description: Region you are working in with AWS or onprem cloud that supports this variable.

example: us-east-2

"},{"location":"documentation/references/empanadas_common/#configbucket","title":"config.bucket","text":"

type: String

required: False

description: Name of the S3-compatible bucket that is used to pull images from. Requires aws_region.

"},{"location":"documentation/references/empanadas_common/#configbucket_url","title":"config.bucket_url","text":"

type: String

required: False

description: URL of the S3-compatible bucket that is used to pull images from.

"},{"location":"documentation/references/empanadas_common/#allowed_type_variants-items","title":"allowed_type_variants items","text":"

type: Dictionary

description: Key value pairs of cloud or image variants. The value is either None or a list type.

"},{"location":"documentation/references/empanadas_common/#reference-example","title":"Reference Example","text":"
config = {\n    \"rlmacro\": rpm.expandMacro('%rhel'),\n    \"dist\": 'el' + rpm.expandMacro('%rhel'),\n    \"arch\": platform.machine(),\n    \"date_stamp\": time.strftime(\"%Y%m%d.%H%M%S\", time.localtime()),\n    \"compose_root\": \"/mnt/compose\",\n    \"staging_root\": \"/mnt/repos-staging\",\n    \"production_root\": \"/mnt/repos-production\",\n    \"category_stub\": \"mirror/pub/rocky\",\n    \"sig_category_stub\": \"mirror/pub/sig\",\n    \"repo_base_url\": \"https://yumrepofs.build.resf.org/v1/projects\",\n    \"mock_work_root\": \"/builddir\",\n    \"container\": \"centos:stream9\",\n    \"distname\": \"Rocky Linux\",\n    \"shortname\": \"Rocky\",\n    \"translators\": {\n        \"x86_64\": \"amd64\",\n        \"aarch64\": \"arm64\",\n        \"ppc64le\": \"ppc64le\",\n        \"s390x\": \"s390x\",\n        \"i686\": \"386\"\n    },\n    \"aws_region\": \"us-east-2\",\n    \"bucket\": \"resf-empanadas\",\n    \"bucket_url\": \"https://resf-empanadas.s3.us-east-2.amazonaws.com\"\n}\n\nALLOWED_TYPE_VARIANTS = {\n        \"Azure\": None,\n        \"Container\": [\"Base\", \"Minimal\", \"UBI\"],\n        \"EC2\": None,\n        \"GenericCloud\": None,\n        \"Vagrant\": [\"Libvirt\", \"Vbox\"],\n        \"OCP\": None\n\n}\n
"},{"location":"documentation/references/empanadas_config/","title":"Empanadas config yaml Configuration","text":"

Each file in empanads/config/ is a yaml file that contains configuration items for the distribution release version. The configuration can heavily dictate the functionality and what features are directly supported by empanadas when ran.

See the items below to see which options are mandatory and optional.

"},{"location":"documentation/references/empanadas_config/#config-items","title":"Config Items","text":""},{"location":"documentation/references/empanadas_config/#top-level","title":"Top Level","text":"

The Top Level is the name of the profile and starts the YAML dictionary for the release. It is alphanumeric and accepts punctuation within reason. Common examples:

  • 9
  • 9-beta
  • 8-lookahead
"},{"location":"documentation/references/empanadas_config/#fullname","title":"fullname","text":"

type: String

required: True

description: Needed for treeinfo and discinfo generation.

"},{"location":"documentation/references/empanadas_config/#revision","title":"revision","text":"

type: String

required: True

description: Full version of a release

"},{"location":"documentation/references/empanadas_config/#rclvl","title":"rclvl","text":"

type: String

required: True

description: Release Candidate or Beta descriptor. Sets names and versions with this descriptor if enabled.

"},{"location":"documentation/references/empanadas_config/#major","title":"major","text":"

type: String

required: True

description: Major version of a release

"},{"location":"documentation/references/empanadas_config/#minor","title":"minor","text":"

type: String

required: True

description: Minor version of a release

"},{"location":"documentation/references/empanadas_config/#profile","title":"profile","text":"

type: String

required: True

description: Matches the top level of the release. This should not differ from the top level assignment.

"},{"location":"documentation/references/empanadas_config/#disttag","title":"disttag","text":"

type: String

required: True

description: Sets the dist tag for mock configs.

"},{"location":"documentation/references/empanadas_config/#bugurl","title":"bugurl","text":"

type: String

required: True

description: A URL to the bug tracker for this release or distribution.

"},{"location":"documentation/references/empanadas_config/#checksum","title":"checksum","text":"

type: String

required: True

description: Checksum type. Used when generating checksum information for images.

"},{"location":"documentation/references/empanadas_config/#fedora_major","title":"fedora_major","text":"

type: String

required: False

description: For future use with icicle.

"},{"location":"documentation/references/empanadas_config/#gpg_key","title":"gpg_key","text":"

type: List

required: False

description: List of GPG keys for a given repository

"},{"location":"documentation/references/empanadas_config/#repo_gpg_key","title":"repo_gpg_key","text":"

type: List

required: False

description: List of GPG keys for a given repository. Use this if the signing key for the repo is different from packages.

"},{"location":"documentation/references/empanadas_config/#allowed_arches","title":"allowed_arches","text":"

type: list

required: True

description: List of supported architectures for this release.

"},{"location":"documentation/references/empanadas_config/#provide_multilib","title":"provide_multilib","text":"

type: boolean

required: True

description: Sets if architecture x86_64 will be multilib. It is recommended that this is set to True.

"},{"location":"documentation/references/empanadas_config/#project_id","title":"project_id","text":"

type: String

required: True

description: Appended to the base repo URL in common.py. For peridot, it is the project id that is generated for the project you are pulling from. It can be set to anything else if need be for non-peridot use.

"},{"location":"documentation/references/empanadas_config/#repo_symlinks","title":"repo_symlinks","text":"

type: dict

required: False

description: For future use. Sets symlinks to repositories for backwards compatibility. Key value pairs only.

"},{"location":"documentation/references/empanadas_config/#renames","title":"renames","text":"

type: dict

required: False

description: Renames a repository to the value set. For example, renaming all to devel. Set to {} if no renames are goign to occur.

"},{"location":"documentation/references/empanadas_config/#all_repos","title":"all_repos","text":"

type: list

required: True

description: List of repositories that will be synced/managed by empanadas.

"},{"location":"documentation/references/empanadas_config/#structure","title":"structure","text":"

type: dict

required: True

description: Key value pairs of packages and repodata. These are appended appropriately during syncing and ISO actions. Setting these are mandatory.

"},{"location":"documentation/references/empanadas_config/#iso_map","title":"iso_map","text":"

type: dictionary

required: True if building ISO's and operating with lorax.

description: Controls how lorax and extra ISO's are built.

If are you not building images, set to {}

"},{"location":"documentation/references/empanadas_config/#xorrisofs","title":"xorrisofs","text":"

type: boolean

required: True

description: Dictates of xorrisofs is used to build images. Setting to false uses genisoimage. It is recommended that xorrisofs is used.

"},{"location":"documentation/references/empanadas_config/#iso_level","title":"iso_level","text":"

type: boolean

required: True

description: Set to false if you are using xorrisofs. Can be set to true when using genisoimage.

"},{"location":"documentation/references/empanadas_config/#images","title":"images","text":"

type: dict

required: True

description: Dictates the ISO images that will be made or the treeinfo that will be generated.

Note: The primary repository (for example, BaseOS) will need to be listed to ensure the treeinfo data is correctly generated. disc should be set to False and isoskip should be set to True. See the example section for an example.

"},{"location":"documentation/references/empanadas_config/#namedisc","title":"name.disc","text":"

type: boolean

required: True

description: This tells the iso builder if this will be a generated ISO.

"},{"location":"documentation/references/empanadas_config/#nameisoskip","title":"name.isoskip","text":"

type: boolean

required: False

description: This tells the iso builder if this will be skipped, even if disc is set to True. Default is False.

"},{"location":"documentation/references/empanadas_config/#namevariant","title":"name.variant","text":"

type: string

required: True

description: Names the primary variant repository for the image. This is set in .treeinfo.

"},{"location":"documentation/references/empanadas_config/#namerepos","title":"name.repos","text":"

type: list

required: True

description: Names of the repositories included in the image. This is added to .treeinfo.

"},{"location":"documentation/references/empanadas_config/#namevolname","title":"name.volname","text":"

type: string

required: True

required value: dvd

description: This is required if building more than the DVD image. By default, the the name dvd is harcoded in the buildImage template.

"},{"location":"documentation/references/empanadas_config/#lorax","title":"lorax","text":"

type: dict

required: True if building lorax images.

description: Sets up lorax images and which repositories to use when building lorax images.

"},{"location":"documentation/references/empanadas_config/#loraxrepos","title":"lorax.repos","text":"

type: list

required: True

description: List of repos that are used to pull packages to build the lorax images.

"},{"location":"documentation/references/empanadas_config/#loraxvariant","title":"lorax.variant","text":"

type: string

required: True

description: Base repository for the release

"},{"location":"documentation/references/empanadas_config/#loraxlorax_removes","title":"lorax.lorax_removes","text":"

type: list

required: False

description: Excludes packages that are not needed when lorax is running.

"},{"location":"documentation/references/empanadas_config/#loraxrequired_pkgs","title":"lorax.required_pkgs","text":"

type: list

required: True

description: Required list of installed packages needed to build lorax images.

"},{"location":"documentation/references/empanadas_config/#livemap","title":"livemap","text":"

type: dict

required: False

description: Dictates what live images are built and how they are built.

"},{"location":"documentation/references/empanadas_config/#livemapgit_repo","title":"livemap.git_repo","text":"

type: string

required: True

description: The git repository URL where the kickstarts live

"},{"location":"documentation/references/empanadas_config/#livemapbranch","title":"livemap.branch","text":"

type: string

required: True

description: The branch being used for the kickstarts

"},{"location":"documentation/references/empanadas_config/#livemapksentry","title":"livemap.ksentry","text":"

type: dict

required: True

description: Key value pairs of the live images being created. Key being the name of the live image, value being the kickstart name/path.

"},{"location":"documentation/references/empanadas_config/#livemapallowed_arches","title":"livemap.allowed_arches","text":"

type: list

required: True

description: List of allowed architectures that will build for the live images.

"},{"location":"documentation/references/empanadas_config/#livemaprequired_pkgs","title":"livemap.required_pkgs","text":"

type: list

required: True

description: Required list of packages needed to build the live images.

"},{"location":"documentation/references/empanadas_config/#cloudimages","title":"cloudimages","text":"

type: dict

required: False

description: Cloud related settings.

Set to {} if not needed.

"},{"location":"documentation/references/empanadas_config/#cloudimagesimages","title":"cloudimages.images","text":"

type: dict

required: True

description: Cloud images that will be generated and in a bucket to be pulled, and their format.

"},{"location":"documentation/references/empanadas_config/#cloudimagesimagesname","title":"cloudimages.images.name","text":"

type: dict

required: True

description: Name of the cloud image being pulled.

Accepted key value options:

  • format, which is raw, qcow2, vhd, tar.xz
  • variants, which is a list
  • primary_variant, which symlinks to the \"primary\" variant in the variant list
"},{"location":"documentation/references/empanadas_config/#repoclosure_map","title":"repoclosure_map","text":"

type: dict

required: True

description: Repoclosure settings. These settings are absolutely required when doing full syncs and need to check repositories for consistency.

"},{"location":"documentation/references/empanadas_config/#repoclosure_maparches","title":"repoclosure_map.arches","text":"

type: dict

required: True

description: For each architecture (key), dnf switches/settings that dictate how repoclosure will check for consistency (value, string).

example: x86_64: '--forcearch=x86_64 --arch=x86_64 --arch=athlon --arch=i686 --arch=i586 --arch=i486 --arch=i386 --arch=noarch'

"},{"location":"documentation/references/empanadas_config/#repoclosure_maprepos","title":"repoclosure_map.repos","text":"

type: dict

required: True

description: For each repository that is pulled for a given release(key), repositories that will be included in the repoclosure check. A repository that only checks against itself must have a value of [].

"},{"location":"documentation/references/empanadas_config/#extra_files","title":"extra_files","text":"

type: dict

required: True

description: Extra files settings and where they come from. Git repositories are the only supported method.

"},{"location":"documentation/references/empanadas_config/#extra_filesgit_repo","title":"extra_files.git_repo","text":"

type: string

required: True

description: URL to the git repository with the extra files.

"},{"location":"documentation/references/empanadas_config/#extra_filesgit_raw_path","title":"extra_files.git_raw_path","text":"

type: string

required: True

description: URL to the git repository with the extra files, but the \"raw\" url form.

example: git_raw_path: 'https://git.rockylinux.org/staging/src/rocky-release/-/raw/r9/'

"},{"location":"documentation/references/empanadas_config/#extra_filesbranch","title":"extra_files.branch","text":"

type: string

required: True

description: Branch where the extra files are pulled from.

"},{"location":"documentation/references/empanadas_config/#extra_filesgpg","title":"extra_files.gpg","text":"

type: dict

required: True

description: For each gpg key type (key), the relative path to the key in the git repository (value).

These keys help set up the repository configuration when doing syncs.

By default, the RepoSync class sets stable as the gpgkey that is used.

"},{"location":"documentation/references/empanadas_config/#extra_fileslist","title":"extra_files.list","text":"

type: list

required: True

description: List of files from the git repository that will be used as \"extra\" files and placed in the repositories and available to mirrors and will appear on ISO images if applicable.

"},{"location":"documentation/references/empanadas_config/#reference-example","title":"Reference Example","text":"
---\n'9':\n  fullname: 'Rocky Linux 9.0'\n  revision: '9.0'\n  rclvl: 'RC2'\n  major: '9'\n  minor: '0'\n  profile: '9'\n  disttag: 'el9'\n  bugurl: 'https://bugs.rockylinux.org'\n  checksum: 'sha256'\n  fedora_major: '20'\n  allowed_arches:\n    - x86_64\n    - aarch64\n    - ppc64le\n    - s390x\n  provide_multilib: True\n  project_id: '55b17281-bc54-4929-8aca-a8a11d628738'\n  repo_symlinks:\n    NFV: 'nfv'\n  renames:\n    all: 'devel'\n  all_repos:\n    - 'all'\n    - 'BaseOS'\n    - 'AppStream'\n    - 'CRB'\n    - 'HighAvailability'\n    - 'ResilientStorage'\n    - 'RT'\n    - 'NFV'\n    - 'SAP'\n    - 'SAPHANA'\n    - 'extras'\n    - 'plus'\n  structure:\n    packages: 'os/Packages'\n    repodata: 'os/repodata'\n  iso_map:\n    xorrisofs: True\n    iso_level: False\n    images:\n      dvd:\n        disc: True\n        variant: 'AppStream'\n        repos:\n          - 'BaseOS'\n          - 'AppStream'\n      minimal:\n        disc: True\n        isoskip: True\n        repos:\n          - 'minimal'\n          - 'BaseOS'\n        variant: 'minimal'\n        volname: 'dvd'\n      BaseOS:\n        disc: False\n        isoskip: True\n        variant: 'BaseOS'\n        repos:\n          - 'BaseOS'\n          - 'AppStream'\n    lorax:\n      repos:\n        - 'BaseOS'\n        - 'AppStream'\n      variant: 'BaseOS'\n      lorax_removes:\n        - 'libreport-rhel-anaconda-bugzilla'\n      required_pkgs:\n        - 'lorax'\n        - 'genisoimage'\n        - 'isomd5sum'\n        - 'lorax-templates-rhel'\n        - 'lorax-templates-generic'\n        - 'xorriso'\n  cloudimages:\n    images:\n      EC2:\n        format: raw\n      GenericCloud:\n        format: qcow2\n  livemap:\n    git_repo: 'https://git.resf.org/sig_core/kickstarts.git'\n    branch: 'r9'\n    ksentry:\n      Workstation: rocky-live-workstation.ks\n      Workstation-Lite: rocky-live-workstation-lite.ks\n      XFCE: rocky-live-xfce.ks\n      KDE: rocky-live-kde.ks\n      MATE: rocky-live-mate.ks\n    allowed_arches:\n      - x86_64\n      - aarch64\n    required_pkgs:\n      - 'lorax-lmc-novirt'\n      - 'vim-minimal'\n      - 'pykickstart'\n      - 'git'\n  variantmap:\n    git_repo: 'https://git.rockylinux.org/rocky/pungi-rocky.git'\n    branch: 'r9'\n    git_raw_path: 'https://git.rockylinux.org/rocky/pungi-rocky/-/raw/r9/'\n  repoclosure_map:\n    arches:\n      x86_64: '--forcearch=x86_64 --arch=x86_64 --arch=athlon --arch=i686 --arch=i586 --arch=i486 --arch=i386 --arch=noarch'\n      aarch64: '--forcearch=aarch64 --arch=aarch64 --arch=noarch'\n      ppc64le: '--forcearch=ppc64le --arch=ppc64le --arch=noarch'\n      s390x: '--forcearch=s390x --arch=s390x --arch=noarch'\n    repos:\n      devel: []\n      BaseOS: []\n      AppStream:\n        - BaseOS\n      CRB:\n        - BaseOS\n        - AppStream\n      HighAvailability:\n        - BaseOS\n        - AppStream\n      ResilientStorage:\n        - BaseOS\n        - AppStream\n      RT:\n        - BaseOS\n        - AppStream\n      NFV:\n        - BaseOS\n        - AppStream\n      SAP:\n        - BaseOS\n        - AppStream\n        - HighAvailability\n      SAPHANA:\n        - BaseOS\n        - AppStream\n        - HighAvailability\n  extra_files:\n    git_repo: 'https://git.rockylinux.org/staging/src/rocky-release.git'\n    git_raw_path: 'https://git.rockylinux.org/staging/src/rocky-release/-/raw/r9/'\n    branch: 'r9'\n    list:\n      - 'SOURCES/Contributors'\n      - 'SOURCES/COMMUNITY-CHARTER'\n      - 'SOURCES/EULA'\n      - 'SOURCES/LICENSE'\n      - 'SOURCES/RPM-GPG-KEY-Rocky-9'\n      - 'SOURCES/RPM-GPG-KEY-Rocky-9-Testing'\n...\n
"},{"location":"documentation/references/empanadas_sig_config/","title":"Empanadas SIG yaml Configuration","text":"

Each file in empanads/sig/ is a yaml file that contains configuration items for the distribution release version. The configuration determines the structure of the SIG repositories synced from Peridot or a given repo.

Note that a release profile (for a major version) is still required for this sync to work.

See the items below to see which options are mandatory and optional.

"},{"location":"documentation/references/empanadas_sig_config/#config-items","title":"Config Items","text":""},{"location":"documentation/references/empanadas_sig_config/#reference-example","title":"Reference Example","text":""},{"location":"events/meeting-notes/2024-03-18/","title":"Release Engineering (SIG/Core) Meeting 2024-03-18","text":""},{"location":"events/meeting-notes/2024-03-18/#attendees","title":"Attendees","text":"
  • Louis Abel
  • Mustafa Gezen
  • Sherif Nagy
  • Neil Hanlon
  • Pablo Greco
  • Taylor Goodwill
  • Skip Grube
"},{"location":"events/meeting-notes/2024-03-18/#old-business","title":"Old Business","text":"
  • Ticket opened to track current packages not yet built for Rocky Linux 10

To fill.

"},{"location":"events/meeting-notes/2024-03-18/#new-business","title":"New Business","text":"
  • RISCV...

To fill.

"},{"location":"events/meeting-notes/2024-03-18/#open-floor","title":"Open Floor","text":"

To fill.

"},{"location":"events/meeting-notes/2024-03-18/#action-items","title":"Action Items","text":"

To fill.

"},{"location":"include/mod_table/","title":"Mod table","text":"Rocky Linux 8Rocky Linux 9Rocky Linux 10 Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks abrt Patch Add Rocky Support anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cockpit-composer Patch, Branding Replace RHEL with Enterprise Linux cloud-init Patch Ensure the managed user is cloud-user like upstream crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL dotnet Branding Add Rocky Support dotnet3.0 Branding Add Rocky Support firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-boxes Patch Add Rocky Support gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libguestfs Patch Add Rocky Support libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported oscap-anaconda-addon Branding Replace \"Red Hat\" with \"Rocky\" PackageKit Patch Change support URL's to Rocky Linux wiki pcs Branding Replace \"Red Hat\" logo plymouth Branding Replace \"Red Hat Enterprise Linux\" python2 Patch Add Rocky Support python3 Patch Add Rocky Support python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd-efi Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot and Branding kernel-rt Patch, Branding Secure Boot and Branding rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is built and available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default"},{"location":"include/resources_bottom/","title":"Resources bottom","text":"Resources Account ServicesGit (RESF Git Service)Git (Rocky Linux GitHub)Git (Rocky Linux GitLab)Mail ListsContacts

URL: https://accounts.rockylinux.org

Purpose: Account Services maintains the accounts for almost all components of the Rocky ecosystem

Technology: Noggin used by Fedora Infrastructure

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

URL: https://git.resf.org

Purpose: General projects, code, and so on for the Rocky Enterprise Software Foundation.

Technology: Gitea

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://github.com/rocky-linux

Purpose: General purpose code, assets, and so on for Rocky Linux. Some content is mirrored to the RESF Git Service.

Technology: GitHub

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://git.rockylinux.org

Purpose: Packages and light code for the Rocky Linux distribution

Technology: GitLab

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://lists.resf.org

Purpose: Users can subscribe and interact with various mail lists for the Rocky ecosystem

Technology: Mailman 3 + Hyper Kitty

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

Name Email Mattermost Name IRC Name Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Skip Grube skip@rockylinux.org @skip77 Sherif Nagy sherif@rockylinux.org @sherif Pablo Greco pgreco@rockylinux.org @pgreco pgreco Neil Hanlon neil@resf.org @neil neil Taylor Goodwill tg@resf.org @tgo tg"},{"location":"legacy/","title":"Legacy","text":"

Legacy documentation comes here.

Debrand List

Koji Tagging

"},{"location":"legacy/debrand_list/","title":"Rocky Debrand Packages List","text":"

This is a list of packages that require changes to their material for acceptance in Rocky Linux. Usually this means there is some text or images in the package that reference upstream trademarks, and these must be swapped out before we can distribute them.

The first items in this list are referenced from the excellent CentOS release notes here: https://wiki.centos.org/Manuals/ReleaseNotes/CentOS8.1905#Packages_modified_by_CentOS

It is assumed that we will have to modify these same packages. It is also assumed that these changed packages might not necessarily be debranding.

However, this list is incomplete. For example, the package Nginx does not appear on the list, and still has RHEL branding in the CentOS repos. We will need to investigate the rest of the package set and find any more packages like this that we must modify.

One way to find said changes is to look for ?centos tags in the SPEC file, while also looking at the manual debranding if there was any for the c8 branches.

There will be cases where a search and replace for ?centos to ?rocky will be sufficient.

Current patches (for staging) are here.

"},{"location":"legacy/debrand_list/#packages-that-need-debranding-changes","title":"Packages that need debranding changes:","text":"Package Notes Work Status abrt See here DONE anaconda See here DONE apache-commons-net AppStream module with elevating branch names NO CHANGES REQUIRED ~~basesystem~~ (does not require debranding, it is a skeleton package) NO CHANGES REQUIRED cloud-init See here DONE - NEEDS REVIEW IN GITLAB (Rich Alloway) cockpit See here DONE ~~compat-glibc~~ NOT IN EL 8 dhcp See here DONE, NEEDS REVIEW IN GITLAB (Rich Alloway) firefox See here -- Still requires a distribution.ini ID MOSTLY DONE (Louis) fwupdate NOT STARTED glusterfs Changes don't appear to be required NO CHANGES REQUIRED gnome-settings-daemon No changes required for now. NO CHANGES REQUIRED grub2 (secureboot patches not done, just debrand) See here DONE, NEEDS REVIEW IN GITLAB AND SECUREBOOT (Rich Alloway) httpd See here DONE initial-setup See here DONE ipa This is a dual change: Logos and ipaplatform. Logos are taken care of in rocky-logos and the ipaplatform is taken care of here. See here DONE ~~kabi-yum-plugins~~ NOT IN EL 8 kernel See here for a potential example NOT STARTED ~~kde-settings~~ NOT IN EL 8 libreport See here DONE oscap-anaconda-addon See here DONE Requires install QA PackageKit See here DONE ~~pcs~~ NO CHANGES REQUIRED plymouth See here DONE ~~redhat-lsb~~ NO CHANGES REQUIRED redhat-rpm-config See here DONE scap-security-guide QA is likely required to test this package as it is NO CHANGES REQUIRED, QA REQUIRED shim NOT STARTED shim-signed NOT STARTED sos See here DONE subscription-manager See here DONE, NEEDS REVIEW ~~system-config-date~~ NOT IN EL8 ~~system-config-kdump~~ NOT IN EL8 thunderbird See here DONE ~~xulrunner~~ NOT IN EL 8 ~~yum~~ NO CHANGES REQUIRED (end of CentOS list) nginx Identified changes, in staging (ALMOST) DONE"},{"location":"legacy/debrand_list/#packages-that-need-to-become-other-packages","title":"Packages that need to become other packages:","text":"

We will want to create our own versions of these packages. The full \"lineage\" is shown, from RHEL -> CentOS -> Rocky (Where applicable)

Package Notes redhat-indexhtml -> centos-indexhtml -> rocky-indexhtml Here redhat-logos -> centos-logos -> rocky-logos Here redhat-release-* -> centos-release -> rocky-release Here centos-backgrounds -> rocky-backgrounds Provided by logos centos-linux-repos -> rocky-repos Here centos-obsolete-packages Here"},{"location":"legacy/debrand_list/#packages-that-exist-in-rhel-but-not-in-centos","title":"Packages that Exist in RHEL, but not in CentOS","text":"

For sake of complete information, here is a list of packages that are in RHEL 8, but do not exist in CentOS 8. We do not need to worry about these packages:

  • insights-client
  • Red_Hat_Enterprise_Linux-Release_Notes-8-*
  • redhat-access-gui
  • redhat-bookmarks
  • subscription-manager-migration
  • subscription-manager-migration-data
"},{"location":"legacy/koji_tagging/","title":"Koji Tagging Strategy","text":"

This document covers how the Rocky Linux Release Engineering Team handles the tagging for builds in Koji and how it affects the overall build process.

"},{"location":"legacy/koji_tagging/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"legacy/koji_tagging/#what-is-koji","title":"What is Koji?","text":"

Koji is the build system used for Rocky Linux, as well as CentOS, Fedora, and likely others. Red Hat is likely to use a variant of Koji called \"brew\" with similar functionality and usage. Koji uses mock, a common RPM building utility, to build RPMs in a chroot environment.

"},{"location":"legacy/koji_tagging/#architecture-of-koji","title":"Architecture of Koji","text":""},{"location":"legacy/koji_tagging/#components","title":"Components","text":"

Koji comprises of multiple components:

  • koji-hub, which is the center of all Koji operations. It runs XML-RPC and relies on other components to call it for actions. This piece will also talk to the database and is one component that has write access to the filesystem.
  • kojid, which is the daemon that runs on the builder nodes. It's responsibility is to talk to the hub for actions in which it can or has to perform, for example, building an RPM or install images. But that is not all that it can do.
  • koji-web is a set of scripts that provides the web interface that anyone can see at our koji.
  • koji is the command line utility that is commonly used - It is a wrapper of the various API commands that can be called. In our environment, it requires a login via kerberos.
  • kojira is a component that ensures repodata is updated among the build tags.
"},{"location":"legacy/koji_tagging/#tags","title":"Tags","text":"

Tags are the most important part of the koji ecosystem. With tags, you can have specific repository build roots for the entire distribution or just a simple subset of builds that should not polute the main build tags (for example, for SIGs where a package or two might be newer (or even older) than what's in BaseOS/AppStream.

Using tags, you can setup what is called \"inheritance\". So for example. You can have a tag named dist-rocky8-build but it happens to inherit dist-rocky8-updates-build, which will likely have a newer set of packages than the former. Inheritance, in a way, can be considered setting \"dnf priorities\" if you've done that before. Another way to look at it is \"ordering\" and \"what comes first\".

Targets call tags to send packages to build in, generally.

"},{"location":"legacy/koji_tagging/#tag-strategy","title":"Tag Strategy","text":"

The question that we get is \"what's the difference between a build and an updates-build tag\" - It's all about the inheritance. For example, let's take a look at dist-rocky8-build

  dist-rocky8-build\n    el8\n    dist-rocky8\n    build-modules\n       . . .\n

In this tag, you can see that this build tag inherits el8 packages first, and then the packages in dist-rocky8, and then build-modules. This is where \"base\" packages start out at, generally and a lot of them won't be updated or even change with the lifecycle of the version.

dist-rocky8-updates-build\n    el8\n    dist-rocky8-updates\n        dist-rocky8\n    dist-rocky8-build\n        build-modules\n

This one is a bit different. Notice that it inherits el8 first, and then dist-rocky8-updates, which inherits dist-rocky8. And then it also pulls in dist-rocky8-build, the previous tag we were talking about. This tag is where updates for a minor release are sent to.

dist-rocky8_4-updates-build\n    el8_4\n    dist-rocky8-updates\n        dist-rocky8\n    dist-rocky8-build\n        el8\n        build-modules\n

Here's a more interesting one. Notice something? It's pretty similar to the last one, but see how it's named el8_4 instead? This is where updates during 8.4 are basically sent to and that's how they get tagged as .el8_4 on the RPM's. The el8_4 tag contains a build macros package that instructs the %dist tag to be set that way. When 8.5 comes out, we'll basically have the same setup.

At the end of the day, builds that happen in these updates-build tags get dropped in dist-rocky8-updates.

"},{"location":"legacy/koji_tagging/#what-about-modules","title":"What about modules?","text":"

Modules are a bit tricky. We generally don't touch how MBS does its tags or what's going on there. When builds are being done with the modules, they do end up using the el8 packages in some manner or form. The modules are separated entirely from the main tags though, so they don't polute the main tags. You don't want a situation where say, you build the latest ruby, but something builds off the default version of ruby provided in el8 and now you're in trouble and get dnf filtering issues.

"},{"location":"legacy/koji_tagging/#how-do-we-determine-what-is-part-of-a-compose","title":"How do we determine what is part of a compose?","text":"

There are special tags that have a -compose suffix. These tags are used as a way to pull down packages for repository building during the pungi process.

"},{"location":"rpm/","title":"RPM","text":"

This section is primarily for documentation and useful information as it pertains to package building and modularity. Use the menu on the left side to find the information you're looking for.

"},{"location":"rpm/local_module_builds/","title":"Local Module Builds","text":"

{% set git_revision_date = '2024-03-05' %} Within the Fedora and Red Hat ecosystem, modularity is unfortunately a piece that is a blessing and a curse. It might be more one way or the other.

This page is primarily to talk about how to do local builds for modules, including the final formatting of the module yaml description that will have to be imported into the repo via modifyrepo_c.

Note that the below is based on how lazybuilder performs module builds, which was made to be close to MBS+Koji and is not perfect. This is mostly used as a reference.

"},{"location":"rpm/local_module_builds/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"rpm/local_module_builds/#building-local-modules","title":"Building Local Modules","text":"

This section explains what it's like to build local modules, what you can do, and what you can expect.

"},{"location":"rpm/local_module_builds/#module-source-transmodrification-pulling-sources","title":"Module Source, \"transmodrification\", pulling sources","text":"

The module source typically lives in a SOURCES directory in a module git repo with the name of modulemd.src.txt. This is a basic version that could be used to do a module build. Each package listed is a reference to the stream version for that particular module.

document: modulemd\nversion: 2\ndata:\n  stream: 1.4\n  summary: 389 Directory Server (base)\n  description: >-\n    389 Directory Server is an LDAPv3 compliant server.  The base package includes\n    the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n  dependencies:\n  - buildrequires:\n      nodejs: [10]\n      platform: [el8]\n    requires:\n      platform: [el8]\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        ref: stream-1.4-rhel-8.4.0\n        arches: [aarch64, ppc64le, s390x, x86_64]\n

Notice ref? That's the reference point. When a \"transmodrification\" occurs, the process is supposed to look at each RPM repo in the components['rpms'] list. The branch name that this module data lives in will be the basis of how it determines what the new references will be. In this example, the branch name is r8-stream-1.4 so when we do the \"conversion\", it should become a git commit hash of the last commit in the branch r8-stream-1.4 for that particular rpm component.

document: modulemd\nversion: 2\ndata:\n  stream: \"1.4\"\n  summary: 389 Directory Server (base)\n  description: 389 Directory Server is an LDAPv3 compliant server.  The base package\n    includes the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n  dependencies:\n  - buildrequires:\n      nodejs:\n      - \"10\"\n      platform:\n      - el8\n    requires:\n      platform:\n      - el8\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n        arches:\n        - aarch64\n        - ppc64le\n        - s390x\n        - x86_64\n

See the reference now? It's now a commit hash that refers directly to 389-ds-base on branch r8-stream-1.4, being the last commit/tag. See the glossary at the end of this page for more information, as it can be a commit hash, branch, or tag name.

"},{"location":"rpm/local_module_builds/#configuring-macros-and-contexts","title":"Configuring Macros and Contexts","text":"

Traditionally within an MBS and Koji system, there are several macros that are created and are usually unique per module stream. There are certain components that work together to create a unique %dist tag based on several factors. To summarize, here's what generally happens:

  • A module version is formed as M0m00YYYYMMDDhhmmss, which would be the major version, 0, minor version, 0, and then a timestamp.
  • Select components are brought together and a sha1 hash is made, shortened to 8 characters for the context

    • The runtime context is typically the \"dependencies\" section of the module source, calculated to sha1
    • The build context is the xmd['mbs']['buildrequires'] data that koji generates and is output into module.txt, calculated to sha1
    • The runtime and build contexts are combined BUILD:RUNTIME, a sha1 is calculated, and then shortened to 8
    • This context is typically the one that changes less often
  • Select components are brought together and a sha1 hash is made, shortened to 8 characters for the dist tag

    • The module name, stream, version, and context are all brought together as name.stream.version.context, calculated to sha1
  • The %dist tag is given a format of .module+elX.Y.Z+000+00000000 (note: fedora uses .module_fcXX+000+00000000)

    • X is the major version, Y is the minor version, Z is typically 0.
    • The second number is the iteration, aka the module number. If you've done 500 module builds, the next one would be 501, regardless of module.
    • The last set is a context hash generated earlier in the step above
"},{"location":"rpm/local_module_builds/#configuring-the-macros","title":"Configuring the Macros","text":"

In koji+MBS, a module macros package is made that defines the module macros. In lazybuilder, we skip that and define the macros directly. For example, in mock, we drop a file with all the macros we need. Here's an example of 389-ds. The file name is is macros.zz-modules to ensure these macros are picked up last and will have precendence and override macros of similar names, especially the %dist tag.

rpmbuild# cat /etc/rpm/macros.zz-modules\n\n%dist .module_el8.4.0+636+837ee950\n%modularitylabel 389-ds:1.4:8040020210810203142:866effaa\n%_module_build 1\n%_module_name 389-ds\n%_module_stream 1.4\n%_module_version 8040020210810203142\n%_module_context 866effaa\n

The the %dist tag honestly is the most important piece here. But all of these tags are required regardless.

"},{"location":"rpm/local_module_builds/#build-opts-macros","title":"Build Opts Macros","text":"

Some modules may have additional buildopts macros. Perl is a great example of this. When koji+MBS make their module macros package for the build, they combine the module macros and the build opts macros together into one file. It will be the same exact file name each time.

rpmbuild# cat /etc/rpm/macros.zz-modules\n\n# Module macros\n%dist .module+el8.4.0+463+10533ad3\n%modularitylabel perl:5.24:8040020210602173155:162f5753\n%_module_build 1\n%_module_name perl\n%_module_stream 5.24\n%_module_version 8040020210602173155\n%_module_context 162f5753\n\n# Build Opts macros\n%_with_perl_enables_groff 1\n%_without_perl_enables_syslog_test 1\n%_with_perl_enables_systemtap 1\n%_without_perl_enables_tcsh 1\n%_without_perl_Compress_Bzip2_enables_optional_test 1\n%_without_perl_CPAN_Meta_Requirements_enables_optional_test 1\n%_without_perl_IPC_System_Simple_enables_optional_test 1\n%_without_perl_LWP_MediaTypes_enables_mailcap 1\n%_without_perl_Module_Build_enables_optional_test 1\n%_without_perl_Perl_OSType_enables_optional_test 1\n%_without_perl_Pod_Perldoc_enables_tk_test 1\n%_without_perl_Software_License_enables_optional_test 1\n%_without_perl_Sys_Syslog_enables_optional_test 1\n%_without_perl_Test_Harness_enables_optional_test 1\n%_without_perl_URI_enables_Business_ISBN 1\n
"},{"location":"rpm/local_module_builds/#built-module-example","title":"Built Module Example","text":"

Let's break down an example of 389-ds - It's a simple module. Let's start with modulemd.txt, generated during a module build and before packages are built. Notice how it has xmd data. That is an integral part of making the context, though it's mostly information for koji and MBS and is generated on the fly and used throughout the build process for each arch. In the context of lazybuilder, it creates fake data to essentially fill the gap of not having MBS+Koji in the first place. The comments will point out what's used to make the contexts.

---\ndocument: modulemd\nversion: 2\ndata:\n  name: 389-ds\n  stream: 1.4\n  version: 8040020210810203142\n  context: 866effaa\n  summary: 389 Directory Server (base)\n  description: >-\n    389 Directory Server is an LDAPv3 compliant server.  The base package includes\n    the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n  xmd:\n    mbs:\n      # This section xmd['mbs']['buildrequires'] is used to generate the build context\n      # This is typically made before hand and is used with the dependencies section\n      # to make the context listed above.\n      buildrequires:\n        nodejs:\n          context: 30b713e6\n          filtered_rpms: []\n          koji_tag: module-nodejs-10-8030020210426100849-30b713e6\n          ref: 4589c1afe3ab66ffe6456b9b4af4cc981b1b7cdf\n          stream: 10\n          version: 8030020210426100849\n        platform:\n          context: 00000000\n          filtered_rpms: []\n          koji_tag: module-rocky-8.4.0-build\n          ref: virtual\n          stream: el8.4.0\n          stream_collision_modules:\n          ursine_rpms:\n          version: 2\n      commit: 53f7648dd6e54fb156b16302eb56bacf67a9024d\n      mse: TRUE\n      rpms:\n        389-ds-base:\n          ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n      scmurl: https://git.rockylinux.org/staging/modules/389-ds?#53f7648dd6e54fb156b16302eb56bacf67a9024d\n      ursine_rpms: []\n  # Dependencies is part of the context combined with the xmd data. This data\n  # is already in the source yaml pulled for the module build in the first place.\n  # Note that in the source, it's usually `elX` rather than `elX.Y.Z` unless\n  # explicitly configured that way.\n  dependencies:\n  - buildrequires:\n      nodejs: [10]\n      platform: [el8.4.0]\n    requires:\n      platform: [el8]\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        repository: git+https://git.rockylinux.org/staging/rpms/389-ds-base\n        cache: http://pkgs.fedoraproject.org/repo/pkgs/389-ds-base\n        ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n        arches: [aarch64, ppc64le, s390x, x86_64]\n...\n

Below is a version meant to be imported into a repo. This is after the build's completion. You'll notice that some fields are either empty or missing from above or even from the git repo's source that we pulled from initially. You'll also notice that xmd is now an empty dictionary. This is on purpose. While it is optional in the repo module data, the build system typically gives it {}.

---\ndocument: modulemd\nversion: 2\ndata:\n  name: 389-ds\n  stream: 1.4\n  version: 8040020210810203142\n  context: 866effaa\n  arch: x86_64\n  summary: 389 Directory Server (base)\n  description: >-\n    389 Directory Server is an LDAPv3 compliant server.  The base package includes\n    the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n    content:\n    - GPLv3+\n  # This data is not an empty dictionary. It is required.\n  xmd: {}\n  dependencies:\n  - buildrequires:\n      nodejs: [10]\n      platform: [el8.4.0]\n    requires:\n      platform: [el8]\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n        arches: [aarch64, ppc64le, s390x, x86_64]\n  artifacts:\n    rpms:\n    - 389-ds-base-0:1.4.3.16-19.module+el8.4.0+636+837ee950.src\n    - 389-ds-base-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-debugsource-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-devel-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-legacy-tools-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-legacy-tools-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-libs-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-libs-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-snmp-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-snmp-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - python3-lib389-0:1.4.3.16-19.module+el8.4.0+636+837ee950.noarch\n...\n

The final \"repo\" of modules (per arch) is eventually made with a designation like:

module-NAME-STREAM-VERSION-CONTEXT\n\nmodule-389-ds-1.4-8040020210810203142-866effaa\n

This is what pungi and other utilities bring in and then combine into a single repo, generally, taking care of the module.yaml.

"},{"location":"rpm/local_module_builds/#default-modules","title":"Default Modules","text":"

Most modules will have a set default that would be expected if a dnf install was called. For example, in EL8 if you said dnf install postgresql-server, the package that gets installed is version 10. If a module doesn't have a default set, a dnf install will traditionally not work. To ensure a module package will install without having to enable them and to use the default, you need default information. Here's the postgresql example.

---\ndocument: modulemd-defaults\nversion: 1\ndata:\n  module: postgresql\n  stream: 10\n  profiles:\n    9.6: [server]\n    10: [server]\n    12: [server]\n    13: [server]\n...\n

Even if a module only has one stream, default module information is still needed to ensure that a package can be installed without enabling the module explicitly. Here's an example.

---\ndocument: modulemd-defaults\nversion: 1\ndata:\n  module: httpd\n  stream: 2.4\n  profiles:\n    2.4: [common]\n...\n

This type of information is expected by pungi as a default modules repo that can be configured. These YAML's are not with the modules themselves. They are brought in when the repos are being created in the first place.

In the context of lazybuilder, it checks for defaults if enabled and then the final repo that's made of the results will immediately have the information at the top. See the references below for the jinja template that lazybuilder uses to generate this information.

As a final note, let's say an update comes in for postgresql and you want to ensure that the old version of postgresql 10 and the updated version of 10 can stay together. This is when the final module data is combined together and then it's added into the repo using modifyrepo_c. Note though, you do not have to have the modulemd-defaults provided again. You can have it once such as the first time you made the repo in the first place, and it will still work.

"},{"location":"rpm/local_module_builds/#building-the-packages","title":"Building the packages","text":"

So we have an idea of how the module data itself is made and managed. All there is left to do is to do a chain build in mock. The kicker is you need to pay attention to the build order that is assigned to each package being built. If a build order isn't assigned, assume that it's group 0 and will be built first. This does not stop 0 being assigned, but just know that buildorder being omitted implies group 0. See below.

    components:\n        rpms:\n            first:\n                rationale: core functions\n                ref: 3.0\n                buildorder: 0\n            second:\n                rationale: ui\n                ref: latest\n                buildorder: 0\n            third:\n                rationale: front end\n                ref: latest\n                buildorder: 1\n

What this shows is that the packages in build group 0 can be built simultaneously in the context of Koji+MBS. For a local build, you'd just put them first in the list. Basically each of these groups have to be done, completed, and available right away for the next package or set of packages. For koji+mbs, they do this automatically since they have a tag/repo that gets updated on each completion and the builds are done in parallel.

For mock, a chain build will always have an internal repo that it uses, so each completed package will have a final createrepo done on it before moving on to the next package in the list. It's not parallel like koji, but it's still consistent.

Essentially a mock command would look like:

mock -r module.cfg \\\n  --chain \\\n  --localrepo /var/lib/mock/modulename \\\n  first.src.rpm \\\n  second.src.rpm \\\n  third.src.rpm\n
"},{"location":"rpm/local_module_builds/#making-the-final-yaml-and-repo","title":"Making the final YAML and repo","text":"

It's probably wise to have a template to make the module repo data off of. It's the same as having a script to \"transmodrify\" the module data properly to be used. Having a template will simplify a lot of things and will make it easier to convert the data from git and then the final build artifacts and data that makes the module data. The lazybuilder template is a good starting point, though it is a bit ugly, being made in jinja. It can be made better using python or even golang.

Regardless, you should have it templated or scripted somehow. See the references in the next section.

"},{"location":"rpm/local_module_builds/#a-note-about-virtual-modules","title":"A note about virtual modules","text":"

Virtual modules are weird. They do not have a module dist tag, and they are just built like... any other RPM. The difference here is that a virtual module while it will should have an api['rpms'] list, it will not have an artifacts section.

A huge example of this is perl:5.26 in EL8. perl 5.26 is the default version. If you install perl-interpreter, you'll get perl-interpreter-5.26.3-419.el8_4.1.x86_64. Notice how it doesn't have a module tag? That's because it wasn't built directly in MBS. There are not many virtual modules, but this is important to keep in mind that these do in fact exist. The module yaml itself will not have a list of packages to build, aka a \"components\" section. Here's the current EL8 perl 5.26 example.

document: modulemd\nversion: 2\ndata:\n    summary: Practical Extraction and Report Language\n    description: >\n        Perl is a high-level programming language with roots in C, sed, awk\n        and shell scripting. Perl is good at handling processes and files, and\n        is especially good at handling text. Perl's hallmarks are practicality\n        and efficiency. While it is used to do a lot of different things,\n        Perl's most common applications are system administration utilities\n        and web programming.\n    license:\n        module: [ MIT ]\n    dependencies:\n        - buildrequires:\n              platform: [el8]\n          requires:\n              platform: [el8]\n    references:\n        community: https://docs.pagure.org/modularity/\n    profiles:\n        common:\n            description: Interpreter and all Perl modules bundled within upstream Perl.\n            rpms:\n                - perl\n        minimal:\n            description: Only the interpreter as a standalone executable.\n            rpms:\n                - perl-interpreter\n    api:\n        rpms:\n            - perl\n            - perl-Archive-Tar\n            - perl-Attribute-Handlers\n            - perl-autodie\n            - perl-B-Debug\n            - perl-bignum\n            - perl-Carp\n            - perl-Compress-Raw-Bzip2\n            - perl-Compress-Raw-Zlib\n            - perl-Config-Perl-V\n            - perl-constant\n            - perl-CPAN\n            - perl-CPAN-Meta\n            - perl-CPAN-Meta-Requirements\n            - perl-CPAN-Meta-YAML\n            - perl-Data-Dumper\n            - perl-DB_File\n            - perl-devel\n            - perl-Devel-Peek\n            - perl-Devel-PPPort\n            - perl-Devel-SelfStubber\n            - perl-Digest\n            - perl-Digest-MD5\n            - perl-Digest-SHA\n            - perl-Encode\n            - perl-Encode-devel\n            - perl-encoding\n            - perl-Env\n            - perl-Errno\n            - perl-experimental\n            - perl-Exporter\n            - perl-ExtUtils-CBuilder\n            - perl-ExtUtils-Command\n            - perl-ExtUtils-Embed\n            - perl-ExtUtils-Install\n            - perl-ExtUtils-MakeMaker\n            - perl-ExtUtils-Manifest\n            - perl-ExtUtils-Miniperl\n            - perl-ExtUtils-MM-Utils\n            - perl-ExtUtils-ParseXS\n            - perl-File-Fetch\n            - perl-File-Path\n            - perl-File-Temp\n            - perl-Filter\n            - perl-Filter-Simple\n            - perl-generators\n            - perl-Getopt-Long\n            - perl-HTTP-Tiny\n            - perl-interpreter\n            - perl-IO\n            - perl-IO-Compress\n            - perl-IO-Socket-IP\n            - perl-IO-Zlib\n            - perl-IPC-Cmd\n            - perl-IPC-SysV\n            - perl-JSON-PP\n            - perl-libnet\n            - perl-libnetcfg\n            - perl-libs\n            - perl-Locale-Codes\n            - perl-Locale-Maketext\n            - perl-Locale-Maketext-Simple\n            - perl-macros\n            - perl-Math-BigInt\n            - perl-Math-BigInt-FastCalc\n            - perl-Math-BigRat\n            - perl-Math-Complex\n            - perl-Memoize\n            - perl-MIME-Base64\n            - perl-Module-CoreList\n            - perl-Module-CoreList-tools\n            - perl-Module-Load\n            - perl-Module-Load-Conditional\n            - perl-Module-Loaded\n            - perl-Module-Metadata\n            - perl-Net-Ping\n            - perl-open\n            - perl-Params-Check\n            - perl-parent\n            - perl-PathTools\n            - perl-Perl-OSType\n            - perl-perlfaq\n            - perl-PerlIO-via-QuotedPrint\n            - perl-Pod-Checker\n            - perl-Pod-Escapes\n            - perl-Pod-Html\n            - perl-Pod-Parser\n            - perl-Pod-Perldoc\n            - perl-Pod-Simple\n            - perl-Pod-Usage\n            - perl-podlators\n            - perl-Scalar-List-Utils\n            - perl-SelfLoader\n            - perl-Socket\n            - perl-Storable\n            - perl-Sys-Syslog\n            - perl-Term-ANSIColor\n            - perl-Term-Cap\n            - perl-Test\n            - perl-Test-Harness\n            - perl-Test-Simple\n            - perl-tests\n            - perl-Text-Balanced\n            - perl-Text-ParseWords\n            - perl-Text-Tabs+Wrap\n            - perl-Thread-Queue\n            - perl-threads\n            - perl-threads-shared\n            - perl-Time-HiRes\n            - perl-Time-Local\n            - perl-Time-Piece\n            - perl-Unicode-Collate\n            - perl-Unicode-Normalize\n            - perl-utils\n            - perl-version\n    # We do not build any packages because they are already available\n    # in BaseOS or AppStream repository. We cannnot replace BaseOS\n    # packages.\n    #components:\n    #    rpms:\n
"},{"location":"rpm/local_module_builds/#reference","title":"Reference","text":"

Below is a reference for what's in a module's data. Some keys are optional. There'll also be an example from lazybuilder, which uses jinja to template out the final data that is used in a repo.

"},{"location":"rpm/local_module_builds/#module-template-and-known-keys","title":"Module Template and Known Keys","text":"

Below are the keys that are expected in the YAML for both defaults and the actual module build itself. Each item will have information on the type of value it is (eg, is it a string, list), if it's optional or mandatory, plus comments that may point out what's valid in source data rather than final repo data. Some of the data below may not be used in EL, but it's important to know what is possible and what could be expected.

This information was copied from: Fedora Modularity

# Document type identifier\n# `document: modulemd-defaults` describes the default stream and profiles for\n# a module.\ndocument: modulemd-defaults\n# Module metadata format version\nversion: 1\ndata:\n    # Module name that the defaults are for, required.\n    module: foo\n    # A 64-bit unsigned integer. Use YYYYMMDDHHMM to easily identify the last\n    # modification time. Use UTC for consistency.\n    # When merging, entries with a newer 'modified' value will override any\n    # earlier values. (optional)\n    modified: 201812071200\n    # Module stream that is the default for the module, optional.\n    stream: \"x.y\"\n    # Module profiles indexed by the stream name, optional\n    # This is a dictionary of stream names to a list of default profiles to be\n    # installed.\n    profiles:\n        'x.y': []\n        bar: [baz, snafu]\n    # System intents dictionary, optional. Indexed by the intent name.\n    # Overrides stream/profiles for intent.\n    intents:\n        desktop:\n            # Module stream that is the default for the module, required.\n            # Overrides the above values for systems with this intent.\n            stream: \"y.z\"\n            # Module profiles indexed by the stream name, required\n            # Overrides the above values for systems with this intent.\n            # From the above, foo:x.y has \"other\" as the value and foo:bar has\n            # no default profile.\n            profiles:\n                'y.z': [blah]\n                'x.y': [other]\n        server:\n            # Module stream that is the default for the module, required.\n            # Overrides the above values for systems with this intent.\n            stream: \"x.y\"\n            # Module profiles indexed by the stream name, required\n            # Overrides the above values for systems with this intent.\n            # From the above foo:x.y and foo:bar have no default profile.\n            profiles:\n                'x.y': []\n

Note: The glossary explains this, but remember that AUTOMATIC means that it will typically not be in the module data itself, and will likely be in repo data itself. There are also spots where thare are things that are MANDATORY but also do not show up in a lot of modules, because the implicit/default option turns off that section.

Note: There is a large chunk of these keys and values that state they are AUTOMATIC and they do show up in the module data as a result of the module data source and/or the build system doing work. An example of this is arch, among others.

##############################################################################\n# Glossary:                                                                  #\n#                                                                            #\n# build system: The process by which a module is built and packaged. In many #\n# cases, this will be the Module Build Service tool, but this term is used   #\n# as a catch-all to describe any mechanism for producing a yum repository    #\n# containing modular content from input module metadata files.               #\n#                                                                            #\n#                                                                            #\n# == Attribute Types ==                                                      #\n#                                                                            #\n# MANDATORY: Attributes of this type must be filled in by the packager of    #\n# this module. They must also be preserved and provided in the output        #\n# metadata produced by the build system for inclusion into a repository.     #\n#                                                                            #\n# OPTIONAL: Attributes of this type may be provided by the packager of this  #\n# module, when appropriate. If they are provided, they must also be          #\n# preserved and provided in the output metadata produced by the build        #\n# system for inclusion into a repository.                                    #\n#                                                                            #\n# AUTOMATIC: Attributes of this type must be present in the repository       #\n# metadata, but they may be left unspecified by the packager. In this case,  #\n# the build system is responsible for generating an appropriate value for    #\n# the attribute and including it in the repository metadata. If the packager #\n# specifies this attribute explicitly, it must be preserved and provided in  #\n# the output metadata for inclusion into a repository.                       #\n#                                                                            #\n# The definitions above describe the expected behavior of the build system   #\n# operating in its default configuration. It is permissible for the build    #\n# system to override user-provided entries through non-default operating     #\n# modes. If such changes are made, all items indicated as being required for #\n# the output repository must still be present.                               #\n##############################################################################\n\n\n# Document type identifier\n# `document: modulemd` describes the contents of a module stream\ndocument: modulemd\n\n# Module metadata format version\nversion: 2\n\ndata:\n    # name:\n    # The name of the module\n    # Filled in by the build system, using the VCS repository name as the name\n    # of the module.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    name: foo\n\n    # stream:\n    # Module update stream\n    # Filled in by the buildsystem, using the VCS branch name as the name of\n    # the stream.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    stream: \"latest\"\n\n    # version:\n    # Module version, 64-bit unsigned integer\n    # If this value is unset (or set to zero), it will be filled in by the\n    # buildsystem, using the VCS commit timestamp.  Module version defines the\n    # upgrade path for the particular update stream.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    version: 20160927144203\n\n    # context:\n    # Module context flag\n    # The context flag serves to distinguish module builds with the\n    # same name, stream and version and plays an important role in\n    # automatic module stream name expansion.\n    #\n    # If 'static_context' is unset or equal to FALSE:\n    #   Filled in by the buildsystem.  A short hash of the module's name,\n    #   stream, version and its expanded runtime dependencies. The exact\n    #   mechanism for generating the hash is unspecified.\n    #\n    #   Type: AUTOMATIC\n    #\n    #   Mandatory for module metadata in a yum/dnf repository.\n    #\n    # If 'static_context' is set to True:\n    #   The context flag is a string of up to thirteen [a-zA-Z0-9_] characters\n    #   representing a build and runtime configuration for this stream. This\n    #   string is arbitrary but must be unique in this module stream.\n    #\n    #   Type: MANDATORY\n    static_context: false\n    context: c0ffee43\n\n    # arch:\n    # Module artifact architecture\n    # Contains a string describing the module's artifacts' main hardware\n    # architecture compatibility, distinguishing the module artifact,\n    # e.g. a repository, from others with the same name, stream, version and\n    # context.  This is not a generic hardware family (i.e. basearch).\n    # Examples: i386, i486, armv7hl, x86_64\n    # Filled in by the buildsystem during the compose stage.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    arch: x86_64\n\n    # summary:\n    # A short summary describing the module\n    #\n    # Type: MANDATORY\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    summary: An example module\n\n    # description:\n    # A verbose description of the module\n    #\n    # Type: MANDATORY\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    description: >-\n        A module for the demonstration of the metadata format. Also,\n        the obligatory lorem ipsum dolor sit amet goes right here.\n\n    # servicelevels:\n    # Service levels\n    # This is a dictionary of important dates (and possibly supplementary data\n    # in the future) that describes the end point of certain functionality,\n    # such as the date when the module will transition to \"security fixes only\"\n    # or go completely end-of-life.\n    # Filled in by the buildsystem.  Service level names might have special\n    # meaning to other systems.  Defined externally.\n    #\n    # Type: AUTOMATIC\n    servicelevels:\n        rawhide:\n            # EOL dates are the ISO 8601 format.\n            eol: 2077-10-23\n        stable_api:\n            eol: 2077-10-23\n        bug_fixes:\n            eol: 2077-10-23\n        security_fixes:\n            eol: 2077-10-23\n\n    # license:\n    # Module and content licenses in the Fedora license identifier\n    # format\n    #\n    # Type: MANDATORY\n    license:\n        # module:\n        # Module license\n        # This list covers licenses used for the module metadata and\n        # possibly other files involved in the creation of this specific\n        # module.\n        #\n        # Type: MANDATORY\n        module:\n            - MIT\n\n        # content:\n        # Content license\n        # A list of licenses used by the packages in the module.\n        # This should be populated by build tools, not the module author.\n        #\n        # Type: AUTOMATIC\n        #\n        # Mandatory for module metadata in a yum/dnf repository.\n        content:\n            - ASL 2.0\n            - GPL+ or Artistic\n\n    # xmd:\n    # Extensible metadata block\n    # A dictionary of user-defined keys and values.\n    # Defaults to an empty dictionary.\n    #\n    # Type: OPTIONAL\n    xmd:\n        some_key: some_data\n\n    # dependencies:\n    # Module dependencies, if any\n    # A list of dictionaries describing build and runtime dependencies\n    # of this module.  Each list item describes a combination of dependencies\n    # this module can be built or run against.\n    # Dependency keys are module names, dependency values are lists of\n    # required streams.  The lists can be both inclusive (listing compatible\n    # streams) or exclusive (accepting every stream except for those listed).\n    # An empty list implies all active existing streams are supported.\n    # Requiring multiple streams at build time will result in multiple\n    # builds.  Requiring multiple streams at runtime implies the module\n    # is compatible with all of them.  If the same module streams are listed\n    # in both the build time and the runtime block, the build tools translate\n    # the runtime block so that it matches the stream the module was built\n    # against.  Multiple builds result in multiple output modulemd files.\n    # See below for an example.\n    # The example below illustrates how to build the same module in four\n    # different ways, with varying build time and runtime dependencies.\n    #\n    # Type: OPTIONAL\n    dependencies:\n        # Build on all available platforms except for f27, f28 and epel7\n        # After build, the runtime dependency will match the one used for\n        # the build.\n        - buildrequires:\n              platform: [-f27, -f28, -epel7]\n          requires:\n              platform: [-f27, -f28, -epel7]\n\n        # For platform:f27 perform two builds, one with buildtools:v1, another\n        # with buildtools:v2 in the buildroot.  Both will also utilize\n        # compatible:v3.  At runtime, buildtools isn't required and either\n        # compatible:v3 or compatible:v4 can be installed.\n        - buildrequires:\n              platform: [f27]\n              buildtools: [v1, v2]\n              compatible: [v3]\n          requires:\n              platform: [f27]\n              compatible: [v3, v4]\n\n        # For platform:f28 builds, require either runtime:a or runtime:b at\n        # runtime.  Only one build is performed.\n        - buildrequires:\n              platform: [f28]\n          requires:\n              platform: [f28]\n              runtime: [a, b]\n\n        # For platform:epel7, build against against all available extras\n        # streams and moreextras:foo and moreextras:bar.  The number of builds\n        # in this case will be 2 * <the number of extras streams available>.\n        # At runtime, both extras and moreextras will match whatever stream was\n        # used for build.\n        - buildrequires:\n              platform: [epel7]\n              extras: []\n              moreextras: [foo, bar]\n          requires:\n              platform: [epel7]\n              extras: []\n              moreextras: [foo, bar]\n\n    # references:\n    # References to external resources, typically upstream\n    #\n    # Type: OPTIONAL\n    references:\n        # community:\n        # Upstream community website, if it exists\n        #\n        # Type: OPTIONAL\n        community: http://www.example.com/\n\n        # documentation:\n        # Upstream documentation, if it exists\n        #\n        # Type: OPTIONAL\n        documentation: http://www.example.com/\n\n        # tracker:\n        # Upstream bug tracker, if it exists\n        #\n        # Type: OPTIONAL\n        tracker: http://www.example.com/\n\n    # profiles:\n    # Profiles define the end user's use cases for the module. They consist of\n    # package lists of components to be installed by default if the module is\n    # enabled. The keys are the profile names and contain package lists by\n    # component type. There are several profiles defined below. Suggested\n    # behavior for package managers is to just enable repository for selected\n    # module. Then users are able to install packages on their own. If they\n    # select a specific profile, the package manager should install all\n    # packages of that profile.\n    # Defaults to no profile definitions.\n    #\n    # Type: OPTIONAL\n    profiles:\n\n        # An example profile that defines a set of packages which are meant to\n        # be installed inside a container image artifact.\n        #\n        # Type: OPTIONAL\n        container:\n            rpms:\n                - bar\n                - bar-devel\n\n        # An example profile that delivers a minimal set of packages to\n        # provide this module's basic functionality. This is meant to be used\n        # on target systems where size of the distribution is a real concern.\n        #\n        # Type: Optional\n        minimal:\n            # A verbose description of the module, optional\n            description: Minimal profile installing only the bar package.\n            rpms:\n                - bar\n\n        # buildroot:\n        # This is a special reserved profile name.\n        #\n        # This provides a listing of packages that will be automatically\n        # installed into the buildroot of all component builds that are started\n        # after a component builds with its `buildroot: True` option set.\n        #\n        # The primary purpose of this is for building RPMs that change\n        # the build environment, such as those that provide new RPM\n        # macro definitions that can be used by subsequent builds.\n        #\n        # Specifically, it is used to flesh out the build group in koji.\n        #\n        # Type: OPTIONAL\n        buildroot:\n            rpms:\n                - bar-devel\n\n        # srpm-buildroot:\n        # This is a special reserved profile name.\n        #\n        # This provides a listing of packages that will be automatically\n        # installed into the buildroot of all component builds that are started\n        # after a component builds with its `srpm-buildroot: True` option set.\n        #\n        # The primary purpose of this is for building RPMs that change\n        # the build environment, such as those that provide new RPM\n        # macro definitions that can be used by subsequent builds.\n        #\n        # Very similar to the buildroot profile above, this is used by the\n        # build system to specify any additional packages which should be\n        # installed during the buildSRPMfromSCM step in koji.\n        #\n        # Type: OPTIONAL\n        srpm-buildroot:\n            rpms:\n                - bar-extras\n\n    # api:\n    # Module API\n    # Defaults to no API.\n    #\n    # Type: OPTIONAL\n    api:\n        # rpms:\n        # The module's public RPM-level API.\n        # A list of binary RPM names that are considered to be the\n        # main and stable feature of the module; binary RPMs not listed\n        # here are considered \"unsupported\" or \"implementation details\".\n        # In the example here we don't list the xyz package as it's only\n        # included as a dependency of xxx.  However, we list a subpackage\n        # of bar, bar-extras.\n        # Defaults to an empty list.\n        #\n        # Type: OPTIONAL\n        rpms:\n            - bar\n            - bar-extras\n            - bar-devel\n            - baz\n            - xxx\n\n    # filter:\n    # Module component filters\n    # Defaults to no filters.\n    #\n    # Type: OPTIONAL\n    filter:\n        # rpms:\n        # RPM names not to be included in the module.\n        # By default, all built binary RPMs are included.  In the example\n        # we exclude a subpackage of bar, bar-nonfoo from our module.\n        # Defaults to an empty list.\n        #\n        # Type: OPTIONAL\n        rpms:\n            - baz-nonfoo\n\n    # demodularized:\n    # Artifacts which became non-modular\n    # Defaults to no demodularization.\n    # Type: OPTIONAL\n    demodularized:\n        # rpms:\n        # A list of binary RPM package names which where removed from\n        # a module. This list explains to a package mananger that the packages\n        # are not part of the module anymore and up-to-now same-named masked\n        # non-modular packages should become available again. This enables\n        # moving a package from a module to a set of non-modular packages. The\n        # exact implementation of the demodularization (e.g. whether it\n        # applies to all modules or only to this stream) is defined by the\n        # package manager.\n        # Defaults to an empty list.\n        #\n        # Type: OPTIONAL\n        rpms:\n            - bar-old\n\n    # buildopts:\n    # Component build options\n    # Additional per component type module-wide build options.\n    #\n    # Type: OPTIONAL\n    buildopts:\n        # rpms:\n        # RPM-specific build options\n        #\n        # Type: OPTIONAL\n        rpms:\n            # macros:\n            # Additional macros that should be defined in the\n            # RPM buildroot, appended to the default set.  Care should be\n            # taken so that the newlines are preserved.  Literal style\n            # block is recommended, with or without the trailing newline.\n            #\n            # Type: OPTIONAL\n            macros: |\n                %demomacro 1\n                %demomacro2 %{demomacro}23\n\n            # whitelist:\n            # Explicit list of package build names this module will produce.\n            # By default the build system only allows components listed under\n            # data.components.rpms to be built as part of this module.\n            # In case the expected RPM build names do not match the component\n            # names, the list can be defined here.\n            # This list overrides rather then just extends the default.\n            # List of package build names without versions.\n            #\n            # Type: OPTIONAL\n            whitelist:\n                - fooscl-1-bar\n                - fooscl-1-baz\n                - xxx\n                - xyz\n\n        # arches:\n        # Instructs the build system to only build the\n        # module on this specific set of architectures.\n        # Includes specific hardware architectures, not families.\n        # See the data.arch field for details.\n        # Defaults to all available arches.\n        #\n        # Type: OPTIONAL\n        arches: [i686, x86_64]\n\n    # components:\n    # Functional components of the module\n    #\n    # Type: OPTIONAL\n    components:\n        # rpms:\n        # RPM content of the module\n        # Keys are the VCS/SRPM names, values dictionaries holding\n        # additional information.\n        #\n        # Type: OPTIONAL\n        rpms:\n            bar:\n                # name:\n                # The real name of the package, if it differs from the key in\n                # this dictionary. Used when bootstrapping to build a\n                # bootstrapping ref before building the package for real.\n                #\n                # Type: OPTIONAL\n                name: bar-real\n\n                # rationale:\n                # Why is this component present.\n                # A simple, free-form string.\n                #\n                # Type: MANDATORY\n                rationale: We need this to demonstrate stuff.\n\n                # repository:\n                # Use this repository if it's different from the build\n                # system configuration.\n                #\n                # Type: AUTOMATIC\n                repository: https://pagure.io/bar.git\n\n                # cache:\n                # Use this lookaside cache if it's different from the\n                # build system configuration.\n                #\n                # Type: AUTOMATIC\n                cache: https://example.com/cache\n\n                # ref:\n                # Use this specific commit hash, branch name or tag for\n                # the build.  If ref is a branch name, the branch HEAD\n                # will be used.  If no ref is given, the master branch\n                # is assumed.\n                #\n                # Type: AUTOMATIC\n                ref: 26ca0c0\n\n                # buildafter:\n                # Use the \"buildafter\" value to specify that this component\n                # must be be ordered later than some other entries in this map.\n                # The values of this array come from the keys of this map and\n                # not the real component name to enable bootstrapping.\n                # Use of both buildafter and buildorder in the same document is\n                # prohibited, as they will conflict.\n                #\n                # Note: The use of buildafter is not currently supported by the\n                # Fedora module build system.\n                #\n                # Type: AUTOMATIC\n                #\n                # buildafter:\n                #    - baz\n\n                # buildonly:\n                # Use the \"buildonly\" value to indicate that all artifacts\n                # produced by this component are intended only for building\n                # this component and should be automatically added to the\n                # data.filter.rpms list after the build is complete.\n                # Defaults to \"false\" if not specified.\n                #\n                # Type: AUTOMATIC\n                buildonly: false\n\n            # baz builds RPM macros for the other components to use\n            baz:\n                rationale: Demonstrate updating the buildroot contents.\n\n                # buildroot:\n                # If buildroot is set to True, the packages listed in this\n                # module's 'buildroot' profile will be installed into the\n                # buildroot of any component built in buildorder/buildafter\n                # batches begun after this one, without requiring that those\n                # packages are listed among BuildRequires.\n                #\n                # The primary purpose of this is for building RPMs that change\n                # the build environment, such as those that provide new RPM\n                # macro definitions that can be used by subsequent builds.\n                #\n                # Defaults to \"false\" if not specified.\n                #\n                # Type: OPTIONAL\n                buildroot: true\n\n                # srpm-buildroot:\n                # If srpm-buildroot is set to True, the packages listed in this\n                # module's 'srpm-buildroot' profile will be installed into the\n                # buildroot of any component built in buildorder/buildafter\n                # batches begun after this one, without requiring that those\n                # packages are listed among BuildRequires.\n                #\n                # The primary purpose of this is for building RPMs that change\n                # the build environment, such as those that provide new RPM\n                # macro definitions that can be used by subsequent builds.\n                #\n                # Defaults to \"false\" if not specified.\n                #\n                # Type: OPTIONAL\n                srpm-buildroot: true\n\n                # See component xyz for a complete description of buildorder\n                #\n                # build this component before any others so that the macros it\n                # creates are available to all of them.\n                buildorder: -1\n\n            xxx:\n                rationale: xxx demonstrates arches and multilib.\n\n                # arches:\n                # xxx is only available on the listed architectures.\n                # Includes specific hardware architectures, not families.\n                # See the data.arch field for details.\n                # Instructs the build system to only build the\n                # component on this specific set of architectures.\n                # If data.buildopts.arches is also specified,\n                # this must be a subset of those architectures.\n                # Defaults to all available arches.\n                #\n                # Type: AUTOMATIC\n                arches: [i686, x86_64]\n\n                # multilib:\n                # A list of architectures with multilib\n                # installs, i.e. both i686 and x86_64\n                # versions will be installed on x86_64.\n                # Includes specific hardware architectures, not families.\n                # See the data.arch field for details.\n                # Defaults to no multilib.\n                #\n                # Type: AUTOMATIC\n                multilib: [x86_64]\n\n            xyz:\n                rationale: xyz is a bundled dependency of xxx.\n\n                # buildorder:\n                # Build order group\n                # When building, components are sorted by build order tag\n                # and built in batches grouped by their buildorder value.\n                # Built batches are then re-tagged into the buildroot.\n                # Multiple components can have the same buildorder index\n                # to map them into build groups.\n                # Defaults to zero.\n                # Integer, from an interval [-(2^63), +2^63-1].\n                # In this example, bar, baz and xxx are built first in\n                # no particular order, then tagged into the buildroot,\n                # then, finally, xyz is built.\n                # Use of both buildafter and buildorder in the same document is\n                # prohibited, as they will conflict.\n                #\n                # Type: OPTIONAL\n                buildorder: 10\n\n        # modules:\n        # Module content of this module\n        # Included modules are built in the shared buildroot, together with\n        # other included content.  Keys are module names, values additional\n        # component information.  Note this only includes components and their\n        # properties from the referenced module and doesn't inherit any\n        # additional module metadata such as the module's dependencies or\n        # component buildopts.  The included components are built in their\n        # defined buildorder as sub-build groups.\n        #\n        # Type: OPTIONAL\n        modules:\n            includedmodule:\n\n                # rationale:\n                # Why is this module included?\n                #\n                # Type: MANDATORY\n                rationale: Included in the stack, just because.\n\n                # repository:\n                # Link to VCS repository that contains the modulemd file\n                # if it differs from the buildsystem default configuration.\n                #\n                # Type: AUTOMATIC\n                repository: https://pagure.io/includedmodule.git\n\n                # ref:\n                # See the rpms ref.\n                #\n                # Type: AUTOMATIC\n                ref: somecoolbranchname\n\n                # buildorder:\n                # See the rpms buildorder.\n                #\n                # Type: AUTOMATIC\n                buildorder: 100\n\n    # artifacts:\n    # Artifacts shipped with this module\n    # This section lists binary artifacts shipped with the module, allowing\n    # software management tools to handle module bundles.  This section is\n    # populated by the module build system.\n    #\n    # Type: AUTOMATIC\n    artifacts:\n\n        # rpms:\n        # RPM artifacts shipped with this module\n        # A set of NEVRAs associated with this module. An epoch number in the\n        # NEVRA string is mandatory.\n        #\n        # Type: AUTOMATIC\n        rpms:\n            - bar-0:1.23-1.module_deadbeef.x86_64\n            - bar-devel-0:1.23-1.module_deadbeef.x86_64\n            - bar-extras-0:1.23-1.module_deadbeef.x86_64\n            - baz-0:42-42.module_deadbeef.x86_64\n            - xxx-0:1-1.module_deadbeef.x86_64\n            - xxx-0:1-1.module_deadbeef.i686\n            - xyz-0:1-1.module_deadbeef.x86_64\n\n        # rpm-map:\n        # The rpm-map exists to link checksums from repomd to specific\n        # artifacts produced by this module. Any item in this list must match\n        # an entry in the data.artifacts.rpms section.\n        #\n        # Type: AUTOMATIC\n        rpm-map:\n\n          # The digest-type of this checksum.\n          #\n          # Type: MANDATORY\n          sha256:\n\n            # The checksum of the artifact being sought.\n            #\n            # Type: MANDATORY\n            ee47083ed80146eb2c84e9a94d0836393912185dcda62b9d93ee0c2ea5dc795b:\n\n              # name:\n              # The RPM name.\n              #\n              # Type: Mandatory\n              name: bar\n\n              # epoch:\n              # The RPM epoch.\n              # A 32-bit unsigned integer.\n              #\n              # Type: OPTIONAL\n              epoch: 0\n\n              # version:\n              # The RPM version.\n              #\n              # Type: MANDATORY\n              version: 1.23\n\n              # release:\n              # The RPM release.\n              #\n              # Type: MANDATORY\n              release: 1.module_deadbeef\n\n              # arch:\n              # The RPM architecture.\n              #\n              # Type: MANDATORY\n              arch: x86_64\n\n              # nevra:\n              # The complete RPM NEVRA.\n              #\n              # Type: MANDATORY\n              nevra: bar-0:1.23-1.module_deadbeef.x86_64\n
"},{"location":"rpm/local_module_builds/#module-template-and-keys-using-jinja","title":"Module Template and Keys using jinja","text":"
{% if module_default_data is defined %}\n---\ndocument: modulemd-defaults\nversion: {{ module_default_data.version }}\ndata:\n  module: {{ module_default_data.data.module }}\n  stream: {{ module_default_data.data.stream }}\n  profiles:\n{% for k in module_default_data.data.profiles %}\n    {{ k }}: [{{ module_default_data.data.profiles[k]|join(', ') }}]\n{% endfor %}\n...\n{% endif %}\n---\ndocument: {{ module_data.document }}\nversion: {{ module_data.version }}\ndata:\n  name: {{ source_name | default(\"source\") }}\n  stream: \"{{ module_data.data.stream }}\"\n  version: {{ module_version | default(8040) }}\n  context: {{ module_context | default('01010110') }}\n  arch: {{ mock_arch | default(ansible_architecture) }}\n  summary: {{ module_data.data.summary | wordwrap(width=79) | indent(width=4) }}\n  description: {{ module_data.data.description | wordwrap(width=79) | indent(width=4) }}\n  license:\n{% for (key, value) in module_data.data.license.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n  xmd: {}\n{% if module_data.data.dependencies is defined %}\n  dependencies:\n{% for l in module_data.data.dependencies %}\n{% for r in l.keys() %}\n{% if loop.index == 1 %}\n  - {{ r }}:\n{% else %}\n    {{ r }}:\n{% endif %}\n{% for (m, n) in l[r].items() %}\n      {{ m }}: [{{ n | join(', ') }}]\n{% endfor %}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if module_data.data.filter is defined %}\n  filter:\n{% for (key, value) in module_data.data.filter.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n{% endif %}\n{% if module_data.data.profiles is defined %}\n  profiles:\n{% for (key, value) in module_data.data.profiles.items() %}\n    {{ key }}:\n{% for (key, value) in value.items() %}\n{% if value is iterable and (value is not string and value is not mapping) %}\n      {{ key | indent(width=6) }}:\n      - {{ value | join('\\n      - ') }}\n{% else %}\n      {{ key | indent(width=6) }}: {{ value }}\n{% endif %}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if module_data.data.api is defined %}\n  api:\n{% for (key, value) in module_data.data.api.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n{% endif %}\n{% if module_data.data.buildopts is defined %}\n  buildopts:\n{% for (key, value) in module_data.data.buildopts.items() %}\n    {{ key }}:\n{% for (key, value) in value.items() %}\n      {{ key }}: |\n        {{ value | indent(width=8) }}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if module_data.data.references is defined %}\n  references:\n{% for (key, value) in module_data.data.references.items() %}\n    {{ key }}: {{ value }}\n{% endfor %}\n{% endif %}\n{% if module_data.data.components is defined %}\n  components:\n{% for (key, value) in module_data.data.components.items() %}\n    {{ key }}:\n{% for (key, value) in value.items() %}\n      {{ key }}:\n{% for (key, value) in value.items() %}\n{% if value is iterable and (value is not string and value is not mapping) %}\n        {{ key | indent(width=8) }}: [{{ value | join(', ') }}]\n{% else %}\n        {{ key | indent(width=8) }}: {{ value }}\n{% endif %}\n{% endfor %}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if artifacts is defined %}\n  artifacts:\n{% for (key, value) in artifacts.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n{% endif %}\n...\n
"},{"location":"sop/","title":"SOP (Standard Operationg Procedures)","text":"

This section goes over the various SOP's for SIG/Core. Please use the menu items to find the various pages of interest.

"},{"location":"sop/sop_compose/","title":"SOP: Compose and Repo Sync for Rocky Linux and Peridot","text":"

This SOP covers how the Rocky Linux Release Engineering Team handles composes and repository syncs for the distribution. It contains information of the scripts that are utilized and in what order, depending on the use case.

"},{"location":"sop/sop_compose/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"sop/sop_compose/#related-git-repositories","title":"Related Git Repositories","text":"

There are several git repositories used in the overall composition of a repository or a set of repositories.

Pungi - This repository contains all the necessary pungi configuration files that peridot translates into its own configuration. Pungi is no longer used for Rocky Linux.

Comps - This repository contains all the necessary comps (which are groups and other data) for a given major version. Peridot (and pungi) use this information to properly build repositories.

Toolkit - This repository contains various scripts and utilities used by Release Engineering, such as syncing composes, functionality testing, and mirror maintenance.

"},{"location":"sop/sop_compose/#composing-repositories","title":"Composing Repositories","text":""},{"location":"sop/sop_compose/#mount-structure","title":"Mount Structure","text":"

There is a designated system that takes care of composing repositories. These systems contain the necessary EFS/NFS mounts for the staging and production repositories as well as composes.

  • /mnt/compose -> Compose data
  • /mnt/repos-staging -> Staging
  • /mnt/repos-production -> Production
"},{"location":"sop/sop_compose/#empanadas","title":"Empanadas","text":"

Each repository or set of repositories are controlled by various comps and pungi configurations that are translated into peridot. Empanadas is used to run a reposync from peridot's yumrepofs repositories, generate ISO's, and create a pungi compose look-a-like. Because of this, the comps and pungi-rocky configuration is not referenced with empanadas.

"},{"location":"sop/sop_compose/#running-a-compose","title":"Running a Compose","text":"

First, the toolkit must be cloned. In the iso/empanadas directory, run poetry install. You'll then have access to the various commands needed:

  • sync-from-peridot
  • build-iso
  • build-iso-extra
  • pull-unpack-tree
  • pull-cloud-image
  • finalize-compose
"},{"location":"sop/sop_compose/#full-compose","title":"Full Compose","text":"

To perform a full compose, this order is expected (replacing X with major version or config profile)

# This creates a brand new directory under /mnt/compose/X and symlinks it to latest-Rocky-X\npoertry run sync-from-peridot --release X --hashed --repoclosure --full-run\n\n# On each architecture, this must be ran to generate the lorax images\n# !! Use --rc if the image is a release candidate or a beta image\n# Note: This is typically done using kubernetes and uploaded to a bucket\npoetry run build-iso --release X --isolation=None\n\n# The images are pulled from the bucket\npoetry run pull-unpack-tree --release X\n\n# The extra ISO's (usually just DVD) are generated\n# !! Use --rc if the image is a release candidate or a beta image\n# !! Set --extra-iso-mode to mock if desired\n# !! If there is more than the dvd, remove --extra-iso dvd\npoetry run build-iso-extra --release X --extra-iso dvd --extra-iso-mode podman\n\n# This pulls the generic and EC2 cloud images\npoetry run pull-cloud-image --release X\n\n# This ensures everything is closed out for a release. This copies iso's, images,\n# generates metadata, and the like.\n# !! DO NOT RUN DURING INCREMENTAL UPDATES !!\npoetry run finalize-compose --release X\n
"},{"location":"sop/sop_compose/#incremental-compose","title":"Incremental Compose","text":"

It is possible to simply compose singular repos if you know which ones you want to sync. This can be done when it's not for a brand new release.

# Set your repos as desired. --arch is also acceptable.\n# --ignore-debug and --ignore-source are also acceptable options.\npoetry run sync-from-peridot --release X --hashed --clean-old-packages --repo X,Y,Z\n
"},{"location":"sop/sop_compose/#syncing-composes","title":"Syncing Composes","text":"

Syncing utilizes the sync scripts provided in the release engineering toolkit.

When the scripts are being ran, they are usually ran with a specific purpose, as each major version may be different.

The below are common vars files. common_X will override what's in common. Typically these set what repositories exist and how they are named or look at the top level. These also set the current major.minor release as necessary.

.\n\u251c\u2500\u2500 common\n\u251c\u2500\u2500 common_8\n\u251c\u2500\u2500 common_9\n

These are for the releases in general. What they do is noted below.

\u251c\u2500\u2500 gen-torrents.sh                  -> Generates torrents for images\n\u251c\u2500\u2500 minor-release-sync-to-staging.sh -> Syncs a minor release to staging\n\u251c\u2500\u2500 prep-staging-X.sh                -> Preps staging updates and signs repos (only for 8)\n\u251c\u2500\u2500 sign-repos-only.sh               -> Signs the repomd (only for 8)\n\u251c\u2500\u2500 sync-file-list-parallel.sh       -> Generates file lists in parallel for mirror sync scripts\n\u251c\u2500\u2500 sync-to-prod.sh                  -> Syncs staging to production\n\u251c\u2500\u2500 sync-to-prod.delete.sh           -> Syncs staging to production (deletes artifacts that are no longer in staging)\n\u251c\u2500\u2500 sync-to-prod-sig.sh              -> Syncs a sig provided compose to production\n\u251c\u2500\u2500 sync-to-staging.sh               -> Syncs a provided compose to staging\n\u251c\u2500\u2500 sync-to-staging.delete.sh        -> Syncs a provided compose to staging (deletes artifacts that are no longer in the compose)\n\u251c\u2500\u2500 sync-to-staging-sig.sh           -> Syncs a sig provided compose to staging\n

Generally, you will only run sync-to-staging.sh or sync-to-staging.delete.sh to sync. The former is for older releases, the latter is for newer releases. Optionally, if you are syncing a \"beta\" or \"lookahead\" release, you will need to also provide the RLREL variable as beta or lookahead.

# The below syncs to staging for Rocky Linux 8\nRLVER=8 bash sync-to-staging.sh Rocky\n# The below syncs to staging for Rocky Linux 9\nRLVER=9 bash sync-to-staging.delete.sh Rocky\n

Once the syncs are done, staging must be tested and vetted before being sent to production. Once staging is completed, it is synced to production.

# Set X to whatever release\nbash RLVER=X sync-to-prod.delete.sh\nbash sync-file-list-parallel.sh\n

During this phase, staging is rsynced with production, the file list is updated, and the full time list is also updated to allow mirrors to know that the repositories have been updated and that they can sync.

Note: If multiple releases are being updated, it is important to run the syncs to completion before running the file list parallel script.

"},{"location":"sop/sop_compose_8/","title":"SOP: Compose and Repo Sync for Rocky Linux 8","text":"

This SOP covers how the Rocky Linux Release Engineering Team handles composes and repository syncs for Rocky Linux 8. It contains information of the scripts that are utilized and in what order, depending on the use case.

Please see the other SOP for Rocky Linux 9+ that are managed via empanadas and peridot.

"},{"location":"sop/sop_compose_8/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"sop/sop_compose_8/#related-git-repositories","title":"Related Git Repositories","text":"

There are several git repositories used in the overall composition of a repository or a set of repositories.

Pungi - This repository contains all the necessary pungi configuration files for composes that come from koji. Pungi interacts with koji to build the composes.

Comps - This repository contains all the necessary comps (which are groups and other data) for a given major version. Pungi uses this information to properly build the repositories.

Toolkit - This repository contains various scripts and utilities used by Release Engineering, such as syncing composes, functionality testing, and mirror maintenance.

"},{"location":"sop/sop_compose_8/#composing-repositories","title":"Composing Repositories","text":"

For every stable script, there is an equal beta or lookahead script available.

"},{"location":"sop/sop_compose_8/#mount-structure","title":"Mount Structure","text":"

There is a designated system that takes care of composing repositories. These systems contain the necessary EFS/NFS mounts for the staging and production repositories as well as composes.

  • /mnt/koji -> Koji files store
  • /mnt/compose -> Compose data
  • /mnt/repos-staging -> Staging
  • /mnt/repos-production -> Production
"},{"location":"sop/sop_compose_8/#pungi","title":"Pungi","text":"

Each repository or set of repositories are controlled by various pungi configurations. For example, r8.conf will control the absolute base of Rocky Linux 8, which imports other git repository data as well as accompanying json or other configuration files.

"},{"location":"sop/sop_compose_8/#running-a-compose","title":"Running a Compose","text":"

Inside the pungi git repository, the folder scripts contain the necessary scripts that are ran to perform a compose. There are different types of composes:

  • produce -> Generates a full compose, generally used for minor releases, which generate new ISO's
  • update -> Generates a smaller compose, generally used for updates within a minor release cycle - ISO's are not generated

Each script is titled appropriately:

  • produce-X.sh -> Generates a full compose for X major release, typically set to the current minor release according to rX.conf
  • produce-X-full.sh -> Generates a full compose for X major release, including extras, plus, and devel in one go.
  • updates-X.sh -> Generates a smaller compose for X major release, typically set to the current minor release according to rX.conf
  • updates-X-NAME.sh -> Generates a compose for the specific compose, such as NFV, Rocky-devel, Extras, or Plus
  • updates-X-full.sh -> Generates a full incremental compose for the X release, which includes extras, plus, and devel in one go. Does NOT make ISO's.

When these scripts are ran, they generate an appropriate directory under /mnt/compose/X with a directory and an accompanying symlink. For example. If an update to Rocky was made using updates-8.sh, the below would be made:

drwxr-xr-x. 5 root  root  6144 Jul 21 17:44 Rocky-8-updates-20210721.1\nlrwxrwxrwx. 1 root  root    26 Jul 21 18:26 latest-Rocky-8 -> Rocky-8-updates-20210721.1\n

This setup also allows pungi to reuse previous package set data to reduce the time it takes to build a compose. Typically during a new minor release, all composes should be ran so they can be properly combined. Example of a typical order if releasing 8.X:

produce-8.sh\nupdates-8-devel.sh\nupdates-8-extras.sh\n\n# ! OR !\nproduce-8-full.sh\n
"},{"location":"sop/sop_compose_8/#syncing-composes","title":"Syncing Composes","text":"

Syncing utilizes the sync scripts provided in the release engineering toolkit.

When the scripts are being ran, they are usually ran for a specific purpose. They are also ran in a certain order to ensure integrity and consistency of a release.

The below are common vars files. common_X will override what's in common. Typically these set what repositories exist and how they are named or look at the top level. These also set the current major.minor release as necessary.

.\n\u251c\u2500\u2500 common\n\u251c\u2500\u2500 common_8\n\u251c\u2500\u2500 common_9\n

These are for the releases in general. What they do is noted below.

\u251c\u2500\u2500 gen-torrents.sh                  -> Generates torrents for images\n\u251c\u2500\u2500 minor-release-sync-to-staging.sh -> Syncs a minor release to staging\n\u251c\u2500\u2500 sign-repos-only.sh               -> Signs the repomd (only)\n\u251c\u2500\u2500 sync-to-prod.sh                  -> Syncs staging to production\n\u251c\u2500\u2500 sync-to-staging.sh               -> Syncs a provided compose to staging\n\u251c\u2500\u2500 sync-to-staging-sig.sh           -> Syncs a sig provided compose to staging\n

Generally, you will only run minor-release-sync-to-staging.sh when a full minor release is being produced. So for example, if 8.5 has been built out, you would run that after a compose. gen-torrents.sh would be ran shortly after.

When doing updates, the order of operations (preferably) would be:

* sync-to-staging.sh\n* sync-to-staging-sig.sh -> Only if sigs are updated\n* sync-to-prod.sh        -> After the initial testing, it is sent to prod.\n

An example of order:

# The below syncs to staging\nRLVER=8 bash sync-to-staging.sh Extras\nRLVER=8 bash sync-to-staging.sh Rocky-devel\nRLVER=8 bash sync-to-staging.sh Rocky\n

Once the syncs are done, staging must be tested and vetted before being sent to production. During this stage, the updateinfo.xml is also applied where necessary to the repositories to provide errata. Once staging is completed, it is synced to production.

pushd /mnt/repos-staging/mirror/pub/rocky/8.X\npython3.9 /usr/local/bin/apollo_tree -p $(pwd) -n 'Rocky Linux 8 $arch' -i Live -i Minimal -i devel -i extras -i images -i isos -i live -i metadata -i Devel -i plus -i nfv\npopd\nRLVER=8 bash sign-repos-only.sh\nRLVER=8 bash sync-to-prod.sh\nbash sync-file-list-parallel.sh\n

During this phase, staging is rsynced with production, the file list is updated, and the full time list is also updated to allow mirrors to know that the repositories have been updated and that they can sync.

Note: If multiple releases are being updated, it is important to run the syncs to completion before running the file list parallel script.

"},{"location":"sop/sop_compose_8/#quicker-composes","title":"Quicker Composes","text":"

On the designated compose box, there is a script that can do all of the incremental steps.

cd /root/cron\nbash stable-updates\n

The same goes for a full production.

bash stable\n
"},{"location":"sop/sop_compose_sig/","title":"SOP: Compose and Repo Sync for Rocky Linux Special Interest Groups","text":"

This SOP covers how the Rocky Linux Release Engineering Team handles composes and repository syncs for Special Interest Groups.

"},{"location":"sop/sop_compose_sig/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"sop/sop_compose_sig/#composing-repositories","title":"Composing Repositories","text":""},{"location":"sop/sop_compose_sig/#mount-structure","title":"Mount Structure","text":"

There is a designated system that takes care of composing repositories. These systems contain the necessary EFS/NFS mounts for the staging and production repositories as well as composes.

  • /mnt/compose -> Compose data
  • /mnt/repos-staging -> Staging
  • /mnt/repos-production -> Production
"},{"location":"sop/sop_compose_sig/#empanadas","title":"Empanadas","text":"

Each repository or set of repositories are controlled by various comps and pungi configurations that are translated into peridot. Empanadas is used to run a reposync from peridot's yumrepofs repositories, generate ISO's, and create a pungi compose look-a-like. Because of this, the comps and pungi-rocky configuration is not referenced with empanadas.

"},{"location":"sop/sop_compose_sig/#running-a-compose","title":"Running a Compose","text":"

First, the toolkit must be cloned. In the iso/empanadas directory, run poetry install. You'll then have access to the various commands needed:

  • sync-sig

To perform a compose of a SIG, it must be defined in the configuration. As an example, here is composing the core sig.

# This creates a brand new directory under /mnt/compose/X and symlinks it to latest-SIG-Y-X\n~/.local/bin/poetry run sync-sig --release 9 --sig core --hashed --clean-old-packages --full-run\n\n# This assumes the directories already exist and will update in place.\n~/.local/bin/poetry run sync-sig --release 9 --sig core --hashed --clean-old-packages\n
"},{"location":"sop/sop_compose_sig/#syncing-composes","title":"Syncing Composes","text":"

Syncing utilizes the sync scripts provided in the release engineering toolkit.

When the scripts are being ran, they are usually ran with a specific purpose, as each major version may be different.

For SIG's, the only files you'll need to know of are sync-to-staging-sig.sh and sync-to-prod-sig.sh. Both scripts will delete packages and data that are no longer in the compose.

# The below syncs the core 8 repos to staging\nRLVER=8 bash sync-to-staging-sig.sh core\n# The below syncs the core 9 repos to staging\nRLVER=9 bash sync-to-staging-sig.sh core\n\n# The below syncs everything in staging for 8 core to prod\nRLVER=8 bash sync-to-prod-sig.sh core\n\n# The below syncs everything in staging for 9 core to prod\nRLVER=9 bash sync-to-prod-sig.sh core\n

Once staging is completed and reviewed, it is synced to production.

bash sync-file-list-parallel.sh\n

During this phase, staging is rsynced with production, the file list is updated, and the full time list is also updated to allow mirrors to know that the repositories have been updated and that they can sync.

"},{"location":"sop/sop_mirrormanager2/","title":"Mirror Manager Maintenance","text":"

This SOP contains most if not all the information needed for SIG/Core to maintain and operate Mirror Manager for Rocky Linux.

"},{"location":"sop/sop_mirrormanager2/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact infrastructure@rockylinux.org Email Contact releng@rockylinux.org Mattermost Contacts @label @neil @tgo Mattermost Channels ~Infrastructure"},{"location":"sop/sop_mirrormanager2/#introduction","title":"Introduction","text":"

So you made a bad decision and now have to do things to Mirror Manager. Good luck.

"},{"location":"sop/sop_mirrormanager2/#pieces","title":"Pieces","text":"Item Runs on... Software Mirrorlist Server mirrormanager001 https://github.com/adrianreber/mirrorlist-server/ Mirror Manager 2 mirrormanager001 https://github.com/fedora-infra/mirrormanager2"},{"location":"sop/sop_mirrormanager2/#mirrorlist-server","title":"Mirrorlist Server","text":"

This runs two (2) instances. Apache/httpd is configured to send /mirrorlist to one and /debuglist to the other.

  • Every fifteen (15) minutes: Mirrorlist cache is regenerated

    • This queries the database for active mirrors and other information and writes a protobuf. The mirrorlist-server reads the protobuf and responds accordingly.
  • Every twenty (20) minutes: Service hosting /mirrorlist is restarted

  • Every twenty-one (21) minutes: Service hosting /debuglist is restarted

Note that the timing for the restart of the mirror list instances are arbitrary.

"},{"location":"sop/sop_mirrormanager2/#mirror-manager-2","title":"Mirror Manager 2","text":"

This is a uwsgi service fronted by an apache/httpd instance. This is responsible for everything else that is not /mirrorlist or /debuglist. This allows the mirror managers to, well, manage their mirrors.

"},{"location":"sop/sop_mirrormanager2/#cdn","title":"CDN","text":"

Fastly sits in front of mirror manager. VPN is required to access the /admin endpoints.

If the backend of the CDN is down, it will attempt to guess what the user wanted to access and spit out a result on the dl.rockylinux.org website. For example, a request for AppStream-8 and x86_64 will result in a AppStream/x86_64/os directory on dl.rockylinux.org. Note that this isn't perfect, but it helps in potential down time or patching.

Fastly -> www firewall -> mirrormanager server\n

In reality, the flow is a lot more complex, and a diagram should be created to map it out in a more user-friendly manner (@TODO)

User -> Fastly -> AWS NLB over TLS, passthru -> www firewall cluster (decrypt TLS) -> mirrormanager server (Rocky CA TLS)\n
"},{"location":"sop/sop_mirrormanager2/#tasks","title":"Tasks","text":"

Below are a list of possible tasks to take with mirror manager, depending on the scenario.

"},{"location":"sop/sop_mirrormanager2/#new-release","title":"New Release","text":"

For the following steps, the following must be completed:

  • Production rsync endpoints should have all brand new content
  • New content root should be locked down to 750 (without this, mirror manager cannot view it)
  • Disable mirrormanager user cronjobs

  • Update the database with the new content. This is run on a schedule normally (see previous section) but can be done manually.

    a. As the mirror manager user, run the following:

/opt/mirrormanager/scan-primary-mirror-0.4.2/target/debug/scan-primary-mirror --debug --config $HOME/scan-primary-mirror.toml --category 'Rocky Linux'\n/opt/mirrormanager/scan-primary-mirror-0.4.2/target/debug/scan-primary-mirror --debug --config $HOME/scan-primary-mirror.toml --category 'Rocky Linux SIGs'\n
  1. Update the redirects for $reponame-$releasever

    a. Use psql to mirrormanager server: psql -U mirrormanager -W -h mirrormanager_db_host mirrormanager_db

    b. Confirm that all three columns are filled and that the second and third columns are identical:

    select rr.from_repo AS \"From Repo\", rr.to_repo AS \"To Repo\", r.prefix AS \"Target Repo\" FROM repository_redirect AS rr LEFT JOIN repository AS r ON rr.to_repo = r.prefix GROUP BY r.prefix, rr.to_repo, rr.from_repo ORDER BY r.prefix ASC;`\n

    c. Change the majorversion redirects to point to the new point release, for example:

    update repository_redirect set to_repo = regexp_replace(to_repo, '9\\.2', '9.3') where from_repo ~ '(\\w+)-9-(debug|source)';`\n

    d. Insert new redirects for the major version expected by the installer

    insert into repository_redirect (from_repo,to_repo) select REGEXP_REPLACE(rr.from_repo,'9\\.2','9.3'),REGEXP_REPLACE(rr.to_repo,'9\\.2','9.3')FROM repository_redirect AS rr WHERE from_repo ~ '(\\w+)-9.2';\n
  2. Generate the mirrorlist cache and restart the debuglist and verify.

Once the bitflip is initiated, restart mirrorlist and reenable all cronjobs.

"},{"location":"sop/sop_mirrormanager2/#out-of-date-mirrors","title":"Out-of-date Mirrors","text":"
  1. Get current shasum of repomd.xml. For example: shasum=$(curl https://dl.rockylinux.org/pub/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum)
  2. Compare against latest propagation log:
tail -latr /var/log/mirrormanager/propagation/rocky-9.3-BaseOS-x86_64_propagation.log.*`\n\nexport VER=9.3\nawk -v shasum=$(curl -s https://dl.rockylinux.org/pub/rocky/$VER/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum | awk '{print $1}') -F'::' '{split($0,data,\":\")} {if ($4 != shasum) {print data[5], data[6], $2, $7}}' < $(find /var/log/mirrormanager/propagation/ -name \"rocky-${VER}-BaseOS-x86_64_propagation.log*\" -mtime -1 | tail -1)'\n

This will generate a table. You can take the IDs in the first column and use the database to disable them by ID (table name: hosts) or go to https://mirrors.rockylinux.org/mirrormanager/host/ID and uncheck 'User active'.

Users can change user active, but they cannot change admin active. It is better to flip user active in this case.

Admins can also view https://mirrors.rockylinux.org/mirrormanager/admin/all_sites if necessary.

Example of table columns:

Note

These mirrors are here soley as an example and not to call anyone out, every mirror shows up on here at one point, for some reason, due to natural variations in how mirrors sync.

[mirrormanager@ord1-prod-mirrormanager001 propagation]$ awk -v shasum=$(curl -s https://dl.rockylinux.org/pub/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum | awk '{print $1}') -F'::' '{split($0,data,\":\")} {if ($4 != shasum) {print data[5], data[6], $2, $7}}' < rocky-9.3-BaseOS-x86_64_propagation.log.1660611632 | column -t\n164  mirror.host.ag            http://mirror.host.ag/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml             404\n173  rocky.centos-repo.net     http://rocky.centos-repo.net/9.3/BaseOS/x86_64/os/repodata/repomd.xml            403\n92   rocky.mirror.co.ge        http://rocky.mirror.co.ge/9.3/BaseOS/x86_64/os/repodata/repomd.xml               404\n289  mirror.vsys.host          http://mirror.vsys.host/rockylinux/9.3/BaseOS/x86_64/os/repodata/repomd.xml      404\n269  mirrors.rackbud.com       http://mirrors.rackbud.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml        200\n295  mirror.ps.kz              http://mirror.ps.kz/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml               200\n114  mirror.liteserver.nl      http://rockylinux.mirror.liteserver.nl/9.3/BaseOS/x86_64/os/repodata/repomd.xml  200\n275  mirror.upsi.edu.my        http://mirror.upsi.edu.my/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml         200\n190  mirror.kku.ac.th          http://mirror.kku.ac.th/rocky-linux/9.3/BaseOS/x86_64/os/repodata/repomd.xml     404\n292  mirrors.cat.pdx.edu       http://mirrors.cat.pdx.edu/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml        200\n370  mirrors.gbnetwork.com     http://mirrors.gbnetwork.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml      404\n308  mirror.ihost.md           http://mirror.ihost.md/rockylinux/9.3/BaseOS/x86_64/os/repodata/repomd.xml       404\n87   mirror.freedif.org        http://mirror.freedif.org/Rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml         404\n194  mirrors.bestthaihost.com  http://mirrors.bestthaihost.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml   404\n30   mirror.admax.se           http://mirror.admax.se/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml            200\n195  mirror.uepg.br            http://mirror.uepg.br/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml             404\n247  mirrors.ipserverone.com   http://mirrors.ipserverone.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml    404'\n
"},{"location":"sop/sop_release/","title":"Rocky Release Procedures for SIG/Core (RelEng/Infrastructure)","text":"

This SOP contains all the steps required by SIG/Core (a mix of Release Engineering and Infrastructure) to perform releases of all Rocky Linux versions. Work is in all collaboration within the entire group of engineerings.

"},{"location":"sop/sop_release/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact infrastructure@rockylinux.org Email Contact releng@rockylinux.org Mattermost Contacts @label @neil @tgo @skip77 @mustafa @sherif @pgreco Mattermost Channels ~Infrastructure"},{"location":"sop/sop_release/#preparation","title":"Preparation","text":""},{"location":"sop/sop_release/#notes-about-release-day","title":"Notes about Release Day","text":"

Within a minimum of two (2) days, the following should be true:

  1. Torrents should be setup. All files can be synced with the seed box(es) but not yet published. The data should be verified using sha256sum and compared to the CHECKSUM files provided with the files.

  2. Website should be ready (typically with an open PR in github). The content should be verified that the design and content are correct and finalized.

  3. Enough mirrors should be setup. This essentially means that all content for a release should be synced to our primary mirror with the executable bit turned off, and the content should also be hard linked. In theory, mirror manager can be queried to verify if mirrors are or appear to be in sync.

"},{"location":"sop/sop_release/#notes-about-patch-days","title":"Notes about Patch Days","text":"

Within a minimum of one (1) to two (2) days, the following should be true:

  1. Updates should be completed in the build system, and verified in staging.

  2. Updates should be sent to production and file lists updated to allow mirrors to sync.

"},{"location":"sop/sop_release/#prior-to-release-day-notes","title":"Prior to Release Day notes","text":"

Ensure the SIG/Core Checklist is read thoroughly and executed as listed.

"},{"location":"sop/sop_release/#release-day","title":"Release Day","text":""},{"location":"sop/sop_release/#priorities","title":"Priorities","text":"

During release day, these should be verified/completed in order:

  1. Website - The primary website and user landing at rockylinux.org should allow the user to efficiently click through to a download link of an ISO, image, or torrent. It must be kept up.

  2. Torrent - The seed box(es) should be primed and ready to go for users downloading via torrent.

  3. Release Notes & Documentation - The release notes are often on the same website as the documentation. The main website and where applicable in the docs should refer to the Release Notes of Rocky Linux.

  4. Wiki - If applicable, the necessary changes and resources should be available for a release. In particular, if a major release has new repos, changed repo names, this should be documented.

  5. Everything else!

"},{"location":"sop/sop_release/#resources","title":"Resources","text":""},{"location":"sop/sop_release/#sigcore-checklist","title":"SIG/Core Checklist","text":""},{"location":"sop/sop_release/#beta","title":"Beta","text":"
  • Compose Completed
  • Repoclosure must be checked and pass
  • Lorax Run
  • ISO's are built
  • Cloud Images built
  • Live Images built
  • Compose Synced to Staging
  • AWS/Azure Images in Marketplace
  • Vagrant Images
  • Container Images
  • Mirror Manager

    • Ready to Migrate from previous beta release (rltype=beta)
    • Boot image install migration from previous beta release
  • Pass image to Testing Team for final validation

"},{"location":"sop/sop_release/#release-candidate","title":"Release Candidate","text":"
  • Compose Completed
  • Repoclosure must be checked and pass
  • Lorax Run
  • ISO's are built
  • Cloud Images built
  • Live Images built
  • Compose Synced to Staging
  • AWS/Azure Images in Marketplace
  • Vagrant Images
  • Container Images
  • Mirror Manager

    • Ready to Migrate from previous release
    • Boot image install migration from previous release
  • Pass image to Testing Team for validation

"},{"location":"sop/sop_release/#final","title":"Final","text":"
  • Compose Completed
  • Repoclosure must be checked and pass
  • Lorax Run
  • ISO's are built
  • Cloud Images built
  • Live Images built
  • Compose Synced to Staging
  • AWS/Azure Images in Marketplace
  • Vagrant Images
  • Container Images
  • Mirror Manager

    • Ready to Migrate from previous release
    • Boot image install migration from previous release
  • Pass image to Testing Team for final validation

  • Sync to Production
  • Sync to Europe Mirror if applicable
  • Hardlink Run
  • Bitflip after 24-48 Hours
Resources Account ServicesGit (RESF Git Service)Git (Rocky Linux GitHub)Git (Rocky Linux GitLab)Mail ListsContacts

URL: https://accounts.rockylinux.org

Purpose: Account Services maintains the accounts for almost all components of the Rocky ecosystem

Technology: Noggin used by Fedora Infrastructure

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

URL: https://git.resf.org

Purpose: General projects, code, and so on for the Rocky Enterprise Software Foundation.

Technology: Gitea

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://github.com/rocky-linux

Purpose: General purpose code, assets, and so on for Rocky Linux. Some content is mirrored to the RESF Git Service.

Technology: GitHub

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://git.rockylinux.org

Purpose: Packages and light code for the Rocky Linux distribution

Technology: GitLab

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://lists.resf.org

Purpose: Users can subscribe and interact with various mail lists for the Rocky ecosystem

Technology: Mailman 3 + Hyper Kitty

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

Name Email Mattermost Name IRC Name Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Skip Grube skip@rockylinux.org @skip77 Sherif Nagy sherif@rockylinux.org @sherif Pablo Greco pgreco@rockylinux.org @pgreco pgreco Neil Hanlon neil@resf.org @neil neil Taylor Goodwill tg@resf.org @tgo tg"},{"location":"sop/sop_upstream_prep_checklist/","title":"Generalized Prep Checklist for Upcoming Releases","text":"

This SOP contains general checklists required by SIG/Core to prepare and plan for the upcoming release. This work, in general, is required to be done on a routine basis, even months out before the next major or minor release, as it requires monitoring of upstream's (CentOS Stream) work to ensure Rocky Linux will remain ready and compatible with Red Hat Enterprise Linux.

"},{"location":"sop/sop_upstream_prep_checklist/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact infrastructure@rockylinux.org Email Contact releng@rockylinux.org Mattermost Contacts @label @neil @tgo @skip77 @mustafa @sherif @pgreco Mattermost Channels ~Infrastructure"},{"location":"sop/sop_upstream_prep_checklist/#general-upstream-monitoring","title":"General Upstream Monitoring","text":"

It is expected to monitor the following repositories upstream, as these will indicate what is coming up for a given major or point release. These repositories are found at the Red Hat gitlab.

  • centos-release
  • centos-logos
  • pungi-centos
  • comps
  • module-defaults

These repositories can be monitored by setting to \"all activity\" on the bell icon.

Upon changes to the upstream repositories, SIG/Core member should analyze the changes and apply the same to the lookahead branches:

  • rocky-release

    • Manual changes required
  • rocky-logos

    • Manual changes required
  • pungi-rocky

    • Run sync-from-upstream
  • peridot-rocky

    • Configurations are generated using peridot tools
  • comps

    • Run sync-from-upstream
  • rocky-module-defaults

    • Run sync-from-upstream
"},{"location":"sop/sop_upstream_prep_checklist/#general-downward-merging","title":"General Downward Merging","text":"

Repositories that generally track for LookAhead and Beta releases will flow downward to the stable branch. For example:

* rXs / rXlh\n      |\n      |----> rX-beta\n                |\n                |----> rX\n

This applies to any specific rocky repo, such as comps, pungi, peridot-config, and so on. As it is expected some repos will deviate in commit history, it is OK to force push, under the assumption that changes made in the lower branch exists in the upper branch. That way you can avoid changes/functionality being reverted on accident.

"},{"location":"sop/sop_upstream_prep_checklist/#general-package-patching","title":"General Package Patching","text":"

There are packages that are patched typically for the purpose of debranding. List of patched packages are typically maintained in a metadata repository. The obvious ones are listed below and should be monitored and maintained properly:

  • abrt
  • anaconda
  • anaconda-user-help
  • chrony
  • cockpit
  • dhcp
  • dnf
  • firefox
  • fwupd
  • gcc
  • gnome-session
  • gnome-settings-daemon
  • grub2
  • initial-setup
  • kernel
  • kernel-rt
  • libdnf
  • libreoffice
  • libreport
  • lorax-templates-rhel
  • nginx
  • opa-ff
  • opa-fm
  • openldap
  • openscap
  • osbuild
  • osbuild-composer
  • PackageKit
  • pesign
  • python-pip
  • redhat-rpm-config
  • scap-security-guide
  • shim
  • shim-unsigned-x64
  • shim-unsigned-aarch64
  • subscription-manager
  • systemd
  • thunderbird
"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Release Engineering (SIG/Core) Wiki","text":""},{"location":"#about","title":"About","text":"

The Rocky Linux Release Engineering Team (also known as SIG/Core) dedicates themselves to the development, building, management, production, and release of Rocky Linux. This group combines development and infrastructure in a single, cohesive unit of individuals that ultimately make the distribution happen.

The \"SIG/Core\" reference name is not a strict Special Interest Group (as defined by the Rocky Linux wiki).

The general goals (or \"interests\") is:

  • To ensure Rocky Linux is built and released in a complete and functional manner
  • To ensure proper collaboration and development of the Peridot Build System
  • To ensure all users, developers, and Special Interest Groups are have a solid, stable platform to build upon
"},{"location":"#mission","title":"Mission","text":"

Release Engineering strives to ensure a stable distribution is developed, built, tested, and provided to the community from the RESF as a compatible derivative of Red Hat Enterprise Linux. To achieve this goal, some of the things we do are:

  • Ensuring a quality and fully compatible release product
  • Developing and iterating on the build systems and architecture
  • Developing all code in the open
  • Setting the technical direction for the build system architecture
  • Release of beta and final products to the end users and mirrors
  • Release of timely updates to the end users and mirrors

See the What We Do page for a more detailed explanation of our activities.

"},{"location":"#getting-in-touch-contributing","title":"Getting In Touch / Contributing","text":"

There are various ways to get in touch with Release Engineering and provide help, assistance, or even just ideas that can benefit us or the entire community.

  • Chat

    • Mattermost: ~development on Mattermost
    • IRC: #rockylinux and #rockylinux-devel on libera.chat
  • RESF SIG/Core Issue Tracker

  • Mail List

For a list of our members, see the Members page.

"},{"location":"#resources-and-rocky-linux-policies","title":"Resources and Rocky Linux Policies","text":"
  • RESF Git Service
  • Rocky Linux GitHub
  • Rocky Linux GitLab
  • Rocky Linux Image Guide
  • Rocky Linux Repository Guide
  • Rocky Linux Release Version Guide/Policy
  • Special Interest Groups.
"},{"location":"#general-packaging-resources","title":"General Packaging Resources","text":"
  • RPM Packaging Guide
  • Fedora Packaging Guidelines
  • Basic Packaging Tutorial
"},{"location":"members/","title":"Members","text":"

Release Engineering (SIG/Core) is a mix of Development and Infrastructure members to ensure a high quality release of Rocky Linux as well as the uptime of the services provided to the community. The current members of this group are listed in the table below. Some members may also be found in various Special Interest Groups, such as SIG/AltArch and SIG/Kernel.

Role Name Email Mattermost Name IRC Name Affiliation Release Engineering Co-Lead and Infrastructure Louis Abel label@rockylinux.org @label Sokel/label/Sombra Independent Release Engineering Co-Lead Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Independent Release Engineering and Development Skip Grube skip@rockylinux.org @skip77 CIQ Release Engineering and Development Sherif Nagy sherif@rockylinux.org @sherif Independent Release Engineering and Development Pablo Greco pgreco@rockylinux.org @pgreco pgreco Independent Infrastructure Lead Neil Hanlon neil@resf.org @neil neil CIQ Infrastructure Lead Taylor Goodwill tg@resf.org @tgo tg Independent

Note

Some members of Release Engineering may be affiliated with a sponsor of the Rocky Linux project or the Rocky Enterprise Software Foundation, as such they are listed here for transparency.

Independent members are those who are not affiliated with any sponsor of the project or foundation.

"},{"location":"what_we_do/","title":"What We Do","text":"

Release Engineering (SIG/Core) was brought together as a combination of varying expertise (development and infrastructure) to try to fill in gaps of knowledge but to also to ensure that the primary goal of having a stable release of Rocky Linux is reached.

Some of the things we do in pursuit of our mission goals:

  • Continuous preparation for upcoming changes from upstream (Fedora and CentOS Stream)
  • Distribution release and maintenance
  • Design and collaboration for the Peridot build system
  • Design and development work to integrate all components together
  • Maintenance of the infrastructure used to build and maintain Rocky Linux (such as ansible roles and playbooks)
  • Working with the testing team with images and a platform to test
  • Providing resources for Special Interest Groups
  • Providing assistance and resources for users within the community to meet their goals

\"Why the name SIG/Core?\"

While not an actual Special Interest Group, the reality is that Release Engineering is ultimately the \"core\" of Rocky Linux's production. The idea of \"SIG/Core\" stemmed from the thought that without this group, Rocky Linux would not exist as it is now, so we are \"core\" to its existence. The other idea was that SIG/Core would eventually branch out to elsewhere. Where this would go, it is uncertain.

"},{"location":"documentation/","title":"Release General Overview","text":"

This section goes over at a high level how we compose releases for Rocky Linux. As most of our tools are home grown, we have made sure that the tools are open source and in our git services.

This page should serve as an idea of the steps we generally take and we hope that other projects out there who wish to also use our tools can make sure they can use them in this same way, whether they want to be an Enterprise Linux derivative or another project entirely.

"},{"location":"documentation/#build-system-and-tools","title":"Build System and Tools","text":"

The tools in use for the distribution are in the table below.

Tool Maintainer Code Location srpmproc SIG/Core at RESF GitHub empanadas SIG/Core at RESF sig-core-toolkit Peridot SIG/Core at RESF GitHub MirrorManager 2 Fedora Project MirrorManager2

For Rocky Linux to be build, we use Peridot as the build system and empanadas to \"compose\" the distribution. As we do not use Koji for Rocky Linux beyond version 9, pungi can no longer be used. Peridot instead takes pungi configuration data and comps and transforms them into a format it can understand. Empanadas then comes in to do the \"compose\" and sync all the repositories down.

"},{"location":"documentation/#full-compose-major-or-minor-releases","title":"Full Compose (major or minor releases)","text":"

Step by step, it looks like this:

  • Distribution is built and maintained in Peridot
  • Comps and pungi configuration is converted into the peridot format for the project
  • Repositories are created in yumrepofs based on the configuration provided
  • A repoclosure is ran against the repositories from empanadas to ensure there are no critical issues
  • In Parallel:

    • Repositories are synced as a \"full run\" in empanadas
    • Lorax is ran using empanadas in the peridot cluster
  • Lorax results are pulled down from an S3 bucket

  • DVD images are built for each architecture
  • Compose directory is synced to staging for verification
  • Staging is synced to production to allow mirror syncing
  • Bit flip on release day
"},{"location":"documentation/#general-updates","title":"General Updates","text":"

Step by step, it looks like this:

  • Distribution is maintained in Peridot
  • Updates are built, repos are then \"hashed\" in yumrepofs
  • Empanadas syncs updates as needed, either per repo or all repos at once
  • Updates are synced to staging to be verified
  • Staging is synced to production to allow mirror syncing
"},{"location":"documentation/empanadas/","title":"Empanadas","text":"

This page goes over empanadas, which is part of the SIG/Core toolkit. Empanadas assists SIG/Core is composing repositories, creating ISO's, creating images, and various other activities in Rocky Linux. It is also used for general testing and debugging of repositories and its metadata.

"},{"location":"documentation/empanadas/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact releng@rockylinux.org Mattermost Contacts @label @neil Mattermost Channels ~Development"},{"location":"documentation/empanadas/#general-information","title":"General Information","text":"

empanadas is a python project using poetry, containing various built-in modules with the goal to try to emulate the Fedora Project's pungi to an extent. While it is not perfect, it achieves the very basic goals of creating repositories, images and ISO's for consumption by the end user. It also has interactions with peridot, the build system used by the RESF to build the Rocky Linux distribution.

For performing syncs, it relies on the use of podman to perform syncing in a parallel fashion. This was done because it is not possible to run multiple dnf transactions at once on a single system and looping one repository at a time is not sustainable (nor fast).

"},{"location":"documentation/empanadas/#requirements","title":"Requirements","text":"
  • Poetry must be installed on the system
  • Podman must be installed on the system
  • fpart must be installed on the system (available in EPEL on EL systems)
  • Enough storage should be available if repositories are being synced
  • mock must be installed if building live images
  • System must be an Enterprise Linux system or Fedora with the %rhel macro set
"},{"location":"documentation/empanadas/#features","title":"Features","text":"

As of this writing, empanadas has the following abilities:

  • Repository syncing via dnf from a peridot instance or applicable repos
  • Per profile dnf repoclosure checking for all applicable repos
  • Per profile dnf repoclosure checking for peridot instance repositories
  • Basic ISO Building via lorax
  • Extra ISO Building via xorriso for DVD and minimal images
  • Live ISO Building using livemedia-creator and mock
  • Anaconda treeinfo builder
  • Cloud Image builder
"},{"location":"documentation/empanadas/#installing-empanadas","title":"Installing Empanadas","text":"

The below is how to install empanadas from the development branch on a Fedora system.

% dnf install git podman fpart poetry mock -y\n% git clone https://git.resf.org/sig_core/toolkit.git -b devel\n% cd toolkit/iso/empanadas\n% poetry install\n
"},{"location":"documentation/empanadas/#configuring-empanadas","title":"Configuring Empanadas","text":"

Depending on how you are using empanadas will depend on how your configurations will be setup.

  • empanadas/common.py
  • empanadas/config/*.yaml
  • empanadas/sig/*.yaml

These configuration files are delicate and can control a wide variety of the moving parts of empanadas. As these configurations are fairly massive, we recommend checking the reference guides for deeper details into configuring for base distribution or \"SIG\" content.

"},{"location":"documentation/empanadas/#using-empanadas","title":"Using Empanadas","text":"

The most common way to use empanadas is to sync repositories from a peridot instance. This is performed upon each release or on each set of updates as they come from upstream. Below lists how to use empanadas, as well as the common options.

Note that for each of these commands, it is fully expected you are running poetry run in the root of empanadas.

# Syncs all repositoryes for the \"9\" release\n% poetry run sync-from-peridot --release 9 --clean-old-packages\n\n# Syncs only the BaseOS repository without syncing sources\n% poetry run sync-from-peridot --release 9 --clean-old-packages --repo BaseOS --ignore-source\n\n# Syncs only AppStream for ppc64le\n% poetry run sync-from-peridot --release 9 --clean-old-packages --repo AppStream --arch ppc64le\n
Resources Account ServicesGit (RESF Git Service)Git (Rocky Linux GitHub)Git (Rocky Linux GitLab)Mail ListsContacts

URL: https://accounts.rockylinux.org

Purpose: Account Services maintains the accounts for almost all components of the Rocky ecosystem

Technology: Noggin used by Fedora Infrastructure

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

URL: https://git.resf.org

Purpose: General projects, code, and so on for the Rocky Enterprise Software Foundation.

Technology: Gitea

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://github.com/rocky-linux

Purpose: General purpose code, assets, and so on for Rocky Linux. Some content is mirrored to the RESF Git Service.

Technology: GitHub

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://git.rockylinux.org

Purpose: Packages and light code for the Rocky Linux distribution

Technology: GitLab

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://lists.resf.org

Purpose: Users can subscribe and interact with various mail lists for the Rocky ecosystem

Technology: Mailman 3 + Hyper Kitty

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

Name Email Mattermost Name IRC Name Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Skip Grube skip@rockylinux.org @skip77 Sherif Nagy sherif@rockylinux.org @sherif Pablo Greco pgreco@rockylinux.org @pgreco pgreco Neil Hanlon neil@resf.org @neil neil Taylor Goodwill tg@resf.org @tgo tg"},{"location":"documentation/peridot/","title":"Peridot Build System","text":"

This page goes over the Peridot Build System and how SIG/Core utilizes it.

More to come.

"},{"location":"documentation/rebuild/","title":"Rebuild Version Bump","text":"

In some cases, a package has to be rebuilt. A package may be rebuilt for these reasons:

  • Underlying libraries have been rebased
  • ABI changes that require a rebuild (mass rebuilds, though they are rare)
  • New architecture added to a project

This typically applies to packages being built from a given src subgroup. Packages pulled from upstream don't fall into this category in normal circumstances. In those cases, they receive .0.1 and so on as standalone rebuilds.

"},{"location":"documentation/compose/","title":"Composing and Managing Releases","text":"

This section goes over the process of composing a release from a bunch of packages to repositories, to images. This section also goes over the basics of working with koji when necessary.

"},{"location":"documentation/compose/koji/","title":"Updates and Management in Koji, A Manual","text":"

More to come.

"},{"location":"documentation/guidelines/","title":"Guidelines","text":"

This section is primarily for documentation and useful information as it pertains to guidelines for various packages or asset usage.

Release Engineering has the final \"go/no-go\" decision on submissions, assets, images, and the general structure of the release of Rocky Linux.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/","title":"Rocky Logos Package Guidelines","text":"

This page goes over the basic guidelines for the rocky-logos package, which produces assets for anaconda, wallpapers, and other assets for the distribution.

Release Engineering has the final \"go/no-go\" decision on submissios/assets/images in the package.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#rocky-logo-assets","title":"Rocky Logo Assets","text":"

In various parts of the package, the Rocky logo will need to exist in multiple forms:

  • Green variant
  • White variant

This can be in the form of PNG, JPG, or SVG files.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#anaconda","title":"anaconda","text":"

All anaconda image assets will be in PNG form. Backgrounds should be transparent with the exception of rnotes if applicable.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#backgrounds","title":"Backgrounds","text":"

See Backgrounds Section

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#fedora","title":"fedora","text":"

SVG format of logo assets as fedora_logo (color) and fedora_logo_darkbackground (white), and a default as fedora_logo.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#firstboot","title":"firstboot","text":"

First boot assets. This is generally the sidebar (like the anaconda installer) and a workstation icon. PNG format.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#iconshicolor","title":"icons/hicolor","text":"

Rocky icons will appear here in different resolutions and must be in PNG or SVG format:

  • 16x16/apps: PNG, system-logo-icon, fedora-logo-icon
  • 22x22/apps: PNG, system-logo-icon, fedora-logo-icon
  • 24x24/apps: PNG, system-logo-icon, fedora-logo-icon
  • 32x32/apps: PNG, system-logo-icon, fedora-logo-icon
  • 36x36/apps: PNG, system-logo-icon, fedora-logo-icon
  • 48x48/apps: PNG, system-logo-icon, fedora-logo-icon
  • 96x96/apps: PNG, system-logo-icon, fedora-logo-icon
  • 256x256/apps: PNG, system-logo-icon, fedora-logo-icon
  • scalable/apps: SVG, fedora-logo-icon, org.fedoraproject.AnacondaInstaller.svg, start-here.svg, xfce4_xicon1.svg
  • symbolic/apps: SVG, org.fedoraproject.AnacondaInstaller-symbolic
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#ipa","title":"ipa","text":"

IPA specific assets, usually text. They are generally PNG or JPG:

  • header-logo.png - Text
  • login-screen-background.jpg - No text
  • login-screen-logo.png - Logo + Text
  • product-name.png - Text
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#pixmaps","title":"pixmaps","text":"

PNG format, these are usually assets used within GNOME, GDM, and other desktop environments.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#plymouthcharge","title":"plymouth/charge","text":"

Typically unchanged and is for the plymouth loading screen

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#svg","title":"svg","text":"

SVG format of logo assets as fedora_logo (color) and fedora_logo_darkbackground (white)

color file dictates background color if applicable

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#testpage","title":"testpage","text":"

index.html for httpd/nginx/etc

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#backgroundswallpapers","title":"Backgrounds/Wallpapers","text":""},{"location":"documentation/guidelines/rocky_logos_guidelines/#structure","title":"Structure","text":"

Wallpapers appear in PNG format with a backing XML file to list out all available resolutions if applicable, as well as defaults.

A defaults file looks at every other XML that is a default background provided by the backgrounds package and default options if applicable.

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE wallpapers SYSTEM \"gnome-wp-list.dtd\">\n<wallpapers>\n    <wallpaper deleted=\"false\">\n        <name>Rocky Linux 9 Default Background - Placeholder Mesh</name>\n        <filename>/usr/share/backgrounds/rocky-default-1-mesh.xml</filename>\n        <options>zoom</options>\n        <author>Louis Abel</author>\n        <email>label@rockylinux.org</email>\n        <license>CC-BY-SA 4.0</license>\n    </wallpaper>\n    <wallpaper deleted=\"false\">\n        <name>Rocky Linux 9 Default Background - Placeholder Target</name>\n        <filename>/usr/share/backgrounds/rocky-default-1-target.xml</filename>\n        <options>zoom</options>\n        <author>Louis Abel</author>\n        <email>label@rockylinux.org</email>\n        <license>CC-BY-SA 4.0</license>\n    </wallpaper>\n</wallpapers>\n

The wallpaper itself will list every applicable variant of that background if applicable.

<background>\n  <starttime>\n    <year>2021</year>\n    <month>10</month>\n    <day>29</day>\n    <hour>19</hour>\n    <minute>21</minute>\n    <second>19</second>\n  </starttime>\n\n<static>\n<duration>10000000000.0</duration>\n<file>\n  <!-- Wide 16:9 -->\n  <size width=\"1920\" height=\"1080\">/usr/share/backgrounds/rocky-default-1-mesh-16-9.png</size>\n  <!-- Wide 16:10 -->\n  <size width=\"1920\" height=\"1200\">/usr/share/backgrounds/rocky-default-1-mesh-16-10.png</size>\n  <!-- Standard 4:3 -->\n  <size width=\"2048\" height=\"1536\">/usr/share/backgrounds/rocky-default-1-mesh-4-3.png</size>\n  <!-- Normalish 5:4 -->\n  <size width=\"1280\" height=\"1024\">/usr/share/backgrounds/rocky-default-1-mesh-5-4.png</size>\n</file>\n</static>\n</background>\n

Day/Night Wallpapers have a similar configuration.

<background>\n  <starttime>\n    <year>2022</year>\n    <month>01</month>\n    <day>01</day>\n    <hour>8</hour>\n    <minute>00</minute>\n    <second>00</second>\n  </starttime>\n<!-- This animation will start at 8 AM. -->\n\n<!-- We start with day at 8 AM. It will remain up for 10 hours. -->\n<static>\n<duration>36000.0</duration>\n<file>/usr/share/backgrounds/rocky-default-1-mesh-day.png</file>\n</static>\n\n<!-- Day ended and starts to transition to night at 6 PM. The transition lasts for 2 hours, ending at 8 PM. -->\n<transition type=\"overlay\">\n<duration>7200.0</duration>\n<from>/usr/share/backgrounds/rocky-default-1-mesh-day.png</from>\n<to>/usr/share/backgrounds/rocky-default-1-mesh-night.png</to>\n</transition>\n\n<!-- It's 8 PM, we're showing the night till 6 AM. -->\n<static>\n<duration>36000.0</duration>\n<file>/usr/share/backgrounds/rocky-default-1-mesh-night.png</file>\n</static>\n\n<!-- It's 6 AM, and we're starting to transition to day. Transition completes at 8 AM. -->\n<transition type=\"overlay\">\n<duration>7200.0</duration>\n<from>/usr/share/backgrounds/rocky-default-1-mesh-night.png</from>\n<to>/usr/share/backgrounds/rocky-default-1-mesh-day.png</to>\n</transition>\n\n</background>\n
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#guidelines","title":"Guidelines","text":"

This section goes over the general guidelines for the main backgrounds included in the distribution.

Note: It is highly recommended and encouraged that a submission should be the highest resolution as noted below. See the note on minimum resolutions.

  • General Theme: Each Rocky release has a codename, and thus is the general theme. Examples.
    • Rocky 8: Green Obsidian - Submissions only to extras
    • Rocky 9: Blue Onyx - This should be generally a blue theme/color scheme. Submissions only to extras.
    • Rocky 10: Red Quartz - This should be generally a red-like theme/color scheme
  • Required Resolution(s) for Normal Submissions:

    • Resolution must not exceed nor fall below: 3072x3072
    • Example resolutions: 4800x3600, 4096x3072, 3440x3440
  • Allowed:

    • Anything related to nature, mountains, rocks, and the like (generally fitting into the \"rocky\" idea)
    • Anything related to the codename (eg. Blue Onyx)
    • Anything minimalist/abstract is allowed
    • References to the release number (like 9, and so on) are allowed
    • Complementary colors should be allowed in the image within reason
    • Contrasting colors should be allowed in the image within reason
    • Photography + Manipulation should be allowed within reason
    • Highly Encouraged: Day and Night versions of wallpapers
  • Discouraged:

    • Avoid using the Rocky logo, unless it fits with an abstract/minimalist idea for the background
      • Plain backdrops with the rocky logo are not permitted
  • Prohibited:

    • Any AI generated artwork
"},{"location":"documentation/guidelines/rocky_logos_guidelines/#minimum-resolutions","title":"Minimum Resolutions","text":"

For general submissions, we request a high resolution to make things simpler, that way the user should be able to use a wallpaper without having to choose \"the right one\" for their monitor size. However, for the case case of extra backgrounds, this requirement is more relaxed. If a submitter wishes not to use the highest resolution but opts to make multiple resolutions instead, they should follow the below list:

  • Minimum Required Resolutions:
    • 16:9 (1920x1080)
    • 16:10 (1920x1200)
    • 5:4 (2048x1536)
    • 4:3 (1280x1024)
  • Additional (encouraged) allowed resolutions:
    • 3440x1440
    • 2560x1600
    • 2560x1440
    • 2560x1080
    • 1800x1440
    • Portrait mode versions of the above are optional

The placeholders in this commit shows an example of using the minimum resolutions.

"},{"location":"documentation/guidelines/rocky_logos_guidelines/#extras-package","title":"Extras Package","text":"

If a wallpaper does not make it to the main package (whether it doesn't meet guidelines or is simply just Rocky inspired), they should be able to be submitted for addition into the rocky-backgrounds-extras package.

"},{"location":"documentation/patching/","title":"Rocky Linux Package Patching","text":"

In Rocky Linux, some packages are patched either for build issues or removing Red Hat references. Some packages are completely self-managed by Release Engineering. Some packages have Red Hat or CentOS assets that cannot be shipped (for obvious reasons). Performing these types of changes are necessary for Rocky Linux to exist.

"},{"location":"documentation/patching/#what-is-debranding","title":"What is Debranding?","text":"

Debranding is for the case of removing Red Hat or CentOS assets from a package and either A) Using Rocky Linux or RESF assets or B) Forcing the use of generic assets. The former is the most common and the latter happens once in a blue moon. A debrand can come in the following forms:

  • Changing \"Red Hat\" to \"Rocky\"
  • Changing \"RHEL\" or \"Red Hat Enterprise Linux\" to \"Rocky Linux\"
  • Changing some \"Red Hat\" or \"RHEL\" wording to be agnostic, such as \"Enterprise Linux\"
  • Changing bug tracker URL's to our project's specific bug tracker site
  • Replacing appropriate assets (e.g. the logos packages)

The most obvious example would be httpd or nginx. While these rely on rocky-logos-httpd for specific pages, some assets are also replaced. This is particularly obvious with the test pages with distribution specific information.

"},{"location":"documentation/patching/#how-are-packages-debranded","title":"How are packages \"debranded\"?","text":"

Debrands are done using the srpmproc utility. The utility source code is here.

"},{"location":"documentation/patching/#what-are-self-managed-packages","title":"What are \"self-managed\" packages?","text":"

Rocky Linux may have packages that are self-managed. Self-managed packages are packages that Red Hat may ship themselves, but it's simply easier for Release Engineering to manage them, thus reducing srpmproc headaches.

"},{"location":"documentation/patching/#what-are-build-issues","title":"What are \"build issues\"?","text":"

Some packages have to be patched, either a source code patch or a spec file change, to address a build issue. A build issue can come in multiple forms:

  • Failing tests that should not fail in normal circumstances
  • OOM issues for heavy packages
  • Build issues where a package cannot be built properly in a container

These do not happen often. These types of changes do not affect the compatibility of the packages to our upstream.

"},{"location":"documentation/patching/#what-type-of-other-changes-can-be-done","title":"What type of other changes can be done?","text":"

There are very rare cases where Red Hat completely disables a package from being built or even being provided. In these very rare cases, if there is user demand, we may ensure these packages are built or provided in some way. A very common example is openldap-servers, which is no longer built by default. There are a couple of packages that for some reason also rely on openldap-server's existence. As a result, we enable this and provide it in our plus repository.

"},{"location":"documentation/patching/#can-i-get-a-list-of-changes","title":"Can I get a list of changes?","text":"

Of course, head to the changes page for a list of known and documented changes that we make to our packages.

"},{"location":"documentation/patching/changes/","title":"Rocky Linux Package Changes","text":"

In Rocky Linux, some packages can be patched or even self-managed. Below is a table of each package that we may modify to address branding or self-management. Click the appropriate Rocky Linux version that is of interest to you.

Rocky Linux 8Rocky Linux 9Rocky Linux 10 Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks abrt Patch Add Rocky Support anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cockpit-composer Patch, Branding Replace RHEL with Enterprise Linux cloud-init Patch Ensure the managed user is cloud-user like upstream crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL dotnet Branding Add Rocky Support dotnet3.0 Branding Add Rocky Support firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-boxes Patch Add Rocky Support gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libguestfs Patch Add Rocky Support libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported oscap-anaconda-addon Branding Replace \"Red Hat\" with \"Rocky\" PackageKit Patch Change support URL's to Rocky Linux wiki pcs Branding Replace \"Red Hat\" logo plymouth Branding Replace \"Red Hat Enterprise Linux\" python2 Patch Add Rocky Support python3 Patch Add Rocky Support python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd-efi Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot and Branding kernel-rt Patch, Branding Secure Boot and Branding rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is built and available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default"},{"location":"documentation/patching/changes/#terminology","title":"Terminology","text":"Term Definition Self-managed A package that Release Engineering manages rather than using srpmproc to patch Patch A patch done either in the source code or the spec file Branding A branding patch done to ensure Rocky Linux assets are in use rather than upstream"},{"location":"documentation/patching/debrand_info/","title":"Debranding Information","text":"

This page goes over the methodology and some packages that require changes to their material for acceptance in Rocky Linux. Usually this means there is some text or images in the package that reference upstream trademarks, and these must be swapped out before we can distribute them.

CentOS had a wiki page at one point where it was documented, but it wasn't always up to date. For example, the package nginx did not appear on their list, and still had RHEL branding in the CentOS repos. As a result, this forced us to do a deeper investigation into what needs to be changed or altered.

There are a few ways we've determined some of the changes:

  • Packages don't build because ID is not centos, rhel, or fedora
  • Packages have ?centos tags in the SPEC file to differentiate from Fedora or RHEL
  • Some packages in git.centos.org have an automatic debranding message - This won't be as helpful for 9 and beyond
  • RHEL assets were appearing in the installed package(s)

When we need to make changes, it can possibly be one or more of these things:

  • URL's should change from Red Hat to a Rocky page (if applicable)
  • URL's that are being patched to be Red Hat should be removed (systemd in 8 is an example of this)
  • ?centos is changed to ?rocky, but this isn't always consistent or sufficient
  • Assets need to be changed

    • Exceptions come when there is a file being requested from the logos package - We generally have symlinks to deal with this
  • Some patches must be made to the source code or spec file

  • Packages are built against an \"override\" release package that uses ID=\"rhel\" in /etc/os-release to force a build to pose as RHEL (older versions of dotnet and chrony are an example of this)

Current patches (for staging) are here.

"},{"location":"documentation/patching/debrand_info/#packages-that-need-debranding-changes","title":"Packages that need debranding changes:","text":"

There is a metadata file that helps track this information for us. It can be located here and is separated by section and branch.

In essence, the file goes over these sections:

  • build_patch -> Packages that may have needed patches to build properly in our environment
  • dnt or Do Not Touch -> These should not be modified or changed
  • custom -> Custom packages not provided by upstream but can be useful in obsoleting packages or providing some functionality
  • plus -> Packages that are modified versions of what's in the base or built by normal means but not shipped by Red Hat
  • previous -> Packages that may have been patched before for debranding or building - They are left as a reference
  • provides -> Common provides for release, logos, and other rocky/system specific packages
  • override_required -> Requires an \"override\" release package to build properly
  • spec_change_only -> Requires only spec changes to remove functionality that is RHEL specific
  • debrand -> Packages that are changed/patched to either remove Red Hat references, replace them, or add Rocky Linux as a supported distribution

    • Some of these packages will always need to be changed, on a minor or major release schedule.
    • Some are potentially upstreamed so then they are no longer patched by us (sos is an example)
    • Some packages may still need modification, even if upstreamed (anaconda is an example)
"},{"location":"documentation/patching/debrand_info/#packages-that-need-to-become-other-packages","title":"Packages that need to become other packages:","text":"

There is a metadata file that tracks this for us. It can be located here. The section in particular is called provides.

This is for example, redhat-logos or system-logos is provided or \"becomes\" rocky-logos.

"},{"location":"documentation/patching/debrand_info/#packages-that-exist-in-rhel-but-do-not-exist-in-most-derivatives","title":"Packages that Exist in RHEL, but do not exist in most derivatives","text":"

For sake of complete information, here is a list of packages that are in RHEL, but may not exist in derivatives. We do not need to worry about these packages:

  • insights-client
  • Red_Hat_Enterprise_Linux-Release_Notes-8-*
  • redhat-access-gui
  • redhat-bookmarks
  • rhc
  • rhc-worker-playbook
  • subscription-manager-migration
  • subscription-manager-migration-data
"},{"location":"documentation/patching/patching/","title":"Rocky Linux Patching Guide","text":"

Note

This page is kept here as a historical reference and may be out of date.

This explains how to debrand/patch a package for the Rocky Linux distribution.

"},{"location":"documentation/patching/patching/#general-instructions","title":"General Instructions","text":"
  • First, identify the files in the package that need to be changed. They could be text files, image files, or others. You can identify the file(s) by digging into git.centos.org/rpms/PACKAGE/
  • Develop replacements for these files, but with Rocky branding placed instead. Diff/patch files may be needed as well for certain types of text, depends on the content being replaced.
  • Replacement files go under https://git.rockylinux.org/patch/PACKAGE/ROCKY/_supporting/
  • Config file (specifying how to apply the patches) goes in https://git.rockylinux.org/patch/PACKAGE/ROCKY/CFG/*.cfg
  • Note: Use spaces, not tabs.
  • When srpmproc goes to import the package to Rocky, it will see the work done in https://git.rockylinux.org/patch/PACKAGE , and apply the stored patches by reading the config file(s) under ROCKY/CFG/*.cfg
"},{"location":"documentation/patching/patching/#the-patch-config-language","title":"The Patch Config Language","text":"

Patching uses simple proto3 config files. The general format is:

Action {\n    file: \"OriginalFile\"\n    with_file: \"ROCKY/_supporting/RockyReplaceFile\"\n}\n

A simple example to replace a file:

replace {\n    file: \"redhatlogo.png\"\n    with_file: \"ROCKY/_supporting/rockylogo.png\"\n}\n

The file \"redhatlogo.png\" would be located in under SOURCES/ in the project's Git repository (and SRPM).

"},{"location":"documentation/patching/patching/#patch-configuration-options","title":"Patch configuration options","text":"
  • add: Adds a file to the sources using the file or lookaside directive
  • delete: Deletes a file from the sources using the file directive
  • replace: Replaces a file from the sources using the file and with_file directives
  • patch: Performs a patch based on the diff provided in the file directive (generated using git diff)
  • spec_change: Allows for spec files to be modified
  • search_and_replace: Performs a search and replace on a given text for the spec file using the any/starts_with/ends_with (true|false), find (string to find), replace (replacement string), and n (integar, -1 for any) directives.
  • file: A file can be added to the spec file using the name directive to define the file name, the type directive (such as patch) and then an add option that is true or false
    • When patch is used, the following options are available:
    • add_to_prep (true|false)
    • n_path: N can be specified to add %patchX -pN lines into %prep assuming the rpm does not use %autosetup
  • append: Appends to a given field, such as Release with a value directive
  • changelog: Modifies the change log using author_name, author_email, and message directives

Patch configuration structure:

.\n\u2514\u2500\u2500 ROCKY\n    \u251c\u2500\u2500 CFG\n    \u2514\u2500\u2500 _supporting\n
"},{"location":"documentation/patching/patching/#case-study-nginx","title":"Case Study: Nginx","text":"

(note: all example data here is currently in the staging/ area of Rocky Linux Git. We will update it when the projects are moved to the production area)

Let's go over an example debrand, featuring the Nginx web server package.

The source repository is located here: https://git.centos.org/rpms/nginx

If we browse one of the c8-* branches, we see under SOURCES/ that there is definitely some content that needs to be debranded:

404.html\n50x.html\nindex.html\npoweredby.png  (binary file in dist-git, referred to in .nginx.metadata)\n

These files all refer to Red Hat inc., and must be replaced before they make it to Rocky Linux.

1: Come up with the patches: Each of these files has a Rocky Linux counterpart, and they must be created. Some of this should be done by the Design Team, especially logo work (#Design on chat)

2: Commit patches to the matching patch/PROJECT Git repository : For example, Nginx patches are located here: https://git.rockylinux.org/staging/patch/nginx (staging/ prefix is currently used until our production repos are set up)

3: Develop a matching config file: Our example Nginx has this here: https://git.rockylinux.org/staging/patch/nginx/-/blob/main/ROCKY/CFG/pages.cfg

It looks like this:

replace {\n    file: \"index.html\"\n    with_file: \"ROCKY/_supporting/index.html\"\n}\n\nreplace {\n    file: \"404.html\"\n    with_file: \"ROCKY/_supporting/404.html\"\n}\n\nreplace {\n    file: \"50x.html\"\n    with_file: \"ROCKY/_supporting/50x.html\"\n}\n\nreplace {\n    file: \"poweredby.png\"\n    with_file: \"ROCKY/_supporting/poweredby.png\"\n}\n

4: Test the import: Now, when the upstream is imported, we can check the main Rocky nginx repository and ensure our updates were successful: https://git.rockylinux.org/staging/rpms/nginx/ (again, staging/ group is used only for now)

5: You're Done! Great! Now do the next one... ;-)

"},{"location":"documentation/patching/patching/#more-debrand-config-language","title":"More Debrand Config Language","text":"

The Nginx example showed just the replace directive, but there are several more available. They are add, patch, and delete.

Here they are, with examples:

# Add a file to the project (file is added to SOURCES/ folder )\nadd {\n    file: \"ROCKY/_supporting/add_me.txt\"\n}\n\n# Apply a .patch file (generated using the Linux \"patch\" utility)\npatch {\n    file: \"ROCKY/_supporting/002-test-html.patch\"\n}\n\n# Delete a file from the source project\ndelete {\n    file: \"SOURCES/dontneed.txt\"\n}\n

And the .patch file example looks like this:

diff --git a/SOURCES/test.html b/SOURCES/test.html\nindex 8d91ffd..3f76c3b 100644\n--- a/SOURCES/test.html\n+++ b/SOURCES/test.html\n@@ -1,6 +1,6 @@\n <!DOCTYPE html>\n <html>\n     <body>\n-        <h1>Replace me</h1>\n+        <h1>Replace I did!</h1>\n     </body>\n </html>\n

It also supports spec file changes, as it may be necessary. For example, from the anaconda debrand patch repo.

add {\n    file: \"ROCKY/_supporting/0002-Rocky-disable-cdn-radiobutton.patch\"\n}\n\nspec_change {\n    # Adds a Patch line with the file name as listed above\n    file {\n        name: \"0002-Rocky-disable-cdn-radiobutton.patch\"\n        type: Patch\n        add: true\n    }\n\n    # Appends to the end of a field's line, in this case the Release field gets .rocky\n    append {\n        field: \"Release\"\n        value: \".rocky\"\n    }\n\n    # Adds to the change log properly\n    changelog {\n        author_name: \"Mustafa Gezen\"\n        author_email: \"mustafa@rockylinux.org\"\n        message: \"Disable CDN and add .rocky to Release\"\n    }\n}\n

At the end, the spec file should be changed.

Summary:              Graphical system installer\nName:                 anaconda\nVersion:              33.16.3.26\n                      # Our .rocky appears here\nRelease:              2%{?dist}.rocky\n\n-- snip --\n\nPatch1:               0001-network-do-not-crash-on-infiniband-devices-activated.patch\n                      # Look, our patch was added!\n                      # Luckily this RPM uses %autosetup, so no %patch lines\nPatch2:               0002-Rocky-disable-cdn-radiobutton.patch\n\n-- snip --\n\n# And below the added changelog\n%changelog\n* Thu Feb 25 2021 Mustafa Gezen <mustafa@rockylinux.org> - 33.16.3.26-2\n- Disable CDN and add .rocky to Release\n\n* Thu Oct 22 2020 Radek Vykydal <rvykydal@redhat.com> - 33.16.3.26-2\n- network: do not crash on infiniband devices activated in initramfs\n  (rvykydal)\n  Resolves: rhbz#1890261\n
"},{"location":"documentation/references/","title":"References","text":"

Use this section to locate reference configuration items for the toolkit.

"},{"location":"documentation/references/empanadas_common/","title":"Empanadas common.py Configuration","text":"

The common.py configuration contains dictionaries and classes that dictate most of the functionality of empanadas.

"},{"location":"documentation/references/empanadas_common/#config-items","title":"Config Items","text":"

type: Dictionary

"},{"location":"documentation/references/empanadas_common/#configrlmacro","title":"config.rlmacro","text":"

type: String

required: True

description: Empanadas expects to run on an EL system. This is part of the general check up. It should not be hardcoded and use the rpm python module.

"},{"location":"documentation/references/empanadas_common/#configdist","title":"config.dist","text":"

type: String

required: False

description: Was the original tag placed in mock configs. This combines el with the rpm python module expansion. This is no longer required. The option is still available for future use.

"},{"location":"documentation/references/empanadas_common/#configarch","title":"config.arch","text":"

type: String

required: True

description: The architecture of the current running system. This is checked against the supported architectures in general release configurations. This should not be hardcoded.

"},{"location":"documentation/references/empanadas_common/#configdate_stamp","title":"config.date_stamp","text":"

type: String

required: True

description: Date time stamp in the form of YYYYMMDD.HHMMSS. This should not be hardcoded.

"},{"location":"documentation/references/empanadas_common/#configcompose_root","title":"config.compose_root","text":"

type: String

required: True

description: Root path of composes on the system running empanadas.

"},{"location":"documentation/references/empanadas_common/#configstaging_root","title":"config.staging_root","text":"

type: String

required: False

description: For future use. Root path of staging repository location where content will be synced to.

"},{"location":"documentation/references/empanadas_common/#configproduction_root","title":"config.production_root","text":"

type: String

required: False

description: For future use. Root path of production repository location where content will be synced to from staging.

"},{"location":"documentation/references/empanadas_common/#configcategory_stub","title":"config.category_stub","text":"

type: String

required: True

description: For future use. Stub path that is appended to staging_root and production_root.

example: mirror/pub/rocky

"},{"location":"documentation/references/empanadas_common/#configsig_category_stub","title":"config.sig_category_stub","text":"

type: String

required: True

description: For future use. Stub path that is appended to staging_root and production_root for SIG content.

example: mirror/pub/sig

"},{"location":"documentation/references/empanadas_common/#configrepo_base_url","title":"config.repo_base_url","text":"

type: String

required: True

description: URL to the base url's where the repositories live. This is typically to a peridot instance. This is supplemented by the configuration project_id parameter.

Note that this does not have to be a peridot instance. The combination of this value and project_id can be sufficient enough for empanadas to perform its work.

"},{"location":"documentation/references/empanadas_common/#configmock_work_root","title":"config.mock_work_root","text":"

type: String

required: True

description: Hardcoded path to where ISO work is performed within a mock chroot. This is the default path created by mock and it is recommended not to change this.

example: /builddir

"},{"location":"documentation/references/empanadas_common/#configcontainer","title":"config.container","text":"

type: String

required: True

description: This is the container used to perform all operations in podman.

example: centos:stream9

"},{"location":"documentation/references/empanadas_common/#configdistname","title":"config.distname","text":"

type: String

required: True

description: Name of the distribution you are building or building for.

example: Rocky Linux

"},{"location":"documentation/references/empanadas_common/#configshortname","title":"config.shortname","text":"

type: String

required: True

description: Short name of the distribution you are building or building for.

example: Rocky

"},{"location":"documentation/references/empanadas_common/#configtranslators","title":"config.translators","text":"

type: Dictionary

required: True

description: Translates Linux architectures to golang architectures. Reserved for future use.

"},{"location":"documentation/references/empanadas_common/#configaws_region","title":"config.aws_region","text":"

type: String

required: False

description: Region you are working in with AWS or onprem cloud that supports this variable.

example: us-east-2

"},{"location":"documentation/references/empanadas_common/#configbucket","title":"config.bucket","text":"

type: String

required: False

description: Name of the S3-compatible bucket that is used to pull images from. Requires aws_region.

"},{"location":"documentation/references/empanadas_common/#configbucket_url","title":"config.bucket_url","text":"

type: String

required: False

description: URL of the S3-compatible bucket that is used to pull images from.

"},{"location":"documentation/references/empanadas_common/#allowed_type_variants-items","title":"allowed_type_variants items","text":"

type: Dictionary

description: Key value pairs of cloud or image variants. The value is either None or a list type.

"},{"location":"documentation/references/empanadas_common/#reference-example","title":"Reference Example","text":"
config = {\n    \"rlmacro\": rpm.expandMacro('%rhel'),\n    \"dist\": 'el' + rpm.expandMacro('%rhel'),\n    \"arch\": platform.machine(),\n    \"date_stamp\": time.strftime(\"%Y%m%d.%H%M%S\", time.localtime()),\n    \"compose_root\": \"/mnt/compose\",\n    \"staging_root\": \"/mnt/repos-staging\",\n    \"production_root\": \"/mnt/repos-production\",\n    \"category_stub\": \"mirror/pub/rocky\",\n    \"sig_category_stub\": \"mirror/pub/sig\",\n    \"repo_base_url\": \"https://yumrepofs.build.resf.org/v1/projects\",\n    \"mock_work_root\": \"/builddir\",\n    \"container\": \"centos:stream9\",\n    \"distname\": \"Rocky Linux\",\n    \"shortname\": \"Rocky\",\n    \"translators\": {\n        \"x86_64\": \"amd64\",\n        \"aarch64\": \"arm64\",\n        \"ppc64le\": \"ppc64le\",\n        \"s390x\": \"s390x\",\n        \"i686\": \"386\"\n    },\n    \"aws_region\": \"us-east-2\",\n    \"bucket\": \"resf-empanadas\",\n    \"bucket_url\": \"https://resf-empanadas.s3.us-east-2.amazonaws.com\"\n}\n\nALLOWED_TYPE_VARIANTS = {\n        \"Azure\": None,\n        \"Container\": [\"Base\", \"Minimal\", \"UBI\"],\n        \"EC2\": None,\n        \"GenericCloud\": None,\n        \"Vagrant\": [\"Libvirt\", \"Vbox\"],\n        \"OCP\": None\n\n}\n
"},{"location":"documentation/references/empanadas_config/","title":"Empanadas config yaml Configuration","text":"

Each file in empanads/config/ is a yaml file that contains configuration items for the distribution release version. The configuration can heavily dictate the functionality and what features are directly supported by empanadas when ran.

See the items below to see which options are mandatory and optional.

"},{"location":"documentation/references/empanadas_config/#config-items","title":"Config Items","text":""},{"location":"documentation/references/empanadas_config/#top-level","title":"Top Level","text":"

The Top Level is the name of the profile and starts the YAML dictionary for the release. It is alphanumeric and accepts punctuation within reason. Common examples:

  • 9
  • 9-beta
  • 8-lookahead
"},{"location":"documentation/references/empanadas_config/#fullname","title":"fullname","text":"

type: String

required: True

description: Needed for treeinfo and discinfo generation.

"},{"location":"documentation/references/empanadas_config/#revision","title":"revision","text":"

type: String

required: True

description: Full version of a release

"},{"location":"documentation/references/empanadas_config/#rclvl","title":"rclvl","text":"

type: String

required: True

description: Release Candidate or Beta descriptor. Sets names and versions with this descriptor if enabled.

"},{"location":"documentation/references/empanadas_config/#major","title":"major","text":"

type: String

required: True

description: Major version of a release

"},{"location":"documentation/references/empanadas_config/#minor","title":"minor","text":"

type: String

required: True

description: Minor version of a release

"},{"location":"documentation/references/empanadas_config/#profile","title":"profile","text":"

type: String

required: True

description: Matches the top level of the release. This should not differ from the top level assignment.

"},{"location":"documentation/references/empanadas_config/#disttag","title":"disttag","text":"

type: String

required: True

description: Sets the dist tag for mock configs.

"},{"location":"documentation/references/empanadas_config/#bugurl","title":"bugurl","text":"

type: String

required: True

description: A URL to the bug tracker for this release or distribution.

"},{"location":"documentation/references/empanadas_config/#checksum","title":"checksum","text":"

type: String

required: True

description: Checksum type. Used when generating checksum information for images.

"},{"location":"documentation/references/empanadas_config/#fedora_major","title":"fedora_major","text":"

type: String

required: False

description: For future use with icicle.

"},{"location":"documentation/references/empanadas_config/#gpg_key","title":"gpg_key","text":"

type: List

required: False

description: List of GPG keys for a given repository

"},{"location":"documentation/references/empanadas_config/#repo_gpg_key","title":"repo_gpg_key","text":"

type: List

required: False

description: List of GPG keys for a given repository. Use this if the signing key for the repo is different from packages.

"},{"location":"documentation/references/empanadas_config/#allowed_arches","title":"allowed_arches","text":"

type: list

required: True

description: List of supported architectures for this release.

"},{"location":"documentation/references/empanadas_config/#provide_multilib","title":"provide_multilib","text":"

type: boolean

required: True

description: Sets if architecture x86_64 will be multilib. It is recommended that this is set to True.

"},{"location":"documentation/references/empanadas_config/#project_id","title":"project_id","text":"

type: String

required: True

description: Appended to the base repo URL in common.py. For peridot, it is the project id that is generated for the project you are pulling from. It can be set to anything else if need be for non-peridot use.

"},{"location":"documentation/references/empanadas_config/#repo_symlinks","title":"repo_symlinks","text":"

type: dict

required: False

description: For future use. Sets symlinks to repositories for backwards compatibility. Key value pairs only.

"},{"location":"documentation/references/empanadas_config/#renames","title":"renames","text":"

type: dict

required: False

description: Renames a repository to the value set. For example, renaming all to devel. Set to {} if no renames are goign to occur.

"},{"location":"documentation/references/empanadas_config/#all_repos","title":"all_repos","text":"

type: list

required: True

description: List of repositories that will be synced/managed by empanadas.

"},{"location":"documentation/references/empanadas_config/#structure","title":"structure","text":"

type: dict

required: True

description: Key value pairs of packages and repodata. These are appended appropriately during syncing and ISO actions. Setting these are mandatory.

"},{"location":"documentation/references/empanadas_config/#iso_map","title":"iso_map","text":"

type: dictionary

required: True if building ISO's and operating with lorax.

description: Controls how lorax and extra ISO's are built.

If are you not building images, set to {}

"},{"location":"documentation/references/empanadas_config/#xorrisofs","title":"xorrisofs","text":"

type: boolean

required: True

description: Dictates of xorrisofs is used to build images. Setting to false uses genisoimage. It is recommended that xorrisofs is used.

"},{"location":"documentation/references/empanadas_config/#iso_level","title":"iso_level","text":"

type: boolean

required: True

description: Set to false if you are using xorrisofs. Can be set to true when using genisoimage.

"},{"location":"documentation/references/empanadas_config/#images","title":"images","text":"

type: dict

required: True

description: Dictates the ISO images that will be made or the treeinfo that will be generated.

Note: The primary repository (for example, BaseOS) will need to be listed to ensure the treeinfo data is correctly generated. disc should be set to False and isoskip should be set to True. See the example section for an example.

"},{"location":"documentation/references/empanadas_config/#namedisc","title":"name.disc","text":"

type: boolean

required: True

description: This tells the iso builder if this will be a generated ISO.

"},{"location":"documentation/references/empanadas_config/#nameisoskip","title":"name.isoskip","text":"

type: boolean

required: False

description: This tells the iso builder if this will be skipped, even if disc is set to True. Default is False.

"},{"location":"documentation/references/empanadas_config/#namevariant","title":"name.variant","text":"

type: string

required: True

description: Names the primary variant repository for the image. This is set in .treeinfo.

"},{"location":"documentation/references/empanadas_config/#namerepos","title":"name.repos","text":"

type: list

required: True

description: Names of the repositories included in the image. This is added to .treeinfo.

"},{"location":"documentation/references/empanadas_config/#namevolname","title":"name.volname","text":"

type: string

required: True

required value: dvd

description: This is required if building more than the DVD image. By default, the the name dvd is harcoded in the buildImage template.

"},{"location":"documentation/references/empanadas_config/#lorax","title":"lorax","text":"

type: dict

required: True if building lorax images.

description: Sets up lorax images and which repositories to use when building lorax images.

"},{"location":"documentation/references/empanadas_config/#loraxrepos","title":"lorax.repos","text":"

type: list

required: True

description: List of repos that are used to pull packages to build the lorax images.

"},{"location":"documentation/references/empanadas_config/#loraxvariant","title":"lorax.variant","text":"

type: string

required: True

description: Base repository for the release

"},{"location":"documentation/references/empanadas_config/#loraxlorax_removes","title":"lorax.lorax_removes","text":"

type: list

required: False

description: Excludes packages that are not needed when lorax is running.

"},{"location":"documentation/references/empanadas_config/#loraxrequired_pkgs","title":"lorax.required_pkgs","text":"

type: list

required: True

description: Required list of installed packages needed to build lorax images.

"},{"location":"documentation/references/empanadas_config/#livemap","title":"livemap","text":"

type: dict

required: False

description: Dictates what live images are built and how they are built.

"},{"location":"documentation/references/empanadas_config/#livemapgit_repo","title":"livemap.git_repo","text":"

type: string

required: True

description: The git repository URL where the kickstarts live

"},{"location":"documentation/references/empanadas_config/#livemapbranch","title":"livemap.branch","text":"

type: string

required: True

description: The branch being used for the kickstarts

"},{"location":"documentation/references/empanadas_config/#livemapksentry","title":"livemap.ksentry","text":"

type: dict

required: True

description: Key value pairs of the live images being created. Key being the name of the live image, value being the kickstart name/path.

"},{"location":"documentation/references/empanadas_config/#livemapallowed_arches","title":"livemap.allowed_arches","text":"

type: list

required: True

description: List of allowed architectures that will build for the live images.

"},{"location":"documentation/references/empanadas_config/#livemaprequired_pkgs","title":"livemap.required_pkgs","text":"

type: list

required: True

description: Required list of packages needed to build the live images.

"},{"location":"documentation/references/empanadas_config/#cloudimages","title":"cloudimages","text":"

type: dict

required: False

description: Cloud related settings.

Set to {} if not needed.

"},{"location":"documentation/references/empanadas_config/#cloudimagesimages","title":"cloudimages.images","text":"

type: dict

required: True

description: Cloud images that will be generated and in a bucket to be pulled, and their format.

"},{"location":"documentation/references/empanadas_config/#cloudimagesimagesname","title":"cloudimages.images.name","text":"

type: dict

required: True

description: Name of the cloud image being pulled.

Accepted key value options:

  • format, which is raw, qcow2, vhd, tar.xz
  • variants, which is a list
  • primary_variant, which symlinks to the \"primary\" variant in the variant list
"},{"location":"documentation/references/empanadas_config/#repoclosure_map","title":"repoclosure_map","text":"

type: dict

required: True

description: Repoclosure settings. These settings are absolutely required when doing full syncs and need to check repositories for consistency.

"},{"location":"documentation/references/empanadas_config/#repoclosure_maparches","title":"repoclosure_map.arches","text":"

type: dict

required: True

description: For each architecture (key), dnf switches/settings that dictate how repoclosure will check for consistency (value, string).

example: x86_64: '--forcearch=x86_64 --arch=x86_64 --arch=athlon --arch=i686 --arch=i586 --arch=i486 --arch=i386 --arch=noarch'

"},{"location":"documentation/references/empanadas_config/#repoclosure_maprepos","title":"repoclosure_map.repos","text":"

type: dict

required: True

description: For each repository that is pulled for a given release(key), repositories that will be included in the repoclosure check. A repository that only checks against itself must have a value of [].

"},{"location":"documentation/references/empanadas_config/#extra_files","title":"extra_files","text":"

type: dict

required: True

description: Extra files settings and where they come from. Git repositories are the only supported method.

"},{"location":"documentation/references/empanadas_config/#extra_filesgit_repo","title":"extra_files.git_repo","text":"

type: string

required: True

description: URL to the git repository with the extra files.

"},{"location":"documentation/references/empanadas_config/#extra_filesgit_raw_path","title":"extra_files.git_raw_path","text":"

type: string

required: True

description: URL to the git repository with the extra files, but the \"raw\" url form.

example: git_raw_path: 'https://git.rockylinux.org/staging/src/rocky-release/-/raw/r9/'

"},{"location":"documentation/references/empanadas_config/#extra_filesbranch","title":"extra_files.branch","text":"

type: string

required: True

description: Branch where the extra files are pulled from.

"},{"location":"documentation/references/empanadas_config/#extra_filesgpg","title":"extra_files.gpg","text":"

type: dict

required: True

description: For each gpg key type (key), the relative path to the key in the git repository (value).

These keys help set up the repository configuration when doing syncs.

By default, the RepoSync class sets stable as the gpgkey that is used.

"},{"location":"documentation/references/empanadas_config/#extra_fileslist","title":"extra_files.list","text":"

type: list

required: True

description: List of files from the git repository that will be used as \"extra\" files and placed in the repositories and available to mirrors and will appear on ISO images if applicable.

"},{"location":"documentation/references/empanadas_config/#reference-example","title":"Reference Example","text":"
---\n'9':\n  fullname: 'Rocky Linux 9.0'\n  revision: '9.0'\n  rclvl: 'RC2'\n  major: '9'\n  minor: '0'\n  profile: '9'\n  disttag: 'el9'\n  bugurl: 'https://bugs.rockylinux.org'\n  checksum: 'sha256'\n  fedora_major: '20'\n  allowed_arches:\n    - x86_64\n    - aarch64\n    - ppc64le\n    - s390x\n  provide_multilib: True\n  project_id: '55b17281-bc54-4929-8aca-a8a11d628738'\n  repo_symlinks:\n    NFV: 'nfv'\n  renames:\n    all: 'devel'\n  all_repos:\n    - 'all'\n    - 'BaseOS'\n    - 'AppStream'\n    - 'CRB'\n    - 'HighAvailability'\n    - 'ResilientStorage'\n    - 'RT'\n    - 'NFV'\n    - 'SAP'\n    - 'SAPHANA'\n    - 'extras'\n    - 'plus'\n  structure:\n    packages: 'os/Packages'\n    repodata: 'os/repodata'\n  iso_map:\n    xorrisofs: True\n    iso_level: False\n    images:\n      dvd:\n        disc: True\n        variant: 'AppStream'\n        repos:\n          - 'BaseOS'\n          - 'AppStream'\n      minimal:\n        disc: True\n        isoskip: True\n        repos:\n          - 'minimal'\n          - 'BaseOS'\n        variant: 'minimal'\n        volname: 'dvd'\n      BaseOS:\n        disc: False\n        isoskip: True\n        variant: 'BaseOS'\n        repos:\n          - 'BaseOS'\n          - 'AppStream'\n    lorax:\n      repos:\n        - 'BaseOS'\n        - 'AppStream'\n      variant: 'BaseOS'\n      lorax_removes:\n        - 'libreport-rhel-anaconda-bugzilla'\n      required_pkgs:\n        - 'lorax'\n        - 'genisoimage'\n        - 'isomd5sum'\n        - 'lorax-templates-rhel'\n        - 'lorax-templates-generic'\n        - 'xorriso'\n  cloudimages:\n    images:\n      EC2:\n        format: raw\n      GenericCloud:\n        format: qcow2\n  livemap:\n    git_repo: 'https://git.resf.org/sig_core/kickstarts.git'\n    branch: 'r9'\n    ksentry:\n      Workstation: rocky-live-workstation.ks\n      Workstation-Lite: rocky-live-workstation-lite.ks\n      XFCE: rocky-live-xfce.ks\n      KDE: rocky-live-kde.ks\n      MATE: rocky-live-mate.ks\n    allowed_arches:\n      - x86_64\n      - aarch64\n    required_pkgs:\n      - 'lorax-lmc-novirt'\n      - 'vim-minimal'\n      - 'pykickstart'\n      - 'git'\n  variantmap:\n    git_repo: 'https://git.rockylinux.org/rocky/pungi-rocky.git'\n    branch: 'r9'\n    git_raw_path: 'https://git.rockylinux.org/rocky/pungi-rocky/-/raw/r9/'\n  repoclosure_map:\n    arches:\n      x86_64: '--forcearch=x86_64 --arch=x86_64 --arch=athlon --arch=i686 --arch=i586 --arch=i486 --arch=i386 --arch=noarch'\n      aarch64: '--forcearch=aarch64 --arch=aarch64 --arch=noarch'\n      ppc64le: '--forcearch=ppc64le --arch=ppc64le --arch=noarch'\n      s390x: '--forcearch=s390x --arch=s390x --arch=noarch'\n    repos:\n      devel: []\n      BaseOS: []\n      AppStream:\n        - BaseOS\n      CRB:\n        - BaseOS\n        - AppStream\n      HighAvailability:\n        - BaseOS\n        - AppStream\n      ResilientStorage:\n        - BaseOS\n        - AppStream\n      RT:\n        - BaseOS\n        - AppStream\n      NFV:\n        - BaseOS\n        - AppStream\n      SAP:\n        - BaseOS\n        - AppStream\n        - HighAvailability\n      SAPHANA:\n        - BaseOS\n        - AppStream\n        - HighAvailability\n  extra_files:\n    git_repo: 'https://git.rockylinux.org/staging/src/rocky-release.git'\n    git_raw_path: 'https://git.rockylinux.org/staging/src/rocky-release/-/raw/r9/'\n    branch: 'r9'\n    list:\n      - 'SOURCES/Contributors'\n      - 'SOURCES/COMMUNITY-CHARTER'\n      - 'SOURCES/EULA'\n      - 'SOURCES/LICENSE'\n      - 'SOURCES/RPM-GPG-KEY-Rocky-9'\n      - 'SOURCES/RPM-GPG-KEY-Rocky-9-Testing'\n...\n
"},{"location":"documentation/references/empanadas_sig_config/","title":"Empanadas SIG yaml Configuration","text":"

Each file in empanads/sig/ is a yaml file that contains configuration items for the distribution release version. The configuration determines the structure of the SIG repositories synced from Peridot or a given repo.

Note that a release profile (for a major version) is still required for this sync to work.

See the items below to see which options are mandatory and optional.

"},{"location":"documentation/references/empanadas_sig_config/#config-items","title":"Config Items","text":""},{"location":"documentation/references/empanadas_sig_config/#reference-example","title":"Reference Example","text":""},{"location":"events/meeting-notes/2024-03-18/","title":"Release Engineering (SIG/Core) Meeting 2024-03-18","text":""},{"location":"events/meeting-notes/2024-03-18/#attendees","title":"Attendees","text":"
  • Louis Abel
  • Mustafa Gezen
  • Sherif Nagy
  • Neil Hanlon
  • Pablo Greco
  • Taylor Goodwill
  • Skip Grube
"},{"location":"events/meeting-notes/2024-03-18/#old-business","title":"Old Business","text":"
  • Ticket opened to track current packages not yet built for Rocky Linux 10

To fill.

"},{"location":"events/meeting-notes/2024-03-18/#new-business","title":"New Business","text":"
  • RISCV...

To fill.

"},{"location":"events/meeting-notes/2024-03-18/#open-floor","title":"Open Floor","text":"

To fill.

"},{"location":"events/meeting-notes/2024-03-18/#action-items","title":"Action Items","text":"

To fill.

"},{"location":"include/mod_table/","title":"Mod table","text":"Rocky Linux 8Rocky Linux 9Rocky Linux 10 Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks abrt Patch Add Rocky Support anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cockpit-composer Patch, Branding Replace RHEL with Enterprise Linux cloud-init Patch Ensure the managed user is cloud-user like upstream crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL dotnet Branding Add Rocky Support dotnet3.0 Branding Add Rocky Support firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-boxes Patch Add Rocky Support gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libguestfs Patch Add Rocky Support libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported oscap-anaconda-addon Branding Replace \"Red Hat\" with \"Rocky\" PackageKit Patch Change support URL's to Rocky Linux wiki pcs Branding Replace \"Red Hat\" logo plymouth Branding Replace \"Red Hat Enterprise Linux\" python2 Patch Add Rocky Support python3 Patch Add Rocky Support python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot kernel-rt Patch, Branding Secure Boot rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dhcp Patch Change bug tracker URL dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux gnome-settings-daemon Patch Remove subscription manager patch initial-setup Branding Replace Red Hat with Rocky Linux java-1.8.0-openjdk* Patch Ensure portables are buildable on all releases java-11-openjdk* Patch Ensure portables are buildable on all releases java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL libreoffice Branding Remove Red Hat branding to generic branding libreport Patch Ensure Rocky Bug Tracker (mantis) is supported lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki python-pip Patch Add Rocky Support redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default WALinuxAgent Patch Ensure Rocky Linux is supported Package Name Change Type Comment shim-unsigned-x64 Self-managed Secure Boot shim-unsigned-aarch64 Self-managed Secure Boot shim Self-managed Secure Boot fwupd-efi Patch Secure Boot grub2 Patch Secure Boot kernel Patch, Branding Secure Boot and Branding kernel-rt Patch, Branding Secure Boot and Branding rocky-release Self-managed Required for Rocky Linux to be itself rocky-logos Self-managed Required for Rocky Linux assets rocky-indexhtml Self-managed Required for Rocky Linux default index rocky-bookmarks Self-managed Required for Rocky Linux default browser bookmarks anaconda Patch, Branding Turn off Red Hat specific options anaconda-user-help Patch, Branding Ensure documenation references Rocky Linux cloud-init Patch Ensure the managed user is cloud-user like upstream cockpit-composer Branding Replace RHEL with Enterprise Linux crash Patch Replace Red Hat with Rocky dnf Patch Change bug tracker URL firefox Patch Replace Red Hat settings with Rocky Linux settings gcc Patch Change bug tracker URL gdb Patch Replace Red Hat with Rocky Linux java-17-openjdk* Patch Ensure portables are buildable on all releases java-21-openjdk* Patch Ensure portables are buildable on all releases libdnf Patch Change bug tracker URL lorax-templates-rocky Self-managed Replacement for lorax-templates-rhel nginx Branding Replace Red Hat with Rocky Linux openldap Patch Ensure openldap-servers is built and available in plus repo openscap Patch Ensure Rocky Linux is supported as a derivative osbuild Patch Ensure Rocky Linux is supported osbuild-composer Patch Ensure Rocky Linux is supported PackageKit Patch Change support URL's to Rocky Linux wiki redhat-rpm-config Patch Add Rocky Support rust Patch Ensure that aarch64 and s390x can build rust (OOM) scap-security-guide Patch Ensure Rocky Linux is supported as a derivative subscription-manager* Patch Remove Red Hat references systemd Patch Change support URL's to Rocky Linux thunderbird Patch Replace Red Hat settings with Rocky Linux settings toolbox Patch Ensure Rocky Linux image is the default"},{"location":"include/resources_bottom/","title":"Resources bottom","text":"Resources Account ServicesGit (RESF Git Service)Git (Rocky Linux GitHub)Git (Rocky Linux GitLab)Mail ListsContacts

URL: https://accounts.rockylinux.org

Purpose: Account Services maintains the accounts for almost all components of the Rocky ecosystem

Technology: Noggin used by Fedora Infrastructure

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

URL: https://git.resf.org

Purpose: General projects, code, and so on for the Rocky Enterprise Software Foundation.

Technology: Gitea

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://github.com/rocky-linux

Purpose: General purpose code, assets, and so on for Rocky Linux. Some content is mirrored to the RESF Git Service.

Technology: GitHub

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://git.rockylinux.org

Purpose: Packages and light code for the Rocky Linux distribution

Technology: GitLab

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://lists.resf.org

Purpose: Users can subscribe and interact with various mail lists for the Rocky ecosystem

Technology: Mailman 3 + Hyper Kitty

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

Name Email Mattermost Name IRC Name Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Skip Grube skip@rockylinux.org @skip77 Sherif Nagy sherif@rockylinux.org @sherif Pablo Greco pgreco@rockylinux.org @pgreco pgreco Neil Hanlon neil@resf.org @neil neil Taylor Goodwill tg@resf.org @tgo tg"},{"location":"legacy/","title":"Legacy","text":"

Legacy documentation comes here.

Debrand List

Koji Tagging

"},{"location":"legacy/debrand_list/","title":"Rocky Debrand Packages List","text":"

This is a list of packages that require changes to their material for acceptance in Rocky Linux. Usually this means there is some text or images in the package that reference upstream trademarks, and these must be swapped out before we can distribute them.

The first items in this list are referenced from the excellent CentOS release notes here: https://wiki.centos.org/Manuals/ReleaseNotes/CentOS8.1905#Packages_modified_by_CentOS

It is assumed that we will have to modify these same packages. It is also assumed that these changed packages might not necessarily be debranding.

However, this list is incomplete. For example, the package Nginx does not appear on the list, and still has RHEL branding in the CentOS repos. We will need to investigate the rest of the package set and find any more packages like this that we must modify.

One way to find said changes is to look for ?centos tags in the SPEC file, while also looking at the manual debranding if there was any for the c8 branches.

There will be cases where a search and replace for ?centos to ?rocky will be sufficient.

Current patches (for staging) are here.

"},{"location":"legacy/debrand_list/#packages-that-need-debranding-changes","title":"Packages that need debranding changes:","text":"Package Notes Work Status abrt See here DONE anaconda See here DONE apache-commons-net AppStream module with elevating branch names NO CHANGES REQUIRED ~~basesystem~~ (does not require debranding, it is a skeleton package) NO CHANGES REQUIRED cloud-init See here DONE - NEEDS REVIEW IN GITLAB (Rich Alloway) cockpit See here DONE ~~compat-glibc~~ NOT IN EL 8 dhcp See here DONE, NEEDS REVIEW IN GITLAB (Rich Alloway) firefox See here -- Still requires a distribution.ini ID MOSTLY DONE (Louis) fwupdate NOT STARTED glusterfs Changes don't appear to be required NO CHANGES REQUIRED gnome-settings-daemon No changes required for now. NO CHANGES REQUIRED grub2 (secureboot patches not done, just debrand) See here DONE, NEEDS REVIEW IN GITLAB AND SECUREBOOT (Rich Alloway) httpd See here DONE initial-setup See here DONE ipa This is a dual change: Logos and ipaplatform. Logos are taken care of in rocky-logos and the ipaplatform is taken care of here. See here DONE ~~kabi-yum-plugins~~ NOT IN EL 8 kernel See here for a potential example NOT STARTED ~~kde-settings~~ NOT IN EL 8 libreport See here DONE oscap-anaconda-addon See here DONE Requires install QA PackageKit See here DONE ~~pcs~~ NO CHANGES REQUIRED plymouth See here DONE ~~redhat-lsb~~ NO CHANGES REQUIRED redhat-rpm-config See here DONE scap-security-guide QA is likely required to test this package as it is NO CHANGES REQUIRED, QA REQUIRED shim NOT STARTED shim-signed NOT STARTED sos See here DONE subscription-manager See here DONE, NEEDS REVIEW ~~system-config-date~~ NOT IN EL8 ~~system-config-kdump~~ NOT IN EL8 thunderbird See here DONE ~~xulrunner~~ NOT IN EL 8 ~~yum~~ NO CHANGES REQUIRED (end of CentOS list) nginx Identified changes, in staging (ALMOST) DONE"},{"location":"legacy/debrand_list/#packages-that-need-to-become-other-packages","title":"Packages that need to become other packages:","text":"

We will want to create our own versions of these packages. The full \"lineage\" is shown, from RHEL -> CentOS -> Rocky (Where applicable)

Package Notes redhat-indexhtml -> centos-indexhtml -> rocky-indexhtml Here redhat-logos -> centos-logos -> rocky-logos Here redhat-release-* -> centos-release -> rocky-release Here centos-backgrounds -> rocky-backgrounds Provided by logos centos-linux-repos -> rocky-repos Here centos-obsolete-packages Here"},{"location":"legacy/debrand_list/#packages-that-exist-in-rhel-but-not-in-centos","title":"Packages that Exist in RHEL, but not in CentOS","text":"

For sake of complete information, here is a list of packages that are in RHEL 8, but do not exist in CentOS 8. We do not need to worry about these packages:

  • insights-client
  • Red_Hat_Enterprise_Linux-Release_Notes-8-*
  • redhat-access-gui
  • redhat-bookmarks
  • subscription-manager-migration
  • subscription-manager-migration-data
"},{"location":"legacy/koji_tagging/","title":"Koji Tagging Strategy","text":"

This document covers how the Rocky Linux Release Engineering Team handles the tagging for builds in Koji and how it affects the overall build process.

"},{"location":"legacy/koji_tagging/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"legacy/koji_tagging/#what-is-koji","title":"What is Koji?","text":"

Koji is the build system used for Rocky Linux, as well as CentOS, Fedora, and likely others. Red Hat is likely to use a variant of Koji called \"brew\" with similar functionality and usage. Koji uses mock, a common RPM building utility, to build RPMs in a chroot environment.

"},{"location":"legacy/koji_tagging/#architecture-of-koji","title":"Architecture of Koji","text":""},{"location":"legacy/koji_tagging/#components","title":"Components","text":"

Koji comprises of multiple components:

  • koji-hub, which is the center of all Koji operations. It runs XML-RPC and relies on other components to call it for actions. This piece will also talk to the database and is one component that has write access to the filesystem.
  • kojid, which is the daemon that runs on the builder nodes. It's responsibility is to talk to the hub for actions in which it can or has to perform, for example, building an RPM or install images. But that is not all that it can do.
  • koji-web is a set of scripts that provides the web interface that anyone can see at our koji.
  • koji is the command line utility that is commonly used - It is a wrapper of the various API commands that can be called. In our environment, it requires a login via kerberos.
  • kojira is a component that ensures repodata is updated among the build tags.
"},{"location":"legacy/koji_tagging/#tags","title":"Tags","text":"

Tags are the most important part of the koji ecosystem. With tags, you can have specific repository build roots for the entire distribution or just a simple subset of builds that should not polute the main build tags (for example, for SIGs where a package or two might be newer (or even older) than what's in BaseOS/AppStream.

Using tags, you can setup what is called \"inheritance\". So for example. You can have a tag named dist-rocky8-build but it happens to inherit dist-rocky8-updates-build, which will likely have a newer set of packages than the former. Inheritance, in a way, can be considered setting \"dnf priorities\" if you've done that before. Another way to look at it is \"ordering\" and \"what comes first\".

Targets call tags to send packages to build in, generally.

"},{"location":"legacy/koji_tagging/#tag-strategy","title":"Tag Strategy","text":"

The question that we get is \"what's the difference between a build and an updates-build tag\" - It's all about the inheritance. For example, let's take a look at dist-rocky8-build

  dist-rocky8-build\n    el8\n    dist-rocky8\n    build-modules\n       . . .\n

In this tag, you can see that this build tag inherits el8 packages first, and then the packages in dist-rocky8, and then build-modules. This is where \"base\" packages start out at, generally and a lot of them won't be updated or even change with the lifecycle of the version.

dist-rocky8-updates-build\n    el8\n    dist-rocky8-updates\n        dist-rocky8\n    dist-rocky8-build\n        build-modules\n

This one is a bit different. Notice that it inherits el8 first, and then dist-rocky8-updates, which inherits dist-rocky8. And then it also pulls in dist-rocky8-build, the previous tag we were talking about. This tag is where updates for a minor release are sent to.

dist-rocky8_4-updates-build\n    el8_4\n    dist-rocky8-updates\n        dist-rocky8\n    dist-rocky8-build\n        el8\n        build-modules\n

Here's a more interesting one. Notice something? It's pretty similar to the last one, but see how it's named el8_4 instead? This is where updates during 8.4 are basically sent to and that's how they get tagged as .el8_4 on the RPM's. The el8_4 tag contains a build macros package that instructs the %dist tag to be set that way. When 8.5 comes out, we'll basically have the same setup.

At the end of the day, builds that happen in these updates-build tags get dropped in dist-rocky8-updates.

"},{"location":"legacy/koji_tagging/#what-about-modules","title":"What about modules?","text":"

Modules are a bit tricky. We generally don't touch how MBS does its tags or what's going on there. When builds are being done with the modules, they do end up using the el8 packages in some manner or form. The modules are separated entirely from the main tags though, so they don't polute the main tags. You don't want a situation where say, you build the latest ruby, but something builds off the default version of ruby provided in el8 and now you're in trouble and get dnf filtering issues.

"},{"location":"legacy/koji_tagging/#how-do-we-determine-what-is-part-of-a-compose","title":"How do we determine what is part of a compose?","text":"

There are special tags that have a -compose suffix. These tags are used as a way to pull down packages for repository building during the pungi process.

"},{"location":"rpm/","title":"RPM","text":"

This section is primarily for documentation and useful information as it pertains to package building and modularity. Use the menu on the left side to find the information you're looking for.

"},{"location":"rpm/local_module_builds/","title":"Local Module Builds","text":"

{% set git_revision_date = '2024-03-05' %} Within the Fedora and Red Hat ecosystem, modularity is unfortunately a piece that is a blessing and a curse. It might be more one way or the other.

This page is primarily to talk about how to do local builds for modules, including the final formatting of the module yaml description that will have to be imported into the repo via modifyrepo_c.

Note that the below is based on how lazybuilder performs module builds, which was made to be close to MBS+Koji and is not perfect. This is mostly used as a reference.

"},{"location":"rpm/local_module_builds/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"rpm/local_module_builds/#building-local-modules","title":"Building Local Modules","text":"

This section explains what it's like to build local modules, what you can do, and what you can expect.

"},{"location":"rpm/local_module_builds/#module-source-transmodrification-pulling-sources","title":"Module Source, \"transmodrification\", pulling sources","text":"

The module source typically lives in a SOURCES directory in a module git repo with the name of modulemd.src.txt. This is a basic version that could be used to do a module build. Each package listed is a reference to the stream version for that particular module.

document: modulemd\nversion: 2\ndata:\n  stream: 1.4\n  summary: 389 Directory Server (base)\n  description: >-\n    389 Directory Server is an LDAPv3 compliant server.  The base package includes\n    the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n  dependencies:\n  - buildrequires:\n      nodejs: [10]\n      platform: [el8]\n    requires:\n      platform: [el8]\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        ref: stream-1.4-rhel-8.4.0\n        arches: [aarch64, ppc64le, s390x, x86_64]\n

Notice ref? That's the reference point. When a \"transmodrification\" occurs, the process is supposed to look at each RPM repo in the components['rpms'] list. The branch name that this module data lives in will be the basis of how it determines what the new references will be. In this example, the branch name is r8-stream-1.4 so when we do the \"conversion\", it should become a git commit hash of the last commit in the branch r8-stream-1.4 for that particular rpm component.

document: modulemd\nversion: 2\ndata:\n  stream: \"1.4\"\n  summary: 389 Directory Server (base)\n  description: 389 Directory Server is an LDAPv3 compliant server.  The base package\n    includes the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n  dependencies:\n  - buildrequires:\n      nodejs:\n      - \"10\"\n      platform:\n      - el8\n    requires:\n      platform:\n      - el8\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n        arches:\n        - aarch64\n        - ppc64le\n        - s390x\n        - x86_64\n

See the reference now? It's now a commit hash that refers directly to 389-ds-base on branch r8-stream-1.4, being the last commit/tag. See the glossary at the end of this page for more information, as it can be a commit hash, branch, or tag name.

"},{"location":"rpm/local_module_builds/#configuring-macros-and-contexts","title":"Configuring Macros and Contexts","text":"

Traditionally within an MBS and Koji system, there are several macros that are created and are usually unique per module stream. There are certain components that work together to create a unique %dist tag based on several factors. To summarize, here's what generally happens:

  • A module version is formed as M0m00YYYYMMDDhhmmss, which would be the major version, 0, minor version, 0, and then a timestamp.
  • Select components are brought together and a sha1 hash is made, shortened to 8 characters for the context

    • The runtime context is typically the \"dependencies\" section of the module source, calculated to sha1
    • The build context is the xmd['mbs']['buildrequires'] data that koji generates and is output into module.txt, calculated to sha1
    • The runtime and build contexts are combined BUILD:RUNTIME, a sha1 is calculated, and then shortened to 8
    • This context is typically the one that changes less often
  • Select components are brought together and a sha1 hash is made, shortened to 8 characters for the dist tag

    • The module name, stream, version, and context are all brought together as name.stream.version.context, calculated to sha1
  • The %dist tag is given a format of .module+elX.Y.Z+000+00000000 (note: fedora uses .module_fcXX+000+00000000)

    • X is the major version, Y is the minor version, Z is typically 0.
    • The second number is the iteration, aka the module number. If you've done 500 module builds, the next one would be 501, regardless of module.
    • The last set is a context hash generated earlier in the step above
"},{"location":"rpm/local_module_builds/#configuring-the-macros","title":"Configuring the Macros","text":"

In koji+MBS, a module macros package is made that defines the module macros. In lazybuilder, we skip that and define the macros directly. For example, in mock, we drop a file with all the macros we need. Here's an example of 389-ds. The file name is is macros.zz-modules to ensure these macros are picked up last and will have precendence and override macros of similar names, especially the %dist tag.

rpmbuild# cat /etc/rpm/macros.zz-modules\n\n%dist .module_el8.4.0+636+837ee950\n%modularitylabel 389-ds:1.4:8040020210810203142:866effaa\n%_module_build 1\n%_module_name 389-ds\n%_module_stream 1.4\n%_module_version 8040020210810203142\n%_module_context 866effaa\n

The the %dist tag honestly is the most important piece here. But all of these tags are required regardless.

"},{"location":"rpm/local_module_builds/#build-opts-macros","title":"Build Opts Macros","text":"

Some modules may have additional buildopts macros. Perl is a great example of this. When koji+MBS make their module macros package for the build, they combine the module macros and the build opts macros together into one file. It will be the same exact file name each time.

rpmbuild# cat /etc/rpm/macros.zz-modules\n\n# Module macros\n%dist .module+el8.4.0+463+10533ad3\n%modularitylabel perl:5.24:8040020210602173155:162f5753\n%_module_build 1\n%_module_name perl\n%_module_stream 5.24\n%_module_version 8040020210602173155\n%_module_context 162f5753\n\n# Build Opts macros\n%_with_perl_enables_groff 1\n%_without_perl_enables_syslog_test 1\n%_with_perl_enables_systemtap 1\n%_without_perl_enables_tcsh 1\n%_without_perl_Compress_Bzip2_enables_optional_test 1\n%_without_perl_CPAN_Meta_Requirements_enables_optional_test 1\n%_without_perl_IPC_System_Simple_enables_optional_test 1\n%_without_perl_LWP_MediaTypes_enables_mailcap 1\n%_without_perl_Module_Build_enables_optional_test 1\n%_without_perl_Perl_OSType_enables_optional_test 1\n%_without_perl_Pod_Perldoc_enables_tk_test 1\n%_without_perl_Software_License_enables_optional_test 1\n%_without_perl_Sys_Syslog_enables_optional_test 1\n%_without_perl_Test_Harness_enables_optional_test 1\n%_without_perl_URI_enables_Business_ISBN 1\n
"},{"location":"rpm/local_module_builds/#built-module-example","title":"Built Module Example","text":"

Let's break down an example of 389-ds - It's a simple module. Let's start with modulemd.txt, generated during a module build and before packages are built. Notice how it has xmd data. That is an integral part of making the context, though it's mostly information for koji and MBS and is generated on the fly and used throughout the build process for each arch. In the context of lazybuilder, it creates fake data to essentially fill the gap of not having MBS+Koji in the first place. The comments will point out what's used to make the contexts.

---\ndocument: modulemd\nversion: 2\ndata:\n  name: 389-ds\n  stream: 1.4\n  version: 8040020210810203142\n  context: 866effaa\n  summary: 389 Directory Server (base)\n  description: >-\n    389 Directory Server is an LDAPv3 compliant server.  The base package includes\n    the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n  xmd:\n    mbs:\n      # This section xmd['mbs']['buildrequires'] is used to generate the build context\n      # This is typically made before hand and is used with the dependencies section\n      # to make the context listed above.\n      buildrequires:\n        nodejs:\n          context: 30b713e6\n          filtered_rpms: []\n          koji_tag: module-nodejs-10-8030020210426100849-30b713e6\n          ref: 4589c1afe3ab66ffe6456b9b4af4cc981b1b7cdf\n          stream: 10\n          version: 8030020210426100849\n        platform:\n          context: 00000000\n          filtered_rpms: []\n          koji_tag: module-rocky-8.4.0-build\n          ref: virtual\n          stream: el8.4.0\n          stream_collision_modules:\n          ursine_rpms:\n          version: 2\n      commit: 53f7648dd6e54fb156b16302eb56bacf67a9024d\n      mse: TRUE\n      rpms:\n        389-ds-base:\n          ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n      scmurl: https://git.rockylinux.org/staging/modules/389-ds?#53f7648dd6e54fb156b16302eb56bacf67a9024d\n      ursine_rpms: []\n  # Dependencies is part of the context combined with the xmd data. This data\n  # is already in the source yaml pulled for the module build in the first place.\n  # Note that in the source, it's usually `elX` rather than `elX.Y.Z` unless\n  # explicitly configured that way.\n  dependencies:\n  - buildrequires:\n      nodejs: [10]\n      platform: [el8.4.0]\n    requires:\n      platform: [el8]\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        repository: git+https://git.rockylinux.org/staging/rpms/389-ds-base\n        cache: http://pkgs.fedoraproject.org/repo/pkgs/389-ds-base\n        ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n        arches: [aarch64, ppc64le, s390x, x86_64]\n...\n

Below is a version meant to be imported into a repo. This is after the build's completion. You'll notice that some fields are either empty or missing from above or even from the git repo's source that we pulled from initially. You'll also notice that xmd is now an empty dictionary. This is on purpose. While it is optional in the repo module data, the build system typically gives it {}.

---\ndocument: modulemd\nversion: 2\ndata:\n  name: 389-ds\n  stream: 1.4\n  version: 8040020210810203142\n  context: 866effaa\n  arch: x86_64\n  summary: 389 Directory Server (base)\n  description: >-\n    389 Directory Server is an LDAPv3 compliant server.  The base package includes\n    the LDAP server and command line utilities for server administration.\n  license:\n    module:\n    - MIT\n    content:\n    - GPLv3+\n  # This data is not an empty dictionary. It is required.\n  xmd: {}\n  dependencies:\n  - buildrequires:\n      nodejs: [10]\n      platform: [el8.4.0]\n    requires:\n      platform: [el8]\n  filter:\n    rpms:\n    - cockpit-389-ds\n  components:\n    rpms:\n      389-ds-base:\n        rationale: Package in api\n        ref: efe94eb32d597765f49b7b1528ba9881e1f29327\n        arches: [aarch64, ppc64le, s390x, x86_64]\n  artifacts:\n    rpms:\n    - 389-ds-base-0:1.4.3.16-19.module+el8.4.0+636+837ee950.src\n    - 389-ds-base-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-debugsource-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-devel-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-legacy-tools-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-legacy-tools-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-libs-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-libs-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-snmp-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - 389-ds-base-snmp-debuginfo-0:1.4.3.16-19.module+el8.4.0+636+837ee950.x86_64\n    - python3-lib389-0:1.4.3.16-19.module+el8.4.0+636+837ee950.noarch\n...\n

The final \"repo\" of modules (per arch) is eventually made with a designation like:

module-NAME-STREAM-VERSION-CONTEXT\n\nmodule-389-ds-1.4-8040020210810203142-866effaa\n

This is what pungi and other utilities bring in and then combine into a single repo, generally, taking care of the module.yaml.

"},{"location":"rpm/local_module_builds/#default-modules","title":"Default Modules","text":"

Most modules will have a set default that would be expected if a dnf install was called. For example, in EL8 if you said dnf install postgresql-server, the package that gets installed is version 10. If a module doesn't have a default set, a dnf install will traditionally not work. To ensure a module package will install without having to enable them and to use the default, you need default information. Here's the postgresql example.

---\ndocument: modulemd-defaults\nversion: 1\ndata:\n  module: postgresql\n  stream: 10\n  profiles:\n    9.6: [server]\n    10: [server]\n    12: [server]\n    13: [server]\n...\n

Even if a module only has one stream, default module information is still needed to ensure that a package can be installed without enabling the module explicitly. Here's an example.

---\ndocument: modulemd-defaults\nversion: 1\ndata:\n  module: httpd\n  stream: 2.4\n  profiles:\n    2.4: [common]\n...\n

This type of information is expected by pungi as a default modules repo that can be configured. These YAML's are not with the modules themselves. They are brought in when the repos are being created in the first place.

In the context of lazybuilder, it checks for defaults if enabled and then the final repo that's made of the results will immediately have the information at the top. See the references below for the jinja template that lazybuilder uses to generate this information.

As a final note, let's say an update comes in for postgresql and you want to ensure that the old version of postgresql 10 and the updated version of 10 can stay together. This is when the final module data is combined together and then it's added into the repo using modifyrepo_c. Note though, you do not have to have the modulemd-defaults provided again. You can have it once such as the first time you made the repo in the first place, and it will still work.

"},{"location":"rpm/local_module_builds/#building-the-packages","title":"Building the packages","text":"

So we have an idea of how the module data itself is made and managed. All there is left to do is to do a chain build in mock. The kicker is you need to pay attention to the build order that is assigned to each package being built. If a build order isn't assigned, assume that it's group 0 and will be built first. This does not stop 0 being assigned, but just know that buildorder being omitted implies group 0. See below.

    components:\n        rpms:\n            first:\n                rationale: core functions\n                ref: 3.0\n                buildorder: 0\n            second:\n                rationale: ui\n                ref: latest\n                buildorder: 0\n            third:\n                rationale: front end\n                ref: latest\n                buildorder: 1\n

What this shows is that the packages in build group 0 can be built simultaneously in the context of Koji+MBS. For a local build, you'd just put them first in the list. Basically each of these groups have to be done, completed, and available right away for the next package or set of packages. For koji+mbs, they do this automatically since they have a tag/repo that gets updated on each completion and the builds are done in parallel.

For mock, a chain build will always have an internal repo that it uses, so each completed package will have a final createrepo done on it before moving on to the next package in the list. It's not parallel like koji, but it's still consistent.

Essentially a mock command would look like:

mock -r module.cfg \\\n  --chain \\\n  --localrepo /var/lib/mock/modulename \\\n  first.src.rpm \\\n  second.src.rpm \\\n  third.src.rpm\n
"},{"location":"rpm/local_module_builds/#making-the-final-yaml-and-repo","title":"Making the final YAML and repo","text":"

It's probably wise to have a template to make the module repo data off of. It's the same as having a script to \"transmodrify\" the module data properly to be used. Having a template will simplify a lot of things and will make it easier to convert the data from git and then the final build artifacts and data that makes the module data. The lazybuilder template is a good starting point, though it is a bit ugly, being made in jinja. It can be made better using python or even golang.

Regardless, you should have it templated or scripted somehow. See the references in the next section.

"},{"location":"rpm/local_module_builds/#a-note-about-virtual-modules","title":"A note about virtual modules","text":"

Virtual modules are weird. They do not have a module dist tag, and they are just built like... any other RPM. The difference here is that a virtual module while it will should have an api['rpms'] list, it will not have an artifacts section.

A huge example of this is perl:5.26 in EL8. perl 5.26 is the default version. If you install perl-interpreter, you'll get perl-interpreter-5.26.3-419.el8_4.1.x86_64. Notice how it doesn't have a module tag? That's because it wasn't built directly in MBS. There are not many virtual modules, but this is important to keep in mind that these do in fact exist. The module yaml itself will not have a list of packages to build, aka a \"components\" section. Here's the current EL8 perl 5.26 example.

document: modulemd\nversion: 2\ndata:\n    summary: Practical Extraction and Report Language\n    description: >\n        Perl is a high-level programming language with roots in C, sed, awk\n        and shell scripting. Perl is good at handling processes and files, and\n        is especially good at handling text. Perl's hallmarks are practicality\n        and efficiency. While it is used to do a lot of different things,\n        Perl's most common applications are system administration utilities\n        and web programming.\n    license:\n        module: [ MIT ]\n    dependencies:\n        - buildrequires:\n              platform: [el8]\n          requires:\n              platform: [el8]\n    references:\n        community: https://docs.pagure.org/modularity/\n    profiles:\n        common:\n            description: Interpreter and all Perl modules bundled within upstream Perl.\n            rpms:\n                - perl\n        minimal:\n            description: Only the interpreter as a standalone executable.\n            rpms:\n                - perl-interpreter\n    api:\n        rpms:\n            - perl\n            - perl-Archive-Tar\n            - perl-Attribute-Handlers\n            - perl-autodie\n            - perl-B-Debug\n            - perl-bignum\n            - perl-Carp\n            - perl-Compress-Raw-Bzip2\n            - perl-Compress-Raw-Zlib\n            - perl-Config-Perl-V\n            - perl-constant\n            - perl-CPAN\n            - perl-CPAN-Meta\n            - perl-CPAN-Meta-Requirements\n            - perl-CPAN-Meta-YAML\n            - perl-Data-Dumper\n            - perl-DB_File\n            - perl-devel\n            - perl-Devel-Peek\n            - perl-Devel-PPPort\n            - perl-Devel-SelfStubber\n            - perl-Digest\n            - perl-Digest-MD5\n            - perl-Digest-SHA\n            - perl-Encode\n            - perl-Encode-devel\n            - perl-encoding\n            - perl-Env\n            - perl-Errno\n            - perl-experimental\n            - perl-Exporter\n            - perl-ExtUtils-CBuilder\n            - perl-ExtUtils-Command\n            - perl-ExtUtils-Embed\n            - perl-ExtUtils-Install\n            - perl-ExtUtils-MakeMaker\n            - perl-ExtUtils-Manifest\n            - perl-ExtUtils-Miniperl\n            - perl-ExtUtils-MM-Utils\n            - perl-ExtUtils-ParseXS\n            - perl-File-Fetch\n            - perl-File-Path\n            - perl-File-Temp\n            - perl-Filter\n            - perl-Filter-Simple\n            - perl-generators\n            - perl-Getopt-Long\n            - perl-HTTP-Tiny\n            - perl-interpreter\n            - perl-IO\n            - perl-IO-Compress\n            - perl-IO-Socket-IP\n            - perl-IO-Zlib\n            - perl-IPC-Cmd\n            - perl-IPC-SysV\n            - perl-JSON-PP\n            - perl-libnet\n            - perl-libnetcfg\n            - perl-libs\n            - perl-Locale-Codes\n            - perl-Locale-Maketext\n            - perl-Locale-Maketext-Simple\n            - perl-macros\n            - perl-Math-BigInt\n            - perl-Math-BigInt-FastCalc\n            - perl-Math-BigRat\n            - perl-Math-Complex\n            - perl-Memoize\n            - perl-MIME-Base64\n            - perl-Module-CoreList\n            - perl-Module-CoreList-tools\n            - perl-Module-Load\n            - perl-Module-Load-Conditional\n            - perl-Module-Loaded\n            - perl-Module-Metadata\n            - perl-Net-Ping\n            - perl-open\n            - perl-Params-Check\n            - perl-parent\n            - perl-PathTools\n            - perl-Perl-OSType\n            - perl-perlfaq\n            - perl-PerlIO-via-QuotedPrint\n            - perl-Pod-Checker\n            - perl-Pod-Escapes\n            - perl-Pod-Html\n            - perl-Pod-Parser\n            - perl-Pod-Perldoc\n            - perl-Pod-Simple\n            - perl-Pod-Usage\n            - perl-podlators\n            - perl-Scalar-List-Utils\n            - perl-SelfLoader\n            - perl-Socket\n            - perl-Storable\n            - perl-Sys-Syslog\n            - perl-Term-ANSIColor\n            - perl-Term-Cap\n            - perl-Test\n            - perl-Test-Harness\n            - perl-Test-Simple\n            - perl-tests\n            - perl-Text-Balanced\n            - perl-Text-ParseWords\n            - perl-Text-Tabs+Wrap\n            - perl-Thread-Queue\n            - perl-threads\n            - perl-threads-shared\n            - perl-Time-HiRes\n            - perl-Time-Local\n            - perl-Time-Piece\n            - perl-Unicode-Collate\n            - perl-Unicode-Normalize\n            - perl-utils\n            - perl-version\n    # We do not build any packages because they are already available\n    # in BaseOS or AppStream repository. We cannnot replace BaseOS\n    # packages.\n    #components:\n    #    rpms:\n
"},{"location":"rpm/local_module_builds/#reference","title":"Reference","text":"

Below is a reference for what's in a module's data. Some keys are optional. There'll also be an example from lazybuilder, which uses jinja to template out the final data that is used in a repo.

"},{"location":"rpm/local_module_builds/#module-template-and-known-keys","title":"Module Template and Known Keys","text":"

Below are the keys that are expected in the YAML for both defaults and the actual module build itself. Each item will have information on the type of value it is (eg, is it a string, list), if it's optional or mandatory, plus comments that may point out what's valid in source data rather than final repo data. Some of the data below may not be used in EL, but it's important to know what is possible and what could be expected.

This information was copied from: Fedora Modularity

# Document type identifier\n# `document: modulemd-defaults` describes the default stream and profiles for\n# a module.\ndocument: modulemd-defaults\n# Module metadata format version\nversion: 1\ndata:\n    # Module name that the defaults are for, required.\n    module: foo\n    # A 64-bit unsigned integer. Use YYYYMMDDHHMM to easily identify the last\n    # modification time. Use UTC for consistency.\n    # When merging, entries with a newer 'modified' value will override any\n    # earlier values. (optional)\n    modified: 201812071200\n    # Module stream that is the default for the module, optional.\n    stream: \"x.y\"\n    # Module profiles indexed by the stream name, optional\n    # This is a dictionary of stream names to a list of default profiles to be\n    # installed.\n    profiles:\n        'x.y': []\n        bar: [baz, snafu]\n    # System intents dictionary, optional. Indexed by the intent name.\n    # Overrides stream/profiles for intent.\n    intents:\n        desktop:\n            # Module stream that is the default for the module, required.\n            # Overrides the above values for systems with this intent.\n            stream: \"y.z\"\n            # Module profiles indexed by the stream name, required\n            # Overrides the above values for systems with this intent.\n            # From the above, foo:x.y has \"other\" as the value and foo:bar has\n            # no default profile.\n            profiles:\n                'y.z': [blah]\n                'x.y': [other]\n        server:\n            # Module stream that is the default for the module, required.\n            # Overrides the above values for systems with this intent.\n            stream: \"x.y\"\n            # Module profiles indexed by the stream name, required\n            # Overrides the above values for systems with this intent.\n            # From the above foo:x.y and foo:bar have no default profile.\n            profiles:\n                'x.y': []\n

Note: The glossary explains this, but remember that AUTOMATIC means that it will typically not be in the module data itself, and will likely be in repo data itself. There are also spots where thare are things that are MANDATORY but also do not show up in a lot of modules, because the implicit/default option turns off that section.

Note: There is a large chunk of these keys and values that state they are AUTOMATIC and they do show up in the module data as a result of the module data source and/or the build system doing work. An example of this is arch, among others.

##############################################################################\n# Glossary:                                                                  #\n#                                                                            #\n# build system: The process by which a module is built and packaged. In many #\n# cases, this will be the Module Build Service tool, but this term is used   #\n# as a catch-all to describe any mechanism for producing a yum repository    #\n# containing modular content from input module metadata files.               #\n#                                                                            #\n#                                                                            #\n# == Attribute Types ==                                                      #\n#                                                                            #\n# MANDATORY: Attributes of this type must be filled in by the packager of    #\n# this module. They must also be preserved and provided in the output        #\n# metadata produced by the build system for inclusion into a repository.     #\n#                                                                            #\n# OPTIONAL: Attributes of this type may be provided by the packager of this  #\n# module, when appropriate. If they are provided, they must also be          #\n# preserved and provided in the output metadata produced by the build        #\n# system for inclusion into a repository.                                    #\n#                                                                            #\n# AUTOMATIC: Attributes of this type must be present in the repository       #\n# metadata, but they may be left unspecified by the packager. In this case,  #\n# the build system is responsible for generating an appropriate value for    #\n# the attribute and including it in the repository metadata. If the packager #\n# specifies this attribute explicitly, it must be preserved and provided in  #\n# the output metadata for inclusion into a repository.                       #\n#                                                                            #\n# The definitions above describe the expected behavior of the build system   #\n# operating in its default configuration. It is permissible for the build    #\n# system to override user-provided entries through non-default operating     #\n# modes. If such changes are made, all items indicated as being required for #\n# the output repository must still be present.                               #\n##############################################################################\n\n\n# Document type identifier\n# `document: modulemd` describes the contents of a module stream\ndocument: modulemd\n\n# Module metadata format version\nversion: 2\n\ndata:\n    # name:\n    # The name of the module\n    # Filled in by the build system, using the VCS repository name as the name\n    # of the module.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    name: foo\n\n    # stream:\n    # Module update stream\n    # Filled in by the buildsystem, using the VCS branch name as the name of\n    # the stream.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    stream: \"latest\"\n\n    # version:\n    # Module version, 64-bit unsigned integer\n    # If this value is unset (or set to zero), it will be filled in by the\n    # buildsystem, using the VCS commit timestamp.  Module version defines the\n    # upgrade path for the particular update stream.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    version: 20160927144203\n\n    # context:\n    # Module context flag\n    # The context flag serves to distinguish module builds with the\n    # same name, stream and version and plays an important role in\n    # automatic module stream name expansion.\n    #\n    # If 'static_context' is unset or equal to FALSE:\n    #   Filled in by the buildsystem.  A short hash of the module's name,\n    #   stream, version and its expanded runtime dependencies. The exact\n    #   mechanism for generating the hash is unspecified.\n    #\n    #   Type: AUTOMATIC\n    #\n    #   Mandatory for module metadata in a yum/dnf repository.\n    #\n    # If 'static_context' is set to True:\n    #   The context flag is a string of up to thirteen [a-zA-Z0-9_] characters\n    #   representing a build and runtime configuration for this stream. This\n    #   string is arbitrary but must be unique in this module stream.\n    #\n    #   Type: MANDATORY\n    static_context: false\n    context: c0ffee43\n\n    # arch:\n    # Module artifact architecture\n    # Contains a string describing the module's artifacts' main hardware\n    # architecture compatibility, distinguishing the module artifact,\n    # e.g. a repository, from others with the same name, stream, version and\n    # context.  This is not a generic hardware family (i.e. basearch).\n    # Examples: i386, i486, armv7hl, x86_64\n    # Filled in by the buildsystem during the compose stage.\n    #\n    # Type: AUTOMATIC\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    arch: x86_64\n\n    # summary:\n    # A short summary describing the module\n    #\n    # Type: MANDATORY\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    summary: An example module\n\n    # description:\n    # A verbose description of the module\n    #\n    # Type: MANDATORY\n    #\n    # Mandatory for module metadata in a yum/dnf repository.\n    description: >-\n        A module for the demonstration of the metadata format. Also,\n        the obligatory lorem ipsum dolor sit amet goes right here.\n\n    # servicelevels:\n    # Service levels\n    # This is a dictionary of important dates (and possibly supplementary data\n    # in the future) that describes the end point of certain functionality,\n    # such as the date when the module will transition to \"security fixes only\"\n    # or go completely end-of-life.\n    # Filled in by the buildsystem.  Service level names might have special\n    # meaning to other systems.  Defined externally.\n    #\n    # Type: AUTOMATIC\n    servicelevels:\n        rawhide:\n            # EOL dates are the ISO 8601 format.\n            eol: 2077-10-23\n        stable_api:\n            eol: 2077-10-23\n        bug_fixes:\n            eol: 2077-10-23\n        security_fixes:\n            eol: 2077-10-23\n\n    # license:\n    # Module and content licenses in the Fedora license identifier\n    # format\n    #\n    # Type: MANDATORY\n    license:\n        # module:\n        # Module license\n        # This list covers licenses used for the module metadata and\n        # possibly other files involved in the creation of this specific\n        # module.\n        #\n        # Type: MANDATORY\n        module:\n            - MIT\n\n        # content:\n        # Content license\n        # A list of licenses used by the packages in the module.\n        # This should be populated by build tools, not the module author.\n        #\n        # Type: AUTOMATIC\n        #\n        # Mandatory for module metadata in a yum/dnf repository.\n        content:\n            - ASL 2.0\n            - GPL+ or Artistic\n\n    # xmd:\n    # Extensible metadata block\n    # A dictionary of user-defined keys and values.\n    # Defaults to an empty dictionary.\n    #\n    # Type: OPTIONAL\n    xmd:\n        some_key: some_data\n\n    # dependencies:\n    # Module dependencies, if any\n    # A list of dictionaries describing build and runtime dependencies\n    # of this module.  Each list item describes a combination of dependencies\n    # this module can be built or run against.\n    # Dependency keys are module names, dependency values are lists of\n    # required streams.  The lists can be both inclusive (listing compatible\n    # streams) or exclusive (accepting every stream except for those listed).\n    # An empty list implies all active existing streams are supported.\n    # Requiring multiple streams at build time will result in multiple\n    # builds.  Requiring multiple streams at runtime implies the module\n    # is compatible with all of them.  If the same module streams are listed\n    # in both the build time and the runtime block, the build tools translate\n    # the runtime block so that it matches the stream the module was built\n    # against.  Multiple builds result in multiple output modulemd files.\n    # See below for an example.\n    # The example below illustrates how to build the same module in four\n    # different ways, with varying build time and runtime dependencies.\n    #\n    # Type: OPTIONAL\n    dependencies:\n        # Build on all available platforms except for f27, f28 and epel7\n        # After build, the runtime dependency will match the one used for\n        # the build.\n        - buildrequires:\n              platform: [-f27, -f28, -epel7]\n          requires:\n              platform: [-f27, -f28, -epel7]\n\n        # For platform:f27 perform two builds, one with buildtools:v1, another\n        # with buildtools:v2 in the buildroot.  Both will also utilize\n        # compatible:v3.  At runtime, buildtools isn't required and either\n        # compatible:v3 or compatible:v4 can be installed.\n        - buildrequires:\n              platform: [f27]\n              buildtools: [v1, v2]\n              compatible: [v3]\n          requires:\n              platform: [f27]\n              compatible: [v3, v4]\n\n        # For platform:f28 builds, require either runtime:a or runtime:b at\n        # runtime.  Only one build is performed.\n        - buildrequires:\n              platform: [f28]\n          requires:\n              platform: [f28]\n              runtime: [a, b]\n\n        # For platform:epel7, build against against all available extras\n        # streams and moreextras:foo and moreextras:bar.  The number of builds\n        # in this case will be 2 * <the number of extras streams available>.\n        # At runtime, both extras and moreextras will match whatever stream was\n        # used for build.\n        - buildrequires:\n              platform: [epel7]\n              extras: []\n              moreextras: [foo, bar]\n          requires:\n              platform: [epel7]\n              extras: []\n              moreextras: [foo, bar]\n\n    # references:\n    # References to external resources, typically upstream\n    #\n    # Type: OPTIONAL\n    references:\n        # community:\n        # Upstream community website, if it exists\n        #\n        # Type: OPTIONAL\n        community: http://www.example.com/\n\n        # documentation:\n        # Upstream documentation, if it exists\n        #\n        # Type: OPTIONAL\n        documentation: http://www.example.com/\n\n        # tracker:\n        # Upstream bug tracker, if it exists\n        #\n        # Type: OPTIONAL\n        tracker: http://www.example.com/\n\n    # profiles:\n    # Profiles define the end user's use cases for the module. They consist of\n    # package lists of components to be installed by default if the module is\n    # enabled. The keys are the profile names and contain package lists by\n    # component type. There are several profiles defined below. Suggested\n    # behavior for package managers is to just enable repository for selected\n    # module. Then users are able to install packages on their own. If they\n    # select a specific profile, the package manager should install all\n    # packages of that profile.\n    # Defaults to no profile definitions.\n    #\n    # Type: OPTIONAL\n    profiles:\n\n        # An example profile that defines a set of packages which are meant to\n        # be installed inside a container image artifact.\n        #\n        # Type: OPTIONAL\n        container:\n            rpms:\n                - bar\n                - bar-devel\n\n        # An example profile that delivers a minimal set of packages to\n        # provide this module's basic functionality. This is meant to be used\n        # on target systems where size of the distribution is a real concern.\n        #\n        # Type: Optional\n        minimal:\n            # A verbose description of the module, optional\n            description: Minimal profile installing only the bar package.\n            rpms:\n                - bar\n\n        # buildroot:\n        # This is a special reserved profile name.\n        #\n        # This provides a listing of packages that will be automatically\n        # installed into the buildroot of all component builds that are started\n        # after a component builds with its `buildroot: True` option set.\n        #\n        # The primary purpose of this is for building RPMs that change\n        # the build environment, such as those that provide new RPM\n        # macro definitions that can be used by subsequent builds.\n        #\n        # Specifically, it is used to flesh out the build group in koji.\n        #\n        # Type: OPTIONAL\n        buildroot:\n            rpms:\n                - bar-devel\n\n        # srpm-buildroot:\n        # This is a special reserved profile name.\n        #\n        # This provides a listing of packages that will be automatically\n        # installed into the buildroot of all component builds that are started\n        # after a component builds with its `srpm-buildroot: True` option set.\n        #\n        # The primary purpose of this is for building RPMs that change\n        # the build environment, such as those that provide new RPM\n        # macro definitions that can be used by subsequent builds.\n        #\n        # Very similar to the buildroot profile above, this is used by the\n        # build system to specify any additional packages which should be\n        # installed during the buildSRPMfromSCM step in koji.\n        #\n        # Type: OPTIONAL\n        srpm-buildroot:\n            rpms:\n                - bar-extras\n\n    # api:\n    # Module API\n    # Defaults to no API.\n    #\n    # Type: OPTIONAL\n    api:\n        # rpms:\n        # The module's public RPM-level API.\n        # A list of binary RPM names that are considered to be the\n        # main and stable feature of the module; binary RPMs not listed\n        # here are considered \"unsupported\" or \"implementation details\".\n        # In the example here we don't list the xyz package as it's only\n        # included as a dependency of xxx.  However, we list a subpackage\n        # of bar, bar-extras.\n        # Defaults to an empty list.\n        #\n        # Type: OPTIONAL\n        rpms:\n            - bar\n            - bar-extras\n            - bar-devel\n            - baz\n            - xxx\n\n    # filter:\n    # Module component filters\n    # Defaults to no filters.\n    #\n    # Type: OPTIONAL\n    filter:\n        # rpms:\n        # RPM names not to be included in the module.\n        # By default, all built binary RPMs are included.  In the example\n        # we exclude a subpackage of bar, bar-nonfoo from our module.\n        # Defaults to an empty list.\n        #\n        # Type: OPTIONAL\n        rpms:\n            - baz-nonfoo\n\n    # demodularized:\n    # Artifacts which became non-modular\n    # Defaults to no demodularization.\n    # Type: OPTIONAL\n    demodularized:\n        # rpms:\n        # A list of binary RPM package names which where removed from\n        # a module. This list explains to a package mananger that the packages\n        # are not part of the module anymore and up-to-now same-named masked\n        # non-modular packages should become available again. This enables\n        # moving a package from a module to a set of non-modular packages. The\n        # exact implementation of the demodularization (e.g. whether it\n        # applies to all modules or only to this stream) is defined by the\n        # package manager.\n        # Defaults to an empty list.\n        #\n        # Type: OPTIONAL\n        rpms:\n            - bar-old\n\n    # buildopts:\n    # Component build options\n    # Additional per component type module-wide build options.\n    #\n    # Type: OPTIONAL\n    buildopts:\n        # rpms:\n        # RPM-specific build options\n        #\n        # Type: OPTIONAL\n        rpms:\n            # macros:\n            # Additional macros that should be defined in the\n            # RPM buildroot, appended to the default set.  Care should be\n            # taken so that the newlines are preserved.  Literal style\n            # block is recommended, with or without the trailing newline.\n            #\n            # Type: OPTIONAL\n            macros: |\n                %demomacro 1\n                %demomacro2 %{demomacro}23\n\n            # whitelist:\n            # Explicit list of package build names this module will produce.\n            # By default the build system only allows components listed under\n            # data.components.rpms to be built as part of this module.\n            # In case the expected RPM build names do not match the component\n            # names, the list can be defined here.\n            # This list overrides rather then just extends the default.\n            # List of package build names without versions.\n            #\n            # Type: OPTIONAL\n            whitelist:\n                - fooscl-1-bar\n                - fooscl-1-baz\n                - xxx\n                - xyz\n\n        # arches:\n        # Instructs the build system to only build the\n        # module on this specific set of architectures.\n        # Includes specific hardware architectures, not families.\n        # See the data.arch field for details.\n        # Defaults to all available arches.\n        #\n        # Type: OPTIONAL\n        arches: [i686, x86_64]\n\n    # components:\n    # Functional components of the module\n    #\n    # Type: OPTIONAL\n    components:\n        # rpms:\n        # RPM content of the module\n        # Keys are the VCS/SRPM names, values dictionaries holding\n        # additional information.\n        #\n        # Type: OPTIONAL\n        rpms:\n            bar:\n                # name:\n                # The real name of the package, if it differs from the key in\n                # this dictionary. Used when bootstrapping to build a\n                # bootstrapping ref before building the package for real.\n                #\n                # Type: OPTIONAL\n                name: bar-real\n\n                # rationale:\n                # Why is this component present.\n                # A simple, free-form string.\n                #\n                # Type: MANDATORY\n                rationale: We need this to demonstrate stuff.\n\n                # repository:\n                # Use this repository if it's different from the build\n                # system configuration.\n                #\n                # Type: AUTOMATIC\n                repository: https://pagure.io/bar.git\n\n                # cache:\n                # Use this lookaside cache if it's different from the\n                # build system configuration.\n                #\n                # Type: AUTOMATIC\n                cache: https://example.com/cache\n\n                # ref:\n                # Use this specific commit hash, branch name or tag for\n                # the build.  If ref is a branch name, the branch HEAD\n                # will be used.  If no ref is given, the master branch\n                # is assumed.\n                #\n                # Type: AUTOMATIC\n                ref: 26ca0c0\n\n                # buildafter:\n                # Use the \"buildafter\" value to specify that this component\n                # must be be ordered later than some other entries in this map.\n                # The values of this array come from the keys of this map and\n                # not the real component name to enable bootstrapping.\n                # Use of both buildafter and buildorder in the same document is\n                # prohibited, as they will conflict.\n                #\n                # Note: The use of buildafter is not currently supported by the\n                # Fedora module build system.\n                #\n                # Type: AUTOMATIC\n                #\n                # buildafter:\n                #    - baz\n\n                # buildonly:\n                # Use the \"buildonly\" value to indicate that all artifacts\n                # produced by this component are intended only for building\n                # this component and should be automatically added to the\n                # data.filter.rpms list after the build is complete.\n                # Defaults to \"false\" if not specified.\n                #\n                # Type: AUTOMATIC\n                buildonly: false\n\n            # baz builds RPM macros for the other components to use\n            baz:\n                rationale: Demonstrate updating the buildroot contents.\n\n                # buildroot:\n                # If buildroot is set to True, the packages listed in this\n                # module's 'buildroot' profile will be installed into the\n                # buildroot of any component built in buildorder/buildafter\n                # batches begun after this one, without requiring that those\n                # packages are listed among BuildRequires.\n                #\n                # The primary purpose of this is for building RPMs that change\n                # the build environment, such as those that provide new RPM\n                # macro definitions that can be used by subsequent builds.\n                #\n                # Defaults to \"false\" if not specified.\n                #\n                # Type: OPTIONAL\n                buildroot: true\n\n                # srpm-buildroot:\n                # If srpm-buildroot is set to True, the packages listed in this\n                # module's 'srpm-buildroot' profile will be installed into the\n                # buildroot of any component built in buildorder/buildafter\n                # batches begun after this one, without requiring that those\n                # packages are listed among BuildRequires.\n                #\n                # The primary purpose of this is for building RPMs that change\n                # the build environment, such as those that provide new RPM\n                # macro definitions that can be used by subsequent builds.\n                #\n                # Defaults to \"false\" if not specified.\n                #\n                # Type: OPTIONAL\n                srpm-buildroot: true\n\n                # See component xyz for a complete description of buildorder\n                #\n                # build this component before any others so that the macros it\n                # creates are available to all of them.\n                buildorder: -1\n\n            xxx:\n                rationale: xxx demonstrates arches and multilib.\n\n                # arches:\n                # xxx is only available on the listed architectures.\n                # Includes specific hardware architectures, not families.\n                # See the data.arch field for details.\n                # Instructs the build system to only build the\n                # component on this specific set of architectures.\n                # If data.buildopts.arches is also specified,\n                # this must be a subset of those architectures.\n                # Defaults to all available arches.\n                #\n                # Type: AUTOMATIC\n                arches: [i686, x86_64]\n\n                # multilib:\n                # A list of architectures with multilib\n                # installs, i.e. both i686 and x86_64\n                # versions will be installed on x86_64.\n                # Includes specific hardware architectures, not families.\n                # See the data.arch field for details.\n                # Defaults to no multilib.\n                #\n                # Type: AUTOMATIC\n                multilib: [x86_64]\n\n            xyz:\n                rationale: xyz is a bundled dependency of xxx.\n\n                # buildorder:\n                # Build order group\n                # When building, components are sorted by build order tag\n                # and built in batches grouped by their buildorder value.\n                # Built batches are then re-tagged into the buildroot.\n                # Multiple components can have the same buildorder index\n                # to map them into build groups.\n                # Defaults to zero.\n                # Integer, from an interval [-(2^63), +2^63-1].\n                # In this example, bar, baz and xxx are built first in\n                # no particular order, then tagged into the buildroot,\n                # then, finally, xyz is built.\n                # Use of both buildafter and buildorder in the same document is\n                # prohibited, as they will conflict.\n                #\n                # Type: OPTIONAL\n                buildorder: 10\n\n        # modules:\n        # Module content of this module\n        # Included modules are built in the shared buildroot, together with\n        # other included content.  Keys are module names, values additional\n        # component information.  Note this only includes components and their\n        # properties from the referenced module and doesn't inherit any\n        # additional module metadata such as the module's dependencies or\n        # component buildopts.  The included components are built in their\n        # defined buildorder as sub-build groups.\n        #\n        # Type: OPTIONAL\n        modules:\n            includedmodule:\n\n                # rationale:\n                # Why is this module included?\n                #\n                # Type: MANDATORY\n                rationale: Included in the stack, just because.\n\n                # repository:\n                # Link to VCS repository that contains the modulemd file\n                # if it differs from the buildsystem default configuration.\n                #\n                # Type: AUTOMATIC\n                repository: https://pagure.io/includedmodule.git\n\n                # ref:\n                # See the rpms ref.\n                #\n                # Type: AUTOMATIC\n                ref: somecoolbranchname\n\n                # buildorder:\n                # See the rpms buildorder.\n                #\n                # Type: AUTOMATIC\n                buildorder: 100\n\n    # artifacts:\n    # Artifacts shipped with this module\n    # This section lists binary artifacts shipped with the module, allowing\n    # software management tools to handle module bundles.  This section is\n    # populated by the module build system.\n    #\n    # Type: AUTOMATIC\n    artifacts:\n\n        # rpms:\n        # RPM artifacts shipped with this module\n        # A set of NEVRAs associated with this module. An epoch number in the\n        # NEVRA string is mandatory.\n        #\n        # Type: AUTOMATIC\n        rpms:\n            - bar-0:1.23-1.module_deadbeef.x86_64\n            - bar-devel-0:1.23-1.module_deadbeef.x86_64\n            - bar-extras-0:1.23-1.module_deadbeef.x86_64\n            - baz-0:42-42.module_deadbeef.x86_64\n            - xxx-0:1-1.module_deadbeef.x86_64\n            - xxx-0:1-1.module_deadbeef.i686\n            - xyz-0:1-1.module_deadbeef.x86_64\n\n        # rpm-map:\n        # The rpm-map exists to link checksums from repomd to specific\n        # artifacts produced by this module. Any item in this list must match\n        # an entry in the data.artifacts.rpms section.\n        #\n        # Type: AUTOMATIC\n        rpm-map:\n\n          # The digest-type of this checksum.\n          #\n          # Type: MANDATORY\n          sha256:\n\n            # The checksum of the artifact being sought.\n            #\n            # Type: MANDATORY\n            ee47083ed80146eb2c84e9a94d0836393912185dcda62b9d93ee0c2ea5dc795b:\n\n              # name:\n              # The RPM name.\n              #\n              # Type: Mandatory\n              name: bar\n\n              # epoch:\n              # The RPM epoch.\n              # A 32-bit unsigned integer.\n              #\n              # Type: OPTIONAL\n              epoch: 0\n\n              # version:\n              # The RPM version.\n              #\n              # Type: MANDATORY\n              version: 1.23\n\n              # release:\n              # The RPM release.\n              #\n              # Type: MANDATORY\n              release: 1.module_deadbeef\n\n              # arch:\n              # The RPM architecture.\n              #\n              # Type: MANDATORY\n              arch: x86_64\n\n              # nevra:\n              # The complete RPM NEVRA.\n              #\n              # Type: MANDATORY\n              nevra: bar-0:1.23-1.module_deadbeef.x86_64\n
"},{"location":"rpm/local_module_builds/#module-template-and-keys-using-jinja","title":"Module Template and Keys using jinja","text":"
{% if module_default_data is defined %}\n---\ndocument: modulemd-defaults\nversion: {{ module_default_data.version }}\ndata:\n  module: {{ module_default_data.data.module }}\n  stream: {{ module_default_data.data.stream }}\n  profiles:\n{% for k in module_default_data.data.profiles %}\n    {{ k }}: [{{ module_default_data.data.profiles[k]|join(', ') }}]\n{% endfor %}\n...\n{% endif %}\n---\ndocument: {{ module_data.document }}\nversion: {{ module_data.version }}\ndata:\n  name: {{ source_name | default(\"source\") }}\n  stream: \"{{ module_data.data.stream }}\"\n  version: {{ module_version | default(8040) }}\n  context: {{ module_context | default('01010110') }}\n  arch: {{ mock_arch | default(ansible_architecture) }}\n  summary: {{ module_data.data.summary | wordwrap(width=79) | indent(width=4) }}\n  description: {{ module_data.data.description | wordwrap(width=79) | indent(width=4) }}\n  license:\n{% for (key, value) in module_data.data.license.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n  xmd: {}\n{% if module_data.data.dependencies is defined %}\n  dependencies:\n{% for l in module_data.data.dependencies %}\n{% for r in l.keys() %}\n{% if loop.index == 1 %}\n  - {{ r }}:\n{% else %}\n    {{ r }}:\n{% endif %}\n{% for (m, n) in l[r].items() %}\n      {{ m }}: [{{ n | join(', ') }}]\n{% endfor %}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if module_data.data.filter is defined %}\n  filter:\n{% for (key, value) in module_data.data.filter.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n{% endif %}\n{% if module_data.data.profiles is defined %}\n  profiles:\n{% for (key, value) in module_data.data.profiles.items() %}\n    {{ key }}:\n{% for (key, value) in value.items() %}\n{% if value is iterable and (value is not string and value is not mapping) %}\n      {{ key | indent(width=6) }}:\n      - {{ value | join('\\n      - ') }}\n{% else %}\n      {{ key | indent(width=6) }}: {{ value }}\n{% endif %}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if module_data.data.api is defined %}\n  api:\n{% for (key, value) in module_data.data.api.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n{% endif %}\n{% if module_data.data.buildopts is defined %}\n  buildopts:\n{% for (key, value) in module_data.data.buildopts.items() %}\n    {{ key }}:\n{% for (key, value) in value.items() %}\n      {{ key }}: |\n        {{ value | indent(width=8) }}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if module_data.data.references is defined %}\n  references:\n{% for (key, value) in module_data.data.references.items() %}\n    {{ key }}: {{ value }}\n{% endfor %}\n{% endif %}\n{% if module_data.data.components is defined %}\n  components:\n{% for (key, value) in module_data.data.components.items() %}\n    {{ key }}:\n{% for (key, value) in value.items() %}\n      {{ key }}:\n{% for (key, value) in value.items() %}\n{% if value is iterable and (value is not string and value is not mapping) %}\n        {{ key | indent(width=8) }}: [{{ value | join(', ') }}]\n{% else %}\n        {{ key | indent(width=8) }}: {{ value }}\n{% endif %}\n{% endfor %}\n{% endfor %}\n{% endfor %}\n{% endif %}\n{% if artifacts is defined %}\n  artifacts:\n{% for (key, value) in artifacts.items() %}\n    {{ key }}:\n    - {{ value | join('\\n    - ') }}\n{% endfor %}\n{% endif %}\n...\n
"},{"location":"sop/","title":"SOP (Standard Operationg Procedures)","text":"

This section goes over the various SOP's for SIG/Core. Please use the menu items to find the various pages of interest.

"},{"location":"sop/sop_compose/","title":"SOP: Compose and Repo Sync for Rocky Linux and Peridot","text":"

This SOP covers how the Rocky Linux Release Engineering Team handles composes and repository syncs for the distribution. It contains information of the scripts that are utilized and in what order, depending on the use case.

"},{"location":"sop/sop_compose/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"sop/sop_compose/#related-git-repositories","title":"Related Git Repositories","text":"

There are several git repositories used in the overall composition of a repository or a set of repositories.

Pungi - This repository contains all the necessary pungi configuration files that peridot translates into its own configuration. Pungi is no longer used for Rocky Linux.

Comps - This repository contains all the necessary comps (which are groups and other data) for a given major version. Peridot (and pungi) use this information to properly build repositories.

Toolkit - This repository contains various scripts and utilities used by Release Engineering, such as syncing composes, functionality testing, and mirror maintenance.

"},{"location":"sop/sop_compose/#composing-repositories","title":"Composing Repositories","text":""},{"location":"sop/sop_compose/#mount-structure","title":"Mount Structure","text":"

There is a designated system that takes care of composing repositories. These systems contain the necessary EFS/NFS mounts for the staging and production repositories as well as composes.

  • /mnt/compose -> Compose data
  • /mnt/repos-staging -> Staging
  • /mnt/repos-production -> Production
"},{"location":"sop/sop_compose/#empanadas","title":"Empanadas","text":"

Each repository or set of repositories are controlled by various comps and pungi configurations that are translated into peridot. Empanadas is used to run a reposync from peridot's yumrepofs repositories, generate ISO's, and create a pungi compose look-a-like. Because of this, the comps and pungi-rocky configuration is not referenced with empanadas.

"},{"location":"sop/sop_compose/#running-a-compose","title":"Running a Compose","text":"

First, the toolkit must be cloned. In the iso/empanadas directory, run poetry install. You'll then have access to the various commands needed:

  • sync-from-peridot
  • build-iso
  • build-iso-extra
  • pull-unpack-tree
  • pull-cloud-image
  • finalize-compose
"},{"location":"sop/sop_compose/#full-compose","title":"Full Compose","text":"

To perform a full compose, this order is expected (replacing X with major version or config profile)

# This creates a brand new directory under /mnt/compose/X and symlinks it to latest-Rocky-X\npoertry run sync-from-peridot --release X --hashed --repoclosure --full-run\n\n# On each architecture, this must be ran to generate the lorax images\n# !! Use --rc if the image is a release candidate or a beta image\n# Note: This is typically done using kubernetes and uploaded to a bucket\npoetry run build-iso --release X --isolation=None\n\n# The images are pulled from the bucket\npoetry run pull-unpack-tree --release X\n\n# The extra ISO's (usually just DVD) are generated\n# !! Use --rc if the image is a release candidate or a beta image\n# !! Set --extra-iso-mode to mock if desired\n# !! If there is more than the dvd, remove --extra-iso dvd\npoetry run build-iso-extra --release X --extra-iso dvd --extra-iso-mode podman\n\n# This pulls the generic and EC2 cloud images\npoetry run pull-cloud-image --release X\n\n# This ensures everything is closed out for a release. This copies iso's, images,\n# generates metadata, and the like.\n# !! DO NOT RUN DURING INCREMENTAL UPDATES !!\npoetry run finalize-compose --release X\n
"},{"location":"sop/sop_compose/#incremental-compose","title":"Incremental Compose","text":"

It is possible to simply compose singular repos if you know which ones you want to sync. This can be done when it's not for a brand new release.

# Set your repos as desired. --arch is also acceptable.\n# --ignore-debug and --ignore-source are also acceptable options.\npoetry run sync-from-peridot --release X --hashed --clean-old-packages --repo X,Y,Z\n
"},{"location":"sop/sop_compose/#syncing-composes","title":"Syncing Composes","text":"

Syncing utilizes the sync scripts provided in the release engineering toolkit.

When the scripts are being ran, they are usually ran with a specific purpose, as each major version may be different.

The below are common vars files. common_X will override what's in common. Typically these set what repositories exist and how they are named or look at the top level. These also set the current major.minor release as necessary.

.\n\u251c\u2500\u2500 common\n\u251c\u2500\u2500 common_8\n\u251c\u2500\u2500 common_9\n

These are for the releases in general. What they do is noted below.

\u251c\u2500\u2500 gen-torrents.sh                  -> Generates torrents for images\n\u251c\u2500\u2500 minor-release-sync-to-staging.sh -> Syncs a minor release to staging\n\u251c\u2500\u2500 prep-staging-X.sh                -> Preps staging updates and signs repos (only for 8)\n\u251c\u2500\u2500 sign-repos-only.sh               -> Signs the repomd (only for 8)\n\u251c\u2500\u2500 sync-file-list-parallel.sh       -> Generates file lists in parallel for mirror sync scripts\n\u251c\u2500\u2500 sync-to-prod.sh                  -> Syncs staging to production\n\u251c\u2500\u2500 sync-to-prod.delete.sh           -> Syncs staging to production (deletes artifacts that are no longer in staging)\n\u251c\u2500\u2500 sync-to-prod-sig.sh              -> Syncs a sig provided compose to production\n\u251c\u2500\u2500 sync-to-staging.sh               -> Syncs a provided compose to staging\n\u251c\u2500\u2500 sync-to-staging.delete.sh        -> Syncs a provided compose to staging (deletes artifacts that are no longer in the compose)\n\u251c\u2500\u2500 sync-to-staging-sig.sh           -> Syncs a sig provided compose to staging\n

Generally, you will only run sync-to-staging.sh or sync-to-staging.delete.sh to sync. The former is for older releases, the latter is for newer releases. Optionally, if you are syncing a \"beta\" or \"lookahead\" release, you will need to also provide the RLREL variable as beta or lookahead.

# The below syncs to staging for Rocky Linux 8\nRLVER=8 bash sync-to-staging.sh Rocky\n# The below syncs to staging for Rocky Linux 9\nRLVER=9 bash sync-to-staging.delete.sh Rocky\n

Once the syncs are done, staging must be tested and vetted before being sent to production. Once staging is completed, it is synced to production.

# Set X to whatever release\nbash RLVER=X sync-to-prod.delete.sh\nbash sync-file-list-parallel.sh\n

During this phase, staging is rsynced with production, the file list is updated, and the full time list is also updated to allow mirrors to know that the repositories have been updated and that they can sync.

Note: If multiple releases are being updated, it is important to run the syncs to completion before running the file list parallel script.

"},{"location":"sop/sop_compose_8/","title":"SOP: Compose and Repo Sync for Rocky Linux 8","text":"

This SOP covers how the Rocky Linux Release Engineering Team handles composes and repository syncs for Rocky Linux 8. It contains information of the scripts that are utilized and in what order, depending on the use case.

Please see the other SOP for Rocky Linux 9+ that are managed via empanadas and peridot.

"},{"location":"sop/sop_compose_8/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"sop/sop_compose_8/#related-git-repositories","title":"Related Git Repositories","text":"

There are several git repositories used in the overall composition of a repository or a set of repositories.

Pungi - This repository contains all the necessary pungi configuration files for composes that come from koji. Pungi interacts with koji to build the composes.

Comps - This repository contains all the necessary comps (which are groups and other data) for a given major version. Pungi uses this information to properly build the repositories.

Toolkit - This repository contains various scripts and utilities used by Release Engineering, such as syncing composes, functionality testing, and mirror maintenance.

"},{"location":"sop/sop_compose_8/#composing-repositories","title":"Composing Repositories","text":"

For every stable script, there is an equal beta or lookahead script available.

"},{"location":"sop/sop_compose_8/#mount-structure","title":"Mount Structure","text":"

There is a designated system that takes care of composing repositories. These systems contain the necessary EFS/NFS mounts for the staging and production repositories as well as composes.

  • /mnt/koji -> Koji files store
  • /mnt/compose -> Compose data
  • /mnt/repos-staging -> Staging
  • /mnt/repos-production -> Production
"},{"location":"sop/sop_compose_8/#pungi","title":"Pungi","text":"

Each repository or set of repositories are controlled by various pungi configurations. For example, r8.conf will control the absolute base of Rocky Linux 8, which imports other git repository data as well as accompanying json or other configuration files.

"},{"location":"sop/sop_compose_8/#running-a-compose","title":"Running a Compose","text":"

Inside the pungi git repository, the folder scripts contain the necessary scripts that are ran to perform a compose. There are different types of composes:

  • produce -> Generates a full compose, generally used for minor releases, which generate new ISO's
  • update -> Generates a smaller compose, generally used for updates within a minor release cycle - ISO's are not generated

Each script is titled appropriately:

  • produce-X.sh -> Generates a full compose for X major release, typically set to the current minor release according to rX.conf
  • produce-X-full.sh -> Generates a full compose for X major release, including extras, plus, and devel in one go.
  • updates-X.sh -> Generates a smaller compose for X major release, typically set to the current minor release according to rX.conf
  • updates-X-NAME.sh -> Generates a compose for the specific compose, such as NFV, Rocky-devel, Extras, or Plus
  • updates-X-full.sh -> Generates a full incremental compose for the X release, which includes extras, plus, and devel in one go. Does NOT make ISO's.

When these scripts are ran, they generate an appropriate directory under /mnt/compose/X with a directory and an accompanying symlink. For example. If an update to Rocky was made using updates-8.sh, the below would be made:

drwxr-xr-x. 5 root  root  6144 Jul 21 17:44 Rocky-8-updates-20210721.1\nlrwxrwxrwx. 1 root  root    26 Jul 21 18:26 latest-Rocky-8 -> Rocky-8-updates-20210721.1\n

This setup also allows pungi to reuse previous package set data to reduce the time it takes to build a compose. Typically during a new minor release, all composes should be ran so they can be properly combined. Example of a typical order if releasing 8.X:

produce-8.sh\nupdates-8-devel.sh\nupdates-8-extras.sh\n\n# ! OR !\nproduce-8-full.sh\n
"},{"location":"sop/sop_compose_8/#syncing-composes","title":"Syncing Composes","text":"

Syncing utilizes the sync scripts provided in the release engineering toolkit.

When the scripts are being ran, they are usually ran for a specific purpose. They are also ran in a certain order to ensure integrity and consistency of a release.

The below are common vars files. common_X will override what's in common. Typically these set what repositories exist and how they are named or look at the top level. These also set the current major.minor release as necessary.

.\n\u251c\u2500\u2500 common\n\u251c\u2500\u2500 common_8\n\u251c\u2500\u2500 common_9\n

These are for the releases in general. What they do is noted below.

\u251c\u2500\u2500 gen-torrents.sh                  -> Generates torrents for images\n\u251c\u2500\u2500 minor-release-sync-to-staging.sh -> Syncs a minor release to staging\n\u251c\u2500\u2500 sign-repos-only.sh               -> Signs the repomd (only)\n\u251c\u2500\u2500 sync-to-prod.sh                  -> Syncs staging to production\n\u251c\u2500\u2500 sync-to-staging.sh               -> Syncs a provided compose to staging\n\u251c\u2500\u2500 sync-to-staging-sig.sh           -> Syncs a sig provided compose to staging\n

Generally, you will only run minor-release-sync-to-staging.sh when a full minor release is being produced. So for example, if 8.5 has been built out, you would run that after a compose. gen-torrents.sh would be ran shortly after.

When doing updates, the order of operations (preferably) would be:

* sync-to-staging.sh\n* sync-to-staging-sig.sh -> Only if sigs are updated\n* sync-to-prod.sh        -> After the initial testing, it is sent to prod.\n

An example of order:

# The below syncs to staging\nRLVER=8 bash sync-to-staging.sh Extras\nRLVER=8 bash sync-to-staging.sh Rocky-devel\nRLVER=8 bash sync-to-staging.sh Rocky\n

Once the syncs are done, staging must be tested and vetted before being sent to production. During this stage, the updateinfo.xml is also applied where necessary to the repositories to provide errata. Once staging is completed, it is synced to production.

pushd /mnt/repos-staging/mirror/pub/rocky/8.X\npython3.9 /usr/local/bin/apollo_tree -p $(pwd) -n 'Rocky Linux 8 $arch' -i Live -i Minimal -i devel -i extras -i images -i isos -i live -i metadata -i Devel -i plus -i nfv\npopd\nRLVER=8 bash sign-repos-only.sh\nRLVER=8 bash sync-to-prod.sh\nbash sync-file-list-parallel.sh\n

During this phase, staging is rsynced with production, the file list is updated, and the full time list is also updated to allow mirrors to know that the repositories have been updated and that they can sync.

Note: If multiple releases are being updated, it is important to run the syncs to completion before running the file list parallel script.

"},{"location":"sop/sop_compose_8/#quicker-composes","title":"Quicker Composes","text":"

On the designated compose box, there is a script that can do all of the incremental steps.

cd /root/cron\nbash stable-updates\n

The same goes for a full production.

bash stable\n
"},{"location":"sop/sop_compose_sig/","title":"SOP: Compose and Repo Sync for Rocky Linux Special Interest Groups","text":"

This SOP covers how the Rocky Linux Release Engineering Team handles composes and repository syncs for Special Interest Groups.

"},{"location":"sop/sop_compose_sig/#contact-information","title":"Contact Information","text":"Owner Release Engineering Team Email Contact releng@rockylinux.org Email Contact infrastructure@rockylinux.org Mattermost Contacts @label @mustafa @neil @tgo Mattermost Channels ~Development"},{"location":"sop/sop_compose_sig/#composing-repositories","title":"Composing Repositories","text":""},{"location":"sop/sop_compose_sig/#mount-structure","title":"Mount Structure","text":"

There is a designated system that takes care of composing repositories. These systems contain the necessary EFS/NFS mounts for the staging and production repositories as well as composes.

  • /mnt/compose -> Compose data
  • /mnt/repos-staging -> Staging
  • /mnt/repos-production -> Production
"},{"location":"sop/sop_compose_sig/#empanadas","title":"Empanadas","text":"

Each repository or set of repositories are controlled by various comps and pungi configurations that are translated into peridot. Empanadas is used to run a reposync from peridot's yumrepofs repositories, generate ISO's, and create a pungi compose look-a-like. Because of this, the comps and pungi-rocky configuration is not referenced with empanadas.

"},{"location":"sop/sop_compose_sig/#running-a-compose","title":"Running a Compose","text":"

First, the toolkit must be cloned. In the iso/empanadas directory, run poetry install. You'll then have access to the various commands needed:

  • sync-sig

To perform a compose of a SIG, it must be defined in the configuration. As an example, here is composing the core sig.

# This creates a brand new directory under /mnt/compose/X and symlinks it to latest-SIG-Y-X\n~/.local/bin/poetry run sync-sig --release 9 --sig core --hashed --clean-old-packages --full-run\n\n# This assumes the directories already exist and will update in place.\n~/.local/bin/poetry run sync-sig --release 9 --sig core --hashed --clean-old-packages\n
"},{"location":"sop/sop_compose_sig/#syncing-composes","title":"Syncing Composes","text":"

Syncing utilizes the sync scripts provided in the release engineering toolkit.

When the scripts are being ran, they are usually ran with a specific purpose, as each major version may be different.

For SIG's, the only files you'll need to know of are sync-to-staging-sig.sh and sync-to-prod-sig.sh. Both scripts will delete packages and data that are no longer in the compose.

# The below syncs the core 8 repos to staging\nRLVER=8 bash sync-to-staging-sig.sh core\n# The below syncs the core 9 repos to staging\nRLVER=9 bash sync-to-staging-sig.sh core\n\n# The below syncs everything in staging for 8 core to prod\nRLVER=8 bash sync-to-prod-sig.sh core\n\n# The below syncs everything in staging for 9 core to prod\nRLVER=9 bash sync-to-prod-sig.sh core\n

Once staging is completed and reviewed, it is synced to production.

bash sync-file-list-parallel.sh\n

During this phase, staging is rsynced with production, the file list is updated, and the full time list is also updated to allow mirrors to know that the repositories have been updated and that they can sync.

"},{"location":"sop/sop_mirrormanager2/","title":"Mirror Manager Maintenance","text":"

This SOP contains most if not all the information needed for SIG/Core to maintain and operate Mirror Manager for Rocky Linux.

"},{"location":"sop/sop_mirrormanager2/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact infrastructure@rockylinux.org Email Contact releng@rockylinux.org Mattermost Contacts @label @neil @tgo Mattermost Channels ~Infrastructure"},{"location":"sop/sop_mirrormanager2/#introduction","title":"Introduction","text":"

So you made a bad decision and now have to do things to Mirror Manager. Good luck.

"},{"location":"sop/sop_mirrormanager2/#pieces","title":"Pieces","text":"Item Runs on... Software Mirrorlist Server mirrormanager001 https://github.com/adrianreber/mirrorlist-server/ Mirror Manager 2 mirrormanager001 https://github.com/fedora-infra/mirrormanager2"},{"location":"sop/sop_mirrormanager2/#mirrorlist-server","title":"Mirrorlist Server","text":"

This runs two (2) instances. Apache/httpd is configured to send /mirrorlist to one and /debuglist to the other.

  • Every fifteen (15) minutes: Mirrorlist cache is regenerated

    • This queries the database for active mirrors and other information and writes a protobuf. The mirrorlist-server reads the protobuf and responds accordingly.
  • Every twenty (20) minutes: Service hosting /mirrorlist is restarted

  • Every twenty-one (21) minutes: Service hosting /debuglist is restarted

Note that the timing for the restart of the mirror list instances are arbitrary.

"},{"location":"sop/sop_mirrormanager2/#mirror-manager-2","title":"Mirror Manager 2","text":"

This is a uwsgi service fronted by an apache/httpd instance. This is responsible for everything else that is not /mirrorlist or /debuglist. This allows the mirror managers to, well, manage their mirrors.

"},{"location":"sop/sop_mirrormanager2/#cdn","title":"CDN","text":"

Fastly sits in front of mirror manager. VPN is required to access the /admin endpoints.

If the backend of the CDN is down, it will attempt to guess what the user wanted to access and spit out a result on the dl.rockylinux.org website. For example, a request for AppStream-8 and x86_64 will result in a AppStream/x86_64/os directory on dl.rockylinux.org. Note that this isn't perfect, but it helps in potential down time or patching.

Fastly -> www firewall -> mirrormanager server\n

In reality, the flow is a lot more complex, and a diagram should be created to map it out in a more user-friendly manner (@TODO)

User -> Fastly -> AWS NLB over TLS, passthru -> www firewall cluster (decrypt TLS) -> mirrormanager server (Rocky CA TLS)\n
"},{"location":"sop/sop_mirrormanager2/#tasks","title":"Tasks","text":"

Below are a list of possible tasks to take with mirror manager, depending on the scenario.

"},{"location":"sop/sop_mirrormanager2/#new-release","title":"New Release","text":"

For the following steps, the following must be completed:

  • Production rsync endpoints should have all brand new content
  • New content root should be locked down to 750 (without this, mirror manager cannot view it)
  • Disable mirrormanager user cronjobs

  • Update the database with the new content. This is run on a schedule normally (see previous section) but can be done manually.

    a. As the mirror manager user, run the following:

/opt/mirrormanager/scan-primary-mirror-0.4.2/target/debug/scan-primary-mirror --debug --config $HOME/scan-primary-mirror.toml --category 'Rocky Linux'\n/opt/mirrormanager/scan-primary-mirror-0.4.2/target/debug/scan-primary-mirror --debug --config $HOME/scan-primary-mirror.toml --category 'Rocky Linux SIGs'\n
  1. Update the redirects for $reponame-$releasever

    a. Use psql to mirrormanager server: psql -U mirrormanager -W -h mirrormanager_db_host mirrormanager_db

    b. Confirm that all three columns are filled and that the second and third columns are identical:

    select rr.from_repo AS \"From Repo\", rr.to_repo AS \"To Repo\", r.prefix AS \"Target Repo\" FROM repository_redirect AS rr LEFT JOIN repository AS r ON rr.to_repo = r.prefix GROUP BY r.prefix, rr.to_repo, rr.from_repo ORDER BY r.prefix ASC;`\n

    c. Change the majorversion redirects to point to the new point release, for example:

    update repository_redirect set to_repo = regexp_replace(to_repo, '9\\.2', '9.3') where from_repo ~ '(\\w+)-9-(debug|source)';`\n

    d. Insert new redirects for the major version expected by the installer

    insert into repository_redirect (from_repo,to_repo) select REGEXP_REPLACE(rr.from_repo,'9\\.2','9.3'),REGEXP_REPLACE(rr.to_repo,'9\\.2','9.3')FROM repository_redirect AS rr WHERE from_repo ~ '(\\w+)-9.2';\n
  2. Generate the mirrorlist cache and restart the debuglist and verify.

Once the bitflip is initiated, restart mirrorlist and reenable all cronjobs.

"},{"location":"sop/sop_mirrormanager2/#out-of-date-mirrors","title":"Out-of-date Mirrors","text":"
  1. Get current shasum of repomd.xml. For example: shasum=$(curl https://dl.rockylinux.org/pub/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum)
  2. Compare against latest propagation log:
tail -latr /var/log/mirrormanager/propagation/rocky-9.3-BaseOS-x86_64_propagation.log.*`\n\nexport VER=9.3\nawk -v shasum=$(curl -s https://dl.rockylinux.org/pub/rocky/$VER/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum | awk '{print $1}') -F'::' '{split($0,data,\":\")} {if ($4 != shasum) {print data[5], data[6], $2, $7}}' < $(find /var/log/mirrormanager/propagation/ -name \"rocky-${VER}-BaseOS-x86_64_propagation.log*\" -mtime -1 | tail -1)'\n

This will generate a table. You can take the IDs in the first column and use the database to disable them by ID (table name: hosts) or go to https://mirrors.rockylinux.org/mirrormanager/host/ID and uncheck 'User active'.

Users can change user active, but they cannot change admin active. It is better to flip user active in this case.

Admins can also view https://mirrors.rockylinux.org/mirrormanager/admin/all_sites if necessary.

Example of table columns:

Note

These mirrors are here soley as an example and not to call anyone out, every mirror shows up on here at one point, for some reason, due to natural variations in how mirrors sync.

[mirrormanager@ord1-prod-mirrormanager001 propagation]$ awk -v shasum=$(curl -s https://dl.rockylinux.org/pub/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml | sha256sum | awk '{print $1}') -F'::' '{split($0,data,\":\")} {if ($4 != shasum) {print data[5], data[6], $2, $7}}' < rocky-9.3-BaseOS-x86_64_propagation.log.1660611632 | column -t\n164  mirror.host.ag            http://mirror.host.ag/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml             404\n173  rocky.centos-repo.net     http://rocky.centos-repo.net/9.3/BaseOS/x86_64/os/repodata/repomd.xml            403\n92   rocky.mirror.co.ge        http://rocky.mirror.co.ge/9.3/BaseOS/x86_64/os/repodata/repomd.xml               404\n289  mirror.vsys.host          http://mirror.vsys.host/rockylinux/9.3/BaseOS/x86_64/os/repodata/repomd.xml      404\n269  mirrors.rackbud.com       http://mirrors.rackbud.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml        200\n295  mirror.ps.kz              http://mirror.ps.kz/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml               200\n114  mirror.liteserver.nl      http://rockylinux.mirror.liteserver.nl/9.3/BaseOS/x86_64/os/repodata/repomd.xml  200\n275  mirror.upsi.edu.my        http://mirror.upsi.edu.my/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml         200\n190  mirror.kku.ac.th          http://mirror.kku.ac.th/rocky-linux/9.3/BaseOS/x86_64/os/repodata/repomd.xml     404\n292  mirrors.cat.pdx.edu       http://mirrors.cat.pdx.edu/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml        200\n370  mirrors.gbnetwork.com     http://mirrors.gbnetwork.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml      404\n308  mirror.ihost.md           http://mirror.ihost.md/rockylinux/9.3/BaseOS/x86_64/os/repodata/repomd.xml       404\n87   mirror.freedif.org        http://mirror.freedif.org/Rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml         404\n194  mirrors.bestthaihost.com  http://mirrors.bestthaihost.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml   404\n30   mirror.admax.se           http://mirror.admax.se/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml            200\n195  mirror.uepg.br            http://mirror.uepg.br/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml             404\n247  mirrors.ipserverone.com   http://mirrors.ipserverone.com/rocky/9.3/BaseOS/x86_64/os/repodata/repomd.xml    404'\n
"},{"location":"sop/sop_release/","title":"Rocky Release Procedures for SIG/Core (RelEng/Infrastructure)","text":"

This SOP contains all the steps required by SIG/Core (a mix of Release Engineering and Infrastructure) to perform releases of all Rocky Linux versions. Work is in all collaboration within the entire group of engineerings.

"},{"location":"sop/sop_release/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact infrastructure@rockylinux.org Email Contact releng@rockylinux.org Mattermost Contacts @label @neil @tgo @skip77 @mustafa @sherif @pgreco Mattermost Channels ~Infrastructure"},{"location":"sop/sop_release/#preparation","title":"Preparation","text":""},{"location":"sop/sop_release/#notes-about-release-day","title":"Notes about Release Day","text":"

Within a minimum of two (2) days, the following should be true:

  1. Torrents should be setup. All files can be synced with the seed box(es) but not yet published. The data should be verified using sha256sum and compared to the CHECKSUM files provided with the files.

  2. Website should be ready (typically with an open PR in github). The content should be verified that the design and content are correct and finalized.

  3. Enough mirrors should be setup. This essentially means that all content for a release should be synced to our primary mirror with the executable bit turned off, and the content should also be hard linked. In theory, mirror manager can be queried to verify if mirrors are or appear to be in sync.

"},{"location":"sop/sop_release/#notes-about-patch-days","title":"Notes about Patch Days","text":"

Within a minimum of one (1) to two (2) days, the following should be true:

  1. Updates should be completed in the build system, and verified in staging.

  2. Updates should be sent to production and file lists updated to allow mirrors to sync.

"},{"location":"sop/sop_release/#prior-to-release-day-notes","title":"Prior to Release Day notes","text":"

Ensure the SIG/Core Checklist is read thoroughly and executed as listed.

"},{"location":"sop/sop_release/#release-day","title":"Release Day","text":""},{"location":"sop/sop_release/#priorities","title":"Priorities","text":"

During release day, these should be verified/completed in order:

  1. Website - The primary website and user landing at rockylinux.org should allow the user to efficiently click through to a download link of an ISO, image, or torrent. It must be kept up.

  2. Torrent - The seed box(es) should be primed and ready to go for users downloading via torrent.

  3. Release Notes & Documentation - The release notes are often on the same website as the documentation. The main website and where applicable in the docs should refer to the Release Notes of Rocky Linux.

  4. Wiki - If applicable, the necessary changes and resources should be available for a release. In particular, if a major release has new repos, changed repo names, this should be documented.

  5. Everything else!

"},{"location":"sop/sop_release/#resources","title":"Resources","text":""},{"location":"sop/sop_release/#sigcore-checklist","title":"SIG/Core Checklist","text":""},{"location":"sop/sop_release/#beta","title":"Beta","text":"
  • Compose Completed
  • Repoclosure must be checked and pass
  • Lorax Run
  • ISO's are built
  • Cloud Images built
  • Live Images built
  • Compose Synced to Staging
  • AWS/Azure Images in Marketplace
  • Vagrant Images
  • Container Images
  • Mirror Manager

    • Ready to Migrate from previous beta release (rltype=beta)
    • Boot image install migration from previous beta release
  • Pass image to Testing Team for final validation

"},{"location":"sop/sop_release/#release-candidate","title":"Release Candidate","text":"
  • Compose Completed
  • Repoclosure must be checked and pass
  • Lorax Run
  • ISO's are built
  • Cloud Images built
  • Live Images built
  • Compose Synced to Staging
  • AWS/Azure Images in Marketplace
  • Vagrant Images
  • Container Images
  • Mirror Manager

    • Ready to Migrate from previous release
    • Boot image install migration from previous release
  • Pass image to Testing Team for validation

"},{"location":"sop/sop_release/#final","title":"Final","text":"
  • Compose Completed
  • Repoclosure must be checked and pass
  • Lorax Run
  • ISO's are built
  • Cloud Images built
  • Live Images built
  • Compose Synced to Staging
  • AWS/Azure Images in Marketplace
  • Vagrant Images
  • Container Images
  • Mirror Manager

    • Ready to Migrate from previous release
    • Boot image install migration from previous release
  • Pass image to Testing Team for final validation

  • Sync to Production
  • Sync to Europe Mirror if applicable
  • Hardlink Run
  • Bitflip after 24-48 Hours
Resources Account ServicesGit (RESF Git Service)Git (Rocky Linux GitHub)Git (Rocky Linux GitLab)Mail ListsContacts

URL: https://accounts.rockylinux.org

Purpose: Account Services maintains the accounts for almost all components of the Rocky ecosystem

Technology: Noggin used by Fedora Infrastructure

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

URL: https://git.resf.org

Purpose: General projects, code, and so on for the Rocky Enterprise Software Foundation.

Technology: Gitea

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://github.com/rocky-linux

Purpose: General purpose code, assets, and so on for Rocky Linux. Some content is mirrored to the RESF Git Service.

Technology: GitHub

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://git.rockylinux.org

Purpose: Packages and light code for the Rocky Linux distribution

Technology: GitLab

Contact: ~Infrastructure, ~Development in Mattermost and #rockylinux-infra, #rockylinux-devel in Libera IRC

URL: https://lists.resf.org

Purpose: Users can subscribe and interact with various mail lists for the Rocky ecosystem

Technology: Mailman 3 + Hyper Kitty

Contact: ~Infrastructure in Mattermost and #rockylinux-infra in Libera IRC

Name Email Mattermost Name IRC Name Louis Abel label@rockylinux.org @nazunalika Sokel/label/Sombra Mustafa Gezen mustafa@rockylinux.org @mustafa mstg Skip Grube skip@rockylinux.org @skip77 Sherif Nagy sherif@rockylinux.org @sherif Pablo Greco pgreco@rockylinux.org @pgreco pgreco Neil Hanlon neil@resf.org @neil neil Taylor Goodwill tg@resf.org @tgo tg"},{"location":"sop/sop_upstream_prep_checklist/","title":"Generalized Prep Checklist for Upcoming Releases","text":"

This SOP contains general checklists required by SIG/Core to prepare and plan for the upcoming release. This work, in general, is required to be done on a routine basis, even months out before the next major or minor release, as it requires monitoring of upstream's (CentOS Stream) work to ensure Rocky Linux will remain ready and compatible with Red Hat Enterprise Linux.

"},{"location":"sop/sop_upstream_prep_checklist/#contact-information","title":"Contact Information","text":"Owner SIG/Core (Release Engineering & Infrastructure) Email Contact infrastructure@rockylinux.org Email Contact releng@rockylinux.org Mattermost Contacts @label @neil @tgo @skip77 @mustafa @sherif @pgreco Mattermost Channels ~Infrastructure"},{"location":"sop/sop_upstream_prep_checklist/#general-upstream-monitoring","title":"General Upstream Monitoring","text":"

It is expected to monitor the following repositories upstream, as these will indicate what is coming up for a given major or point release. These repositories are found at the Red Hat gitlab.

  • centos-release
  • centos-logos
  • pungi-centos
  • comps
  • module-defaults

These repositories can be monitored by setting to \"all activity\" on the bell icon.

Upon changes to the upstream repositories, SIG/Core member should analyze the changes and apply the same to the lookahead branches:

  • rocky-release

    • Manual changes required
  • rocky-logos

    • Manual changes required
  • pungi-rocky

    • Run sync-from-upstream
  • peridot-rocky

    • Configurations are generated using peridot tools
  • comps

    • Run sync-from-upstream
  • rocky-module-defaults

    • Run sync-from-upstream
"},{"location":"sop/sop_upstream_prep_checklist/#general-downward-merging","title":"General Downward Merging","text":"

Repositories that generally track for LookAhead and Beta releases will flow downward to the stable branch. For example:

* rXs / rXlh\n      |\n      |----> rX-beta\n                |\n                |----> rX\n

This applies to any specific rocky repo, such as comps, pungi, peridot-config, and so on. As it is expected some repos will deviate in commit history, it is OK to force push, under the assumption that changes made in the lower branch exists in the upper branch. That way you can avoid changes/functionality being reverted on accident.

"},{"location":"sop/sop_upstream_prep_checklist/#general-package-patching","title":"General Package Patching","text":"

There are packages that are patched typically for the purpose of debranding. List of patched packages are typically maintained in a metadata repository. The obvious ones are listed below and should be monitored and maintained properly:

  • abrt
  • anaconda
  • anaconda-user-help
  • chrony
  • cockpit
  • dhcp
  • dnf
  • firefox
  • fwupd
  • gcc
  • gnome-session
  • gnome-settings-daemon
  • grub2
  • initial-setup
  • kernel
  • kernel-rt
  • libdnf
  • libreoffice
  • libreport
  • lorax-templates-rhel
  • nginx
  • opa-ff
  • opa-fm
  • openldap
  • openscap
  • osbuild
  • osbuild-composer
  • PackageKit
  • pesign
  • python-pip
  • redhat-rpm-config
  • scap-security-guide
  • shim
  • shim-unsigned-x64
  • shim-unsigned-aarch64
  • subscription-manager
  • systemd
  • thunderbird
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 1b10eb9..71ca37a 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,172 +2,172 @@ https://sig-core.rocky.page/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/members/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/what_we_do/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/empanadas/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/peridot/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/rebuild/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/compose/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/compose/koji/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/guidelines/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/guidelines/rocky_logos_guidelines/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/patching/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/patching/changes/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/patching/debrand_info/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/patching/patching/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/references/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/references/empanadas_common/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/references/empanadas_config/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/documentation/references/empanadas_sig_config/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/events/meeting-notes/2024-03-18/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/include/mod_table/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/include/resources_bottom/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/legacy/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/legacy/debrand_list/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/legacy/koji_tagging/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/rpm/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/rpm/local_module_builds/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/sop_compose/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/sop_compose_8/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/sop_compose_sig/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/sop_mirrormanager2/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/sop_release/ - 2024-07-11 + 2024-08-14 daily https://sig-core.rocky.page/sop/sop_upstream_prep_checklist/ - 2024-07-11 + 2024-08-14 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 44807a5..3aeee8f 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git a/sop/index.html b/sop/index.html index 5369256..d89316e 100644 --- a/sop/index.html +++ b/sop/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -188,7 +188,7 @@
- +
sig_core/wiki @@ -235,7 +235,7 @@
- +
sig_core/wiki diff --git a/sop/sop_compose/index.html b/sop/sop_compose/index.html index 4f5f22a..0945203 100644 --- a/sop/sop_compose/index.html +++ b/sop/sop_compose/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/sop/sop_compose_8/index.html b/sop/sop_compose_8/index.html index 78e5793..0f805f3 100644 --- a/sop/sop_compose_8/index.html +++ b/sop/sop_compose_8/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +
sig_core/wiki @@ -240,7 +240,7 @@
- +
sig_core/wiki diff --git a/sop/sop_compose_sig/index.html b/sop/sop_compose_sig/index.html index 1dae762..a285b85 100644 --- a/sop/sop_compose_sig/index.html +++ b/sop/sop_compose_sig/index.html @@ -20,7 +20,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -193,7 +193,7 @@
- +