diff --git a/0.12/404.html b/0.12/404.html index 45d66b0c275b18ce246b8c08dccf8da415d8fd49..acf0b344e6ddd6ae41e4de862cd0af44d7e56a4b 100644 --- a/0.12/404.html +++ b/0.12/404.html @@ -14,7 +14,7 @@ <link rel="icon" href="/0.12/images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -22,7 +22,7 @@ - <link rel="stylesheet" href="/0.12/assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="/0.12/assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="/0.12/assets/stylesheets/palette.06af60db.min.css"> @@ -692,6 +692,31 @@ + <li class="md-nav__item"> + <a href="/0.12/blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="/0.12/blog/2023/" class="md-nav__link"> diff --git a/0.12/assets/stylesheets/main.4af4bdda.min.css b/0.12/assets/stylesheets/main.2afb09e1.min.css similarity index 74% rename from 0.12/assets/stylesheets/main.4af4bdda.min.css rename to 0.12/assets/stylesheets/main.2afb09e1.min.css index 451b767dcac205871698b1b021a417cba2e56aab..71ac605c95d3a0f519a6a0f87fcbffdd93ed2c8e 100644 --- a/0.12/assets/stylesheets/main.4af4bdda.min.css +++ b/0.12/assets/stylesheets/main.2afb09e1.min.css @@ -1 +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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m18 21-4-4h3V7h-3l4-4 4 4h-3v10h3M2 19v-2h10v2M2 13v-2h7v2M2 7V5h4v2z"/></svg>');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 17h3l-4 4-4-4h3V3h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z"/></svg>');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 7h3l-4-4-4 4h3v14h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z"/></svg>')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@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 h5 code{text-transform:none}.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}.md-typeset ul[type]{list-style-type:revert-layer}[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}.md-typeset ol ol ol ol,.md-typeset ul ol ol ol{list-style-type:upper-alpha}.md-typeset ol ol ol ol ol,.md-typeset ul ol ol ol ol{list-style-type:upper-roman}.md-typeset ol[type],.md-typeset ul[type]{list-style-type:revert-layer}[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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z"/></svg>')}.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)}@media print{.md-feedback{display:none}}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9h14V7H3zm0 4h14v-2H3zm0 4h14v-2H3zm16 0h2v-2h-2zm0-10v2h2V7zm0 6h2v-2h-2z"/></svg>')}.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:minmax(.4rem,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:minmax(.4rem,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:minmax(.4rem,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{flex-grow:1;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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h7c-.41-.25-.8-.56-1.14-.9-.33-.33-.61-.7-.86-1.1H6V4h7v5h5v1.18c.71.16 1.39.43 2 .82V8zm6.31 16.9c1.33-2.11.69-4.9-1.4-6.22-2.11-1.33-4.91-.68-6.22 1.4-1.34 2.11-.69 4.89 1.4 6.22 1.46.93 3.32.93 4.79.02L22 23.39 23.39 22zm-3.81.1a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5"/></svg>')}.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{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000}@media screen and (min-width:60em){.md-sidebar__scrollwrap{scrollbar-gutter:stable;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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0M5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0m6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5m-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0"/></svg>');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.5 2.5 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.5 2.5 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.25.25 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"/></svg>');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25m0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41z"/></svg>');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.75 1.75 0 0 1 1 7.775m1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11 9h2V7h-2m1 13c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m-1 15h2v-6h-2z"/></svg>');--md-status--new:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23 12-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68zm-10 5h-2v-2h2zm0-4h-2V7h2z"/></svg>');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 3v1H4v2h1v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V6h1V4h-5V3zm0 5h2v9H9zm4 0h2v9h-2z"/></svg>');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 1 3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5zm0 6c1.4 0 2.8 1.1 2.8 2.5V11c.6 0 1.2.6 1.2 1.3v3.5c0 .6-.6 1.2-1.3 1.2H9.2c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2V9.5C9.2 8.1 10.6 7 12 7m0 1.2c-.8 0-1.5.5-1.5 1.3V11h3V9.5c0-.8-.7-1.3-1.5-1.3"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m5.41 21 .71-4h-4l.35-2h4l1.06-6h-4l.35-2h4l.71-4h2l-.71 4h6l.71-4h2l-.71 4h4l-.35 2h-4l-1.06 6h4l-.35 2h-4l-.71 4h-2l.71-4h-6l-.71 4zM9.53 9l-1.06 6h6l1.06-6z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg>');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 13h-4v4h-2v-4H7v-2h4V7h2v4h4m-5-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301 191.9 288 191.9L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m3.1 5.07c.14 0 .28.05.4.16l1.27 1.27c.23.22.23.57 0 .78l-1 1-2.05-2.05 1-1c.1-.11.24-.16.38-.16m-1.97 1.74 2.06 2.06-6.06 6.06H7.07v-2.06z"/></svg>');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2"/></svg>');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg>');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.6.6 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27"/></svg>');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7 9 19l-5.5-5.5 1.41-1.41L9 16.17 19.59 5.59z"/></svg>');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10"/></svg>');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2z"/></svg>');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m11.5 20 4.86-9.73H13V4l-5 9.73h3.5zM12 2c2.75 0 5.1 1 7.05 2.95S22 9.25 22 12s-1 5.1-2.95 7.05S14.75 22 12 22s-5.1-1-7.05-2.95S2 14.75 2 12s1-5.1 2.95-7.05S9.25 2 12 2"/></svg>');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11 13h2v1h-2zm10-8v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4zm-4 5h-2.2c-.2-.6-.6-1.1-1.1-1.5l1.2-1.2-.7-.7L12.8 8H12c-.2 0-.5 0-.7.1L9.9 6.6l-.8.8 1.2 1.2c-.5.3-.9.8-1.1 1.4H7v1h2v1H7v1h2v1H7v1h2.2c.4 1.2 1.5 2 2.8 2s2.4-.8 2.8-2H17v-1h-2v-1h2v-1h-2v-1h2zm-6 2h2v-1h-2z"/></svg>');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 2v2h1v14a4 4 0 0 0 4 4 4 4 0 0 0 4-4V4h1V2zm4 14c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1m2-4c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1m1-5h-4V4h4z"/></svg>');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.42L5.83 13H21V7z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.41 16.58 10.83 12l4.58-4.59L14 6l-6 6 6 6z"/></svg>');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m16.28-2.72a.75.75 0 0 0-.018-1.042.75.75 0 0 0-1.042-.018l-5.97 5.97-2.47-2.47a.75.75 0 0 0-1.042.018.75.75 0 0 0-.018 1.042l3 3a.75.75 0 0 0 1.06 0Z"/></svg>');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m16.28-2.72a.75.75 0 0 0-.018-1.042.75.75 0 0 0-1.042-.018l-5.97 5.97-2.47-2.47a.75.75 0 0 0-1.042.018.75.75 0 0 0-.018 1.042l3 3a.75.75 0 0 0 1.06 0Z"/></svg>')}.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)}@media print{.giscus,[id=__comments]{display:none}}: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 +@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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m18 21-4-4h3V7h-3l4-4 4 4h-3v10h3M2 19v-2h10v2M2 13v-2h7v2M2 7V5h4v2z"/></svg>');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 17h3l-4 4-4-4h3V3h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z"/></svg>');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 7h3l-4-4-4 4h3v14h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z"/></svg>')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@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 h5 code{text-transform:none}.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}.md-typeset ul[type]{list-style-type:revert-layer}[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}.md-typeset ol ol ol ol,.md-typeset ul ol ol ol{list-style-type:upper-alpha}.md-typeset ol ol ol ol ol,.md-typeset ul ol ol ol ol{list-style-type:upper-roman}.md-typeset ol[type],.md-typeset ul[type]{list-style-type:revert-layer}[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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z"/></svg>')}.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)}@media print{.md-feedback{display:none}}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9h14V7H3zm0 4h14v-2H3zm0 4h14v-2H3zm16 0h2v-2h-2zm0-10v2h2V7zm0 6h2v-2h-2z"/></svg>')}.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:minmax(.4rem,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:minmax(.4rem,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:minmax(.4rem,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{flex-grow:1;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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h7c-.41-.25-.8-.56-1.14-.9-.33-.33-.61-.7-.86-1.1H6V4h7v5h5v1.18c.71.16 1.39.43 2 .82V8zm6.31 16.9c1.33-2.11.69-4.9-1.4-6.22-2.11-1.33-4.91-.68-6.22 1.4-1.34 2.11-.69 4.89 1.4 6.22 1.46.93 3.32.93 4.79.02L22 23.39 23.39 22zm-3.81.1a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5"/></svg>')}.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{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000}@media screen and (min-width:60em){.md-sidebar__scrollwrap{scrollbar-gutter:stable;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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0M5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0m6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5m-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0"/></svg>');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.5 2.5 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.5 2.5 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.25.25 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"/></svg>');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25m0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41z"/></svg>');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.75 1.75 0 0 1 1 7.775m1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11 9h2V7h-2m1 13c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m-1 15h2v-6h-2z"/></svg>');--md-status--new:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23 12-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68zm-10 5h-2v-2h2zm0-4h-2V7h2z"/></svg>');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 3v1H4v2h1v13a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V6h1V4h-5V3zm0 5h2v9H9zm4 0h2v9h-2z"/></svg>');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 1 3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5zm0 6c1.4 0 2.8 1.1 2.8 2.5V11c.6 0 1.2.6 1.2 1.3v3.5c0 .6-.6 1.2-1.3 1.2H9.2c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2V9.5C9.2 8.1 10.6 7 12 7m0 1.2c-.8 0-1.5.5-1.5 1.3V11h3V9.5c0-.8-.7-1.3-1.5-1.3"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m5.41 21 .71-4h-4l.35-2h4l1.06-6h-4l.35-2h4l.71-4h2l-.71 4h6l.71-4h2l-.71 4h4l-.35 2h-4l-1.06 6h4l-.35 2h-4l-.71 4h-2l.71-4h-6l-.71 4zM9.53 9l-1.06 6h6l1.06-6z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg>');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 13h-4v4h-2v-4H7v-2h4V7h2v4h4m-5-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301 191.9 288 191.9L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m3.1 5.07c.14 0 .28.05.4.16l1.27 1.27c.23.22.23.57 0 .78l-1 1-2.05-2.05 1-1c.1-.11.24-.16.38-.16m-1.97 1.74 2.06 2.06-6.06 6.06H7.07v-2.06z"/></svg>');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2"/></svg>');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg>');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.6.6 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27"/></svg>');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 7 9 19l-5.5-5.5 1.41-1.41L9 16.17 19.59 5.59z"/></svg>');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10"/></svg>');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2z"/></svg>');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m11.5 20 4.86-9.73H13V4l-5 9.73h3.5zM12 2c2.75 0 5.1 1 7.05 2.95S22 9.25 22 12s-1 5.1-2.95 7.05S14.75 22 12 22s-5.1-1-7.05-2.95S2 14.75 2 12s1-5.1 2.95-7.05S9.25 2 12 2"/></svg>');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11 13h2v1h-2zm10-8v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4zm-4 5h-2.2c-.2-.6-.6-1.1-1.1-1.5l1.2-1.2-.7-.7L12.8 8H12c-.2 0-.5 0-.7.1L9.9 6.6l-.8.8 1.2 1.2c-.5.3-.9.8-1.1 1.4H7v1h2v1H7v1h2v1H7v1h2.2c.4 1.2 1.5 2 2.8 2s2.4-.8 2.8-2H17v-1h-2v-1h2v-1h-2v-1h2zm-6 2h2v-1h-2z"/></svg>');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 2v2h1v14a4 4 0 0 0 4 4 4 4 0 0 0 4-4V4h1V2zm4 14c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1m2-4c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1m1-5h-4V4h4z"/></svg>');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.42L5.83 13H21V7z"/></svg>')}.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{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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.41 16.58 10.83 12l4.58-4.59L14 6l-6 6 6 6z"/></svg>');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>')}.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,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m16.28-2.72a.75.75 0 0 0-.018-1.042.75.75 0 0 0-1.042-.018l-5.97 5.97-2.47-2.47a.75.75 0 0 0-1.042.018.75.75 0 0 0-.018 1.042l3 3a.75.75 0 0 0 1.06 0Z"/></svg>');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12m16.28-2.72a.75.75 0 0 0-.018-1.042.75.75 0 0 0-1.042-.018l-5.97 5.97-2.47-2.47a.75.75 0 0 0-1.042.018.75.75 0 0 0-.018 1.042l3 3a.75.75 0 0 0 1.06 0Z"/></svg>')}.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)}@media print{.giscus,[id=__comments]{display:none}}: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/0.12/assets/stylesheets/main.4af4bdda.min.css.map b/0.12/assets/stylesheets/main.2afb09e1.min.css.map similarity index 99% rename from 0.12/assets/stylesheets/main.4af4bdda.min.css.map rename to 0.12/assets/stylesheets/main.2afb09e1.min.css.map index 6da83f1cf2a6aa2b795382c8829b8f292c922e09..734896045ab9c659a3d05020823d36d66d42932c 100644 --- a/0.12/assets/stylesheets/main.4af4bdda.min.css.map +++ b/0.12/assets/stylesheets/main.2afb09e1.min.css.map @@ -1 +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/_giscus.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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CE,wBAlBG,CAmBH,sDAAA,CAAA,8ClC64GN,CkCz4GI,kFACE,alC24GN,CkCh6GE,4DACE,oBlCm6GJ,CkCh6GI,sFACE,gClCk6GN,CkC75GE,oEACE,0BlCg6GJ,CkC75GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClC+5GN,CkC35GI,gFACE,alC65GN,CkCl7GE,4DACE,oBlCq7GJ,CkCl7GI,sFACE,gClCo7GN,CkC/6GE,oEACE,0BlCk7GJ,CkC/6GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClCi7GN,CkC76GI,gFACE,alC+6GN,CkCp8GE,0DACE,oBlCu8GJ,CkCp8GI,oFACE,gClCs8GN,CkCj8GE,kEACE,0BlCo8GJ,CkCj8GI,gFACE,wBAlBG,CAmBH,oDAAA,CAAA,4ClCm8GN,CkC/7GI,8EACE,alCi8GN,CkCt9GE,oDACE,oBlCy9GJ,CkCt9GI,8EACE,gClCw9GN,CkCn9GE,4DACE,0BlCs9GJ,CkCn9GI,0EACE,wBAlBG,CAmBH,iDAAA,CAAA,yClCq9GN,CkCj9GI,wEACE,alCm9GN,CkCx+GE,4DACE,oBlC2+GJ,CkCx+GI,sFACE,gClC0+GN,CkCr+GE,oEACE,0BlCw+GJ,CkCr+GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClCu+GN,CkCn+GI,gFACE,alCq+GN,CkC1/GE,wDACE,oBlC6/GJ,CkC1/GI,kFACE,gClC4/GN,CkCv/GE,gEACE,0BlC0/GJ,CkCv/GI,8EACE,wBAlBG,CAmBH,mDAAA,CAAA,2ClCy/GN,CkCr/GI,4EACE,alCu/GN,CmC3pHA,MACE,qMnC8pHF,CmCrpHE,sBAEE,uCAAA,CADA,gBnCypHJ,CmCrpHI,mCACE,anCupHN,CmCxpHI,mCACE,cnCupHN,CmCnpHM,4BACE,sBnCqpHR,CmClpHQ,mCACE,gCnCopHV,CmChpHQ,2DACE,SAAA,CAEA,uBAAA,CADA,enCmpHV,CmC9oHQ,yGACE,SAAA,CACA,uBnCgpHV,CmC5oHQ,yCACE,YnC8oHV,CmCvoHE,0BACE,eAAA,CACA,enCyoHJ,CmCtoHI,+BACE,oBnCwoHN,CmCnoHE,gDACE,Y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","file":"main.css"} \ No newline at end of file +{"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/_giscus.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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CE,wBAlBG,CAmBH,sDAAA,CAAA,8ClC64GN,CkCz4GI,kFACE,alC24GN,CkCh6GE,4DACE,oBlCm6GJ,CkCh6GI,sFACE,gClCk6GN,CkC75GE,oEACE,0BlCg6GJ,CkC75GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClC+5GN,CkC35GI,gFACE,alC65GN,CkCl7GE,4DACE,oBlCq7GJ,CkCl7GI,sFACE,gClCo7GN,CkC/6GE,oEACE,0BlCk7GJ,CkC/6GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClCi7GN,CkC76GI,gFACE,alC+6GN,CkCp8GE,0DACE,oBlCu8GJ,CkCp8GI,oFACE,gClCs8GN,CkCj8GE,kEACE,0BlCo8GJ,CkCj8GI,gFACE,wBAlBG,CAmBH,oDAAA,CAAA,4ClCm8GN,CkC/7GI,8EACE,alCi8GN,CkCt9GE,oDACE,oBlCy9GJ,CkCt9GI,8EACE,gClCw9GN,CkCn9GE,4DACE,0BlCs9GJ,CkCn9GI,0EACE,wBAlBG,CAmBH,iDAAA,CAAA,yClCq9GN,CkCj9GI,wEACE,alCm9GN,CkCx+GE,4DACE,oBlC2+GJ,CkCx+GI,sFACE,gClC0+GN,CkCr+GE,oEACE,0BlCw+GJ,CkCr+GI,kFACE,wBAlBG,CAmBH,qDAAA,CAAA,6ClCu+GN,CkCn+GI,gFACE,alCq+GN,CkC1/GE,wDACE,oBlC6/GJ,CkC1/GI,kFACE,gClC4/GN,CkCv/GE,gEACE,0BlC0/GJ,CkCv/GI,8EACE,wBAlBG,CAmBH,mDAAA,CAAA,2ClCy/GN,CkCr/GI,4EACE,alCu/GN,CmC3pHA,MACE,qMnC8pHF,CmCrpHE,sBAEE,uCAAA,CADA,gBnCypHJ,CmCrpHI,mCACE,anCupHN,CmCxpHI,mCACE,cnCupHN,CmCnpHM,4BACE,sBnCqpHR,CmClpHQ,mCACE,gCnCopHV,CmChpHQ,2DACE,SAAA,CAEA,uBAAA,CADA,enCmpHV,CmC9oHQ,yGACE,SAAA,CACA,uBnCgpHV,CmC5oHQ,yCACE,YnC8oHV,CmCvoHE,0BACE,eAAA,CACA,enCyoHJ,CmCtoHI,+BACE,oBnCwoHN,CmCnoHE,gDACE,Y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","file":"main.css"} \ No newline at end of file diff --git a/0.12/blog/2016/index.html b/0.12/blog/2016/index.html index 142e9e5bd1e7a5d89ed055f6ba2e740d04ea413d..9f2eccb685023f85ac9253283a74dcdbd88eb164 100644 --- a/0.12/blog/2016/index.html +++ b/0.12/blog/2016/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2017/index.html b/0.12/blog/2017/index.html index 858a7d481a65a1d8f112a97858946e59d0e1f305..511d6ffd38518cd113b773a4a72154166195c365 100644 --- a/0.12/blog/2017/index.html +++ b/0.12/blog/2017/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2018/index.html b/0.12/blog/2018/index.html index 65e2fc3c085ae387783672f9e20bd623bbe820bc..8f15d96fc6b09a7eca5b583408cdcb39a35380ee 100644 --- a/0.12/blog/2018/index.html +++ b/0.12/blog/2018/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2019/index.html b/0.12/blog/2019/index.html index d417e4e29dec7bd45390f3b3a3f671f063f22297..cb2f696ffe6cfc0899890e3dbee97a9cef15be89 100644 --- a/0.12/blog/2019/index.html +++ b/0.12/blog/2019/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2020/index.html b/0.12/blog/2020/index.html index 05fda8945c48e0d04d41be2e4b7f3951c32a45a0..7889a037a8d9d19df572d296aa7a7c5636290bb6 100644 --- a/0.12/blog/2020/index.html +++ b/0.12/blog/2020/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2021/index.html b/0.12/blog/2021/index.html index 278e614c35923d1aa5e724af27d96dca5a6c0bec..500351834e6edb1a91da29f14f7e8e7f20051bbd 100644 --- a/0.12/blog/2021/index.html +++ b/0.12/blog/2021/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2022/index.html b/0.12/blog/2022/index.html index ddecc3dc9f981c95a5f5297c185d9922a834c950..9bec82afe40e68939f44ecad470f9dc9e88b4a4e 100644 --- a/0.12/blog/2022/index.html +++ b/0.12/blog/2022/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/2023/index.html b/0.12/blog/2023/index.html index 122b5d00bf3d0b3c1e46a32b14dbdc4d2be7aa1c..09f6273fad0b340e976afefab9506f2051b4ef53 100644 --- a/0.12/blog/2023/index.html +++ b/0.12/blog/2023/index.html @@ -13,14 +13,14 @@ <link rel="canonical" href="https://silkaj.duniter.org/0.12/blog/2023/"> - <link rel="prev" href="../release/"> + <link rel="prev" href="../2025/"> <link rel="next" href="../2022/"> <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -711,6 +711,31 @@ + + + + + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + diff --git a/0.12/blog/2025/index.html b/0.12/blog/2025/index.html new file mode 100644 index 0000000000000000000000000000000000000000..f6d08ef36985852d1987392db3a0f6eca8f3492c --- /dev/null +++ b/0.12/blog/2025/index.html @@ -0,0 +1,1571 @@ + +<!doctype html> +<html lang="en" class="no-js"> + <head> + + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + + <meta name="description" content="Command line client for Äž1 libre-currency powered by Duniter"> + + + + <link rel="canonical" href="https://silkaj.duniter.org/0.12/blog/2025/"> + + + <link rel="prev" href="../release/"> + + + <link rel="next" href="../2023/"> + + + <link rel="icon" href="../../images/silkaj_logo.png"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> + + + + <title>2025 - Silkaj</title> + + + + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> + + + <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> + + + + + + + + + + + + + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> + + + + + + + </head> + + + + + + + + + + <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo"> + + + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> + <label class="md-overlay" for="__drawer"></label> + <div data-md-component="skip"> + + + <a href="#2025" class="md-skip"> + Skip to content + </a> + + </div> + <div data-md-component="announce"> + + </div> + + <div data-md-color-scheme="default" data-md-component="outdated" hidden> + + </div> + + + + + + +<header class="md-header md-header--shadow md-header--lifted" data-md-component="header"> + <nav class="md-header__inner md-grid" aria-label="Header"> + <a href="../.." title="Silkaj" class="md-header__button md-logo" aria-label="Silkaj" data-md-component="logo"> + + <img src="../../images/silkaj_logo.png" alt="logo"> + + </a> + <label class="md-header__button md-icon" for="__drawer"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> + </label> + <div class="md-header__title" data-md-component="header-title"> + <div class="md-header__ellipsis"> + <div class="md-header__topic"> + <span class="md-ellipsis"> + Silkaj + </span> + </div> + <div class="md-header__topic" data-md-component="header-topic"> + <span class="md-ellipsis"> + + 2025 + + </span> + </div> + </div> + </div> + + + <form class="md-header__option" data-md-component="palette"> + + + + + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> + + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> + </label> + + + + + + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> + + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> + </label> + + +</form> + + + + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> + + + + + + <label class="md-header__button md-icon" for="__search"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> + </label> + <div class="md-search" data-md-component="search" role="dialog"> + <label class="md-search__overlay" for="__search"></label> + <div class="md-search__inner" role="search"> + <form class="md-search__form" name="search"> + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> + <label class="md-search__icon md-icon" for="__search"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> + </label> + <nav class="md-search__options" aria-label="Search"> + + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> + </button> + </nav> + + </form> + <div class="md-search__output"> + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> + <div class="md-search-result" data-md-component="search-result"> + <div class="md-search-result__meta"> + Initializing search + </div> + <ol class="md-search-result__list" role="presentation"></ol> + </div> + </div> + </div> + </div> +</div> + + + + <div class="md-header__source"> + <a href="https://git.duniter.org/clients/python/silkaj" title="Go to repository" class="md-source" data-md-component="source"> + <div class="md-source__icon md-icon"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> + </div> + <div class="md-source__repository"> + GitLab + </div> +</a> + </div> + + </nav> + + + +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> + <div class="md-grid"> + <ul class="md-tabs__list"> + + + + + + + <li class="md-tabs__item"> + <a href="../.." class="md-tabs__link"> + + + + + + Home + + </a> + </li> + + + + + + + + + <li class="md-tabs__item"> + <a href="../../install/" class="md-tabs__link"> + + + + + + Installation + + </a> + </li> + + + + + + + + + + + <li class="md-tabs__item"> + <a href="../../usage/" class="md-tabs__link"> + + + + Usage + + </a> + </li> + + + + + + + + + + + + + + <li class="md-tabs__item md-tabs__item--active"> + <a href="../" class="md-tabs__link"> + + + + Blog + + </a> + </li> + + + + + + + + + + <li class="md-tabs__item"> + <a href="../../changelog/" class="md-tabs__link"> + + + + + + Changelog + + </a> + </li> + + + + + + + + + + + <li class="md-tabs__item"> + <a href="../../contributing/" class="md-tabs__link"> + + + + Contributing + + </a> + </li> + + + + + </ul> + </div> +</nav> + + +</header> + + <div class="md-container" data-md-component="container"> + + + + + <main class="md-main" data-md-component="main"> + <div class="md-main__inner md-grid"> + + + + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + + + + + + +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> + <label class="md-nav__title" for="__drawer"> + <a href="../.." title="Silkaj" class="md-nav__button md-logo" aria-label="Silkaj" data-md-component="logo"> + + <img src="../../images/silkaj_logo.png" alt="logo"> + + </a> + Silkaj + </label> + + <div class="md-nav__source"> + <a href="https://git.duniter.org/clients/python/silkaj" title="Go to repository" class="md-source" data-md-component="source"> + <div class="md-source__icon md-icon"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> + </div> + <div class="md-source__repository"> + GitLab + </div> +</a> + </div> + + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../.." class="md-nav__link"> + + + + <span class="md-ellipsis"> + Home + + </span> + + + </a> + </li> + + + + + + + + + + <li class="md-nav__item"> + <a href="../../install/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Installation + + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" > + + + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> + + + + <span class="md-ellipsis"> + Usage + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_3"> + <span class="md-nav__icon md-icon"></span> + Usage + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Usage + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/cli/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Command-line interface reference + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/account_storage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Account storage + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/multi-recipients_transfers_and_automation/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Multi-recipients transfers and automation + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/deathreaper/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + DeathReaper + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked> + + + <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex=""> + + + + <span class="md-ellipsis"> + Blog + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true"> + <label class="md-nav__title" for="__nav_4"> + <span class="md-nav__icon md-icon"></span> + Blog + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + <li class="md-nav__item"> + <a href="../" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Blog + + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" checked> + + + <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex=""> + + + + <span class="md-ellipsis"> + Archive + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="true"> + <label class="md-nav__title" for="__nav_4_2"> + <span class="md-nav__icon md-icon"></span> + Archive + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active"> + + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> + + + + + + <label class="md-nav__link md-nav__link--active" for="__toc"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <a href="./" class="md-nav__link md-nav__link--active"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + + + +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> + + + + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#silkaj-v0120-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.12.0 release + </span> + </a> + +</li> + + </ul> + +</nav> + + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2023/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2023 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2022/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2022 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2021/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2021 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2020/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2020 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2019/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2019 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2018/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2018 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2017/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2017 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2016/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2016 + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--section md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" > + + + <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex=""> + + + + <span class="md-ellipsis"> + Categories + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_3"> + <span class="md-nav__icon md-icon"></span> + Categories + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + <li class="md-nav__item"> + <a href="../minor/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + minor + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../rc/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + rc + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../release/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + release + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + <li class="md-nav__item"> + <a href="../../changelog/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Changelog + + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > + + + <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0"> + + + + <span class="md-ellipsis"> + Contributing + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_6"> + <span class="md-nav__icon md-icon"></span> + Contributing + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Contributing + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/install_poetry/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Poetry installation + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/container_usage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Container usage + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/documentation/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Documentation + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/testing/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Testing + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../coverage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Coverage report + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/packaging/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Packaging + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + </ul> +</nav> + </div> + </div> + </div> + + + + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + + +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> + + + + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#silkaj-v0120-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.12.0 release + </span> + </a> + +</li> + + </ul> + +</nav> + </div> + </div> + </div> + + + + <div class="md-content" data-md-component="content"> + <div class="md-content__inner"> + <header class="md-typeset"> + <h1 id="2025">2025<a class="headerlink" href="#2025" title="Permanent link">¶</a></h1> + </header> + + <article class="md-post md-post--excerpt"> + <header class="md-post__header"> + + <nav class="md-post__authors md-typeset"> + + <span class="md-author"> + <img src="../../../latest/images/Moul.png" alt="Moul"> + </span> + + </nav> + + <div class="md-post__meta md-meta"> + <ul class="md-meta__list"> + <li class="md-meta__item"> + <time datetime="2025-04-22 00:00:00+00:00">April 22, 2025</time></li> + + <li class="md-meta__item"> + in + + <a href="../release/" class="md-meta__link">release</a></li> + + + + <li class="md-meta__item"> + + 9 min read + + </li> + + </ul> + + </div> + </header> + <div class="md-post__content md-typeset"> + <h2 id="silkaj-v0120-release"><a class="toclink" href="../silkaj-v0120-release/">Silkaj v0.12.0 release</a></h2> +<p>I am pleased to announce the stable release of Silkaj version 0.12.0</p> +<p>In this article, the most important changes are highlighted. if you are looking for a comprehensive list of changes, check out the changelog.</p> +<h3 id="introduction"><a class="toclink" href="../silkaj-v0120-release/#introduction">Introduction</a></h3> +<p>The original plan changed, a difficult choice has been made to work on a second development cycle tied to v1 ecosystem, because v2 ecosystem was not fully ready. +It was worth it for Silkaj project’s growth with huge improvements not tied to v1 nor v2 ecosystems. +It was difficult to go in a slightly different direction, since all contributors’ energy was directed to v2 ecosystem development. +Äžcli took over the role as the first CLI client on v2 ecosystem. Silkaj made little progress on v2 ecosystem. +But, as for v0.11.0, this release also paves the way for implementations based on v2 ecosystem.</p> +<p>This release comes with the account storage implementation which greatly improves the authentication and revocation files management. +A new documentation website has been set up. +<code>money history</code> command features the comma-separated value (CSV) output file format option. +The command line interface has seen great improvements such as a usage with colors, a better error output, the shell completion, and a small help option. +Äž1 monetary license have been updated, and DeathReaper is now released as part of Silkaj. +Last but not least, Silkaj comes with minor network optimisations and Python 3.13 support.</p> +<p>This release is the last planned major release with Duniter v1/BMA support.</p> + + + <nav class="md-post__action"> + <a href="../silkaj-v0120-release/"> + Continue reading + </a> + </nav> + + </div> +</article> + + + + + + + +<nav class="md-pagination"> + +</nav> + + + </div> + </div> + + + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> + +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> + </div> + + </main> + + <footer class="md-footer"> + + <div class="md-footer-meta md-typeset"> + <div class="md-footer-meta__inner md-grid"> + <div class="md-copyright"> + + <div class="md-copyright__highlight"> + Copyright © 2016 − 2025 Maël Azimi + </div> + + + Made with + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> + Material for MkDocs + </a> + +</div> + + <div class="md-social"> + + + + + + <a href="https://git.duniter.org/clients/python/silkaj" target="_blank" rel="noopener" title="Git repository" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> + </a> + + + + + + <a href="https://pypi.org/project/silkaj/" target="_blank" rel="noopener" title="PyPI" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6M286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3M167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4m-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3"/></svg> + </a> + + + + + + <a href="https://forum.duniter.org" target="_blank" rel="noopener" title="Duniter forum" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0m.116 4.563a7.4 7.4 0 0 0-6.337 3.57 7.25 7.25 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.42 7.42 0 0 0 8.136-1.39 7.26 7.26 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585z"/></svg> + </a> + + + + + + <a href="https://chat.duniter.org" target="_blank" rel="noopener" title="Duniter XMPP chatroom" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m3.401 4.594 1.025.366 3.08.912q-.016.27-.016.543c0 3.353 1.693 7.444 4.51 10.387 2.817-2.943 4.51-7.034 4.51-10.387q0-.273-.016-.543l3.08-.912 1.025-.366L24 3.276C23.854 8.978 19.146 14.9 13.502 18.17c1.302 1.028 2.778 1.81 4.388 2.215v.114l.004.001v.224a14.6 14.6 0 0 1-4.829-1.281A21 21 0 0 1 12 18.966q-.53.255-1.065.477a14.6 14.6 0 0 1-4.829 1.281V20.5l.004-.001v-.113c1.61-.406 3.086-1.188 4.389-2.216C4.854 14.9.146 8.978 0 3.276z"/></svg> + </a> + +</div> + + </div> + </div> +</footer> + + </div> + <div class="md-dialog" data-md-component="dialog"> + <div class="md-dialog__inner md-typeset"></div> + </div> + + + + + <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "content.code.copy", "content.tabs.link"], "search": "../../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> + + + <script src="../../assets/javascripts/bundle.c8b220af.min.js"></script> + + + </body> +</html> \ No newline at end of file diff --git a/0.12/blog/call-for-testing-silkaj-v0100rc/index.html b/0.12/blog/call-for-testing-silkaj-v0100rc/index.html index 24d98c49c3ee2a43313a87258401e6ab5a2982ec..b0831182fe13e15b917c096007165d58849f4ddf 100644 --- a/0.12/blog/call-for-testing-silkaj-v0100rc/index.html +++ b/0.12/blog/call-for-testing-silkaj-v0100rc/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/call-for-testing-silkaj-v0110rc0/index.html b/0.12/blog/call-for-testing-silkaj-v0110rc0/index.html index 9657a5dd1291282ed87ff0bd57b3174fecd3c62d..561b9a7e8e2478ac2bfcd5d7e9fea6fd48c8489a 100644 --- a/0.12/blog/call-for-testing-silkaj-v0110rc0/index.html +++ b/0.12/blog/call-for-testing-silkaj-v0110rc0/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/index.html b/0.12/blog/index.html index c6be530a900d6c41a8ae81b5988bd960b680f584..69505c34fb10ab9aad445235cb4048079dd05302 100644 --- a/0.12/blog/index.html +++ b/0.12/blog/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css"> @@ -694,6 +694,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v0120-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.12.0 release + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#v0112" class="md-nav__link"> <span class="md-ellipsis"> @@ -728,15 +737,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#v0100" class="md-nav__link"> - <span class="md-ellipsis"> - v0.10.0 - </span> - </a> - </li> </ul> @@ -802,6 +802,31 @@ + <li class="md-nav__item"> + <a href="2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="2023/" class="md-nav__link"> @@ -1397,6 +1422,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v0120-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.12.0 release + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#v0112" class="md-nav__link"> <span class="md-ellipsis"> @@ -1431,15 +1465,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#v0100" class="md-nav__link"> - <span class="md-ellipsis"> - v0.10.0 - </span> - </a> - </li> </ul> @@ -1471,18 +1496,18 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2023-11-22 00:00:00+00:00">November 22, 2023</time></li> + <time datetime="2025-04-22 00:00:00+00:00">April 22, 2025</time></li> <li class="md-meta__item"> in - <a href="minor/" class="md-meta__link">minor</a></li> + <a href="release/" class="md-meta__link">release</a></li> <li class="md-meta__item"> - 1 min read + 9 min read </li> @@ -1491,10 +1516,29 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v0112"><a class="toclink" href="v0112/">V0.11.2</a></h2> -<ul> -<li>Add support for Python v3.12 and drop support for Python v3.7</li> -</ul> + <h2 id="silkaj-v0120-release"><a class="toclink" href="silkaj-v0120-release/">Silkaj v0.12.0 release</a></h2> +<p>I am pleased to announce the stable release of Silkaj version 0.12.0</p> +<p>In this article, the most important changes are highlighted. if you are looking for a comprehensive list of changes, check out the changelog.</p> +<h3 id="introduction"><a class="toclink" href="silkaj-v0120-release/#introduction">Introduction</a></h3> +<p>The original plan changed, a difficult choice has been made to work on a second development cycle tied to v1 ecosystem, because v2 ecosystem was not fully ready. +It was worth it for Silkaj project’s growth with huge improvements not tied to v1 nor v2 ecosystems. +It was difficult to go in a slightly different direction, since all contributors’ energy was directed to v2 ecosystem development. +Äžcli took over the role as the first CLI client on v2 ecosystem. Silkaj made little progress on v2 ecosystem. +But, as for v0.11.0, this release also paves the way for implementations based on v2 ecosystem.</p> +<p>This release comes with the account storage implementation which greatly improves the authentication and revocation files management. +A new documentation website has been set up. +<code>money history</code> command features the comma-separated value (CSV) output file format option. +The command line interface has seen great improvements such as a usage with colors, a better error output, the shell completion, and a small help option. +Äž1 monetary license have been updated, and DeathReaper is now released as part of Silkaj. +Last but not least, Silkaj comes with minor network optimisations and Python 3.13 support.</p> +<p>This release is the last planned major release with Duniter v1/BMA support.</p> + + + <nav class="md-post__action"> + <a href="silkaj-v0120-release/"> + Continue reading + </a> + </nav> </div> </article> @@ -1513,7 +1557,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2023-08-14 00:00:00+00:00">August 14, 2023</time></li> + <time datetime="2023-11-22 00:00:00+00:00">November 22, 2023</time></li> <li class="md-meta__item"> in @@ -1533,10 +1577,9 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v0111"><a class="toclink" href="v0111/">V0.11.1</a></h2> -<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> + <h2 id="v0112"><a class="toclink" href="v0112/">V0.11.2</a></h2> <ul> -<li>Bump DuniterPy to v1.1.1 <a href="https://git.duniter.org/clients/python/duniterpy/-/issues/206">duniterpy#206</a></li> +<li>Add support for Python v3.12 and drop support for Python v3.7</li> </ul> </div> @@ -1556,18 +1599,18 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2022-11-27 00:00:00+00:00">November 27, 2022</time></li> + <time datetime="2023-08-14 00:00:00+00:00">August 14, 2023</time></li> <li class="md-meta__item"> in - <a href="release/" class="md-meta__link">release</a></li> + <a href="minor/" class="md-meta__link">minor</a></li> <li class="md-meta__item"> - 5 min read + 1 min read </li> @@ -1576,25 +1619,11 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v0110-release"><a class="toclink" href="silkaj-v0110-release/">Silkaj v0.11.0 release</a></h2> -<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.11.0</p> -<p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> -<h3 id="introduction"><a class="toclink" href="silkaj-v0110-release/#introduction">Introduction</a></h3> -<p>This release comes with the <code>pipx</code> installation method, a new design of command line interface with commands separated in groups. -Last but not least, it contains the migration to <code>Texttable</code> table library, network improvements and fixes, and Python v3.11 support.</p> -<p>On the development environment side, the repository has been restructured, the code has been annotated with types, and linted. -<code>mypy</code> and <code>pylint</code> pre-commit hooks have been introduced. The tests have been separated into unit and integration tests. -<code>main</code> branch is new name of the main branch.</p> -<p>This release emphasis was put onto strengthen the development environment as well as improving the structure of Silkaj code base. -The goal was to do preparations and cleaning before Substrate migration in order to be fully focus onto it in next development cycle.</p> -<p>This release is the latest planned major release with Duniter v1/BMA support and the one planned to end into Debian 12 Bookworm.</p> - - - <nav class="md-post__action"> - <a href="silkaj-v0110-release/"> - Continue reading - </a> - </nav> + <h2 id="v0111"><a class="toclink" href="v0111/">V0.11.1</a></h2> +<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> +<ul> +<li>Bump DuniterPy to v1.1.1 <a href="https://git.duniter.org/clients/python/duniterpy/-/issues/206">duniterpy#206</a></li> +</ul> </div> </article> @@ -1613,18 +1642,18 @@ The goal was to do preparations and cleaning before Substrate migration in order <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2022-11-12 00:00:00+00:00">November 12, 2022</time></li> + <time datetime="2022-11-27 00:00:00+00:00">November 27, 2022</time></li> <li class="md-meta__item"> in - <a href="rc/" class="md-meta__link">rc</a></li> + <a href="release/" class="md-meta__link">release</a></li> <li class="md-meta__item"> - 2 min read + 5 min read </li> @@ -1633,13 +1662,22 @@ The goal was to do preparations and cleaning before Substrate migration in order </div> </header> <div class="md-post__content md-typeset"> - <h2 id="call-for-testing-silkaj-v0110rc0"><a class="toclink" href="call-for-testing-silkaj-v0110rc0/">Call for testing Silkaj v0.11.0rc0</a></h2> -<p>Hey fellow testers and early-adopters!</p> -<p>We are pleased to announce Silkaj v0.11.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> + <h2 id="silkaj-v0110-release"><a class="toclink" href="silkaj-v0110-release/">Silkaj v0.11.0 release</a></h2> +<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.11.0</p> +<p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> +<h3 id="introduction"><a class="toclink" href="silkaj-v0110-release/#introduction">Introduction</a></h3> +<p>This release comes with the <code>pipx</code> installation method, a new design of command line interface with commands separated in groups. +Last but not least, it contains the migration to <code>Texttable</code> table library, network improvements and fixes, and Python v3.11 support.</p> +<p>On the development environment side, the repository has been restructured, the code has been annotated with types, and linted. +<code>mypy</code> and <code>pylint</code> pre-commit hooks have been introduced. The tests have been separated into unit and integration tests. +<code>main</code> branch is new name of the main branch.</p> +<p>This release emphasis was put onto strengthen the development environment as well as improving the structure of Silkaj code base. +The goal was to do preparations and cleaning before Substrate migration in order to be fully focus onto it in next development cycle.</p> +<p>This release is the latest planned major release with Duniter v1/BMA support and the one planned to end into Debian 12 Bookworm.</p> <nav class="md-post__action"> - <a href="call-for-testing-silkaj-v0110rc0/"> + <a href="silkaj-v0110-release/"> Continue reading </a> </nav> @@ -1661,18 +1699,18 @@ The goal was to do preparations and cleaning before Substrate migration in order <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2022-04-18 00:00:00+00:00">April 18, 2022</time></li> + <time datetime="2022-11-12 00:00:00+00:00">November 12, 2022</time></li> <li class="md-meta__item"> in - <a href="release/" class="md-meta__link">release</a></li> + <a href="rc/" class="md-meta__link">rc</a></li> <li class="md-meta__item"> - 3 min read + 2 min read </li> @@ -1681,23 +1719,13 @@ The goal was to do preparations and cleaning before Substrate migration in order </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v0100"><a class="toclink" href="v0100/">v0.10.0</a></h2> -<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.10.0</p> -<p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> -<h3 id="introduction"><a class="toclink" href="v0100/#introduction">Introduction</a></h3> -<p>This release comes with the handling of the complete life cycle of the revocation file, -the ability to read transaction amounts and recipients listing from a file, convenient for recurrent transaction. -Last but not least, the code handling Äž1 monetary license has been refactored. -The upstream changes have been retrieved and now features the license into six languages.</p> -<p>Under the hood, Silkaj codebase has been updated to use DuniterPy v1.0, -which comes with breaking backward compatible changes on the <code>Documents</code> classes and -the drop of the asynchronous property.</p> -<p>As always, this release also comes with an emphasis on the development environment, -with <code>pre-commit</code> usage generalization with the introduction of new hooks.</p> + <h2 id="call-for-testing-silkaj-v0110rc0"><a class="toclink" href="call-for-testing-silkaj-v0110rc0/">Call for testing Silkaj v0.11.0rc0</a></h2> +<p>Hey fellow testers and early-adopters!</p> +<p>We are pleased to announce Silkaj v0.11.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> <nav class="md-post__action"> - <a href="v0100/"> + <a href="call-for-testing-silkaj-v0110rc0/"> Continue reading </a> </nav> diff --git a/0.12/blog/minor/index.html b/0.12/blog/minor/index.html index 8e422006479aef8d199f6ef6a9ca9aa7b1de5fc4..fb81c8753db19b6a54d0c1f3932cce2502c60fbc 100644 --- a/0.12/blog/minor/index.html +++ b/0.12/blog/minor/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -713,6 +713,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/minor/page/2/index.html b/0.12/blog/minor/page/2/index.html index 242770e36900d822591ebf8130308948b8c87d90..44a1ff13e9d8d9a30e42d1503ac52348c6be18ff 100644 --- a/0.12/blog/minor/page/2/index.html +++ b/0.12/blog/minor/page/2/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../../assets/stylesheets/palette.06af60db.min.css"> @@ -713,6 +713,31 @@ + <li class="md-nav__item"> + <a href="../../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../../2023/" class="md-nav__link"> diff --git a/0.12/blog/page/2/index.html b/0.12/blog/page/2/index.html index bb7eadd48ee74d9ea00cb57fd103bed0d9239171..2e2d1a203e345fed1a63b09f8292d11a85553d50 100644 --- a/0.12/blog/page/2/index.html +++ b/0.12/blog/page/2/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> @@ -692,6 +692,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#v0100" class="md-nav__link"> + <span class="md-ellipsis"> + v0.10.0 + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#call-for-testing-silkaj-v0100rc" class="md-nav__link"> <span class="md-ellipsis"> @@ -726,15 +735,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v080-release" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.8.0 release - </span> - </a> - </li> </ul> @@ -800,6 +800,31 @@ + <li class="md-nav__item"> + <a href="../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../2023/" class="md-nav__link"> @@ -1395,6 +1420,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#v0100" class="md-nav__link"> + <span class="md-ellipsis"> + v0.10.0 + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#call-for-testing-silkaj-v0100rc" class="md-nav__link"> <span class="md-ellipsis"> @@ -1429,15 +1463,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v080-release" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.8.0 release - </span> - </a> - </li> </ul> @@ -1469,18 +1494,18 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2022-03-21 00:00:00+00:00">March 21, 2022</time></li> + <time datetime="2022-04-18 00:00:00+00:00">April 18, 2022</time></li> <li class="md-meta__item"> in - <a href="../../rc/" class="md-meta__link">rc</a></li> + <a href="../../release/" class="md-meta__link">release</a></li> <li class="md-meta__item"> - 2 min read + 3 min read </li> @@ -1489,13 +1514,23 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="call-for-testing-silkaj-v0100rc"><a class="toclink" href="../../call-for-testing-silkaj-v0100rc/">Call for testing Silkaj v0.10.0rc</a></h2> -<p>Hey fellow testers and early-adopters!</p> -<p>We are pleased to announce Silkaj v0.10.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> + <h2 id="v0100"><a class="toclink" href="../../v0100/">v0.10.0</a></h2> +<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.10.0</p> +<p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> +<h3 id="introduction"><a class="toclink" href="../../v0100/#introduction">Introduction</a></h3> +<p>This release comes with the handling of the complete life cycle of the revocation file, +the ability to read transaction amounts and recipients listing from a file, convenient for recurrent transaction. +Last but not least, the code handling Äž1 monetary license has been refactored. +The upstream changes have been retrieved and now features the license into six languages.</p> +<p>Under the hood, Silkaj codebase has been updated to use DuniterPy v1.0, +which comes with breaking backward compatible changes on the <code>Documents</code> classes and +the drop of the asynchronous property.</p> +<p>As always, this release also comes with an emphasis on the development environment, +with <code>pre-commit</code> usage generalization with the introduction of new hooks.</p> <nav class="md-post__action"> - <a href="../../call-for-testing-silkaj-v0100rc/"> + <a href="../../v0100/"> Continue reading </a> </nav> @@ -1517,18 +1552,18 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2021-04-17 00:00:00+00:00">April 17, 2021</time></li> + <time datetime="2022-03-21 00:00:00+00:00">March 21, 2022</time></li> <li class="md-meta__item"> in - <a href="../../release/" class="md-meta__link">release</a></li> + <a href="../../rc/" class="md-meta__link">rc</a></li> <li class="md-meta__item"> - 4 min read + 2 min read </li> @@ -1537,14 +1572,13 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v090-release"><a class="toclink" href="../../silkaj-v090-release/">Silkaj v0.9.0 release</a></h2> -<h3 id="introduction"><a class="toclink" href="../../silkaj-v090-release/#introduction">Introduction</a></h3> -<p>The Silkaj team is pleased to announce the release of Silkaj 0.9.0. -The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> + <h2 id="call-for-testing-silkaj-v0100rc"><a class="toclink" href="../../call-for-testing-silkaj-v0100rc/">Call for testing Silkaj v0.10.0rc</a></h2> +<p>Hey fellow testers and early-adopters!</p> +<p>We are pleased to announce Silkaj v0.10.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> <nav class="md-post__action"> - <a href="../../silkaj-v090-release/"> + <a href="../../call-for-testing-silkaj-v0100rc/"> Continue reading </a> </nav> @@ -1566,18 +1600,18 @@ The most important changes are highlighted in this article, if you are looking f <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2021-03-24 00:00:00+00:00">March 24, 2021</time></li> + <time datetime="2021-04-17 00:00:00+00:00">April 17, 2021</time></li> <li class="md-meta__item"> in - <a href="../../rc/" class="md-meta__link">rc</a></li> + <a href="../../release/" class="md-meta__link">release</a></li> <li class="md-meta__item"> - 2 min read + 4 min read </li> @@ -1586,14 +1620,14 @@ The most important changes are highlighted in this article, if you are looking f </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v090rc"><a class="toclink" href="../../v090rc/">V0.9.0rc</a></h2> -<h3 id="call-for-testing-silkaj-v090rc"><a class="toclink" href="../../v090rc/#call-for-testing-silkaj-v090rc">Call for testing Silkaj v0.9.0rc</a></h3> -<p>Hello everyone!</p> -<p>We are pleased to publish a release candidate of Silkaj v0.9.0, and we would be happy to receive feedback before releasing it as a stable version.</p> + <h2 id="silkaj-v090-release"><a class="toclink" href="../../silkaj-v090-release/">Silkaj v0.9.0 release</a></h2> +<h3 id="introduction"><a class="toclink" href="../../silkaj-v090-release/#introduction">Introduction</a></h3> +<p>The Silkaj team is pleased to announce the release of Silkaj 0.9.0. +The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> <nav class="md-post__action"> - <a href="../../v090rc/"> + <a href="../../silkaj-v090-release/"> Continue reading </a> </nav> @@ -1615,18 +1649,18 @@ The most important changes are highlighted in this article, if you are looking f <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2020-11-30 00:00:00+00:00">November 30, 2020</time></li> + <time datetime="2021-03-24 00:00:00+00:00">March 24, 2021</time></li> <li class="md-meta__item"> in - <a href="../../minor/" class="md-meta__link">minor</a></li> + <a href="../../rc/" class="md-meta__link">rc</a></li> <li class="md-meta__item"> - 1 min read + 2 min read </li> @@ -1635,11 +1669,17 @@ The most important changes are highlighted in this article, if you are looking f </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v081"><a class="toclink" href="../../v081/">V0.8.1</a></h2> -<ul> -<li><a href="https://git.duniter.org/clients/python/silkaj/issues/358">#358</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/152">!152</a>: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> -</ul> -<p>Thanks matograine for your first release \o/</p> + <h2 id="v090rc"><a class="toclink" href="../../v090rc/">V0.9.0rc</a></h2> +<h3 id="call-for-testing-silkaj-v090rc"><a class="toclink" href="../../v090rc/#call-for-testing-silkaj-v090rc">Call for testing Silkaj v0.9.0rc</a></h3> +<p>Hello everyone!</p> +<p>We are pleased to publish a release candidate of Silkaj v0.9.0, and we would be happy to receive feedback before releasing it as a stable version.</p> + + + <nav class="md-post__action"> + <a href="../../v090rc/"> + Continue reading + </a> + </nav> </div> </article> @@ -1658,18 +1698,18 @@ The most important changes are highlighted in this article, if you are looking f <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2020-10-18 00:00:00+00:00">October 18, 2020</time></li> + <time datetime="2020-11-30 00:00:00+00:00">November 30, 2020</time></li> <li class="md-meta__item"> in - <a href="../../release/" class="md-meta__link">release</a></li> + <a href="../../minor/" class="md-meta__link">minor</a></li> <li class="md-meta__item"> - 7 min read + 1 min read </li> @@ -1678,18 +1718,11 @@ The most important changes are highlighted in this article, if you are looking f </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v080-release"><a class="toclink" href="../../silkaj-v080-release/">Silkaj v0.8.0 release</a></h2> -<h3 id="introduction"><a class="toclink" href="../../silkaj-v080-release/#introduction">Introduction</a></h3> -<p>The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. -This release comes along with a number of new features and improvements. -The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> - - - <nav class="md-post__action"> - <a href="../../silkaj-v080-release/"> - Continue reading - </a> - </nav> + <h2 id="v081"><a class="toclink" href="../../v081/">V0.8.1</a></h2> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/issues/358">#358</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/152">!152</a>: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> +</ul> +<p>Thanks matograine for your first release \o/</p> </div> </article> diff --git a/0.12/blog/page/3/index.html b/0.12/blog/page/3/index.html index 1f164b452797be57c2394f194d25bed16d753136..9d7b3a65a26999aa113b0f4a159f4268154a1b17 100644 --- a/0.12/blog/page/3/index.html +++ b/0.12/blog/page/3/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> @@ -692,6 +692,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v080-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.8.0 release + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#v076" class="md-nav__link"> <span class="md-ellipsis"> @@ -726,15 +735,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#v072" class="md-nav__link"> - <span class="md-ellipsis"> - V0.7.2 - </span> - </a> - </li> </ul> @@ -800,6 +800,31 @@ + <li class="md-nav__item"> + <a href="../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../2023/" class="md-nav__link"> @@ -1395,6 +1420,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v080-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.8.0 release + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#v076" class="md-nav__link"> <span class="md-ellipsis"> @@ -1429,15 +1463,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#v072" class="md-nav__link"> - <span class="md-ellipsis"> - V0.7.2 - </span> - </a> - </li> </ul> @@ -1469,18 +1494,18 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2020-01-24 00:00:00+00:00">January 24, 2020</time></li> + <time datetime="2020-10-18 00:00:00+00:00">October 18, 2020</time></li> <li class="md-meta__item"> in - <a href="../../minor/" class="md-meta__link">minor</a></li> + <a href="../../release/" class="md-meta__link">release</a></li> <li class="md-meta__item"> - 1 min read + 7 min read </li> @@ -1489,10 +1514,18 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v076"><a class="toclink" href="../../v076/">V0.7.6</a></h2> -<ul> -<li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> -</ul> + <h2 id="silkaj-v080-release"><a class="toclink" href="../../silkaj-v080-release/">Silkaj v0.8.0 release</a></h2> +<h3 id="introduction"><a class="toclink" href="../../silkaj-v080-release/#introduction">Introduction</a></h3> +<p>The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. +This release comes along with a number of new features and improvements. +The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> + + + <nav class="md-post__action"> + <a href="../../silkaj-v080-release/"> + Continue reading + </a> + </nav> </div> </article> @@ -1511,7 +1544,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2020-01-23 00:00:00+00:00">January 23, 2020</time></li> + <time datetime="2020-01-24 00:00:00+00:00">January 24, 2020</time></li> <li class="md-meta__item"> in @@ -1531,10 +1564,9 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v075"><a class="toclink" href="../../v075/">V0.7.5</a></h2> + <h2 id="v076"><a class="toclink" href="../../v076/">V0.7.6</a></h2> <ul> -<li><a href="https://git.duniter.org/clients/python/silkaj/issues/276">#276</a>: Publish on PyPI with the previous method: <code>setup.py</code>, <code>wheel</code>, and <code>twine</code>.</li> -<li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> +<li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul> </div> @@ -1554,7 +1586,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2020-01-22 00:00:00+00:00">January 22, 2020</time></li> + <time datetime="2020-01-23 00:00:00+00:00">January 23, 2020</time></li> <li class="md-meta__item"> in @@ -1574,11 +1606,11 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v074"><a class="toclink" href="../../v074/">V0.7.4</a></h2> + <h2 id="v075"><a class="toclink" href="../../v075/">V0.7.5</a></h2> <ul> -<li><a href="https://git.duniter.org/clients/python/silkaj/issues/273">#273</a>: Fix broken PubSec authfile importation regex</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/issues/276">#276</a>: Publish on PyPI with the previous method: <code>setup.py</code>, <code>wheel</code>, and <code>twine</code>.</li> +<li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul> -<p>Thanks to matograine for this bugfix and the release!</p> </div> </article> @@ -1597,7 +1629,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2019-07-25 00:00:00+00:00">July 25, 2019</time></li> + <time datetime="2020-01-22 00:00:00+00:00">January 22, 2020</time></li> <li class="md-meta__item"> in @@ -1617,14 +1649,11 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v073"><a class="toclink" href="../../v073/">V0.7.3</a></h2> + <h2 id="v074"><a class="toclink" href="../../v074/">V0.7.4</a></h2> <ul> -<li><a href="https://git.duniter.org/clients/python/silkaj/issues/239">#239</a>: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:<ul> -<li>remove already used inputs: restore previous behaviour which haven’t been kept the same during the migration</li> -<li><code>enumerate()</code> wrongly moved to the non appropriate <code>for</code> loop</li> -</ul> -</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/issues/273">#273</a>: Fix broken PubSec authfile importation regex</li> </ul> +<p>Thanks to matograine for this bugfix and the release!</p> </div> </article> @@ -1643,7 +1672,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2019-06-25 00:00:00+00:00">June 25, 2019</time></li> + <time datetime="2019-07-25 00:00:00+00:00">July 25, 2019</time></li> <li class="md-meta__item"> in @@ -1663,9 +1692,13 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v072"><a class="toclink" href="../../v072/">V0.7.2</a></h2> + <h2 id="v073"><a class="toclink" href="../../v073/">V0.7.3</a></h2> <ul> -<li>Fix result of the multiplication of the amount passed as float for the transaction command</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/issues/239">#239</a>: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:<ul> +<li>remove already used inputs: restore previous behaviour which haven’t been kept the same during the migration</li> +<li><code>enumerate()</code> wrongly moved to the non appropriate <code>for</code> loop</li> +</ul> +</li> </ul> </div> diff --git a/0.12/blog/page/4/index.html b/0.12/blog/page/4/index.html index 1f227d4c2db7a1befa8ee1e19ef6a1a0314d35c2..925117afa3ba3f95fa2044971eff8b402590a85a 100644 --- a/0.12/blog/page/4/index.html +++ b/0.12/blog/page/4/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> @@ -692,6 +692,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#v072" class="md-nav__link"> + <span class="md-ellipsis"> + V0.7.2 + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#v071" class="md-nav__link"> <span class="md-ellipsis"> @@ -726,15 +735,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v050-release-lets-certify" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.5.0 release: Let’s certify! - </span> - </a> - </li> </ul> @@ -800,6 +800,31 @@ + <li class="md-nav__item"> + <a href="../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../2023/" class="md-nav__link"> @@ -1395,6 +1420,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#v072" class="md-nav__link"> + <span class="md-ellipsis"> + V0.7.2 + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#v071" class="md-nav__link"> <span class="md-ellipsis"> @@ -1429,15 +1463,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v050-release-lets-certify" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.5.0 release: Let’s certify! - </span> - </a> - </li> </ul> @@ -1469,7 +1494,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2019-05-29 00:00:00+00:00">May 29, 2019</time></li> + <time datetime="2019-06-25 00:00:00+00:00">June 25, 2019</time></li> <li class="md-meta__item"> in @@ -1489,9 +1514,9 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="v071"><a class="toclink" href="../../v071/">V0.7.1</a></h2> + <h2 id="v072"><a class="toclink" href="../../v072/">V0.7.2</a></h2> <ul> -<li>Bug fix transaction generation</li> +<li>Fix result of the multiplication of the amount passed as float for the transaction command</li> </ul> </div> @@ -1511,18 +1536,18 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2019-05-22 00:00:00+00:00">May 22, 2019</time></li> + <time datetime="2019-05-29 00:00:00+00:00">May 29, 2019</time></li> <li class="md-meta__item"> in - <a href="../../release/" class="md-meta__link">release</a></li> + <a href="../../minor/" class="md-meta__link">minor</a></li> <li class="md-meta__item"> - 7 min read + 1 min read </li> @@ -1531,17 +1556,10 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v070-release-duniterpy-click-transactions-history-debian-website"><a class="toclink" href="../../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/">Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website</a></h2> -<p>Six months after the <a href="https://forum.duniter.org/t/silkaj-v0-6-0-release-let-s-install/4858/1">previous major release</a>, I am pleased to announce the release of Silkaj v0.7.0 for the <a href="http://rml13.creationmonetaire.info/">thirteenth Free Currency Meeting</a>.</p> -<p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> -<p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p> - - - <nav class="md-post__action"> - <a href="../../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/"> - Continue reading - </a> - </nav> + <h2 id="v071"><a class="toclink" href="../../v071/">V0.7.1</a></h2> +<ul> +<li>Bug fix transaction generation</li> +</ul> </div> </article> @@ -1560,7 +1578,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-12-10 00:00:00+00:00">December 10, 2018</time></li> + <time datetime="2019-05-22 00:00:00+00:00">May 22, 2019</time></li> <li class="md-meta__item"> in @@ -1571,7 +1589,7 @@ <li class="md-meta__item"> - 2 min read + 7 min read </li> @@ -1580,12 +1598,14 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v061-release"><a class="toclink" href="../../silkaj-v061-release/">Silkaj v0.6.1 release</a></h2> -<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p> + <h2 id="silkaj-v070-release-duniterpy-click-transactions-history-debian-website"><a class="toclink" href="../../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/">Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website</a></h2> +<p>Six months after the <a href="https://forum.duniter.org/t/silkaj-v0-6-0-release-let-s-install/4858/1">previous major release</a>, I am pleased to announce the release of Silkaj v0.7.0 for the <a href="http://rml13.creationmonetaire.info/">thirteenth Free Currency Meeting</a>.</p> +<p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> +<p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p> <nav class="md-post__action"> - <a href="../../silkaj-v061-release/"> + <a href="../../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/"> Continue reading </a> </nav> @@ -1607,7 +1627,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-11-18 00:00:00+00:00">November 18, 2018</time></li> + <time datetime="2018-12-10 00:00:00+00:00">December 10, 2018</time></li> <li class="md-meta__item"> in @@ -1618,7 +1638,7 @@ <li class="md-meta__item"> - 4 min read + 2 min read </li> @@ -1627,13 +1647,12 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v060-release-lets-install"><a class="toclink" href="../../silkaj-v060-release-lets-install/">Silkaj v0.6.0 release: Let’s install</a></h2> -<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the <a href="https://rml.creationmonetaire.info/">twelfth Libre Currency Meeting</a>.</p> -<p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p> + <h2 id="silkaj-v061-release"><a class="toclink" href="../../silkaj-v061-release/">Silkaj v0.6.1 release</a></h2> +<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p> <nav class="md-post__action"> - <a href="../../silkaj-v060-release-lets-install/"> + <a href="../../silkaj-v061-release/"> Continue reading </a> </nav> @@ -1655,7 +1674,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-05-21 00:00:00+00:00">May 21, 2018</time></li> + <time datetime="2018-11-18 00:00:00+00:00">November 18, 2018</time></li> <li class="md-meta__item"> in @@ -1666,7 +1685,7 @@ <li class="md-meta__item"> - 3 min read + 4 min read </li> @@ -1675,14 +1694,13 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2> -<p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p> -<p><img alt="" src="../../../images/silkaj_logo.png" width="200" /></p> -<p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p> + <h2 id="silkaj-v060-release-lets-install"><a class="toclink" href="../../silkaj-v060-release-lets-install/">Silkaj v0.6.0 release: Let’s install</a></h2> +<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the <a href="https://rml.creationmonetaire.info/">twelfth Libre Currency Meeting</a>.</p> +<p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p> <nav class="md-post__action"> - <a href="../../silkaj-v050-release-lets-certify/"> + <a href="../../silkaj-v060-release-lets-install/"> Continue reading </a> </nav> diff --git a/0.12/blog/page/5/index.html b/0.12/blog/page/5/index.html index c94b242307fc7a8e660268f4087a012b90ec69e6..227531f833b96131b77664c359137b8615c4a849 100644 --- a/0.12/blog/page/5/index.html +++ b/0.12/blog/page/5/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css"> @@ -692,6 +692,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v050-release-lets-certify" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.5.0 release: Let’s certify! + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v040-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -791,6 +800,31 @@ + <li class="md-nav__item"> + <a href="../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../2023/" class="md-nav__link"> @@ -1386,6 +1420,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v050-release-lets-certify" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.5.0 release: Let’s certify! + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v040-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1448,6 +1491,55 @@ </nav> + <div class="md-post__meta md-meta"> + <ul class="md-meta__list"> + <li class="md-meta__item"> + <time datetime="2018-05-21 00:00:00+00:00">May 21, 2018</time></li> + + <li class="md-meta__item"> + in + + <a href="../../release/" class="md-meta__link">release</a></li> + + + + <li class="md-meta__item"> + + 3 min read + + </li> + + </ul> + + </div> + </header> + <div class="md-post__content md-typeset"> + <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2> +<p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p> +<p><img alt="" src="../../../images/silkaj_logo.png" width="200" /></p> +<p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p> + + + <nav class="md-post__action"> + <a href="../../silkaj-v050-release-lets-certify/"> + Continue reading + </a> + </nav> + + </div> +</article> + + <article class="md-post md-post--excerpt"> + <header class="md-post__header"> + + <nav class="md-post__authors md-typeset"> + + <span class="md-author"> + <img src="../../../../latest/images/Moul.png" alt="Moul"> + </span> + + </nav> + <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> diff --git a/0.12/blog/rc/index.html b/0.12/blog/rc/index.html index 36a256bf77660e757d836b79372171cee466187d..8386ef307b2d9cdaacbc490b7d554a6db47f5718 100644 --- a/0.12/blog/rc/index.html +++ b/0.12/blog/rc/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -713,6 +713,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/release/index.html b/0.12/blog/release/index.html index 2667d0e779fd57a0938b072d29fb228e97252d9f..90c350e960418c769e85a176fca560237d7272a7 100644 --- a/0.12/blog/release/index.html +++ b/0.12/blog/release/index.html @@ -16,11 +16,11 @@ <link rel="prev" href="../rc/"> - <link rel="next" href="../2023/"> + <link rel="next" href="../2025/"> <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -713,6 +713,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> @@ -1071,6 +1096,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v0120-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.12.0 release + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v0110-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1105,15 +1139,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v070-release-duniterpy-click-transactions-history-debian-website" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website - </span> - </a> - </li> </ul> @@ -1399,6 +1424,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v0120-release" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.12.0 release + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v0110-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1433,15 +1467,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v070-release-duniterpy-click-transactions-history-debian-website" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website - </span> - </a> - </li> </ul> @@ -1470,6 +1495,67 @@ </nav> + <div class="md-post__meta md-meta"> + <ul class="md-meta__list"> + <li class="md-meta__item"> + <time datetime="2025-04-22 00:00:00+00:00">April 22, 2025</time></li> + + <li class="md-meta__item"> + in + + <a href="./" class="md-meta__link">release</a></li> + + + + <li class="md-meta__item"> + + 9 min read + + </li> + + </ul> + + </div> + </header> + <div class="md-post__content md-typeset"> + <h2 id="silkaj-v0120-release"><a class="toclink" href="../silkaj-v0120-release/">Silkaj v0.12.0 release</a></h2> +<p>I am pleased to announce the stable release of Silkaj version 0.12.0</p> +<p>In this article, the most important changes are highlighted. if you are looking for a comprehensive list of changes, check out the changelog.</p> +<h3 id="introduction"><a class="toclink" href="../silkaj-v0120-release/#introduction">Introduction</a></h3> +<p>The original plan changed, a difficult choice has been made to work on a second development cycle tied to v1 ecosystem, because v2 ecosystem was not fully ready. +It was worth it for Silkaj project’s growth with huge improvements not tied to v1 nor v2 ecosystems. +It was difficult to go in a slightly different direction, since all contributors’ energy was directed to v2 ecosystem development. +Äžcli took over the role as the first CLI client on v2 ecosystem. Silkaj made little progress on v2 ecosystem. +But, as for v0.11.0, this release also paves the way for implementations based on v2 ecosystem.</p> +<p>This release comes with the account storage implementation which greatly improves the authentication and revocation files management. +A new documentation website has been set up. +<code>money history</code> command features the comma-separated value (CSV) output file format option. +The command line interface has seen great improvements such as a usage with colors, a better error output, the shell completion, and a small help option. +Äž1 monetary license have been updated, and DeathReaper is now released as part of Silkaj. +Last but not least, Silkaj comes with minor network optimisations and Python 3.13 support.</p> +<p>This release is the last planned major release with Duniter v1/BMA support.</p> + + + <nav class="md-post__action"> + <a href="../silkaj-v0120-release/"> + Continue reading + </a> + </nav> + + </div> +</article> + + <article class="md-post md-post--excerpt"> + <header class="md-post__header"> + + <nav class="md-post__authors md-typeset"> + + <span class="md-author"> + <img src="../../../latest/images/Moul.png" alt="Moul"> + </span> + + </nav> + <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> @@ -1673,55 +1759,6 @@ The most important of them are highlighted in this article, if you are looking f </div> </article> - <article class="md-post md-post--excerpt"> - <header class="md-post__header"> - - <nav class="md-post__authors md-typeset"> - - <span class="md-author"> - <img src="../../../latest/images/Moul.png" alt="Moul"> - </span> - - </nav> - - <div class="md-post__meta md-meta"> - <ul class="md-meta__list"> - <li class="md-meta__item"> - <time datetime="2019-05-22 00:00:00+00:00">May 22, 2019</time></li> - - <li class="md-meta__item"> - in - - <a href="./" class="md-meta__link">release</a></li> - - - - <li class="md-meta__item"> - - 7 min read - - </li> - - </ul> - - </div> - </header> - <div class="md-post__content md-typeset"> - <h2 id="silkaj-v070-release-duniterpy-click-transactions-history-debian-website"><a class="toclink" href="../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/">Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website</a></h2> -<p>Six months after the <a href="https://forum.duniter.org/t/silkaj-v0-6-0-release-let-s-install/4858/1">previous major release</a>, I am pleased to announce the release of Silkaj v0.7.0 for the <a href="http://rml13.creationmonetaire.info/">thirteenth Free Currency Meeting</a>.</p> -<p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> -<p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p> - - - <nav class="md-post__action"> - <a href="../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/"> - Continue reading - </a> - </nav> - - </div> -</article> - diff --git a/0.12/blog/release/page/2/index.html b/0.12/blog/release/page/2/index.html index d67fd808361234a245ed15d376f3d577295c75b5..a55038859f53ceafc973e108d5a72036c8061e42 100644 --- a/0.12/blog/release/page/2/index.html +++ b/0.12/blog/release/page/2/index.html @@ -16,11 +16,11 @@ <link rel="prev" href="../../../rc/"> - <link rel="next" href="../../../2023/"> + <link rel="next" href="../../../2025/"> <link rel="icon" href="../../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../../assets/stylesheets/palette.06af60db.min.css"> @@ -713,6 +713,31 @@ + <li class="md-nav__item"> + <a href="../../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../../2023/" class="md-nav__link"> @@ -1069,6 +1094,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v070-release-duniterpy-click-transactions-history-debian-website" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v061-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1103,15 +1137,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v030-release-lets-send-money" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.3.0 release: Let's send money! - </span> - </a> - </li> </ul> @@ -1397,6 +1422,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v070-release-duniterpy-click-transactions-history-debian-website" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v061-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1431,15 +1465,6 @@ </span> </a> -</li> - - <li class="md-nav__item"> - <a href="#silkaj-v030-release-lets-send-money" class="md-nav__link"> - <span class="md-ellipsis"> - Silkaj v0.3.0 release: Let's send money! - </span> - </a> - </li> </ul> @@ -1471,7 +1496,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-12-10 00:00:00+00:00">December 10, 2018</time></li> + <time datetime="2019-05-22 00:00:00+00:00">May 22, 2019</time></li> <li class="md-meta__item"> in @@ -1482,7 +1507,7 @@ <li class="md-meta__item"> - 2 min read + 7 min read </li> @@ -1491,12 +1516,14 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v061-release"><a class="toclink" href="../../../silkaj-v061-release/">Silkaj v0.6.1 release</a></h2> -<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p> + <h2 id="silkaj-v070-release-duniterpy-click-transactions-history-debian-website"><a class="toclink" href="../../../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/">Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website</a></h2> +<p>Six months after the <a href="https://forum.duniter.org/t/silkaj-v0-6-0-release-let-s-install/4858/1">previous major release</a>, I am pleased to announce the release of Silkaj v0.7.0 for the <a href="http://rml13.creationmonetaire.info/">thirteenth Free Currency Meeting</a>.</p> +<p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> +<p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p> <nav class="md-post__action"> - <a href="../../../silkaj-v061-release/"> + <a href="../../../silkaj-v070-release-duniterpy-click-transactions-history-debian-website/"> Continue reading </a> </nav> @@ -1518,7 +1545,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-11-18 00:00:00+00:00">November 18, 2018</time></li> + <time datetime="2018-12-10 00:00:00+00:00">December 10, 2018</time></li> <li class="md-meta__item"> in @@ -1529,7 +1556,7 @@ <li class="md-meta__item"> - 4 min read + 2 min read </li> @@ -1538,13 +1565,12 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v060-release-lets-install"><a class="toclink" href="../../../silkaj-v060-release-lets-install/">Silkaj v0.6.0 release: Let’s install</a></h2> -<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the <a href="https://rml.creationmonetaire.info/">twelfth Libre Currency Meeting</a>.</p> -<p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p> + <h2 id="silkaj-v061-release"><a class="toclink" href="../../../silkaj-v061-release/">Silkaj v0.6.1 release</a></h2> +<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p> <nav class="md-post__action"> - <a href="../../../silkaj-v060-release-lets-install/"> + <a href="../../../silkaj-v061-release/"> Continue reading </a> </nav> @@ -1566,7 +1592,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-05-21 00:00:00+00:00">May 21, 2018</time></li> + <time datetime="2018-11-18 00:00:00+00:00">November 18, 2018</time></li> <li class="md-meta__item"> in @@ -1577,7 +1603,7 @@ <li class="md-meta__item"> - 3 min read + 4 min read </li> @@ -1586,14 +1612,13 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../../../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2> -<p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p> -<p><img alt="" src="../../../../images/silkaj_logo.png" width="200" /></p> -<p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p> + <h2 id="silkaj-v060-release-lets-install"><a class="toclink" href="../../../silkaj-v060-release-lets-install/">Silkaj v0.6.0 release: Let’s install</a></h2> +<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the <a href="https://rml.creationmonetaire.info/">twelfth Libre Currency Meeting</a>.</p> +<p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p> <nav class="md-post__action"> - <a href="../../../silkaj-v050-release-lets-certify/"> + <a href="../../../silkaj-v060-release-lets-install/"> Continue reading </a> </nav> @@ -1615,7 +1640,7 @@ <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2018-01-28 00:00:00+00:00">January 28, 2018</time></li> + <time datetime="2018-05-21 00:00:00+00:00">May 21, 2018</time></li> <li class="md-meta__item"> in @@ -1626,7 +1651,7 @@ <li class="md-meta__item"> - 2 min read + 3 min read </li> @@ -1635,14 +1660,14 @@ </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v040-release"><a class="toclink" href="../../../silkaj-v040-release/">Silkaj v0.4.0 release</a></h2> -<p>A new <code>wot</code> command allows to display received and sent certifictaions of an identity. -Additionnal user experience enhancements have been added to the transaction feature. -It is now possible to check the balance of multiple public keys and get a sum of the balances.</p> + <h2 id="silkaj-v050-release-lets-certify"><a class="toclink" href="../../../silkaj-v050-release-lets-certify/">Silkaj v0.5.0 release: Let’s certify!</a></h2> +<p>For the <a href="https://rml.creationmonetaire.info/">eleventh Libre Currency Meeting (RML)</a>, I am pleased to announce Silkaj v0.5.0 release.</p> +<p><img alt="" src="../../../../images/silkaj_logo.png" width="200" /></p> +<p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p> <nav class="md-post__action"> - <a href="../../../silkaj-v040-release/"> + <a href="../../../silkaj-v050-release-lets-certify/"> Continue reading </a> </nav> @@ -1664,7 +1689,7 @@ It is now possible to check the balance of multiple public keys and get a sum of <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> - <time datetime="2017-04-17 00:00:00+00:00">April 17, 2017</time></li> + <time datetime="2018-01-28 00:00:00+00:00">January 28, 2018</time></li> <li class="md-meta__item"> in @@ -1675,7 +1700,7 @@ It is now possible to check the balance of multiple public keys and get a sum of <li class="md-meta__item"> - 1 min read + 2 min read </li> @@ -1684,13 +1709,14 @@ It is now possible to check the balance of multiple public keys and get a sum of </div> </header> <div class="md-post__content md-typeset"> - <h2 id="silkaj-v030-release-lets-send-money"><a class="toclink" href="../../../silkaj-v030-release-lets-send-money/">Silkaj v0.3.0 release: Let's send money!</a></h2> -<p>This release comes with user experience enhancements on the <code>transaction</code> command and the authentication in general. A new <code>id</code> command allows to look-up for identities. -Efforts were put into improving the installation process.</p> + <h2 id="silkaj-v040-release"><a class="toclink" href="../../../silkaj-v040-release/">Silkaj v0.4.0 release</a></h2> +<p>A new <code>wot</code> command allows to display received and sent certifictaions of an identity. +Additionnal user experience enhancements have been added to the transaction feature. +It is now possible to check the balance of multiple public keys and get a sum of the balances.</p> <nav class="md-post__action"> - <a href="../../../silkaj-v030-release-lets-send-money/"> + <a href="../../../silkaj-v040-release/"> Continue reading </a> </nav> diff --git a/0.12/blog/release/page/3/index.html b/0.12/blog/release/page/3/index.html index d401b91e02b3d5670807c6209bb3ebde9fcfca57..f68d75bcb3b265ba57e66cb72d99da5df7a4c446 100644 --- a/0.12/blog/release/page/3/index.html +++ b/0.12/blog/release/page/3/index.html @@ -16,11 +16,11 @@ <link rel="prev" href="../../../rc/"> - <link rel="next" href="../../../2023/"> + <link rel="next" href="../../../2025/"> <link rel="icon" href="../../../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../../../assets/stylesheets/palette.06af60db.min.css"> @@ -713,6 +713,31 @@ + <li class="md-nav__item"> + <a href="../../../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../../2023/" class="md-nav__link"> @@ -1069,6 +1094,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v030-release-lets-send-money" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.3.0 release: Let's send money! + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v020-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1370,6 +1404,15 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#silkaj-v030-release-lets-send-money" class="md-nav__link"> + <span class="md-ellipsis"> + Silkaj v0.3.0 release: Let's send money! + </span> + </a> + +</li> + <li class="md-nav__item"> <a href="#silkaj-v020-release" class="md-nav__link"> <span class="md-ellipsis"> @@ -1414,6 +1457,54 @@ </nav> + <div class="md-post__meta md-meta"> + <ul class="md-meta__list"> + <li class="md-meta__item"> + <time datetime="2017-04-17 00:00:00+00:00">April 17, 2017</time></li> + + <li class="md-meta__item"> + in + + <a href="../../" class="md-meta__link">release</a></li> + + + + <li class="md-meta__item"> + + 1 min read + + </li> + + </ul> + + </div> + </header> + <div class="md-post__content md-typeset"> + <h2 id="silkaj-v030-release-lets-send-money"><a class="toclink" href="../../../silkaj-v030-release-lets-send-money/">Silkaj v0.3.0 release: Let's send money!</a></h2> +<p>This release comes with user experience enhancements on the <code>transaction</code> command and the authentication in general. A new <code>id</code> command allows to look-up for identities. +Efforts were put into improving the installation process.</p> + + + <nav class="md-post__action"> + <a href="../../../silkaj-v030-release-lets-send-money/"> + Continue reading + </a> + </nav> + + </div> +</article> + + <article class="md-post md-post--excerpt"> + <header class="md-post__header"> + + <nav class="md-post__authors md-typeset"> + + <span class="md-author"> + <img src="../../../../../latest/images/Moul.png" alt="Moul"> + </span> + + </nav> + <div class="md-post__meta md-meta"> <ul class="md-meta__list"> <li class="md-meta__item"> diff --git a/0.12/blog/silkaj-new-cli-duniter-client/index.html b/0.12/blog/silkaj-new-cli-duniter-client/index.html index a5db2ccc01ef54869fec72f8c55e0c2db011c0fe..9820d87a363150681405a76560e2fd12b312ba5e 100644 --- a/0.12/blog/silkaj-new-cli-duniter-client/index.html +++ b/0.12/blog/silkaj-new-cli-duniter-client/index.html @@ -18,7 +18,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -26,7 +26,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -715,6 +715,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v0110-release/index.html b/0.12/blog/silkaj-v0110-release/index.html index d5071a1a449bef1dacd9111eb624ba0f2c1943da..deedf9a6493275cc19749fbc2b635048b2e30825 100644 --- a/0.12/blog/silkaj-v0110-release/index.html +++ b/0.12/blog/silkaj-v0110-release/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v0120-release/index.html b/0.12/blog/silkaj-v0120-release/index.html new file mode 100644 index 0000000000000000000000000000000000000000..f681c8851db10c4b3776eb0b27b119648910e002 --- /dev/null +++ b/0.12/blog/silkaj-v0120-release/index.html @@ -0,0 +1,1916 @@ + +<!doctype html> +<html lang="en" class="no-js"> + <head> + + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + + <meta name="description" content="Command line client for Äž1 libre-currency powered by Duniter"> + + + + <link rel="canonical" href="https://silkaj.duniter.org/0.12/blog/silkaj-v0120-release/"> + + + <link rel="prev" href="../v0112/"> + + + + <link rel="icon" href="../../images/silkaj_logo.png"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> + + + + <title>Silkaj v0.12.0 release - Silkaj</title> + + + + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> + + + <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> + + + + + + + + + + + + + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> + + + + + + + </head> + + + + + + + + + + <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo"> + + + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> + <label class="md-overlay" for="__drawer"></label> + <div data-md-component="skip"> + + + <a href="#silkaj-v0120-release" class="md-skip"> + Skip to content + </a> + + </div> + <div data-md-component="announce"> + + </div> + + <div data-md-color-scheme="default" data-md-component="outdated" hidden> + + </div> + + + + + + +<header class="md-header md-header--shadow md-header--lifted" data-md-component="header"> + <nav class="md-header__inner md-grid" aria-label="Header"> + <a href="../.." title="Silkaj" class="md-header__button md-logo" aria-label="Silkaj" data-md-component="logo"> + + <img src="../../images/silkaj_logo.png" alt="logo"> + + </a> + <label class="md-header__button md-icon" for="__drawer"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> + </label> + <div class="md-header__title" data-md-component="header-title"> + <div class="md-header__ellipsis"> + <div class="md-header__topic"> + <span class="md-ellipsis"> + Silkaj + </span> + </div> + <div class="md-header__topic" data-md-component="header-topic"> + <span class="md-ellipsis"> + + Silkaj v0.12.0 release + + </span> + </div> + </div> + </div> + + + <form class="md-header__option" data-md-component="palette"> + + + + + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> + + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> + </label> + + + + + + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> + + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> + </label> + + +</form> + + + + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> + + + + + + <label class="md-header__button md-icon" for="__search"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> + </label> + <div class="md-search" data-md-component="search" role="dialog"> + <label class="md-search__overlay" for="__search"></label> + <div class="md-search__inner" role="search"> + <form class="md-search__form" name="search"> + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> + <label class="md-search__icon md-icon" for="__search"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> + </label> + <nav class="md-search__options" aria-label="Search"> + + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> + </button> + </nav> + + </form> + <div class="md-search__output"> + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> + <div class="md-search-result" data-md-component="search-result"> + <div class="md-search-result__meta"> + Initializing search + </div> + <ol class="md-search-result__list" role="presentation"></ol> + </div> + </div> + </div> + </div> +</div> + + + + <div class="md-header__source"> + <a href="https://git.duniter.org/clients/python/silkaj" title="Go to repository" class="md-source" data-md-component="source"> + <div class="md-source__icon md-icon"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> + </div> + <div class="md-source__repository"> + GitLab + </div> +</a> + </div> + + </nav> + + + +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> + <div class="md-grid"> + <ul class="md-tabs__list"> + + + + + + + <li class="md-tabs__item"> + <a href="../.." class="md-tabs__link"> + + + + + + Home + + </a> + </li> + + + + + + + + + <li class="md-tabs__item"> + <a href="../../install/" class="md-tabs__link"> + + + + + + Installation + + </a> + </li> + + + + + + + + + + + <li class="md-tabs__item"> + <a href="../../usage/" class="md-tabs__link"> + + + + Usage + + </a> + </li> + + + + + + + + + + + + + + <li class="md-tabs__item md-tabs__item--active"> + <a href="../" class="md-tabs__link"> + + + + Blog + + </a> + </li> + + + + + + + + + + <li class="md-tabs__item"> + <a href="../../changelog/" class="md-tabs__link"> + + + + + + Changelog + + </a> + </li> + + + + + + + + + + + <li class="md-tabs__item"> + <a href="../../contributing/" class="md-tabs__link"> + + + + Contributing + + </a> + </li> + + + + + </ul> + </div> +</nav> + + +</header> + + <div class="md-container" data-md-component="container"> + + + + + <main class="md-main" data-md-component="main"> + <div class="md-main__inner md-grid"> + + + + + + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" hidden> + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + + + + + + +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> + <label class="md-nav__title" for="__drawer"> + <a href="../.." title="Silkaj" class="md-nav__button md-logo" aria-label="Silkaj" data-md-component="logo"> + + <img src="../../images/silkaj_logo.png" alt="logo"> + + </a> + Silkaj + </label> + + <div class="md-nav__source"> + <a href="https://git.duniter.org/clients/python/silkaj" title="Go to repository" class="md-source" data-md-component="source"> + <div class="md-source__icon md-icon"> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> + </div> + <div class="md-source__repository"> + GitLab + </div> +</a> + </div> + + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../.." class="md-nav__link"> + + + + <span class="md-ellipsis"> + Home + + </span> + + + </a> + </li> + + + + + + + + + + <li class="md-nav__item"> + <a href="../../install/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Installation + + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" > + + + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> + + + + <span class="md-ellipsis"> + Usage + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_3"> + <span class="md-nav__icon md-icon"></span> + Usage + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Usage + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/cli/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Command-line interface reference + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/account_storage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Account storage + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/multi-recipients_transfers_and_automation/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Multi-recipients transfers and automation + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../usage/deathreaper/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + DeathReaper + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked> + + + <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex=""> + + + + <span class="md-ellipsis"> + Blog + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true"> + <label class="md-nav__title" for="__nav_4"> + <span class="md-nav__icon md-icon"></span> + Blog + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + + + <li class="md-nav__item md-nav__item--active"> + <a href="../" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Blog + + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--section md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" > + + + <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex=""> + + + + <span class="md-ellipsis"> + Archive + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_2"> + <span class="md-nav__icon md-icon"></span> + Archive + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2023/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2023 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2022/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2022 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2021/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2021 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2020/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2020 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2019/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2019 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2018/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2018 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2017/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2017 + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../2016/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2016 + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--section md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" > + + + <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex=""> + + + + <span class="md-ellipsis"> + Categories + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_4_3"> + <span class="md-nav__icon md-icon"></span> + Categories + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + + + <li class="md-nav__item"> + <a href="../minor/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + minor + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../rc/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + rc + + </span> + + + </a> + </li> + + + + + + + + + + + + + <li class="md-nav__item"> + <a href="../release/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + release + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + + </ul> + </nav> + + </li> + + + + + + + + + + <li class="md-nav__item"> + <a href="../../changelog/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Changelog + + </span> + + + </a> + </li> + + + + + + + + + + + + + + + + + + + + <li class="md-nav__item md-nav__item--nested"> + + + + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > + + + <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0"> + + + + <span class="md-ellipsis"> + Contributing + + </span> + + + <span class="md-nav__icon md-icon"></span> + </label> + + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> + <label class="md-nav__title" for="__nav_6"> + <span class="md-nav__icon md-icon"></span> + Contributing + </label> + <ul class="md-nav__list" data-md-scrollfix> + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Contributing + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/install_poetry/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Poetry installation + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/container_usage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Container usage + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/documentation/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Documentation + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/testing/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Testing + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../coverage/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Coverage report + + </span> + + + </a> + </li> + + + + + + + + + + + <li class="md-nav__item"> + <a href="../../contributing/packaging/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + Packaging + + </span> + + + </a> + </li> + + + + + </ul> + </nav> + + </li> + + + + </ul> +</nav> + </div> + </div> + </div> + + + + + + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + + +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> + + + + + + + <label class="md-nav__title" for="__toc"> + <span class="md-nav__icon md-icon"></span> + Table of contents + </label> + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + + <li class="md-nav__item"> + <a href="#introduction" class="md-nav__link"> + <span class="md-ellipsis"> + Introduction + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#account-storage-authentication-and-revocation-files-storage-improvements" class="md-nav__link"> + <span class="md-ellipsis"> + Account storage: authentication and revocation files storage improvements + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#new-documentation-website" class="md-nav__link"> + <span class="md-ellipsis"> + New documentation website + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#csv-output-on-money-history-command" class="md-nav__link"> + <span class="md-ellipsis"> + CSV output on money history command + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#command-line-interface" class="md-nav__link"> + <span class="md-ellipsis"> + Command line interface + </span> + </a> + + <nav class="md-nav" aria-label="Command line interface"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#rich-click" class="md-nav__link"> + <span class="md-ellipsis"> + Rich-click + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#shell-completion" class="md-nav__link"> + <span class="md-ellipsis"> + Shell completion + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#small-help-option" class="md-nav__link"> + <span class="md-ellipsis"> + Small help option + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + + <li class="md-nav__item"> + <a href="#renaming-transfer-comment-to-reference" class="md-nav__link"> + <span class="md-ellipsis"> + Renaming transfer comment to reference + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#wot-status-command-displays-precise-expiration-date-of-received-certifications" class="md-nav__link"> + <span class="md-ellipsis"> + wot status command displays precise expiration date of received certifications + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#g1-monetary-license-update" class="md-nav__link"> + <span class="md-ellipsis"> + Äž1 monetary license update + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#deathreaper-is-now-released-as-part-of-silkaj" class="md-nav__link"> + <span class="md-ellipsis"> + DeathReaper is now released as part of Silkaj + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#bma-optimisations" class="md-nav__link"> + <span class="md-ellipsis"> + BMA optimisations + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#python-versions-support" class="md-nav__link"> + <span class="md-ellipsis"> + Python versions support + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#development-environment" class="md-nav__link"> + <span class="md-ellipsis"> + Development Environment + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#removals" class="md-nav__link"> + <span class="md-ellipsis"> + Removals + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#outlook" class="md-nav__link"> + <span class="md-ellipsis"> + Outlook + </span> + </a> + +</li> + + </ul> + +</nav> + </div> + </div> + </div> + + + + <div class="md-content md-content--post" data-md-component="content"> + <div class="md-sidebar md-sidebar--post" data-md-component="sidebar" data-md-type="navigation"> + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner md-post"> + <nav class="md-nav md-nav--primary"> + <div class="md-post__back"> + <div class="md-nav__title md-nav__container"> + <a href="../" class="md-nav__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> + <span class="md-ellipsis"> + Back to index + </span> + </a> + </div> + </div> + + <div class="md-post__authors md-typeset"> + + <div class="md-profile md-post__profile"> + <span class="md-author md-author--long"> + <img src="../../../latest/images/Moul.png" alt="Moul"> + </span> + <span class="md-profile__description"> + <strong> + + Moul + + </strong> + <br> + Silkaj and DuniterPy developer + </span> + </div> + + </div> + + <ul class="md-post__meta md-nav__list"> + <li class="md-nav__item md-nav__item--section"> + <div class="md-post__title"> + <span class="md-ellipsis"> + Metadata + </span> + </div> + <nav class="md-nav"> + <ul class="md-nav__list"> + <li class="md-nav__item"> + <div class="md-nav__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 19H5V8h14m-3-7v2H8V1H6v2H5c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2h-1V1m-1 11h-5v5h5z"/></svg> + <time datetime="2025-04-22 00:00:00+00:00" class="md-ellipsis">April 22, 2025</time> + </div> + </li> + + + <li class="md-nav__item"> + <div class="md-nav__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 3v15h3V3zm3 2 4 13 3-1-4-13zM5 5v13h3V5zM3 19v2h18v-2z"/></svg> + <span class="md-ellipsis"> + in + + <a href="../release/">release</a></span> + </div> + </li> + + + + <li class="md-nav__item"> + <div class="md-nav__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 20a8 8 0 0 0 8-8 8 8 0 0 0-8-8 8 8 0 0 0-8 8 8 8 0 0 0 8 8m0-18a10 10 0 0 1 10 10 10 10 0 0 1-10 10C6.47 22 2 17.5 2 12A10 10 0 0 1 12 2m.5 5v5.25l4.5 2.67-.75 1.23L11 13V7z"/></svg> + <span class="md-ellipsis"> + + 9 min read + + </span> + </div> + </li> + + </ul> + </nav> + </li> + </ul> + + </nav> + + </div> + </div> + </div> + <article class="md-content__inner md-typeset"> + + + + + + + +<h1 id="silkaj-v0120-release">Silkaj v0.12.0 release<a class="headerlink" href="#silkaj-v0120-release" title="Permanent link">¶</a></h1> +<p>I am pleased to announce the stable release of Silkaj version 0.12.0</p> +<p>In this article, the most important changes are highlighted. if you are looking for a comprehensive list of changes, check out the changelog.</p> +<h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">¶</a></h2> +<p>The original plan changed, a difficult choice has been made to work on a second development cycle tied to v1 ecosystem, because v2 ecosystem was not fully ready. +It was worth it for Silkaj project’s growth with huge improvements not tied to v1 nor v2 ecosystems. +It was difficult to go in a slightly different direction, since all contributors’ energy was directed to v2 ecosystem development. +Äžcli took over the role as the first CLI client on v2 ecosystem. Silkaj made little progress on v2 ecosystem. +But, as for v0.11.0, this release also paves the way for implementations based on v2 ecosystem.</p> +<p>This release comes with the account storage implementation which greatly improves the authentication and revocation files management. +A new documentation website has been set up. +<code>money history</code> command features the comma-separated value (CSV) output file format option. +The command line interface has seen great improvements such as a usage with colors, a better error output, the shell completion, and a small help option. +Äž1 monetary license have been updated, and DeathReaper is now released as part of Silkaj. +Last but not least, Silkaj comes with minor network optimisations and Python 3.13 support.</p> +<p>This release is the last planned major release with Duniter v1/BMA support.</p> +<!-- more --> + +<h2 id="account-storage-authentication-and-revocation-files-storage-improvements">Account storage: authentication and revocation files storage improvements<a class="headerlink" href="#account-storage-authentication-and-revocation-files-storage-improvements" title="Permanent link">¶</a></h2> +<p>Account storage has been implemented to store authentication and revocation files in a common place organized per account and per currency. +Therefore, authentication and revocation files generated by Silkaj would no longer lay anywhere on the operating system. +By default, they used to be saved to and read from current working directory. +This wrong practice is now behind us. +In addition the files are now stored with <code>600</code> permissions, meaning that only the Unix user who created them are allowed to read and edit them.</p> +<p>Furthermore, a consequent change has been made to restrict the storage to only WIF and EWIF authentication file formats defined in the approved <a href="https://git.duniter.org/documents/rfcs/-/blob/master/rfc/0013_Duniter_Encrypted_Wallet_Import_Format.md">RFC#13</a>. +It improves the security, by focusing the effort on a single authentication file format for v1 ecosystem. +v2 ecosystem might bring in an additional file format, which could bring additional confusions.</p> +<p>Therefore, it is no longer possible to authenticate with all the implemented methods. +The authentication is now restricted to WIF or EWIF authentication files format stored in the account storage. +<code>authentication</code> command the only one still allowing all the implemented authentication methods as input in order to perform the migration. +To migrate to this new authentication method stored into the account storage, you have to run follow command:</p> +<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>silkaj --account <account_name> authentication <--auth-method> +</span></code></pre></div> +<p>Based on this new authentication way, you can run commands using (E)WIF authentication from the account storage, i.e.:</p> +<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>silkaj --account <account_name> money balance +</span></code></pre></div> +<p>For further details, check out the <a href="../../usage/account_storage/">account storage documentation</a>.</p> +<h2 id="new-documentation-website">New documentation website<a class="headerlink" href="#new-documentation-website" title="Permanent link">¶</a></h2> +<p><a href="https://git.duniter.org/websites/silkaj_website">Previous website</a>, created in 2019 by Attilax, was based on a solution not maintainable over time. +Its technology couldn’t scale up and integrate markdown documentation from the repository. +Therefore, its content quickly became outdated. +In 2020, an <a href="https://git.duniter.org/websites/doc_silkaj">other website solution</a> based on VuePress was suggested by ManUtopiK which uses markdown documentation. +This solution wasn’t selected and didn’t went productive mainly because I did not have the full control over it. +The fact that VuePress is based on JavaScript technologies is a downside to me.</p> +<p><img alt="MkDocs Material icon" src="../../images/mkdocs-material-favicon.png" /></p> +<p>I found out about <a href="https://www.mkdocs.org/">MkDocs</a> and the great <a href="https://squidfunk.github.io/mkdocs-material/">Material theme</a>. +This documentation software based on Python is widely used in Python community. +I decided to go with this solution which ticked all the check-boxes. +The initial structure has been set up within the repository. +Following integration plugins have been set up: Click command line interface documentation, test coverage, GitLab issue and merge requests links which is useful in the changelog. +A blog contains the releases announcements. +Continuous deployment has been set up to automatically build and deploy documentation updates to GitLab Pages. +Mike, a system which allows to display the documentation for multiple major releases of Silkaj have been set up. +A drop-down allows to select the documentation dedicated to a version. This should, at least, be helpful for Silkaj v0.1x and v0.2x which will greatly differ. +Finally, a <a href="../../contributing/documentation/">page</a> describes how to contribute to the website.</p> +<h2 id="csv-output-on-money-history-command">CSV output on <code>money history</code> command<a class="headerlink" href="#csv-output-on-money-history-command" title="Permanent link">¶</a></h2> +<div class="language-text highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>silkaj money history <pubkey> --csv-file history.csv +</span></code></pre></div> +<p>This command will save the account’s money movements history in the specified file in CSV format (comma-separated value). +You can then operate the data with a spreadsheet software. +The output looks as follow:</p> +<div class="language-text no-copy highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>Date,Issuers/Recipients,Amounts Äž1,Amounts UDÄž1,Reference +</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>2024-10-24 16:26:55,8ve5XAupWT9NMRbXUnZvQwBCFoq5DQ18bBdjGZciw3wm:Dpf,30.96,2.7992766726943943,Oignons fantastiques merci +</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>2024-10-24 01:34:28,8jWwwyRZMrRsidfVpsGdQGC5zd8pbRDTHrYDwf2kDcrL:9YE,0.25,0.022603978300180832,Dividende Epicerie +</span></code></pre></div> +<h2 id="command-line-interface">Command line interface<a class="headerlink" href="#command-line-interface" title="Permanent link">¶</a></h2> +<h3 id="rich-click">Rich-click<a class="headerlink" href="#rich-click" title="Permanent link">¶</a></h3> +<p>The command line interface now has a nicer usage interface and looking with colors (missing below) thanks to <a href="https://github.com/ewels/rich-click"><code>rich-click</code></a>, a Click add-on.</p> +<div class="language-text no-copy highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>silkaj --help +</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a> +</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a> Usage: silkaj [OPTIONS] COMMAND [ARGS]... +</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> +</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a>â•─ Basic options ─────────────────────────────────────────────────────────────╮ +</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>│ --help -h Show this message and exit. │ +</span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>│ --version -v Show the version and exit. │ +</span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a>╰─────────────────────────────────────────────────────────────────────────────╯ +</span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a>â•─ Endpoint and currency specification ───────────────────────────────────────╮ +</span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a>│ --endpoint -ep TEXT Without specifying this option, the default endpoint │ +</span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a>│ reaches Äž1 currency on its official endpoint: │ +</span><span id="__span-4-12"><a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a>│ https://g1.duniter.org. --endpoint allows to specify │ +</span><span id="__span-4-13"><a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a>│ a custom endpoint following `<host>:<port>/<path>` │ +</span><span id="__span-4-14"><a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a>│ format. `port` and `path` are optional. In case no │ +</span><span id="__span-4-15"><a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a>│ port is specified, it defaults to 443. NOTE: This │ +</span><span id="__span-4-16"><a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a>│ argument is mutually exclusive with arguments: │ +</span><span id="__span-4-17"><a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a>│ [gtest]. │ +</span><span id="__span-4-18"><a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a>│ --gtest -gt Uses official ÄžTest currency endpoint: │ +</span><span id="__span-4-19"><a id="__codelineno-4-19" name="__codelineno-4-19" href="#__codelineno-4-19"></a>│ https://g1-test.duniter.org NOTE: This argument is │ +</span><span id="__span-4-20"><a id="__codelineno-4-20" name="__codelineno-4-20" href="#__codelineno-4-20"></a>│ mutually exclusive with arguments: [endpoint]. │ +</span><span id="__span-4-21"><a id="__codelineno-4-21" name="__codelineno-4-21" href="#__codelineno-4-21"></a>╰─────────────────────────────────────────────────────────────────────────────╯ +</span><span id="__span-4-22"><a id="__codelineno-4-22" name="__codelineno-4-22" href="#__codelineno-4-22"></a>â•─ Account and authentication specification ──────────────────────────────────╮ +</span><span id="__span-4-23"><a id="__codelineno-4-23" name="__codelineno-4-23" href="#__codelineno-4-23"></a>│ --account -a TEXT Account name used in storage │ +</span><span id="__span-4-24"><a id="__codelineno-4-24" name="__codelineno-4-24" href="#__codelineno-4-24"></a>│ `$HOME/.local/share/silkaj/$currency/$account_name` │ +</span><span id="__span-4-25"><a id="__codelineno-4-25" name="__codelineno-4-25" href="#__codelineno-4-25"></a>│ for authentication and revocation. │ +</span><span id="__span-4-26"><a id="__codelineno-4-26" name="__codelineno-4-26" href="#__codelineno-4-26"></a>│ --password -p TEXT EWIF authentication password. If you use this option, │ +</span><span id="__span-4-27"><a id="__codelineno-4-27" name="__codelineno-4-27" href="#__codelineno-4-27"></a>│ prefix the command with a space so the password is │ +</span><span id="__span-4-28"><a id="__codelineno-4-28" name="__codelineno-4-28" href="#__codelineno-4-28"></a>│ not saved in your shell history. In case of an │ +</span><span id="__span-4-29"><a id="__codelineno-4-29" name="__codelineno-4-29" href="#__codelineno-4-29"></a>│ encrypted file, password input will be prompted. │ +</span><span id="__span-4-30"><a id="__codelineno-4-30" name="__codelineno-4-30" href="#__codelineno-4-30"></a>╰─────────────────────────────────────────────────────────────────────────────╯ +</span><span id="__span-4-31"><a id="__codelineno-4-31" name="__codelineno-4-31" href="#__codelineno-4-31"></a>â•─ Options ───────────────────────────────────────────────────────────────────╮ +</span><span id="__span-4-32"><a id="__codelineno-4-32" name="__codelineno-4-32" href="#__codelineno-4-32"></a>│ --display -d Display the generated document before sending it │ +</span><span id="__span-4-33"><a id="__codelineno-4-33" name="__codelineno-4-33" href="#__codelineno-4-33"></a>│ --dry-run -n By-pass the licence and confirmation. Do not send the │ +</span><span id="__span-4-34"><a id="__codelineno-4-34" name="__codelineno-4-34" href="#__codelineno-4-34"></a>│ document, but display it instead │ +</span><span id="__span-4-35"><a id="__codelineno-4-35" name="__codelineno-4-35" href="#__codelineno-4-35"></a>╰─────────────────────────────────────────────────────────────────────────────╯ +</span><span id="__span-4-36"><a id="__codelineno-4-36" name="__codelineno-4-36" href="#__codelineno-4-36"></a>â•─ Commands ──────────────────────────────────────────────────────────────────╮ +</span><span id="__span-4-37"><a id="__codelineno-4-37" name="__codelineno-4-37" href="#__codelineno-4-37"></a>│ about Display program information │ +</span><span id="__span-4-38"><a id="__codelineno-4-38" name="__codelineno-4-38" href="#__codelineno-4-38"></a>│ authentication Generate and store authentication file │ +</span><span id="__span-4-39"><a id="__codelineno-4-39" name="__codelineno-4-39" href="#__codelineno-4-39"></a>│ blockchain Blockchain related commands │ +</span><span id="__span-4-40"><a id="__codelineno-4-40" name="__codelineno-4-40" href="#__codelineno-4-40"></a>│ checksum Generate checksum out of a passed pubkey or an │ +</span><span id="__span-4-41"><a id="__codelineno-4-41" name="__codelineno-4-41" href="#__codelineno-4-41"></a>│ authentication method. Checks if the passed checksum is │ +</span><span id="__span-4-42"><a id="__codelineno-4-42" name="__codelineno-4-42" href="#__codelineno-4-42"></a>│ valid. │ +</span><span id="__span-4-43"><a id="__codelineno-4-43" name="__codelineno-4-43" href="#__codelineno-4-43"></a>│ license Display Äž1 monetary license │ +</span><span id="__span-4-44"><a id="__codelineno-4-44" name="__codelineno-4-44" href="#__codelineno-4-44"></a>│ money Money management related commands │ +</span><span id="__span-4-45"><a id="__codelineno-4-45" name="__codelineno-4-45" href="#__codelineno-4-45"></a>│ wot Web-of-Trust related commands │ +</span><span id="__span-4-46"><a id="__codelineno-4-46" name="__codelineno-4-46" href="#__codelineno-4-46"></a>╰─────────────────────────────────────────────────────────────────────────────╯ +</span></code></pre></div> +<p>A better error output:</p> +<div class="language-text no-copy highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>silkaj -a test wot revocation verify +</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a> +</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a> Usage: silkaj wot revocation verify [OPTIONS] +</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a> +</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> Try 'silkaj wot revocation verify -h' for help +</span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>â•─ Error ─────────────────────────────────────────────────────────────────────╮ +</span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a>│ /home/moul/.local/share/silkaj/g1/test/revocation.txt not found for account │ +</span><span id="__span-5-8"><a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>│ name: test │ +</span><span id="__span-5-9"><a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>╰─────────────────────────────────────────────────────────────────────────────╯ +</span></code></pre></div> +<h3 id="shell-completion">Shell completion<a class="headerlink" href="#shell-completion" title="Permanent link">¶</a></h3> +<p>This information has been missed, but Click v8.0 comes with an integrated shell completion feature. +Therefore, it can be set from Silkaj v0.10.0 onward. To set up the shell completion follow the <a href="../../install/#shell-completion">shell completion documentation</a>.</p> +<h3 id="small-help-option">Small help option<a class="headerlink" href="#small-help-option" title="Permanent link">¶</a></h3> +<p>In addition to the <code>--help</code> option, it is now possible to pass the small help option <code>-h</code> to all sub-commands.</p> +<h2 id="renaming-transfer-comment-to-reference">Renaming transfer comment to reference<a class="headerlink" href="#renaming-transfer-comment-to-reference" title="Permanent link">¶</a></h2> +<p>The free "comment" field in Duniter v1’s Transaction document has been extensively used in a slightly wrong manner. +Banks use <em>Payment reference</em> term for this field which can be used to refer to a contract number for instance.</p> +<p>It has been decided to rename it in order for the users to think about using it the appropriate way. +The fields in <code>money transfer</code> and <code>money history</code> user interface has been renamed to "reference". +The important change here is <code>--comment/-c</code> option from <code>money transfer</code> has been renamed to <code>--reference/-ref</code>.</p> +<h2 id="wot-status-command-displays-precise-expiration-date-of-received-certifications"><code>wot status</code> command displays precise expiration date of received certifications<a class="headerlink" href="#wot-status-command-displays-precise-expiration-date-of-received-certifications" title="Permanent link">¶</a></h2> +<p>For better monitoring of our certifications and to maintain our membership, <code>wot status</code> command now displays precise expiration dates of received certifications. +Previously they were computed and were very imprecise with three months of inaccuracy!</p> +<p>Silkaj v0.11:</p> +<div class="language-text no-copy highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>│───────────────────│──────────────────│────────────────│──────────────────│ +</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>│ received_expire │ received │ sent │ sent_expire │ +</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│ +</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a>│ December 3, 2024 │ Matograine ✔ │ vit │ October 1, 2024 │ +</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>│ October 11, 2025 │ HugoTrentesaux ✔ │ Zheny │ October 26, 2025 │ +</span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>│ December 19, 2025 │ BenoitLavenier ✔ │ HugoTrentesaux │ August 17, 2026 │ +</span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a>│ December 21, 2025 │ nicoleC ✔ │ Matograine │ August 17, 2026 │ +</span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>│ July 9, 2026 │ vit ✔ │ │ │ +</span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a>│ August 20, 2026 │ tuxmain ✔ │ │ │ +</span><span id="__span-6-10"><a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>│ August 20, 2026 │ kapis │ │ │ +</span><span id="__span-6-11"><a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a>│───────────────────│──────────────────│────────────────│──────────────────│ +</span></code></pre></div> +<p>Silkaj v0.12:</p> +<div class="language-text no-copy highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>│───────────────────│──────────────────│────────────────│──────────────────│ +</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>│ received_expire │ received │ sent │ sent_expire │ +</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•│ +</span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a>│ February 21, 2025 │ Matograine ✔ │ vit │ October 1, 2024 │ +</span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a>│ January 8, 2026 │ HugoTrentesaux ✔ │ Zheny │ October 26, 2025 │ +</span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a>│ March 21, 2026 │ BenoitLavenier ✔ │ HugoTrentesaux │ August 17, 2026 │ +</span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a>│ March 23, 2026 │ nicoleC ✔ │ Matograine │ August 17, 2026 │ +</span><span id="__span-7-8"><a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a>│ October 16, 2026 │ vit ✔ │ │ │ +</span><span id="__span-7-9"><a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a>│ November 28, 2026 │ tuxmain ✔ │ │ │ +</span><span id="__span-7-10"><a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a>│ January 28, 2025 │ kapis ✘ │ │ │ +</span><span id="__span-7-11"><a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a>│───────────────────│──────────────────│────────────────│──────────────────│ +</span><span id="__span-7-12"><a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a>✔: Certification written in the blockchain +</span><span id="__span-7-13"><a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a>✘: Pending certification, deadline treatment +</span></code></pre></div> +<p>The expiration date of sent certifications are still computed and should not be really taken into account. +They were not changed since this is a bit more complex to do with BMA API, and also less important than the received certifications. +No additional time should be spent on v1 ecosystem, but should instead go to v2 ecosystem <img alt="😉" class="twemoji" src="https://cdn.jsdelivr.net/gh/jdecked/twemoji@15.1.0/assets/svg/1f609.svg" title=":wink:" /></p> +<h2 id="g1-monetary-license-update">Äž1 monetary license update<a class="headerlink" href="#g1-monetary-license-update" title="Permanent link">¶</a></h2> +<p>German and Catalan new translations have been added to Äž1 monetary license. +Spanish and Italian translations have been improved. +The French copy has been updated to v0.3 which includes rules on how to change the document.</p> +<h2 id="deathreaper-is-now-released-as-part-of-silkaj">DeathReaper is now released as part of Silkaj<a class="headerlink" href="#deathreaper-is-now-released-as-part-of-silkaj" title="Permanent link">¶</a></h2> +<p>DeathReaper used to be maintained on a separated <code>git</code> branch and only distributed via containers. +This was made because its main dependency <code>pydiscourse</code> is not packaged in Debian repositories. +This could be a reason to make an update of Silkaj Debian package unnecessary harder.</p> +<p>A solution has been set up to activate <code>wot exclusions</code> command only once <code>pydiscourse</code> dependency is installed. +This way, Debian packaging is still possible without having to package <code>pydiscourse</code>.</p> +<p>Therefore, DeathReaper has been merged on <code>main</code> branch. +Check out <a href="../../usage/deathreaper/">DeathReaper documentation</a> on how to install and use it.</p> +<h2 id="bma-optimisations">BMA optimisations<a class="headerlink" href="#bma-optimisations" title="Permanent link">¶</a></h2> +<p>On BMA API, the Web-of-Trust related requests now have an argument to specify whether we passed a public key or an identity username. +Silkaj is specifying this argument which provides faster replies to the queries.</p> +<h2 id="python-versions-support">Python versions support<a class="headerlink" href="#python-versions-support" title="Permanent link">¶</a></h2> +<p>This release introduces official support for Python v3.12 and v3.13.</p> +<p><a href="https://pendulum.eustace.io/">Pendulum</a> datetime library was lacking maintenance and had no Python v3.13 support. +I replaced Pendulum with <a href="https://arrow.readthedocs.io/">Arrow</a>. +Just before Silkaj release, Pendulum v3.1 has been released with Python 3.13 support. +I reverted back to Pendulum usage.</p> +<p><code>request_url()</code> has been fixed in <a href="https://git.duniter.org/clients/python/duniterpy/-/blob/main/CHANGELOG.md#v121-26th-march-2025">DuniterPy v1.2.1</a> to support Python 3.13.</p> +<p>On the other hand, Python v3.7 and v3.8 support have been dropped.</p> +<h2 id="development-environment">Development Environment<a class="headerlink" href="#development-environment" title="Permanent link">¶</a></h2> +<p>Ruff replaces <code>black</code>, <code>autoflake</code>, <code>pylint</code>, <code>isort</code> and <code>pyupgrade</code> pre-commit hooks. +The latter is written in Rust and is blazing faster compared to the latter.</p> +<p>When publishing a release, the pipeline will automatically create a release page on Silkaj repository.</p> +<h2 id="removals">Removals<a class="headerlink" href="#removals" title="Permanent link">¶</a></h2> +<p>With this release being the last one planned with Duniter v1/BMA support, some commands do not make sense anymore with v2 Substrate ecosystem. +Therefore <code>blockchain verify</code> has been removed from this release. +<code>checksum</code> and <code>blockchain difficulty</code> commands will be removed out of next release.</p> +<h2 id="outlook">Outlook<a class="headerlink" href="#outlook" title="Permanent link">¶</a></h2> +<p>v0.20.0 is planned to be the next release. +It will be focus onto adding support for Duniter v2 based on Substrate framework. +Duniter v1/BMA support will be dropped from Silkaj v0.2x branch, while v0.1x will be on maintenance mode until Äž1 currency switches productively to Duniter v2 ecosystem. +No new features will be implemented on v0.1x branch. +v0.20 development cycle might take some time, therefore it is expected to get preview releases.</p> +<p>The migration to v2 ecosystem is planned as follow: The network layer will be adapted to use following APIs: Substrate RPC, and Subsquid indexer via its Hasura GraphQL API. +Then, it is planned to migrate current features and commands. +Finally, in a following release new v2 related features will be implemented.</p> +<p>We are looking forward for a better experience with Äž1 currency migration to v2 ecosystem based on Substrate framework and Subsquid indexer.</p> +<p>Once the porting to Duniter v2 Substrate reaches an interesting point, a v0.30.0 release is planned to implement a GUI based on <a href="https://www.textualize.io/">Textual</a> framework which run in the terminal, and can also run in a web browser.</p> + + + + + + + + + + + + + + + + + + + </article> + </div> + + + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> + +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> + </div> + + </main> + + <footer class="md-footer"> + + <div class="md-footer-meta md-typeset"> + <div class="md-footer-meta__inner md-grid"> + <div class="md-copyright"> + + <div class="md-copyright__highlight"> + Copyright © 2016 − 2025 Maël Azimi + </div> + + + Made with + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> + Material for MkDocs + </a> + +</div> + + <div class="md-social"> + + + + + + <a href="https://git.duniter.org/clients/python/silkaj" target="_blank" rel="noopener" title="Git repository" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="m503.5 204.6-.7-1.8-69.7-181.78c-1.4-3.57-3.9-6.59-7.2-8.64-2.4-1.55-5.1-2.515-8-2.81s-5.7.083-8.4 1.11c-2.7 1.02-5.1 2.66-7.1 4.78-1.9 2.12-3.3 4.67-4.1 7.44l-47 144H160.8l-47.1-144c-.8-2.77-2.2-5.31-4.1-7.43-2-2.12-4.4-3.75-7.1-4.77a18.1 18.1 0 0 0-8.38-1.113 18.4 18.4 0 0 0-8.04 2.793 18.1 18.1 0 0 0-7.16 8.64L9.267 202.8l-.724 1.8a129.57 129.57 0 0 0-3.52 82c7.747 26.9 24.047 50.7 46.447 67.6l.27.2.59.4 105.97 79.5 52.6 39.7 32 24.2c3.7 1.9 8.3 4.3 13 4.3s9.3-2.4 13-4.3l32-24.2 52.6-39.7 106.7-79.9.3-.3c22.4-16.9 38.7-40.6 45.6-67.5 8.6-27 7.4-55.8-2.6-82"/></svg> + </a> + + + + + + <a href="https://pypi.org/project/silkaj/" target="_blank" rel="noopener" title="PyPI" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6M286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3M167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4m-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3"/></svg> + </a> + + + + + + <a href="https://forum.duniter.org" target="_blank" rel="noopener" title="Duniter forum" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0m.116 4.563a7.4 7.4 0 0 0-6.337 3.57 7.25 7.25 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.42 7.42 0 0 0 8.136-1.39 7.26 7.26 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585z"/></svg> + </a> + + + + + + <a href="https://chat.duniter.org" target="_blank" rel="noopener" title="Duniter XMPP chatroom" class="md-social__link"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m3.401 4.594 1.025.366 3.08.912q-.016.27-.016.543c0 3.353 1.693 7.444 4.51 10.387 2.817-2.943 4.51-7.034 4.51-10.387q0-.273-.016-.543l3.08-.912 1.025-.366L24 3.276C23.854 8.978 19.146 14.9 13.502 18.17c1.302 1.028 2.778 1.81 4.388 2.215v.114l.004.001v.224a14.6 14.6 0 0 1-4.829-1.281A21 21 0 0 1 12 18.966q-.53.255-1.065.477a14.6 14.6 0 0 1-4.829 1.281V20.5l.004-.001v-.113c1.61-.406 3.086-1.188 4.389-2.216C4.854 14.9.146 8.978 0 3.276z"/></svg> + </a> + +</div> + + </div> + </div> +</footer> + + </div> + <div class="md-dialog" data-md-component="dialog"> + <div class="md-dialog__inner md-typeset"></div> + </div> + + + + + <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "content.code.copy", "content.tabs.link"], "search": "../../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> + + + <script src="../../assets/javascripts/bundle.c8b220af.min.js"></script> + + + </body> +</html> \ No newline at end of file diff --git a/0.12/blog/silkaj-v020-release/index.html b/0.12/blog/silkaj-v020-release/index.html index a539bf6fb78cdcc5d10923bcb2b66c0770867341..3eed1f4d1309937adbd246f1ae7545c07f320f8e 100644 --- a/0.12/blog/silkaj-v020-release/index.html +++ b/0.12/blog/silkaj-v020-release/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v030-release-lets-send-money/index.html b/0.12/blog/silkaj-v030-release-lets-send-money/index.html index 2affe04963e37d1255f7a808d7f955f35e5170ad..f151cd1f26e9adf20a2c977bda9f34d2d43f2636 100644 --- a/0.12/blog/silkaj-v030-release-lets-send-money/index.html +++ b/0.12/blog/silkaj-v030-release-lets-send-money/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v040-release/index.html b/0.12/blog/silkaj-v040-release/index.html index 43b27754d3e58050a72d052fa6ce93aeea67c753..6398161d06848865d7b91ded11c382a2d89b88ee 100644 --- a/0.12/blog/silkaj-v040-release/index.html +++ b/0.12/blog/silkaj-v040-release/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v050-release-lets-certify/index.html b/0.12/blog/silkaj-v050-release-lets-certify/index.html index 6ea88cbbfca377649e917c70b89f3b4bd470ac4b..0c14f6b789e6570adfef305ee7fd85635e6caf8d 100644 --- a/0.12/blog/silkaj-v050-release-lets-certify/index.html +++ b/0.12/blog/silkaj-v050-release-lets-certify/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v060-release-lets-install/index.html b/0.12/blog/silkaj-v060-release-lets-install/index.html index 01aaa56916da0cab6695a503c36376e3e02eb229..0e219c5110c60e85e68b4cebaaaa5a96140c0a40 100644 --- a/0.12/blog/silkaj-v060-release-lets-install/index.html +++ b/0.12/blog/silkaj-v060-release-lets-install/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v061-release/index.html b/0.12/blog/silkaj-v061-release/index.html index 80969699af9852d72e6c738aba79ace4d9b4bd06..3e05e464af5f065d2e7306b17a60bf1c804dd81d 100644 --- a/0.12/blog/silkaj-v061-release/index.html +++ b/0.12/blog/silkaj-v061-release/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html b/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html index bb9dbe77415bee132b2127133a79db280fecec0b..eaab1df48b7385b2e0844d0bb5ba9a442e73a58d 100644 --- a/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html +++ b/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v080-release/index.html b/0.12/blog/silkaj-v080-release/index.html index d9ae2fa1f42875916064ce22257a1353b3d32d80..828b34250587a029d257f08b765db13020040e25 100644 --- a/0.12/blog/silkaj-v080-release/index.html +++ b/0.12/blog/silkaj-v080-release/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/silkaj-v090-release/index.html b/0.12/blog/silkaj-v090-release/index.html index 6ac502a4484b63262c493a44d3df4870618ddb7f..e11bf18bf54a09211b0300fb49c227f51257fe63 100644 --- a/0.12/blog/silkaj-v090-release/index.html +++ b/0.12/blog/silkaj-v090-release/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v0100/index.html b/0.12/blog/v0100/index.html index 3a58decd2ca6d1daa8e5e4b0fc6c2778b797ffab..2062682ff6b9b3c5553b8133bf052c455bd5baf0 100644 --- a/0.12/blog/v0100/index.html +++ b/0.12/blog/v0100/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v0111/index.html b/0.12/blog/v0111/index.html index 91b7d4972e42b6eddf68e56fa753bd6acc33c3aa..c5b4f275db2d30e1da58d6d4a222a86e9051058e 100644 --- a/0.12/blog/v0111/index.html +++ b/0.12/blog/v0111/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v0112/index.html b/0.12/blog/v0112/index.html index 5b17e40d63cb013bbfd6ebefde66fef7e0984c0c..e763d0a2bc50cfd0602e180fb5ac834792f744a8 100644 --- a/0.12/blog/v0112/index.html +++ b/0.12/blog/v0112/index.html @@ -16,9 +16,11 @@ <link rel="prev" href="../v0111/"> + <link rel="next" href="../silkaj-v0120-release/"> + <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -26,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -710,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v071/index.html b/0.12/blog/v071/index.html index 6c6071387e4c9d58e7755d357f228b3f11dcda9f..450f8d66fb982d7006e705c98d3c749a9d6f5490 100644 --- a/0.12/blog/v071/index.html +++ b/0.12/blog/v071/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v072/index.html b/0.12/blog/v072/index.html index fbecb800703eec545f116bd4c1d475913aa5c5ac..b2dec0b6def9a91f9a2790c35557eb9e03fb280b 100644 --- a/0.12/blog/v072/index.html +++ b/0.12/blog/v072/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v073/index.html b/0.12/blog/v073/index.html index ddd0096b70e640f2bbe5442ccf1b2f33becbc2c5..98271cd5cab844f5ec5267669563333c20dd8d75 100644 --- a/0.12/blog/v073/index.html +++ b/0.12/blog/v073/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v074/index.html b/0.12/blog/v074/index.html index 193dc36bcea488ff10d45be6d97dcde05f9500f2..2bda301ef3d0e94d048a9de9dc2f2e2d8ed52f49 100644 --- a/0.12/blog/v074/index.html +++ b/0.12/blog/v074/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v075/index.html b/0.12/blog/v075/index.html index 6a77978034be45bbf45ff8606f6de9d0f408eda6..b784ac0f62428daad70838e23a81de6e90b7c3d2 100644 --- a/0.12/blog/v075/index.html +++ b/0.12/blog/v075/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v076/index.html b/0.12/blog/v076/index.html index 9933e853a4067191dac431cc1ae74945f3918240..2a9bb24bc3bd2716d3832f4f3a2f2005e50776e6 100644 --- a/0.12/blog/v076/index.html +++ b/0.12/blog/v076/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v081/index.html b/0.12/blog/v081/index.html index d0e7e136ce9d8193f3c71bdee98f3bdc1a268eb3..a6f70d47249670b5a586287eea2277053a68268f 100644 --- a/0.12/blog/v081/index.html +++ b/0.12/blog/v081/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -712,6 +712,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/blog/v090rc/index.html b/0.12/blog/v090rc/index.html index 11a3d9123417dbd6cc592e1bcc3a08c6f1b6f2a7..1efc492c088bef6c91beac894271aa6a01019c55 100644 --- a/0.12/blog/v090rc/index.html +++ b/0.12/blog/v090rc/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -717,6 +717,31 @@ + <li class="md-nav__item"> + <a href="../2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../2023/" class="md-nav__link"> diff --git a/0.12/changelog/index.html b/0.12/changelog/index.html index 372155c26e2283a4e854c7657457ee199616627d..a4c8097fa2d6dde21eaaddc7219673af1b229f66 100644 --- a/0.12/changelog/index.html +++ b/0.12/changelog/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css"> @@ -70,7 +70,7 @@ <div data-md-component="skip"> - <a href="#0.11.2" class="md-skip"> + <a href="#0.12.0" class="md-skip"> Skip to content </a> @@ -707,6 +707,31 @@ + <li class="md-nav__item"> + <a href="../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../blog/2023/" class="md-nav__link"> @@ -1092,6 +1117,114 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#0.12.0" class="md-nav__link"> + <span class="md-ellipsis"> + v0.12.0 April 22, 2025 + </span> + </a> + + <nav class="md-nav" aria-label="v0.12.0 April 22, 2025"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#milestone-v0120" class="md-nav__link"> + <span class="md-ellipsis"> + Milestone v0.12.0 + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#code" class="md-nav__link"> + <span class="md-ellipsis"> + Code + </span> + </a> + + <nav class="md-nav" aria-label="Code"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#account-storage-support-authentication-and-revocation-improvements" class="md-nav__link"> + <span class="md-ellipsis"> + Account storage support: authentication and revocation improvements + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#command-line-interface" class="md-nav__link"> + <span class="md-ellipsis"> + Command-line interface + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + + <li class="md-nav__item"> + <a href="#website" class="md-nav__link"> + <span class="md-ellipsis"> + Website + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#project" class="md-nav__link"> + <span class="md-ellipsis"> + Project + </span> + </a> + + <nav class="md-nav" aria-label="Project"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#python-versions" class="md-nav__link"> + <span class="md-ellipsis"> + Python versions + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#copyright" class="md-nav__link"> + <span class="md-ellipsis"> + Copyright + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + + <li class="md-nav__item"> + <a href="#development-environment" class="md-nav__link"> + <span class="md-ellipsis"> + Development Environment + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + <li class="md-nav__item"> <a href="#0.11.2" class="md-nav__link"> <span class="md-ellipsis"> @@ -1178,7 +1311,7 @@ <ul class="md-nav__list"> <li class="md-nav__item"> - <a href="#code" class="md-nav__link"> + <a href="#code_1" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -1277,7 +1410,7 @@ <ul class="md-nav__list"> <li class="md-nav__item"> - <a href="#code_1" class="md-nav__link"> + <a href="#code_2" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -1436,7 +1569,7 @@ <ul class="md-nav__list"> <li class="md-nav__item"> - <a href="#code_2" class="md-nav__link"> + <a href="#code_3" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -1529,7 +1662,7 @@ </li> <li class="md-nav__item"> - <a href="#code_3" class="md-nav__link"> + <a href="#code_4" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -1649,7 +1782,7 @@ </li> <li class="md-nav__item"> - <a href="#project" class="md-nav__link"> + <a href="#project_1" class="md-nav__link"> <span class="md-ellipsis"> Project </span> @@ -1878,7 +2011,7 @@ </li> <li class="md-nav__item"> - <a href="#project_1" class="md-nav__link"> + <a href="#project_2" class="md-nav__link"> <span class="md-ellipsis"> Project </span> @@ -2744,6 +2877,114 @@ </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> + <li class="md-nav__item"> + <a href="#0.12.0" class="md-nav__link"> + <span class="md-ellipsis"> + v0.12.0 April 22, 2025 + </span> + </a> + + <nav class="md-nav" aria-label="v0.12.0 April 22, 2025"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#milestone-v0120" class="md-nav__link"> + <span class="md-ellipsis"> + Milestone v0.12.0 + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#code" class="md-nav__link"> + <span class="md-ellipsis"> + Code + </span> + </a> + + <nav class="md-nav" aria-label="Code"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#account-storage-support-authentication-and-revocation-improvements" class="md-nav__link"> + <span class="md-ellipsis"> + Account storage support: authentication and revocation improvements + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#command-line-interface" class="md-nav__link"> + <span class="md-ellipsis"> + Command-line interface + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + + <li class="md-nav__item"> + <a href="#website" class="md-nav__link"> + <span class="md-ellipsis"> + Website + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#project" class="md-nav__link"> + <span class="md-ellipsis"> + Project + </span> + </a> + + <nav class="md-nav" aria-label="Project"> + <ul class="md-nav__list"> + + <li class="md-nav__item"> + <a href="#python-versions" class="md-nav__link"> + <span class="md-ellipsis"> + Python versions + </span> + </a> + +</li> + + <li class="md-nav__item"> + <a href="#copyright" class="md-nav__link"> + <span class="md-ellipsis"> + Copyright + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + + <li class="md-nav__item"> + <a href="#development-environment" class="md-nav__link"> + <span class="md-ellipsis"> + Development Environment + </span> + </a> + +</li> + + </ul> + </nav> + +</li> + <li class="md-nav__item"> <a href="#0.11.2" class="md-nav__link"> <span class="md-ellipsis"> @@ -2830,7 +3071,7 @@ <ul class="md-nav__list"> <li class="md-nav__item"> - <a href="#code" class="md-nav__link"> + <a href="#code_1" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -2929,7 +3170,7 @@ <ul class="md-nav__list"> <li class="md-nav__item"> - <a href="#code_1" class="md-nav__link"> + <a href="#code_2" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -3088,7 +3329,7 @@ <ul class="md-nav__list"> <li class="md-nav__item"> - <a href="#code_2" class="md-nav__link"> + <a href="#code_3" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -3181,7 +3422,7 @@ </li> <li class="md-nav__item"> - <a href="#code_3" class="md-nav__link"> + <a href="#code_4" class="md-nav__link"> <span class="md-ellipsis"> Code </span> @@ -3301,7 +3542,7 @@ </li> <li class="md-nav__item"> - <a href="#project" class="md-nav__link"> + <a href="#project_1" class="md-nav__link"> <span class="md-ellipsis"> Project </span> @@ -3530,7 +3771,7 @@ </li> <li class="md-nav__item"> - <a href="#project_1" class="md-nav__link"> + <a href="#project_2" class="md-nav__link"> <span class="md-ellipsis"> Project </span> @@ -4171,6 +4412,74 @@ <h1>Changelog</h1> +<h2 id="0.12.0">v0.12.0 <small>April 22, 2025</small><a class="headerlink" href="#0.12.0" title="Permanent link">¶</a></h2> +<h3 id="milestone-v0120"><a href="https://git.duniter.org/clients/python/silkaj/-/milestones/20">Milestone v0.12.0</a><a class="headerlink" href="#milestone-v0120" title="Permanent link">¶</a></h3> +<h3 id="code">Code<a class="headerlink" href="#code" title="Permanent link">¶</a></h3> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/244">!244</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/470">#470</a>: Support BMA optimizations</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/253">!253</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/254">!254</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/256">!256</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/443">#443</a>: Merge DeathReaper <code>256_excluded</code> branch on <code>main</code> branch</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/265">!265</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/270">!270</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/276">!276</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/258">#258</a>: Implement CSV output on <code>history</code> command</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/268">!268</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/490">#490</a>: <code>wot status</code>: Display precise expiration date of received certifications</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/283">!283</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/471">#471</a>: Rename transfer’s comment to reference</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/251">!251</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/351">#351</a>: Delete <code>blockchain verify</code> command</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/267">!267</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/124">#124</a>: Convert <code>OrderedDict</code> to <code>dict</code></li> +</ul> +<h4 id="account-storage-support-authentication-and-revocation-improvements">Account storage support: authentication and revocation improvements<a class="headerlink" href="#account-storage-support-authentication-and-revocation-improvements" title="Permanent link">¶</a></h4> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/277">!277</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/477">#477</a>: Account storage support: <code>authentication</code>, <code>revocation</code></li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/240">!240</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/420">#420</a>: Rework authentication file path</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/249">!249</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/481">#481</a>: Save revocation file as only readable and writeable as user (<code>600</code> permission)</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/248">!248</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/435">#435</a>: Revocation: remove <code>--dry-run</code> and <code>--display</code> options from <code>save</code> and <code>verify</code> commands, drop default revocation file path</li> +</ul> +<h4 id="command-line-interface">Command-line interface<a class="headerlink" href="#command-line-interface" title="Permanent link">¶</a></h4> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/241">!241</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/466">#466</a>: Make the CLI looks better with <code>rich-click</code></li> +<li><a href="https://git.duniter.org/clients/python/silkaj/issues/166">#166</a>: Document shell completion set-up</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/242">!242</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/469">#469</a>: Use <code>click.Path()</code></li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/243">!243</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/419">#419</a>: Implement <code>-h</code> small <code>--help</code> option for all commands</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/279">!279</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/501">#501</a>: Replace <code>sys.exit()</code> with <code>click.Context.fail()</code> for better user output</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/246">!246</a>: Rework endpoints usage doc and CLI options help</li> +</ul> +<h3 id="website">Website<a class="headerlink" href="#website" title="Permanent link">¶</a></h3> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/271">!271</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/281">!281</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/433">#433</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/196">#196</a>: Set up new website structure with MkDocs</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/280">!280</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/277">#277</a>: Integrate releases announcements into the website</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/282">!282</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/502">#502</a>: Generate automatic CLI interface documentation with mkdocs-click</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/285">!285</a>: Add v0.12.0 announcement and changelog, release v0.12.0</li> +</ul> +<h3 id="project">Project<a class="headerlink" href="#project" title="Permanent link">¶</a></h3> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/issues/483">#483</a>: Switch DuniterPy usage back to PyPI release</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/257">!257</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/278">!278</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/473">#473</a>: Update Äž1 Monetary license</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/247">!247</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/459">#459</a>: Rework project description</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/233">!233</a>: CI change, coverage url fix, documentation, hooks bump</li> +</ul> +<h4 id="python-versions">Python versions<a class="headerlink" href="#python-versions" title="Permanent link">¶</a></h4> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/237">!237</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/457">#457</a>: Drop Python v3.7 support</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/263">!263</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/464">#464</a>: Drop Python v3.8 support</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/238">!238</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/474">#474</a>: Initial Python v3.12 support</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/250">!250</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/448">#448</a>: Add support for Python v3.12</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/264">!264</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/482">#482</a>: Add support for Python v3.13<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/269">!269</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/284">!284</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/492">#492</a>: Migrate from Pendulum to Arrow datetime lib</li> +</ul> +</li> +</ul> +<h4 id="copyright">Copyright<a class="headerlink" href="#copyright" title="Permanent link">¶</a></h4> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/231">!231</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/417">#417</a>: Update copyright to 2023</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/258">!258</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/456">#456</a>: Update copyright to 2024</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/272">!272</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/485">#485</a>: Update copyright to 2025</li> +</ul> +<h3 id="development-environment">Development Environment<a class="headerlink" href="#development-environment" title="Permanent link">¶</a></h3> +<ul> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/234">!234</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/236">!236</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/245">!245</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/273">!273</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/458">#458</a>: Introduce Ruff pre-commit hook to replace black, autoflake, pylint, isort and pyupgrade</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/275">!275</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/499">#499</a>: Support Poetry v2 syntax</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/274">!274</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/498">#498</a>: pip container does no longer include <code>g1_monetary_license</code></li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/252">!252</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/480">#480</a>: Update <code>.gitignore</code></li> +<li><a href="https://git.duniter.org/clients/python/duniterpy/-/issues/205">duniterpy#205</a>: <code>gitlab-ci-linter</code> is broken since GitLab v16</li> +<li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/259">!259</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/454">#454</a>: Set up release feature from gitlab-ci</li> +</ul> <h2 id="0.11.2">v0.11.2 <small>November 22, 2023</small><a class="headerlink" href="#0.11.2" title="Permanent link">¶</a></h2> <ul> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/484">#484</a>: Support Python v3.12 on v0.11 release</li> @@ -4203,7 +4512,7 @@ </ul> <h3 id="milestone-v0110"><a href="https://git.duniter.org/clients/python/silkaj/-/milestones/15">Milestone v0.11.0</a><a class="headerlink" href="#milestone-v0110" title="Permanent link">¶</a></h3> <h2 id="0.11.0rc0">v0.11.0rc0 <small>November 12, 2022</small><a class="headerlink" href="#0.11.0rc0" title="Permanent link">¶</a></h2> -<h3 id="code">Code<a class="headerlink" href="#code" title="Permanent link">¶</a></h3> +<h3 id="code_1">Code<a class="headerlink" href="#code_1" title="Permanent link">¶</a></h3> <ul> <li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/199">!199</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/203">#203</a>: Migrate from <code>tabulate</code> to <code>texttable</code></li> <li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/216">!216</a>, <a href="https://git.duniter.org/clients/python/silkaj/issues/330">#330</a>: Repository restructuration</li> @@ -4256,7 +4565,7 @@ <li><a href="https://git.duniter.org/clients/python/silkaj/issues/216">#216</a> <code>diffi</code>: Catch WS disconnection exception</li> </ul> <h2 id="0.10.0rc0">v0.10.0rc0 <small>March 21, 2022</small><a class="headerlink" href="#0.10.0rc0" title="Permanent link">¶</a></h2> -<h3 id="code_1">Code<a class="headerlink" href="#code_1" title="Permanent link">¶</a></h3> +<h3 id="code_2">Code<a class="headerlink" href="#code_2" title="Permanent link">¶</a></h3> <h4 id="features">Features<a class="headerlink" href="#features" title="Permanent link">¶</a></h4> <ul> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/89">#89</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/170">!170</a>: Manage the revocation document</li> @@ -4347,7 +4656,7 @@ </ul> <p>Plus what can be found bellow in v0.9.0rc</p> <h2 id="0.9.0rc">v0.9.0rc <small>March 24, 2021</small><a class="headerlink" href="#0.9.0rc" title="Permanent link">¶</a></h2> -<h3 id="code_2">Code<a class="headerlink" href="#code_2" title="Permanent link">¶</a></h3> +<h3 id="code_3">Code<a class="headerlink" href="#code_3" title="Permanent link">¶</a></h3> <h4 id="tx"><code>tx</code><a class="headerlink" href="#tx" title="Permanent link">¶</a></h4> <ul> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/281">#281</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/129">!129</a>: Handle transaction size limit properly</li> @@ -4402,7 +4711,7 @@ <p>Thanks matograine</p> <h2 id="0.8.0">v0.8.0 <small>October 18, 2020</small><a class="headerlink" href="#0.8.0" title="Permanent link">¶</a></h2> <h3 id="milestone-v080"><a href="https://git.duniter.org/clients/python/silkaj/-/milestones/8">Milestone v0.8.0</a><a class="headerlink" href="#milestone-v080" title="Permanent link">¶</a></h3> -<h3 id="code_3">Code<a class="headerlink" href="#code_3" title="Permanent link">¶</a></h3> +<h3 id="code_4">Code<a class="headerlink" href="#code_4" title="Permanent link">¶</a></h3> <h4 id="transaction">Transaction<a class="headerlink" href="#transaction" title="Permanent link">¶</a></h4> <ul> <li> @@ -4513,7 +4822,7 @@ since <a href="https://pythoninsider.blogspot.com/2020/10/python-35-is-no-longer <li><a href="https://git.duniter.org/clients/python/silkaj/issues/244">#244</a>: Add <code>AUTHORS.md</code> listing the contributors</li> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/207">#207</a>: Create Silkaj SVG logo</li> </ul> -<h3 id="project">Project<a class="headerlink" href="#project" title="Permanent link">¶</a></h3> +<h3 id="project_1">Project<a class="headerlink" href="#project_1" title="Permanent link">¶</a></h3> <ul> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/252">#252</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/118">!118</a>: Create a script to update and update the copyright date to 2020</li> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/285">#285</a>, <a href="https://git.duniter.org/clients/python/silkaj/merge_requests/132">!132</a>: Add copyright and license statements in tests source files</li> @@ -4638,7 +4947,7 @@ since <a href="https://pythoninsider.blogspot.com/2020/10/python-35-is-no-longer <li><a href="https://git.duniter.org/clients/python/silkaj/issues/154">#154</a>: net: can’t get screen size on Windows</li> <li><a href="https://git.duniter.org/clients/python/silkaj/merge_requests/92">!92</a>: Document Windows installation with pip</li> </ul> -<h4 id="project_1">Project<a class="headerlink" href="#project_1" title="Permanent link">¶</a></h4> +<h4 id="project_2">Project<a class="headerlink" href="#project_2" title="Permanent link">¶</a></h4> <ul> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/132">#132</a>: Add a license notice as a header of every source files</li> <li><a href="https://git.duniter.org/clients/python/silkaj/issues/158">#158</a>: Add CHANGELOG.md file</li> diff --git a/0.12/contributing/container_usage/index.html b/0.12/contributing/container_usage/index.html index b4144f2a353090722d8b09af7a2b8a56d59e309f..1936de63db226cf4a6ca15678e3e148d5b928d76 100644 --- a/0.12/contributing/container_usage/index.html +++ b/0.12/contributing/container_usage/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -705,6 +705,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> diff --git a/0.12/contributing/documentation/index.html b/0.12/contributing/documentation/index.html index 33dc5ece20219782d7faba3670f763a914127e89..21d3c524c7c1b451a2c283e8c3d7275beff343b7 100644 --- a/0.12/contributing/documentation/index.html +++ b/0.12/contributing/documentation/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -705,6 +705,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> diff --git a/0.12/contributing/index.html b/0.12/contributing/index.html index a2148e7a740fdb8cdfff12235c85447b7c32e58b..29932f59a8d27c1d8b78de7d4ecbeb7b2f68e8f6 100644 --- a/0.12/contributing/index.html +++ b/0.12/contributing/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css"> @@ -705,6 +705,31 @@ + <li class="md-nav__item"> + <a href="../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../blog/2023/" class="md-nav__link"> @@ -1852,7 +1877,7 @@ Please read their documentations on how to use them the best possible.</p> <li><a href="https://github.com/ewels/rich-click">Rich-Click</a></li> </ul> </li> -<li><a href="https://arrow.readthedocs.io/">Arrow</a></li> +<li><a href="https://pendulum.eustace.io/docs/">Pendulum</a></li> <li><a href="https://github.com/foutaise/texttable/#documentation">texttable</a></li> </ul> <h2 id="pre-commit-hooks">Pre-commit hooks<a class="headerlink" href="#pre-commit-hooks" title="Permanent link">¶</a></h2> diff --git a/0.12/contributing/install_poetry/index.html b/0.12/contributing/install_poetry/index.html index 8df4225236c57c19d63e4b2975505b2ec7864da3..227ab013ef24ccbb9dbfe30d6b905dff92e23071 100644 --- a/0.12/contributing/install_poetry/index.html +++ b/0.12/contributing/install_poetry/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -705,6 +705,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> diff --git a/0.12/contributing/packaging/index.html b/0.12/contributing/packaging/index.html index fcea4f166b7733d38f0e6116c1434ab0d3871382..84ee46bff7f6b0a7c840f55affd6d0c76097f800 100644 --- a/0.12/contributing/packaging/index.html +++ b/0.12/contributing/packaging/index.html @@ -18,7 +18,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -26,7 +26,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -703,6 +703,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> diff --git a/0.12/contributing/testing/index.html b/0.12/contributing/testing/index.html index c2e463824b1d012c8142275921bc34e898ef2864..fb424e36a34051700d73e0022ec1263cc6108530 100644 --- a/0.12/contributing/testing/index.html +++ b/0.12/contributing/testing/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -705,6 +705,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> diff --git a/0.12/coverage/class_index.html b/0.12/coverage/class_index.html index 53f7a28cfa78df789215abfa6ee1737214baf13b..f2e2c4d93055798eec752732658058e0792eb9a7 100644 --- a/0.12/coverage/class_index.html +++ b/0.12/coverage/class_index.html @@ -55,7 +55,7 @@ </h2> <p class="text"> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </header> @@ -372,7 +372,7 @@ <div class="content"> <p> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> <aside class="hidden"> diff --git a/0.12/coverage/covindex.html b/0.12/coverage/covindex.html index da1e3a9aef90a406e6686b52a5c89817955affed..e4e3ef6f76fdad0e1fcdfaa0f2676f70b8bf1c0b 100644 --- a/0.12/coverage/covindex.html +++ b/0.12/coverage/covindex.html @@ -54,7 +54,7 @@ </h2> <p class="text"> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </header> @@ -306,7 +306,7 @@ <div class="content"> <p> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> <aside class="hidden"> diff --git a/0.12/coverage/function_index.html b/0.12/coverage/function_index.html index beabb5d7f7e337f48a2fe0f829edcb2725398c98..eb04fa9cf37ec22b68c3caf78a7ee245bc67a9a7 100644 --- a/0.12/coverage/function_index.html +++ b/0.12/coverage/function_index.html @@ -55,7 +55,7 @@ </h2> <p class="text"> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </header> @@ -217,8 +217,8 @@ <td class="right" data-ratio="0 31">0%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e7a021a3963ba4f1_blocks_py.html#t79">silkaj/blockchain/blocks.py</a></td> - <td class="name left"><a href="z_e7a021a3963ba4f1_blocks_py.html#t79"><data value='print_blocks_views'>print_blocks_views</data></a></td> + <td class="name left"><a href="z_e7a021a3963ba4f1_blocks_py.html#t81">silkaj/blockchain/blocks.py</a></td> + <td class="name left"><a href="z_e7a021a3963ba4f1_blocks_py.html#t81"><data value='print_blocks_views'>print_blocks_views</data></a></td> <td>32</td> <td>32</td> <td>0</td> @@ -553,56 +553,56 @@ <td class="right" data-ratio="16 16">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t220">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t220"><data value='parse_sent_tx'>parse_sent_tx</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t222">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t222"><data value='parse_sent_tx'>parse_sent_tx</data></a></td> <td>27</td> <td>3</td> <td>0</td> <td class="right" data-ratio="24 27">89%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t277">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t277"><data value='tx_amount'>tx_amount</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t281">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t281"><data value='tx_amount'>tx_amount</data></a></td> <td>7</td> <td>0</td> <td>0</td> <td class="right" data-ratio="7 7">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t294">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t294"><data value='received_func'>received_func</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t298">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t298"><data value='received_func'>received_func</data></a></td> <td>3</td> <td>0</td> <td>0</td> <td class="right" data-ratio="3 3">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t300">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t300"><data value='sent_func'>sent_func</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t304">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t304"><data value='sent_func'>sent_func</data></a></td> <td>3</td> <td>1</td> <td>0</td> <td class="right" data-ratio="2 3">67%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t306">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t306"><data value='output_available'>output_available</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t310">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t310"><data value='output_available'>output_available</data></a></td> <td>3</td> <td>1</td> <td>0</td> <td class="right" data-ratio="2 3">67%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t317">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t317"><data value='assign_idty_from_pubkey'>assign_idty_from_pubkey</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t321">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t321"><data value='assign_idty_from_pubkey'>assign_idty_from_pubkey</data></a></td> <td>6</td> <td>0</td> <td>0</td> <td class="right" data-ratio="6 6">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t326">silkaj/money/history.py</a></td> - <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t326"><data value='prefix'>prefix</data></a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t330">silkaj/money/history.py</a></td> + <td class="name left"><a href="z_8394fdfe5cf191f4_history_py.html#t330"><data value='prefix'>prefix</data></a></td> <td>5</td> <td>0</td> <td>0</td> @@ -1169,32 +1169,32 @@ <td class="right" data-ratio="11 11">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t51">silkaj/wot/idty_tools.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t51"><data value='check_many_identities'>check_many_identities</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t53">silkaj/wot/idty_tools.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t53"><data value='check_many_identities'>check_many_identities</data></a></td> <td>22</td> <td>0</td> <td>0</td> <td class="right" data-ratio="22 22">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t86">silkaj/wot/idty_tools.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t86"><data value='display_alternate_ids'>display_alternate_ids</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t88">silkaj/wot/idty_tools.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t88"><data value='display_alternate_ids'>display_alternate_ids</data></a></td> <td>6</td> <td>0</td> <td>0</td> <td class="right" data-ratio="6 6">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t97">silkaj/wot/idty_tools.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t97"><data value='merge_ids_lists'>merge_ids_lists</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t99">silkaj/wot/idty_tools.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t99"><data value='merge_ids_lists'>merge_ids_lists</data></a></td> <td>11</td> <td>0</td> <td>0</td> <td class="right" data-ratio="11 11">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t115">silkaj/wot/idty_tools.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t115"><data value='ids_list_from_lookups'>ids_list_from_lookups</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t117">silkaj/wot/idty_tools.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_idty_tools_py.html#t117"><data value='ids_list_from_lookups'>ids_list_from_lookups</data></a></td> <td>9</td> <td>0</td> <td>0</td> @@ -1353,32 +1353,32 @@ <td class="right" data-ratio="26 29">90%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t95">silkaj/wot/status.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t95"><data value='membership_status'>membership_status</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t97">silkaj/wot/status.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t97"><data value='membership_status'>membership_status</data></a></td> <td>17</td> <td>3</td> <td>0</td> <td class="right" data-ratio="14 17">82%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t119">silkaj/wot/status.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t119"><data value='get_sent_certifications'>get_sent_certifications</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t123">silkaj/wot/status.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t123"><data value='get_sent_certifications'>get_sent_certifications</data></a></td> <td>7</td> <td>0</td> <td>0</td> <td class="right" data-ratio="7 7">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t139">silkaj/wot/status.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t139"><data value='expiration_date_from_block_id'>expiration_date_from_block_id</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t143">silkaj/wot/status.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t143"><data value='expiration_date_from_block_id'>expiration_date_from_block_id</data></a></td> <td>2</td> <td>0</td> <td>0</td> <td class="right" data-ratio="2 2">100%</td> </tr> <tr class="region"> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t151">silkaj/wot/status.py</a></td> - <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t151"><data value='date_approximation'>date_approximation</data></a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t155">silkaj/wot/status.py</a></td> + <td class="name left"><a href="z_e099210adb7d42f0_status_py.html#t155"><data value='date_approximation'>date_approximation</data></a></td> <td>1</td> <td>0</td> <td>0</td> @@ -1460,7 +1460,7 @@ <div class="content"> <p> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> <aside class="hidden"> diff --git a/0.12/coverage/index.html b/0.12/coverage/index.html index 23a998d37c476f20a86ba8f36d02d9e126af2b32..ab4be74e7e07b7727e0af6a3883f21a9d365a921 100644 --- a/0.12/coverage/index.html +++ b/0.12/coverage/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css"> @@ -700,6 +700,31 @@ + <li class="md-nav__item"> + <a href="../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../blog/2023/" class="md-nav__link"> diff --git a/0.12/coverage/status.json b/0.12/coverage/status.json index 3cd5e2b19b537a49c45263343d9206bd382acd38..cad53a320888274142b62954548dc14013ae0549 100644 --- a/0.12/coverage/status.json +++ b/0.12/coverage/status.json @@ -1 +1 @@ -{"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.8.0","globals":"09a5a067fe739e9a21f8edc86d2fef52","files":{"z_c69109531bf836fe___init___py":{"hash":"e1ebb3130da6d01118bec14616bf318c","index":{"url":"z_c69109531bf836fe___init___py.html","file":"silkaj/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":1,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_about_py":{"hash":"f3d8da0b3d9ba23275c52a9c8b4974be","index":{"url":"z_c69109531bf836fe_about_py.html","file":"silkaj/about.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_account_storage_py":{"hash":"408bd5e4422863a1b875a27417c034ae","index":{"url":"z_c69109531bf836fe_account_storage_py.html","file":"silkaj/account_storage.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":2,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_auth_py":{"hash":"ffb0bd722225d78e249d50372997128b","index":{"url":"z_c69109531bf836fe_auth_py.html","file":"silkaj/auth.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":102,"n_excluded":0,"n_missing":58,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e7a021a3963ba4f1___init___py.html","file":"silkaj/blockchain/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_blocks_py":{"hash":"2f65ebe5a7ce38d04f841c298465314a","index":{"url":"z_e7a021a3963ba4f1_blocks_py.html","file":"silkaj/blockchain/blocks.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":79,"n_excluded":0,"n_missing":63,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_difficulty_py":{"hash":"d7988a80a4d953650d6e860416a715e7","index":{"url":"z_e7a021a3963ba4f1_difficulty_py.html","file":"silkaj/blockchain/difficulty.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":38,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_information_py":{"hash":"1b342ea7f517da1f1eca0c75c47fd901","index":{"url":"z_e7a021a3963ba4f1_information_py.html","file":"silkaj/blockchain/information.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":13,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_tools_py":{"hash":"7bb8b67193fc892454a2bb4e5ed7b062","index":{"url":"z_e7a021a3963ba4f1_tools_py.html","file":"silkaj/blockchain/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":14,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_checksum_py":{"hash":"4bbe99b69d93327879c5935ab5bdb07e","index":{"url":"z_c69109531bf836fe_checksum_py.html","file":"silkaj/checksum.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_cli_py":{"hash":"30cc6d984d42d8fbef5377a30cdff8b9","index":{"url":"z_c69109531bf836fe_cli_py.html","file":"silkaj/cli.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":76,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_constants_py":{"hash":"d274968b263e4832e9b0cb17e988299e","index":{"url":"z_c69109531bf836fe_constants_py.html","file":"silkaj/constants.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_g1_monetary_license_py":{"hash":"1a5c6c58554c40219293f18efb38d002","index":{"url":"z_c69109531bf836fe_g1_monetary_license_py.html","file":"silkaj/g1_monetary_license.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":36,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_8394fdfe5cf191f4___init___py.html","file":"silkaj/money/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_balance_py":{"hash":"8549a8cff5ce0a39fab225fae4e0adc9","index":{"url":"z_8394fdfe5cf191f4_balance_py.html","file":"silkaj/money/balance.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":70,"n_excluded":0,"n_missing":10,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_history_py":{"hash":"93bed8dfb1d6979cb3eb5712d2173b9e","index":{"url":"z_8394fdfe5cf191f4_history_py.html","file":"silkaj/money/history.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":153,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_tools_py":{"hash":"8c50326d97645d6ad1db8cbc7989794e","index":{"url":"z_8394fdfe5cf191f4_tools_py.html","file":"silkaj/money/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_transfer_py":{"hash":"9945f199a8c665558f2255e190a12bb1","index":{"url":"z_8394fdfe5cf191f4_transfer_py.html","file":"silkaj/money/transfer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":210,"n_excluded":0,"n_missing":15,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_network_py":{"hash":"e3e4627471da7e97e91a2f9375554318","index":{"url":"z_c69109531bf836fe_network_py.html","file":"silkaj/network.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":49,"n_excluded":0,"n_missing":8,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_public_key_py":{"hash":"b1202dec83c7cb60234dc9c0e86a2bf6","index":{"url":"z_c69109531bf836fe_public_key_py.html","file":"silkaj/public_key.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":37,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tools_py":{"hash":"9e02ebcd02c7f42544622d7bb8c06e4b","index":{"url":"z_c69109531bf836fe_tools_py.html","file":"silkaj/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":38,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tui_py":{"hash":"229835e32a372eb34c4a21bacc40b0d8","index":{"url":"z_c69109531bf836fe_tui_py.html","file":"silkaj/tui.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e099210adb7d42f0___init___py.html","file":"silkaj/wot/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_certify_py":{"hash":"763119f6ed5826466a51f4de5a5c43d5","index":{"url":"z_e099210adb7d42f0_certify_py.html","file":"silkaj/wot/certify.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":55,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_exclusions_py":{"hash":"029b74f26a5fdb9198238c753278992d","index":{"url":"z_e099210adb7d42f0_exclusions_py.html","file":"silkaj/wot/exclusions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":155,"n_excluded":0,"n_missing":97,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_idty_tools_py":{"hash":"0a2be96c4e4aa1e72457d0da8deaa6d9","index":{"url":"z_e099210adb7d42f0_idty_tools_py.html","file":"silkaj/wot/idty_tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_lookup_py":{"hash":"cb0545138606e4562b5d9271e1bc4351","index":{"url":"z_e099210adb7d42f0_lookup_py.html","file":"silkaj/wot/lookup.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":3,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_membership_py":{"hash":"459f1a520d9adec5000774cd0a6fb9a6","index":{"url":"z_e099210adb7d42f0_membership_py.html","file":"silkaj/wot/membership.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":67,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_revocation_py":{"hash":"b49eb09d004148fcbc0caaea4a3ad878","index":{"url":"z_e099210adb7d42f0_revocation_py.html","file":"silkaj/wot/revocation.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":111,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_status_py":{"hash":"a96e8abf636bd9f25e32b985161442de","index":{"url":"z_e099210adb7d42f0_status_py.html","file":"silkaj/wot/status.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":72,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_tools_py":{"hash":"37af6e48a695216fca3461556b399b7e","index":{"url":"z_e099210adb7d42f0_tools_py.html","file":"silkaj/wot/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":59,"n_excluded":0,"n_missing":9,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}} \ No newline at end of file +{"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.8.0","globals":"09a5a067fe739e9a21f8edc86d2fef52","files":{"z_c69109531bf836fe___init___py":{"hash":"e1ebb3130da6d01118bec14616bf318c","index":{"url":"z_c69109531bf836fe___init___py.html","file":"silkaj/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":1,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_about_py":{"hash":"f3d8da0b3d9ba23275c52a9c8b4974be","index":{"url":"z_c69109531bf836fe_about_py.html","file":"silkaj/about.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_account_storage_py":{"hash":"408bd5e4422863a1b875a27417c034ae","index":{"url":"z_c69109531bf836fe_account_storage_py.html","file":"silkaj/account_storage.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":2,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_auth_py":{"hash":"ffb0bd722225d78e249d50372997128b","index":{"url":"z_c69109531bf836fe_auth_py.html","file":"silkaj/auth.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":102,"n_excluded":0,"n_missing":58,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e7a021a3963ba4f1___init___py.html","file":"silkaj/blockchain/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_blocks_py":{"hash":"d030d003e560c4ea506826fbf20c4487","index":{"url":"z_e7a021a3963ba4f1_blocks_py.html","file":"silkaj/blockchain/blocks.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":79,"n_excluded":0,"n_missing":63,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_difficulty_py":{"hash":"62c4480d1765c4145ea7cd1acf48dd04","index":{"url":"z_e7a021a3963ba4f1_difficulty_py.html","file":"silkaj/blockchain/difficulty.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":38,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_information_py":{"hash":"41a1a2bee587b10295097d32d9b56dcc","index":{"url":"z_e7a021a3963ba4f1_information_py.html","file":"silkaj/blockchain/information.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":13,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e7a021a3963ba4f1_tools_py":{"hash":"7bb8b67193fc892454a2bb4e5ed7b062","index":{"url":"z_e7a021a3963ba4f1_tools_py.html","file":"silkaj/blockchain/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":14,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_checksum_py":{"hash":"4bbe99b69d93327879c5935ab5bdb07e","index":{"url":"z_c69109531bf836fe_checksum_py.html","file":"silkaj/checksum.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_cli_py":{"hash":"30cc6d984d42d8fbef5377a30cdff8b9","index":{"url":"z_c69109531bf836fe_cli_py.html","file":"silkaj/cli.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":76,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_constants_py":{"hash":"3d6c27e7e504fb138258bc516d9e811a","index":{"url":"z_c69109531bf836fe_constants_py.html","file":"silkaj/constants.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":23,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_g1_monetary_license_py":{"hash":"1a5c6c58554c40219293f18efb38d002","index":{"url":"z_c69109531bf836fe_g1_monetary_license_py.html","file":"silkaj/g1_monetary_license.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":36,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_8394fdfe5cf191f4___init___py.html","file":"silkaj/money/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_balance_py":{"hash":"8549a8cff5ce0a39fab225fae4e0adc9","index":{"url":"z_8394fdfe5cf191f4_balance_py.html","file":"silkaj/money/balance.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":70,"n_excluded":0,"n_missing":10,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_history_py":{"hash":"5bc07398e6127dede80da6f2f642fa4d","index":{"url":"z_8394fdfe5cf191f4_history_py.html","file":"silkaj/money/history.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":153,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_tools_py":{"hash":"8c50326d97645d6ad1db8cbc7989794e","index":{"url":"z_8394fdfe5cf191f4_tools_py.html","file":"silkaj/money/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8394fdfe5cf191f4_transfer_py":{"hash":"9945f199a8c665558f2255e190a12bb1","index":{"url":"z_8394fdfe5cf191f4_transfer_py.html","file":"silkaj/money/transfer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":210,"n_excluded":0,"n_missing":15,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_network_py":{"hash":"e3e4627471da7e97e91a2f9375554318","index":{"url":"z_c69109531bf836fe_network_py.html","file":"silkaj/network.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":49,"n_excluded":0,"n_missing":8,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_public_key_py":{"hash":"b1202dec83c7cb60234dc9c0e86a2bf6","index":{"url":"z_c69109531bf836fe_public_key_py.html","file":"silkaj/public_key.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":37,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tools_py":{"hash":"9e02ebcd02c7f42544622d7bb8c06e4b","index":{"url":"z_c69109531bf836fe_tools_py.html","file":"silkaj/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":38,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_c69109531bf836fe_tui_py":{"hash":"229835e32a372eb34c4a21bacc40b0d8","index":{"url":"z_c69109531bf836fe_tui_py.html","file":"silkaj/tui.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0___init___py":{"hash":"cdc7d651861a26f568b39c7aab456a02","index":{"url":"z_e099210adb7d42f0___init___py.html","file":"silkaj/wot/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":0,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_certify_py":{"hash":"cf2ce7a7c5ee82a67bc5ff22c3ad8cb8","index":{"url":"z_e099210adb7d42f0_certify_py.html","file":"silkaj/wot/certify.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":55,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_exclusions_py":{"hash":"fc829370230fec6516e44437fd24d585","index":{"url":"z_e099210adb7d42f0_exclusions_py.html","file":"silkaj/wot/exclusions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":155,"n_excluded":0,"n_missing":97,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_idty_tools_py":{"hash":"a06ee998b5d466b4b6b582044d39508f","index":{"url":"z_e099210adb7d42f0_idty_tools_py.html","file":"silkaj/wot/idty_tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":77,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_lookup_py":{"hash":"cb0545138606e4562b5d9271e1bc4351","index":{"url":"z_e099210adb7d42f0_lookup_py.html","file":"silkaj/wot/lookup.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":21,"n_excluded":0,"n_missing":3,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_membership_py":{"hash":"224f42325ca37e171f4b9876248cf476","index":{"url":"z_e099210adb7d42f0_membership_py.html","file":"silkaj/wot/membership.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":67,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_revocation_py":{"hash":"b49eb09d004148fcbc0caaea4a3ad878","index":{"url":"z_e099210adb7d42f0_revocation_py.html","file":"silkaj/wot/revocation.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":111,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_status_py":{"hash":"f4f52c3bcaa5e3ddb4fab09c679c5bdf","index":{"url":"z_e099210adb7d42f0_status_py.html","file":"silkaj/wot/status.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":72,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e099210adb7d42f0_tools_py":{"hash":"37af6e48a695216fca3461556b399b7e","index":{"url":"z_e099210adb7d42f0_tools_py.html","file":"silkaj/wot/tools.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":59,"n_excluded":0,"n_missing":9,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}} \ No newline at end of file diff --git a/0.12/coverage/z_8394fdfe5cf191f4___init___py.html b/0.12/coverage/z_8394fdfe5cf191f4___init___py.html index 6a546d17f68044df3622a78f2f154ab2136d906c..1b4d477b4b5998dac79d891bb91e34745ded67b0 100644 --- a/0.12/coverage/z_8394fdfe5cf191f4___init___py.html +++ b/0.12/coverage/z_8394fdfe5cf191f4___init___py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_balance_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -103,7 +103,7 @@ <a class="nav" href="z_8394fdfe5cf191f4_balance_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html b/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html index cb31c24c8e54e3c1b3b136dd4acad2d8989a015a..4cdf7d393dd3bdf1d5e5ff244c29cd9f6ef4fbf3 100644 --- a/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html +++ b/0.12/coverage/z_8394fdfe5cf191f4_balance_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_history_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -224,7 +224,7 @@ <a class="nav" href="z_8394fdfe5cf191f4_history_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_8394fdfe5cf191f4_history_py.html b/0.12/coverage/z_8394fdfe5cf191f4_history_py.html index 3ecc39d00285c399f9eb13884acfd4822feb6612..19664d191f2b0568217feb677cd982bf71389b4a 100644 --- a/0.12/coverage/z_8394fdfe5cf191f4_history_py.html +++ b/0.12/coverage/z_8394fdfe5cf191f4_history_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -101,7 +101,7 @@ <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Any</span><span class="op">,</span> <span class="nam">Optional</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">from</span> <span class="nam">urllib</span><span class="op">.</span><span class="nam">error</span> <span class="key">import</span> <span class="nam">HTTPError</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">bma</span><span class="op">.</span><span class="nam">tx</span> <span class="key">import</span> <span class="nam">history</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">client</span> <span class="key">import</span> <span class="nam">Client</span> </span><span class="r"></span></p> @@ -191,7 +191,7 @@ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="op">{</span><span class="str">"uid"</span><span class="op">:</span> <span class="str">""</span><span class="op">}</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="nam">balance</span> <span class="op">=</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">get_amount_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">balance_ud</span> <span class="op">=</span> <span class="nam">round</span><span class="op">(</span><span class="nam">balance</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">date</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="key">return</span> <span class="fst">f"</span><span class="fst">Transactions history from: </span><span class="op">{</span><span class="nam">idty</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> </span><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">}</span><span class="fst">\n\</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"><span class="fst">Current balance: </span><span class="op">{</span><span class="nam">balance</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">}</span><span class="fst"> </span><span class="op">{</span><span class="nam">currency_symbol</span><span class="op">}</span><span class="fst">, </span><span class="op">{</span><span class="nam">balance_ud</span><span class="op">}</span><span class="fst"> UD </span><span class="op">{</span><span class="nam">currency_symbol</span><span class="op">}</span><span class="fst"> on </span><span class="op">{</span><span class="nam">date</span><span class="op">}</span><span class="fst">\n</span><span class="fst">"</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> </span><span class="r"></span></p> @@ -284,150 +284,154 @@ <p class="run"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"> <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="key">for</span> <span class="nam">received_tx</span> <span class="key">in</span> <span class="nam">received_txs</span><span class="op">:</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"> <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">issuers</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="key">None</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="nam">issuer</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="nam">identities</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="nam">full_pubkey</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">received_func</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"> <span class="nam">received_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="key">def</span> <span class="nam">parse_sent_tx</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="nam">sent_txs_table</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"> <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="str"> Extract recipients` pubkeys from outputs</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"><span class="str"> Get identities from pubkeys</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="str"> Convert time into human format</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="str"> Store "Total" and total amounts according to the number of outputs</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="str"> If not output back return:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"><span class="str"> Assign amounts, amounts_ud, identities, and comment</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"> <span class="nam">pubkeys</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"> <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"> <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"> <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">outputs</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t"> <span class="nam">pubkeys</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">pubkeys</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="nam">total_amount</span><span class="op">,</span> <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">"Total"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"> <span class="key">else</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">=</span> <span class="str">""</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"> <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="str">""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"> <span class="nam">amounts_ud</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="nam">round</span><span class="op">(</span><span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="num">0</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"> <span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t"> <span class="nam">identities</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t"> <span class="nam">full_pubkey</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts_ud</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t"> <span class="nam">sent_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"><span class="key">def</span> <span class="nam">tx_amount</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t"> <span class="nam">tx</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t"> <span class="nam">function</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">tuple</span><span class="op">[</span><span class="nam">int</span><span class="op">,</span> <span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"><span class="str"> Determine transaction amount from output sources</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t"> <span class="nam">amount</span> <span class="op">=</span> <span class="num">0</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t"> <span class="nam">outputs</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t"> <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">tx</span><span class="op">.</span><span class="nam">outputs</span><span class="op">:</span> <span class="com"># type: ignore[attr-defined]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t"> <span class="nam">outputs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t"> <span class="nam">amount</span> <span class="op">+=</span> <span class="nam">function</span><span class="op">(</span><span class="nam">output</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t"> <span class="key">return</span> <span class="nam">amount</span><span class="op">,</span> <span class="nam">outputs</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t"><span class="key">def</span> <span class="nam">received_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">eq</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t"> <span class="key">return</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t"> <span class="key">return</span> <span class="num">0</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t"><span class="key">def</span> <span class="nam">sent_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t"> <span class="key">return</span> <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t"> <span class="key">return</span> <span class="num">0</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"><span class="key">def</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">condition</span><span class="op">:</span> <span class="nam">Condition</span><span class="op">,</span> <span class="nam">comparison</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span> <span class="nam">value</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"><span class="str"> Check if output source is available</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"><span class="str"> Currently only handle simple SIG condition</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t"><span class="str"> XHX, CLTV, CSV should be handled when present in the blockchain</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t"> <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">,</span> <span class="str">"pubkey"</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t"> <span class="key">return</span> <span class="nam">comparison</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t317" href="#t317">317</a></span><span class="t"><span class="key">def</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">identities</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t318" href="#t318">318</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t319" href="#t319">319</a></span><span class="t"> <span class="key">for</span> <span class="nam">identity</span> <span class="key">in</span> <span class="nam">identities</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t320" href="#t320">320</a></span><span class="t"> <span class="key">if</span> <span class="nam">pubkey</span> <span class="op">==</span> <span class="nam">identity</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t321" href="#t321">321</a></span><span class="t"> <span class="nam">pubkey_mod</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t322" href="#t322">322</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> - </span><span class="op">{</span><span class="nam">pubkey_mod</span><span class="op">}</span><span class="fst">"</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t323" href="#t323">323</a></span><span class="t"> <span class="key">return</span> <span class="nam">idty</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t324" href="#t324">324</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t325" href="#t325">325</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t326" href="#t326">326</a></span><span class="t"><span class="key">def</span> <span class="nam">prefix</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t327" href="#t327">327</a></span><span class="t"> <span class="nam">tx_addresses</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t328" href="#t328">328</a></span><span class="t"> <span class="nam">outputs</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t329" href="#t329">329</a></span><span class="t"> <span class="nam">occurence</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t330" href="#t330">330</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t331" href="#t331">331</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t332" href="#t332">332</a></span><span class="t"><span class="str"> Pretty print with texttable</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t333" href="#t333">333</a></span><span class="t"><span class="str"> Break line when several values in a cell</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t334" href="#t334">334</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t335" href="#t335">335</a></span><span class="t"><span class="str"> Received tx case, 'outputs' is not defined, then add a breakline</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t336" href="#t336">336</a></span><span class="t"><span class="str"> between the pubkeys except for the first occurence for multi-sig support</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t337" href="#t337">337</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t338" href="#t338">338</a></span><span class="t"><span class="str"> Sent tx case, handle "Total" line in case of multi-output txs</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t339" href="#t339">339</a></span><span class="t"><span class="str"> In case of multiple outputs, there is a "Total" on the top,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t340" href="#t340">340</a></span><span class="t"><span class="str"> where there must be a breakline</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t341" href="#t341">341</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t342" href="#t342">342</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t343" href="#t343">343</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">outputs</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t344" href="#t344">344</a></span><span class="t"> <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">occurence</span> <span class="op">></span> <span class="num">0</span> <span class="key">else</span> <span class="str">""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t345" href="#t345">345</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t346" href="#t346">346</a></span><span class="t"> <span class="key">if</span> <span class="nam">tx_addresses</span> <span class="op">==</span> <span class="str">"Total"</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t347" href="#t347">347</a></span><span class="t"> <span class="key">return</span> <span class="str">"\n"</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t348" href="#t348">348</a></span><span class="t"> <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span> <span class="key">else</span> <span class="str">""</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">issuers</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="key">None</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="nam">issuer</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="nam">identities</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="nam">full_pubkey</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">received_func</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">amounts</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">received_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"> <span class="nam">received_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"><span class="key">def</span> <span class="nam">parse_sent_tx</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="nam">sent_txs_table</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="nam">sent_txs</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="nam">ud_value</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"> <span class="nam">uids</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"> <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="str"> Extract recipients` pubkeys from outputs</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="str"> Get identities from pubkeys</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="str"> Convert time into human format</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"><span class="str"> Store "Total" and total amounts according to the number of outputs</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"><span class="str"> If not output back return:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"><span class="str"> Assign amounts, amounts_ud, identities, and comment</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"> <span class="nam">pubkeys</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"> <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"> <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t"> <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">outputs</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="nam">pubkeys</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="nam">identities</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">identities_from_pubkeys</span><span class="op">(</span><span class="nam">pubkeys</span><span class="op">,</span> <span class="nam">uids</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="key">for</span> <span class="nam">sent_tx</span> <span class="key">in</span> <span class="nam">sent_txs</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="nam">tx_list</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">time</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL_DIGITAL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="nam">total_amount</span><span class="op">,</span> <span class="nam">outputs</span> <span class="op">=</span> <span class="nam">tx_amount</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">sent_func</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">"Total"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"> <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">round</span><span class="op">(</span><span class="nam">total_amount</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"> <span class="key">else</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">""</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">=</span> <span class="str">""</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"> <span class="nam">amounts_ud</span> <span class="op">=</span> <span class="str">""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="nam">amounts</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"> <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">CENT_MULT_TO_UNIT</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"> <span class="nam">amounts_ud</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="nam">i</span><span class="op">)</span> <span class="op">+</span> <span class="nam">str</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t"> <span class="nam">round</span><span class="op">(</span><span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> <span class="op">/</span> <span class="nam">ud_value</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> <span class="op">+=</span> <span class="nam">prefix</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">,</span> <span class="nam">outputs</span><span class="op">,</span> <span class="num">0</span><span class="op">)</span> <span class="op">+</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t"> <span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t"> <span class="nam">identities</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t"> <span class="nam">full_pubkey</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">amounts_ud</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"> <span class="nam">tx_list</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sent_tx</span><span class="op">.</span><span class="nam">comment</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t"> <span class="nam">sent_txs_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">tx_list</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"><span class="key">def</span> <span class="nam">tx_amount</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"> <span class="nam">tx</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">Transaction</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"> <span class="nam">function</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">tuple</span><span class="op">[</span><span class="nam">int</span><span class="op">,</span> <span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t"><span class="str"> Determine transaction amount from output sources</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t"> <span class="nam">amount</span> <span class="op">=</span> <span class="num">0</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t"> <span class="nam">outputs</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t"> <span class="key">for</span> <span class="nam">output</span> <span class="key">in</span> <span class="nam">tx</span><span class="op">.</span><span class="nam">outputs</span><span class="op">:</span> <span class="com"># type: ignore[attr-defined]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t"> <span class="nam">outputs</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t"> <span class="nam">amount</span> <span class="op">+=</span> <span class="nam">function</span><span class="op">(</span><span class="nam">output</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t"> <span class="key">return</span> <span class="nam">amount</span><span class="op">,</span> <span class="nam">outputs</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t"><span class="key">def</span> <span class="nam">received_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">eq</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t"> <span class="key">return</span> <span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t"> <span class="key">return</span> <span class="num">0</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t"><span class="key">def</span> <span class="nam">sent_func</span><span class="op">(</span><span class="nam">output</span><span class="op">:</span> <span class="nam">OutputSource</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">int</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">output</span><span class="op">.</span><span class="nam">condition</span><span class="op">,</span> <span class="nam">ne</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"> <span class="key">return</span> <span class="nam">neg</span><span class="op">(</span><span class="nam">mt</span><span class="op">.</span><span class="nam">amount_in_current_base</span><span class="op">(</span><span class="nam">output</span><span class="op">)</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t"> <span class="key">return</span> <span class="num">0</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t"><span class="key">def</span> <span class="nam">output_available</span><span class="op">(</span><span class="nam">condition</span><span class="op">:</span> <span class="nam">Condition</span><span class="op">,</span> <span class="nam">comparison</span><span class="op">:</span> <span class="nam">Any</span><span class="op">,</span> <span class="nam">value</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t"><span class="str"> Check if output source is available</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t"><span class="str"> Currently only handle simple SIG condition</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t"><span class="str"> XHX, CLTV, CSV should be handled when present in the blockchain</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t"> <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">,</span> <span class="str">"pubkey"</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t317" href="#t317">317</a></span><span class="t"> <span class="key">return</span> <span class="nam">comparison</span><span class="op">(</span><span class="nam">condition</span><span class="op">.</span><span class="nam">left</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t318" href="#t318">318</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t319" href="#t319">319</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t320" href="#t320">320</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t321" href="#t321">321</a></span><span class="t"><span class="key">def</span> <span class="nam">assign_idty_from_pubkey</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">identities</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">full_pubkey</span><span class="op">:</span> <span class="nam">bool</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t322" href="#t322">322</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t323" href="#t323">323</a></span><span class="t"> <span class="key">for</span> <span class="nam">identity</span> <span class="key">in</span> <span class="nam">identities</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t324" href="#t324">324</a></span><span class="t"> <span class="key">if</span> <span class="nam">pubkey</span> <span class="op">==</span> <span class="nam">identity</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t325" href="#t325">325</a></span><span class="t"> <span class="nam">pubkey_mod</span> <span class="op">=</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="nam">short</span><span class="op">=</span><span class="key">not</span> <span class="nam">full_pubkey</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t326" href="#t326">326</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> - </span><span class="op">{</span><span class="nam">pubkey_mod</span><span class="op">}</span><span class="fst">"</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t327" href="#t327">327</a></span><span class="t"> <span class="key">return</span> <span class="nam">idty</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t328" href="#t328">328</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t329" href="#t329">329</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t330" href="#t330">330</a></span><span class="t"><span class="key">def</span> <span class="nam">prefix</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t331" href="#t331">331</a></span><span class="t"> <span class="nam">tx_addresses</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t332" href="#t332">332</a></span><span class="t"> <span class="nam">outputs</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">list</span><span class="op">[</span><span class="nam">OutputSource</span><span class="op">]</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t333" href="#t333">333</a></span><span class="t"> <span class="nam">occurence</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t334" href="#t334">334</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t335" href="#t335">335</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t336" href="#t336">336</a></span><span class="t"><span class="str"> Pretty print with texttable</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t337" href="#t337">337</a></span><span class="t"><span class="str"> Break line when several values in a cell</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t338" href="#t338">338</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t339" href="#t339">339</a></span><span class="t"><span class="str"> Received tx case, 'outputs' is not defined, then add a breakline</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t340" href="#t340">340</a></span><span class="t"><span class="str"> between the pubkeys except for the first occurence for multi-sig support</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t341" href="#t341">341</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t342" href="#t342">342</a></span><span class="t"><span class="str"> Sent tx case, handle "Total" line in case of multi-output txs</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t343" href="#t343">343</a></span><span class="t"><span class="str"> In case of multiple outputs, there is a "Total" on the top,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t344" href="#t344">344</a></span><span class="t"><span class="str"> where there must be a breakline</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t345" href="#t345">345</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t346" href="#t346">346</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t347" href="#t347">347</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">outputs</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t348" href="#t348">348</a></span><span class="t"> <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">occurence</span> <span class="op">></span> <span class="num">0</span> <span class="key">else</span> <span class="str">""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t349" href="#t349">349</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t350" href="#t350">350</a></span><span class="t"> <span class="key">if</span> <span class="nam">tx_addresses</span> <span class="op">==</span> <span class="str">"Total"</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t351" href="#t351">351</a></span><span class="t"> <span class="key">return</span> <span class="str">"\n"</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t352" href="#t352">352</a></span><span class="t"> <span class="key">return</span> <span class="str">"\n"</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">outputs</span><span class="op">)</span> <span class="op">></span> <span class="num">1</span> <span class="key">else</span> <span class="str">""</span> </span><span class="r"></span></p> </main> <footer> <div class="content"> @@ -437,7 +441,7 @@ <a class="nav" href="z_8394fdfe5cf191f4_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html b/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html index 88ef6e7b4d760eb74e79cc0644a59c621bdaeaa1..566e1232dcf19f3a68140b5dfa268cca1ce13008 100644 --- a/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html +++ b/0.12/coverage/z_8394fdfe5cf191f4_tools_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4_transfer_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -222,7 +222,7 @@ <a class="nav" href="z_8394fdfe5cf191f4_transfer_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html b/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html index 0e30fb6163c4b1d62ac06927dfac5a3eec613a49..d569ad1625afa8c65f7c6730041ae56c75a421fd 100644 --- a/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html +++ b/0.12/coverage/z_8394fdfe5cf191f4_transfer_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_network_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -690,7 +690,7 @@ <a class="nav" href="z_c69109531bf836fe_network_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe___init___py.html b/0.12/coverage/z_c69109531bf836fe___init___py.html index c9832b01addcb7f9311afae97808d4cf13b8caca..bc362e29e9cfaf6433e47ae01faf295086cc2cb0 100644 --- a/0.12/coverage/z_c69109531bf836fe___init___py.html +++ b/0.12/coverage/z_c69109531bf836fe___init___py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_about_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -105,7 +105,7 @@ <a class="nav" href="z_c69109531bf836fe_about_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_about_py.html b/0.12/coverage/z_c69109531bf836fe_about_py.html index 27c4fb5c7de9f450ec424846d1e045f595882d34..fdeb989a42e2c5bfce1598946b18270d7c29fc27 100644 --- a/0.12/coverage/z_c69109531bf836fe_about_py.html +++ b/0.12/coverage/z_c69109531bf836fe_about_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_account_storage_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -135,7 +135,7 @@ <a class="nav" href="z_c69109531bf836fe_account_storage_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_account_storage_py.html b/0.12/coverage/z_c69109531bf836fe_account_storage_py.html index 1007811a15038dad5aac1b2552bd1a8404497d8d..3a8b3fda3403efb6bb6534c2f4e5f1581b5f3195 100644 --- a/0.12/coverage/z_c69109531bf836fe_account_storage_py.html +++ b/0.12/coverage/z_c69109531bf836fe_account_storage_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_auth_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -143,7 +143,7 @@ <a class="nav" href="z_c69109531bf836fe_auth_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_auth_py.html b/0.12/coverage/z_c69109531bf836fe_auth_py.html index 76a34da679c1d9aacdc794aadd933a5c3f6b7fbe..9c264b0d93ef02d4a673c1010e2f2d17cf33d0db 100644 --- a/0.12/coverage/z_c69109531bf836fe_auth_py.html +++ b/0.12/coverage/z_c69109531bf836fe_auth_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1___init___py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -320,7 +320,7 @@ <a class="nav" href="z_e7a021a3963ba4f1___init___py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_checksum_py.html b/0.12/coverage/z_c69109531bf836fe_checksum_py.html index 037285dd60d43def06f73729766b91851900c2fd..5b2e9c7e4c942860264ae42ad3206d4ffd8e8394 100644 --- a/0.12/coverage/z_c69109531bf836fe_checksum_py.html +++ b/0.12/coverage/z_c69109531bf836fe_checksum_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_cli_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -141,7 +141,7 @@ <a class="nav" href="z_c69109531bf836fe_cli_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_cli_py.html b/0.12/coverage/z_c69109531bf836fe_cli_py.html index 5dcc16c4ab9ad81c268ddef592dc44f0dc61ca50..198587396a560765af95b88b9edca3a9187e7599 100644 --- a/0.12/coverage/z_c69109531bf836fe_cli_py.html +++ b/0.12/coverage/z_c69109531bf836fe_cli_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_constants_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -269,7 +269,7 @@ <a class="nav" href="z_c69109531bf836fe_constants_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_constants_py.html b/0.12/coverage/z_c69109531bf836fe_constants_py.html index 19a50e8873988b272f214f91fe0656e89ac00db2..90e5b98102a23735c10f5b029ec566f34148be82 100644 --- a/0.12/coverage/z_c69109531bf836fe_constants_py.html +++ b/0.12/coverage/z_c69109531bf836fe_constants_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_g1_monetary_license_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -95,7 +95,7 @@ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="com"># You should have received a copy of the GNU Affero General Public License</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="com"># along with Silkaj. If not, see <https://www.gnu.org/licenses/>.</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="nam">SILKAJ_VERSION</span> <span class="op">=</span> <span class="str">"0.11.0"</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="nam">SILKAJ_VERSION</span> <span class="op">=</span> <span class="str">"0.12.0"</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="nam">G1_SYMBOL</span> <span class="op">=</span> <span class="str">"Ğ1"</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="nam">GTEST_SYMBOL</span> <span class="op">=</span> <span class="str">"ĞTest"</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> </span><span class="r"></span></p> @@ -121,13 +121,13 @@ <p class="run"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="nam">CENT_MULT_TO_UNIT</span> <span class="op">=</span> <span class="num">100</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="nam">SHORT_PUBKEY_SIZE</span> <span class="op">=</span> <span class="num">8</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="com"># Arrow date time formats</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="com"># https://arrow.readthedocs.io/en/latest/guide.html#supported-tokens</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"><span class="nam">DATE</span> <span class="op">=</span> <span class="str">"MMMM D, YYYY"</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="nam">ALL</span> <span class="op">=</span> <span class="str">"MMMM D, YYYY hh:mm A ZZZ"</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="com"># Not ISO 8601 compliant but common</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"><span class="nam">ALL_DIGITAL</span> <span class="op">=</span> <span class="str">"YYYY-MM-DD HH:mm:ss"</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"><span class="nam">FULL_HUMAN_FORMAT</span> <span class="op">=</span> <span class="str">"dddd D MMMM YYYY HH:mm ZZZ"</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="com"># pendulum constants</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="com"># see https://pendulum.eustace.io/docs/#localized-formats</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"><span class="nam">DATE</span> <span class="op">=</span> <span class="str">"LL"</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="nam">HOUR</span> <span class="op">=</span> <span class="str">"LTS"</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="nam">ALL</span> <span class="op">=</span> <span class="str">"LLL"</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"><span class="com"># Not ISO 8601 compliant but common</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"><span class="nam">ALL_DIGITAL</span> <span class="op">=</span> <span class="str">"YYYY-MM-DD HH:mm:ss"</span> </span><span class="r"></span></p> </main> <footer> <div class="content"> @@ -137,7 +137,7 @@ <a class="nav" href="z_c69109531bf836fe_g1_monetary_license_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html b/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html index 605268cd098661ae86e61bb3e36741cba6a905f2..0efc4040533d0a05c031f73897e267f4d4e050ad 100644 --- a/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html +++ b/0.12/coverage/z_c69109531bf836fe_g1_monetary_license_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_8394fdfe5cf191f4___init___py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -170,7 +170,7 @@ <a class="nav" href="z_8394fdfe5cf191f4___init___py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_network_py.html b/0.12/coverage/z_c69109531bf836fe_network_py.html index 13cbedc3c69f9b9b4d25ad2e4f678717eb69f43e..a9ee5e6c3440fd851921a4847f37549b195684d0 100644 --- a/0.12/coverage/z_c69109531bf836fe_network_py.html +++ b/0.12/coverage/z_c69109531bf836fe_network_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_public_key_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -184,7 +184,7 @@ <a class="nav" href="z_c69109531bf836fe_public_key_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_public_key_py.html b/0.12/coverage/z_c69109531bf836fe_public_key_py.html index b5eaf5e77b1dde5c379bb8b718319438b06c7ee1..de67582a4f49e2a6dc64fdafd8e3e6797397bf49 100644 --- a/0.12/coverage/z_c69109531bf836fe_public_key_py.html +++ b/0.12/coverage/z_c69109531bf836fe_public_key_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -184,7 +184,7 @@ <a class="nav" href="z_c69109531bf836fe_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_tools_py.html b/0.12/coverage/z_c69109531bf836fe_tools_py.html index df6a65ab92c27b467218f55834491e5f0773a4dc..5858f9a573390dbcc387cc98c03cdf9423e96428 100644 --- a/0.12/coverage/z_c69109531bf836fe_tools_py.html +++ b/0.12/coverage/z_c69109531bf836fe_tools_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_tui_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -163,7 +163,7 @@ <a class="nav" href="z_c69109531bf836fe_tui_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_c69109531bf836fe_tui_py.html b/0.12/coverage/z_c69109531bf836fe_tui_py.html index b0773fec6562eff75b4e38818be471a304f5c08d..103ae27d86980c1a9648c1a9d1c1bcf934f66d88 100644 --- a/0.12/coverage/z_c69109531bf836fe_tui_py.html +++ b/0.12/coverage/z_c69109531bf836fe_tui_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0___init___py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -189,7 +189,7 @@ <a class="nav" href="z_e099210adb7d42f0___init___py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0___init___py.html b/0.12/coverage/z_e099210adb7d42f0___init___py.html index 1afd2794d6a589ec36d95bdda464927191149c89..932a61bd4ab5c217a76106396ae910bf6a6f7623 100644 --- a/0.12/coverage/z_e099210adb7d42f0___init___py.html +++ b/0.12/coverage/z_e099210adb7d42f0___init___py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_certify_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -103,7 +103,7 @@ <a class="nav" href="z_e099210adb7d42f0_certify_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_certify_py.html b/0.12/coverage/z_e099210adb7d42f0_certify_py.html index 10df61e44167f1f261205b8fc683a63afd45182e..e84831950324a9a253348be495d79b222fff69e7 100644 --- a/0.12/coverage/z_e099210adb7d42f0_certify_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_certify_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_exclusions_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -97,7 +97,7 @@ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">sys</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">bma</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">client</span> <span class="key">import</span> <span class="nam">Client</span> </span><span class="r"></span></p> @@ -185,7 +185,7 @@ <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="com"># ĞT: 0<->4.8m - 4.8m + 12.5d</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">renewable</span> <span class="op">=</span> <span class="nam">cert</span><span class="op">[</span><span class="str">"expiresIn"</span><span class="op">]</span> <span class="op">-</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigValidity"</span><span class="op">]</span> <span class="op">+</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigReplay"</span><span class="op">]</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">if</span> <span class="nam">renewable</span> <span class="op">></span> <span class="num">0</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">renewable_date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">renewable</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">renewable_date</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">renewable</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">sys</span><span class="op">.</span><span class="nam">exit</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Certification renewable from </span><span class="op">{</span><span class="nam">renewable_date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="com"># Check if the certification is already in the pending certifications</span> </span><span class="r"></span></p> @@ -207,7 +207,7 @@ <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">idty_timestamp</span> <span class="op">=</span> <span class="nam">idty_to_certify</span><span class="op">[</span><span class="str">"meta"</span><span class="op">]</span><span class="op">[</span><span class="str">"timestamp"</span><span class="op">]</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="nam">block_id_idty</span> <span class="op">=</span> <span class="nam">get_block_id</span><span class="op">(</span><span class="nam">idty_timestamp</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="nam">block</span> <span class="op">=</span> <span class="nam">client</span><span class="op">(</span><span class="nam">bma</span><span class="op">.</span><span class="nam">blockchain</span><span class="op">.</span><span class="nam">block</span><span class="op">,</span> <span class="nam">block_id_idty</span><span class="op">.</span><span class="nam">number</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">timestamp_date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">timestamp_date</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">block_id_date</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">: #</span><span class="op">{</span><span class="nam">idty_timestamp</span><span class="op">[</span><span class="op">:</span><span class="num">15</span><span class="op">]</span><span class="op">}</span><span class="fst">… </span><span class="op">{</span><span class="nam">timestamp_date</span><span class="op">}</span><span class="fst">"</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="nam">cert</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"ID"</span><span class="op">,</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">,</span> <span class="str">"->"</span><span class="op">,</span> <span class="nam">idty_to_certify</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">+</span> <span class="nam">block_id_date</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="nam">cert</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> @@ -219,8 +219,8 @@ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="nam">params</span> <span class="op">=</span> <span class="nam">bc_tools</span><span class="op">.</span><span class="nam">get_blockchain_parameters</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="nam">cert_ends</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">params</span><span class="op">[</span><span class="str">"sigValidity"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">cert</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"Valid"</span><span class="op">,</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> <span class="str">"—>"</span><span class="op">,</span> <span class="nam">cert_ends</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="nam">cert_ends</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">params</span><span class="op">[</span><span class="str">"sigValidity"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">cert</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"Valid"</span><span class="op">,</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> <span class="str">"—>"</span><span class="op">,</span> <span class="nam">cert_ends</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">tui</span><span class="op">.</span><span class="nam">Table</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_rows</span><span class="op">(</span> </span><span class="r"></span></p> @@ -265,7 +265,7 @@ <a class="nav" href="z_e099210adb7d42f0_exclusions_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html b/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html index 6fb78187d3cbf4756e71a03e5da294da9034f7cd..37b8e8333f756a3336f603d0e68afc9a6ab36734 100644 --- a/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_exclusions_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_idty_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -101,7 +101,7 @@ <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">import</span> <span class="nam">time</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">import</span> <span class="nam">urllib</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span> <span class="key">import</span> <span class="nam">constants</span> <span class="key">as</span> <span class="nam">dp_const</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">bma</span> <span class="key">import</span> <span class="nam">blockchain</span> </span><span class="r"></span></p> @@ -304,8 +304,8 @@ <p class="mis show_mis"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">certified</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">lookup</span><span class="op">[</span><span class="str">"signed"</span><span class="op">]</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="nam">info</span> <span class="op">+=</span> <span class="nam">elements_inbetween_list</span><span class="op">(</span><span class="nam">i</span><span class="op">,</span> <span class="nam">lookup</span><span class="op">[</span><span class="str">"signed"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="nam">info</span> <span class="op">+=</span> <span class="str">"@"</span> <span class="op">+</span> <span class="nam">certified</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="nam">dt</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">block</span><span class="op">.</span><span class="nam">mediantime</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">hours</span><span class="op">=</span><span class="num">1</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="nam">info</span> <span class="op">+=</span> <span class="str">".\n- **Exclu·e le** "</span> <span class="op">+</span> <span class="nam">dt</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">constants</span><span class="op">.</span><span class="nam">FULL_HUMAN_FORMAT</span><span class="op">,</span> <span class="nam">locale</span><span class="op">=</span><span class="str">"fr"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="nam">dt</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">block</span><span class="op">.</span><span class="nam">mediantime</span> <span class="op">+</span> <span class="nam">constants</span><span class="op">.</span><span class="nam">ONE_HOUR</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="nam">info</span> <span class="op">+=</span> <span class="str">".\n- **Exclu·e le** "</span> <span class="op">+</span> <span class="nam">dt</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="str">"LLLL zz"</span><span class="op">,</span> <span class="nam">locale</span><span class="op">=</span><span class="str">"fr"</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"> <span class="nam">info</span> <span class="op">+=</span> <span class="str">"\n- **Raison de l'exclusion** : "</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"> <span class="key">if</span> <span class="nam">nbr_different_certifiers</span> <span class="op"><</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigQty"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"> <span class="nam">info</span> <span class="op">+=</span> <span class="str">"manque de certifications"</span> </span><span class="r"></span></p> @@ -372,7 +372,7 @@ <a class="nav" href="z_e099210adb7d42f0_idty_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html b/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html index c332b0d851aa0963ea8521e640bfd350ac85d5c9..37c486fc531ce236fa236a5247dc9ce1b1165321 100644 --- a/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_idty_tools_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_lookup_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -100,7 +100,7 @@ <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">import</span> <span class="nam">urllib</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">bma</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">documents</span> <span class="key">import</span> <span class="nam">BlockID</span><span class="op">,</span> <span class="nam">Identity</span><span class="op">,</span> <span class="nam">Revocation</span> </span><span class="r"></span></p> @@ -122,93 +122,95 @@ <p class="run"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">id_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"User ID"</span><span class="op">,</span> <span class="nam">idty</span><span class="op">.</span><span class="nam">uid</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">id_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"Blockstamp"</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">block_id</span><span class="op">)</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">creation_block</span> <span class="op">=</span> <span class="nam">client</span><span class="op">(</span><span class="nam">bma</span><span class="op">.</span><span class="nam">blockchain</span><span class="op">.</span><span class="nam">block</span><span class="op">,</span> <span class="nam">idty</span><span class="op">.</span><span class="nam">block_id</span><span class="op">.</span><span class="nam">number</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">creation_date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">creation_block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">id_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"Created on"</span><span class="op">,</span> <span class="nam">creation_date</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="com"># display infos</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">Texttable</span><span class="op">(</span><span class="nam">max_width</span><span class="op">=</span><span class="nam">shutil</span><span class="op">.</span><span class="nam">get_terminal_size</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">columns</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">add_rows</span><span class="op">(</span><span class="nam">id_table</span><span class="op">,</span> <span class="nam">header</span><span class="op">=</span><span class="key">False</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">return</span> <span class="nam">table</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"><span class="key">def</span> <span class="nam">check_many_identities</span><span class="op">(</span><span class="nam">document</span><span class="op">:</span> <span class="nam">Union</span><span class="op">[</span><span class="nam">Identity</span><span class="op">,</span> <span class="nam">Revocation</span><span class="op">]</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"><span class="str"> Checks if many identities match the one looked after.</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"><span class="str"> Returns True if the same identity is found, False if not.</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">doc_type</span> <span class="op">=</span> <span class="nam">document</span><span class="op">.</span><span class="nam">__class__</span><span class="op">.</span><span class="nam">__name__</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">error_no_identical_id</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">doc_type</span><span class="op">}</span><span class="fst"> document does not match any valid identity.</span><span class="fst">"</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="nam">document</span> <span class="key">if</span> <span class="nam">doc_type</span> <span class="op">==</span> <span class="str">"Identity"</span> <span class="key">else</span> <span class="nam">document</span><span class="op">.</span><span class="nam">identity</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="key">try</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">results_pubkey</span> <span class="op">=</span> <span class="nam">wot_lookup</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">results_uid</span> <span class="op">=</span> <span class="nam">wot_lookup</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">uid</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">except</span> <span class="nam">urllib</span><span class="op">.</span><span class="nam">error</span><span class="op">.</span><span class="nam">HTTPError</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">sys</span><span class="op">.</span><span class="nam">exit</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="fst">f"</span><span class="op">{</span><span class="nam">error_no_identical_id</span><span class="op">}</span><span class="fst">\nuid: </span><span class="op">{</span><span class="nam">idty</span><span class="op">.</span><span class="nam">uid</span><span class="op">}</span><span class="fst">\npubkey: \</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="com"># get all matching identities</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">lookup_ids</span> <span class="op">=</span> <span class="nam">merge_ids_lists</span><span class="op">(</span><span class="nam">results_pubkey</span><span class="op">,</span> <span class="nam">results_uid</span><span class="op">,</span> <span class="nam">idty</span><span class="op">.</span><span class="nam">currency</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">match</span> <span class="op">=</span> <span class="key">False</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">for</span> <span class="nam">n</span><span class="op">,</span> <span class="nam">lookup</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">lookup_ids</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="key">if</span> <span class="nam">idty</span> <span class="op">==</span> <span class="nam">lookup</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">lookup_ids</span><span class="op">.</span><span class="nam">pop</span><span class="op">(</span><span class="nam">n</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">match</span> <span class="op">=</span> <span class="key">True</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">alternate_ids</span> <span class="op">=</span> <span class="nam">display_alternate_ids</span><span class="op">(</span><span class="nam">lookup_ids</span><span class="op">)</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="key">if</span> <span class="nam">match</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">lookup_ids</span><span class="op">)</span> <span class="op">>=</span> <span class="num">1</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">click</span><span class="op">.</span><span class="nam">echo</span><span class="op">(</span><span class="fst">f"</span><span class="fst">One matching identity!\nSimilar identities:\n</span><span class="op">{</span><span class="nam">alternate_ids</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">click</span><span class="op">.</span><span class="nam">echo</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">error_no_identical_id</span><span class="op">}</span><span class="fst">\nSimilar identities:\n</span><span class="op">{</span><span class="nam">alternate_ids</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"><span class="key">def</span> <span class="nam">display_alternate_ids</span><span class="op">(</span><span class="nam">ids_list</span><span class="op">:</span> <span class="nam">list</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Texttable</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">labels</span> <span class="op">=</span> <span class="op">[</span><span class="str">"uid"</span><span class="op">,</span> <span class="str">"public key"</span><span class="op">,</span> <span class="str">"timestamp"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">Texttable</span><span class="op">(</span><span class="nam">max_width</span><span class="op">=</span><span class="nam">shutil</span><span class="op">.</span><span class="nam">get_terminal_size</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">columns</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">header</span><span class="op">(</span><span class="nam">labels</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">for</span> <span class="nam">_id</span> <span class="key">in</span> <span class="nam">ids_list</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">add_row</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="op">[</span><span class="nam">_id</span><span class="op">.</span><span class="nam">uid</span><span class="op">,</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">_id</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">_id</span><span class="op">.</span><span class="nam">block_id</span><span class="op">)</span><span class="op">[</span><span class="op">:</span><span class="num">12</span><span class="op">]</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">return</span> <span class="nam">table</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="key">def</span> <span class="nam">merge_ids_lists</span><span class="op">(</span><span class="nam">lookups_pubkey</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">lookups_uid</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">currency</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> merge two lists of identities and remove duplicate identities.</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">ids</span> <span class="op">=</span> <span class="nam">ids_list_from_lookups</span><span class="op">(</span><span class="nam">lookups_pubkey</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="nam">ids_uid</span> <span class="op">=</span> <span class="nam">ids_list_from_lookups</span><span class="op">(</span><span class="nam">lookups_uid</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">for</span> <span class="nam">_id</span> <span class="key">in</span> <span class="nam">ids_uid</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="com"># __equal__ does not work. This is condition "id in ids".</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">for</span> <span class="nam">listed_id</span> <span class="key">in</span> <span class="nam">ids</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">if</span> <span class="nam">_id</span><span class="op">.</span><span class="nam">signed_raw</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="nam">listed_id</span><span class="op">.</span><span class="nam">signed_raw</span><span class="op">(</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">id_in_ids</span> <span class="op">=</span> <span class="key">True</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">id_in_ids</span> <span class="op">=</span> <span class="key">False</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">id_in_ids</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">ids</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">_id</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="key">return</span> <span class="nam">ids</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"><span class="key">def</span> <span class="nam">ids_list_from_lookups</span><span class="op">(</span><span class="nam">lookups</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">currency</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">ids</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="key">for</span> <span class="nam">lookup</span> <span class="key">in</span> <span class="nam">lookups</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">pubkey</span> <span class="op">=</span> <span class="nam">lookup</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">lookup_ids</span> <span class="op">=</span> <span class="nam">lookup</span><span class="op">[</span><span class="str">"uids"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="key">for</span> <span class="nam">_id</span> <span class="key">in</span> <span class="nam">lookup_ids</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">appended_id</span> <span class="op">=</span> <span class="nam">Identity</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="nam">currency</span><span class="op">=</span><span class="nam">currency</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="nam">pubkey</span><span class="op">=</span><span class="nam">pubkey</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">uid</span><span class="op">=</span><span class="nam">_id</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">block_id</span><span class="op">=</span><span class="nam">BlockID</span><span class="op">.</span><span class="nam">from_str</span><span class="op">(</span><span class="nam">_id</span><span class="op">[</span><span class="str">"meta"</span><span class="op">]</span><span class="op">[</span><span class="str">"timestamp"</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="nam">appended_id</span><span class="op">.</span><span class="nam">signature</span> <span class="op">=</span> <span class="nam">_id</span><span class="op">[</span><span class="str">"self"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">ids</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">appended_id</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="key">return</span> <span class="nam">ids</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">creation_date</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">creation_block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">ALL</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">id_table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"Created on"</span><span class="op">,</span> <span class="nam">creation_date</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="com"># display infos</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">Texttable</span><span class="op">(</span><span class="nam">max_width</span><span class="op">=</span><span class="nam">shutil</span><span class="op">.</span><span class="nam">get_terminal_size</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">columns</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">add_rows</span><span class="op">(</span><span class="nam">id_table</span><span class="op">,</span> <span class="nam">header</span><span class="op">=</span><span class="key">False</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">return</span> <span class="nam">table</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"><span class="key">def</span> <span class="nam">check_many_identities</span><span class="op">(</span><span class="nam">document</span><span class="op">:</span> <span class="nam">Union</span><span class="op">[</span><span class="nam">Identity</span><span class="op">,</span> <span class="nam">Revocation</span><span class="op">]</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> Checks if many identities match the one looked after.</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> Returns True if the same identity is found, False if not.</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">doc_type</span> <span class="op">=</span> <span class="nam">document</span><span class="op">.</span><span class="nam">__class__</span><span class="op">.</span><span class="nam">__name__</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">error_no_identical_id</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">doc_type</span><span class="op">}</span><span class="fst"> document does not match any valid identity.</span><span class="fst">"</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="nam">document</span> <span class="key">if</span> <span class="nam">doc_type</span> <span class="op">==</span> <span class="str">"Identity"</span> <span class="key">else</span> <span class="nam">document</span><span class="op">.</span><span class="nam">identity</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">try</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">results_pubkey</span> <span class="op">=</span> <span class="nam">wot_lookup</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">results_uid</span> <span class="op">=</span> <span class="nam">wot_lookup</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">uid</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">except</span> <span class="nam">urllib</span><span class="op">.</span><span class="nam">error</span><span class="op">.</span><span class="nam">HTTPError</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">sys</span><span class="op">.</span><span class="nam">exit</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="fst">f"</span><span class="op">{</span><span class="nam">error_no_identical_id</span><span class="op">}</span><span class="fst">\nuid: </span><span class="op">{</span><span class="nam">idty</span><span class="op">.</span><span class="nam">uid</span><span class="op">}</span><span class="fst">\npubkey: \</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">idty</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="com"># get all matching identities</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">lookup_ids</span> <span class="op">=</span> <span class="nam">merge_ids_lists</span><span class="op">(</span><span class="nam">results_pubkey</span><span class="op">,</span> <span class="nam">results_uid</span><span class="op">,</span> <span class="nam">idty</span><span class="op">.</span><span class="nam">currency</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">match</span> <span class="op">=</span> <span class="key">False</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">for</span> <span class="nam">n</span><span class="op">,</span> <span class="nam">lookup</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">lookup_ids</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">if</span> <span class="nam">idty</span> <span class="op">==</span> <span class="nam">lookup</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">lookup_ids</span><span class="op">.</span><span class="nam">pop</span><span class="op">(</span><span class="nam">n</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">match</span> <span class="op">=</span> <span class="key">True</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">alternate_ids</span> <span class="op">=</span> <span class="nam">display_alternate_ids</span><span class="op">(</span><span class="nam">lookup_ids</span><span class="op">)</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">if</span> <span class="nam">match</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">lookup_ids</span><span class="op">)</span> <span class="op">>=</span> <span class="num">1</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">click</span><span class="op">.</span><span class="nam">echo</span><span class="op">(</span><span class="fst">f"</span><span class="fst">One matching identity!\nSimilar identities:\n</span><span class="op">{</span><span class="nam">alternate_ids</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="nam">click</span><span class="op">.</span><span class="nam">echo</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">error_no_identical_id</span><span class="op">}</span><span class="fst">\nSimilar identities:\n</span><span class="op">{</span><span class="nam">alternate_ids</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="key">def</span> <span class="nam">display_alternate_ids</span><span class="op">(</span><span class="nam">ids_list</span><span class="op">:</span> <span class="nam">list</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Texttable</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">labels</span> <span class="op">=</span> <span class="op">[</span><span class="str">"uid"</span><span class="op">,</span> <span class="str">"public key"</span><span class="op">,</span> <span class="str">"timestamp"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">Texttable</span><span class="op">(</span><span class="nam">max_width</span><span class="op">=</span><span class="nam">shutil</span><span class="op">.</span><span class="nam">get_terminal_size</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">columns</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">header</span><span class="op">(</span><span class="nam">labels</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="key">for</span> <span class="nam">_id</span> <span class="key">in</span> <span class="nam">ids_list</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">add_row</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="op">[</span><span class="nam">_id</span><span class="op">.</span><span class="nam">uid</span><span class="op">,</span> <span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">_id</span><span class="op">.</span><span class="nam">pubkey</span><span class="op">)</span><span class="op">,</span> <span class="nam">str</span><span class="op">(</span><span class="nam">_id</span><span class="op">.</span><span class="nam">block_id</span><span class="op">)</span><span class="op">[</span><span class="op">:</span><span class="num">12</span><span class="op">]</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">return</span> <span class="nam">table</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="key">def</span> <span class="nam">merge_ids_lists</span><span class="op">(</span><span class="nam">lookups_pubkey</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">lookups_uid</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">currency</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="str">"""</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> merge two lists of identities and remove duplicate identities.</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> """</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">ids</span> <span class="op">=</span> <span class="nam">ids_list_from_lookups</span><span class="op">(</span><span class="nam">lookups_pubkey</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">ids_uid</span> <span class="op">=</span> <span class="nam">ids_list_from_lookups</span><span class="op">(</span><span class="nam">lookups_uid</span><span class="op">,</span> <span class="nam">currency</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">for</span> <span class="nam">_id</span> <span class="key">in</span> <span class="nam">ids_uid</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="com"># __equal__ does not work. This is condition "id in ids".</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">for</span> <span class="nam">listed_id</span> <span class="key">in</span> <span class="nam">ids</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">if</span> <span class="nam">_id</span><span class="op">.</span><span class="nam">signed_raw</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="nam">listed_id</span><span class="op">.</span><span class="nam">signed_raw</span><span class="op">(</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">id_in_ids</span> <span class="op">=</span> <span class="key">True</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">id_in_ids</span> <span class="op">=</span> <span class="key">False</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">id_in_ids</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">ids</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">_id</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="key">return</span> <span class="nam">ids</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"><span class="key">def</span> <span class="nam">ids_list_from_lookups</span><span class="op">(</span><span class="nam">lookups</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> <span class="nam">currency</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">ids</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="key">for</span> <span class="nam">lookup</span> <span class="key">in</span> <span class="nam">lookups</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">pubkey</span> <span class="op">=</span> <span class="nam">lookup</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">lookup_ids</span> <span class="op">=</span> <span class="nam">lookup</span><span class="op">[</span><span class="str">"uids"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="key">for</span> <span class="nam">_id</span> <span class="key">in</span> <span class="nam">lookup_ids</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="nam">appended_id</span> <span class="op">=</span> <span class="nam">Identity</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">currency</span><span class="op">=</span><span class="nam">currency</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">pubkey</span><span class="op">=</span><span class="nam">pubkey</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="nam">uid</span><span class="op">=</span><span class="nam">_id</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="nam">block_id</span><span class="op">=</span><span class="nam">BlockID</span><span class="op">.</span><span class="nam">from_str</span><span class="op">(</span><span class="nam">_id</span><span class="op">[</span><span class="str">"meta"</span><span class="op">]</span><span class="op">[</span><span class="str">"timestamp"</span><span class="op">]</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">appended_id</span><span class="op">.</span><span class="nam">signature</span> <span class="op">=</span> <span class="nam">_id</span><span class="op">[</span><span class="str">"self"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="nam">ids</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">appended_id</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="key">return</span> <span class="nam">ids</span> </span><span class="r"></span></p> </main> <footer> <div class="content"> @@ -218,7 +220,7 @@ <a class="nav" href="z_e099210adb7d42f0_lookup_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_lookup_py.html b/0.12/coverage/z_e099210adb7d42f0_lookup_py.html index 31487f62f2681e24215927e9b1d422404455b2e4..8290e0d5437ba3069857c902fefca117e1a3a9e8 100644 --- a/0.12/coverage/z_e099210adb7d42f0_lookup_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_lookup_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_membership_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -131,7 +131,7 @@ <a class="nav" href="z_e099210adb7d42f0_membership_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_membership_py.html b/0.12/coverage/z_e099210adb7d42f0_membership_py.html index f7613a3e8f378884406db546e53efe384569b3dd..b47e24efcb5f7422c0564751396a181238c94d65 100644 --- a/0.12/coverage/z_e099210adb7d42f0_membership_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_membership_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_revocation_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -97,7 +97,7 @@ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">bma</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">documents</span> <span class="key">import</span> <span class="nam">BlockID</span><span class="op">,</span> <span class="nam">Membership</span><span class="op">,</span> <span class="nam">get_block_id</span> </span><span class="r"></span></p> @@ -186,7 +186,7 @@ <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">if</span> <span class="nam">membership_expires</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">expires</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">membership_expires</span><span class="op">)</span><span class="op">.</span><span class="nam">humanize</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">expires</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">membership_expires</span><span class="op">)</span><span class="op">.</span><span class="nam">diff_for_humans</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">[</span><span class="str">"Expiration date of current membership"</span><span class="op">,</span> <span class="nam">expires</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">if</span> <span class="nam">pending_memberships</span><span class="op">:</span> </span><span class="r"></span></p> @@ -200,7 +200,7 @@ <p class="run"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="op">[</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="str">"Pending membership documents will expire"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">pending_expires</span><span class="op">)</span><span class="op">.</span><span class="nam">humanize</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">pending_expires</span><span class="op">)</span><span class="op">.</span><span class="nam">diff_for_humans</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> </span><span class="r"></span></p> @@ -213,7 +213,7 @@ <p class="run"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="op">[</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="str">"Identity published"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> </span><span class="r"></span></p> @@ -221,14 +221,14 @@ <p class="run"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="op">[</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="str">"Expiration date of new membership"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">params</span><span class="op">[</span><span class="str">"msValidity"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">humanize</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">params</span><span class="op">[</span><span class="str">"msValidity"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">diff_for_humans</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="op">[</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="str">"Expiration date of new membership from the mempool"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">params</span><span class="op">[</span><span class="str">"msPeriod"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">humanize</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">params</span><span class="op">[</span><span class="str">"msPeriod"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">diff_for_humans</span><span class="op">(</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> </span><span class="r"></span></p> @@ -262,7 +262,7 @@ <a class="nav" href="z_e099210adb7d42f0_revocation_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_revocation_py.html b/0.12/coverage/z_e099210adb7d42f0_revocation_py.html index c843ef5899f6025a5e0a32c5aca8c33ceaaa2a1b..0d32ba00326f5a1c9b42116ca8f48ef70a99b2a4 100644 --- a/0.12/coverage/z_e099210adb7d42f0_revocation_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_revocation_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_status_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -294,7 +294,7 @@ <a class="nav" href="z_e099210adb7d42f0_status_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_status_py.html b/0.12/coverage/z_e099210adb7d42f0_status_py.html index 4cfd93ebbc5ea617512c4e73586aed77fcb4d467..18632b7052c0350a5d702ed6c0d739acc9543f7e 100644 --- a/0.12/coverage/z_e099210adb7d42f0_status_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_status_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e099210adb7d42f0_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -95,7 +95,7 @@ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="com"># You should have received a copy of the GNU Affero General Public License</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="com"># along with Silkaj. If not, see <https://www.gnu.org/licenses/>.</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">bma</span> <span class="key">import</span> <span class="nam">blockchain</span><span class="op">,</span> <span class="nam">wot</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> </span><span class="r"></span></p> @@ -140,7 +140,7 @@ <p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">for</span> <span class="nam">req_cert</span> <span class="key">in</span> <span class="nam">req</span><span class="op">[</span><span class="str">"certifications"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">if</span> <span class="nam">req_cert</span><span class="op">[</span><span class="str">"from"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">lookup_cert</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">certifications</span><span class="op">[</span><span class="str">"received_expire"</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">req_cert</span><span class="op">[</span><span class="str">"expiresIn"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">req_cert</span><span class="op">[</span><span class="str">"expiresIn"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">certifications</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">lookup_cert</span><span class="op">[</span><span class="str">'uids'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">}</span><span class="fst"> ✔</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> @@ -149,89 +149,93 @@ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="fst">f"</span><span class="op">{</span><span class="op">(</span><span class="nam">wt</span><span class="op">.</span><span class="nam">identity_of</span><span class="op">(</span><span class="nam">pending_cert</span><span class="op">[</span><span class="str">'from'</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> ✘</span><span class="fst">"</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">certifications</span><span class="op">[</span><span class="str">"received_expire"</span><span class="op">]</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">pending_cert</span><span class="op">[</span><span class="str">"expires_on"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">certifications</span><span class="op">[</span><span class="str">"sent"</span><span class="op">]</span><span class="op">,</span> <span class="nam">certifications</span><span class="op">[</span><span class="str">"sent_expire"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">get_sent_certifications</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">signed</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">params</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">nbr_sent_certs</span> <span class="op">=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">"sent"</span><span class="op">]</span><span class="op">)</span> <span class="key">if</span> <span class="str">"sent"</span> <span class="key">in</span> <span class="nam">certifications</span> <span class="key">else</span> <span class="num">0</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">pending_cert</span><span class="op">[</span><span class="str">"expires_on"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">DATE</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">certifications</span><span class="op">[</span><span class="str">"sent"</span><span class="op">]</span><span class="op">,</span> <span class="nam">certifications</span><span class="op">[</span><span class="str">"sent_expire"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">get_sent_certifications</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">signed</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">params</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_from_dict</span><span class="op">(</span><span class="nam">certifications</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="fst">f"</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> (</span><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span><span class="op">}</span><span class="fst">) \</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"><span class="fst">from block #</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'meta'</span><span class="op">]</span><span class="op">[</span><span class="str">'timestamp'</span><span class="op">]</span><span class="op">[</span><span class="op">:</span><span class="num">15</span><span class="op">]</span><span class="op">}</span><span class="fst">…\n\</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"><span class="fst">received </span><span class="op">{</span><span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">'received'</span><span class="op">]</span><span class="op">)</span><span class="op">}</span><span class="fst"> and sent \</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"><span class="op">{</span><span class="nam">nbr_sent_certs</span><span class="op">}</span><span class="fst">/</span><span class="op">{</span><span class="nam">params</span><span class="op">[</span><span class="str">'sigStock'</span><span class="op">]</span><span class="op">}</span><span class="fst"> certifications:\n\</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="op">{</span><span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">}</span><span class="fst">\n\</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"><span class="fst">✔: Certification written in the blockchain\n\</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"><span class="fst">✘: Pending certification, deadline treatment\n</span><span class="fst">"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">membership_status</span><span class="op">(</span><span class="nam">certifications</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">req</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"><span class="key">def</span> <span class="nam">membership_status</span><span class="op">(</span><span class="nam">certifications</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">req</span><span class="op">:</span> <span class="nam">dict</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="nam">params</span> <span class="op">=</span> <span class="nam">get_blockchain_parameters</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">)</span> <span class="op">>=</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigQty"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">date</span> <span class="op">=</span> <span class="nam">certifications</span><span class="op">[</span><span class="str">"received_expire"</span><span class="op">]</span><span class="op">[</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">)</span> <span class="op">-</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigQty"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Membership expiration due to certification expirations: </span><span class="op">{</span><span class="nam">date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="nam">member_lookup</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">is_member</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">is_member</span> <span class="op">=</span> <span class="nam">bool</span><span class="op">(</span><span class="nam">member_lookup</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"member:"</span><span class="op">,</span> <span class="nam">is_member</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">if</span> <span class="nam">req</span><span class="op">[</span><span class="str">"revoked"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">revoke_date</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">req</span><span class="op">[</span><span class="str">"revoked_on"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">revoked: </span><span class="op">{</span><span class="nam">req</span><span class="op">[</span><span class="str">'revoked'</span><span class="op">]</span><span class="op">}</span><span class="fst">\nrevoked on: </span><span class="op">{</span><span class="nam">revoke_date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">is_member</span> <span class="key">and</span> <span class="nam">req</span><span class="op">[</span><span class="str">"wasMember"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"expired:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"expired"</span><span class="op">]</span><span class="op">,</span> <span class="str">"\nwasMember:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"wasMember"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">elif</span> <span class="nam">is_member</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">expiration_date</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">shift</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">req</span><span class="op">[</span><span class="str">"membershipExpiresIn"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Membership document expiration: </span><span class="op">{</span><span class="nam">expiration_date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"Sentry:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"isSentry"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"outdistanced:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"outdistanced"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"><span class="key">def</span> <span class="nam">get_sent_certifications</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">signed</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="nam">params</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">tuple</span><span class="op">[</span><span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">sent</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">expire</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">if</span> <span class="nam">signed</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="key">for</span> <span class="nam">cert</span> <span class="key">in</span> <span class="nam">signed</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">sent</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">cert</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">expire</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="nam">expiration_date_from_block_id</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="nam">cert</span><span class="op">[</span><span class="str">"cert_time"</span><span class="op">]</span><span class="op">[</span><span class="str">"block"</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">params</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="key">return</span> <span class="nam">sent</span><span class="op">,</span> <span class="nam">expire</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"><span class="key">def</span> <span class="nam">expiration_date_from_block_id</span><span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="nam">block_id</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="nam">params</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">expir_timestamp</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="nam">date_approximation</span><span class="op">(</span><span class="nam">block_id</span><span class="op">,</span> <span class="nam">time_first_block</span><span class="op">,</span> <span class="nam">params</span><span class="op">[</span><span class="str">"avgGenTime"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="op">+</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigValidity"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="key">return</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">expir_timestamp</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"><span class="key">def</span> <span class="nam">date_approximation</span><span class="op">(</span><span class="nam">block_id</span><span class="op">,</span> <span class="nam">time_first_block</span><span class="op">,</span> <span class="nam">avgentime</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="key">return</span> <span class="nam">time_first_block</span> <span class="op">+</span> <span class="nam">block_id</span> <span class="op">*</span> <span class="nam">avgentime</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">nbr_sent_certs</span> <span class="op">=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">"sent"</span><span class="op">]</span><span class="op">)</span> <span class="key">if</span> <span class="str">"sent"</span> <span class="key">in</span> <span class="nam">certifications</span> <span class="key">else</span> <span class="num">0</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_from_dict</span><span class="op">(</span><span class="nam">certifications</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="fst">f"</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'uid'</span><span class="op">]</span><span class="op">}</span><span class="fst"> (</span><span class="op">{</span><span class="nam">gen_pubkey_checksum</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span><span class="op">}</span><span class="fst">) \</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"><span class="fst">from block #</span><span class="op">{</span><span class="nam">identity</span><span class="op">[</span><span class="str">'meta'</span><span class="op">]</span><span class="op">[</span><span class="str">'timestamp'</span><span class="op">]</span><span class="op">[</span><span class="op">:</span><span class="num">15</span><span class="op">]</span><span class="op">}</span><span class="fst">…\n\</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="fst">received </span><span class="op">{</span><span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">'received'</span><span class="op">]</span><span class="op">)</span><span class="op">}</span><span class="fst"> and sent \</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"><span class="op">{</span><span class="nam">nbr_sent_certs</span><span class="op">}</span><span class="fst">/</span><span class="op">{</span><span class="nam">params</span><span class="op">[</span><span class="str">'sigStock'</span><span class="op">]</span><span class="op">}</span><span class="fst"> certifications:\n\</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"><span class="op">{</span><span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">}</span><span class="fst">\n\</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"><span class="fst">✔: Certification written in the blockchain\n\</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"><span class="fst">✘: Pending certification, deadline treatment\n</span><span class="fst">"</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">membership_status</span><span class="op">(</span><span class="nam">certifications</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">,</span> <span class="nam">req</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="key">def</span> <span class="nam">membership_status</span><span class="op">(</span><span class="nam">certifications</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> <span class="nam">pubkey</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">req</span><span class="op">:</span> <span class="nam">dict</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">params</span> <span class="op">=</span> <span class="nam">get_blockchain_parameters</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">)</span> <span class="op">>=</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigQty"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">date</span> <span class="op">=</span> <span class="nam">certifications</span><span class="op">[</span><span class="str">"received_expire"</span><span class="op">]</span><span class="op">[</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">len</span><span class="op">(</span><span class="nam">certifications</span><span class="op">[</span><span class="str">"received"</span><span class="op">]</span><span class="op">)</span> <span class="op">-</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigQty"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Membership expiration due to certification expirations: </span><span class="op">{</span><span class="nam">date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">member_lookup</span> <span class="op">=</span> <span class="nam">wt</span><span class="op">.</span><span class="nam">is_member</span><span class="op">(</span><span class="nam">pubkey</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">is_member</span> <span class="op">=</span> <span class="nam">bool</span><span class="op">(</span><span class="nam">member_lookup</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"member:"</span><span class="op">,</span> <span class="nam">is_member</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">if</span> <span class="nam">req</span><span class="op">[</span><span class="str">"revoked"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">revoke_date</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">req</span><span class="op">[</span><span class="str">"revoked_on"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">DATE</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">revoked: </span><span class="op">{</span><span class="nam">req</span><span class="op">[</span><span class="str">'revoked'</span><span class="op">]</span><span class="op">}</span><span class="fst">\nrevoked on: </span><span class="op">{</span><span class="nam">revoke_date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">is_member</span> <span class="key">and</span> <span class="nam">req</span><span class="op">[</span><span class="str">"wasMember"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"expired:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"expired"</span><span class="op">]</span><span class="op">,</span> <span class="str">"\nwasMember:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"wasMember"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="key">elif</span> <span class="nam">is_member</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">expiration_date</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">add</span><span class="op">(</span><span class="nam">seconds</span><span class="op">=</span><span class="nam">req</span><span class="op">[</span><span class="str">"membershipExpiresIn"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Membership document expiration: </span><span class="op">{</span><span class="nam">expiration_date</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"Sentry:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"isSentry"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"outdistanced:"</span><span class="op">,</span> <span class="nam">req</span><span class="op">[</span><span class="str">"outdistanced"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="key">def</span> <span class="nam">get_sent_certifications</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">signed</span><span class="op">:</span> <span class="nam">list</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="nam">params</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">tuple</span><span class="op">[</span><span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">sent</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">expire</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="key">if</span> <span class="nam">signed</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="key">for</span> <span class="nam">cert</span> <span class="key">in</span> <span class="nam">signed</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="nam">sent</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">cert</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">expire</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="nam">expiration_date_from_block_id</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="nam">cert</span><span class="op">[</span><span class="str">"cert_time"</span><span class="op">]</span><span class="op">[</span><span class="str">"block"</span><span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="nam">params</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="key">return</span> <span class="nam">sent</span><span class="op">,</span> <span class="nam">expire</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"><span class="key">def</span> <span class="nam">expiration_date_from_block_id</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">block_id</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="nam">time_first_block</span><span class="op">:</span> <span class="nam">int</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">params</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="nam">expir_timestamp</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="nam">date_approximation</span><span class="op">(</span><span class="nam">block_id</span><span class="op">,</span> <span class="nam">time_first_block</span><span class="op">,</span> <span class="nam">params</span><span class="op">[</span><span class="str">"avgGenTime"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="op">+</span> <span class="nam">params</span><span class="op">[</span><span class="str">"sigValidity"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="key">return</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">expir_timestamp</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">DATE</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"><span class="key">def</span> <span class="nam">date_approximation</span><span class="op">(</span><span class="nam">block_id</span><span class="op">,</span> <span class="nam">time_first_block</span><span class="op">,</span> <span class="nam">avgentime</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="key">return</span> <span class="nam">time_first_block</span> <span class="op">+</span> <span class="nam">block_id</span> <span class="op">*</span> <span class="nam">avgentime</span> </span><span class="r"></span></p> </main> <footer> <div class="content"> @@ -241,7 +245,7 @@ <a class="nav" href="z_e099210adb7d42f0_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e099210adb7d42f0_tools_py.html b/0.12/coverage/z_e099210adb7d42f0_tools_py.html index 242efad1f45e5ffddc7955b7f461f2c9af117277..744bba12ab0e60c22416c456180d3381396d6cc6 100644 --- a/0.12/coverage/z_e099210adb7d42f0_tools_py.html +++ b/0.12/coverage/z_e099210adb7d42f0_tools_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="covindex.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -218,7 +218,7 @@ <a class="nav" href="covindex.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e7a021a3963ba4f1___init___py.html b/0.12/coverage/z_e7a021a3963ba4f1___init___py.html index 44df997fc76b02b8849c0917f53c3341927e9bba..52dde8721097f40c2a795e0b87ffd85ca2f7a7fa 100644 --- a/0.12/coverage/z_e7a021a3963ba4f1___init___py.html +++ b/0.12/coverage/z_e7a021a3963ba4f1___init___py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_blocks_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -103,7 +103,7 @@ <a class="nav" href="z_e7a021a3963ba4f1_blocks_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html b/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html index 1affba186a8cb2d086ff4c2648e590b3a6210943..e9e393817297def70cec871ba61d3fbb18178ed3 100644 --- a/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html +++ b/0.12/coverage/z_e7a021a3963ba4f1_blocks_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_difficulty_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -99,7 +99,7 @@ <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">from</span> <span class="nam">operator</span> <span class="key">import</span> <span class="nam">itemgetter</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">urllib</span><span class="op">.</span><span class="nam">error</span> <span class="key">import</span> <span class="nam">HTTPError</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">bma</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> </span><span class="r"></span></p> @@ -132,70 +132,72 @@ <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">block</span><span class="op">[</span><span class="str">"issuer"</span><span class="op">]</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">if</span> <span class="nam">detailed</span> <span class="key">or</span> <span class="nam">number</span> <span class="op"><=</span> <span class="num">30</span><span class="op">:</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"block"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">block</span><span class="op">[</span><span class="str">"number"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"gentime"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"mediantime"</span><span class="op">]</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">block</span><span class="op">[</span><span class="str">"medianTime"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"hash"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">block</span><span class="op">[</span><span class="str">"hash"</span><span class="op">]</span><span class="op">[</span><span class="op">:</span><span class="num">10</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"powMin"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">block</span><span class="op">[</span><span class="str">"powMin"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">issuers_dict</span><span class="op">[</span><span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="nam">issuer</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">issuers</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">issuer</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="key">for</span> <span class="nam">pubkey</span> <span class="key">in</span> <span class="nam">issuers_dict</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">issuer</span> <span class="op">=</span> <span class="nam">issuers_dict</span><span class="op">[</span><span class="nam">pubkey</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">time</span><span class="op">.</span><span class="nam">sleep</span><span class="op">(</span><span class="nam">BMA_SLEEP</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">try</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="nam">identity_of</span><span class="op">(</span><span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">except</span> <span class="nam">HTTPError</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="key">None</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="key">for</span> <span class="nam">issuer2</span> <span class="key">in</span> <span class="nam">issuers</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="key">if</span> <span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">issuer2</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"pubkey"</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">and</span> <span class="nam">issuer</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"pubkey"</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">and</span> <span class="nam">issuer2</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">issuer2</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">idty</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="key">if</span> <span class="nam">idty</span> <span class="key">else</span> <span class="key">None</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">issuer2</span><span class="op">.</span><span class="nam">pop</span><span class="op">(</span><span class="str">"pubkey"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">print_blocks_views</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">current_nbr</span><span class="op">,</span> <span class="nam">number</span><span class="op">,</span> <span class="nam">detailed</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"><span class="key">def</span> <span class="nam">print_blocks_views</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">current_nbr</span><span class="op">,</span> <span class="nam">number</span><span class="op">,</span> <span class="nam">detailed</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">header</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="fst">f"</span><span class="fst">Last </span><span class="op">{</span><span class="nam">number</span><span class="op">}</span><span class="fst"> blocks from n°</span><span class="op">{</span><span class="nam">current_nbr</span> <span class="op">-</span> <span class="nam">number</span> <span class="op">+</span> <span class="num">1</span><span class="op">}</span><span class="fst"> to n°</span><span class="op">{</span><span class="nam">current_nbr</span><span class="op">}</span><span class="fst">"</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">header</span><span class="op">,</span> <span class="nam">end</span><span class="op">=</span><span class="str">" "</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">if</span> <span class="nam">detailed</span> <span class="key">or</span> <span class="nam">number</span> <span class="op"><=</span> <span class="num">30</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">sorted_list</span> <span class="op">=</span> <span class="nam">sorted</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">key</span><span class="op">=</span><span class="nam">itemgetter</span><span class="op">(</span><span class="str">"block"</span><span class="op">)</span><span class="op">,</span> <span class="nam">reverse</span><span class="op">=</span><span class="key">True</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">tui</span><span class="op">.</span><span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"l"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_from_dict_list</span><span class="op">(</span><span class="nam">sorted_list</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"l"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">\n</span><span class="op">{</span><span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="key">else</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="nam">list_issued</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">for</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">issuers</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">found</span> <span class="op">=</span> <span class="key">False</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">for</span> <span class="nam">issued</span> <span class="key">in</span> <span class="nam">list_issued</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">if</span> <span class="nam">issued</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"uid"</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">issued</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"blocks"</span><span class="op">]</span> <span class="op">+=</span> <span class="num">1</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="nam">found</span> <span class="op">=</span> <span class="key">True</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">found</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">issued</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"blocks"</span><span class="op">]</span> <span class="op">=</span> <span class="num">1</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">list_issued</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">issued</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">for</span> <span class="nam">issued</span> <span class="key">in</span> <span class="nam">list_issued</span><span class="op">:</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"percent"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">round</span><span class="op">(</span><span class="nam">issued</span><span class="op">[</span><span class="str">"blocks"</span><span class="op">]</span> <span class="op">/</span> <span class="nam">number</span> <span class="op">*</span> <span class="num">100</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">sorted_list</span> <span class="op">=</span> <span class="nam">sorted</span><span class="op">(</span><span class="nam">list_issued</span><span class="op">,</span> <span class="nam">key</span><span class="op">=</span><span class="nam">itemgetter</span><span class="op">(</span><span class="str">"blocks"</span><span class="op">)</span><span class="op">,</span> <span class="nam">reverse</span><span class="op">=</span><span class="key">True</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">tui</span><span class="op">.</span><span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_from_dict_list</span><span class="op">(</span><span class="nam">sorted_list</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"l"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">from </span><span class="op">{</span><span class="nam">len</span><span class="op">(</span><span class="nam">list_issued</span><span class="op">)</span><span class="op">}</span><span class="fst"> issuers\n</span><span class="op">{</span><span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"gentime"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"mediantime"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">block</span><span class="op">[</span><span class="str">"medianTime"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"hash"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">block</span><span class="op">[</span><span class="str">"hash"</span><span class="op">]</span><span class="op">[</span><span class="op">:</span><span class="num">10</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">issuer</span><span class="op">[</span><span class="str">"powMin"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">block</span><span class="op">[</span><span class="str">"powMin"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">issuers_dict</span><span class="op">[</span><span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">]</span> <span class="op">=</span> <span class="nam">issuer</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">issuers</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">issuer</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">for</span> <span class="nam">pubkey</span> <span class="key">in</span> <span class="nam">issuers_dict</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">issuer</span> <span class="op">=</span> <span class="nam">issuers_dict</span><span class="op">[</span><span class="nam">pubkey</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">time</span><span class="op">.</span><span class="nam">sleep</span><span class="op">(</span><span class="nam">BMA_SLEEP</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">try</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="nam">identity_of</span><span class="op">(</span><span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="key">except</span> <span class="nam">HTTPError</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">idty</span> <span class="op">=</span> <span class="key">None</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">for</span> <span class="nam">issuer2</span> <span class="key">in</span> <span class="nam">issuers</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">if</span> <span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">issuer2</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"pubkey"</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="key">and</span> <span class="nam">issuer</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"pubkey"</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">and</span> <span class="nam">issuer2</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"pubkey"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">issuer2</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">idty</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="key">if</span> <span class="nam">idty</span> <span class="key">else</span> <span class="key">None</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">issuer2</span><span class="op">.</span><span class="nam">pop</span><span class="op">(</span><span class="str">"pubkey"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">print_blocks_views</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">current_nbr</span><span class="op">,</span> <span class="nam">number</span><span class="op">,</span> <span class="nam">detailed</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="key">def</span> <span class="nam">print_blocks_views</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">current_nbr</span><span class="op">,</span> <span class="nam">number</span><span class="op">,</span> <span class="nam">detailed</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">header</span> <span class="op">=</span> <span class="op">(</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="fst">f"</span><span class="fst">Last </span><span class="op">{</span><span class="nam">number</span><span class="op">}</span><span class="fst"> blocks from n°</span><span class="op">{</span><span class="nam">current_nbr</span> <span class="op">-</span> <span class="nam">number</span> <span class="op">+</span> <span class="num">1</span><span class="op">}</span><span class="fst"> to n°</span><span class="op">{</span><span class="nam">current_nbr</span><span class="op">}</span><span class="fst">"</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">header</span><span class="op">,</span> <span class="nam">end</span><span class="op">=</span><span class="str">" "</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="key">if</span> <span class="nam">detailed</span> <span class="key">or</span> <span class="nam">number</span> <span class="op"><=</span> <span class="num">30</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="nam">sorted_list</span> <span class="op">=</span> <span class="nam">sorted</span><span class="op">(</span><span class="nam">issuers</span><span class="op">,</span> <span class="nam">key</span><span class="op">=</span><span class="nam">itemgetter</span><span class="op">(</span><span class="str">"block"</span><span class="op">)</span><span class="op">,</span> <span class="nam">reverse</span><span class="op">=</span><span class="key">True</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">tui</span><span class="op">.</span><span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"l"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_from_dict_list</span><span class="op">(</span><span class="nam">sorted_list</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"l"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">\n</span><span class="op">{</span><span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">else</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">list_issued</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">for</span> <span class="nam">issuer</span> <span class="key">in</span> <span class="nam">issuers</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">found</span> <span class="op">=</span> <span class="key">False</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="key">for</span> <span class="nam">issued</span> <span class="key">in</span> <span class="nam">list_issued</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="key">if</span> <span class="nam">issued</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"uid"</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">issued</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">==</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"blocks"</span><span class="op">]</span> <span class="op">+=</span> <span class="num">1</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">found</span> <span class="op">=</span> <span class="key">True</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">break</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">found</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">issued</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">issuer</span><span class="op">[</span><span class="str">"uid"</span><span class="op">]</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"blocks"</span><span class="op">]</span> <span class="op">=</span> <span class="num">1</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="nam">list_issued</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">issued</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">for</span> <span class="nam">issued</span> <span class="key">in</span> <span class="nam">list_issued</span><span class="op">:</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">issued</span><span class="op">[</span><span class="str">"percent"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">round</span><span class="op">(</span><span class="nam">issued</span><span class="op">[</span><span class="str">"blocks"</span><span class="op">]</span> <span class="op">/</span> <span class="nam">number</span> <span class="op">*</span> <span class="num">100</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">sorted_list</span> <span class="op">=</span> <span class="nam">sorted</span><span class="op">(</span><span class="nam">list_issued</span><span class="op">,</span> <span class="nam">key</span><span class="op">=</span><span class="nam">itemgetter</span><span class="op">(</span><span class="str">"blocks"</span><span class="op">)</span><span class="op">,</span> <span class="nam">reverse</span><span class="op">=</span><span class="key">True</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">tui</span><span class="op">.</span><span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">fill_from_dict_list</span><span class="op">(</span><span class="nam">sorted_list</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_align</span><span class="op">(</span><span class="op">[</span><span class="str">"l"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">,</span> <span class="str">"r"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="nam">table</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">from </span><span class="op">{</span><span class="nam">len</span><span class="op">(</span><span class="nam">list_issued</span><span class="op">)</span><span class="op">}</span><span class="fst"> issuers\n</span><span class="op">{</span><span class="nam">table</span><span class="op">.</span><span class="nam">draw</span><span class="op">(</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> </span><span class="r"></span></p> </main> <footer> <div class="content"> @@ -205,7 +207,7 @@ <a class="nav" href="z_e7a021a3963ba4f1_difficulty_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html b/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html index 523deb874a99971090feae3db0fce4f866187e82..f43242201f1a760e40b45fbb3553f5b32d397c7c 100644 --- a/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html +++ b/0.12/coverage/z_e7a021a3963ba4f1_difficulty_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_information_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -98,8 +98,8 @@ <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">from</span> <span class="nam">operator</span> <span class="key">import</span> <span class="nam">itemgetter</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">from</span> <span class="nam">os</span> <span class="key">import</span> <span class="nam">system</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">import</span> <span class="nam">jsonschema</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">import</span> <span class="nam">jsonschema</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span> <span class="key">import</span> <span class="nam">bma</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="key">from</span> <span class="nam">duniterpy</span><span class="op">.</span><span class="nam">api</span><span class="op">.</span><span class="nam">client</span> <span class="key">import</span> <span class="nam">WSConnection</span> </span><span class="r"></span></p> @@ -136,7 +136,7 @@ <p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">d</span><span class="op">[</span><span class="str">"Π diffi"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">compute_power</span><span class="op">(</span><span class="nam">match_pattern</span><span class="op">(</span><span class="nam">d</span><span class="op">[</span><span class="str">"level"</span><span class="op">]</span><span class="op">)</span><span class="op">[</span><span class="num">1</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">d</span><span class="op">[</span><span class="str">"Σ diffi"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">d</span><span class="op">.</span><span class="nam">pop</span><span class="op">(</span><span class="str">"level"</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">system</span><span class="op">(</span><span class="str">"cls||clear"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">block_gen</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">current</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">block_gen</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">current</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">match</span> <span class="op">=</span> <span class="nam">match_pattern</span><span class="op">(</span><span class="nam">int</span><span class="op">(</span><span class="nam">current</span><span class="op">[</span><span class="str">"powMin"</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> </span><span class="r"></span></p> <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">table</span> <span class="op">=</span> <span class="nam">tui</span><span class="op">.</span><span class="nam">Table</span><span class="op">(</span><span class="nam">style</span><span class="op">=</span><span class="str">"columns"</span><span class="op">)</span><span class="op">.</span><span class="nam">set_cols_dtype</span><span class="op">(</span><span class="op">[</span><span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"t"</span><span class="op">,</span> <span class="str">"i"</span><span class="op">]</span><span class="op">)</span> </span><span class="r"></span></p> @@ -177,7 +177,7 @@ <a class="nav" href="z_e7a021a3963ba4f1_information_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e7a021a3963ba4f1_information_py.html b/0.12/coverage/z_e7a021a3963ba4f1_information_py.html index 91bce46d06a8f59a7cb6df785657ddd554274497..b1085b35202e5edcd70dc8d4403bdd7cdcbae231 100644 --- a/0.12/coverage/z_e7a021a3963ba4f1_information_py.html +++ b/0.12/coverage/z_e7a021a3963ba4f1_information_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_e7a021a3963ba4f1_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -95,7 +95,7 @@ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="com"># You should have received a copy of the GNU Affero General Public License</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="com"># along with Silkaj. If not, see <https://www.gnu.org/licenses/>.</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">arrow</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">pendulum</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">import</span> <span class="nam">rich_click</span> <span class="key">as</span> <span class="nam">click</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">from</span> <span class="nam">silkaj</span><span class="op">.</span><span class="nam">blockchain</span><span class="op">.</span><span class="nam">tools</span> <span class="key">import</span> <span class="nam">get_head_block</span> </span><span class="r"></span></p> @@ -108,8 +108,8 @@ <p class="run"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="key">def</span> <span class="nam">currency_info</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">head_block</span> <span class="op">=</span> <span class="nam">get_head_block</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">ep</span> <span class="op">=</span> <span class="nam">determine_endpoint</span><span class="op">(</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">current_time</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">head_block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span> </span><span class="r"></span></p> - <p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">mediantime</span> <span class="op">=</span> <span class="nam">arrow</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">head_block</span><span class="op">[</span><span class="str">"medianTime"</span><span class="op">]</span><span class="op">)</span><span class="op">.</span><span class="nam">to</span><span class="op">(</span><span class="str">"local"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">current_time</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">head_block</span><span class="op">[</span><span class="str">"time"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span> </span><span class="r"></span></p> + <p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">mediantime</span> <span class="op">=</span> <span class="nam">pendulum</span><span class="op">.</span><span class="nam">from_timestamp</span><span class="op">(</span><span class="nam">head_block</span><span class="op">[</span><span class="str">"medianTime"</span><span class="op">]</span><span class="op">,</span> <span class="nam">tz</span><span class="op">=</span><span class="str">"local"</span><span class="op">)</span> </span><span class="r"></span></p> <p class="run"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="str">"Connected to node:"</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">ep</span><span class="op">.</span><span class="nam">host</span><span class="op">,</span> </span><span class="r"></span></p> @@ -127,7 +127,7 @@ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="str">"\nMedian time:"</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">mediantime</span><span class="op">.</span><span class="nam">format</span><span class="op">(</span><span class="nam">ALL</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="str">"\nDifference time:"</span><span class="op">,</span> </span><span class="r"></span></p> - <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">current_time</span> <span class="op">-</span> <span class="nam">mediantime</span><span class="op">,</span> </span><span class="r"></span></p> + <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">current_time</span><span class="op">.</span><span class="nam">diff_for_humans</span><span class="op">(</span><span class="nam">mediantime</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p> <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="op">)</span> </span><span class="r"></span></p> </main> <footer> @@ -138,7 +138,7 @@ <a class="nav" href="z_e7a021a3963ba4f1_tools_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html b/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html index a8382b40fb6c3eea8ce268a040faa84bd4a7a2fb..f59d730fc013bc15f7ec64e861017359364d6ee9 100644 --- a/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html +++ b/0.12/coverage/z_e7a021a3963ba4f1_tools_py.html @@ -65,7 +65,7 @@ <a id="nextFileLink" class="nav" href="z_c69109531bf836fe_checksum_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> <aside class="hidden"> <button type="button" class="button_next_chunk" data-shortcut="j"></button> @@ -126,7 +126,7 @@ <a class="nav" href="z_c69109531bf836fe_checksum_py.html">» next</a> <a class="nav" href="https://coverage.readthedocs.io/en/7.8.0">coverage.py v7.8.0</a>, - created at 2025-04-16 09:30 +0000 + created at 2025-04-22 12:04 +0000 </p> </div> </footer> diff --git a/0.12/index.html b/0.12/index.html index 3c0b7b4b622f18b0f4176ffd84ff2f6243d9499b..9b40a27e46b70fab5e09b2a325fdaccce111157f 100644 --- a/0.12/index.html +++ b/0.12/index.html @@ -18,7 +18,7 @@ <link rel="icon" href="images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -26,7 +26,7 @@ - <link rel="stylesheet" href="assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="assets/stylesheets/palette.06af60db.min.css"> @@ -756,6 +756,31 @@ + <li class="md-nav__item"> + <a href="blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="blog/2023/" class="md-nav__link"> diff --git a/0.12/install/index.html b/0.12/install/index.html index 95415af813e12c6556ad4029cf5bcfbe3f917e57..efa4b60df57e9934804a5f08e407a8869ec1be00 100644 --- a/0.12/install/index.html +++ b/0.12/install/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css"> @@ -938,6 +938,31 @@ + <li class="md-nav__item"> + <a href="../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../blog/2023/" class="md-nav__link"> diff --git a/0.12/search/search_index.json b/0.12/search/search_index.json index 6eef74ad9b12b53498078a63714eeb487c41520c..5e92a5c72013d7fac485825dba9d990b0c58f6f1 100644 --- a/0.12/search/search_index.json +++ b/0.12/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome","text":"<p>Welcome to Silkaj documentation</p> <p>Install Usage </p>"},{"location":"#what-is-silkaj","title":"What is Silkaj?","text":"<p>Silkaj is a command line client for \u011e1 libre currency powered by Duniter software.</p> <ul> <li> <p> Money management</p> <p>Transfer money, check your balance, and history stand.</p> </li> <li> <p> Web-of-Trust management</p> <p>Manage your certifications, membership, and revocation document.</p> </li> <li> <p> Account management</p> <p>With the wallet import format authentication method.</p> </li> <li> <p> CLI interface</p> <p>Silkaj is built around a command line interface design.</p> </li> <li> <p> Low requirements</p> <p>Written with Python, Silkaj is built with low requirements in mind.</p> </li> <li> <p> RTM compatible</p> <p>Silkaj is compatible with the Relative Theory of Money and includes \u011e1 Monetary License.</p> </li> <li> <p> Free software</p> <p>Silkaj is licensed under GNU\u00a0AGPL v3.</p> </li> </ul>"},{"location":"changelog/","title":"Changelog","text":""},{"location":"changelog/#0.11.2","title":"v0.11.2 November 22, 2023","text":"<ul> <li>#484: Support Python v3.12 on v0.11 release</li> </ul>"},{"location":"changelog/#pre-requisites","title":"Pre-requisites","text":"<ul> <li>disable <code>pylint</code> and <code>pyupgrade</code> hooks</li> <li>switch jobs to <code>3.12</code> image containing <code>pre-commit</code></li> <li>!195, duniterpy#205: Fix <code>gitlab-ci-linter</code> hook</li> </ul>"},{"location":"changelog/#support-python-v312","title":"Support Python v3.12","text":"<ul> <li>!237, #457: Drop Python v3.7 support</li> <li>Bump <code>pendulum</code> to <code>v3.0.0b1</code></li> <li>!238, !250, #448: Add support for Python v3.12</li> </ul>"},{"location":"changelog/#0.11.1","title":"v0.11.1 August 14, 2023","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206<ul> <li>Set tilde requirement, to allow future patch updates</li> </ul> </li> </ul>"},{"location":"changelog/#0.11.0","title":"v0.11.0 November 27, 2022","text":"<p>(Please see the full set of changes for this release also in v0.10.0rc0 note below)</p>"},{"location":"changelog/#cli","title":"CLI","text":"<ul> <li>!229, #430: Rename <code>certification</code> cmd to <code>certify</code> and <code>revocation save</code> to <code>revocation create</code></li> </ul>"},{"location":"changelog/#milestone-v0110","title":"Milestone v0.11.0","text":""},{"location":"changelog/#0.11.0rc0","title":"v0.11.0rc0 November 12, 2022","text":""},{"location":"changelog/#code","title":"Code","text":"<ul> <li>!199, #203: Migrate from <code>tabulate</code> to <code>texttable</code></li> <li>!216, #330: Repository restructuration</li> </ul>"},{"location":"changelog/#network","title":"Network","text":"<ul> <li>!211, #397: Replace singletons with <code>@functools.lru_cache()</code> decorator</li> <li>!220, #438, #411, #3: Add <code>sleep()</code> between <code>identity_of()</code> calls in a loop</li> </ul>"},{"location":"changelog/#cli_1","title":"CLI","text":"<ul> <li>!219, #430: Organize commands into subcommands</li> <li>!218, #436: Rename <code>tx</code> command to <code>transfer</code></li> <li>!223, #449: Get rid of <code>argos</code></li> </ul>"},{"location":"changelog/#dev-env","title":"Dev Env","text":"<ul> <li>!214, #163: Introduce type annotations for static typing with <code>mypy</code></li> <li>!227, #453: Support new <code>mypy</code> v0.990 reports</li> <li>!215, #292: Introduce <code>pylint</code> tool</li> <li>!212, #424: Introduce <code>flake8</code></li> <li>!222, #450: Replace <code>flake8</code> with <code>autoflake</code></li> <li>!210, #428: Introduce <code>pre-commit-hooks</code> and <code>mdformat</code> hooks</li> <li>!226, #451: <code>pre-commit:hooks</code> job doesn\u2019t appear</li> <li>!209, #408: Change workflow by changing from <code>master</code> and default <code>dev</code> branches to a single <code>main</code> branch</li> <li>!224, #441: Separate <code>unit</code> and <code>integration</code> tests</li> <li>!221, #442: Add support for Python v3.11</li> <li>!217, #447: Fix coverage integration into GitLab</li> </ul>"},{"location":"changelog/#documentation","title":"Documentation","text":"<ul> <li>!225, #224: Refactor <code>pip</code> install documentation: remove Windows part</li> <li>!225, #188, #293: Replace <code>pip</code> installation with <code>pipx</code></li> <li>#432: List printqrjune in wrappers list</li> </ul>"},{"location":"changelog/#0.10.0","title":"v0.10.0 April 18, 2022","text":"<p>(Please see the full set of changes for this release also in the v0.10.0rc0 and rc1 notes below)</p>"},{"location":"changelog/#milestone-v0100","title":"Milestone v0.10.0","text":""},{"location":"changelog/#0.10.0rc1","title":"v0.10.0rc1 April 6, 2022","text":"<ul> <li>#426, !207: \u011e1 Monetary License refactoring:<ul> <li>Drop display in a browser</li> <li>Discover available languages</li> <li>Create <code>G1MonetaryLicense</code> class out of existing functions</li> </ul> </li> <li>Add Italian translation of \u011e1 monetary license</li> <li>#421, !204 : <code>wot</code> command can display membership status from an other identity sharing same <code>uid</code>/<code>pubkey</code></li> <li>#422: <code>excluded</code> command displays information of an other identity sharing same uid/pubkey, not the one excluded</li> <li>#216 <code>diffi</code>: Catch WS disconnection exception</li> </ul>"},{"location":"changelog/#0.10.0rc0","title":"v0.10.0rc0 March 21, 2022","text":""},{"location":"changelog/#code_1","title":"Code","text":""},{"location":"changelog/#features","title":"Features","text":"<ul> <li>#89, !170: Manage the revocation document</li> <li>#134, !202: Read transaction recipients and amounts from a file</li> </ul>"},{"location":"changelog/#g1-monetary-license","title":"\u011e1 Monetary license","text":"<ul> <li>#221, !181: Research about \u011e1 monetary license integration and refactor of its handling in Silkaj</li> <li>#308, !181: \u011e1 license display on a workstation: give the choice how to display it</li> <li>#392, !181: \u011e1 monetary license files not included into the Python package</li> <li>!181: subtree updated bringing new translations: Esperanto, Espagnol, and Portuguese</li> </ul>"},{"location":"changelog/#deathreaper","title":"DeathReaper","text":"<ul> <li>#256: Implement <code>excluded</code> command to report excluded identities from the WoT / DeathReaper</li> </ul>"},{"location":"changelog/#network_1","title":"Network","text":"<ul> <li>#373, #396, #410, !182, !194: Drop asynchronous property</li> <li>#390, !182, !196: Implement generic <code>network_tools.send_document()</code></li> <li>#177, !188: Clean no longer used network layer functions<ul> <li>Rename global option from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> </ul> </li> <li>#181, #409, !193: Improve endpoint determination code layer</li> <li>#260: Disconnection bug when sending a document to a local node</li> </ul>"},{"location":"changelog/#other-changes","title":"Other changes","text":"<ul> <li>#407, !182: Support DuniterPy v1.0 Breaking Backward compatible changes in <code>Documents</code> classes</li> <li>#344, !177: Fix import loop issue</li> <li>!177: Generalize <code>pendulum</code> usage</li> <li>#416, !170: Move <code>wot_lookup()</code> exceptions handling in higher level functions</li> </ul>"},{"location":"changelog/#minor-impact-changes","title":"Minor impact changes","text":"<ul> <li>#194, !195: Convert strings to <code>f-strings</code></li> <li>#376, !195: Replace <code>tools.message_exit()</code> with <code>sys.exit()</code></li> <li>#413, !170: Create <code>get_currency()</code> helper</li> <li>#264, !178: Remove unmaintained and commented <code>network</code> command</li> </ul>"},{"location":"changelog/#meta","title":"Meta","text":"<ul> <li>!200: Bump DuniterPy to v1.1.0</li> <li>#332, !200: Drop Python v3.6 support</li> <li>#374, !197: Add support for Python v3.10</li> <li>#401, !184: Bump to click v8.0</li> <li>#364, !187: Introduce insert-license pre-commit hook, Switch <code>#</code> comment instead of <code>\"\"\"</code> docstring for the copyright and license statements</li> <li>#365, !201: Update the copyright date to 2022 in the headers of every source files</li> </ul>"},{"location":"changelog/#documentation_1","title":"Documentation","text":"<ul> <li>#384: Document how to release pre-releases</li> <li>!180: <code>README</code> and <code>CONTRIBUTING</code> enhancements</li> </ul>"},{"location":"changelog/#installationcontinuous-delivery","title":"Installation/Continuous Delivery","text":"<ul> <li>#388, !198: Set up Silkaj Docker images build automation</li> </ul>"},{"location":"changelog/#development-environmentcontinuous-integration","title":"Development Environment/Continuous Integration","text":"<ul> <li>#326, !189: Integrate coverage in GitLab coverage feature</li> <li>#355, !183: Set <code>Py:3.8</code> as default image and move coverage to <code>Py:3.9</code></li> <li>#355, !185: Move the coverage and the badge generations to v3.9 test job</li> <li>#414, !197: Drop Poetry lock file usage</li> <li>!175: <code>pyproject.toml</code> and <code>release.sh</code> clean-ups, Pyinstaller removal</li> </ul>"},{"location":"changelog/#introduce-and-generalize-pre-commit-usage","title":"Introduce and generalize <code>pre-commit</code> usage","text":"<ul> <li>#401, !183: Introduce <code>isort</code> and <code>gitlab-ci-linter</code> <code>pre-commit</code> hooks</li> <li>#403, !192: Introduce <code>pyupgrade</code>, Remove dev dep tools</li> <li>#406, !191: Set up <code>pre-commit</code> hooks CI jobs</li> <li>!179: Bump <code>black</code> to v21.4b2 and allow to install as pre-release</li> <li>!190: Update <code>pre-commit</code> doc. Document CI linter hook usage</li> </ul> <p>Thanks moul, matograine</p>"},{"location":"changelog/#0.9.0","title":"v0.9.0 April 17, 2021","text":""},{"location":"changelog/#milestone-v090","title":"Milestone v0.9.0","text":"<ul> <li>#345, #385, !171: Refactor <code>id</code>/<code>lookup</code> command exclusively using <code>/wot/lookup</code><ul> <li>Display non-member uids when passing a pubkey</li> <li>Use same algorithm as <code>choose_identity()</code> uses</li> <li>Rename <code>id</code> to <code>lookup</code> command</li> </ul> </li> <li>#377, !172: <code>balance</code>: Fix undefined variable in case of 'Total' label</li> </ul> <p>Plus what can be found bellow in v0.9.0rc</p>"},{"location":"changelog/#0.9.0rc","title":"v0.9.0rc March 24, 2021","text":""},{"location":"changelog/#code_2","title":"Code","text":""},{"location":"changelog/#tx","title":"<code>tx</code>","text":"<ul> <li>#281, !129: Handle transaction size limit properly</li> <li>#257, #312, #356: Handle chained transactions/Change txs lost while sending big amount</li> <li>#296, #362, !154, !157: Prevent sending transaction with 0 as amounts</li> <li>#172, !165: Refactor tx confirmation, by using <code>click.confirm()</code></li> </ul>"},{"location":"changelog/#balance","title":"<code>balance</code>","text":"<ul> <li>#300, !164: <code>balance</code>: Display corresponding member identity uid</li> <li>#366, !159: Fix wrong <code>DuniterError</code> exception handling in <code>wot.identity_of</code></li> <li>#377, !166: <code>balance</code>: Document <code>money.show_amount_from_pubkey()</code></li> <li>#342, !151: Don\u2019t allow to pass multiple times the same pubkey to the <code>balance</code> command</li> </ul>"},{"location":"changelog/#others","title":"Others","text":"<ul> <li>#218, !160: <code>history</code>: Add option to display the complete pubkeys</li> <li>#314, !165: Display option for <code>cert</code>, <code>membership</code> commands</li> <li>!165: Make <code>--dry-run</code> option a generic one</li> <li>#378, !165: Create and use generic <code>send_doc_confirmation()</code> in <code>cert</code> and <code>membership</code> commands</li> <li>#176, !149: Get rid of <code>PyNaCl</code> and use <code>base58</code> module</li> <li>#309, !163: <code>wot</code>: Fix legend about received certifications</li> <li>#208: <code>argos</code>: Remove duplicate call to <code>CurrencySymbol</code></li> </ul>"},{"location":"changelog/#tests","title":"Tests","text":"<ul> <li>#213, !130: Write unit tests for the <code>tx</code> command</li> <li>#282, !130: Split <code>patched.py</code> into files</li> <li>#335, !130: Merge the two functions testing <code>transaction_amount()</code></li> <li>#363, !129: Returns balance from <code>patched_get_source()</code></li> <li>#368, !161: Assertions are not tested when testing system exit</li> <li>#362, !156: Change \"moul\" id in tests</li> </ul>"},{"location":"changelog/#meta_1","title":"Meta","text":"<ul> <li>#240, !150: Drop Python 3.5 support</li> <li>#294, !150, docker/python3/poetry!1: Add support and set-up Python 3.9 test job</li> <li>#270: Silkaj v0.8.1 package for Debian Bullseye (v11)</li> <li>#226, !158: Get rid of <code>ipaddress</code> dependency</li> <li>#290, !162: Update <code>pre-commit</code> dev dependency</li> <li>#267: Update the copyright date to 2021 in the headers of every source files</li> <li>!150, !155, !167, Update DuniterPy from v0.58.1 to v0.62.0</li> <li>#313, !148: Be compatible with and handle new features from Poetry v1.1</li> <li>#299, !147: Introduce dev version suffix</li> </ul> <p>Thanks matograine, moul, atrax</p>"},{"location":"changelog/#0.8.1","title":"v0.8.1 November 30, 2020","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine</p>"},{"location":"changelog/#0.8.0","title":"v0.8.0 October 18, 2020","text":""},{"location":"changelog/#milestone-v080","title":"Milestone v0.8.0","text":""},{"location":"changelog/#code_3","title":"Code","text":""},{"location":"changelog/#transaction","title":"Transaction","text":"<ul> <li> <p>#111, !108: Support passing different amounts on multi-recipients tx</p> <ul> <li>Breaking change: Rename <code>--output</code> option to <code>--recipient</code></li> </ul> </li> <li> <p>Add extra small options to ease passing multiple amounts and recipients:</p> <ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code></li> </ul> </li> <li> <p>Add possibility to pass multiple options:</p> <ul> <li>Breaking change: recipients public keys are no longer <code>:</code> separated: <code>-r A -r B</code></li> </ul> </li> <li> <p>#232, !131, !132: Identities not retrieved for tx with several issuers, and to display the tx history</p> </li> <li> <p>#236, !107: Improve the confirmation display</p> </li> <li> <p>!144: Rework confirmation fields titles</p> </li> <li> <p>#235: Make sure only one option is passed to retrieve the amount of the transaction</p> </li> </ul>"},{"location":"changelog/#membership-wot","title":"Membership, WoT","text":"<ul> <li>#88, !140: Add <code>membership</code> command</li> <li>#88, !144: Rework table fields names</li> <li>#140, !140: Ability to pass an <code>uid</code> or a <code>pubkey</code> to <code>wot</code>, and <code>cert</code>, <code>membership</code> commands<ul> <li>Implement identity choice selector</li> </ul> </li> </ul>"},{"location":"changelog/#checksum","title":"Checksum","text":"<ul> <li>#237, !132: Breaking change: Switch back the checksum delimiter from <code>!</code> to <code>:</code></li> <li>#323, !132: Handle pubkey's checksum in the tx code</li> <li>#301, !143: Generalize pubkey checksum display and verifiction, Add <code>chekcsum</code> command</li> <li>#320, !143: Incorrect use of <code>check_public_key()</code> in <code>id</code> command</li> </ul>"},{"location":"changelog/#others_1","title":"Others","text":"<ul> <li>#262, !123: Add new <code>verify</code> command to check blocks\u2019 signatures</li> <li>#264, !133: Disable the broken <code>net</code> command</li> <li>!131: Display <code>powMin</code> in a row in the <code>blocks</code> explorer</li> <li>#210, !115: Close client session in every cases</li> <li>#223: Make Click context optional to be able to call functions from an external module</li> <li>#255, !113: <code>balance</code>: display the content in tables</li> <li>#269, !133: Move <code>convert_time()</code> to <code>tui.py</code></li> <li>#278, !128: Fix PubSec regex</li> <li>#336, !141: <code>history</code>: Pubkeys display issue with multisig txs</li> </ul>"},{"location":"changelog/#dev-env_1","title":"Dev Env","text":""},{"location":"changelog/#poetry-migration","title":"Poetry migration","text":"<ul> <li>#182: Migrate from Pipenv and <code>setup.py</code> to Poetry</li> <li>#249: Install Poetry stable when v1 is released</li> <li>#263, !127: Post migration tasks (black, poetry)</li> <li>#276, !120: Pip installation do not install <code>silkaj</code> executalbe into <code>$HOME/.local/bin</code></li> </ul>"},{"location":"changelog/#cicd-set-up","title":"CI/CD set-up","text":"<ul> <li>#245: Automated containers builds with Poetry installed for Python versions 3.5, 3.6, 3.7, and 3.8</li> <li>#149: CI/CD set up</li> <li>#105: Deploy on PyPI from GitLab CD</li> <li>#146: Add a coverage badge</li> <li>#284, !124: <code>build</code> and <code>tests</code> jobs are not retriggered in case of source code change</li> <li>#286, !126: Use latest Black version from PyPI in the container</li> <li>!131: Use <code>rules</code> instead of <code>only/except</code></li> </ul>"},{"location":"changelog/#tests_1","title":"Tests","text":"<ul> <li>#241: Can not run test with Click utility</li> </ul>"},{"location":"changelog/#dependencies","title":"Dependencies","text":"<ul> <li>#259: <code>attr</code> error while installing with <code>pip</code></li> <li>!121, !131, !142: Update DuniterPy from v0.55.1 to v0.58.0</li> <li>#251, !140: Introduce <code>pendulum</code> date utility</li> <li>Introduce <code>pytest-sugar</code></li> <li>Update PyNaCl to v1.4.0</li> <li>Update Click to v7.1.2</li> <li>#338, !140: Update black to v20</li> </ul>"},{"location":"changelog/#python-versions-support","title":"Python versions support","text":"<p>We added the support for Python 3.8. #240: It is planned that v0.8.x versions are going to be the last releases with Python 3.5 support since its support from the Python project has been dropped September 30th of 2020.</p>"},{"location":"changelog/#documentation_2","title":"Documentation","text":"<ul> <li>#202: Document contribution process in <code>CONTRIBUTING.md</code></li> <li>#182: Document Poetry installation and usage</li> <li>!109: Add Poetry installation on Debian Buster</li> <li>!103: Add pip installation documentation for macOS</li> <li>!131: Add packaging status badge from Repology</li> <li>#244: Add <code>AUTHORS.md</code> listing the contributors</li> <li>#207: Create Silkaj SVG logo</li> </ul>"},{"location":"changelog/#project","title":"Project","text":"<ul> <li>#252, !118: Create a script to update and update the copyright date to 2020</li> <li>#285, !132: Add copyright and license statements in tests source files</li> </ul>"},{"location":"changelog/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"changelog/#0.7.6","title":"v0.7.6 January 24, 2020","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"changelog/#0.7.5","title":"v0.7.5 January 23, 2020","text":"<ul> <li>#276: Publish on PyPI with previous method: <code>wheel</code>, <code>twine</code>, and <code>setup.py</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"changelog/#0.7.4","title":"v0.7.4 January 22, 2020","text":"<ul> <li>#273, !119: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"changelog/#0.7.3","title":"v0.7.3 July 25, 2019","text":"<p>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:</p> <ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate for loop</li> </ul>"},{"location":"changelog/#0.7.2","title":"v0.7.2 June 25, 2019","text":"<ul> <li>#233: fix round passed amount and amoundUD floats \u00d7 by 100</li> </ul>"},{"location":"changelog/#0.7.1","title":"v0.7.1 May 29, 2019","text":"<ul> <li>Fix transaction document generation from DuniterPy</li> </ul>"},{"location":"changelog/#0.7.0","title":"v0.7.0 May 22, 2019","text":""},{"location":"changelog/#milestone-v070","title":"Milestone v0.7.0","text":""},{"location":"changelog/#duniterpy","title":"DuniterPy","text":"<ul> <li>#7, !97: Migrate to DuniterPy</li> <li>#200: Freeze DuniterPy dependency version</li> <li>#206: Set a sleep for async requests</li> <li>#178: Select different sources for intermediaries tx</li> </ul>"},{"location":"changelog/#cli_2","title":"CLI","text":"<ul> <li>#77, !98: Migrate command line tool from commandline to Click</li> <li>#67, #76, #116, #117, #123: fixed by previous issue</li> <li>#167: Rename <code>amount</code> command to <code>balance</code></li> <li>#148: Rename <code>issuers</code> command to <code>blocks</code> which is a more appropriate word to what it does</li> <li>With <code>-p</code> option: when the port of the node is 443, it\u2019s not necessary to specify the port</li> </ul>"},{"location":"changelog/#transaction_1","title":"Transaction","text":"<ul> <li>#22: Display transactions history in a table</li> <li>#184: Rework transaction functions (Part 3)</li> <li>#152: fix <code>--allSources</code> option which was not working</li> <li>#165, !99: Display outputBackChange option in confirmation chart</li> <li>#131: Prevent sending too small amount</li> </ul>"},{"location":"changelog/#certification","title":"Certification","text":"<ul> <li>#170: Change process: only propose license display</li> <li>#198: Display identity\u2019s blockstamp and date into confirmation message</li> </ul>"},{"location":"changelog/#difficulty-level","title":"Difficulty level","text":"<ul> <li>#93: Difficulties fails / use websocket to be informed about new block</li> <li>#190: Display the date when the head block has been generated</li> </ul>"},{"location":"changelog/#balance_1","title":"Balance","text":"<ul> <li>!96, #122: display balance in comparison to the average of money share</li> </ul>"},{"location":"changelog/#blocks","title":"Blocks","text":"<ul> <li>Display the full dates of blocks\u2019 generation and mediantime</li> </ul>"},{"location":"changelog/#wot","title":"WoT","text":"<ul> <li>#141: Crash on membership status</li> <li>Add legend to explain <code>\u2714</code></li> <li>#189: Handle wot requests exceptions</li> <li>#135 :is_member() requests all members to know if an identity is member will explose</li> </ul>"},{"location":"changelog/#authentication","title":"Authentication","text":"<ul> <li>#130: Prevent erasing authfile</li> <li>Use <code>pathlib.Path</code> instead of <code>os.path</code></li> </ul>"},{"location":"changelog/#tests_2","title":"Tests","text":"<ul> <li>!83, #85: Create test structure</li> <li>#225: Install <code>pytest-asyncio</code></li> </ul>"},{"location":"changelog/#other","title":"Other","text":"<ul> <li>#161: Singleton improvement</li> <li>#157, !100: Use <code>for</code> loops</li> <li>#169, !100: type issue</li> <li>#113: Many small improvements</li> </ul>"},{"location":"changelog/#website-doc","title":"Website / Doc","text":"<ul> <li>#82: Update website and readme about new features</li> <li>#136: Link directly the installation documentation on the website</li> <li>#159: Update website</li> <li>#160: Add website repository link in the README</li> <li>List Silkaj wrappers en the README</li> </ul>"},{"location":"changelog/#installation-documentation","title":"Installation documentation","text":"<ul> <li>Add instructions on installing libsodium which is required by pylibscrypt since DuniterPy migration</li> <li>#142: Improve pip installation documentation</li> <li>Improve Pipenv installation documentation</li> <li>!89: Add Docker install procedure, Pip: dependency and PATH tricks</li> <li>#215: Conflict between pyproject.toml and pipenv install</li> </ul>"},{"location":"changelog/#windows","title":"Windows","text":"<ul> <li>#153: Install on Windows, Scrypt issue</li> <li>#154: net: can\u2019t get screen size on Windows</li> <li>!92: Document Windows installation with pip</li> </ul>"},{"location":"changelog/#project_1","title":"Project","text":"<ul> <li>#132: Add a license notice as a header of every source files</li> <li>#158: Add CHANGELOG.md file</li> <li>#186: Fix firsts two tags</li> <li>Pypi: add classifiers</li> </ul>"},{"location":"changelog/#thanks_1","title":"Thanks","text":"<p>Attilax, Bernard, cebash, matograine, vtexier</p>"},{"location":"changelog/#0.6.5","title":"v0.6.5 Debian January 8, 2019","text":"<p>v0.6.5 fork for Debian package without DuniterPy migration but with Click CLI module.</p> <ul> <li>#137: Create Debian package and publish it in Buster</li> <li>#77, !98: Migrate to Click</li> <li>#132: Add a license notice as a header of every source files</li> </ul>"},{"location":"changelog/#thanks_2","title":"Thanks","text":"<p>jonas</p>"},{"location":"changelog/#0.6.1","title":"v0.6.1 December 10, 2018","text":""},{"location":"changelog/#milestone-v061","title":"Milestone v0.6.1","text":"<ul> <li>!90, #151: Fix intermediaries transactions sent to wrong recipient</li> <li>!91, #145: Allow to renew certifications</li> <li>#155: Make <code>clear</code> calls works on Windows</li> <li>#141: Crash on membership status</li> <li>#166: Shell completion</li> </ul>"},{"location":"changelog/#0.6.0","title":"v0.6.0 November 18, 2018","text":""},{"location":"changelog/#milestone-v060","title":"Milestone v0.6.0","text":""},{"location":"changelog/#installation","title":"Installation","text":"<ul> <li>#86: Move from <code>pyenv+pip</code> to Pipenv as the new development environment solution</li> <li>#100, !80: New installation method with <code>pip</code> now set as default</li> <li>#100: Documentation on how to publish on Pypi</li> </ul>"},{"location":"changelog/#authentication_1","title":"Authentication","text":"<ul> <li>#78: Use Scrypt as default authentication method</li> <li>#102: Display a confirmation message after using <code>generate_auth_file</code> command</li> <li>#103: More explicit usage about the authentication file mechanism storage</li> </ul>"},{"location":"changelog/#certification_1","title":"Certification","text":"<ul> <li>#96, !82: Certification fails for non-members identities</li> <li>Prevent certifying ourself</li> <li>Code refactoring: simplification, duplicate code removal</li> </ul>"},{"location":"changelog/#wot_1","title":"Wot","text":"<ul> <li>Display certification stock</li> <li>#73: Display identity status:<ul> <li>Display membership expiration due to membership expiration and certifications expiration</li> </ul> </li> <li>#127: fix: display human readable date for 'revoked on' attribute</li> </ul>"},{"location":"changelog/#transaction_2","title":"Transaction","text":"<ul> <li>#83, !78: Allow multi-output transactions</li> <li>#72: Check the pubkey\u2019s balance is enough before processing the transaction</li> <li>#72: Minors transaction refactoring</li> <li>#101: Round UD value in the confirmation summary</li> <li>#118: Use generic function to get sources</li> <li>#120: Display pubkey\u2019s balance before and after transaction in the confirmation summary</li> <li>#125: Fix wrong amount transferred</li> </ul>"},{"location":"changelog/#new-commands","title":"New commands","text":"<ul> <li>#91: <code>about</code>: displays information about silkaj</li> <li>#95: <code>license</code>: displays \u011e1\u2019s license</li> </ul>"},{"location":"changelog/#g1-test","title":"\u011e1-test","text":"<ul> <li>#87: Add <code>--gtest</code> option to specify official \u011e1-test node</li> <li>#109, !84: Improve gtest usage message</li> <li>#112: Amount: fix authentication option with <code>--gtest</code> option</li> </ul>"},{"location":"changelog/#python-37","title":"Python 3.7","text":"<ul> <li>#98: Test with Python 3.7: silkaj is compatible with Python from version 3.4 to 3.7</li> <li>#98: Set Python 3.7 for Pipenv</li> </ul>"},{"location":"changelog/#network-performances","title":"Network performances","text":"<ul> <li>#42, !85: Thanks to singleton, requests are made once for <code>head_block</code>, blockchain parameters, endpoint, <code>ud_value</code>, and <code>currency_symbol</code> retrieval</li> <li>#32: request the domain first instead of the IP (to handle https certificates) (this avoid <code>network</code> view to crash)</li> <li>#32, !79: Add timeouts on GET and POST requests</li> <li>#128, !88: Fix POST request timeout</li> </ul>"},{"location":"changelog/#black-code-formatting","title":"Black: code formatting","text":"<ul> <li>#94, !76: move from <code>pep8</code> to <code>black</code> code formatting. Set pre-commit hook and CI worker</li> </ul>"},{"location":"changelog/#bug-fixes-and-refactoring","title":"Bug fixes and refactoring","text":"<ul> <li>#121: Move cryptographic related functions into <code>crypto_tools.py</code></li> </ul>"},{"location":"changelog/#logo","title":"Logo","text":"<ul> <li>#92: Silkaj logo publication under GNU APGLv3 after a successful crowdfunding</li> </ul>"},{"location":"changelog/#wrappers","title":"Wrappers","text":"<ul> <li>#107: Document silkaj wrappers usages</li> </ul>"},{"location":"changelog/#forum-post","title":"Forum post","text":""},{"location":"changelog/#0.5.0","title":"v0.5.0 May 22, 2018","text":""},{"location":"changelog/#milestone-v050","title":"Milestone v0.5.0","text":""},{"location":"changelog/#certification_2","title":"Certification","text":"<ul> <li>#61: sending certification document:<ul> <li>check that current identity is member</li> <li>check that the certification has not already been sent</li> <li>prompt \u011e1\u2019s license and ask for acceptance in web browser or in pager (a <code>less</code>-like) if no web browser is available</li> </ul> </li> </ul>"},{"location":"changelog/#wot_2","title":"Wot","text":"<ul> <li>#84: display certifications\u2019 expiration date</li> <li>#81: bugfix, nothing displayed when there is two identities with same id</li> </ul>"},{"location":"changelog/#amount","title":"Amount","text":"<ul> <li>remove necessity to prepend with <code>--pubkey</code> option: <code>silkaj amount pubkey1:pubkey2:pubkey3</code></li> </ul>"},{"location":"changelog/#issuers","title":"Issuers","text":"<ul> <li>display the hash\u2019s ten first characters as \u011e1\u2019s global difficulty has increased</li> <li>display blocks in current window: <code>silkaj issuers 0</code></li> </ul>"},{"location":"changelog/#build","title":"Build","text":"<ul> <li>#6: Automate releases using a script</li> </ul>"},{"location":"changelog/#other_1","title":"Other","text":"<ul> <li>display <code>\u011e1</code> and <code>\u011eTest</code> currencies symbols</li> <li>Aliases commands <code>id</code>: <code>identities</code>, <code>tx</code>: <code>transaction</code>, <code>net</code>: <code>network</code></li> <li><code>import</code> rework to improve loading performances</li> <li>Lots of code reorganization and cleaning</li> </ul>"},{"location":"changelog/#forum-post_1","title":"Forum post","text":""},{"location":"changelog/#0.4.0","title":"v0.4.0 January 28, 2018","text":""},{"location":"changelog/#milestone-v040","title":"Milestone v0.4.0","text":""},{"location":"changelog/#new-wot-command-which-displays-received-and-sent-certification-of-an-identity","title":"New <code>wot</code> command which displays received and sent certification of an identity","text":"<ul> <li>!50, !66</li> </ul>"},{"location":"changelog/#transaction_3","title":"Transaction","text":"<ul> <li>#41: Rework/refactoring of transaction code (part 1)</li> <li>!55: Add check condition for sources</li> <li>!57: Exit if wrong pubkey\u2019s output formats</li> </ul>"},{"location":"changelog/#amount_1","title":"Amount","text":"<ul> <li>#46, !68: Add ability to display the amount of many pubkey with same command</li> <li>Total amount of pubkeys displayed at the end (nice to know how much units you own)</li> </ul>"},{"location":"changelog/#authentication_2","title":"Authentication","text":"<ul> <li>!56: Add \u011eannonce (aka PubSec) file format import</li> <li>#60: Hide salt at scrypt authentication</li> </ul>"},{"location":"changelog/#difficulties","title":"Difficulties","text":"<ul> <li>!58: Reload/refresh in a loop PoW difficulty level</li> <li>Display in same order as Remuniter</li> </ul>"},{"location":"changelog/#id","title":"Id","text":"<ul> <li>#49: Display if pubkey is member</li> <li>#59: Bug fix with <code>id</code> command</li> </ul>"},{"location":"changelog/#build_1","title":"Build","text":"<ul> <li>Build published with sha256 checksum</li> </ul>"},{"location":"changelog/#other_2","title":"Other","text":"<ul> <li>Change default endpoint</li> </ul>"},{"location":"changelog/#thanks_3","title":"Thanks","text":"<p>Thanks to Tortue95, jytou, mmuman, and cuckooland</p>"},{"location":"changelog/#forum-post_2","title":"Forum post","text":""},{"location":"changelog/#0.3.0","title":"v0.3.0 April 17, 2017","text":""},{"location":"changelog/#milestone-v030","title":"Milestone v0.3.0","text":""},{"location":"changelog/#transactions","title":"Transactions","text":"<ul> <li>enhance transaction command:<ul> <li>#27, #30: ask for confirmation</li> <li>!38: new confirmation chart containing transaction informations</li> <li>don\u2019t prompt <code>scrypt</code> parameters. See <code>Auth</code> \u00a7</li> </ul> </li> </ul>"},{"location":"changelog/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>!29: new command <code>id</code> to search identities with pubkey or id</li> </ul>"},{"location":"changelog/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>#23, !40: Pyenv installation tutorial</li> </ul>"},{"location":"changelog/#authentication_3","title":"Authentication","text":"<ul> <li>!45: new authentication method: WIF. For future paper wallet feature</li> <li>#39, #43: Don\u2019t prompt scrypt parameters at authentication. Use default ones</li> </ul>"},{"location":"changelog/#builds","title":"Builds","text":"<ul> <li>#5: with Pyinstaller</li> </ul>"},{"location":"changelog/#other_3","title":"Other","text":"<ul> <li>!33, !37: Ability to sort network view</li> <li>Change license from GNU GPLv3 to GNU AGPLv3</li> <li>!31: Code formatting with <code>pep8</code></li> </ul> <p>Thanks to Tortue95 and jytou</p>"},{"location":"changelog/#forum-post_3","title":"Forum post","text":""},{"location":"changelog/#0.2.0","title":"v0.2.0 March 27, 2017","text":""},{"location":"changelog/#features_1","title":"Features","text":"<ul> <li>Transaction feature</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"changelog/#milestone-v020","title":"Milestone v0.2.0","text":""},{"location":"changelog/#announcement","title":"Announcement","text":"<ul> <li>Diaspora* post</li> </ul> <p>Big thanks to Tortue95, and mmuman.</p>"},{"location":"changelog/#0.1.0","title":"v0.1.0 September 23, 2016","text":""},{"location":"changelog/#public-release","title":"Public release","text":"<ul> <li>Duniter forum post</li> <li>Diaspora* post</li> </ul>"},{"location":"changelog/#milestone-v010","title":"Milestone v0.1.0","text":""},{"location":"changelog/#features_2","title":"Features","text":"<p>Sub-commands:</p> <ul> <li><code>info</code></li> <li><code>difficulties</code></li> <li><code>network</code></li> <li><code>issuers</code></li> </ul> <p>Thanks to c-geek.</p>"},{"location":"install/","title":"Install Silkaj","text":""},{"location":"install/#distribution","title":"Distribution","text":"<p>Installing Silkaj from the package manager of your favorite distribution might not be available or might not come with latest Silkaj version. In order to get latest version install Silkaj with <code>pipx</code> or <code>pip</code> from PyPI which you can find in next sections.</p> <p></p>"},{"location":"install/#unix","title":"Unix","text":"<p>On a Unix system, run in your shell following commands:</p>"},{"location":"install/#install-libsodium","title":"Install libsodium","text":"DebianFedoramacOS <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium-devel\n</code></pre> <pre><code>brew install libsodium\n</code></pre>"},{"location":"install/#install-pipx","title":"Install <code>pipx</code>","text":"<p>Check <code>pipx</code> documentation for an extended installation tutorial.</p> DebianFedoramacOS <pre><code>sudo apt install pipx python3-dev\n</code></pre> <pre><code>sudo dnf install pipx python3-devel\n</code></pre> <pre><code>brew install python3 pipx\n</code></pre>"},{"location":"install/#install-with-pipx","title":"Install with pipx","text":"<p>pipx tool is recommended for Python executables. It isolates libraries into separated virtual environments.</p>"},{"location":"install/#ensure-path","title":"Ensure path","text":"<p>Takes care to add Pipx executables in the <code>PATH</code> of your shell:</p> <pre><code>pipx ensurepath\n</code></pre>"},{"location":"install/#install","title":"Install","text":"<pre><code>pipx install silkaj\n</code></pre>"},{"location":"install/#upgrade","title":"Upgrade","text":"<pre><code>pipx upgrade silkaj\n</code></pre>"},{"location":"install/#uninstall","title":"Uninstall","text":"<pre><code>pipx uninstall silkaj\n</code></pre>"},{"location":"install/#check-silkaj-is-working","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#install-with-pip","title":"Install with pip","text":"<p><code>pipx</code> installation is recommended, but you can proceed with <code>pip</code> if you know what you are doing.</p>"},{"location":"install/#install-pip","title":"Install <code>pip</code>","text":"DebianFedoramacOS <pre><code>sudo apt install python3-pip\n</code></pre> <pre><code>sudo dnf install python3-pip\n</code></pre> <p>Already installed with <code>python3</code></p>"},{"location":"install/#completing-path","title":"Completing <code>PATH</code>","text":"<p>If after Silkaj intallation you get a <code>bash: silkaj: command not found</code> error, you have to extend the <code>PATH</code> with <code>~./local/bin</code>:</p> <pre><code>echo \"export PATH=$PATH:$HOME/.local/bin\" >> $HOME/.bashrc\nsource $HOME/.bashrc\n</code></pre>"},{"location":"install/#install-for-current-user-only","title":"Install for current user only","text":"<pre><code>pip install silkaj --user\n</code></pre>"},{"location":"install/#upgrade_1","title":"Upgrade","text":"<pre><code>pip install silkaj --user --upgrade\n</code></pre>"},{"location":"install/#uninstall-useful-to-see-the-real-paths","title":"Uninstall (useful to see the real paths)","text":"<pre><code>pip uninstall silkaj --user\n</code></pre>"},{"location":"install/#check-silkaj-is-working_1","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#shell-completion","title":"Shell completion","text":"<p>Set up the shell completion by adding following line in your shell configuration depending on your shell:</p> BashZshFish $HOME/.bashrc<pre><code>eval \"$(_SILKAJ_COMPLETE=bash_source silkaj)\"\n</code></pre> $HOME/.zshrc<pre><code>eval \"$(_SILKAJ_COMPLETE=zsh_source silkaj)\"\n</code></pre> $HOME/.config/fish/completions/silkaj.fish<pre><code>_SILKAJ_COMPLETE=fish_source silkaj | source\n</code></pre> <p>For further details checkout Click documentation.</p>"},{"location":"install/#install-to-contribute","title":"Install to contribute","text":"<p>Check out the installation guide with Poetry.</p>"},{"location":"blog/","title":"Blog","text":""},{"location":"blog/silkaj-new-cli-duniter-client/","title":"Silkaj: new CLI Duniter client","text":"<p>I am pleased to announce a new Duniter client! It's a client from CLI (command line interface) written with Python 3.</p> <ul> <li>Diaspora* post</li> <li>Code repository with a tutorial to install it.</li> </ul> <p>This client was started almost two weeks ago and needed to be mature enough before public release.</p>"},{"location":"blog/silkaj-new-cli-duniter-client/#features","title":"Features","text":"<p>You could see the result of one of its best sub command <code>network</code>:</p> <pre><code>./src/silkaj.py network\n\n### 20 peers ups, with 15 members and 5 non-members\n\n| domain | ip4 | port | block | hash | gen_time | uid |member| pubkey |diffi| version |\n|---------------------+----------------+------+-------+-------------+----------+-----------+------+--------+-----+----------|\n| cgeek.fr | 88.174.120.187 | 9330| 41166 | 000027421F\u2026 | 15:59:00 | cgeek | yes | HnFcS\u2026 | 77 | 0.31.0b6 |\n| mirror1.cgeek.fr | 88.174.120.187 | 9331| 41166 | 000027421F\u2026 | 15:59:00 | | no | 4jT89\u2026 | | 0.31.0b6 |\n| mirror2.cgeek.fr | 88.174.120.187 | 9332| 41166 | 000027421F\u2026 | 15:59:00 | | no | AZ2JP\u2026 | | 0.31.0b6 |\n| \u2026t.duniter.inso.ovh | | 80| 41166 | 000027421F\u2026 | 15:59:00 | inso | yes | 8Fi1V\u2026 | 231 | 0.30.17 |\n| peer.duniter.org | 51.255.197.83 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | | no | BSmby\u2026 | | 0.30.17 |\n| desktop.moul.re | 78.227.107.45 | 24723| 41166 | 000027421F\u2026 | 15:59:00 | moul | yes | J78bP\u2026 | 77 | 0.31.0b7 |\n| misc.moul.re | 78.227.107.45 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | moul | yes | J78bP\u2026 | 77 | 0.31.0b7 |\n| test-net.duniter.fr | 88.189.14.141 | 9201| 41166 | 000027421F\u2026 | 15:59:00 | kimamila | yes | 5ocqz\u2026 | 385 | 0.31.0b3 |\n| raspi3.cgeek.fr | 88.174.120.187 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | | no | G3wQw\u2026 | | 0.31.0a9 |\n| duniter.vincentux.fr| | 8999| 41166 | 000027421F\u2026 | 15:59:00 | vincentux | yes | 9bZEA\u2026 | | 0.30.17 |\n| remuniter.cgeek.fr | 88.174.120.187 | 16120| 41166 | 000027421F\u2026 | 15:59:00 | remuniter\u2026| yes | TENGx\u2026 | | 0.30.17 |\n| | 88.163.42.58 | 34052| 41166 | 000027421F\u2026 | 15:59:00 | cler53 | yes | 4eDis\u2026 | 77 | 0.30.17 |\n| suchard.si7v.fr | 163.172.252.3 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | hacky | yes | DesHj\u2026 | 77 | 0.31.0a8 |\n| | 87.91.122.123 | 9330| 41166 | 000027421F\u2026 | 15:59:00 | mmpio | yes | BmDso\u2026 | 154 | 0.31.0b3 |\n| \u2026er.help-web-low.fr | 151.80.40.148 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | pafzedog | yes | XeBpJ\u2026 | 154 | 0.30.17 |\n| | 87.90.32.15 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | nay4 | yes | BnSRj\u2026 | 77 | 0.31.0a9 |\n| duniter.modulix.net | 212.47.227.101 | 9330| 41166 | 000027421F\u2026 | 15:59:00 | modulix | yes | DeCip\u2026 | | 0.30.17 |\n| | 88.174.120.187 | 33036| 41166 | 000027421F\u2026 | 15:59:00 | | no | GNRug\u2026 | | 0.31.0b7 |\n| duniter.cco.ovh | 163.172.176.32 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | charles | yes | DA4PY\u2026 | 77 | 0.31.0a8 |\n| duniter.ktorn.com | 107.170.192.122| 8999| 41166 | 000027421F\u2026 | 15:59:00 | ktorn | yes | BR5DD\u2026 | 77 | 0.30.17 |\n</code></pre>"},{"location":"blog/v0100/","title":"v0.10.0","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.10.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/v0100/#introduction","title":"Introduction","text":"<p>This release comes with the handling of the complete life cycle of the revocation file, the ability to read transaction amounts and recipients listing from a file, convenient for recurrent transaction. Last but not least, the code handling \u011e1 monetary license has been refactored. The upstream changes have been retrieved and now features the license into six languages.</p> <p>Under the hood, Silkaj codebase has been updated to use DuniterPy v1.0, which comes with breaking backward compatible changes on the <code>Documents</code> classes and the drop of the asynchronous property.</p> <p>As always, this release also comes with an emphasis on the development environment, with <code>pre-commit</code> usage generalization with the introduction of new hooks.</p>"},{"location":"blog/v0100/#revocation","title":"Revocation","text":"<p>The complete lifecycle of the revocation document and its storage in a file is now supported!</p> <p>The <code>revocation</code> command comes with four sub-commands:</p> <pre><code>silkaj revocation --help\nUsage: silkaj revocation [OPTIONS] COMMAND [ARGS]...\n\n Create, save, verify or publish revocation document. Subcommands optionally\n take the path to the revocation document.\n\nOptions:\n -h, --help Show this message and exit.\n\nCommands:\n publish Publish revocation document.\n revoke Create and publish revocation document.\n save Create and save a revocation document.\n verify Verifies that a revocation document is correctly formatted and...\n</code></pre> <p>With these command, you can generate a revocation file, verify its integrity and publish to actually revoke an identity.</p> <p>For the first time we implemented sub-subcommands thanks to Click. In the future, we will implement more commands using this feature, since we now know how to implement it.</p>"},{"location":"blog/v0100/#read-transaction-recipients-and-amounts-from-a-file","title":"Read transaction recipients and amounts from a file","text":"<p>You can now define a file following this format. For instance, a file named <code>recipients.txt</code>:</p> recipients.txt<pre><code><ABSOLUTE|RELATIVE>\n\n# comment 1\n<amount1> <pubkey1>\n\n# comment 2\n<amount2> <pubkey2>:[<checksum2>]\n</code></pre> <p>It lists the amounts and the recipients\u2019 pubkeys for which the multi-recipients transaction will be issued. The checksum can be append to the pubkey to have its integrity checked.</p> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>It will generate a multi-recipients transaction with the amounts in absolute or relative reference depending of the setted header (<code>ABSOLUTE</code> or <code>RELATIVE</code>).</p>"},{"location":"blog/v0100/#g1-monetary-license","title":"\u1e201 Monetary license","text":"<p>The upstream repository containing the licenses has been updated. This update brings fixes and improvements on the existing languages and brings additional new languages: Esperanto, Espagnol, Italian, and Portuguese</p> <p>The display is now only displaying the embedded license files in the console, since it\u2019s available in six up-to-date languages.</p> <pre><code>silkaj license\nIn which language would you like to display \u011e1 monetary license? (es, en, eo, it, fr, pt) [en]: fr\n</code></pre> <p>The display in the browser has been removed since there were just two websites links to outdated licences in French and English.</p>"},{"location":"blog/v0100/#deathreaper","title":"DeathReaper","text":"<p>If you missed DeathReaper crowdfunding completion, you can check this message or the complete post if you have not been aware of.</p>"},{"location":"blog/v0100/#silkaj-docker-image","title":"Silkaj Docker image","text":"<p>The automated generation of Silkaj Docker images has been implemented in the first place to distribute DeathReaper. This is a new way to install Silkaj and its environment. This is convenient to distribute non-stable releases. You can find the documentation on how to use these images.</p>"},{"location":"blog/v0100/#network","title":"Network","text":"<ul> <li>The asynchronous property has been dropped. The HTTP library usage has been migrated from <code>asyncio</code> to <code>urllib</code></li> <li>The global option to specify a custom endpoint has been renamed from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> <li>Silkaj network layer has been refactored, bringing a more robust code</li> </ul>"},{"location":"blog/v0100/#duniterpy-v10","title":"DuniterPy v1.0","text":"<p>Support have been added to support DuniterPy v1.0 which came with many breaking backward compatible changes in the <code>Documents</code> classes.</p>"},{"location":"blog/v0100/#meta","title":"Meta","text":"<p>This release introduces support for Python v3.10 and drops support for Python v3.6.</p>"},{"location":"blog/v0100/#development-environment","title":"Development Environment","text":"<p><code>pre-commit</code> usage has been generalized with <code>black</code>, <code>isort</code>, <code>pyupgrade</code>, <code>insert-license</code>, and <code>gitlab-ci-linter</code> hooks. These hooks are run as jobs into the CI.</p>"},{"location":"blog/v0100/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v0100/#outlook","title":"Outlook","text":"<p>New <code>pre-commit</code> hooks (<code>pylint</code>, <code>flake8</code>, <code>mypy</code>) will be introduced to have more guardrails in order to ensure that future implementations will allow to reach higher code quality. Then, it\u2019s planned to migrate from <code>tabulate</code> to <code>Texttable</code>, and then restructure the repository. Once these prerequisites have been completed, the emphasis will be put onto migrating to Duniter v2 using Substrate. This means using new APIs: RPC, Subsquid, Using new documents called extrinsincs, and probably other changes.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/","title":"Call for testing Silkaj v0.10.0rc","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.10.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>To install and run Silkaj from a container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0 silkaj info\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#tests","title":"Tests","text":"<p>Please test it globally, and check v0.10.0 milestone short summary which contains the changes which have been implemented during this development cycle. Pay a special attention to the newly introduced revocation command.</p> <p>Manual tests help us making sure everything works fine in different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any revocation or loss of money to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#revocation","title":"Revocation","text":"<p><code>revocation</code> command handle the revocation document in an extended way. Check the sub-commands:</p> <pre><code>silkaj revocation --help\n</code></pre> <p>Make sure you are able to create new identities before proceeding. Create a revocation file with an existing identity. Verify the generated file, and publish it!</p> <pre><code>silkaj --gtest revocation save revocation_test.txt\nsilkaj --gtest revocation verify revocation_test.txt\nsilkaj --gtest revocation publish revocation_test.txt\n</code></pre> <p>Or directly all the previous steps with one command:</p> <pre><code>silkaj --gtest revocation revoke\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#license","title":"License","text":"<p>Check \u011e1 monetary license get displayed correctly in any language and in any configuration: workstation or headless computers.</p> <pre><code>silkaj license\nsilkaj --g1-license-web license\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#network-documents-issuance","title":"Network, documents issuance","text":"<p>Silkaj\u2019s network code layer have been completely rewritten, an other HTTP library is used, the asynchronous propery has been dropped, and the documents classes have been refactored. Try any commands requesting information from the network or try sending any document.</p> <pre><code>silkaj info\nsilkaj -ep <hostname>:<port> membership\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#transaction-recipients-and-amounts-definition-reading-from-a-file","title":"Transaction recipients and amounts definition reading from a file","text":"<p>You can now define <code>recipients.txt</code> file following this format:</p> recipients.txt<pre><code>ABSOLUTE\n\n# moul-test\n10 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\n\n# matograine\n20 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm\n</code></pre> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>Check that everything works fine with <code>RELATIVE</code> reference. You can also check broken file, and see if Silkaj reacts properly to any error in the file format definition.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned for April 16th 2022, which will be released with an announcement listing the new features as well as a detailed changelog.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v0110-release/","title":"Silkaj v0.11.0 release","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.11.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v0110-release/#introduction","title":"Introduction","text":"<p>This release comes with the <code>pipx</code> installation method, a new design of command line interface with commands separated in groups. Last but not least, it contains the migration to <code>Texttable</code> table library, network improvements and fixes, and Python v3.11 support.</p> <p>On the development environment side, the repository has been restructured, the code has been annotated with types, and linted. <code>mypy</code> and <code>pylint</code> pre-commit hooks have been introduced. The tests have been separated into unit and integration tests. <code>main</code> branch is new name of the main branch.</p> <p>This release emphasis was put onto strengthen the development environment as well as improving the structure of Silkaj code base. The goal was to do preparations and cleaning before Substrate migration in order to be fully focus onto it in next development cycle.</p> <p>This release is the latest planned major release with Duniter v1/BMA support and the one planned to end into Debian 12 Bookworm.</p>"},{"location":"blog/silkaj-v0110-release/#pipx-installation-method","title":"<code>pipx</code> installation method","text":"<p><code>pipx</code> have been found to be a recommendable tool over <code>pip</code> to install an end-user Python software when the latter is not available in distributions repositories. In addition to <code>pip</code> features, <code>pipx</code> creates virtual environments, which prevents conflicting dependencies among several installed Python software. A nice feature of <code>pipx</code> is the <code>ensurepath</code> commands which takes care to add the Python executables path into the <code>PATH</code> environment variable, which can be found to be the trickiest part of the installation. Silkaj documentation has been updated to suggest <code>pipx</code> instead of <code>pip</code>.</p> <p>In short, you can install Silkaj via <code>pipx</code> this way:</p> <pre><code>sudo apt install pipx libsodium23\npipx install silkaj\n</code></pre> <p>For a comprehensive documentation, check the installation documentation.</p>"},{"location":"blog/silkaj-v0110-release/#new-cli-design","title":"New CLI\u00a0design","text":"<p>The commands have been grouped into following groups: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. The other commands not related to these topics have been kept at the root of the CLI\u00a0tree.</p> <pre><code>silkaj --help\n about Display program information\n authentication Generate authentication file\n blockchain Blockchain related commands\n checksum Generate checksum out of a passed pubkey or an...\n license Display \u011e1 monetary license\n money Money management related commands\n wot Web-of-Trust related commands\n</code></pre> <pre><code>silkaj blockchain --help\n blocks Display blocks: default: 0 for current window size\n difficulty Display the current Proof of Work difficulty level to...\n info Display information about currency\n verify Verify blocks\u2019 signatures.\n</code></pre> <pre><code>silkaj money --help\n balance Get wallet balance\n history Display transaction history\n transfer Transfer money\n</code></pre> <pre><code>silkaj wot --help\n certify Send certification\n lookup User identifier and public key lookup\n membership Send and sign membership document: for first emission and...\n revocation Create, save, verify or publish revocation document.\n status Check received and sent certifications and consult the...\n</code></pre> <p>In this process following commands have been renamed:</p> <pre><code>diffi \u2212> difficulty\ntx \u2212> transfer\ncert \u2212> certify\nrevocation save \u2212> revocation create\nwot \u2212> wot status\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#texttable","title":"Texttable","text":"<p>The code has been migrated from <code>tabulate</code> to <code>Texttable</code> external table libraries. <code>Texttable</code> was introduced and was only used from the <code>history</code> command, where the other commands were using <code>tabulate</code>. Both were used, and we had to make the choice to stick with one and get the opportunity to reduce the dependency list of one item. The migration has been done. You will probably notice differences in the table style and the alignments in the columns.</p> <p>Before, with <code>tabulate</code>:</p> <pre><code>| uid | blocks | percent |\n|-------------+----------+-----------|\n| vit2 | 33 | 33.0 |\n| Pini | 25 | 25.0 |\n| moul-test | 24 | 24.0 |\n| jytou4-test | 10 | 10.0 |\n| jytou5-test | 8 | 8.0 |\n</code></pre> <p>Now, with <code>texttable</code>:</p> <pre><code>\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502 uid \u2502 blocks \u2502 percent \u2502\n\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\n\u2502 vit2 \u2502 33 \u2502 33 \u2502\n\u2502 Pini \u2502 26 \u2502 26 \u2502\n\u2502 moul-test \u2502 23 \u2502 23 \u2502\n\u2502 jytou4-test \u2502 10 \u2502 10 \u2502\n\u2502 jytou5-test \u2502 8 \u2502 8 \u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#network","title":"Network","text":"<p>Breaking network connection is something recurrent on local network with BMA. A hack have been introduced to circumvent this issue with <code>sleep</code> calls between repetitive requests which retrieve user ids from public keys.</p> <p>The singletons have been replaced with <code>@functools.lru_cache()</code> decorator usage. They are both used to reduce the network traffic and therefore speed-up the commands execution. They are basically allowing to reuse the result obtained from the first request in case the same request happen again. In Silkaj, they are used to retrieve the UD value, the currency parameters, and the head block only once. Singletons pattern has been a pain to handle specially within the tests. <code>@functools.lru_cache()</code> fixes that which comes in handy as a boilerplate.</p>"},{"location":"blog/silkaj-v0110-release/#argos","title":"Argos","text":"<p><code>argos</code> command have been removed. This command was displaying basic information similar to the <code>info</code> command but formatted for Argos. Argos is a GNOME Shell extension which displays what has been generated out of a shell command into a GNOME Shell pop-over. This command has been found not to be really used and poorly maintained. It has been decided to be remove in the meantime.</p>"},{"location":"blog/silkaj-v0110-release/#python-311","title":"Python 3.11","text":"<p>This release introduces support for Python v3.11 released on the 24th of October 2022.</p>"},{"location":"blog/silkaj-v0110-release/#repository-restructuration","title":"Repository restructuration","text":"<p>As well as the new CLI\u00a0commands grouping, the runtime and the tests code have been classified into following directories: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. In addition to that, there is now a Python file per command and files for \"helpers\" and tools placed aside.</p>"},{"location":"blog/silkaj-v0110-release/#development-environment","title":"Development Environment","text":"<p>New <code>pre-commit</code> hooks have been introduced: <code>mypy</code>, <code>pylint</code>, <code>autoflake</code>, <code>pre-commit-hooks</code>, and <code>mdformat</code>. Type annotations has been introduced in the whole runtime code. This greatly improves the code quality, specially now that the code is fully typed, and linted. It will be of great help in future developments.</p> <p>The tests have been separated into <code>unit</code> and <code>integration</code> tests directories. This separation makes things clearer. The unit tests are pretty quick to be performed, where the integration tests takes more time since they require network requests. On the CI side, now just one job runs the integration tests in the job generating the coverage. Integration tests were known to fail because of the unstable nature of the network. Now, in case the integration tests fails, it is only necessary to restart one job.</p> <p>The branch workflow changed to a unique <code>main</code> branch which takes over the <code>dev</code> and <code>master</code> branches.</p> <p>The coverage integration into GitLab has been fixed.</p>"},{"location":"blog/silkaj-v0110-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/silkaj-v0110-release/#outlook","title":"Outlook","text":"<p>v0.20.0 is planned to be the next release. It will be fully dedicated to add support for Duniter v2 based on Substrate framework. Duniter v1/BMA support will be dropped from Silkaj v0.2x branch, while v0.1x will still be maintained until we productively switch to Duniter v2. But, no new features will be implemented on v0.1x branch. This development cycle might take some time, so it is expected to get preview releases.</p> <p>v0.20.0 development cycle is planned as follow. The network layer needs to be adapted to use following APIs: Substrate RPC, and Hasura indexer\u2019s using GraphQL. Then, It is planned to migrate current features and commands. Finally, new v2 related features will be implemented.</p> <p>In this development cycle, parallel developments might occur, such as setting up the new website or the configuration support implementation in Silkaj.</p> <p>We are looking forward for a better future with the migration of Duniter on Substrate framework.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/","title":"Call for testing Silkaj v0.11.0rc0","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.11.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> <p>It is planned to be the latest release with Duniter v1/BMA support and the release to enter Debian 12 Bookworm.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <p>Install <code>pipx</code> from the installation documentation:</p> <pre><code>sudo apt install pipx\npipx install --pip-args \"\\--pre\" silkaj\n</code></pre> <p>To install and run Silkaj from the container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0 silkaj\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#tests","title":"Tests","text":"<p>Please check v0.11.0 milestone short summary as well as the changelog containing the changes which did happen during this development cycle.</p> <p>Structural changes were made, so please check Silkaj is still working in its entirety. Manual tests help us making sure everything works fine in different cases. Make sure you test it on \u011e1-Test network to avoid a revocation or any money loss to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pipx-installation","title":"Pipx installation","text":"<p>Test that the newly introduced <code>pipx</code> method installation documentation works fine in your case, with your particular Unix system. Tell us how can the documentation be improved, if a non-obvious step for you is missing or if a necessary package isn't listed for Silkaj to work on your system.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#new-cli-design","title":"New CLI\u202fdesign","text":"<p>Silkaj commands have been reorganized into following groups: <code>blockchain</code>, <code>money</code>, <code>wot</code>. Some commands not related to these contexts have been kept in the top-level group. Tell us if the new CLI design with sub-sub-commands compared to the previous one with all the commands at the top-level instead fits best, is less convenient, is following a more structured logic.</p> <pre><code>Commands:\n about Display program information\n authentication Generate authentication file\n blockchain Blockchain related commands\n checksum Generate checksum out of a passed pubkey or an...\n license Display \u011e1 monetary license\n money Money management related commands\n wot Web-of-Trust related commands\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#table-generation","title":"Table generation","text":"<p>The underlying table generation library has been changed. Tell us if the tables are displaying content correctly, or if any improvement can be done, or if a regression got introduced.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned on November 26th 2022, which will be released with a detailed announcement explaining the changes.</p> <p>Silkaj team</p>"},{"location":"blog/v0111/","title":"V0.11.1","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206</li> </ul>"},{"location":"blog/v0112/","title":"V0.11.2","text":"<ul> <li>Add support for Python v3.12 and drop support for Python v3.7</li> </ul>"},{"location":"blog/silkaj-v020-release/","title":"Silkaj v0.2.0 release","text":"<p>This release introduce the <code>transaction</code> feature, the <code>amount</code> command to check out the balance of a wallet, and the initial authentication support.</p>"},{"location":"blog/silkaj-v020-release/#new-money-management-commands","title":"New money management commands","text":"<ul> <li><code>transaction</code> command with its main options: <code>--amountDU</code>, <code>--amount</code>, <code>--output</code>, <code>--comment</code></li> <li><code>amount</code> command to display account balance</li> </ul>"},{"location":"blog/silkaj-v020-release/#authentication","title":"Authentication","text":"<ul> <li><code>generate_auth_file</code> command to generate seed authentication file</li> <li>authentication methods implementation: scrypt, seed, seed authentication file with <code>--auth-scrypt</code>, <code>--auth-seed</code>, <code>--auth-file</code> options</li> </ul>"},{"location":"blog/silkaj-v020-release/#under-the-hood","title":"Under the hood","text":"<ul> <li>function to post request onto BMA API</li> <li>function to sign document</li> <li>function to check public key format and checksum</li> </ul>"},{"location":"blog/silkaj-v020-release/#others","title":"Others","text":"<ul> <li>In tables, the columns were randomly ordered. The columns in the table are now ordered thanks to <code>OrderedDict</code>.</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"blog/silkaj-v020-release/#thanks","title":"Thanks","text":"<p>A huge thanks to Tortue who brought a huge contribution to this release. Thanks mmuman.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/","title":"Silkaj v0.3.0 release: Let's send money!","text":"<p>This release comes with user experience enhancements on the <code>transaction</code> command and the authentication in general. A new <code>id</code> command allows to look-up for identities. Efforts were put into improving the installation process.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/#transactions","title":"Transactions","text":"<p><code>transaction</code> command enhancements:</p> <ul> <li>ask for confirmation: #27, !30.</li> <li>confirmation table containing transaction informations: !38</li> <li>don't prompt <code>scrypt</code> parameters. See <code>Authentication</code> \u00a7 below.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>new command <code>id</code> to search identities with pubkey or id: !29.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>pyenv installation tutorial: #23, !40.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#authentication","title":"Authentication","text":"<ul> <li>new authentication method: WIF. For future paper wallet feature: !45</li> <li>Don't prompt scrypt parameters at authentication. Use default ones: #39, !43</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#builds","title":"Builds","text":"<ul> <li>with Pyinstaller: #5.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#other","title":"Other","text":"<ul> <li>Ability to sort the table of <code>network</code> command: !33, !37.</li> <li>Change license from GNU GPLv3 to AGPLv3.</li> <li>Code formatting with <code>pep8</code>: !31.</li> </ul> <p>Thanks Tortue and jytou.</p>"},{"location":"blog/silkaj-v040-release/","title":"Silkaj v0.4.0 release","text":"<p>A new <code>wot</code> command allows to display received and sent certifictaions of an identity. Additionnal user experience enhancements have been added to the transaction feature. It is now possible to check the balance of multiple public keys and get a sum of the balances.</p>"},{"location":"blog/silkaj-v040-release/#new-wot-command-to-display-received-and-sent-certifications","title":"New <code>wot</code> command to display received and sent certifications","text":"<p>You can now explore the Web-of-Trust by displaying in a table the received and sent certifications of an identity.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block 0-E3B0C44298FC1\u2026\nreceived 23 and sent 27 certifications:\n| received | sent |\n|----------------+------------------|\n| Alfybe | gerard94 |\n| cuckooland | jeanferreira |\n| Loda | elois |\n| jeanferreira | Galuel |\n| BenoitLavenier | smyds |\n| smyds | CaizohanFerreira |\n| gpsqueeek | gpsqueeek |\n| fbuland | inso |\n| gerard94 | vit |\n| SebasC | Thatoo |\n| Thatoo | William |\n| inso | cuckooland |\n| Paulart | greyzlii |\n| vincentux | mathieuBize |\n| greyzlii | cgeek |\n| Mententon | PierreYves |\n| PierreYves | mmu_man |\n| paidge | OlivierAuber |\n| cgeek | paidge |\n| Nicolas | Alfybe |\n| jeangraine | 1000i100 |\n| pafzedog | dig |\n| Zheny | BenoitLavenier |\n| | MystraSam |\n| | jeangraine |\n| | Zheny |\n| | roodinux |\n</code></pre>"},{"location":"blog/silkaj-v040-release/#transaction-command-provides-a-better-ux","title":"Transaction command provides a better UX","text":"<p>The <code>transaction</code> command will beforehand check that the comment and recipient\u2019s public key are in right format before it actually prompt for the authentication.</p>"},{"location":"blog/silkaj-v040-release/#balance-of-multiple-public-keys","title":"Balance of multiple public keys","text":"<p>With the <code>amount</code> command, you can now pass multiple public keys <code>:</code> separated. The balance will be displayed for each of them, and a sum will be displayed at the end.</p> <pre><code>silkaj amount --pubkeys GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\nRequested default node: <g1.duniter.org:443>\nTotal amount of: GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\n----------------------------------------------------------------\nTotal Relative = 206.23 UD g1\nTotal Quantitative = 2064.41 g1\n\nTotal amount of: fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\n----------------------------------------------------------------\nTotal Relative = 89.72 UD g1\nTotal Quantitative = 898.08 g1\n\nTotal amount of: Total\n----------------------------------------------------------------\nTotal Relative = 295.95 UD g1\nTotal Quantitative = 2962.49 g1\n</code></pre>"},{"location":"blog/silkaj-v040-release/#installation","title":"Installation","text":"<ul> <li>Installation documentation</li> </ul>"},{"location":"blog/silkaj-v040-release/#certification-feature","title":"Certification feature","text":"<ul> <li>Crowdfunding</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/","title":"Silkaj v0.5.0 release: Let\u2019s certify!","text":"<p>For the eleventh Libre Currency Meeting (RML), I am pleased to announce Silkaj v0.5.0 release.</p> <p></p> <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#certification-feature","title":"Certification feature","text":"<p>Now, you can certify other identities (send certification document to the network):</p> <pre><code>silkaj cert jytou --auth-scrypt -p g1-test.duniter.org:443\nIn which language would you like to display \u011e1 license [en/fr]? fr\nDo you approve \u011e1 license [yes/no]? yes\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nUsing default values. Scrypt parameters not specified or wrong format\nScrypt parameters used: N: 4096, r: 16, p: 1\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert \u2502 From \u2502 \u2013> \u2502 To \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID \u2502 moul-test \u2502 \u2013> \u2502 jytou \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502 \u2013> \u2502 2pyPsXM8UCB88jP2NRM4rUHxb63qm89JMEWbpoRrhyDK \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this certification? [yes/no]: yes\nCertification successfully sent.\n</code></pre> <p>Certification command will display \u011e1\u2019s license in your web browser or in your terminal within a <code>less</code> in case you are running a headless computer.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#wot-command-now-displays-expiration-dates-of-certifications","title":"<code>wot</code> command now displays expiration dates of certifications","text":"<p>The table listing the received and sent certifications of an identity, now displays the expirations dates of the certifications.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block [#0](https://git.duniter.org/clients/python/silkaj/issues/0)-E3B0C44298FC1\u2026\nreceived 24 and sent 27 certifications:\n| received_expire | received | sent | sent_expire |\n|-------------------+----------------+------------------+---------------|\n| 2019-03-09 | cuckooland | cgeek | 2019-03-09 |\n| 2019-03-09 | Paulart | elois | 2019-03-09 |\n| 2019-03-09 | vincentux | mathieuBize | 2019-03-09 |\n| 2019-03-09 | BenoitLavenier | gerard94 | 2019-03-09 |\n| 2019-03-09 | Loda | smyds | 2019-03-09 |\n| 2019-03-09 | smyds | CaizohanFerreira | 2019-03-09 |\n| 2019-03-09 | gpsqueeek | gpsqueeek | 2019-03-09 |\n| 2019-03-09 | fbuland | inso | 2019-03-09 |\n| 2019-03-09 | jeanferreira | vit | 2019-03-09 |\n| 2019-03-09 | gerard94 | Thatoo | 2019-03-09 |\n| 2019-03-09 | SebasC | cuckooland | 2019-03-09 |\n| 2019-03-09 | Thatoo | William | 2019-03-09 |\n| 2019-03-09 | inso | greyzlii | 2019-03-09 |\n| 2019-03-09 | Alfybe | Galuel | 2019-03-09 |\n| 2019-03-12 | greyzlii | jeanferreira | 2019-03-09 |\n| 2019-03-18 | Mententon | PierreYves | 2019-03-09 |\n| 2019-04-02 | PierreYves | mmu_man | 2019-03-09 |\n| 2019-04-03 | paidge | OlivierAuber | 2019-03-13 |\n| 2019-05-24 | cgeek | paidge | 2019-03-13 |\n| 2019-06-10 | Nicolas | Alfybe | 2019-03-19 |\n| 2019-07-04 | jeangraine | 1000i100 | 2019-03-26 |\n| 2019-07-23 | pafzedog | dig | 2019-03-31 |\n| 2019-08-07 | Zheny | BenoitLavenier | 2019-04-22 |\n| 2020-03-17 | HugoTrentesaux | MystraSam | 2019-06-16 |\n| | | jeangraine | 2019-06-22 |\n| | | Zheny | 2019-06-25 |\n| | | roodinux | 2019-07-01 |\n</code></pre>"},{"location":"blog/silkaj-v050-release-lets-certify/#logo","title":"Logo","text":"<p>Silkaj now has a logo thanks to Attilax. You can find it in this repository. I choose the black and white one. Here is a crowdfunding to free the logo.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#repository-migration-to-gitlab","title":"Repository migration to GitLab","text":"<p>I migrated the repository to our GitLab instance and archived the GitHub repository:</p> <ul> <li>https://git.duniter.org/clients/python/silkaj</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#website","title":"Website","text":"<p>Silkaj's website has been published among other websites on our GitLab instance. New revisions will be automatically published thanks to GitLab Pages. Here you can find the repository: https://git.duniter.org/websites/silkaj_website/</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#future","title":"Future","text":"<p>You can have a look at the next v0.6.0 milestone to have an idea of what could be included into next Silkaj development cycle.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#helps","title":"Helps","text":"<p>This whole work has been done voluntarily aside a dept-salary\u2019s paid job. If you like what have been achieve, please contribute, by giving libre units to its only and main developer or to Duniter\u2019s developers to improve our little world.</p>"},{"location":"blog/silkaj-v060-release-lets-install/","title":"Silkaj v0.6.0 release: Let\u2019s install","text":"<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the twelfth Libre Currency Meeting.</p> <p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#user-installation-eased-via-pypipip","title":"User installation eased via PyPI/pip","text":"<p>Installing Silkaj has been a burning issue: Only Fedora users could install Silkaj with the Pyinstaller binary, since that\u2019s where I was building it. The others, would have had to install a development environment with <code>pyenv</code> and the Python dependencies in order to make it work.</p> <p>Thanks to Cebash\u2019s work. Now, we are able to install Silkaj with <code>pip</code>, the Python package manager, which retrieves the package from Python Package Indexer (PyPI):</p> <pre><code>pip3 install silkaj --user\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#development-environment-with-pipenv","title":"Development environment with Pipenv","text":"<p>We switched from <code>pyenv+pip</code> to Pipenv because Pipenv offers a better development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#transaction","title":"Transaction","text":""},{"location":"blog/silkaj-v060-release-lets-install/#multi-recipients-transaction","title":"Multi-recipients transaction","text":"<p>Thanks to cgeek, Silkaj is the first client, besides Remuniter, able to send multi-recipients transaction. This means, that we will be able to transfer money to several recipients within a single transaction. To do so, we have to pass recipients\u2019 public keys separated with a colon <code>:</code> operator, as follow:</p> <pre><code>silkaj tx --auth-file --amount 2 --gtest --output \\\nDpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC:7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 pubkey\u2019s amount before tx \u2502 15375.33 \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (unit) \u2502 4.0 \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (relative) \u2502 0.0104 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 pubkey\u2019s amount after tx \u2502 15371.33 \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (pubkey) \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (id) \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey) \u2502 DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id) \u2502 vit \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey) \u2502 7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id) \u2502 cuckooland \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 comment \u2502 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]: yes\nGenerate Transaction:\n - From: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n - To: DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC\n - To: 7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n - Amount: 4.0\nTransaction successfully sent.\n</code></pre> <p>Notes:</p> <ul> <li>Each pubkey will receive the same amount of money. The amount per recipients can not be specified yet.</li> <li>The purpose of this feature is to remunerate Duniter developers.</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#display-confirmation-panel","title":"Display confirmation panel","text":"<p>Before the transaction is actually sent, the balance before and after the transaction is displayed in the summary table. Check the example above.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#two-wrappers","title":"Two wrappers","text":"<ul> <li>Multi-recipients transfers and automation</li> <li>Transaction generator written in Shell</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#wot-view-improvements","title":"WoT view improvements","text":"<ul> <li>Display of the certifications stock</li> <li>Membership expiration due to the membership expiration or due the fact that the threshold of minimal number of certifications is about to be crossed by certifications expirations</li> <li>Identity status</li> </ul> <pre><code>moul-test (5B8iM\u2026) from block 167750-0000A51F\u2026\nreceived 8 and sent 15/100 certifications:\n| received_expire | received | sent | sent_expire |\n|-------------------+---------------------+-------------------+---------------|\n| 2018-11-21 | esprit \u2714 | MeluaTest | 2018-11-19 |\n| 2018-12-15 | GAS2000 \u2714 | esprit | 2018-11-21 |\n| 2018-12-19 | matograine-G1Test \u2714 | GAS2000 | 2018-12-10 |\n| 2018-12-20 | scanlegentil \u2714 | guwop | 2018-12-10 |\n| 2019-01-29 | vit \u2714 | matograine-G1Test | 2019-02-04 |\n| 2019-02-07 | Elois \u2714 | Elois | 2019-02-07 |\n| 2019-02-15 | cuckooland \u2714 | Vincentest | 2019-02-07 |\n| 2019-02-16 | piaaf31GT \u2714 | cuckooland | 2019-02-07 |\n| | | vit | 2019-02-07 |\n| | | scanlegentil | 2019-02-07 |\n| | | cgeek | 2019-02-07 |\n| | | isawien45 | 2019-02-07 |\n| | | aguy-dev | 2019-02-07 |\n| | | piaaf31GT | 2019-02-14 |\n| | | kimamila | 2019-02-15 |\n\nMembership expiration due to certification expirations: 2018-12-20\nmember: True\nMembership document expiration: 2018-12-31\nSentry: True\noutdistanced: False\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#scrypt-authentication-by-default","title":"Scrypt authentication by default","text":"<p>Previously, the authentication method had to be specified. Now, when no authentication method is specified, two inputs will be prompted in order to authenticate with the scrypt method. You can still specify other authentication methods, with following options:</p> <pre><code>Authentication:\n for amount, transaction, certification, and generate_auth_file commands\n - Scrypt is the default authentication method with 4096,16,1 as default values\n you can specify others values specifying following parameters: -n <N> -r <r> -p <p>\n - Seed: --auth-seed\n - File: --auth-file [--file=<path file>], './authfile' will be taken if there is no path specified\n - WIF: --auth-wif\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#gtest","title":"\u011etest","text":"<p>A new <code>--gtest</code> option has been added to ease the connection to \u011e1-test currency network for testing purposes. It uses the official node: https://g1-test.duniter.org.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#network-performances","title":"Network performances","text":"<p>With this update, Silkaj is retrieving information only once. Before, data was retrieved every time it was needed. Now, once the information has been fetched, it is kept into the memory and reused.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#python-37-support","title":"Python 3.7 support","text":"<p>Silkaj has been tested with Python 3.7. Results show that there has been no issues. Python 3.7 has been set as the current version in Pipenv development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#new-commands","title":"New commands","text":""},{"location":"blog/silkaj-v060-release-lets-install/#license","title":"License","text":"<p>Originally built for the certification feature, the <code>license</code> command allows the consultation of the \u011e1\u2019s license at any time given.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#about","title":"About","text":"<p>A new command displays information about Silkaj:</p> <pre><code>silkaj about\n @@@@@@@@@@@@@\n @@@ @ @@@\n @@@ @@ @@@@@@ @@. silkaj 0.6.0\n @@ @@@ @@@@@@@@@@@ @@,\n @@ @@@ &@@@@@@@@@@@@@ @@@ Powerfull and lightweight command line client\n @@ @@@ @@@@@@@@@# @@@@ @@(\n @@ @@@@ @@@@@@@@@ @@@ @@ Built in Python for Duniter\u2019s currencies: \u011e1 and \u011e1-Test\n @@ @@@ @@@@@@@@ @ @@@ @@\n @@ @@@ @@@@@@ @@@@ @@ @@ Authors: moul, tortue, jytou, cebash, cgeek\n @@ @@@@ @@@ @@@@@@@ @@ @@\n @@ @@@@* @@@@@@@@@ @# @@ Website: https://silkaj.duniter.org\n @@ @@@@@ @@@@@@@@@@ @ ,@@\n @@ @@@@@ @@@@@@@@@@ @ ,@@ Repository: https://git.duniter.org/clients/python/silkaj\n @@@ @@@@@@@@@@@@ @ @@*\n @@@ @@@@@@@@ @ @@@ License: GNU AGPLv3\n @@@@ @@ @@@,\n @@@@@@@@@@@@@@@\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#logo","title":"Logo","text":"<p>Silkaj\u2019s logo, designed by Attilax, is now fully funded!</p>"},{"location":"blog/silkaj-v060-release-lets-install/#thanks","title":"Thanks","text":"<p>Special thanks to Moul, Cebash, cgeek, and Attilax.</p> <p>Thanks to vit, Inso, vincentux, and jardin.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#future-development-cycles","title":"Future development cycles","text":"<ul> <li> <p>v0.7.0 will be focused on refactoring Silkaj in order to be ported to DuniterPy usage, a more robust API implementation. This mean sharing a common code with Sakia.</p> </li> <li> <p>v0.8.0 will add new features based on DuniterPy such as new authentication methods as well as being allowed to send the remaining Web-of-Trust documents: identity publication, membership publication and renewal, and revocation.</p> </li> <li> <p>v0.9.0 Let\u2019s see what come to this milestone.</p> </li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievements, please contribute by reporting bugs, contributing to the code or giving Duniter\u2019s developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v061-release/","title":"Silkaj v0.6.1 release","text":"<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p>"},{"location":"blog/silkaj-v061-release/#bug-fix-in-intermediaries-transactions","title":"Bug fix in intermediaries transactions","text":"<p>When sending a transaction with a big amount, there is a limit of forty sources per transaction allowed by \u011e1 protocol. In order to reach a big amount of money with only forty sources, the clients proceed beforehand to change operations to merge more money into fewer sources. Since the multi-recipients feature, a regression was introduced, the intermediaries transaction\u2019s recipient were wrong and sent to the recipient of the transaction. This release fixes it!</p>"},{"location":"blog/silkaj-v061-release/#certification-renewal","title":"Certification renewal","text":"<p>Duniter v1.7 now allows to renew certification before their expiration.</p> <p>This protocol modification is now live on the \u011e1-Test currency since December 2018 in order to check that everything is working fine. You can already renew certifications on the \u011e1-Test currency.</p> <p>This protocol modification will be published on the \u011e1 currency when ready.</p> <p>Before processing the certification, Silkaj will check if the certification can be renewed. In the case of \u011e1, you will be able to renew the certification two months after the previous one. And, on the \u011e1-test, after twelve and half a day.</p>"},{"location":"blog/silkaj-v061-release/#tests-on-windows","title":"Tests on Windows","text":"<p>Silkaj have been installed for the first time on the Windows platform via <code>pip</code>. It works! There is still fixes needed in order to have Silkaj to work properly.</p>"},{"location":"blog/silkaj-v061-release/#thanks","title":"Thanks","text":"<p>Thanks to Moul, Galuel, and Bernard.</p>"},{"location":"blog/silkaj-v061-release/#upgrade","title":"Upgrade","text":"<pre><code>pip3 install silkaj --user --upgrade\n</code></pre> <ul> <li>Install with <code>pip</code> documentation for more details.</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/","title":"Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website","text":"<p>Six months after the previous major release, I am pleased to announce the release of Silkaj v0.7.0 for the thirteenth Free Currency Meeting.</p> <p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> <p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#duniterpy-migration","title":"DuniterPy migration","text":"<p>DuniterPy is a Python library which implements methods to request from and send information to the Duniter nodes. It also has authentication methods to sign documents such as transactions and certifications. DuniterPy was initially written for the Sakia client. Silkaj and Sakia are now sharing the same common code. The migration to DuniterPy was tough, but it was worth it: It will allow the implementation of new features in future versions.</p> <p>There were many challenges: keeping the same functionalities, making Silkaj\u2019s code asynchronous, and replacing the authentication and the network code by the ones implemented in DuniterPy. One struggling issue was that the intermediaries transactions were no longer working, because, the equality method of the transaction output source was not implemented, as they used to be stored in a string and are now stored into an <code>OutputSource</code> object. So, the equality had to be implemented.</p> <p>Check-out DuniterPy versions from v0.50.0 to v0.54.1 to follow the evolution of DuniterPy. These versions were specially made for Silkaj. In the future, following functionalities are planned: sending identity, membership, and revocation documents, the usage of authentication methods implemented in DuniterPy, and the usage of the planned GVA API.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#click-migration","title":"Click migration","text":"<p>Since Debian Buster freeze was going to happen very soon and <code>commandlines</code> library wasn\u2019t packaged into Debian, the migration to Click \u201cCommand Line Interface Creation Kit\u201d had to be done quickly. I decided to migrate to this really nice library, since it is much more maintained, comes with a better code, and is less buggy. Here you can see the new command line interface:</p> <pre><code>Usage: silkaj [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n -h, --help Show this message and exit.\n -v, --version Show the version and exit.\n -p, --peer TEXT Default endpoint will reach \u011e1 currency with\n `https://g1.duniter.org` endpoint. Custom endpoint\n can be specified with `-p` option followed by\n <domain>:<port>\n -gt, --gtest \u011eTest: `https://g1-test.duniter.org` endpoint\n --auth-scrypt, --scrypt Scrypt authentication: default method\n --nrp TEXT Scrypt parameters: defaults N,r,p: \"4096,16,1\"\n -af, --auth-file Authentication file. Defaults to: './authfile'\n--file TEXT Path file specification with '--auth-file'\n [default: authfile]\n --auth-seed, --seed Seed hexadecimal authentication\n --auth-wif, --wif WIF and EWIF authentication methods\n\nCommands:\n about Display program information\n argos Display currency information formatted for Argos or BitBar\n authfile Generate authentication file\n balance Get wallet balance\n blocks Display blocks: default: 0 for current window size\n cert Send certification\n diffi Display the current Proof of Work difficulty level to generate...\n history Display transaction history\n id Find corresponding identity or pubkey from pubkey or identity\n info Display information about currency\n license Display \u011e1 license\n net Display network view\n tx Send transaction\n wot Check received and sent certifications and consult the...\n</code></pre> <p>The command line interface has changed. General parameters (options and arguments) should be placed in between the command and the sub-command. Specific parameters should be placed after the sub-command.</p> <pre><code>silkaj --gtest --auth-file tx --amount 5 --output <pubkey>\n</code></pre> <p>For instance, in previous command <code>--gtest</code> and <code>--auth-file</code> are general parameters, where <code>--amount</code> and <code>--output</code> are specific parameters separated by <code>tx</code> sub-command.</p> <p>You can display general parameters with <code>silkaj --help</code> and specific parameters with <code>silkaj tx --help</code> for instance.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#cli-changes","title":"CLI changes","text":"<ul> <li><code>issuers</code>, <code>amount</code>, and <code>generate_auth_file</code> commands have been respectively renamed to <code>blocks</code>, <code>balance</code>, and <code>authfile</code>.</li> <li>The long sub-commands <code>certification</code>, <code>transaction</code>, <code>network</code>, <code>identities</code> have been removed. Now the small ones have to be used: <code>cert</code>, <code>tx</code>, <code>net</code>, <code>id</code>.</li> <li><code>blocks</code> defaults to <code>0</code> which stands for the current windows size and now has a limit of 5.000 blocks as set by BMA.</li> <li><code>balance</code>: public keys separator does no longer use colons <code>:</code>, it uses spaces instead.</li> <li>Additionally, there are the new smaller authentication options: <code>--scrypt</code>, <code>-af</code>, <code>--seed</code>, <code>--wif</code>, without the <code>--auth</code> prefix.</li> </ul> <p>You might discover other breaking changes. For more details regarding these changes check out this list.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#transaction-history","title":"Transaction history","text":"<p>It is now possible to display the transactions history of a wallet:</p> <pre><code>silkaj history GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP --uids\n\nTransactions history from: moul GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\nCurrent balance: 17296.86 \u011e1, 1717.66 UD \u011e1 on the 2019-05-12 13:32:30\n+---------------------+------------------------+------------+--------------+-----------------------+\n| Date | Issuers/Recipients | Amounts \u011e1 | Amounts UD\u011e1 | Comment |\n+=====================+========================+============+==============+=======================+\n| 2019-04-23 21:31:27 | CvrMiUhAJpNyX5sdAy | 100.700 | 10 | Silkaj sur Ubuntu c |\n| | | | | est une tres belle |\n| | | | | surprise. Merci ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-22 18:59:34 | HugoTrentesaux - | 100.700 | 10 | Merci pour Duniter |\n| | 55oM6F9ZE2MGi | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 14:35:15 | ArthurLutz - | 200 | 19.861 | pour les paquets |\n| | 4C4jsvxmFQBoH | | | yunohost ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 10:40:11 | SonqoZEfZXHDBxi4Kx | 30.210 | 3 | [G1SMS] VIREMENT 300 |\n| | | | | LOVE (30.21 G1) |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 08:04:58 | fbuland - | 200 | 19.861 | merci resolution bug |\n| | 4bD7J3uA5pH2N | | | |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-13 16:37:20 | Vivakvo - | 100.700 | 10 | Merci pour Duniter |\n| | 4wUdA1dx1NCZU | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-12 08:59:04 | C4pUj26pVgPVPLEZ96 | 50 | 4.965 | Bravo pour le bug |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 16:48:04 | 73ArdqtsQScypV35H4 | 100.700 | 10 | Merci pour Duniter |\n| | | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:58:06 | Lucas - HY2nJUyxpzyrw | 100.700 | 10 | Merci pour Duniter |\n| | | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:10:25 | BenoitLavenier - | 100.700 | 10 | Merci pour Duniter |\n| | 38MEAZN68Pz1D | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 14:11:00 | 4sfQWXBBy811CCDV6J | 100.700 | 10 | 1.7.16 |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 22:59:00 | elois - D9D2zaJoWYWve | 100 | 9.930 | merci pour le debug |\n| | | | | de duniter et du |\n| | | | | process de release |\n| | | | | aussi |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 21:51:41 | Matograine - | 100.700 | 10 | V1.7.16 |\n| | CmFKubyqbmJWb | | | |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 01:18:44 | cgeek - 2ny7YAdmzReQx | 1007 | 100 | Duniter v1.7.16 |\n+---------------------+------------------------+------------+--------------+-----------------------+\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#debian-and-ubuntu-package","title":"Debian and Ubuntu package","text":"<p>Silkaj v0.6.5 was packaged for Debian Buster v10, which is planned te be released on July 6th 2019. This package greatly benefits all Debian-based distributions. Moreover, Silkaj was also added into Ubuntu 19.04 repository, which was published on March 2019. For more details check-out where Silkaj was included into the Debian-based distributions. Silkaj v0.6.5 now comes with Click migration, auto-completion, and bug fixes, however it does not include DuniterPy migration and v0.7.0 features.</p> <p>You can install Silkaj with following command:</p> <pre><code>sudo apt install silkaj\n</code></pre> <p>This work have been made possible thanks to jonas, a Debian developer.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#proof-of-work-difficulty-level","title":"Proof-of-Work difficulty level","text":"<p>Since we are using DuniterPy which includes WebSocket management, this latter can be used to improve the network connection. Previously, Silkaj was sending queries every five seconds to check if a new block was added to the blockchain. Now, Silkaj gets a notification every time a new block is appended to the blockchain. This improvement dramatically reduces traffic network.</p> <p>To better monitor the network, the header was improved and now displays current block\u2019s number and its date of generation:</p> <pre><code>Current block: n\u00b0219981, generated on the 2019-05-12 14:36:35\nGeneration of next block n\u00b0219982 possible by at least 31/44 members\nCommon Proof-of-Work difficulty level: 89, hash starting with `00000[0-6]*`\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#new-website","title":"New website","text":"<p>At the beginning of the project, a simple website was made. Since then, Silkaj evolved and have brought new features which should be reflected on the website.</p> <p>More content was added to the website, which now has three pages: a main one, one for the features and the other one for the installation.</p> <p>Attilax worked to give the website a new black style, to make it looks like a terminal. He also translated it in French which makes the website available in two languages.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#thanks","title":"Thanks","text":"<p>Attilax, Bernard, cebash, jonas, matograine, vit</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#install-and-upgrade","title":"Install and upgrade","text":"<ul> <li>Install and upgrade documentation</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#future-development-cycles","title":"Future development cycles","text":"<p>Future releases will add new features based on DuniterPy such as new authentication methods as well as being able to send WoT documents: identity publication, membership publication and renewal, and revocation. It is also planned to use features brought by Click usage, to set-up a CI/CD pipeline, and locking the code with tests.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievement, please contribute by reporting bugs, contributing to the code or giving to Duniter developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#share-on-social-networks","title":"Share on social networks","text":"<ul> <li>Mastodon</li> </ul>"},{"location":"blog/v071/","title":"V0.7.1","text":"<ul> <li>Bug fix transaction generation</li> </ul>"},{"location":"blog/v072/","title":"V0.7.2","text":"<ul> <li>Fix result of the multiplication of the amount passed as float for the transaction command</li> </ul>"},{"location":"blog/v073/","title":"V0.7.3","text":"<ul> <li>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:<ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate <code>for</code> loop</li> </ul> </li> </ul>"},{"location":"blog/v074/","title":"V0.7.4","text":"<ul> <li>#273: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"blog/v075/","title":"V0.7.5","text":"<ul> <li>#276: Publish on PyPI with the previous method: <code>setup.py</code>, <code>wheel</code>, and <code>twine</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"blog/v076/","title":"V0.7.6","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"blog/silkaj-v080-release/","title":"Silkaj v0.8.0 release","text":""},{"location":"blog/silkaj-v080-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. This release comes along with a number of new features and improvements. The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> <p>Version 0.8.0 was done in 145 commits, and features seven major improvements:</p> <ol> <li><code>membership</code>: We developed a command to allow users to send membership documents.</li> <li>Identity choice: We can now manually choose the desired identity among other identities.</li> <li>Multi-recipients transactions: Users can simultaneously send a different amount of \u011e1 to different recipients.</li> <li>Display improvements for <code>tx</code> and <code>balance</code>: For a better overview, we modified the <code>tx</code> table and added a <code>balance</code> table.</li> <li>Public key checksum display and verification: For security purposes, Silkaj displays and verifies the checksum.</li> <li><code>verify</code>: We set up a command to check whether a block is valid.</li> <li>Dev Env: We set up a solid development environment for Poetry, CI/CD, and Tests.</li> </ol> <ul> <li>A. Poetry: We migrated to Poetry.</li> <li>B. CI/CD: We set up a pipeline to run automatic jobs.</li> <li>C. Tests: We started to write tests.</li> </ul>"},{"location":"blog/silkaj-v080-release/#1-membership","title":"1. Membership","text":"<p>After the transaction and the certification commands, the much awaited <code>membership</code> command is now available.</p> <p>Users can send their first membership request to be a certified member of the \u011e1 community. As certified members have to renew their membership each year, this command allows to send the renewal application in question. It displays the expiration date of the current membership and indicates the identification blockstamp of the user. In the event a user forgets that they have already sent a membership request, a pop up displays if there is a pending membership request in the mempool.</p> <pre><code>silkaj membership\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nYou will be asked to approve \u011e1 license. Would you like to display it? [y/N]: n\nDo you approve \u011e1 license? [y/N]: y\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership \u2502 in 3 weeks \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Number of pending membership(s) in the mempool \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending membership documents will expire \u2502 in 1 year \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID) \u2502 moul \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key \u2502 GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:J1k \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity \u2502 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B93\u2026 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published \u2502 March 8, 2017 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership \u2502 in 1 year \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 months \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending a membership document for this identity? [y/N]:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#2-identity-choice","title":"2. Identity choice","text":"<p>When using the commands <code>wot</code>, <code>cert</code>, and <code>membership</code>, Silkaj used to select the first identity on the list. As this can lead to fishing, we added a new feature to pick the identity of your choice. Now, you can use the <code>uid</code> and the <code>pubkey</code> to certify an identity and study its status in the Web of Trust. Please note that identities can have the same user identifier and the same public key.</p> <pre><code>silkaj -gt wot moul\n| id | uid | pubkey | timestamp |\n|------+-----------+--------------------------------------------------+-----------------------|\n| 00 | moul1 | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s | 614118-00000EE8DFC0F\u2026 |\n| 01 | moul2 | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s | 614227-00000ED689406\u2026 |\n| 10 | moul1 | 3rp7ahDGeXqffBQTnENiXEFXYS7BRjYmS33NbgfCuDc8:DFQ | 614227-00000ED689406\u2026 |\n| 20 | moul-test | 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK | 167750-0000A51FF952B\u2026 |\nWhich identity would you like to select (id)?:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#3-transactions-multi-recipients-different-amounts-of-g1","title":"3. Transactions: multi-recipients & different amounts of \u011e1","text":"<p>Thanks to Matograine, users can now send different amounts of \u011e1 to multiple recipients in the same document. Working on this feature offered us the opportunity to rethink and clean up the CLI and the code related to the <code>tx</code> command. However, further efforts are required to build a more solid code base foundation. </p> <p>v0.8.0 comes with three breaking changes and four small options:</p> <ul> <li><code>--output</code> was renamed to <code>--recipient</code></li> <li>recipients public key are splits with the option <code>--recipient</code> instead of a colon character.</li> <li>The public key's checksum separator <code>!</code> is being replaced by the colon.</li> <li>small options have been introduced:<ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code> </li> </ul> </li> </ul> <p>The follow examples illustrates the change operated on the CLI. With the previous version of Silkaj, the following procedure was operated to send one unit to <code>pubkey1</code> and <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --output <pubkey>1!<checksum1>:<pubkey2>!<checksum2>\n</code></pre> <p>With the current version of Silkaj, the following procedures are operated to send one unit to <code>pubkey1</code> and two units to <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --recipient <pubkey1>:<checksum1> --amount 2 --recipient <pubkey2>:<checksum2>\n</code></pre> <p>With small options:</p> <pre><code>silkaj tx -a 1 -r <pubkey1>:<checksum1> -a 2 -r <pubkey2>:<checksum2>\n</code></pre> <p>In the case one amount is passed, the same amount will be send to the passed recipients. The <code>--allSources</code> option is only working with one recipient.</p>"},{"location":"blog/silkaj-v080-release/#4-display-improvements-for-tx-and-balance","title":"4. Display improvements for <code>tx</code> and <code>balance</code>","text":"<p>We merged the relative and absolute amounts into one cell. This applies to the cells: initial balance, total transaction amount, balance after the transaction, and individual amounts.</p> <p>To send a different amount of \u011e1 to multi-recipient proceed following:</p> <pre><code>silkaj tx -d 1 -d 2 \\\n-r CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7 \\\n-r d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \\\n-c \"Test different amounts to two different recipients\"\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Initial balance (unit|relative) \u2502 2207757.83 \u011eTest | 145.63 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total transaction amount (unit|relative) \u2502 45480.0 \u011eTest | 3.0 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Balance after transaction (unit|relative) \u2502 2162277.83 \u011eTest | 142.63 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (pubkey) \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (id) \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey) \u2502 CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:8Sj \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id) \u2502 Elois \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative) \u2502 15160.0 \u011eTest | 1.0 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey) \u2502 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id) \u2502 matograine-G1Test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative) \u2502 30320.0 \u011eTest | 2.0 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Comment | Test different amounts to two different recipients \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]:\n</code></pre> <p>The balance of a given public key is now displayed in a table. Bellow you can find an example of such a display.</p> <pre><code>silkaj balance 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey \u2502 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8:4VT \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Blockchain (unit|relative) \u2502 94322.48 \u011e1 | 9220.18 UD \u011e1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending transaction (unit|relative) \u2502 100.0 \u011e1 | 9.78 UD \u011e1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative) \u2502 94422.48 \u011e1 | 9229.96 UD \u011e1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N \u2502 13.35 x M/N \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v080-release/#5-pubic-key-checksum-display-verification-and-checksum-command","title":"5. Pubic key checksum display, verification, and checksum command","text":"<p>For security purposes, Silkaj now displays the checksum associated with the public key, and verifies it when passed to a command. If a public key or an authentication method is passed to the newly introduced <code>checksum</code> command, the later generates the associated checksum to the public key. if a public key and a checksum are passed, Silkaj displays whether the checksum is valid or not.</p>"},{"location":"blog/silkaj-v080-release/#6-verify","title":"6. <code>verify</code>","text":"<p>We introduced the new <code>verify</code> command to check whether the signatures of the blocks of the blockchain are valid since there was a bug in the cryptography library of Duniter. Cf Forum topic and Duniter ticket</p> <p>To verify blocks proceed following:</p> <pre><code>silkaj verify\nProcessing blocks verification [####################################] 100%\nWithin 0-342803 range, blocks with a wrong signature: 15144 31202 85448 87566 90830 109327 189835 199172 221274 253582\n</code></pre>"},{"location":"blog/silkaj-v080-release/#7-development-environment","title":"7. Development Environment","text":""},{"location":"blog/silkaj-v080-release/#a-poetry","title":"A. Poetry","text":"<p>We migrated the packaging and the dependency management tool from Pipenv to Poetry since Pipenv has been quite problematic recently and is also more suitable for larger projects.</p> <p>In comparison, Poetry is a well thought and stable tool which has been released by the end of 2019. In the former development environment, we had to define the dependencies twice in the <code>requirements.txt</code>, <code>setup.{py,cfg}</code>, <code>Pipenv</code> files. Poetry, however, supports the <code>pyproject.toml</code> file standardized by the Python project and is able to define the dependencies at once.</p> <p>If you would like to install Silkaj for development purposes, please follow this tutorial. You may also interested by checking the newly introduced contribution process documentation <code>CONTRIBUTING.md</code>.</p>"},{"location":"blog/silkaj-v080-release/#b-automatic-container-generation","title":"B. Automatic container generation","text":"<p>We set up an automated pipeline to generate containers for all supported Python versions: 3.5, 3.6, 3.7, and 3.8. These containers are based on official Python containers, which use Debian Buster Slim. On top of that, Poetry, <code>libsodium</code>, and other development tools are installed to continually check and test Silkaj in its pipeline. Since DuniterPy uses the same containers, it also profits from this automated container generation.</p>"},{"location":"blog/silkaj-v080-release/#c-cicd-pipelines","title":"C. CI/CD pipelines","text":"<p>Based on the containers set out above, a continuous integration and delivery pipeline has been set up to automatically run:</p> <ul> <li>Checks: format, build,</li> <li>Tests on all supported Python versions,</li> <li>Release publication automation on PyPI and PyPI test.</li> </ul> <p></p>"},{"location":"blog/silkaj-v080-release/#7-tests","title":"7. Tests","text":"<p>We started to write tests to ensure that all features of Silkaj are still functional when changing the code. However, in order to have all Silkaj commands fully tested, further efforts are required. During this development cycle, the test coverage raised from 37% to 69% and Silkaj is now covered by more than hundred tests.</p>"},{"location":"blog/silkaj-v080-release/#outlook","title":"Outlook","text":"<p>Silkaj is compatible with a range of Python versions. Currently, it can be used with Python 3.5, 3.6, 3.7, and 3.8. v0.8.x will be the last releases with Python 3.5 support. In v0.9.0, we will support Python 3.6, 3.7, 3.8, and 3.9.</p> <p>Since there is a deadline for packaging Silkaj and DuniterPy into Debian Bullseye (v11), we are putting all our efforts into the upcoming packaging. As for the coming version, DeathReaper, the <code>excluded</code> command, for which the crowdfunding has been completed, and the newly revamped <code>info</code> command will be stabilized and automatic tests will be written.</p> <p>ManUtopiK revamped Silkaj website in which you can look up all the presentations, the major features and documentations related to Silkaj. We are working on integrating the website into the project.</p> <p>For further details check out the presentations of the RML14. The oral presentations are in French and the slides in English:</p> <ul> <li>Moul's: How to contribute to Silkaj</li> <li>Matograine's: Envoyer des transactions exotiques avec Silkaj</li> </ul>"},{"location":"blog/silkaj-v080-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v081/","title":"V0.8.1","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine for your first release \\o/</p>"},{"location":"blog/v090rc/","title":"V0.9.0rc","text":""},{"location":"blog/v090rc/#call-for-testing-silkaj-v090rc","title":"Call for testing Silkaj v0.9.0rc","text":"<p>Hello everyone!</p> <p>We are pleased to publish a release candidate of Silkaj v0.9.0, and we would be happy to receive feedback before releasing it as a stable version.</p> <p>To install this pre-release version from PyPI, use this command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>Please test it globally, and check the changelog which contains the changes which happen during this development cycle. Pay a special attention to the transaction part where a part of the algorithm changed. There are new options on following commands:</p> <pre><code>silkaj history --full-pubkey\nsilkaj --dry-run cert\nsilkaj --dry-run/--display membership\n</code></pre> <p>Dry-run and display options are defined as general options, and only defined for this three cases for this release.</p>"},{"location":"blog/v090rc/#tests","title":"Tests","text":"<p>Manual tests help us making sure everything works fine for different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any loss of money.</p>"},{"location":"blog/v090rc/#tx","title":"<code>tx</code>","text":"<ul> <li>send a TX to a unique recipient</li> <li>send a TX to multiple recipients<ul> <li>with one amount</li> <li>with multiple amounts</li> </ul> </li> <li>send a TX to 92 recipients (can be 92 times the same)</li> <li>send a TX to 93 recipients (should fail)</li> </ul>"},{"location":"blog/v090rc/#membership","title":"<code>membership</code>","text":"<ul> <li>renew membership with <code>--dry-run</code> global option</li> <li>renew membership with <code>--display</code> global option</li> <li>renew membership without these two options</li> </ul>"},{"location":"blog/v090rc/#cert","title":"<code>cert</code>","text":"<ul> <li>send a certification with <code>--display</code> global option</li> <li>cert all identities you can on GTest network (thanks for keeping it alive ;-) )</li> <li>cert pubkey <code>4KEA63RCFF7AXUePPg5Q7JX9RtzXjywai1iKmE7LcoEC:DRz</code> on \u011e1-Test -> you should be suggested two identities</li> <li>cert identity <code>ggg_ggg_2</code> on \u011e1-Test -> you should NOT be proposed many identities</li> </ul>"},{"location":"blog/v090rc/#history","title":"<code>history</code>","text":"<ul> <li>check you history</li> <li>check you history and display userIDs</li> <li>check you history and display pubkeys in full-length</li> <li>check you history and display userIDs and pubkeys in full-length</li> </ul>"},{"location":"blog/v090rc/#wot","title":"<code>wot</code>","text":"<ul> <li>check your WoT infos are correct with <code>wot</code> command</li> </ul>"},{"location":"blog/v090rc/#checksum","title":"<code>checksum</code>","text":"<ul> <li>use <code>checksum</code> command to compute a checksum for one of your public keys.</li> <li>verify it with Silkaj</li> <li>verify it with Cesium</li> <li>try to change a character in the public key (with the checksum), then verify that it is wrong.</li> </ul>"},{"location":"blog/v090rc/#auth","title":"auth","text":"<ul> <li>create an authfile for a \u011e1-Test account</li> <li>send txs or certs using the authfile</li> </ul>"},{"location":"blog/v090rc/#other","title":"Other","text":"<p>Feel free to play!</p> <p>The release is planned for the 17th April of 2021, which will contain a detailed announcement of the changes and the new features.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v090-release/","title":"Silkaj v0.9.0 release","text":""},{"location":"blog/silkaj-v090-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.9.0. The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v090-release/#transaction","title":"Transaction","text":"<p>Silkaj is now properly handling the transaction document size limit. The 100 lines limit length of the transaction document in the compact format is now properly fulfilled by computing the length of the generated document.</p> <p>An important bug has been fixed regarding intermediaries transactions: When spending lots of sources (i.e. huge amounts from member wallets), many useless intermediaries transactions were sent and displayed. Intermediaries transactions are now correctly handled.</p> <p>Unit tests have been written on the <code>tx</code> command, which comforts us into developing new features.</p>"},{"location":"blog/silkaj-v090-release/#refactored-idlookup-command","title":"Refactored <code>id</code>/<code>lookup</code> command","text":"<p>The <code>id</code> command has been completely refactored. It now offers comprehensive results when looking for an identity by specifying a user identifier or a public key. Now the non-member user identifier are displayed. The command now uses same algorithm as <code>choose_identity()</code> which relies exclusively on <code>/wot/lookup</code> BMA's path. The command has been renamed to <code>lookup</code> to represent more closely what it does. This command renaming will also allow to introduce the future <code>identity</code> command.</p> <pre><code>silkaj lookup titi\nPublic keys or user id found matching 'titi':\n\n\u2192 4qJZFRfArLaUMEXDhsd69unsKynEFNLFazAVij4HNsBa:F4z \u2194 laetitia97421\n\u2192 4LCdTC9QsmqbFSHAhyaqGdDCVPr8Ywu2DZ8hDCzkdx4n:8ta \u2194 Amandinelaetitia\n\u2192 CehfxBHrowP6tXouR73GS52QhGAoNMtabooKbCvT7f3j:6cG \u2194 Laetiti974\n\u2192 FtZdA1HzHcDG6utoEgg6R5jjXfEne2ftS2UzvXajKurp:6Sm \u2194 Laetitia\n\u2192 EUn8uLJxgc3fVXJ1fBA74re4iD4Ws8Nk2xHytX1wLMfK:AQ2 \u2194 LaetitiaCarivenc\n\u2192 HqHZt9J1U7MwC3RF1bSjPgxACsTypfNjUThYFMZZfK6X:Dk1 \u2194 LaetitiaHOFF\n\u2192 5Vcm1zkHKoAMo9yy7Lk2HDX2Yn54agavtEUdrcFNmqkP:8mU \u2194 laetitiajanot\n\u2192 BfncGdTeq8qvhPZnBaM8T76SHM9xfx78ASRNZtGp64rZ:7tP \u2194 titi\n\u2192 BWKuSHYojjwzAXZZxSFTf5XVWneUMZqoWGUJEfWaFRL9:21F \u2194 titi43\n\u2192 49nWdTQqDT8qpazzPeP6NH92NwppG7YEh6PFYC2VecNA:Ba6 \u2194 titix\n</code></pre>"},{"location":"blog/silkaj-v090-release/#new-full-pubkey-option-on-the-history-command","title":"New <code>--full-pubkey</code> option on the <code>history</code> command","text":"<p>The <code>history</code> command adds a new option to display the whole public keys <code>--full-pubkey</code>:</p> <pre><code>silkaj -gt history 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH --full-pubkey\n\nTransactions history from: moul-test 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\nCurrent balance: 9012407.83 \u011eTest, 161.34 UD \u011eTest on the 2021-04-09 15:16:42\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| Date | Issuers/Recipients | Amounts \u011eTest | Amounts UD\u011eTest | Comment |\n+=====================+==============================+===============+=================+=============================+\n| 2021-03-29 20:42:33 | | | | Change operation |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -193320 | -3.460 | |\n| | DjqoHyhGDFr5amh:45s | | | |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -338310 | -6.060 | |\n| | DjqoHyhGDFr5amh:45s | | | |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n</code></pre>"},{"location":"blog/silkaj-v090-release/#balance-command-is-now-displaying-corresponding-member-identity-user-identifier","title":"<code>balance</code> command is now displaying corresponding member identity user identifier","text":"<pre><code>silkaj -gt balance 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User identifier \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative) \u2502 8634537.83 \u011eTest | 162.21 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N \u2502 1.05 x M/N \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v090-release/#display-option-on-cert-membership-commands","title":"Display option on <code>cert</code>, <code>membership</code> commands","text":"<p>This general option allows to display the generated document aside of the confirmation prompt before sending the document. It can be used for debugging, safety, or curiosity purposes. This option has only been implemented on the <code>cert</code> and the <code>membership</code> commands for now. The option should be available in next releases for the three others send-documents commands.</p> <pre><code>silkaj --gtest --auth-file --display cert KapisTest\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert \u2502 Issuer \u2502 \u2013> \u2502 Recipient: Published: #block-hash date \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID \u2502 moul-test \u2502 \u2013> \u2502 KapisTest: [#673782](https://git.duniter.org/clients/python/silkaj/issues/673782)-00001519\u2026 2020-12-11 11:37:42 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502 \u2013> \u2502 HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c:GZp \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Valid \u2502 2021-04-09 \u2502 \u2014> \u2502 2021-09-02 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Certification\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nIdtyIssuer: HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c\nIdtyUniqueID: KapisTest\nIdtyTimestamp: 673782-00001519FCBA6DDEFEE65B31ECD145B065F4404F870AAB272419EFA62BF5A677\nIdtySignature: 1KX/Iuv7FuXsxhTwYU/RIO9L0F3I+lGvBLYXRexIoCz35H+yb2Wf3nEXA2XXCPl5aVxcxvreOW2HF43r7ezcDA==\nCertTimestamp: 735968-00003F6B07F64573F6FABC510C1CEABEE8358426176BE7F190827A856873C517\n\nDo you confirm sending this certification? [y/N]: y\nCertification successfully sent.\n</code></pre> <pre><code>silkaj --gtest --auth-file --display membership\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership \u2502 in 2 months \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID) \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity \u2502 167750-0000A51FF952B76AAA594A46CA0C8156A56988\u2026 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published \u2502 April 20, 2018 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership \u2502 in 2 months \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 weeks \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Membership\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nBlock: 735967-00028030F3E2AB38D7EACA997065F58E16F0497EE86BFA23B2DA222EEE80C23C\nMembership: IN\nUserID: moul-test\nCertTS: 167750-0000A51FF952B76AAA594A46CA0C8156A56988D2B2B57BE18ECB4F3CFC25CEC2\nphOKWXHxfPBgkTE+Mui8Fiqb7QSlhPrKalDOzhyUwwLySV/EE2Z/b+vZNfByTn7sFYaHWPck5dsbzJQ6M+fBBA==\n\nDo you confirm sending this membership document for this identity? [y/N]: y\nMembership successfully sent\n</code></pre>"},{"location":"blog/silkaj-v090-release/#dry-run-option-is-becoming-a-generic-option","title":"Dry Run option is becoming a generic option","text":"<p>Before:</p> <pre><code>silkaj membership --dry-run\n</code></pre> <p>Now:</p> <pre><code>silkaj --dry-run membership\n</code></pre> <p>Note: This option is currently only implemented in the <code>membership</code> command.</p> <p>Note: The difference between the <code>--display</code> and the <code>--dry-run</code> options are that the dry run option by-passes the license, and the confirmation approvals. For safety reasons, the <code>--dry-run</code> option doesn't allow, at the end, to send the document on the network. On contrary, the <code>--display</code> option allows to send the document to the network.</p>"},{"location":"blog/silkaj-v090-release/#python-support","title":"Python support","text":"<p>Support for Python 3.5 has been dropped and support for Python 3.9 has been added.</p>"},{"location":"blog/silkaj-v090-release/#silkaj-v081-in-debian-bullseye","title":"Silkaj v0.8.1 in Debian Bullseye","text":"<p>If you are a user of Debian or its derivatives, you will be able to find Silkaj v0.8.1 available into Debian Bullseye (v11) which is about to be released. Silkaj package has been updated from v0.6.5 to v0.8.1 and DuniterPy v0.60.1 entered Debian repository for the first time.</p>"},{"location":"blog/silkaj-v090-release/#outlook","title":"Outlook","text":"<p>In the next developments, we are planning to work on DeathReaper, the implementations of the <code>revoke</code> and the <code>identity</code> commands. The removal of the asynchronous property, the migration from <code>tabulate</code> to <code>Texttable</code>, and the migration from BMA to GVA.</p>"},{"location":"blog/silkaj-v090-release/#thanks","title":"Thanks","text":"<p>matograine, moul, jonas, atrax</p>"},{"location":"contributing/","title":"Contributing","text":""},{"location":"contributing/#goals","title":"Goals","text":"<p>Part of the Duniter project running the \u011e1 currency, Silkaj project is aiming at creating a generic tool to manage the main account and wallets, to administrate and to monitor the currency.</p>"},{"location":"contributing/#install-the-development-environment","title":"Install the development environment","text":"<p>We are using Poetry as a development environment solution. Start by installing Poetry. This will install a sandboxed Python environment. Dependencies will be installed in it in order to have Silkaj running and to have pre-installed developement tools.</p>"},{"location":"contributing/#workflow","title":"Workflow","text":"<ul> <li>We use branches for merge requests</li> <li>We prefer fast-forward and rebase method than having merge commits created. This in order to have a clean history.</li> </ul>"},{"location":"contributing/#branches","title":"Branches","text":"<ul> <li><code>main</code>: development and stable branch</li> <li>maintainance branches, to maintain a stable version while developing future version with breaking changes. For instance: <code>release/0.12</code></li> </ul>"},{"location":"contributing/#developing-with-duniterpy","title":"Developing with DuniterPy","text":"<p>DuniterPy is a Python library for Duniter v1 clients. It implements a client with multiple APIs, the handling for document signing. As it is coupled with Silkaj, it is oftenly needed to develop in both repositories.</p>"},{"location":"contributing/#how-to-use-duniterpy-as-editable-with-poetry","title":"How to use DuniterPy as editable with Poetry","text":"<p>Clone DuniterPy locally alongside of <code>silkaj</code> repository:</p> <pre><code>silkaj> cd ..\ngit clone https://git.duniter.org/clients/python/duniterpy\n</code></pre> <p>Use DuniterPy as a path dependency:</p> <pre><code>poetry add ../duniterpy\n</code></pre>"},{"location":"contributing/#developing-with-modules","title":"Developing with modules","text":"<p>Silkaj is using Python modules which shape kind of a framework. Please read their documentations on how to use them the best possible.</p> <ul> <li>DuniterPy: Autogenerated documentation.<ul> <li>Feel free to contribute upstream to share the code with other Python programs</li> </ul> </li> <li>Click<ul> <li>Rich-Click</li> </ul> </li> <li>Arrow</li> <li>texttable</li> </ul>"},{"location":"contributing/#pre-commit-hooks","title":"Pre-commit hooks","text":"<p>We are using <code>pre-commit</code> tool to perform checks on staged changes before committing. We are using it for <code>black</code> formatting, <code>mypy</code> static typing, <code>gitlab-ci</code> linting. We are also using <code>ruff</code> which replaces <code>isort</code> imports sorting, <code>pylint</code> code linting, <code>autoflake</code>, and <code>pyupgrade</code></p> <p>Install <code>pre-commit</code> from your distribution. In case it is an outdated version, install it with <code>pipx</code>:</p> <pre><code>sudo apt install pre-commit\npipx install pre-commit\n</code></pre> <p>To install the <code>git-hooks</code>, from within Silkaj repository, run:</p> <pre><code>pre-commit install\n</code></pre> <p>Then each time you commit changes, the hooks will perform verifications.</p> <p>In case you want to commit while the hooks are failing, run the following to skip the hooks:</p> <pre><code>git commit -m \"msg\" --no-verify/-n\n</code></pre> <p>To manually run one of the tool above, run (eg for <code>ruff-format</code>):</p> <pre><code>pre-commit run --all-files ruff-format\n</code></pre> <p>To run all checks on all files:</p> <pre><code>pre-commit run -a\n</code></pre>"},{"location":"contributing/#authorization-for-gitlab-ci-linter-hook","title":"Authorization for GitLab CI linter hook","text":"<p><code>pre-commit run -a (gitlab-ci-linter)</code> is failing due to authorization required for CI lint API accesses. When running this command, just ignore this failed hook. In case you want to commit a <code>.gitlab-ci.yml</code> edition, this hook will prevent the commit creation. You can skip the hooks as mentionned above. This is fine for occasional <code>.gitlab-ci.yml</code> editions. In case you would like to edit this file more often and have it checked, ask a maintainer to provide you with <code>GITLAB_PRIVATE_TOKEN</code> environment variable that can be set into a shell configuration. With Bash, in <code>$HOME/.bashrc</code> add the following:</p> <pre><code>export GITLAB_PRIVATE_TOKEN=\"\"\n</code></pre> <p>With Fish, in <code>$HOME/.config/fish/config.fish</code> add the following:</p> <pre><code>set -xg GITLAB_PRIVATE_TOKEN \"\"\n</code></pre> <p>Check out duniterpy#169 for more details.</p>"},{"location":"contributing/#tests","title":"Tests","text":"<p>We are using Pytest as a tests framework. For more information on how Silkaj implements them check the testing documentation.</p> <p>Tests are stored into <code>unit</code> and <code>integration</code> folders depending on their types, then using a similar tree as the source code.</p> <p>To run the tests, from within <code>silkaj</code> repository, run:</p> <pre><code>poetry run pytest\n</code></pre>"},{"location":"contributing/#how-to-test-a-single-file","title":"How to test a single file","text":"<p>Specifiy the path of the test:</p> <pre><code>poetry run pytest tests/unit/test_network.py\n</code></pre>"},{"location":"contributing/#version-bump","title":"Version bump","text":"<p>We are using the Semantic Versioning.</p> <p>To create a release, we use following script which will bump the version in different files, and will make a commit and a tag out of it.</p> <pre><code>./release.sh 0.20.0\n</code></pre> <p>Then, a <code>git push --tags</code> is necessary to publish the tag.</p>"},{"location":"contributing/#how-to-release-a-pre-release-on-pypi","title":"How to release a pre-release on PyPI","text":"<p>Append <code>[{a|b|rc}N]</code> to the version, it will be automatically detected as pre-release by PyPI. i.e.: <code>v0.20.0rc0</code>.</p> <ul> <li>install a pre-release from PyPI:</li> </ul> <pre><code>pip install silkaj --user --upgrade --pre\n</code></pre> <ul> <li>install <code>silkaj</code> from PyPI test and the dependencies (i.e. DuniterPy) from PyPI (have been removed from the documentation):</li> </ul> <pre><code>pip install silkaj --user --upgrade -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/\n</code></pre>"},{"location":"contributing/#update-copyright-year","title":"Update copyright year","text":"<p>Follow this documentation Only difference is to update the year in <code>license_header.txt</code> rather than <code>LICENSE.txt</code>.</p>"},{"location":"contributing/#pypi-and-pypi-test-distributions","title":"PyPI and PyPI test distributions","text":"<p>Silkaj is distributed to PyPI, the Python Package Index, for further <code>pip</code> installation. Silkaj can be published to PyPI or to PyPI test for testing purposes. Publishing to PyPI or PyPI test can be directly done from the continuous delivery or from Poetry it-self. The CD jobs appear on a tag and have to be triggered manually. Only the project maintainers have the rights to push tags.</p>"},{"location":"contributing/#pypi","title":"PyPI","text":"<p>Publishing to PyPI from Poetry:</p> <pre><code>poetry publish --build\n</code></pre>"},{"location":"contributing/#pypi-test","title":"PyPI test","text":"<p>Publishing to PyPI test from Poetry:</p> <pre><code>poetry config repositories.pypi_test https://test.pypi.org/legacy/\npoetry publish --build --repository pypi_test\n</code></pre> <p>To install this package:</p> <pre><code>pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ silkaj\n</code></pre> <p>The <code>--extra-index-url</code> is used to retrieve dependencies packages from the official PyPI not to get issues with missing or testing dependencies comming from PyPI test repositories.</p>"},{"location":"contributing/#continuous-integration-and-delivery","title":"Continuous integration and delivery","text":""},{"location":"contributing/#own-built-docker-images","title":"Own built Docker images","text":"<p>Silkaj pipeline is running images built on top of official Python images based on latest Debian with Poetry installed on top them.</p> <p>They can be found in this repository.</p>"},{"location":"contributing/#pipeline-and-its-jobs","title":"Pipeline and its jobs","text":"<ul> <li>Checks:<ul> <li>pre-commit hooks</li> <li>Build</li> </ul> </li> <li>Tests on supported Python versions:<ul> <li>Installation</li> <li>Pytest on Python supported versions</li> </ul> </li> <li>Package<ul> <li>PyPI stable</li> <li>PyPI test</li> <li>Docker pip</li> <li>Docker poetry</li> </ul> </li> <li>Website/project documentation commited to be deployed via GitLab Pages</li> </ul>"},{"location":"contributing/#g1-monetary-license-update","title":"\u011e1 monetary license update","text":"<p>To modify the \u011e1 monetary license files, please change them on its repository, since it\u2019s integrated in silkaj repository as a <code>git subtree</code>.</p> <p>\u011e1 monetary license is included in Silkaj repository as a <code>git subtree</code>. To update the licence files, add the license repository as a remote then pull:</p> <pre><code>git remote add g1_monetary_license https://git.duniter.org/documents/g1_monetary_license.git\ngit subtree pull --prefix g1_monetary_license g1_monetary_license master\n</code></pre> <p>Depending on your distribution, you might need to install <code>git-subtree</code>.</p>"},{"location":"contributing/container_usage/","title":"Container usage","text":"<p>There are two kind of containers. The one built with <code>pip</code> for user purposes, and the one built with Poetry for developer purposes.</p> <p>We recommand using <code>podman</code> instead of <code>docker</code> command for not having to run the command as <code>root</code>.</p> <p>In case you use <code>docker</code>, you can add your user into the <code>docker</code> group, so you can manipulate <code>docker</code> executable without <code>root</code> permissions.</p>"},{"location":"contributing/container_usage/#user","title":"User","text":"<p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <p>Run Silkaj from outside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory is where Silkaj sources are installed in Python <code>site-packages</code>. This is fine for doing small editions. For bigger editions, it is adviced to use a development environment with Poetry.</p>"},{"location":"contributing/container_usage/#developer","title":"Developer","text":"<p><code>git</code> is installed, so it can be used as a development environment.</p> <p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <p>Run Silkaj from ouside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory contains Silkaj sources. Set up the repository to have it ready for developments:</p> <pre><code>git checkout dev\ngit remote set-url origin https://git@git.duniter.org/clients/python/silkaj.git\n</code></pre> <pre><code>git config --global user.email \"you@example.com\"\ngit config --global user.name \"Your Name\"\n</code></pre>"},{"location":"contributing/documentation/","title":"Documentation contribution","text":"<p>The project documentation website is based on MkDocs framework and on following theme and plugins:</p> <ul> <li>Mkdocs Material: theme and framework</li> <li>Mike: to publish multiple versions</li> <li>MkDocs Coverage: to integrate coverage report iframe into MkDocs</li> <li>MkDocs Click: generate documentation for Click command line applications</li> <li>MkDocs GitLab plugin: to display links to GitLab references items: used in the changelog page</li> </ul> <p>Please refer to their respective documentation.</p>"},{"location":"contributing/documentation/#set-up","title":"Set up","text":"<p>Install the optional <code>docs</code> group:</p> <pre><code>poetry install --with docs\n</code></pre>"},{"location":"contributing/documentation/#mkdocs","title":"MkDocs","text":"<p>Run the website in development mode:</p> <pre><code>poetry run mkdocs deploy\n</code></pre> <p>Open localhost:8000 in your web browser.</p> <p>The preview will be live-updated once you change the documentation.</p>"},{"location":"contributing/documentation/#mike","title":"Mike","text":"<p>Running following command will serve what\u2019s on <code>pages</code> branch:</p> <pre><code>poetry run mike serve\n</code></pre> <p>This preview won\u2019t be live-updated with your latest changes as it would be with <code>mkdocs serve</code>. This is because Mike simply serves what\u2019s built on <code>pages</code> branch.</p>"},{"location":"contributing/documentation/#changing-the-content","title":"Changing the content","text":"<p>Into <code>docs</code> folder, you can find the Markdown source files which can be edited. <code>mkdocs.yml</code> file lists the website structure.</p>"},{"location":"contributing/documentation/#deployment-workflow","title":"Deployment workflow","text":"<p>Only on <code>main</code> branch, a <code>website</code> job will be triggered containing the documentation build for a specific version. It creates a commit which is added to <code>pages</code> branch with <code>poetry run mike deploy $version</code> command. Then the commit is pushed on the git repository remote from the job with an access token. The coverage report is integrated in the website build. The artefact is retrieved from the coverage job with <code>needs:</code> keyword.</p> <p>From <code>pages</code> branch, an other pipeline is triggered, publishing the documentation website to silkaj.duniter.org for all versions via GitLab Pages.</p>"},{"location":"contributing/documentation/#access-token","title":"Access token","text":"<p>A <code>git push</code> is performed from the job to the remote repository via the authorisation provided via an access token set in CI/CD variables. The access token has to be renew every year, since this is the maximum lifespan we can set for an access token at its creation. The access token has to be created on a project basis with <code>repository_write</code> checked and with Developer role.</p>"},{"location":"contributing/install_poetry/","title":"Poetry installation","text":""},{"location":"contributing/install_poetry/#install-silkaj-in-a-development-environement-with-poetry","title":"Install Silkaj in a development environement with Poetry","text":""},{"location":"contributing/install_poetry/#install-libsodium","title":"Install libsodium","text":"DebianFedora <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium\n</code></pre>"},{"location":"contributing/install_poetry/#install-poetry","title":"Install Poetry","text":"<ul> <li>Installation documentation</li> </ul> <pre><code>pipx install poetry\n</code></pre>"},{"location":"contributing/install_poetry/#install-dependencies-and-the-python-virtual-environment","title":"Install dependencies and the Python virtual environment","text":"<pre><code># Over HTTPS\ngit clone https://git.duniter.org/clients/python/silkaj.git\n\n# Over SSH\ngit clone git@git.duniter.org:clients/python/silkaj.git\n\ncd silkaj\n\n# Installs the runtime and development dependencies\npoetry install\n</code></pre>"},{"location":"contributing/install_poetry/#run-silkaj","title":"Run Silkaj","text":"<p>Within <code>silkaj</code> repository run Silkaj:</p> <pre><code>poetry run silkaj\n</code></pre>"},{"location":"contributing/install_poetry/#poetry-shell","title":"Poetry shell","text":"<p>You can access tools <code>pytest</code> from within the development environment with <code>poetry run</code> or by entering the shell:</p> <pre><code>silkaj> poetry run pytest\n</code></pre> <pre><code>silkaj> poetry shell\n(silkaj-58dUTebQ-py3.12) silkaj> pytest\n</code></pre>"},{"location":"contributing/install_poetry/#make-silkaj-accessible-from-everywhere","title":"Make Silkaj accessible from everywhere","text":"<p>Add following alias to your shell configuration:</p> <pre><code>alias silkaj=\"cd /path/to/silkaj && poetry run silkaj\"\n</code></pre>"},{"location":"contributing/packaging/","title":"Packaging","text":"<p>Silkaj is packaged in official Debian repositories. Packaging details can be found in its repository on Debian forge.</p>"},{"location":"contributing/packaging/#dependencies","title":"Dependencies","text":"<p>DuniterPy might be the only dependency not already into distributions.</p>"},{"location":"contributing/packaging/#manual-pages","title":"Manual pages","text":"<p>To generate manual pages: #179</p> <ul> <li><code>click-man</code></li> </ul>"},{"location":"contributing/packaging/#shell-completion","title":"Shell completion","text":"<p>Shell completion might be set-up as described in the installation documentation.</p>"},{"location":"contributing/testing/","title":"Testing","text":""},{"location":"contributing/testing/#test-and-coverage","title":"Test and coverage","text":""},{"location":"contributing/testing/#install-tests-dependencies","title":"Install tests dependencies","text":"<pre><code>poetry install\n</code></pre>"},{"location":"contributing/testing/#runing-tests","title":"Runing tests:","text":"<p>Simply run:</p> <pre><code>poetry run pytest\n</code></pre> <p>To have a coverage report:</p> <pre><code>poetry run pytest --cov silkaj --cov-report html --cov-report xml --cov-report term\n</code></pre> <p>See pytest documentation for more information</p>"},{"location":"contributing/testing/#writing-tests","title":"Writing tests","text":"<p>There should be three kinds of test:</p> <ul> <li>end to end test: uses the real data and the real blockchain. Obviously don't presume the data value as it can change. These test are written in <code>tests/integration/test_end_to_end.py</code>.</li> <li>integration test: mock some of the input and/or output classes and shouldn't use the actual blockchain, you should use this when mocking a class (used by your code) is too complicated.</li> <li>unit test: for functions that don't need mock or mock can me done easily (you should prefer this to integration tests). Are written in <code>tests/unit/test_*package*.py</code></li> </ul> <p>You should try to write an end to end test first, then if your coverage too bad add some unit tests. If it's still too bad, write an integration test.</p> <p>A better strategy (TDD) is to write first the End to end test. When it fails, before writing the code, you should implement the unit tests. When this one fails too, you can write your code to make your test pass. It's better but takes longer and the code is tested at least twice. So the previous strategy is a better compromise</p>"},{"location":"contributing/testing/#tips","title":"Tips","text":"<p>Test an Exception is raised: https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions</p> <p>Test a function with several values: You can use <code>@pytest.mark.parametrize</code> as done in <code>tests/unit/money/test_transfer.py</code></p> <p>To mock a user input:</p> <pre><code>from unittest.mock import patch\n\nfrom silkaj.cert import certification_confirmation\n\n\n# this will add a mock_input parameter that will be used whenever the code tries to get input from user\n@patch('builtins.input')\ndef test_certification_confirmation(mock_input):\n id_to_certify = {\"pubkey\": \"pubkeyid to certify\"}\n main_id_to_certify = {\"uid\": \"id to certify\"}\n\n # the input will return \"yes\" to the tested function (certification_confirmation)\n mock_input.return_value = \"yes\"\n\n # ensure the tested function returns something\n assert certification_confirmation(\n \"certifier id\",\n \"certifier pubkey\",\n id_to_certify,\n main_id_to_certify)\n\n # ensure that input is called once\n mock_input.assert_called_once()\n</code></pre>"},{"location":"usage/","title":"Usage","text":"<ul> <li>Command-line interface reference</li> <li>Account storage</li> <li>Multi-recipients transfers and automation</li> <li>DeathReaper</li> </ul>"},{"location":"usage/account_storage/","title":"Account storage","text":"<p>Silkaj features the account storage to store and read security-wise important documents from a location on your local computer. It is used to store and read authentication and revocation files with Silkaj. It is recommended to use the storage instead of storing and reading these files anywhere on your system.</p> <p>They are stored into <code>$XDG_DATA_HOME/silkaj</code>, aka <code>$HOME/.local/share/silkaj/$currency/$account_name</code> as:</p> <ul> <li><code>revocation.txt</code></li> <li><code>authentication_file_ed25519.dewif</code> for v1 WIF and EWIF formats based on the approved RFC n\u00b013.</li> <li><code>authentication_file_sr25519.json</code> for v2 encrypted json format</li> </ul> <p>The account name is a local name given to a wallet. It does not necessarily need to be the same identity nickname/alias stored into the blockchain. No verification what so ever is performed to check any correspondence between the local name stored into Silkaj account storage and the one stored on the blockchain or the indexer.</p>"},{"location":"usage/account_storage/#per-currency-storage","title":"Per currency storage","text":"<p>The storage is organized per currencies. Depending on the specified endpoint with the endpoint options (<code>--endpoint</code>, <code>--gtest</code>) the currency will be determined. Based on the latter, it will stored into <code>g1</code> or <code>g1-test</code> directory.</p>"},{"location":"usage/account_storage/#authentication","title":"Authentication","text":""},{"location":"usage/account_storage/#import","title":"Import","text":"<p>Import your authentication file into the storage. In case you want to use an other authentication method than the default Scrypt method, use one of the authentication options which can be find in <code>silkaj authentication --help</code> usage.</p> <p>Next command will store the authentication file in <code>$HOME/.local/share/silkaj/g1/test/authentication_file_ed25519.dewif</code></p> <pre><code>silkaj --account test authentication <authentication option>\n</code></pre> <p>Note: <code>g1</code> and <code>test</code> folders comes respectively from the default \u011e1 endpoint and <code>test</code> from the account passed.</p>"},{"location":"usage/account_storage/#reading","title":"Reading","text":"<p>Commands using authentication such as <code>money transfer</code>, <code>wot certify</code>, <code>wot membership</code>, and <code>money balance</code> will read the authentication file from the account storage. With the general <code>--account</code> option, it will use the authentication file created in previous step.</p> <pre><code>silkaj --account test money transfer\n</code></pre>"},{"location":"usage/account_storage/#revocation","title":"Revocation","text":""},{"location":"usage/account_storage/#inputoutput","title":"Input/Output","text":"<p>The general <code>--account</code> option (placed between <code>silkaj</code> and the sub-command) is used to read the authentication file and to write the revocation file in the same directory.</p> <pre><code>silkaj --account test authentication\n</code></pre>"},{"location":"usage/account_storage/#creation","title":"Creation","text":"<pre><code>silkaj --gtest --account john wot revocation create\n</code></pre> <p>Will be stored into <code>$HOME/.local/share/silkaj/g1-test/john/revocation.txt</code></p>"},{"location":"usage/account_storage/#reading_1","title":"Reading","text":"<p>The revocation document can be read with <code>wot revocation publish</code> and <code>verify</code> commands as follow:</p> <pre><code>silkaj --gtest --account john wot revocation verify\n</code></pre> <p>Here we are reading the revocation file generated in previous step.</p>"},{"location":"usage/cli/","title":"Command-line interface reference","text":"<p>This page provides documentation of Silkaj command line interface.</p>"},{"location":"usage/cli/#silkaj","title":"silkaj","text":"<p>Usage:</p> <pre><code>silkaj [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>-h</code>, <code>--help</code> boolean Show this message and exit. <code>False</code> <code>-v</code>, <code>--version</code> boolean Show the version and exit. <code>False</code> <code>--endpoint</code>, <code>-ep</code> text Without specifying this option, the default endpoint reaches \u011e1 currency on its official endpoint: https://g1.duniter.org. --endpoint allows to specify a custom endpoint following <code><host>:<port>/<path></code> format. <code>port</code> and <code>path</code> are optional. In case no port is specified, it defaults to 443. NOTE: This argument is mutually exclusive with arguments: [gtest]. None <code>--gtest</code>, <code>-gt</code> boolean Uses official \u011eTest currency endpoint: https://g1-test.duniter.org NOTE: This argument is mutually exclusive with arguments: [endpoint]. <code>False</code> <code>--account</code>, <code>-a</code> text Account name used in storage <code>$HOME/.local/share/silkaj/$currency/$account_name</code> for authentication and revocation. None <code>--password</code>, <code>-p</code> text EWIF authentication password. If you use this option, prefix the command with a space so the password is not saved in your shell history. In case of an encrypted file, password input will be prompted. None <code>--display</code>, <code>-d</code> boolean Display the generated document before sending it <code>False</code> <code>--dry-run</code>, <code>-n</code> boolean By-pass the licence and confirmation. Do not send the document, but display it instead <code>False</code> <p>Subcommands</p> <ul> <li>about: Display program information</li> <li>authentication: Generate and store authentication file</li> <li>blockchain: Blockchain related commands</li> <li>checksum: Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</li> <li>license: Display \u011e1 monetary license</li> <li>money: Money management related commands</li> <li>wot: Web-of-Trust related commands</li> </ul>"},{"location":"usage/cli/#silkaj-about","title":"silkaj about","text":"<p>Display program information</p> <p>Usage:</p> <pre><code>silkaj about [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-authentication","title":"silkaj authentication","text":"<p>Generate and store authentication file</p> <p>Usage:</p> <pre><code>silkaj authentication [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--auth-scrypt</code>, <code>--scrypt</code> boolean Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_file, auth_wif, auth_seed]. <code>False</code> <code>--nrp</code> text Scrypt parameters: defaults N,r,p: \"4096,16,1\" None <code>--auth-file</code>, <code>-af</code> file Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_wif, auth_seed]. None <code>--auth-seed</code>, <code>--seed</code> boolean Seed hexadecimal authentication NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_wif]. <code>False</code> <code>--auth-wif</code>, <code>--wif</code> boolean WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_seed]. <code>False</code> <code>--password</code>, <code>-p</code> text EWIF encryption password for the destination file. If no password argument is passed, WIF format will be used. If you use this option prefix the command with a space so the password does not get saved in your shell history. Password input will be suggested via a prompt. None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain","title":"silkaj blockchain","text":"<p>Blockchain related commands</p> <p>Usage:</p> <pre><code>silkaj blockchain [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>blocks: Display blocks: default: 0 for current window size</li> <li>difficulty: Display current Proof-of-Work difficulty level to generate next block</li> <li>info: Currency information</li> </ul>"},{"location":"usage/cli/#silkaj-blockchain-blocks","title":"silkaj blockchain blocks","text":"<p>Display blocks: default: 0 for current window size</p> <p>Usage:</p> <pre><code>silkaj blockchain blocks [OPTIONS] [NUMBER]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--detailed</code>, <code>-d</code> boolean Force detailed view. Compact view happen over 30 blocks <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-difficulty","title":"silkaj blockchain difficulty","text":"<p>Display current Proof-of-Work difficulty level to generate next block</p> <p>Usage:</p> <pre><code>silkaj blockchain difficulty [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-info","title":"silkaj blockchain info","text":"<p>Currency information</p> <p>Usage:</p> <pre><code>silkaj blockchain info [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-checksum","title":"silkaj checksum","text":"<p>Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</p> <p>Usage:</p> <pre><code>silkaj checksum [OPTIONS] [PUBKEY_CHECKSUM]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-license","title":"silkaj license","text":"<p>Display \u011e1 monetary license</p> <p>Usage:</p> <pre><code>silkaj license [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money","title":"silkaj money","text":"<p>Money management related commands</p> <p>Usage:</p> <pre><code>silkaj money [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>balance: Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</li> <li>history: History of wallet money movements</li> <li>transfer: Transfer money</li> </ul>"},{"location":"usage/cli/#silkaj-money-balance","title":"silkaj money balance","text":"<p>Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</p> <p>Usage:</p> <pre><code>silkaj money balance [OPTIONS] [PUBKEYS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-history","title":"silkaj money history","text":"<p>History of wallet money movements</p> <p>Usage:</p> <pre><code>silkaj money history [OPTIONS] PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--uids</code>, <code>-u</code> boolean Display identities username <code>False</code> <code>--full-pubkey</code>, <code>-f</code> boolean Display full-length public keys <code>False</code> <code>--csv-file</code>, <code>--csv</code> file Write in specified file name in CSV (Comma-separated values) format the history of money movements None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-transfer","title":"silkaj money transfer","text":"<p>Transfer money</p> <p>Usage:</p> <pre><code>silkaj money transfer [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--amount</code>, <code>-a</code> float range (<code>0.01</code> and above) Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [amountsud, allsources, file_path]. None <code>--amountUD</code>, <code>-d</code> float range (<code>1e-06</code> and above) Relative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amounts]. None <code>--allSources</code> boolean Send all sources to one recipient. NOTE: This argument is mutually exclusive with arguments: [file_path, amountsud, amounts]. <code>False</code> <code>--recipient</code>, <code>-r</code> text Public key(s)' recipients + optional checksum: <code><pubkey>[:checksum]</code>. Sending to multiple recipients is possible. With one amount specified, all recipients will receive the same amount. With one amount specified per recipient, recipient 1 will recieve amount 1, and so on. NOTE: This argument is mutually exclusive with arguments: [file_path]. None <code>--file</code>, <code>-f</code> file File's path containing a list of amounts in absolute or relative reference and recipients' pubkeys NOTE: This argument is mutually exclusive with arguments: [amountsUD, recipients, allsources, amounts]. None <code>--reference</code>, <code>-ref</code> text Transfer reference `` <code>--outputBackChange</code> text Pubkey recipient to send the rest of the transaction: <code><pubkey[:checksum]></code> None <code>--yes</code>, <code>-y</code> boolean Assume yes. Do not prompt confirmation <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot","title":"silkaj wot","text":"<p>Web-of-Trust related commands</p> <p>Usage:</p> <pre><code>silkaj wot [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>certify: Certify identity</li> <li>lookup: Username identifier and public key lookup</li> <li>membership: Send or renew membership.</li> <li>revocation: Manage revocation document commands.</li> <li>status: Check received and sent certifications and consult the membership status of any given identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-certify","title":"silkaj wot certify","text":"<p>Certify identity</p> <p>Usage:</p> <pre><code>silkaj wot certify [OPTIONS] UID_PUBKEY_TO_CERTIFY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-lookup","title":"silkaj wot lookup","text":"<p>Username identifier and public key lookup</p> <p>Usage:</p> <pre><code>silkaj wot lookup [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-membership","title":"silkaj wot membership","text":"<p>Send or renew membership.</p> <p>Usage:</p> <pre><code>silkaj wot membership [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation","title":"silkaj wot revocation","text":"<p>Manage revocation document commands.</p> <p>Usage:</p> <pre><code>silkaj wot revocation [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>create: Create and save revocation document</li> <li>publish: Publish previously created revocation document. Identity will be immediately revoked.</li> <li>revoke: Create and publish revocation document. Will immediately revoke the identity.</li> <li>verify: Verifies that the revocation document is correctly formatted and matches an existing identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-revocation-create","title":"silkaj wot revocation create","text":"<p>Create and save revocation document</p> <p>Usage:</p> <pre><code>silkaj wot revocation create [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-publish","title":"silkaj wot revocation publish","text":"<p>Publish previously created revocation document. Identity will be immediately revoked.</p> <p>Usage:</p> <pre><code>silkaj wot revocation publish [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-revoke","title":"silkaj wot revocation revoke","text":"<p>Create and publish revocation document. Will immediately revoke the identity.</p> <p>Usage:</p> <pre><code>silkaj wot revocation revoke [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-verify","title":"silkaj wot revocation verify","text":"<p>Verifies that the revocation document is correctly formatted and matches an existing identity</p> <p>Usage:</p> <pre><code>silkaj wot revocation verify [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-status","title":"silkaj wot status","text":"<p>Check received and sent certifications and consult the membership status of any given identity</p> <p>Usage:</p> <pre><code>silkaj wot status [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/deathreaper/","title":"DeathReaper","text":"<p>DeathReaper is a service reporting Web of Trust exclusions on Discourse forums. Images are created containing Silkaj + DeathReaper. These images are operated on DeathReaper repository with pipeline schedules.</p>"},{"location":"usage/deathreaper/#installation","title":"Installation","text":"<p>When installing Silkaj, you have to specify the optional extra <code>deathreaper</code> distribution in order to get DeathReaper\u2019s dependency <code>pydiscourse</code> installed. It will therefore \"activate\" the feature, and <code>silkaj wot exclusions</code> command will become available.</p> <pre><code>pipx install silkaj[deathreaper]\n</code></pre> <p>With Poetry development environment:</p> <pre><code>poetry install --extras deathreaper\n</code></pre>"},{"location":"usage/deathreaper/#usage","title":"Usage","text":"<p>DeathReaper was first released in Silkaj codebase with version 0.12.0. Make sure <code>exclusions</code> command is present under <code>silkaj wot</code>, otherwise something probably went wrong with the installation. Then run <code>silkaj wot exclusions --help</code> to check how to use it.</p> <p>By default it will report the exclusions for the last day, from 24 hours in the past till now. You can specify an other duration with <code>silkaj wot exclusions 0.5</code> for the last 12 hours, half a day, for example.</p> <p>By default the report will be displayed in the terminal. To have the report published on a Discourse forum, you have to pass following options <code>--api-id</code> <code>--*-api-key</code>, <code>--publish</code>. Further code changes have to be done in order to support additional Discourse forums.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/","title":"Multi-recipients transfers and automation","text":"<p>We want to transfer money to multiple recipients and to automate that process.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#create-a-recipients-file","title":"Create a recipients file","text":"<p>Create a file (i.e.: <code>recipients.txt</code>) containing the list of the recipients public keys you want to send money to.</p> recipients.txt<pre><code><ABSOLUTE|RELATIVE>\n\n# comment 1\n<amount1> <pubkey1>\n\n# comment 2\n<amount2> <pubkey2>:[<checksum2>]\n</code></pre> <p>The file content should be prefixed with <code>RELATIVE</code> or <code>ABSOLUTE</code> so the amounts will be expressed in UD \u011e1 or \u011e1.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#set-up-the-authentication","title":"Set up the authentication","text":"<ul> <li>Check authentication documentation on how to handle the authentication.</li> </ul>"},{"location":"usage/multi-recipients_transfers_and_automation/#transfer","title":"Transfer","text":"<p>Finally, you just have to run following command:</p> <pre><code>silkaj -a <account_name> money transfer --file recipients.txt\n</code></pre>"},{"location":"usage/multi-recipients_transfers_and_automation/#automation","title":"Automation","text":"<p>In case you want to automate a transfer on a regural basis, on the first day of the month in this example, you can set a <code>crontab</code> on your machine (preferably a machine running 7/24):</p> <pre><code>0 0 1 * * silkaj -a <account_name> money transfer --file recipients.txt --yes\n</code></pre> <p>Pass <code>--yes</code> option so no confirmation gets prompted. In case a password is set on the authentication, pass as well the <code>--password <password></code> general option.</p>"},{"location":"coverage/","title":"Coverage report","text":""},{"location":"blog/2023/","title":"2023","text":""},{"location":"blog/2022/","title":"2022","text":""},{"location":"blog/2021/","title":"2021","text":""},{"location":"blog/2020/","title":"2020","text":""},{"location":"blog/2019/","title":"2019","text":""},{"location":"blog/2018/","title":"2018","text":""},{"location":"blog/2017/","title":"2017","text":""},{"location":"blog/2016/","title":"2016","text":""},{"location":"blog/minor/","title":"minor","text":""},{"location":"blog/release/","title":"release","text":""},{"location":"blog/rc/","title":"rc","text":""},{"location":"blog/page/2/","title":"Blog","text":""},{"location":"blog/page/3/","title":"Blog","text":""},{"location":"blog/page/4/","title":"Blog","text":""},{"location":"blog/page/5/","title":"Blog","text":""},{"location":"blog/minor/page/2/","title":"minor","text":""},{"location":"blog/release/page/2/","title":"release","text":""},{"location":"blog/release/page/3/","title":"release","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome","text":"<p>Welcome to Silkaj documentation</p> <p>Install Usage </p>"},{"location":"#what-is-silkaj","title":"What is Silkaj?","text":"<p>Silkaj is a command line client for \u011e1 libre currency powered by Duniter software.</p> <ul> <li> <p> Money management</p> <p>Transfer money, check your balance, and history stand.</p> </li> <li> <p> Web-of-Trust management</p> <p>Manage your certifications, membership, and revocation document.</p> </li> <li> <p> Account management</p> <p>With the wallet import format authentication method.</p> </li> <li> <p> CLI interface</p> <p>Silkaj is built around a command line interface design.</p> </li> <li> <p> Low requirements</p> <p>Written with Python, Silkaj is built with low requirements in mind.</p> </li> <li> <p> RTM compatible</p> <p>Silkaj is compatible with the Relative Theory of Money and includes \u011e1 Monetary License.</p> </li> <li> <p> Free software</p> <p>Silkaj is licensed under GNU\u00a0AGPL v3.</p> </li> </ul>"},{"location":"changelog/","title":"Changelog","text":""},{"location":"changelog/#0.12.0","title":"v0.12.0 April 22, 2025","text":""},{"location":"changelog/#milestone-v0120","title":"Milestone v0.12.0","text":""},{"location":"changelog/#code","title":"Code","text":"<ul> <li>!244, #470: Support BMA optimizations</li> <li>!253, !254, !256, #443: Merge DeathReaper <code>256_excluded</code> branch on <code>main</code> branch</li> <li>!265, !270, !276, #258: Implement CSV output on <code>history</code> command</li> <li>!268, #490: <code>wot status</code>: Display precise expiration date of received certifications</li> <li>!283, #471: Rename transfer\u2019s comment to reference</li> <li>!251, #351: Delete <code>blockchain verify</code> command</li> <li>!267, #124: Convert <code>OrderedDict</code> to <code>dict</code></li> </ul>"},{"location":"changelog/#account-storage-support-authentication-and-revocation-improvements","title":"Account storage support: authentication and revocation improvements","text":"<ul> <li>!277, #477: Account storage support: <code>authentication</code>, <code>revocation</code></li> <li>!240, #420: Rework authentication file path</li> <li>!249, #481: Save revocation file as only readable and writeable as user (<code>600</code> permission)</li> <li>!248, #435: Revocation: remove <code>--dry-run</code> and <code>--display</code> options from <code>save</code> and <code>verify</code> commands, drop default revocation file path</li> </ul>"},{"location":"changelog/#command-line-interface","title":"Command-line interface","text":"<ul> <li>!241, #466: Make the CLI\u00a0looks better with <code>rich-click</code></li> <li>#166: Document shell completion set-up</li> <li>!242, #469: Use <code>click.Path()</code></li> <li>!243, #419: Implement <code>-h</code> small <code>--help</code> option for all commands</li> <li>!279, #501: Replace <code>sys.exit()</code> with <code>click.Context.fail()</code> for better user output</li> <li>!246: Rework endpoints usage doc and CLI options help</li> </ul>"},{"location":"changelog/#website","title":"Website","text":"<ul> <li>!271, !281, #433, #196: Set up new website structure with MkDocs</li> <li>!280, #277: Integrate releases announcements into the website</li> <li>!282, #502: Generate automatic CLI interface documentation with mkdocs-click</li> <li>!285: Add v0.12.0 announcement and changelog, release v0.12.0</li> </ul>"},{"location":"changelog/#project","title":"Project","text":"<ul> <li>#483: Switch DuniterPy usage back to PyPI release</li> <li>!257, !278, #473: Update \u011e1 Monetary license</li> <li>!247, #459: Rework project description</li> <li>!233: CI change, coverage url fix, documentation, hooks bump</li> </ul>"},{"location":"changelog/#python-versions","title":"Python versions","text":"<ul> <li>!237, #457: Drop Python v3.7 support</li> <li>!263, #464: Drop Python v3.8 support</li> <li>!238, #474: Initial Python v3.12 support</li> <li>!250, #448: Add support for Python v3.12</li> <li>!264, #482: Add support for Python v3.13<ul> <li>!269, !284, #492: Migrate from Pendulum to Arrow datetime lib</li> </ul> </li> </ul>"},{"location":"changelog/#copyright","title":"Copyright","text":"<ul> <li>!231, #417: Update copyright to 2023</li> <li>!258, #456: Update copyright to 2024</li> <li>!272, #485: Update copyright to 2025</li> </ul>"},{"location":"changelog/#development-environment","title":"Development Environment","text":"<ul> <li>!234, !236, !245, !273, #458: Introduce Ruff pre-commit hook to replace black, autoflake, pylint, isort and pyupgrade</li> <li>!275, #499: Support Poetry v2 syntax</li> <li>!274, #498: pip container does no longer include <code>g1_monetary_license</code></li> <li>!252, #480: Update <code>.gitignore</code></li> <li>duniterpy#205: <code>gitlab-ci-linter</code> is broken since GitLab v16</li> <li>!259, #454: Set up release feature from gitlab-ci</li> </ul>"},{"location":"changelog/#0.11.2","title":"v0.11.2 November 22, 2023","text":"<ul> <li>#484: Support Python v3.12 on v0.11 release</li> </ul>"},{"location":"changelog/#pre-requisites","title":"Pre-requisites","text":"<ul> <li>disable <code>pylint</code> and <code>pyupgrade</code> hooks</li> <li>switch jobs to <code>3.12</code> image containing <code>pre-commit</code></li> <li>!195, duniterpy#205: Fix <code>gitlab-ci-linter</code> hook</li> </ul>"},{"location":"changelog/#support-python-v312","title":"Support Python v3.12","text":"<ul> <li>!237, #457: Drop Python v3.7 support</li> <li>Bump <code>pendulum</code> to <code>v3.0.0b1</code></li> <li>!238, !250, #448: Add support for Python v3.12</li> </ul>"},{"location":"changelog/#0.11.1","title":"v0.11.1 August 14, 2023","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206<ul> <li>Set tilde requirement, to allow future patch updates</li> </ul> </li> </ul>"},{"location":"changelog/#0.11.0","title":"v0.11.0 November 27, 2022","text":"<p>(Please see the full set of changes for this release also in v0.10.0rc0 note below)</p>"},{"location":"changelog/#cli","title":"CLI","text":"<ul> <li>!229, #430: Rename <code>certification</code> cmd to <code>certify</code> and <code>revocation save</code> to <code>revocation create</code></li> </ul>"},{"location":"changelog/#milestone-v0110","title":"Milestone v0.11.0","text":""},{"location":"changelog/#0.11.0rc0","title":"v0.11.0rc0 November 12, 2022","text":""},{"location":"changelog/#code_1","title":"Code","text":"<ul> <li>!199, #203: Migrate from <code>tabulate</code> to <code>texttable</code></li> <li>!216, #330: Repository restructuration</li> </ul>"},{"location":"changelog/#network","title":"Network","text":"<ul> <li>!211, #397: Replace singletons with <code>@functools.lru_cache()</code> decorator</li> <li>!220, #438, #411, #3: Add <code>sleep()</code> between <code>identity_of()</code> calls in a loop</li> </ul>"},{"location":"changelog/#cli_1","title":"CLI","text":"<ul> <li>!219, #430: Organize commands into subcommands</li> <li>!218, #436: Rename <code>tx</code> command to <code>transfer</code></li> <li>!223, #449: Get rid of <code>argos</code></li> </ul>"},{"location":"changelog/#dev-env","title":"Dev Env","text":"<ul> <li>!214, #163: Introduce type annotations for static typing with <code>mypy</code></li> <li>!227, #453: Support new <code>mypy</code> v0.990 reports</li> <li>!215, #292: Introduce <code>pylint</code> tool</li> <li>!212, #424: Introduce <code>flake8</code></li> <li>!222, #450: Replace <code>flake8</code> with <code>autoflake</code></li> <li>!210, #428: Introduce <code>pre-commit-hooks</code> and <code>mdformat</code> hooks</li> <li>!226, #451: <code>pre-commit:hooks</code> job doesn\u2019t appear</li> <li>!209, #408: Change workflow by changing from <code>master</code> and default <code>dev</code> branches to a single <code>main</code> branch</li> <li>!224, #441: Separate <code>unit</code> and <code>integration</code> tests</li> <li>!221, #442: Add support for Python v3.11</li> <li>!217, #447: Fix coverage integration into GitLab</li> </ul>"},{"location":"changelog/#documentation","title":"Documentation","text":"<ul> <li>!225, #224: Refactor <code>pip</code> install documentation: remove Windows part</li> <li>!225, #188, #293: Replace <code>pip</code> installation with <code>pipx</code></li> <li>#432: List printqrjune in wrappers list</li> </ul>"},{"location":"changelog/#0.10.0","title":"v0.10.0 April 18, 2022","text":"<p>(Please see the full set of changes for this release also in the v0.10.0rc0 and rc1 notes below)</p>"},{"location":"changelog/#milestone-v0100","title":"Milestone v0.10.0","text":""},{"location":"changelog/#0.10.0rc1","title":"v0.10.0rc1 April 6, 2022","text":"<ul> <li>#426, !207: \u011e1 Monetary License refactoring:<ul> <li>Drop display in a browser</li> <li>Discover available languages</li> <li>Create <code>G1MonetaryLicense</code> class out of existing functions</li> </ul> </li> <li>Add Italian translation of \u011e1 monetary license</li> <li>#421, !204 : <code>wot</code> command can display membership status from an other identity sharing same <code>uid</code>/<code>pubkey</code></li> <li>#422: <code>excluded</code> command displays information of an other identity sharing same uid/pubkey, not the one excluded</li> <li>#216 <code>diffi</code>: Catch WS disconnection exception</li> </ul>"},{"location":"changelog/#0.10.0rc0","title":"v0.10.0rc0 March 21, 2022","text":""},{"location":"changelog/#code_2","title":"Code","text":""},{"location":"changelog/#features","title":"Features","text":"<ul> <li>#89, !170: Manage the revocation document</li> <li>#134, !202: Read transaction recipients and amounts from a file</li> </ul>"},{"location":"changelog/#g1-monetary-license","title":"\u011e1 Monetary license","text":"<ul> <li>#221, !181: Research about \u011e1 monetary license integration and refactor of its handling in Silkaj</li> <li>#308, !181: \u011e1 license display on a workstation: give the choice how to display it</li> <li>#392, !181: \u011e1 monetary license files not included into the Python package</li> <li>!181: subtree updated bringing new translations: Esperanto, Espagnol, and Portuguese</li> </ul>"},{"location":"changelog/#deathreaper","title":"DeathReaper","text":"<ul> <li>#256: Implement <code>excluded</code> command to report excluded identities from the WoT / DeathReaper</li> </ul>"},{"location":"changelog/#network_1","title":"Network","text":"<ul> <li>#373, #396, #410, !182, !194: Drop asynchronous property</li> <li>#390, !182, !196: Implement generic <code>network_tools.send_document()</code></li> <li>#177, !188: Clean no longer used network layer functions<ul> <li>Rename global option from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> </ul> </li> <li>#181, #409, !193: Improve endpoint determination code layer</li> <li>#260: Disconnection bug when sending a document to a local node</li> </ul>"},{"location":"changelog/#other-changes","title":"Other changes","text":"<ul> <li>#407, !182: Support DuniterPy v1.0 Breaking Backward compatible changes in <code>Documents</code> classes</li> <li>#344, !177: Fix import loop issue</li> <li>!177: Generalize <code>pendulum</code> usage</li> <li>#416, !170: Move <code>wot_lookup()</code> exceptions handling in higher level functions</li> </ul>"},{"location":"changelog/#minor-impact-changes","title":"Minor impact changes","text":"<ul> <li>#194, !195: Convert strings to <code>f-strings</code></li> <li>#376, !195: Replace <code>tools.message_exit()</code> with <code>sys.exit()</code></li> <li>#413, !170: Create <code>get_currency()</code> helper</li> <li>#264, !178: Remove unmaintained and commented <code>network</code> command</li> </ul>"},{"location":"changelog/#meta","title":"Meta","text":"<ul> <li>!200: Bump DuniterPy to v1.1.0</li> <li>#332, !200: Drop Python v3.6 support</li> <li>#374, !197: Add support for Python v3.10</li> <li>#401, !184: Bump to click v8.0</li> <li>#364, !187: Introduce insert-license pre-commit hook, Switch <code>#</code> comment instead of <code>\"\"\"</code> docstring for the copyright and license statements</li> <li>#365, !201: Update the copyright date to 2022 in the headers of every source files</li> </ul>"},{"location":"changelog/#documentation_1","title":"Documentation","text":"<ul> <li>#384: Document how to release pre-releases</li> <li>!180: <code>README</code> and <code>CONTRIBUTING</code> enhancements</li> </ul>"},{"location":"changelog/#installationcontinuous-delivery","title":"Installation/Continuous Delivery","text":"<ul> <li>#388, !198: Set up Silkaj Docker images build automation</li> </ul>"},{"location":"changelog/#development-environmentcontinuous-integration","title":"Development Environment/Continuous Integration","text":"<ul> <li>#326, !189: Integrate coverage in GitLab coverage feature</li> <li>#355, !183: Set <code>Py:3.8</code> as default image and move coverage to <code>Py:3.9</code></li> <li>#355, !185: Move the coverage and the badge generations to v3.9 test job</li> <li>#414, !197: Drop Poetry lock file usage</li> <li>!175: <code>pyproject.toml</code> and <code>release.sh</code> clean-ups, Pyinstaller removal</li> </ul>"},{"location":"changelog/#introduce-and-generalize-pre-commit-usage","title":"Introduce and generalize <code>pre-commit</code> usage","text":"<ul> <li>#401, !183: Introduce <code>isort</code> and <code>gitlab-ci-linter</code> <code>pre-commit</code> hooks</li> <li>#403, !192: Introduce <code>pyupgrade</code>, Remove dev dep tools</li> <li>#406, !191: Set up <code>pre-commit</code> hooks CI jobs</li> <li>!179: Bump <code>black</code> to v21.4b2 and allow to install as pre-release</li> <li>!190: Update <code>pre-commit</code> doc. Document CI linter hook usage</li> </ul> <p>Thanks moul, matograine</p>"},{"location":"changelog/#0.9.0","title":"v0.9.0 April 17, 2021","text":""},{"location":"changelog/#milestone-v090","title":"Milestone v0.9.0","text":"<ul> <li>#345, #385, !171: Refactor <code>id</code>/<code>lookup</code> command exclusively using <code>/wot/lookup</code><ul> <li>Display non-member uids when passing a pubkey</li> <li>Use same algorithm as <code>choose_identity()</code> uses</li> <li>Rename <code>id</code> to <code>lookup</code> command</li> </ul> </li> <li>#377, !172: <code>balance</code>: Fix undefined variable in case of 'Total' label</li> </ul> <p>Plus what can be found bellow in v0.9.0rc</p>"},{"location":"changelog/#0.9.0rc","title":"v0.9.0rc March 24, 2021","text":""},{"location":"changelog/#code_3","title":"Code","text":""},{"location":"changelog/#tx","title":"<code>tx</code>","text":"<ul> <li>#281, !129: Handle transaction size limit properly</li> <li>#257, #312, #356: Handle chained transactions/Change txs lost while sending big amount</li> <li>#296, #362, !154, !157: Prevent sending transaction with 0 as amounts</li> <li>#172, !165: Refactor tx confirmation, by using <code>click.confirm()</code></li> </ul>"},{"location":"changelog/#balance","title":"<code>balance</code>","text":"<ul> <li>#300, !164: <code>balance</code>: Display corresponding member identity uid</li> <li>#366, !159: Fix wrong <code>DuniterError</code> exception handling in <code>wot.identity_of</code></li> <li>#377, !166: <code>balance</code>: Document <code>money.show_amount_from_pubkey()</code></li> <li>#342, !151: Don\u2019t allow to pass multiple times the same pubkey to the <code>balance</code> command</li> </ul>"},{"location":"changelog/#others","title":"Others","text":"<ul> <li>#218, !160: <code>history</code>: Add option to display the complete pubkeys</li> <li>#314, !165: Display option for <code>cert</code>, <code>membership</code> commands</li> <li>!165: Make <code>--dry-run</code> option a generic one</li> <li>#378, !165: Create and use generic <code>send_doc_confirmation()</code> in <code>cert</code> and <code>membership</code> commands</li> <li>#176, !149: Get rid of <code>PyNaCl</code> and use <code>base58</code> module</li> <li>#309, !163: <code>wot</code>: Fix legend about received certifications</li> <li>#208: <code>argos</code>: Remove duplicate call to <code>CurrencySymbol</code></li> </ul>"},{"location":"changelog/#tests","title":"Tests","text":"<ul> <li>#213, !130: Write unit tests for the <code>tx</code> command</li> <li>#282, !130: Split <code>patched.py</code> into files</li> <li>#335, !130: Merge the two functions testing <code>transaction_amount()</code></li> <li>#363, !129: Returns balance from <code>patched_get_source()</code></li> <li>#368, !161: Assertions are not tested when testing system exit</li> <li>#362, !156: Change \"moul\" id in tests</li> </ul>"},{"location":"changelog/#meta_1","title":"Meta","text":"<ul> <li>#240, !150: Drop Python 3.5 support</li> <li>#294, !150, docker/python3/poetry!1: Add support and set-up Python 3.9 test job</li> <li>#270: Silkaj v0.8.1 package for Debian Bullseye (v11)</li> <li>#226, !158: Get rid of <code>ipaddress</code> dependency</li> <li>#290, !162: Update <code>pre-commit</code> dev dependency</li> <li>#267: Update the copyright date to 2021 in the headers of every source files</li> <li>!150, !155, !167, Update DuniterPy from v0.58.1 to v0.62.0</li> <li>#313, !148: Be compatible with and handle new features from Poetry v1.1</li> <li>#299, !147: Introduce dev version suffix</li> </ul> <p>Thanks matograine, moul, atrax</p>"},{"location":"changelog/#0.8.1","title":"v0.8.1 November 30, 2020","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine</p>"},{"location":"changelog/#0.8.0","title":"v0.8.0 October 18, 2020","text":""},{"location":"changelog/#milestone-v080","title":"Milestone v0.8.0","text":""},{"location":"changelog/#code_4","title":"Code","text":""},{"location":"changelog/#transaction","title":"Transaction","text":"<ul> <li> <p>#111, !108: Support passing different amounts on multi-recipients tx</p> <ul> <li>Breaking change: Rename <code>--output</code> option to <code>--recipient</code></li> </ul> </li> <li> <p>Add extra small options to ease passing multiple amounts and recipients:</p> <ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code></li> </ul> </li> <li> <p>Add possibility to pass multiple options:</p> <ul> <li>Breaking change: recipients public keys are no longer <code>:</code> separated: <code>-r A -r B</code></li> </ul> </li> <li> <p>#232, !131, !132: Identities not retrieved for tx with several issuers, and to display the tx history</p> </li> <li> <p>#236, !107: Improve the confirmation display</p> </li> <li> <p>!144: Rework confirmation fields titles</p> </li> <li> <p>#235: Make sure only one option is passed to retrieve the amount of the transaction</p> </li> </ul>"},{"location":"changelog/#membership-wot","title":"Membership, WoT","text":"<ul> <li>#88, !140: Add <code>membership</code> command</li> <li>#88, !144: Rework table fields names</li> <li>#140, !140: Ability to pass an <code>uid</code> or a <code>pubkey</code> to <code>wot</code>, and <code>cert</code>, <code>membership</code> commands<ul> <li>Implement identity choice selector</li> </ul> </li> </ul>"},{"location":"changelog/#checksum","title":"Checksum","text":"<ul> <li>#237, !132: Breaking change: Switch back the checksum delimiter from <code>!</code> to <code>:</code></li> <li>#323, !132: Handle pubkey's checksum in the tx code</li> <li>#301, !143: Generalize pubkey checksum display and verifiction, Add <code>chekcsum</code> command</li> <li>#320, !143: Incorrect use of <code>check_public_key()</code> in <code>id</code> command</li> </ul>"},{"location":"changelog/#others_1","title":"Others","text":"<ul> <li>#262, !123: Add new <code>verify</code> command to check blocks\u2019 signatures</li> <li>#264, !133: Disable the broken <code>net</code> command</li> <li>!131: Display <code>powMin</code> in a row in the <code>blocks</code> explorer</li> <li>#210, !115: Close client session in every cases</li> <li>#223: Make Click context optional to be able to call functions from an external module</li> <li>#255, !113: <code>balance</code>: display the content in tables</li> <li>#269, !133: Move <code>convert_time()</code> to <code>tui.py</code></li> <li>#278, !128: Fix PubSec regex</li> <li>#336, !141: <code>history</code>: Pubkeys display issue with multisig txs</li> </ul>"},{"location":"changelog/#dev-env_1","title":"Dev Env","text":""},{"location":"changelog/#poetry-migration","title":"Poetry migration","text":"<ul> <li>#182: Migrate from Pipenv and <code>setup.py</code> to Poetry</li> <li>#249: Install Poetry stable when v1 is released</li> <li>#263, !127: Post migration tasks (black, poetry)</li> <li>#276, !120: Pip installation do not install <code>silkaj</code> executalbe into <code>$HOME/.local/bin</code></li> </ul>"},{"location":"changelog/#cicd-set-up","title":"CI/CD set-up","text":"<ul> <li>#245: Automated containers builds with Poetry installed for Python versions 3.5, 3.6, 3.7, and 3.8</li> <li>#149: CI/CD set up</li> <li>#105: Deploy on PyPI from GitLab CD</li> <li>#146: Add a coverage badge</li> <li>#284, !124: <code>build</code> and <code>tests</code> jobs are not retriggered in case of source code change</li> <li>#286, !126: Use latest Black version from PyPI in the container</li> <li>!131: Use <code>rules</code> instead of <code>only/except</code></li> </ul>"},{"location":"changelog/#tests_1","title":"Tests","text":"<ul> <li>#241: Can not run test with Click utility</li> </ul>"},{"location":"changelog/#dependencies","title":"Dependencies","text":"<ul> <li>#259: <code>attr</code> error while installing with <code>pip</code></li> <li>!121, !131, !142: Update DuniterPy from v0.55.1 to v0.58.0</li> <li>#251, !140: Introduce <code>pendulum</code> date utility</li> <li>Introduce <code>pytest-sugar</code></li> <li>Update PyNaCl to v1.4.0</li> <li>Update Click to v7.1.2</li> <li>#338, !140: Update black to v20</li> </ul>"},{"location":"changelog/#python-versions-support","title":"Python versions support","text":"<p>We added the support for Python 3.8. #240: It is planned that v0.8.x versions are going to be the last releases with Python 3.5 support since its support from the Python project has been dropped September 30th of 2020.</p>"},{"location":"changelog/#documentation_2","title":"Documentation","text":"<ul> <li>#202: Document contribution process in <code>CONTRIBUTING.md</code></li> <li>#182: Document Poetry installation and usage</li> <li>!109: Add Poetry installation on Debian Buster</li> <li>!103: Add pip installation documentation for macOS</li> <li>!131: Add packaging status badge from Repology</li> <li>#244: Add <code>AUTHORS.md</code> listing the contributors</li> <li>#207: Create Silkaj SVG logo</li> </ul>"},{"location":"changelog/#project_1","title":"Project","text":"<ul> <li>#252, !118: Create a script to update and update the copyright date to 2020</li> <li>#285, !132: Add copyright and license statements in tests source files</li> </ul>"},{"location":"changelog/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"changelog/#0.7.6","title":"v0.7.6 January 24, 2020","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"changelog/#0.7.5","title":"v0.7.5 January 23, 2020","text":"<ul> <li>#276: Publish on PyPI with previous method: <code>wheel</code>, <code>twine</code>, and <code>setup.py</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"changelog/#0.7.4","title":"v0.7.4 January 22, 2020","text":"<ul> <li>#273, !119: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"changelog/#0.7.3","title":"v0.7.3 July 25, 2019","text":"<p>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:</p> <ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate for loop</li> </ul>"},{"location":"changelog/#0.7.2","title":"v0.7.2 June 25, 2019","text":"<ul> <li>#233: fix round passed amount and amoundUD floats \u00d7 by 100</li> </ul>"},{"location":"changelog/#0.7.1","title":"v0.7.1 May 29, 2019","text":"<ul> <li>Fix transaction document generation from DuniterPy</li> </ul>"},{"location":"changelog/#0.7.0","title":"v0.7.0 May 22, 2019","text":""},{"location":"changelog/#milestone-v070","title":"Milestone v0.7.0","text":""},{"location":"changelog/#duniterpy","title":"DuniterPy","text":"<ul> <li>#7, !97: Migrate to DuniterPy</li> <li>#200: Freeze DuniterPy dependency version</li> <li>#206: Set a sleep for async requests</li> <li>#178: Select different sources for intermediaries tx</li> </ul>"},{"location":"changelog/#cli_2","title":"CLI","text":"<ul> <li>#77, !98: Migrate command line tool from commandline to Click</li> <li>#67, #76, #116, #117, #123: fixed by previous issue</li> <li>#167: Rename <code>amount</code> command to <code>balance</code></li> <li>#148: Rename <code>issuers</code> command to <code>blocks</code> which is a more appropriate word to what it does</li> <li>With <code>-p</code> option: when the port of the node is 443, it\u2019s not necessary to specify the port</li> </ul>"},{"location":"changelog/#transaction_1","title":"Transaction","text":"<ul> <li>#22: Display transactions history in a table</li> <li>#184: Rework transaction functions (Part 3)</li> <li>#152: fix <code>--allSources</code> option which was not working</li> <li>#165, !99: Display outputBackChange option in confirmation chart</li> <li>#131: Prevent sending too small amount</li> </ul>"},{"location":"changelog/#certification","title":"Certification","text":"<ul> <li>#170: Change process: only propose license display</li> <li>#198: Display identity\u2019s blockstamp and date into confirmation message</li> </ul>"},{"location":"changelog/#difficulty-level","title":"Difficulty level","text":"<ul> <li>#93: Difficulties fails / use websocket to be informed about new block</li> <li>#190: Display the date when the head block has been generated</li> </ul>"},{"location":"changelog/#balance_1","title":"Balance","text":"<ul> <li>!96, #122: display balance in comparison to the average of money share</li> </ul>"},{"location":"changelog/#blocks","title":"Blocks","text":"<ul> <li>Display the full dates of blocks\u2019 generation and mediantime</li> </ul>"},{"location":"changelog/#wot","title":"WoT","text":"<ul> <li>#141: Crash on membership status</li> <li>Add legend to explain <code>\u2714</code></li> <li>#189: Handle wot requests exceptions</li> <li>#135 :is_member() requests all members to know if an identity is member will explose</li> </ul>"},{"location":"changelog/#authentication","title":"Authentication","text":"<ul> <li>#130: Prevent erasing authfile</li> <li>Use <code>pathlib.Path</code> instead of <code>os.path</code></li> </ul>"},{"location":"changelog/#tests_2","title":"Tests","text":"<ul> <li>!83, #85: Create test structure</li> <li>#225: Install <code>pytest-asyncio</code></li> </ul>"},{"location":"changelog/#other","title":"Other","text":"<ul> <li>#161: Singleton improvement</li> <li>#157, !100: Use <code>for</code> loops</li> <li>#169, !100: type issue</li> <li>#113: Many small improvements</li> </ul>"},{"location":"changelog/#website-doc","title":"Website / Doc","text":"<ul> <li>#82: Update website and readme about new features</li> <li>#136: Link directly the installation documentation on the website</li> <li>#159: Update website</li> <li>#160: Add website repository link in the README</li> <li>List Silkaj wrappers en the README</li> </ul>"},{"location":"changelog/#installation-documentation","title":"Installation documentation","text":"<ul> <li>Add instructions on installing libsodium which is required by pylibscrypt since DuniterPy migration</li> <li>#142: Improve pip installation documentation</li> <li>Improve Pipenv installation documentation</li> <li>!89: Add Docker install procedure, Pip: dependency and PATH tricks</li> <li>#215: Conflict between pyproject.toml and pipenv install</li> </ul>"},{"location":"changelog/#windows","title":"Windows","text":"<ul> <li>#153: Install on Windows, Scrypt issue</li> <li>#154: net: can\u2019t get screen size on Windows</li> <li>!92: Document Windows installation with pip</li> </ul>"},{"location":"changelog/#project_2","title":"Project","text":"<ul> <li>#132: Add a license notice as a header of every source files</li> <li>#158: Add CHANGELOG.md file</li> <li>#186: Fix firsts two tags</li> <li>Pypi: add classifiers</li> </ul>"},{"location":"changelog/#thanks_1","title":"Thanks","text":"<p>Attilax, Bernard, cebash, matograine, vtexier</p>"},{"location":"changelog/#0.6.5","title":"v0.6.5 Debian January 8, 2019","text":"<p>v0.6.5 fork for Debian package without DuniterPy migration but with Click CLI module.</p> <ul> <li>#137: Create Debian package and publish it in Buster</li> <li>#77, !98: Migrate to Click</li> <li>#132: Add a license notice as a header of every source files</li> </ul>"},{"location":"changelog/#thanks_2","title":"Thanks","text":"<p>jonas</p>"},{"location":"changelog/#0.6.1","title":"v0.6.1 December 10, 2018","text":""},{"location":"changelog/#milestone-v061","title":"Milestone v0.6.1","text":"<ul> <li>!90, #151: Fix intermediaries transactions sent to wrong recipient</li> <li>!91, #145: Allow to renew certifications</li> <li>#155: Make <code>clear</code> calls works on Windows</li> <li>#141: Crash on membership status</li> <li>#166: Shell completion</li> </ul>"},{"location":"changelog/#0.6.0","title":"v0.6.0 November 18, 2018","text":""},{"location":"changelog/#milestone-v060","title":"Milestone v0.6.0","text":""},{"location":"changelog/#installation","title":"Installation","text":"<ul> <li>#86: Move from <code>pyenv+pip</code> to Pipenv as the new development environment solution</li> <li>#100, !80: New installation method with <code>pip</code> now set as default</li> <li>#100: Documentation on how to publish on Pypi</li> </ul>"},{"location":"changelog/#authentication_1","title":"Authentication","text":"<ul> <li>#78: Use Scrypt as default authentication method</li> <li>#102: Display a confirmation message after using <code>generate_auth_file</code> command</li> <li>#103: More explicit usage about the authentication file mechanism storage</li> </ul>"},{"location":"changelog/#certification_1","title":"Certification","text":"<ul> <li>#96, !82: Certification fails for non-members identities</li> <li>Prevent certifying ourself</li> <li>Code refactoring: simplification, duplicate code removal</li> </ul>"},{"location":"changelog/#wot_1","title":"Wot","text":"<ul> <li>Display certification stock</li> <li>#73: Display identity status:<ul> <li>Display membership expiration due to membership expiration and certifications expiration</li> </ul> </li> <li>#127: fix: display human readable date for 'revoked on' attribute</li> </ul>"},{"location":"changelog/#transaction_2","title":"Transaction","text":"<ul> <li>#83, !78: Allow multi-output transactions</li> <li>#72: Check the pubkey\u2019s balance is enough before processing the transaction</li> <li>#72: Minors transaction refactoring</li> <li>#101: Round UD value in the confirmation summary</li> <li>#118: Use generic function to get sources</li> <li>#120: Display pubkey\u2019s balance before and after transaction in the confirmation summary</li> <li>#125: Fix wrong amount transferred</li> </ul>"},{"location":"changelog/#new-commands","title":"New commands","text":"<ul> <li>#91: <code>about</code>: displays information about silkaj</li> <li>#95: <code>license</code>: displays \u011e1\u2019s license</li> </ul>"},{"location":"changelog/#g1-test","title":"\u011e1-test","text":"<ul> <li>#87: Add <code>--gtest</code> option to specify official \u011e1-test node</li> <li>#109, !84: Improve gtest usage message</li> <li>#112: Amount: fix authentication option with <code>--gtest</code> option</li> </ul>"},{"location":"changelog/#python-37","title":"Python 3.7","text":"<ul> <li>#98: Test with Python 3.7: silkaj is compatible with Python from version 3.4 to 3.7</li> <li>#98: Set Python 3.7 for Pipenv</li> </ul>"},{"location":"changelog/#network-performances","title":"Network performances","text":"<ul> <li>#42, !85: Thanks to singleton, requests are made once for <code>head_block</code>, blockchain parameters, endpoint, <code>ud_value</code>, and <code>currency_symbol</code> retrieval</li> <li>#32: request the domain first instead of the IP (to handle https certificates) (this avoid <code>network</code> view to crash)</li> <li>#32, !79: Add timeouts on GET and POST requests</li> <li>#128, !88: Fix POST request timeout</li> </ul>"},{"location":"changelog/#black-code-formatting","title":"Black: code formatting","text":"<ul> <li>#94, !76: move from <code>pep8</code> to <code>black</code> code formatting. Set pre-commit hook and CI worker</li> </ul>"},{"location":"changelog/#bug-fixes-and-refactoring","title":"Bug fixes and refactoring","text":"<ul> <li>#121: Move cryptographic related functions into <code>crypto_tools.py</code></li> </ul>"},{"location":"changelog/#logo","title":"Logo","text":"<ul> <li>#92: Silkaj logo publication under GNU APGLv3 after a successful crowdfunding</li> </ul>"},{"location":"changelog/#wrappers","title":"Wrappers","text":"<ul> <li>#107: Document silkaj wrappers usages</li> </ul>"},{"location":"changelog/#forum-post","title":"Forum post","text":""},{"location":"changelog/#0.5.0","title":"v0.5.0 May 22, 2018","text":""},{"location":"changelog/#milestone-v050","title":"Milestone v0.5.0","text":""},{"location":"changelog/#certification_2","title":"Certification","text":"<ul> <li>#61: sending certification document:<ul> <li>check that current identity is member</li> <li>check that the certification has not already been sent</li> <li>prompt \u011e1\u2019s license and ask for acceptance in web browser or in pager (a <code>less</code>-like) if no web browser is available</li> </ul> </li> </ul>"},{"location":"changelog/#wot_2","title":"Wot","text":"<ul> <li>#84: display certifications\u2019 expiration date</li> <li>#81: bugfix, nothing displayed when there is two identities with same id</li> </ul>"},{"location":"changelog/#amount","title":"Amount","text":"<ul> <li>remove necessity to prepend with <code>--pubkey</code> option: <code>silkaj amount pubkey1:pubkey2:pubkey3</code></li> </ul>"},{"location":"changelog/#issuers","title":"Issuers","text":"<ul> <li>display the hash\u2019s ten first characters as \u011e1\u2019s global difficulty has increased</li> <li>display blocks in current window: <code>silkaj issuers 0</code></li> </ul>"},{"location":"changelog/#build","title":"Build","text":"<ul> <li>#6: Automate releases using a script</li> </ul>"},{"location":"changelog/#other_1","title":"Other","text":"<ul> <li>display <code>\u011e1</code> and <code>\u011eTest</code> currencies symbols</li> <li>Aliases commands <code>id</code>: <code>identities</code>, <code>tx</code>: <code>transaction</code>, <code>net</code>: <code>network</code></li> <li><code>import</code> rework to improve loading performances</li> <li>Lots of code reorganization and cleaning</li> </ul>"},{"location":"changelog/#forum-post_1","title":"Forum post","text":""},{"location":"changelog/#0.4.0","title":"v0.4.0 January 28, 2018","text":""},{"location":"changelog/#milestone-v040","title":"Milestone v0.4.0","text":""},{"location":"changelog/#new-wot-command-which-displays-received-and-sent-certification-of-an-identity","title":"New <code>wot</code> command which displays received and sent certification of an identity","text":"<ul> <li>!50, !66</li> </ul>"},{"location":"changelog/#transaction_3","title":"Transaction","text":"<ul> <li>#41: Rework/refactoring of transaction code (part 1)</li> <li>!55: Add check condition for sources</li> <li>!57: Exit if wrong pubkey\u2019s output formats</li> </ul>"},{"location":"changelog/#amount_1","title":"Amount","text":"<ul> <li>#46, !68: Add ability to display the amount of many pubkey with same command</li> <li>Total amount of pubkeys displayed at the end (nice to know how much units you own)</li> </ul>"},{"location":"changelog/#authentication_2","title":"Authentication","text":"<ul> <li>!56: Add \u011eannonce (aka PubSec) file format import</li> <li>#60: Hide salt at scrypt authentication</li> </ul>"},{"location":"changelog/#difficulties","title":"Difficulties","text":"<ul> <li>!58: Reload/refresh in a loop PoW difficulty level</li> <li>Display in same order as Remuniter</li> </ul>"},{"location":"changelog/#id","title":"Id","text":"<ul> <li>#49: Display if pubkey is member</li> <li>#59: Bug fix with <code>id</code> command</li> </ul>"},{"location":"changelog/#build_1","title":"Build","text":"<ul> <li>Build published with sha256 checksum</li> </ul>"},{"location":"changelog/#other_2","title":"Other","text":"<ul> <li>Change default endpoint</li> </ul>"},{"location":"changelog/#thanks_3","title":"Thanks","text":"<p>Thanks to Tortue95, jytou, mmuman, and cuckooland</p>"},{"location":"changelog/#forum-post_2","title":"Forum post","text":""},{"location":"changelog/#0.3.0","title":"v0.3.0 April 17, 2017","text":""},{"location":"changelog/#milestone-v030","title":"Milestone v0.3.0","text":""},{"location":"changelog/#transactions","title":"Transactions","text":"<ul> <li>enhance transaction command:<ul> <li>#27, #30: ask for confirmation</li> <li>!38: new confirmation chart containing transaction informations</li> <li>don\u2019t prompt <code>scrypt</code> parameters. See <code>Auth</code> \u00a7</li> </ul> </li> </ul>"},{"location":"changelog/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>!29: new command <code>id</code> to search identities with pubkey or id</li> </ul>"},{"location":"changelog/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>#23, !40: Pyenv installation tutorial</li> </ul>"},{"location":"changelog/#authentication_3","title":"Authentication","text":"<ul> <li>!45: new authentication method: WIF. For future paper wallet feature</li> <li>#39, #43: Don\u2019t prompt scrypt parameters at authentication. Use default ones</li> </ul>"},{"location":"changelog/#builds","title":"Builds","text":"<ul> <li>#5: with Pyinstaller</li> </ul>"},{"location":"changelog/#other_3","title":"Other","text":"<ul> <li>!33, !37: Ability to sort network view</li> <li>Change license from GNU GPLv3 to GNU AGPLv3</li> <li>!31: Code formatting with <code>pep8</code></li> </ul> <p>Thanks to Tortue95 and jytou</p>"},{"location":"changelog/#forum-post_3","title":"Forum post","text":""},{"location":"changelog/#0.2.0","title":"v0.2.0 March 27, 2017","text":""},{"location":"changelog/#features_1","title":"Features","text":"<ul> <li>Transaction feature</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"changelog/#milestone-v020","title":"Milestone v0.2.0","text":""},{"location":"changelog/#announcement","title":"Announcement","text":"<ul> <li>Diaspora* post</li> </ul> <p>Big thanks to Tortue95, and mmuman.</p>"},{"location":"changelog/#0.1.0","title":"v0.1.0 September 23, 2016","text":""},{"location":"changelog/#public-release","title":"Public release","text":"<ul> <li>Duniter forum post</li> <li>Diaspora* post</li> </ul>"},{"location":"changelog/#milestone-v010","title":"Milestone v0.1.0","text":""},{"location":"changelog/#features_2","title":"Features","text":"<p>Sub-commands:</p> <ul> <li><code>info</code></li> <li><code>difficulties</code></li> <li><code>network</code></li> <li><code>issuers</code></li> </ul> <p>Thanks to c-geek.</p>"},{"location":"install/","title":"Install Silkaj","text":""},{"location":"install/#distribution","title":"Distribution","text":"<p>Installing Silkaj from the package manager of your favorite distribution might not be available or might not come with latest Silkaj version. In order to get latest version install Silkaj with <code>pipx</code> or <code>pip</code> from PyPI which you can find in next sections.</p> <p></p>"},{"location":"install/#unix","title":"Unix","text":"<p>On a Unix system, run in your shell following commands:</p>"},{"location":"install/#install-libsodium","title":"Install libsodium","text":"DebianFedoramacOS <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium-devel\n</code></pre> <pre><code>brew install libsodium\n</code></pre>"},{"location":"install/#install-pipx","title":"Install <code>pipx</code>","text":"<p>Check <code>pipx</code> documentation for an extended installation tutorial.</p> DebianFedoramacOS <pre><code>sudo apt install pipx python3-dev\n</code></pre> <pre><code>sudo dnf install pipx python3-devel\n</code></pre> <pre><code>brew install python3 pipx\n</code></pre>"},{"location":"install/#install-with-pipx","title":"Install with pipx","text":"<p>pipx tool is recommended for Python executables. It isolates libraries into separated virtual environments.</p>"},{"location":"install/#ensure-path","title":"Ensure path","text":"<p>Takes care to add Pipx executables in the <code>PATH</code> of your shell:</p> <pre><code>pipx ensurepath\n</code></pre>"},{"location":"install/#install","title":"Install","text":"<pre><code>pipx install silkaj\n</code></pre>"},{"location":"install/#upgrade","title":"Upgrade","text":"<pre><code>pipx upgrade silkaj\n</code></pre>"},{"location":"install/#uninstall","title":"Uninstall","text":"<pre><code>pipx uninstall silkaj\n</code></pre>"},{"location":"install/#check-silkaj-is-working","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#install-with-pip","title":"Install with pip","text":"<p><code>pipx</code> installation is recommended, but you can proceed with <code>pip</code> if you know what you are doing.</p>"},{"location":"install/#install-pip","title":"Install <code>pip</code>","text":"DebianFedoramacOS <pre><code>sudo apt install python3-pip\n</code></pre> <pre><code>sudo dnf install python3-pip\n</code></pre> <p>Already installed with <code>python3</code></p>"},{"location":"install/#completing-path","title":"Completing <code>PATH</code>","text":"<p>If after Silkaj intallation you get a <code>bash: silkaj: command not found</code> error, you have to extend the <code>PATH</code> with <code>~./local/bin</code>:</p> <pre><code>echo \"export PATH=$PATH:$HOME/.local/bin\" >> $HOME/.bashrc\nsource $HOME/.bashrc\n</code></pre>"},{"location":"install/#install-for-current-user-only","title":"Install for current user only","text":"<pre><code>pip install silkaj --user\n</code></pre>"},{"location":"install/#upgrade_1","title":"Upgrade","text":"<pre><code>pip install silkaj --user --upgrade\n</code></pre>"},{"location":"install/#uninstall-useful-to-see-the-real-paths","title":"Uninstall (useful to see the real paths)","text":"<pre><code>pip uninstall silkaj --user\n</code></pre>"},{"location":"install/#check-silkaj-is-working_1","title":"Check Silkaj is working","text":"<pre><code>silkaj\n</code></pre>"},{"location":"install/#shell-completion","title":"Shell completion","text":"<p>Set up the shell completion by adding following line in your shell configuration depending on your shell:</p> BashZshFish $HOME/.bashrc<pre><code>eval \"$(_SILKAJ_COMPLETE=bash_source silkaj)\"\n</code></pre> $HOME/.zshrc<pre><code>eval \"$(_SILKAJ_COMPLETE=zsh_source silkaj)\"\n</code></pre> $HOME/.config/fish/completions/silkaj.fish<pre><code>_SILKAJ_COMPLETE=fish_source silkaj | source\n</code></pre> <p>For further details checkout Click documentation.</p>"},{"location":"install/#install-to-contribute","title":"Install to contribute","text":"<p>Check out the installation guide with Poetry.</p>"},{"location":"blog/","title":"Blog","text":""},{"location":"blog/silkaj-new-cli-duniter-client/","title":"Silkaj: new CLI Duniter client","text":"<p>I am pleased to announce a new Duniter client! It's a client from CLI (command line interface) written with Python 3.</p> <ul> <li>Diaspora* post</li> <li>Code repository with a tutorial to install it.</li> </ul> <p>This client was started almost two weeks ago and needed to be mature enough before public release.</p>"},{"location":"blog/silkaj-new-cli-duniter-client/#features","title":"Features","text":"<p>You could see the result of one of its best sub command <code>network</code>:</p> <pre><code>./src/silkaj.py network\n\n### 20 peers ups, with 15 members and 5 non-members\n\n| domain | ip4 | port | block | hash | gen_time | uid |member| pubkey |diffi| version |\n|---------------------+----------------+------+-------+-------------+----------+-----------+------+--------+-----+----------|\n| cgeek.fr | 88.174.120.187 | 9330| 41166 | 000027421F\u2026 | 15:59:00 | cgeek | yes | HnFcS\u2026 | 77 | 0.31.0b6 |\n| mirror1.cgeek.fr | 88.174.120.187 | 9331| 41166 | 000027421F\u2026 | 15:59:00 | | no | 4jT89\u2026 | | 0.31.0b6 |\n| mirror2.cgeek.fr | 88.174.120.187 | 9332| 41166 | 000027421F\u2026 | 15:59:00 | | no | AZ2JP\u2026 | | 0.31.0b6 |\n| \u2026t.duniter.inso.ovh | | 80| 41166 | 000027421F\u2026 | 15:59:00 | inso | yes | 8Fi1V\u2026 | 231 | 0.30.17 |\n| peer.duniter.org | 51.255.197.83 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | | no | BSmby\u2026 | | 0.30.17 |\n| desktop.moul.re | 78.227.107.45 | 24723| 41166 | 000027421F\u2026 | 15:59:00 | moul | yes | J78bP\u2026 | 77 | 0.31.0b7 |\n| misc.moul.re | 78.227.107.45 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | moul | yes | J78bP\u2026 | 77 | 0.31.0b7 |\n| test-net.duniter.fr | 88.189.14.141 | 9201| 41166 | 000027421F\u2026 | 15:59:00 | kimamila | yes | 5ocqz\u2026 | 385 | 0.31.0b3 |\n| raspi3.cgeek.fr | 88.174.120.187 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | | no | G3wQw\u2026 | | 0.31.0a9 |\n| duniter.vincentux.fr| | 8999| 41166 | 000027421F\u2026 | 15:59:00 | vincentux | yes | 9bZEA\u2026 | | 0.30.17 |\n| remuniter.cgeek.fr | 88.174.120.187 | 16120| 41166 | 000027421F\u2026 | 15:59:00 | remuniter\u2026| yes | TENGx\u2026 | | 0.30.17 |\n| | 88.163.42.58 | 34052| 41166 | 000027421F\u2026 | 15:59:00 | cler53 | yes | 4eDis\u2026 | 77 | 0.30.17 |\n| suchard.si7v.fr | 163.172.252.3 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | hacky | yes | DesHj\u2026 | 77 | 0.31.0a8 |\n| | 87.91.122.123 | 9330| 41166 | 000027421F\u2026 | 15:59:00 | mmpio | yes | BmDso\u2026 | 154 | 0.31.0b3 |\n| \u2026er.help-web-low.fr | 151.80.40.148 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | pafzedog | yes | XeBpJ\u2026 | 154 | 0.30.17 |\n| | 87.90.32.15 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | nay4 | yes | BnSRj\u2026 | 77 | 0.31.0a9 |\n| duniter.modulix.net | 212.47.227.101 | 9330| 41166 | 000027421F\u2026 | 15:59:00 | modulix | yes | DeCip\u2026 | | 0.30.17 |\n| | 88.174.120.187 | 33036| 41166 | 000027421F\u2026 | 15:59:00 | | no | GNRug\u2026 | | 0.31.0b7 |\n| duniter.cco.ovh | 163.172.176.32 | 8999| 41166 | 000027421F\u2026 | 15:59:00 | charles | yes | DA4PY\u2026 | 77 | 0.31.0a8 |\n| duniter.ktorn.com | 107.170.192.122| 8999| 41166 | 000027421F\u2026 | 15:59:00 | ktorn | yes | BR5DD\u2026 | 77 | 0.30.17 |\n</code></pre>"},{"location":"blog/v0100/","title":"v0.10.0","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.10.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/v0100/#introduction","title":"Introduction","text":"<p>This release comes with the handling of the complete life cycle of the revocation file, the ability to read transaction amounts and recipients listing from a file, convenient for recurrent transaction. Last but not least, the code handling \u011e1 monetary license has been refactored. The upstream changes have been retrieved and now features the license into six languages.</p> <p>Under the hood, Silkaj codebase has been updated to use DuniterPy v1.0, which comes with breaking backward compatible changes on the <code>Documents</code> classes and the drop of the asynchronous property.</p> <p>As always, this release also comes with an emphasis on the development environment, with <code>pre-commit</code> usage generalization with the introduction of new hooks.</p>"},{"location":"blog/v0100/#revocation","title":"Revocation","text":"<p>The complete lifecycle of the revocation document and its storage in a file is now supported!</p> <p>The <code>revocation</code> command comes with four sub-commands:</p> <pre><code>silkaj revocation --help\nUsage: silkaj revocation [OPTIONS] COMMAND [ARGS]...\n\n Create, save, verify or publish revocation document. Subcommands optionally\n take the path to the revocation document.\n\nOptions:\n -h, --help Show this message and exit.\n\nCommands:\n publish Publish revocation document.\n revoke Create and publish revocation document.\n save Create and save a revocation document.\n verify Verifies that a revocation document is correctly formatted and...\n</code></pre> <p>With these command, you can generate a revocation file, verify its integrity and publish to actually revoke an identity.</p> <p>For the first time we implemented sub-subcommands thanks to Click. In the future, we will implement more commands using this feature, since we now know how to implement it.</p>"},{"location":"blog/v0100/#read-transaction-recipients-and-amounts-from-a-file","title":"Read transaction recipients and amounts from a file","text":"<p>You can now define a file following this format. For instance, a file named <code>recipients.txt</code>:</p> recipients.txt<pre><code><ABSOLUTE|RELATIVE>\n\n# comment 1\n<amount1> <pubkey1>\n\n# comment 2\n<amount2> <pubkey2>:[<checksum2>]\n</code></pre> <p>It lists the amounts and the recipients\u2019 pubkeys for which the multi-recipients transaction will be issued. The checksum can be append to the pubkey to have its integrity checked.</p> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>It will generate a multi-recipients transaction with the amounts in absolute or relative reference depending of the setted header (<code>ABSOLUTE</code> or <code>RELATIVE</code>).</p>"},{"location":"blog/v0100/#g1-monetary-license","title":"\u1e201 Monetary license","text":"<p>The upstream repository containing the licenses has been updated. This update brings fixes and improvements on the existing languages and brings additional new languages: Esperanto, Espagnol, Italian, and Portuguese</p> <p>The display is now only displaying the embedded license files in the console, since it\u2019s available in six up-to-date languages.</p> <pre><code>silkaj license\nIn which language would you like to display \u011e1 monetary license? (es, en, eo, it, fr, pt) [en]: fr\n</code></pre> <p>The display in the browser has been removed since there were just two websites links to outdated licences in French and English.</p>"},{"location":"blog/v0100/#deathreaper","title":"DeathReaper","text":"<p>If you missed DeathReaper crowdfunding completion, you can check this message or the complete post if you have not been aware of.</p>"},{"location":"blog/v0100/#silkaj-docker-image","title":"Silkaj Docker image","text":"<p>The automated generation of Silkaj Docker images has been implemented in the first place to distribute DeathReaper. This is a new way to install Silkaj and its environment. This is convenient to distribute non-stable releases. You can find the documentation on how to use these images.</p>"},{"location":"blog/v0100/#network","title":"Network","text":"<ul> <li>The asynchronous property has been dropped. The HTTP library usage has been migrated from <code>asyncio</code> to <code>urllib</code></li> <li>The global option to specify a custom endpoint has been renamed from <code>-p/--peer</code> to <code>-ep/--endpoint</code></li> <li>Silkaj network layer has been refactored, bringing a more robust code</li> </ul>"},{"location":"blog/v0100/#duniterpy-v10","title":"DuniterPy v1.0","text":"<p>Support have been added to support DuniterPy v1.0 which came with many breaking backward compatible changes in the <code>Documents</code> classes.</p>"},{"location":"blog/v0100/#meta","title":"Meta","text":"<p>This release introduces support for Python v3.10 and drops support for Python v3.6.</p>"},{"location":"blog/v0100/#development-environment","title":"Development Environment","text":"<p><code>pre-commit</code> usage has been generalized with <code>black</code>, <code>isort</code>, <code>pyupgrade</code>, <code>insert-license</code>, and <code>gitlab-ci-linter</code> hooks. These hooks are run as jobs into the CI.</p>"},{"location":"blog/v0100/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v0100/#outlook","title":"Outlook","text":"<p>New <code>pre-commit</code> hooks (<code>pylint</code>, <code>flake8</code>, <code>mypy</code>) will be introduced to have more guardrails in order to ensure that future implementations will allow to reach higher code quality. Then, it\u2019s planned to migrate from <code>tabulate</code> to <code>Texttable</code>, and then restructure the repository. Once these prerequisites have been completed, the emphasis will be put onto migrating to Duniter v2 using Substrate. This means using new APIs: RPC, Subsquid, Using new documents called extrinsincs, and probably other changes.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/","title":"Call for testing Silkaj v0.10.0rc","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.10.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>To install and run Silkaj from a container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.10.0rc0 silkaj info\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#tests","title":"Tests","text":"<p>Please test it globally, and check v0.10.0 milestone short summary which contains the changes which have been implemented during this development cycle. Pay a special attention to the newly introduced revocation command.</p> <p>Manual tests help us making sure everything works fine in different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any revocation or loss of money to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#revocation","title":"Revocation","text":"<p><code>revocation</code> command handle the revocation document in an extended way. Check the sub-commands:</p> <pre><code>silkaj revocation --help\n</code></pre> <p>Make sure you are able to create new identities before proceeding. Create a revocation file with an existing identity. Verify the generated file, and publish it!</p> <pre><code>silkaj --gtest revocation save revocation_test.txt\nsilkaj --gtest revocation verify revocation_test.txt\nsilkaj --gtest revocation publish revocation_test.txt\n</code></pre> <p>Or directly all the previous steps with one command:</p> <pre><code>silkaj --gtest revocation revoke\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#license","title":"License","text":"<p>Check \u011e1 monetary license get displayed correctly in any language and in any configuration: workstation or headless computers.</p> <pre><code>silkaj license\nsilkaj --g1-license-web license\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#network-documents-issuance","title":"Network, documents issuance","text":"<p>Silkaj\u2019s network code layer have been completely rewritten, an other HTTP library is used, the asynchronous propery has been dropped, and the documents classes have been refactored. Try any commands requesting information from the network or try sending any document.</p> <pre><code>silkaj info\nsilkaj -ep <hostname>:<port> membership\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#transaction-recipients-and-amounts-definition-reading-from-a-file","title":"Transaction recipients and amounts definition reading from a file","text":"<p>You can now define <code>recipients.txt</code> file following this format:</p> recipients.txt<pre><code>ABSOLUTE\n\n# moul-test\n10 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\n\n# matograine\n20 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm\n</code></pre> <p>And pass it to <code>silkaj tx</code> command as follow:</p> <pre><code>silkaj --gtest tx -f recipients.txt\n</code></pre> <p>Check that everything works fine with <code>RELATIVE</code> reference. You can also check broken file, and see if Silkaj reacts properly to any error in the file format definition.</p>"},{"location":"blog/call-for-testing-silkaj-v0100rc/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned for April 16th 2022, which will be released with an announcement listing the new features as well as a detailed changelog.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v0110-release/","title":"Silkaj v0.11.0 release","text":"<p>Silkaj team is pleased to announce the stable release of Silkaj version 0.11.0</p> <p>The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v0110-release/#introduction","title":"Introduction","text":"<p>This release comes with the <code>pipx</code> installation method, a new design of command line interface with commands separated in groups. Last but not least, it contains the migration to <code>Texttable</code> table library, network improvements and fixes, and Python v3.11 support.</p> <p>On the development environment side, the repository has been restructured, the code has been annotated with types, and linted. <code>mypy</code> and <code>pylint</code> pre-commit hooks have been introduced. The tests have been separated into unit and integration tests. <code>main</code> branch is new name of the main branch.</p> <p>This release emphasis was put onto strengthen the development environment as well as improving the structure of Silkaj code base. The goal was to do preparations and cleaning before Substrate migration in order to be fully focus onto it in next development cycle.</p> <p>This release is the latest planned major release with Duniter v1/BMA support and the one planned to end into Debian 12 Bookworm.</p>"},{"location":"blog/silkaj-v0110-release/#pipx-installation-method","title":"<code>pipx</code> installation method","text":"<p><code>pipx</code> have been found to be a recommendable tool over <code>pip</code> to install an end-user Python software when the latter is not available in distributions repositories. In addition to <code>pip</code> features, <code>pipx</code> creates virtual environments, which prevents conflicting dependencies among several installed Python software. A nice feature of <code>pipx</code> is the <code>ensurepath</code> commands which takes care to add the Python executables path into the <code>PATH</code> environment variable, which can be found to be the trickiest part of the installation. Silkaj documentation has been updated to suggest <code>pipx</code> instead of <code>pip</code>.</p> <p>In short, you can install Silkaj via <code>pipx</code> this way:</p> <pre><code>sudo apt install pipx libsodium23\npipx install silkaj\n</code></pre> <p>For a comprehensive documentation, check the installation documentation.</p>"},{"location":"blog/silkaj-v0110-release/#new-cli-design","title":"New CLI\u00a0design","text":"<p>The commands have been grouped into following groups: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. The other commands not related to these topics have been kept at the root of the CLI\u00a0tree.</p> <pre><code>silkaj --help\n about Display program information\n authentication Generate authentication file\n blockchain Blockchain related commands\n checksum Generate checksum out of a passed pubkey or an...\n license Display \u011e1 monetary license\n money Money management related commands\n wot Web-of-Trust related commands\n</code></pre> <pre><code>silkaj blockchain --help\n blocks Display blocks: default: 0 for current window size\n difficulty Display the current Proof of Work difficulty level to...\n info Display information about currency\n verify Verify blocks\u2019 signatures.\n</code></pre> <pre><code>silkaj money --help\n balance Get wallet balance\n history Display transaction history\n transfer Transfer money\n</code></pre> <pre><code>silkaj wot --help\n certify Send certification\n lookup User identifier and public key lookup\n membership Send and sign membership document: for first emission and...\n revocation Create, save, verify or publish revocation document.\n status Check received and sent certifications and consult the...\n</code></pre> <p>In this process following commands have been renamed:</p> <pre><code>diffi \u2212> difficulty\ntx \u2212> transfer\ncert \u2212> certify\nrevocation save \u2212> revocation create\nwot \u2212> wot status\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#texttable","title":"Texttable","text":"<p>The code has been migrated from <code>tabulate</code> to <code>Texttable</code> external table libraries. <code>Texttable</code> was introduced and was only used from the <code>history</code> command, where the other commands were using <code>tabulate</code>. Both were used, and we had to make the choice to stick with one and get the opportunity to reduce the dependency list of one item. The migration has been done. You will probably notice differences in the table style and the alignments in the columns.</p> <p>Before, with <code>tabulate</code>:</p> <pre><code>| uid | blocks | percent |\n|-------------+----------+-----------|\n| vit2 | 33 | 33.0 |\n| Pini | 25 | 25.0 |\n| moul-test | 24 | 24.0 |\n| jytou4-test | 10 | 10.0 |\n| jytou5-test | 8 | 8.0 |\n</code></pre> <p>Now, with <code>texttable</code>:</p> <pre><code>\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502 uid \u2502 blocks \u2502 percent \u2502\n\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\n\u2502 vit2 \u2502 33 \u2502 33 \u2502\n\u2502 Pini \u2502 26 \u2502 26 \u2502\n\u2502 moul-test \u2502 23 \u2502 23 \u2502\n\u2502 jytou4-test \u2502 10 \u2502 10 \u2502\n\u2502 jytou5-test \u2502 8 \u2502 8 \u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n</code></pre>"},{"location":"blog/silkaj-v0110-release/#network","title":"Network","text":"<p>Breaking network connection is something recurrent on local network with BMA. A hack have been introduced to circumvent this issue with <code>sleep</code> calls between repetitive requests which retrieve user ids from public keys.</p> <p>The singletons have been replaced with <code>@functools.lru_cache()</code> decorator usage. They are both used to reduce the network traffic and therefore speed-up the commands execution. They are basically allowing to reuse the result obtained from the first request in case the same request happen again. In Silkaj, they are used to retrieve the UD value, the currency parameters, and the head block only once. Singletons pattern has been a pain to handle specially within the tests. <code>@functools.lru_cache()</code> fixes that which comes in handy as a boilerplate.</p>"},{"location":"blog/silkaj-v0110-release/#argos","title":"Argos","text":"<p><code>argos</code> command have been removed. This command was displaying basic information similar to the <code>info</code> command but formatted for Argos. Argos is a GNOME Shell extension which displays what has been generated out of a shell command into a GNOME Shell pop-over. This command has been found not to be really used and poorly maintained. It has been decided to be remove in the meantime.</p>"},{"location":"blog/silkaj-v0110-release/#python-311","title":"Python 3.11","text":"<p>This release introduces support for Python v3.11 released on the 24th of October 2022.</p>"},{"location":"blog/silkaj-v0110-release/#repository-restructuration","title":"Repository restructuration","text":"<p>As well as the new CLI\u00a0commands grouping, the runtime and the tests code have been classified into following directories: <code>blockchain</code>, <code>money</code>, and <code>wot</code>. In addition to that, there is now a Python file per command and files for \"helpers\" and tools placed aside.</p>"},{"location":"blog/silkaj-v0110-release/#development-environment","title":"Development Environment","text":"<p>New <code>pre-commit</code> hooks have been introduced: <code>mypy</code>, <code>pylint</code>, <code>autoflake</code>, <code>pre-commit-hooks</code>, and <code>mdformat</code>. Type annotations has been introduced in the whole runtime code. This greatly improves the code quality, specially now that the code is fully typed, and linted. It will be of great help in future developments.</p> <p>The tests have been separated into <code>unit</code> and <code>integration</code> tests directories. This separation makes things clearer. The unit tests are pretty quick to be performed, where the integration tests takes more time since they require network requests. On the CI side, now just one job runs the integration tests in the job generating the coverage. Integration tests were known to fail because of the unstable nature of the network. Now, in case the integration tests fails, it is only necessary to restart one job.</p> <p>The branch workflow changed to a unique <code>main</code> branch which takes over the <code>dev</code> and <code>master</code> branches.</p> <p>The coverage integration into GitLab has been fixed.</p>"},{"location":"blog/silkaj-v0110-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/silkaj-v0110-release/#outlook","title":"Outlook","text":"<p>v0.20.0 is planned to be the next release. It will be fully dedicated to add support for Duniter v2 based on Substrate framework. Duniter v1/BMA support will be dropped from Silkaj v0.2x branch, while v0.1x will still be maintained until we productively switch to Duniter v2. But, no new features will be implemented on v0.1x branch. This development cycle might take some time, so it is expected to get preview releases.</p> <p>v0.20.0 development cycle is planned as follow. The network layer needs to be adapted to use following APIs: Substrate RPC, and Hasura indexer\u2019s using GraphQL. Then, It is planned to migrate current features and commands. Finally, new v2 related features will be implemented.</p> <p>In this development cycle, parallel developments might occur, such as setting up the new website or the configuration support implementation in Silkaj.</p> <p>We are looking forward for a better future with the migration of Duniter on Substrate framework.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/","title":"Call for testing Silkaj v0.11.0rc0","text":"<p>Hey fellow testers and early-adopters!</p> <p>We are pleased to announce Silkaj v0.11.0 release candidate, and we would be happy to receive feedback before releasing it as stable.</p> <p>It is planned to be the latest release with Duniter v1/BMA support and the release to enter Debian 12 Bookworm.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pre-release-installation","title":"Pre-release installation","text":"<p>You can install this pre-release version from PyPI or from a Docker image. To install the Python package, run following command:</p> <p>Install <code>pipx</code> from the installation documentation:</p> <pre><code>sudo apt install pipx\npipx install --pip-args \"\\--pre\" silkaj\n</code></pre> <p>To install and run Silkaj from the container:</p> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0\n</code></pre> <p>Run Silkaj from outside the image:</p> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:v0.11.0rc0 silkaj\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#tests","title":"Tests","text":"<p>Please check v0.11.0 milestone short summary as well as the changelog containing the changes which did happen during this development cycle.</p> <p>Structural changes were made, so please check Silkaj is still working in its entirety. Manual tests help us making sure everything works fine in different cases. Make sure you test it on \u011e1-Test network to avoid a revocation or any money loss to happen.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#pipx-installation","title":"Pipx installation","text":"<p>Test that the newly introduced <code>pipx</code> method installation documentation works fine in your case, with your particular Unix system. Tell us how can the documentation be improved, if a non-obvious step for you is missing or if a necessary package isn't listed for Silkaj to work on your system.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#new-cli-design","title":"New CLI\u202fdesign","text":"<p>Silkaj commands have been reorganized into following groups: <code>blockchain</code>, <code>money</code>, <code>wot</code>. Some commands not related to these contexts have been kept in the top-level group. Tell us if the new CLI design with sub-sub-commands compared to the previous one with all the commands at the top-level instead fits best, is less convenient, is following a more structured logic.</p> <pre><code>Commands:\n about Display program information\n authentication Generate authentication file\n blockchain Blockchain related commands\n checksum Generate checksum out of a passed pubkey or an...\n license Display \u011e1 monetary license\n money Money management related commands\n wot Web-of-Trust related commands\n</code></pre>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#table-generation","title":"Table generation","text":"<p>The underlying table generation library has been changed. Tell us if the tables are displaying content correctly, or if any improvement can be done, or if a regression got introduced.</p>"},{"location":"blog/call-for-testing-silkaj-v0110rc0/#others","title":"Others","text":"<p>Feel free to play and look for hidden bugs and/or UI/UX improvements! We are looking forward for your feedback!</p> <p>The stable release is planned on November 26th 2022, which will be released with a detailed announcement explaining the changes.</p> <p>Silkaj team</p>"},{"location":"blog/v0111/","title":"V0.11.1","text":"<p>Bug fix release, because <code>libnacl</code> brought in a breaking change.</p> <ul> <li>Bump DuniterPy to v1.1.1 duniterpy#206</li> </ul>"},{"location":"blog/v0112/","title":"V0.11.2","text":"<ul> <li>Add support for Python v3.12 and drop support for Python v3.7</li> </ul>"},{"location":"blog/silkaj-v0120-release/","title":"Silkaj v0.12.0 release","text":"<p>I am pleased to announce the stable release of Silkaj version 0.12.0</p> <p>In this article, the most important changes are highlighted. if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v0120-release/#introduction","title":"Introduction","text":"<p>The original plan changed, a difficult choice has been made to work on a second development cycle tied to v1 ecosystem, because v2 ecosystem was not fully ready. It was worth it for Silkaj project\u2019s growth with huge improvements not tied to v1 nor v2 ecosystems. It was difficult to go in a slightly different direction, since all contributors\u2019 energy was directed to v2 ecosystem development. \u011ecli took over the role as the first CLI client on v2 ecosystem. Silkaj made little progress on v2 ecosystem. But, as for v0.11.0, this release also paves the way for implementations based on v2 ecosystem.</p> <p>This release comes with the account storage implementation which greatly improves the authentication and revocation files management. A new documentation website has been set up. <code>money history</code> command features the comma-separated value (CSV) output file format option. The command line interface has seen great improvements such as a usage with colors, a better error output, the shell completion, and a small help option. \u011e1 monetary license have been updated, and DeathReaper is now released as part of Silkaj. Last but not least, Silkaj comes with minor network optimisations and Python 3.13 support.</p> <p>This release is the last planned major release with Duniter v1/BMA support.</p>"},{"location":"blog/silkaj-v0120-release/#account-storage-authentication-and-revocation-files-storage-improvements","title":"Account storage: authentication and revocation files storage improvements","text":"<p>Account storage has been implemented to store authentication and revocation files in a common place organized per account and per currency. Therefore, authentication and revocation files generated by Silkaj would no longer lay anywhere on the operating system. By default, they used to be saved to and read from current working directory. This wrong practice is now behind us. In addition the files are now stored with <code>600</code> permissions, meaning that only the Unix user who created them are allowed to read and edit them.</p> <p>Furthermore, a\u00a0consequent change has been made to restrict the storage to only WIF and EWIF\u00a0authentication file formats defined in the approved RFC#13. It improves the security, by focusing the effort on a single authentication file format for v1 ecosystem. v2 ecosystem might bring in an additional file format, which could bring additional confusions.</p> <p>Therefore, it is no longer possible to authenticate with all the implemented methods. The authentication is now restricted to WIF or EWIF authentication files format stored in the account storage. <code>authentication</code> command the only one still allowing all the implemented authentication methods as input in order to perform the migration. To migrate to this new authentication method stored into the account storage, you have to run follow command:</p> <pre><code>silkaj --account <account_name> authentication <--auth-method>\n</code></pre> <p>Based on this new authentication way, you can run commands using (E)WIF authentication from the account storage, i.e.:</p> <pre><code>silkaj --account <account_name> money balance\n</code></pre> <p>For further details, check out the account storage documentation.</p>"},{"location":"blog/silkaj-v0120-release/#new-documentation-website","title":"New documentation website","text":"<p>Previous website, created in 2019 by Attilax, was based on a solution not maintainable over time. Its technology couldn\u2019t scale up and integrate markdown documentation from the repository. Therefore, its content quickly became outdated. In 2020, an other website solution based on VuePress was suggested by ManUtopiK which uses markdown documentation. This solution wasn\u2019t selected and didn\u2019t went productive mainly because I did not have the full control over it. The fact that VuePress is based on JavaScript technologies is a downside to me.</p> <p></p> <p>I found out about MkDocs and the great Material theme. This documentation software based on Python is widely used in Python community. I decided to go with this solution which ticked all the check-boxes. The initial structure has been set up within the repository. Following integration plugins have been set up: Click command line interface documentation, test coverage, GitLab issue and merge requests links which is useful in the changelog. A blog contains the releases announcements. Continuous deployment has been set up to automatically build and deploy documentation updates to GitLab Pages. Mike, a system which allows to display the documentation for multiple major releases of Silkaj have been set up. A drop-down allows to select the documentation dedicated to a version. This should, at least, be helpful for Silkaj v0.1x and v0.2x which will greatly differ. Finally, a page describes how to contribute to the website.</p>"},{"location":"blog/silkaj-v0120-release/#csv-output-on-money-history-command","title":"CSV output on <code>money history</code> command","text":"<pre><code>silkaj money history <pubkey> --csv-file history.csv\n</code></pre> <p>This command will save the account\u2019s money movements history in the specified file in CSV format (comma-separated value). You can then operate the data with a spreadsheet software. The output looks as follow:</p> <pre><code>Date,Issuers/Recipients,Amounts \u011e1,Amounts UD\u011e1,Reference\n2024-10-24 16:26:55,8ve5XAupWT9NMRbXUnZvQwBCFoq5DQ18bBdjGZciw3wm:Dpf,30.96,2.7992766726943943,Oignons fantastiques merci\n2024-10-24 01:34:28,8jWwwyRZMrRsidfVpsGdQGC5zd8pbRDTHrYDwf2kDcrL:9YE,0.25,0.022603978300180832,Dividende Epicerie\n</code></pre>"},{"location":"blog/silkaj-v0120-release/#command-line-interface","title":"Command line interface","text":""},{"location":"blog/silkaj-v0120-release/#rich-click","title":"Rich-click","text":"<p>The command line interface now has a nicer usage interface and looking with colors (missing below) thanks to <code>rich-click</code>, a Click add-on.</p> <pre><code>silkaj --help\n\n Usage: silkaj [OPTIONS] COMMAND [ARGS]...\n\n\u256d\u2500 Basic options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 --help -h Show this message and exit. \u2502\n\u2502 --version -v Show the version and exit. \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500 Endpoint and currency specification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 --endpoint -ep TEXT Without specifying this option, the default endpoint \u2502\n\u2502 reaches \u011e1 currency on its official endpoint: \u2502\n\u2502 https://g1.duniter.org. --endpoint allows to specify \u2502\n\u2502 a custom endpoint following `<host>:<port>/<path>` \u2502\n\u2502 format. `port` and `path` are optional. In case no \u2502\n\u2502 port is specified, it defaults to 443. NOTE: This \u2502\n\u2502 argument is mutually exclusive with arguments: \u2502\n\u2502 [gtest]. \u2502\n\u2502 --gtest -gt Uses official \u011eTest currency endpoint: \u2502\n\u2502 https://g1-test.duniter.org NOTE: This argument is \u2502\n\u2502 mutually exclusive with arguments: [endpoint]. \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500 Account and authentication specification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 --account -a TEXT Account name used in storage \u2502\n\u2502 `$HOME/.local/share/silkaj/$currency/$account_name` \u2502\n\u2502 for authentication and revocation. \u2502\n\u2502 --password -p TEXT EWIF authentication password. If you use this option, \u2502\n\u2502 prefix the command with a space so the password is \u2502\n\u2502 not saved in your shell history. In case of an \u2502\n\u2502 encrypted file, password input will be prompted. \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 --display -d Display the generated document before sending it \u2502\n\u2502 --dry-run -n By-pass the licence and confirmation. Do not send the \u2502\n\u2502 document, but display it instead \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\u256d\u2500 Commands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 about Display program information \u2502\n\u2502 authentication Generate and store authentication file \u2502\n\u2502 blockchain Blockchain related commands \u2502\n\u2502 checksum Generate checksum out of a passed pubkey or an \u2502\n\u2502 authentication method. Checks if the passed checksum is \u2502\n\u2502 valid. \u2502\n\u2502 license Display \u011e1 monetary license \u2502\n\u2502 money Money management related commands \u2502\n\u2502 wot Web-of-Trust related commands \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n</code></pre> <p>A better error output:</p> <pre><code>silkaj -a test wot revocation verify\n\n Usage: silkaj wot revocation verify [OPTIONS]\n\n Try 'silkaj wot revocation verify -h' for help\n\u256d\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 /home/moul/.local/share/silkaj/g1/test/revocation.txt not found for account \u2502\n\u2502 name: test \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n</code></pre>"},{"location":"blog/silkaj-v0120-release/#shell-completion","title":"Shell completion","text":"<p>This information has been missed, but Click v8.0 comes with an integrated shell completion feature. Therefore, it can be set from Silkaj v0.10.0 onward. To set up the shell completion follow the shell completion documentation.</p>"},{"location":"blog/silkaj-v0120-release/#small-help-option","title":"Small help option","text":"<p>In addition to the <code>--help</code> option, it is now possible to pass the small help option <code>-h</code> to all sub-commands.</p>"},{"location":"blog/silkaj-v0120-release/#renaming-transfer-comment-to-reference","title":"Renaming transfer comment to reference","text":"<p>The free \"comment\" field in Duniter v1\u2019s Transaction document has been extensively used in a slightly wrong manner. Banks use Payment reference term for this field which can be used to refer to a contract number for instance.</p> <p>It has been decided to rename it in order for the users to think about using it the appropriate way. The fields in <code>money transfer</code> and <code>money history</code> user interface has been renamed to \"reference\". The important change here is <code>--comment/-c</code> option from <code>money transfer</code> has been renamed to <code>--reference/-ref</code>.</p>"},{"location":"blog/silkaj-v0120-release/#wot-status-command-displays-precise-expiration-date-of-received-certifications","title":"<code>wot status</code> command displays precise expiration date of received certifications","text":"<p>For better monitoring of our certifications and to maintain our membership, <code>wot status</code> command now displays precise expiration dates of received certifications. Previously they were computed and were very imprecise with three months of inaccuracy!</p> <p>Silkaj v0.11:</p> <pre><code>\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502 received_expire \u2502 received \u2502 sent \u2502 sent_expire \u2502\n\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\n\u2502 December 3, 2024 \u2502 Matograine \u2714 \u2502 vit \u2502 October 1, 2024 \u2502\n\u2502 October 11, 2025 \u2502 HugoTrentesaux \u2714 \u2502 Zheny \u2502 October 26, 2025 \u2502\n\u2502 December 19, 2025 \u2502 BenoitLavenier \u2714 \u2502 HugoTrentesaux \u2502 August 17, 2026 \u2502\n\u2502 December 21, 2025 \u2502 nicoleC \u2714 \u2502 Matograine \u2502 August 17, 2026 \u2502\n\u2502 July 9, 2026 \u2502 vit \u2714 \u2502 \u2502 \u2502\n\u2502 August 20, 2026 \u2502 tuxmain \u2714 \u2502 \u2502 \u2502\n\u2502 August 20, 2026 \u2502 kapis \u2502 \u2502 \u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n</code></pre> <p>Silkaj v0.12:</p> <pre><code>\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2502 received_expire \u2502 received \u2502 sent \u2502 sent_expire \u2502\n\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2502\n\u2502 February 21, 2025 \u2502 Matograine \u2714 \u2502 vit \u2502 October 1, 2024 \u2502\n\u2502 January 8, 2026 \u2502 HugoTrentesaux \u2714 \u2502 Zheny \u2502 October 26, 2025 \u2502\n\u2502 March 21, 2026 \u2502 BenoitLavenier \u2714 \u2502 HugoTrentesaux \u2502 August 17, 2026 \u2502\n\u2502 March 23, 2026 \u2502 nicoleC \u2714 \u2502 Matograine \u2502 August 17, 2026 \u2502\n\u2502 October 16, 2026 \u2502 vit \u2714 \u2502 \u2502 \u2502\n\u2502 November 28, 2026 \u2502 tuxmain \u2714 \u2502 \u2502 \u2502\n\u2502 January 28, 2025 \u2502 kapis \u2718 \u2502 \u2502 \u2502\n\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\n\u2714: Certification written in the blockchain\n\u2718: Pending certification, deadline treatment\n</code></pre> <p>The expiration date of sent certifications are still computed and should not be really taken into account. They were not changed since this is a bit more complex to do with BMA API, and also less important than the received certifications. No additional time should be spent on v1 ecosystem, but should instead go to v2 ecosystem </p>"},{"location":"blog/silkaj-v0120-release/#g1-monetary-license-update","title":"\u011e1 monetary license update","text":"<p>German and Catalan new translations have been added to \u011e1 monetary license. Spanish and Italian translations have been improved. The French copy has been updated to v0.3 which includes rules on how to change the document.</p>"},{"location":"blog/silkaj-v0120-release/#deathreaper-is-now-released-as-part-of-silkaj","title":"DeathReaper is now released as part of Silkaj","text":"<p>DeathReaper used to be maintained on a separated <code>git</code> branch and only distributed via containers. This was made because its main dependency <code>pydiscourse</code> is not packaged in Debian repositories. This could be a reason to make an update of Silkaj Debian package unnecessary harder.</p> <p>A solution has been set up to activate <code>wot exclusions</code> command only once <code>pydiscourse</code> dependency is installed. This way, Debian packaging is still possible without having to package <code>pydiscourse</code>.</p> <p>Therefore, DeathReaper has been merged on <code>main</code> branch. Check out DeathReaper documentation on how to install and use it.</p>"},{"location":"blog/silkaj-v0120-release/#bma-optimisations","title":"BMA optimisations","text":"<p>On BMA API, the Web-of-Trust related requests now have an argument to specify whether we passed a public key or an identity username. Silkaj is specifying this argument which provides faster replies to the queries.</p>"},{"location":"blog/silkaj-v0120-release/#python-versions-support","title":"Python versions support","text":"<p>This release introduces official support for Python v3.12 and v3.13.</p> <p>Pendulum datetime library was lacking maintenance and had no Python v3.13 support. I replaced Pendulum with Arrow. Just before Silkaj release, Pendulum v3.1 has been released with Python 3.13 support. I reverted back to Pendulum usage.</p> <p><code>request_url()</code> has been fixed in DuniterPy v1.2.1 to support Python 3.13.</p> <p>On the other hand, Python v3.7 and v3.8 support have been dropped.</p>"},{"location":"blog/silkaj-v0120-release/#development-environment","title":"Development Environment","text":"<p>Ruff replaces <code>black</code>, <code>autoflake</code>, <code>pylint</code>, <code>isort</code> and <code>pyupgrade</code> pre-commit hooks. The latter is written in Rust and is blazing faster compared to the latter.</p> <p>When publishing a release, the pipeline will automatically create a release page on Silkaj repository.</p>"},{"location":"blog/silkaj-v0120-release/#removals","title":"Removals","text":"<p>With this release being the last one planned with Duniter v1/BMA support, some commands do not make sense anymore with v2 Substrate ecosystem. Therefore <code>blockchain verify</code> has been removed from this release. <code>checksum</code> and <code>blockchain difficulty</code> commands will be removed out of next release.</p>"},{"location":"blog/silkaj-v0120-release/#outlook","title":"Outlook","text":"<p>v0.20.0 is planned to be the next release. It will be focus onto adding support for Duniter v2 based on Substrate framework. Duniter v1/BMA support will be dropped from Silkaj v0.2x branch, while v0.1x will be on maintenance mode until \u011e1 currency switches productively to Duniter v2 ecosystem. No new features will be implemented on v0.1x branch. v0.20 development cycle might take some time, therefore it is expected to get preview releases.</p> <p>The migration to v2 ecosystem is planned as follow: The network layer will be adapted to use following APIs: Substrate RPC, and Subsquid indexer via its Hasura GraphQL API. Then, it is planned to migrate current features and commands. Finally, in a following release new v2 related features will be implemented.</p> <p>We are looking forward for a better experience with \u011e1 currency migration to v2 ecosystem based on Substrate framework and Subsquid indexer.</p> <p>Once the porting to Duniter v2 Substrate reaches an interesting point, a v0.30.0 release is planned to implement a GUI based on Textual framework which run in the terminal, and can also run in a web browser.</p>"},{"location":"blog/silkaj-v020-release/","title":"Silkaj v0.2.0 release","text":"<p>This release introduce the <code>transaction</code> feature, the <code>amount</code> command to check out the balance of a wallet, and the initial authentication support.</p>"},{"location":"blog/silkaj-v020-release/#new-money-management-commands","title":"New money management commands","text":"<ul> <li><code>transaction</code> command with its main options: <code>--amountDU</code>, <code>--amount</code>, <code>--output</code>, <code>--comment</code></li> <li><code>amount</code> command to display account balance</li> </ul>"},{"location":"blog/silkaj-v020-release/#authentication","title":"Authentication","text":"<ul> <li><code>generate_auth_file</code> command to generate seed authentication file</li> <li>authentication methods implementation: scrypt, seed, seed authentication file with <code>--auth-scrypt</code>, <code>--auth-seed</code>, <code>--auth-file</code> options</li> </ul>"},{"location":"blog/silkaj-v020-release/#under-the-hood","title":"Under the hood","text":"<ul> <li>function to post request onto BMA API</li> <li>function to sign document</li> <li>function to check public key format and checksum</li> </ul>"},{"location":"blog/silkaj-v020-release/#others","title":"Others","text":"<ul> <li>In tables, the columns were randomly ordered. The columns in the table are now ordered thanks to <code>OrderedDict</code>.</li> <li>Output information on the drop-down menu with Argos (GNOME Shell extension)</li> </ul>"},{"location":"blog/silkaj-v020-release/#thanks","title":"Thanks","text":"<p>A huge thanks to Tortue who brought a huge contribution to this release. Thanks mmuman.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/","title":"Silkaj v0.3.0 release: Let's send money!","text":"<p>This release comes with user experience enhancements on the <code>transaction</code> command and the authentication in general. A new <code>id</code> command allows to look-up for identities. Efforts were put into improving the installation process.</p>"},{"location":"blog/silkaj-v030-release-lets-send-money/#transactions","title":"Transactions","text":"<p><code>transaction</code> command enhancements:</p> <ul> <li>ask for confirmation: #27, !30.</li> <li>confirmation table containing transaction informations: !38</li> <li>don't prompt <code>scrypt</code> parameters. See <code>Authentication</code> \u00a7 below.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#new-command-id-to-search-for-pubkeyidentity","title":"New command <code>id</code> to search for pubkey/identity","text":"<ul> <li>new command <code>id</code> to search identities with pubkey or id: !29.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#tutorial-to-install-a-python-environment","title":"Tutorial to install a Python environment","text":"<ul> <li>pyenv installation tutorial: #23, !40.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#authentication","title":"Authentication","text":"<ul> <li>new authentication method: WIF. For future paper wallet feature: !45</li> <li>Don't prompt scrypt parameters at authentication. Use default ones: #39, !43</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#builds","title":"Builds","text":"<ul> <li>with Pyinstaller: #5.</li> </ul>"},{"location":"blog/silkaj-v030-release-lets-send-money/#other","title":"Other","text":"<ul> <li>Ability to sort the table of <code>network</code> command: !33, !37.</li> <li>Change license from GNU GPLv3 to AGPLv3.</li> <li>Code formatting with <code>pep8</code>: !31.</li> </ul> <p>Thanks Tortue and jytou.</p>"},{"location":"blog/silkaj-v040-release/","title":"Silkaj v0.4.0 release","text":"<p>A new <code>wot</code> command allows to display received and sent certifictaions of an identity. Additionnal user experience enhancements have been added to the transaction feature. It is now possible to check the balance of multiple public keys and get a sum of the balances.</p>"},{"location":"blog/silkaj-v040-release/#new-wot-command-to-display-received-and-sent-certifications","title":"New <code>wot</code> command to display received and sent certifications","text":"<p>You can now explore the Web-of-Trust by displaying in a table the received and sent certifications of an identity.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block 0-E3B0C44298FC1\u2026\nreceived 23 and sent 27 certifications:\n| received | sent |\n|----------------+------------------|\n| Alfybe | gerard94 |\n| cuckooland | jeanferreira |\n| Loda | elois |\n| jeanferreira | Galuel |\n| BenoitLavenier | smyds |\n| smyds | CaizohanFerreira |\n| gpsqueeek | gpsqueeek |\n| fbuland | inso |\n| gerard94 | vit |\n| SebasC | Thatoo |\n| Thatoo | William |\n| inso | cuckooland |\n| Paulart | greyzlii |\n| vincentux | mathieuBize |\n| greyzlii | cgeek |\n| Mententon | PierreYves |\n| PierreYves | mmu_man |\n| paidge | OlivierAuber |\n| cgeek | paidge |\n| Nicolas | Alfybe |\n| jeangraine | 1000i100 |\n| pafzedog | dig |\n| Zheny | BenoitLavenier |\n| | MystraSam |\n| | jeangraine |\n| | Zheny |\n| | roodinux |\n</code></pre>"},{"location":"blog/silkaj-v040-release/#transaction-command-provides-a-better-ux","title":"Transaction command provides a better UX","text":"<p>The <code>transaction</code> command will beforehand check that the comment and recipient\u2019s public key are in right format before it actually prompt for the authentication.</p>"},{"location":"blog/silkaj-v040-release/#balance-of-multiple-public-keys","title":"Balance of multiple public keys","text":"<p>With the <code>amount</code> command, you can now pass multiple public keys <code>:</code> separated. The balance will be displayed for each of them, and a sum will be displayed at the end.</p> <pre><code>silkaj amount --pubkeys GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\nRequested default node: <g1.duniter.org:443>\nTotal amount of: GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\n----------------------------------------------------------------\nTotal Relative = 206.23 UD g1\nTotal Quantitative = 2064.41 g1\n\nTotal amount of: fyqm24NzN7D2Lr4ssrNMacsctymQ2NzBqH9YUYuxSmy\n----------------------------------------------------------------\nTotal Relative = 89.72 UD g1\nTotal Quantitative = 898.08 g1\n\nTotal amount of: Total\n----------------------------------------------------------------\nTotal Relative = 295.95 UD g1\nTotal Quantitative = 2962.49 g1\n</code></pre>"},{"location":"blog/silkaj-v040-release/#installation","title":"Installation","text":"<ul> <li>Installation documentation</li> </ul>"},{"location":"blog/silkaj-v040-release/#certification-feature","title":"Certification feature","text":"<ul> <li>Crowdfunding</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/","title":"Silkaj v0.5.0 release: Let\u2019s certify!","text":"<p>For the eleventh Libre Currency Meeting (RML), I am pleased to announce Silkaj v0.5.0 release.</p> <p></p> <p>This new release comes with the long awaited certification feature, <code>wot</code> command now displays expiration dates of certifications, a new logo, and the repository migration to GitLab. This release includes 35 new commits done during four months of developments.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#certification-feature","title":"Certification feature","text":"<p>Now, you can certify other identities (send certification document to the network):</p> <pre><code>silkaj cert jytou --auth-scrypt -p g1-test.duniter.org:443\nIn which language would you like to display \u011e1 license [en/fr]? fr\nDo you approve \u011e1 license [yes/no]? yes\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nUsing default values. Scrypt parameters not specified or wrong format\nScrypt parameters used: N: 4096, r: 16, p: 1\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert \u2502 From \u2502 \u2013> \u2502 To \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID \u2502 moul-test \u2502 \u2013> \u2502 jytou \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502 \u2013> \u2502 2pyPsXM8UCB88jP2NRM4rUHxb63qm89JMEWbpoRrhyDK \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this certification? [yes/no]: yes\nCertification successfully sent.\n</code></pre> <p>Certification command will display \u011e1\u2019s license in your web browser or in your terminal within a <code>less</code> in case you are running a headless computer.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#wot-command-now-displays-expiration-dates-of-certifications","title":"<code>wot</code> command now displays expiration dates of certifications","text":"<p>The table listing the received and sent certifications of an identity, now displays the expirations dates of the certifications.</p> <pre><code>silkaj wot moul\nmoul (GfKER\u2026) from block [#0](https://git.duniter.org/clients/python/silkaj/issues/0)-E3B0C44298FC1\u2026\nreceived 24 and sent 27 certifications:\n| received_expire | received | sent | sent_expire |\n|-------------------+----------------+------------------+---------------|\n| 2019-03-09 | cuckooland | cgeek | 2019-03-09 |\n| 2019-03-09 | Paulart | elois | 2019-03-09 |\n| 2019-03-09 | vincentux | mathieuBize | 2019-03-09 |\n| 2019-03-09 | BenoitLavenier | gerard94 | 2019-03-09 |\n| 2019-03-09 | Loda | smyds | 2019-03-09 |\n| 2019-03-09 | smyds | CaizohanFerreira | 2019-03-09 |\n| 2019-03-09 | gpsqueeek | gpsqueeek | 2019-03-09 |\n| 2019-03-09 | fbuland | inso | 2019-03-09 |\n| 2019-03-09 | jeanferreira | vit | 2019-03-09 |\n| 2019-03-09 | gerard94 | Thatoo | 2019-03-09 |\n| 2019-03-09 | SebasC | cuckooland | 2019-03-09 |\n| 2019-03-09 | Thatoo | William | 2019-03-09 |\n| 2019-03-09 | inso | greyzlii | 2019-03-09 |\n| 2019-03-09 | Alfybe | Galuel | 2019-03-09 |\n| 2019-03-12 | greyzlii | jeanferreira | 2019-03-09 |\n| 2019-03-18 | Mententon | PierreYves | 2019-03-09 |\n| 2019-04-02 | PierreYves | mmu_man | 2019-03-09 |\n| 2019-04-03 | paidge | OlivierAuber | 2019-03-13 |\n| 2019-05-24 | cgeek | paidge | 2019-03-13 |\n| 2019-06-10 | Nicolas | Alfybe | 2019-03-19 |\n| 2019-07-04 | jeangraine | 1000i100 | 2019-03-26 |\n| 2019-07-23 | pafzedog | dig | 2019-03-31 |\n| 2019-08-07 | Zheny | BenoitLavenier | 2019-04-22 |\n| 2020-03-17 | HugoTrentesaux | MystraSam | 2019-06-16 |\n| | | jeangraine | 2019-06-22 |\n| | | Zheny | 2019-06-25 |\n| | | roodinux | 2019-07-01 |\n</code></pre>"},{"location":"blog/silkaj-v050-release-lets-certify/#logo","title":"Logo","text":"<p>Silkaj now has a logo thanks to Attilax. You can find it in this repository. I choose the black and white one. Here is a crowdfunding to free the logo.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#repository-migration-to-gitlab","title":"Repository migration to GitLab","text":"<p>I migrated the repository to our GitLab instance and archived the GitHub repository:</p> <ul> <li>https://git.duniter.org/clients/python/silkaj</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#website","title":"Website","text":"<p>Silkaj's website has been published among other websites on our GitLab instance. New revisions will be automatically published thanks to GitLab Pages. Here you can find the repository: https://git.duniter.org/websites/silkaj_website/</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v050-release-lets-certify/#future","title":"Future","text":"<p>You can have a look at the next v0.6.0 milestone to have an idea of what could be included into next Silkaj development cycle.</p>"},{"location":"blog/silkaj-v050-release-lets-certify/#helps","title":"Helps","text":"<p>This whole work has been done voluntarily aside a dept-salary\u2019s paid job. If you like what have been achieve, please contribute, by giving libre units to its only and main developer or to Duniter\u2019s developers to improve our little world.</p>"},{"location":"blog/silkaj-v060-release-lets-install/","title":"Silkaj v0.6.0 release: Let\u2019s install","text":"<p>Six months after the previous release, I am pleased to announce Silkaj v0.6.0 for the twelfth Libre Currency Meeting.</p> <p>This release comes with 124 commits including eased installation procedures, multi-recipients transaction, <code>wot</code> command view improvements, scrypt authentication set by default, network performances, and much more.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#user-installation-eased-via-pypipip","title":"User installation eased via PyPI/pip","text":"<p>Installing Silkaj has been a burning issue: Only Fedora users could install Silkaj with the Pyinstaller binary, since that\u2019s where I was building it. The others, would have had to install a development environment with <code>pyenv</code> and the Python dependencies in order to make it work.</p> <p>Thanks to Cebash\u2019s work. Now, we are able to install Silkaj with <code>pip</code>, the Python package manager, which retrieves the package from Python Package Indexer (PyPI):</p> <pre><code>pip3 install silkaj --user\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#development-environment-with-pipenv","title":"Development environment with Pipenv","text":"<p>We switched from <code>pyenv+pip</code> to Pipenv because Pipenv offers a better development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#transaction","title":"Transaction","text":""},{"location":"blog/silkaj-v060-release-lets-install/#multi-recipients-transaction","title":"Multi-recipients transaction","text":"<p>Thanks to cgeek, Silkaj is the first client, besides Remuniter, able to send multi-recipients transaction. This means, that we will be able to transfer money to several recipients within a single transaction. To do so, we have to pass recipients\u2019 public keys separated with a colon <code>:</code> operator, as follow:</p> <pre><code>silkaj tx --auth-file --amount 2 --gtest --output \\\nDpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC:7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 pubkey\u2019s amount before tx \u2502 15375.33 \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (unit) \u2502 4.0 \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 tx amount (relative) \u2502 0.0104 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 pubkey\u2019s amount after tx \u2502 15371.33 \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (pubkey) \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 from (id) \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey) \u2502 DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id) \u2502 vit \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (pubkey) \u2502 7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 to (id) \u2502 cuckooland \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 comment \u2502 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]: yes\nGenerate Transaction:\n - From: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n - To: DpJse2t7fyH9LC9FTMQHsMGZToXLmVQ8EV2eP47ipHDC\n - To: 7KL2QXXFULDpsQY4UdSr5oEVx6rFE6oxeagRdkCX35bf\n - Amount: 4.0\nTransaction successfully sent.\n</code></pre> <p>Notes:</p> <ul> <li>Each pubkey will receive the same amount of money. The amount per recipients can not be specified yet.</li> <li>The purpose of this feature is to remunerate Duniter developers.</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#display-confirmation-panel","title":"Display confirmation panel","text":"<p>Before the transaction is actually sent, the balance before and after the transaction is displayed in the summary table. Check the example above.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#two-wrappers","title":"Two wrappers","text":"<ul> <li>Multi-recipients transfers and automation</li> <li>Transaction generator written in Shell</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#wot-view-improvements","title":"WoT view improvements","text":"<ul> <li>Display of the certifications stock</li> <li>Membership expiration due to the membership expiration or due the fact that the threshold of minimal number of certifications is about to be crossed by certifications expirations</li> <li>Identity status</li> </ul> <pre><code>moul-test (5B8iM\u2026) from block 167750-0000A51F\u2026\nreceived 8 and sent 15/100 certifications:\n| received_expire | received | sent | sent_expire |\n|-------------------+---------------------+-------------------+---------------|\n| 2018-11-21 | esprit \u2714 | MeluaTest | 2018-11-19 |\n| 2018-12-15 | GAS2000 \u2714 | esprit | 2018-11-21 |\n| 2018-12-19 | matograine-G1Test \u2714 | GAS2000 | 2018-12-10 |\n| 2018-12-20 | scanlegentil \u2714 | guwop | 2018-12-10 |\n| 2019-01-29 | vit \u2714 | matograine-G1Test | 2019-02-04 |\n| 2019-02-07 | Elois \u2714 | Elois | 2019-02-07 |\n| 2019-02-15 | cuckooland \u2714 | Vincentest | 2019-02-07 |\n| 2019-02-16 | piaaf31GT \u2714 | cuckooland | 2019-02-07 |\n| | | vit | 2019-02-07 |\n| | | scanlegentil | 2019-02-07 |\n| | | cgeek | 2019-02-07 |\n| | | isawien45 | 2019-02-07 |\n| | | aguy-dev | 2019-02-07 |\n| | | piaaf31GT | 2019-02-14 |\n| | | kimamila | 2019-02-15 |\n\nMembership expiration due to certification expirations: 2018-12-20\nmember: True\nMembership document expiration: 2018-12-31\nSentry: True\noutdistanced: False\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#scrypt-authentication-by-default","title":"Scrypt authentication by default","text":"<p>Previously, the authentication method had to be specified. Now, when no authentication method is specified, two inputs will be prompted in order to authenticate with the scrypt method. You can still specify other authentication methods, with following options:</p> <pre><code>Authentication:\n for amount, transaction, certification, and generate_auth_file commands\n - Scrypt is the default authentication method with 4096,16,1 as default values\n you can specify others values specifying following parameters: -n <N> -r <r> -p <p>\n - Seed: --auth-seed\n - File: --auth-file [--file=<path file>], './authfile' will be taken if there is no path specified\n - WIF: --auth-wif\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#gtest","title":"\u011etest","text":"<p>A new <code>--gtest</code> option has been added to ease the connection to \u011e1-test currency network for testing purposes. It uses the official node: https://g1-test.duniter.org.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#network-performances","title":"Network performances","text":"<p>With this update, Silkaj is retrieving information only once. Before, data was retrieved every time it was needed. Now, once the information has been fetched, it is kept into the memory and reused.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#python-37-support","title":"Python 3.7 support","text":"<p>Silkaj has been tested with Python 3.7. Results show that there has been no issues. Python 3.7 has been set as the current version in Pipenv development environment.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#new-commands","title":"New commands","text":""},{"location":"blog/silkaj-v060-release-lets-install/#license","title":"License","text":"<p>Originally built for the certification feature, the <code>license</code> command allows the consultation of the \u011e1\u2019s license at any time given.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#about","title":"About","text":"<p>A new command displays information about Silkaj:</p> <pre><code>silkaj about\n @@@@@@@@@@@@@\n @@@ @ @@@\n @@@ @@ @@@@@@ @@. silkaj 0.6.0\n @@ @@@ @@@@@@@@@@@ @@,\n @@ @@@ &@@@@@@@@@@@@@ @@@ Powerfull and lightweight command line client\n @@ @@@ @@@@@@@@@# @@@@ @@(\n @@ @@@@ @@@@@@@@@ @@@ @@ Built in Python for Duniter\u2019s currencies: \u011e1 and \u011e1-Test\n @@ @@@ @@@@@@@@ @ @@@ @@\n @@ @@@ @@@@@@ @@@@ @@ @@ Authors: moul, tortue, jytou, cebash, cgeek\n @@ @@@@ @@@ @@@@@@@ @@ @@\n @@ @@@@* @@@@@@@@@ @# @@ Website: https://silkaj.duniter.org\n @@ @@@@@ @@@@@@@@@@ @ ,@@\n @@ @@@@@ @@@@@@@@@@ @ ,@@ Repository: https://git.duniter.org/clients/python/silkaj\n @@@ @@@@@@@@@@@@ @ @@*\n @@@ @@@@@@@@ @ @@@ License: GNU AGPLv3\n @@@@ @@ @@@,\n @@@@@@@@@@@@@@@\n</code></pre>"},{"location":"blog/silkaj-v060-release-lets-install/#logo","title":"Logo","text":"<p>Silkaj\u2019s logo, designed by Attilax, is now fully funded!</p>"},{"location":"blog/silkaj-v060-release-lets-install/#thanks","title":"Thanks","text":"<p>Special thanks to Moul, Cebash, cgeek, and Attilax.</p> <p>Thanks to vit, Inso, vincentux, and jardin.</p>"},{"location":"blog/silkaj-v060-release-lets-install/#install","title":"Install","text":"<ul> <li>Install documentation</li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#future-development-cycles","title":"Future development cycles","text":"<ul> <li> <p>v0.7.0 will be focused on refactoring Silkaj in order to be ported to DuniterPy usage, a more robust API implementation. This mean sharing a common code with Sakia.</p> </li> <li> <p>v0.8.0 will add new features based on DuniterPy such as new authentication methods as well as being allowed to send the remaining Web-of-Trust documents: identity publication, membership publication and renewal, and revocation.</p> </li> <li> <p>v0.9.0 Let\u2019s see what come to this milestone.</p> </li> </ul>"},{"location":"blog/silkaj-v060-release-lets-install/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievements, please contribute by reporting bugs, contributing to the code or giving Duniter\u2019s developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v061-release/","title":"Silkaj v0.6.1 release","text":"<p>I am pleased to announce Silkaj v0.6.1 release. This release comes with a major bug fix for transactions with big amounts. It also come with the ability to renew certifications.</p>"},{"location":"blog/silkaj-v061-release/#bug-fix-in-intermediaries-transactions","title":"Bug fix in intermediaries transactions","text":"<p>When sending a transaction with a big amount, there is a limit of forty sources per transaction allowed by \u011e1 protocol. In order to reach a big amount of money with only forty sources, the clients proceed beforehand to change operations to merge more money into fewer sources. Since the multi-recipients feature, a regression was introduced, the intermediaries transaction\u2019s recipient were wrong and sent to the recipient of the transaction. This release fixes it!</p>"},{"location":"blog/silkaj-v061-release/#certification-renewal","title":"Certification renewal","text":"<p>Duniter v1.7 now allows to renew certification before their expiration.</p> <p>This protocol modification is now live on the \u011e1-Test currency since December 2018 in order to check that everything is working fine. You can already renew certifications on the \u011e1-Test currency.</p> <p>This protocol modification will be published on the \u011e1 currency when ready.</p> <p>Before processing the certification, Silkaj will check if the certification can be renewed. In the case of \u011e1, you will be able to renew the certification two months after the previous one. And, on the \u011e1-test, after twelve and half a day.</p>"},{"location":"blog/silkaj-v061-release/#tests-on-windows","title":"Tests on Windows","text":"<p>Silkaj have been installed for the first time on the Windows platform via <code>pip</code>. It works! There is still fixes needed in order to have Silkaj to work properly.</p>"},{"location":"blog/silkaj-v061-release/#thanks","title":"Thanks","text":"<p>Thanks to Moul, Galuel, and Bernard.</p>"},{"location":"blog/silkaj-v061-release/#upgrade","title":"Upgrade","text":"<pre><code>pip3 install silkaj --user --upgrade\n</code></pre> <ul> <li>Install with <code>pip</code> documentation for more details.</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/","title":"Silkaj v0.7.0 release: DuniterPy, click, transactions history, Debian, website","text":"<p>Six months after the previous major release, I am pleased to announce the release of Silkaj v0.7.0 for the thirteenth Free Currency Meeting.</p> <p>This release comes with 157 commits, the migration to DuniterPy and Click, the display of transaction history, the packaging into Debian Buster and Ubuntu 19.04, and a new website.</p> <p>Those two migrations bring few new features as the goal was to migrate to better libraries while keeping the same functionalities.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#duniterpy-migration","title":"DuniterPy migration","text":"<p>DuniterPy is a Python library which implements methods to request from and send information to the Duniter nodes. It also has authentication methods to sign documents such as transactions and certifications. DuniterPy was initially written for the Sakia client. Silkaj and Sakia are now sharing the same common code. The migration to DuniterPy was tough, but it was worth it: It will allow the implementation of new features in future versions.</p> <p>There were many challenges: keeping the same functionalities, making Silkaj\u2019s code asynchronous, and replacing the authentication and the network code by the ones implemented in DuniterPy. One struggling issue was that the intermediaries transactions were no longer working, because, the equality method of the transaction output source was not implemented, as they used to be stored in a string and are now stored into an <code>OutputSource</code> object. So, the equality had to be implemented.</p> <p>Check-out DuniterPy versions from v0.50.0 to v0.54.1 to follow the evolution of DuniterPy. These versions were specially made for Silkaj. In the future, following functionalities are planned: sending identity, membership, and revocation documents, the usage of authentication methods implemented in DuniterPy, and the usage of the planned GVA API.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#click-migration","title":"Click migration","text":"<p>Since Debian Buster freeze was going to happen very soon and <code>commandlines</code> library wasn\u2019t packaged into Debian, the migration to Click \u201cCommand Line Interface Creation Kit\u201d had to be done quickly. I decided to migrate to this really nice library, since it is much more maintained, comes with a better code, and is less buggy. Here you can see the new command line interface:</p> <pre><code>Usage: silkaj [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n -h, --help Show this message and exit.\n -v, --version Show the version and exit.\n -p, --peer TEXT Default endpoint will reach \u011e1 currency with\n `https://g1.duniter.org` endpoint. Custom endpoint\n can be specified with `-p` option followed by\n <domain>:<port>\n -gt, --gtest \u011eTest: `https://g1-test.duniter.org` endpoint\n --auth-scrypt, --scrypt Scrypt authentication: default method\n --nrp TEXT Scrypt parameters: defaults N,r,p: \"4096,16,1\"\n -af, --auth-file Authentication file. Defaults to: './authfile'\n--file TEXT Path file specification with '--auth-file'\n [default: authfile]\n --auth-seed, --seed Seed hexadecimal authentication\n --auth-wif, --wif WIF and EWIF authentication methods\n\nCommands:\n about Display program information\n argos Display currency information formatted for Argos or BitBar\n authfile Generate authentication file\n balance Get wallet balance\n blocks Display blocks: default: 0 for current window size\n cert Send certification\n diffi Display the current Proof of Work difficulty level to generate...\n history Display transaction history\n id Find corresponding identity or pubkey from pubkey or identity\n info Display information about currency\n license Display \u011e1 license\n net Display network view\n tx Send transaction\n wot Check received and sent certifications and consult the...\n</code></pre> <p>The command line interface has changed. General parameters (options and arguments) should be placed in between the command and the sub-command. Specific parameters should be placed after the sub-command.</p> <pre><code>silkaj --gtest --auth-file tx --amount 5 --output <pubkey>\n</code></pre> <p>For instance, in previous command <code>--gtest</code> and <code>--auth-file</code> are general parameters, where <code>--amount</code> and <code>--output</code> are specific parameters separated by <code>tx</code> sub-command.</p> <p>You can display general parameters with <code>silkaj --help</code> and specific parameters with <code>silkaj tx --help</code> for instance.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#cli-changes","title":"CLI changes","text":"<ul> <li><code>issuers</code>, <code>amount</code>, and <code>generate_auth_file</code> commands have been respectively renamed to <code>blocks</code>, <code>balance</code>, and <code>authfile</code>.</li> <li>The long sub-commands <code>certification</code>, <code>transaction</code>, <code>network</code>, <code>identities</code> have been removed. Now the small ones have to be used: <code>cert</code>, <code>tx</code>, <code>net</code>, <code>id</code>.</li> <li><code>blocks</code> defaults to <code>0</code> which stands for the current windows size and now has a limit of 5.000 blocks as set by BMA.</li> <li><code>balance</code>: public keys separator does no longer use colons <code>:</code>, it uses spaces instead.</li> <li>Additionally, there are the new smaller authentication options: <code>--scrypt</code>, <code>-af</code>, <code>--seed</code>, <code>--wif</code>, without the <code>--auth</code> prefix.</li> </ul> <p>You might discover other breaking changes. For more details regarding these changes check out this list.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#transaction-history","title":"Transaction history","text":"<p>It is now possible to display the transactions history of a wallet:</p> <pre><code>silkaj history GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP --uids\n\nTransactions history from: moul GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP\nCurrent balance: 17296.86 \u011e1, 1717.66 UD \u011e1 on the 2019-05-12 13:32:30\n+---------------------+------------------------+------------+--------------+-----------------------+\n| Date | Issuers/Recipients | Amounts \u011e1 | Amounts UD\u011e1 | Comment |\n+=====================+========================+============+==============+=======================+\n| 2019-04-23 21:31:27 | CvrMiUhAJpNyX5sdAy | 100.700 | 10 | Silkaj sur Ubuntu c |\n| | | | | est une tres belle |\n| | | | | surprise. Merci ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-22 18:59:34 | HugoTrentesaux - | 100.700 | 10 | Merci pour Duniter |\n| | 55oM6F9ZE2MGi | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 14:35:15 | ArthurLutz - | 200 | 19.861 | pour les paquets |\n| | 4C4jsvxmFQBoH | | | yunohost ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 10:40:11 | SonqoZEfZXHDBxi4Kx | 30.210 | 3 | [G1SMS] VIREMENT 300 |\n| | | | | LOVE (30.21 G1) |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-15 08:04:58 | fbuland - | 200 | 19.861 | merci resolution bug |\n| | 4bD7J3uA5pH2N | | | |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-13 16:37:20 | Vivakvo - | 100.700 | 10 | Merci pour Duniter |\n| | 4wUdA1dx1NCZU | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-12 08:59:04 | C4pUj26pVgPVPLEZ96 | 50 | 4.965 | Bravo pour le bug |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 16:48:04 | 73ArdqtsQScypV35H4 | 100.700 | 10 | Merci pour Duniter |\n| | | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:58:06 | Lucas - HY2nJUyxpzyrw | 100.700 | 10 | Merci pour Duniter |\n| | | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 15:10:25 | BenoitLavenier - | 100.700 | 10 | Merci pour Duniter |\n| | 38MEAZN68Pz1D | | | v1.7.16 ! |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-08 14:11:00 | 4sfQWXBBy811CCDV6J | 100.700 | 10 | 1.7.16 |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 22:59:00 | elois - D9D2zaJoWYWve | 100 | 9.930 | merci pour le debug |\n| | | | | de duniter et du |\n| | | | | process de release |\n| | | | | aussi |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 21:51:41 | Matograine - | 100.700 | 10 | V1.7.16 |\n| | CmFKubyqbmJWb | | | |\n+---------------------+------------------------+------------+--------------+-----------------------+\n| 2019-04-07 01:18:44 | cgeek - 2ny7YAdmzReQx | 1007 | 100 | Duniter v1.7.16 |\n+---------------------+------------------------+------------+--------------+-----------------------+\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#debian-and-ubuntu-package","title":"Debian and Ubuntu package","text":"<p>Silkaj v0.6.5 was packaged for Debian Buster v10, which is planned te be released on July 6th 2019. This package greatly benefits all Debian-based distributions. Moreover, Silkaj was also added into Ubuntu 19.04 repository, which was published on March 2019. For more details check-out where Silkaj was included into the Debian-based distributions. Silkaj v0.6.5 now comes with Click migration, auto-completion, and bug fixes, however it does not include DuniterPy migration and v0.7.0 features.</p> <p>You can install Silkaj with following command:</p> <pre><code>sudo apt install silkaj\n</code></pre> <p>This work have been made possible thanks to jonas, a Debian developer.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#proof-of-work-difficulty-level","title":"Proof-of-Work difficulty level","text":"<p>Since we are using DuniterPy which includes WebSocket management, this latter can be used to improve the network connection. Previously, Silkaj was sending queries every five seconds to check if a new block was added to the blockchain. Now, Silkaj gets a notification every time a new block is appended to the blockchain. This improvement dramatically reduces traffic network.</p> <p>To better monitor the network, the header was improved and now displays current block\u2019s number and its date of generation:</p> <pre><code>Current block: n\u00b0219981, generated on the 2019-05-12 14:36:35\nGeneration of next block n\u00b0219982 possible by at least 31/44 members\nCommon Proof-of-Work difficulty level: 89, hash starting with `00000[0-6]*`\n</code></pre>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#new-website","title":"New website","text":"<p>At the beginning of the project, a simple website was made. Since then, Silkaj evolved and have brought new features which should be reflected on the website.</p> <p>More content was added to the website, which now has three pages: a main one, one for the features and the other one for the installation.</p> <p>Attilax worked to give the website a new black style, to make it looks like a terminal. He also translated it in French which makes the website available in two languages.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#thanks","title":"Thanks","text":"<p>Attilax, Bernard, cebash, jonas, matograine, vit</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#install-and-upgrade","title":"Install and upgrade","text":"<ul> <li>Install and upgrade documentation</li> </ul>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#future-development-cycles","title":"Future development cycles","text":"<p>Future releases will add new features based on DuniterPy such as new authentication methods as well as being able to send WoT documents: identity publication, membership publication and renewal, and revocation. It is also planned to use features brought by Click usage, to set-up a CI/CD pipeline, and locking the code with tests.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#contribute","title":"Contribute","text":"<p>If you are pleased with the achievement, please contribute by reporting bugs, contributing to the code or giving to Duniter developers libre units to improve our little world.</p>"},{"location":"blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/#share-on-social-networks","title":"Share on social networks","text":"<ul> <li>Mastodon</li> </ul>"},{"location":"blog/v071/","title":"V0.7.1","text":"<ul> <li>Bug fix transaction generation</li> </ul>"},{"location":"blog/v072/","title":"V0.7.2","text":"<ul> <li>Fix result of the multiplication of the amount passed as float for the transaction command</li> </ul>"},{"location":"blog/v073/","title":"V0.7.3","text":"<ul> <li>#239: Bug fix release for broken successives transactions due to wrongly calculated pending inputs:<ul> <li>remove already used inputs: restore previous behaviour which haven\u2019t been kept the same during the migration</li> <li><code>enumerate()</code> wrongly moved to the non appropriate <code>for</code> loop</li> </ul> </li> </ul>"},{"location":"blog/v074/","title":"V0.7.4","text":"<ul> <li>#273: Fix broken PubSec authfile importation regex</li> </ul> <p>Thanks to matograine for this bugfix and the release!</p>"},{"location":"blog/v075/","title":"V0.7.5","text":"<ul> <li>#276: Publish on PyPI with the previous method: <code>setup.py</code>, <code>wheel</code>, and <code>twine</code>.</li> <li><code>silkaj</code> binary does not get installed to <code>$HOME/.local/bin</code> via Poetry</li> </ul>"},{"location":"blog/v076/","title":"V0.7.6","text":"<ul> <li>Update DuniterPy to v0.55.1 in order to have the PubSec regex fixed</li> </ul>"},{"location":"blog/silkaj-v080-release/","title":"Silkaj v0.8.0 release","text":""},{"location":"blog/silkaj-v080-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.8.0. A new team member joined us at the beginning of this development cycle: Matograine. We highly appreciate his commitment, his improvements of the transaction code and his work on the checksum. This release comes along with a number of new features and improvements. The most important of them are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p> <p>Version 0.8.0 was done in 145 commits, and features seven major improvements:</p> <ol> <li><code>membership</code>: We developed a command to allow users to send membership documents.</li> <li>Identity choice: We can now manually choose the desired identity among other identities.</li> <li>Multi-recipients transactions: Users can simultaneously send a different amount of \u011e1 to different recipients.</li> <li>Display improvements for <code>tx</code> and <code>balance</code>: For a better overview, we modified the <code>tx</code> table and added a <code>balance</code> table.</li> <li>Public key checksum display and verification: For security purposes, Silkaj displays and verifies the checksum.</li> <li><code>verify</code>: We set up a command to check whether a block is valid.</li> <li>Dev Env: We set up a solid development environment for Poetry, CI/CD, and Tests.</li> </ol> <ul> <li>A. Poetry: We migrated to Poetry.</li> <li>B. CI/CD: We set up a pipeline to run automatic jobs.</li> <li>C. Tests: We started to write tests.</li> </ul>"},{"location":"blog/silkaj-v080-release/#1-membership","title":"1. Membership","text":"<p>After the transaction and the certification commands, the much awaited <code>membership</code> command is now available.</p> <p>Users can send their first membership request to be a certified member of the \u011e1 community. As certified members have to renew their membership each year, this command allows to send the renewal application in question. It displays the expiration date of the current membership and indicates the identification blockstamp of the user. In the event a user forgets that they have already sent a membership request, a pop up displays if there is a pending membership request in the mempool.</p> <pre><code>silkaj membership\nPlease enter your Scrypt Salt (Secret identifier):\nPlease enter your Scrypt password (masked):\nYou will be asked to approve \u011e1 license. Would you like to display it? [y/N]: n\nDo you approve \u011e1 license? [y/N]: y\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership \u2502 in 3 weeks \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Number of pending membership(s) in the mempool \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending membership documents will expire \u2502 in 1 year \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID) \u2502 moul \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key \u2502 GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP:J1k \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity \u2502 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B93\u2026 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published \u2502 March 8, 2017 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership \u2502 in 1 year \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 months \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending a membership document for this identity? [y/N]:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#2-identity-choice","title":"2. Identity choice","text":"<p>When using the commands <code>wot</code>, <code>cert</code>, and <code>membership</code>, Silkaj used to select the first identity on the list. As this can lead to fishing, we added a new feature to pick the identity of your choice. Now, you can use the <code>uid</code> and the <code>pubkey</code> to certify an identity and study its status in the Web of Trust. Please note that identities can have the same user identifier and the same public key.</p> <pre><code>silkaj -gt wot moul\n| id | uid | pubkey | timestamp |\n|------+-----------+--------------------------------------------------+-----------------------|\n| 00 | moul1 | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s | 614118-00000EE8DFC0F\u2026 |\n| 01 | moul2 | WULdRTxspGdJzrs4vpZsWLGWsu37DjqoHyhGDFr5amh:45s | 614227-00000ED689406\u2026 |\n| 10 | moul1 | 3rp7ahDGeXqffBQTnENiXEFXYS7BRjYmS33NbgfCuDc8:DFQ | 614227-00000ED689406\u2026 |\n| 20 | moul-test | 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK | 167750-0000A51FF952B\u2026 |\nWhich identity would you like to select (id)?:\n</code></pre>"},{"location":"blog/silkaj-v080-release/#3-transactions-multi-recipients-different-amounts-of-g1","title":"3. Transactions: multi-recipients & different amounts of \u011e1","text":"<p>Thanks to Matograine, users can now send different amounts of \u011e1 to multiple recipients in the same document. Working on this feature offered us the opportunity to rethink and clean up the CLI and the code related to the <code>tx</code> command. However, further efforts are required to build a more solid code base foundation. </p> <p>v0.8.0 comes with three breaking changes and four small options:</p> <ul> <li><code>--output</code> was renamed to <code>--recipient</code></li> <li>recipients public key are splits with the option <code>--recipient</code> instead of a colon character.</li> <li>The public key's checksum separator <code>!</code> is being replaced by the colon.</li> <li>small options have been introduced:<ul> <li><code>-a/--amount</code></li> <li><code>-d/--amountUD</code></li> <li><code>-r/--recipient</code></li> <li><code>-c/--comment</code> </li> </ul> </li> </ul> <p>The follow examples illustrates the change operated on the CLI. With the previous version of Silkaj, the following procedure was operated to send one unit to <code>pubkey1</code> and <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --output <pubkey>1!<checksum1>:<pubkey2>!<checksum2>\n</code></pre> <p>With the current version of Silkaj, the following procedures are operated to send one unit to <code>pubkey1</code> and two units to <code>pubkey2</code>:</p> <pre><code>silkaj tx --amount 1 --recipient <pubkey1>:<checksum1> --amount 2 --recipient <pubkey2>:<checksum2>\n</code></pre> <p>With small options:</p> <pre><code>silkaj tx -a 1 -r <pubkey1>:<checksum1> -a 2 -r <pubkey2>:<checksum2>\n</code></pre> <p>In the case one amount is passed, the same amount will be send to the passed recipients. The <code>--allSources</code> option is only working with one recipient.</p>"},{"location":"blog/silkaj-v080-release/#4-display-improvements-for-tx-and-balance","title":"4. Display improvements for <code>tx</code> and <code>balance</code>","text":"<p>We merged the relative and absolute amounts into one cell. This applies to the cells: initial balance, total transaction amount, balance after the transaction, and individual amounts.</p> <p>To send a different amount of \u011e1 to multi-recipient proceed following:</p> <pre><code>silkaj tx -d 1 -d 2 \\\n-r CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7 \\\n-r d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \\\n-c \"Test different amounts to two different recipients\"\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Initial balance (unit|relative) \u2502 2207757.83 \u011eTest | 145.63 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total transaction amount (unit|relative) \u2502 45480.0 \u011eTest | 3.0 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Balance after transaction (unit|relative) \u2502 2162277.83 \u011eTest | 142.63 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (pubkey) \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 From (id) \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey) \u2502 CrznBiyq8G4RVUprH9jHmAw1n1iuzw8y9FdJbrESnaX7:8Sj \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id) \u2502 Elois \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative) \u2502 15160.0 \u011eTest | 1.0 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (pubkey) \u2502 d88fPFbDdJXJANHH7hedFMaRyGcnVZj9c5cDaE76LRN:FVm \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 To (id) \u2502 matograine-G1Test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Amount (unit|relative) \u2502 30320.0 \u011eTest | 2.0 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Comment | Test different amounts to two different recipients \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nDo you confirm sending this transaction? [yes/no]:\n</code></pre> <p>The balance of a given public key is now displayed in a table. Bellow you can find an example of such a display.</p> <pre><code>silkaj balance 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey \u2502 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8:4VT \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Blockchain (unit|relative) \u2502 94322.48 \u011e1 | 9220.18 UD \u011e1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pending transaction (unit|relative) \u2502 100.0 \u011e1 | 9.78 UD \u011e1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative) \u2502 94422.48 \u011e1 | 9229.96 UD \u011e1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N \u2502 13.35 x M/N \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v080-release/#5-pubic-key-checksum-display-verification-and-checksum-command","title":"5. Pubic key checksum display, verification, and checksum command","text":"<p>For security purposes, Silkaj now displays the checksum associated with the public key, and verifies it when passed to a command. If a public key or an authentication method is passed to the newly introduced <code>checksum</code> command, the later generates the associated checksum to the public key. if a public key and a checksum are passed, Silkaj displays whether the checksum is valid or not.</p>"},{"location":"blog/silkaj-v080-release/#6-verify","title":"6. <code>verify</code>","text":"<p>We introduced the new <code>verify</code> command to check whether the signatures of the blocks of the blockchain are valid since there was a bug in the cryptography library of Duniter. Cf Forum topic and Duniter ticket</p> <p>To verify blocks proceed following:</p> <pre><code>silkaj verify\nProcessing blocks verification [####################################] 100%\nWithin 0-342803 range, blocks with a wrong signature: 15144 31202 85448 87566 90830 109327 189835 199172 221274 253582\n</code></pre>"},{"location":"blog/silkaj-v080-release/#7-development-environment","title":"7. Development Environment","text":""},{"location":"blog/silkaj-v080-release/#a-poetry","title":"A. Poetry","text":"<p>We migrated the packaging and the dependency management tool from Pipenv to Poetry since Pipenv has been quite problematic recently and is also more suitable for larger projects.</p> <p>In comparison, Poetry is a well thought and stable tool which has been released by the end of 2019. In the former development environment, we had to define the dependencies twice in the <code>requirements.txt</code>, <code>setup.{py,cfg}</code>, <code>Pipenv</code> files. Poetry, however, supports the <code>pyproject.toml</code> file standardized by the Python project and is able to define the dependencies at once.</p> <p>If you would like to install Silkaj for development purposes, please follow this tutorial. You may also interested by checking the newly introduced contribution process documentation <code>CONTRIBUTING.md</code>.</p>"},{"location":"blog/silkaj-v080-release/#b-automatic-container-generation","title":"B. Automatic container generation","text":"<p>We set up an automated pipeline to generate containers for all supported Python versions: 3.5, 3.6, 3.7, and 3.8. These containers are based on official Python containers, which use Debian Buster Slim. On top of that, Poetry, <code>libsodium</code>, and other development tools are installed to continually check and test Silkaj in its pipeline. Since DuniterPy uses the same containers, it also profits from this automated container generation.</p>"},{"location":"blog/silkaj-v080-release/#c-cicd-pipelines","title":"C. CI/CD pipelines","text":"<p>Based on the containers set out above, a continuous integration and delivery pipeline has been set up to automatically run:</p> <ul> <li>Checks: format, build,</li> <li>Tests on all supported Python versions,</li> <li>Release publication automation on PyPI and PyPI test.</li> </ul> <p></p>"},{"location":"blog/silkaj-v080-release/#7-tests","title":"7. Tests","text":"<p>We started to write tests to ensure that all features of Silkaj are still functional when changing the code. However, in order to have all Silkaj commands fully tested, further efforts are required. During this development cycle, the test coverage raised from 37% to 69% and Silkaj is now covered by more than hundred tests.</p>"},{"location":"blog/silkaj-v080-release/#outlook","title":"Outlook","text":"<p>Silkaj is compatible with a range of Python versions. Currently, it can be used with Python 3.5, 3.6, 3.7, and 3.8. v0.8.x will be the last releases with Python 3.5 support. In v0.9.0, we will support Python 3.6, 3.7, 3.8, and 3.9.</p> <p>Since there is a deadline for packaging Silkaj and DuniterPy into Debian Bullseye (v11), we are putting all our efforts into the upcoming packaging. As for the coming version, DeathReaper, the <code>excluded</code> command, for which the crowdfunding has been completed, and the newly revamped <code>info</code> command will be stabilized and automatic tests will be written.</p> <p>ManUtopiK revamped Silkaj website in which you can look up all the presentations, the major features and documentations related to Silkaj. We are working on integrating the website into the project.</p> <p>For further details check out the presentations of the RML14. The oral presentations are in French and the slides in English:</p> <ul> <li>Moul's: How to contribute to Silkaj</li> <li>Matograine's: Envoyer des transactions exotiques avec Silkaj</li> </ul>"},{"location":"blog/silkaj-v080-release/#thanks","title":"Thanks","text":"<p>moul, matograine</p>"},{"location":"blog/v081/","title":"V0.8.1","text":"<ul> <li>#358, !152: Update DuniterPy to v0.58.1, to support <code>libnacl</code> v1.7.2</li> </ul> <p>Thanks matograine for your first release \\o/</p>"},{"location":"blog/v090rc/","title":"V0.9.0rc","text":""},{"location":"blog/v090rc/#call-for-testing-silkaj-v090rc","title":"Call for testing Silkaj v0.9.0rc","text":"<p>Hello everyone!</p> <p>We are pleased to publish a release candidate of Silkaj v0.9.0, and we would be happy to receive feedback before releasing it as a stable version.</p> <p>To install this pre-release version from PyPI, use this command:</p> <pre><code>pip3 install silkaj --user --upgrade --pre\n</code></pre> <p>Please test it globally, and check the changelog which contains the changes which happen during this development cycle. Pay a special attention to the transaction part where a part of the algorithm changed. There are new options on following commands:</p> <pre><code>silkaj history --full-pubkey\nsilkaj --dry-run cert\nsilkaj --dry-run/--display membership\n</code></pre> <p>Dry-run and display options are defined as general options, and only defined for this three cases for this release.</p>"},{"location":"blog/v090rc/#tests","title":"Tests","text":"<p>Manual tests help us making sure everything works fine for different cases. Here are some tests we think are necessary. Make sure you test on \u011e1-Test network to avoid any loss of money.</p>"},{"location":"blog/v090rc/#tx","title":"<code>tx</code>","text":"<ul> <li>send a TX to a unique recipient</li> <li>send a TX to multiple recipients<ul> <li>with one amount</li> <li>with multiple amounts</li> </ul> </li> <li>send a TX to 92 recipients (can be 92 times the same)</li> <li>send a TX to 93 recipients (should fail)</li> </ul>"},{"location":"blog/v090rc/#membership","title":"<code>membership</code>","text":"<ul> <li>renew membership with <code>--dry-run</code> global option</li> <li>renew membership with <code>--display</code> global option</li> <li>renew membership without these two options</li> </ul>"},{"location":"blog/v090rc/#cert","title":"<code>cert</code>","text":"<ul> <li>send a certification with <code>--display</code> global option</li> <li>cert all identities you can on GTest network (thanks for keeping it alive ;-) )</li> <li>cert pubkey <code>4KEA63RCFF7AXUePPg5Q7JX9RtzXjywai1iKmE7LcoEC:DRz</code> on \u011e1-Test -> you should be suggested two identities</li> <li>cert identity <code>ggg_ggg_2</code> on \u011e1-Test -> you should NOT be proposed many identities</li> </ul>"},{"location":"blog/v090rc/#history","title":"<code>history</code>","text":"<ul> <li>check you history</li> <li>check you history and display userIDs</li> <li>check you history and display pubkeys in full-length</li> <li>check you history and display userIDs and pubkeys in full-length</li> </ul>"},{"location":"blog/v090rc/#wot","title":"<code>wot</code>","text":"<ul> <li>check your WoT infos are correct with <code>wot</code> command</li> </ul>"},{"location":"blog/v090rc/#checksum","title":"<code>checksum</code>","text":"<ul> <li>use <code>checksum</code> command to compute a checksum for one of your public keys.</li> <li>verify it with Silkaj</li> <li>verify it with Cesium</li> <li>try to change a character in the public key (with the checksum), then verify that it is wrong.</li> </ul>"},{"location":"blog/v090rc/#auth","title":"auth","text":"<ul> <li>create an authfile for a \u011e1-Test account</li> <li>send txs or certs using the authfile</li> </ul>"},{"location":"blog/v090rc/#other","title":"Other","text":"<p>Feel free to play!</p> <p>The release is planned for the 17th April of 2021, which will contain a detailed announcement of the changes and the new features.</p> <p>Silkaj team</p>"},{"location":"blog/silkaj-v090-release/","title":"Silkaj v0.9.0 release","text":""},{"location":"blog/silkaj-v090-release/#introduction","title":"Introduction","text":"<p>The Silkaj team is pleased to announce the release of Silkaj 0.9.0. The most important changes are highlighted in this article, if you are looking for a comprehensive list of changes, check out the changelog.</p>"},{"location":"blog/silkaj-v090-release/#transaction","title":"Transaction","text":"<p>Silkaj is now properly handling the transaction document size limit. The 100 lines limit length of the transaction document in the compact format is now properly fulfilled by computing the length of the generated document.</p> <p>An important bug has been fixed regarding intermediaries transactions: When spending lots of sources (i.e. huge amounts from member wallets), many useless intermediaries transactions were sent and displayed. Intermediaries transactions are now correctly handled.</p> <p>Unit tests have been written on the <code>tx</code> command, which comforts us into developing new features.</p>"},{"location":"blog/silkaj-v090-release/#refactored-idlookup-command","title":"Refactored <code>id</code>/<code>lookup</code> command","text":"<p>The <code>id</code> command has been completely refactored. It now offers comprehensive results when looking for an identity by specifying a user identifier or a public key. Now the non-member user identifier are displayed. The command now uses same algorithm as <code>choose_identity()</code> which relies exclusively on <code>/wot/lookup</code> BMA's path. The command has been renamed to <code>lookup</code> to represent more closely what it does. This command renaming will also allow to introduce the future <code>identity</code> command.</p> <pre><code>silkaj lookup titi\nPublic keys or user id found matching 'titi':\n\n\u2192 4qJZFRfArLaUMEXDhsd69unsKynEFNLFazAVij4HNsBa:F4z \u2194 laetitia97421\n\u2192 4LCdTC9QsmqbFSHAhyaqGdDCVPr8Ywu2DZ8hDCzkdx4n:8ta \u2194 Amandinelaetitia\n\u2192 CehfxBHrowP6tXouR73GS52QhGAoNMtabooKbCvT7f3j:6cG \u2194 Laetiti974\n\u2192 FtZdA1HzHcDG6utoEgg6R5jjXfEne2ftS2UzvXajKurp:6Sm \u2194 Laetitia\n\u2192 EUn8uLJxgc3fVXJ1fBA74re4iD4Ws8Nk2xHytX1wLMfK:AQ2 \u2194 LaetitiaCarivenc\n\u2192 HqHZt9J1U7MwC3RF1bSjPgxACsTypfNjUThYFMZZfK6X:Dk1 \u2194 LaetitiaHOFF\n\u2192 5Vcm1zkHKoAMo9yy7Lk2HDX2Yn54agavtEUdrcFNmqkP:8mU \u2194 laetitiajanot\n\u2192 BfncGdTeq8qvhPZnBaM8T76SHM9xfx78ASRNZtGp64rZ:7tP \u2194 titi\n\u2192 BWKuSHYojjwzAXZZxSFTf5XVWneUMZqoWGUJEfWaFRL9:21F \u2194 titi43\n\u2192 49nWdTQqDT8qpazzPeP6NH92NwppG7YEh6PFYC2VecNA:Ba6 \u2194 titix\n</code></pre>"},{"location":"blog/silkaj-v090-release/#new-full-pubkey-option-on-the-history-command","title":"New <code>--full-pubkey</code> option on the <code>history</code> command","text":"<p>The <code>history</code> command adds a new option to display the whole public keys <code>--full-pubkey</code>:</p> <pre><code>silkaj -gt history 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH --full-pubkey\n\nTransactions history from: moul-test 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK\nCurrent balance: 9012407.83 \u011eTest, 161.34 UD \u011eTest on the 2021-04-09 15:16:42\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| Date | Issuers/Recipients | Amounts \u011eTest | Amounts UD\u011eTest | Comment |\n+=====================+==============================+===============+=================+=============================+\n| 2021-03-29 20:42:33 | | | | Change operation |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -193320 | -3.460 | |\n| | DjqoHyhGDFr5amh:45s | | | |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n| 2021-03-22 20:51:05 | WULdRTxspGdJzrs4vpZsWLGWsu37 | -338310 | -6.060 | |\n| | DjqoHyhGDFr5amh:45s | | | |\n+---------------------+------------------------------+---------------+-----------------+-----------------------------+\n</code></pre>"},{"location":"blog/silkaj-v090-release/#balance-command-is-now-displaying-corresponding-member-identity-user-identifier","title":"<code>balance</code> command is now displaying corresponding member identity user identifier","text":"<pre><code>silkaj -gt balance 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Balance of pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User identifier \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total amount (unit|relative) \u2502 8634537.83 \u011eTest | 162.21 UD \u011eTest \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Total relative to M/N \u2502 1.05 x M/N \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n</code></pre>"},{"location":"blog/silkaj-v090-release/#display-option-on-cert-membership-commands","title":"Display option on <code>cert</code>, <code>membership</code> commands","text":"<p>This general option allows to display the generated document aside of the confirmation prompt before sending the document. It can be used for debugging, safety, or curiosity purposes. This option has only been implemented on the <code>cert</code> and the <code>membership</code> commands for now. The option should be available in next releases for the three others send-documents commands.</p> <pre><code>silkaj --gtest --auth-file --display cert KapisTest\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Cert \u2502 Issuer \u2502 \u2013> \u2502 Recipient: Published: #block-hash date \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ID \u2502 moul-test \u2502 \u2013> \u2502 KapisTest: [#673782](https://git.duniter.org/clients/python/silkaj/issues/673782)-00001519\u2026 2020-12-11 11:37:42 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Pubkey \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502 \u2013> \u2502 HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c:GZp \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Valid \u2502 2021-04-09 \u2502 \u2014> \u2502 2021-09-02 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Certification\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nIdtyIssuer: HGuKgbo7s8wjKF8gQwpdPQGG8mLW9vNMq1ZFxMEZgD8c\nIdtyUniqueID: KapisTest\nIdtyTimestamp: 673782-00001519FCBA6DDEFEE65B31ECD145B065F4404F870AAB272419EFA62BF5A677\nIdtySignature: 1KX/Iuv7FuXsxhTwYU/RIO9L0F3I+lGvBLYXRexIoCz35H+yb2Wf3nEXA2XXCPl5aVxcxvreOW2HF43r7ezcDA==\nCertTimestamp: 735968-00003F6B07F64573F6FABC510C1CEABEE8358426176BE7F190827A856873C517\n\nDo you confirm sending this certification? [y/N]: y\nCertification successfully sent.\n</code></pre> <pre><code>silkaj --gtest --auth-file --display membership\n\u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 Expiration date of current membership \u2502 in 2 months \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 User Identifier (UID) \u2502 moul-test \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Public Key \u2502 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH:baK \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Block Identity \u2502 167750-0000A51FF952B76AAA594A46CA0C8156A56988\u2026 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Identity published \u2502 April 20, 2018 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership \u2502 in 2 months \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Expiration date of new membership from the mempool \u2502 in 2 weeks \u2502\n\u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\nVersion: 10\nType: Membership\nCurrency: g1-test\nIssuer: 5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\nBlock: 735967-00028030F3E2AB38D7EACA997065F58E16F0497EE86BFA23B2DA222EEE80C23C\nMembership: IN\nUserID: moul-test\nCertTS: 167750-0000A51FF952B76AAA594A46CA0C8156A56988D2B2B57BE18ECB4F3CFC25CEC2\nphOKWXHxfPBgkTE+Mui8Fiqb7QSlhPrKalDOzhyUwwLySV/EE2Z/b+vZNfByTn7sFYaHWPck5dsbzJQ6M+fBBA==\n\nDo you confirm sending this membership document for this identity? [y/N]: y\nMembership successfully sent\n</code></pre>"},{"location":"blog/silkaj-v090-release/#dry-run-option-is-becoming-a-generic-option","title":"Dry Run option is becoming a generic option","text":"<p>Before:</p> <pre><code>silkaj membership --dry-run\n</code></pre> <p>Now:</p> <pre><code>silkaj --dry-run membership\n</code></pre> <p>Note: This option is currently only implemented in the <code>membership</code> command.</p> <p>Note: The difference between the <code>--display</code> and the <code>--dry-run</code> options are that the dry run option by-passes the license, and the confirmation approvals. For safety reasons, the <code>--dry-run</code> option doesn't allow, at the end, to send the document on the network. On contrary, the <code>--display</code> option allows to send the document to the network.</p>"},{"location":"blog/silkaj-v090-release/#python-support","title":"Python support","text":"<p>Support for Python 3.5 has been dropped and support for Python 3.9 has been added.</p>"},{"location":"blog/silkaj-v090-release/#silkaj-v081-in-debian-bullseye","title":"Silkaj v0.8.1 in Debian Bullseye","text":"<p>If you are a user of Debian or its derivatives, you will be able to find Silkaj v0.8.1 available into Debian Bullseye (v11) which is about to be released. Silkaj package has been updated from v0.6.5 to v0.8.1 and DuniterPy v0.60.1 entered Debian repository for the first time.</p>"},{"location":"blog/silkaj-v090-release/#outlook","title":"Outlook","text":"<p>In the next developments, we are planning to work on DeathReaper, the implementations of the <code>revoke</code> and the <code>identity</code> commands. The removal of the asynchronous property, the migration from <code>tabulate</code> to <code>Texttable</code>, and the migration from BMA to GVA.</p>"},{"location":"blog/silkaj-v090-release/#thanks","title":"Thanks","text":"<p>matograine, moul, jonas, atrax</p>"},{"location":"contributing/","title":"Contributing","text":""},{"location":"contributing/#goals","title":"Goals","text":"<p>Part of the Duniter project running the \u011e1 currency, Silkaj project is aiming at creating a generic tool to manage the main account and wallets, to administrate and to monitor the currency.</p>"},{"location":"contributing/#install-the-development-environment","title":"Install the development environment","text":"<p>We are using Poetry as a development environment solution. Start by installing Poetry. This will install a sandboxed Python environment. Dependencies will be installed in it in order to have Silkaj running and to have pre-installed developement tools.</p>"},{"location":"contributing/#workflow","title":"Workflow","text":"<ul> <li>We use branches for merge requests</li> <li>We prefer fast-forward and rebase method than having merge commits created. This in order to have a clean history.</li> </ul>"},{"location":"contributing/#branches","title":"Branches","text":"<ul> <li><code>main</code>: development and stable branch</li> <li>maintainance branches, to maintain a stable version while developing future version with breaking changes. For instance: <code>release/0.12</code></li> </ul>"},{"location":"contributing/#developing-with-duniterpy","title":"Developing with DuniterPy","text":"<p>DuniterPy is a Python library for Duniter v1 clients. It implements a client with multiple APIs, the handling for document signing. As it is coupled with Silkaj, it is oftenly needed to develop in both repositories.</p>"},{"location":"contributing/#how-to-use-duniterpy-as-editable-with-poetry","title":"How to use DuniterPy as editable with Poetry","text":"<p>Clone DuniterPy locally alongside of <code>silkaj</code> repository:</p> <pre><code>silkaj> cd ..\ngit clone https://git.duniter.org/clients/python/duniterpy\n</code></pre> <p>Use DuniterPy as a path dependency:</p> <pre><code>poetry add ../duniterpy\n</code></pre>"},{"location":"contributing/#developing-with-modules","title":"Developing with modules","text":"<p>Silkaj is using Python modules which shape kind of a framework. Please read their documentations on how to use them the best possible.</p> <ul> <li>DuniterPy: Autogenerated documentation.<ul> <li>Feel free to contribute upstream to share the code with other Python programs</li> </ul> </li> <li>Click<ul> <li>Rich-Click</li> </ul> </li> <li>Pendulum</li> <li>texttable</li> </ul>"},{"location":"contributing/#pre-commit-hooks","title":"Pre-commit hooks","text":"<p>We are using <code>pre-commit</code> tool to perform checks on staged changes before committing. We are using it for <code>black</code> formatting, <code>mypy</code> static typing, <code>gitlab-ci</code> linting. We are also using <code>ruff</code> which replaces <code>isort</code> imports sorting, <code>pylint</code> code linting, <code>autoflake</code>, and <code>pyupgrade</code></p> <p>Install <code>pre-commit</code> from your distribution. In case it is an outdated version, install it with <code>pipx</code>:</p> <pre><code>sudo apt install pre-commit\npipx install pre-commit\n</code></pre> <p>To install the <code>git-hooks</code>, from within Silkaj repository, run:</p> <pre><code>pre-commit install\n</code></pre> <p>Then each time you commit changes, the hooks will perform verifications.</p> <p>In case you want to commit while the hooks are failing, run the following to skip the hooks:</p> <pre><code>git commit -m \"msg\" --no-verify/-n\n</code></pre> <p>To manually run one of the tool above, run (eg for <code>ruff-format</code>):</p> <pre><code>pre-commit run --all-files ruff-format\n</code></pre> <p>To run all checks on all files:</p> <pre><code>pre-commit run -a\n</code></pre>"},{"location":"contributing/#authorization-for-gitlab-ci-linter-hook","title":"Authorization for GitLab CI linter hook","text":"<p><code>pre-commit run -a (gitlab-ci-linter)</code> is failing due to authorization required for CI lint API accesses. When running this command, just ignore this failed hook. In case you want to commit a <code>.gitlab-ci.yml</code> edition, this hook will prevent the commit creation. You can skip the hooks as mentionned above. This is fine for occasional <code>.gitlab-ci.yml</code> editions. In case you would like to edit this file more often and have it checked, ask a maintainer to provide you with <code>GITLAB_PRIVATE_TOKEN</code> environment variable that can be set into a shell configuration. With Bash, in <code>$HOME/.bashrc</code> add the following:</p> <pre><code>export GITLAB_PRIVATE_TOKEN=\"\"\n</code></pre> <p>With Fish, in <code>$HOME/.config/fish/config.fish</code> add the following:</p> <pre><code>set -xg GITLAB_PRIVATE_TOKEN \"\"\n</code></pre> <p>Check out duniterpy#169 for more details.</p>"},{"location":"contributing/#tests","title":"Tests","text":"<p>We are using Pytest as a tests framework. For more information on how Silkaj implements them check the testing documentation.</p> <p>Tests are stored into <code>unit</code> and <code>integration</code> folders depending on their types, then using a similar tree as the source code.</p> <p>To run the tests, from within <code>silkaj</code> repository, run:</p> <pre><code>poetry run pytest\n</code></pre>"},{"location":"contributing/#how-to-test-a-single-file","title":"How to test a single file","text":"<p>Specifiy the path of the test:</p> <pre><code>poetry run pytest tests/unit/test_network.py\n</code></pre>"},{"location":"contributing/#version-bump","title":"Version bump","text":"<p>We are using the Semantic Versioning.</p> <p>To create a release, we use following script which will bump the version in different files, and will make a commit and a tag out of it.</p> <pre><code>./release.sh 0.20.0\n</code></pre> <p>Then, a <code>git push --tags</code> is necessary to publish the tag.</p>"},{"location":"contributing/#how-to-release-a-pre-release-on-pypi","title":"How to release a pre-release on PyPI","text":"<p>Append <code>[{a|b|rc}N]</code> to the version, it will be automatically detected as pre-release by PyPI. i.e.: <code>v0.20.0rc0</code>.</p> <ul> <li>install a pre-release from PyPI:</li> </ul> <pre><code>pip install silkaj --user --upgrade --pre\n</code></pre> <ul> <li>install <code>silkaj</code> from PyPI test and the dependencies (i.e. DuniterPy) from PyPI (have been removed from the documentation):</li> </ul> <pre><code>pip install silkaj --user --upgrade -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/\n</code></pre>"},{"location":"contributing/#update-copyright-year","title":"Update copyright year","text":"<p>Follow this documentation Only difference is to update the year in <code>license_header.txt</code> rather than <code>LICENSE.txt</code>.</p>"},{"location":"contributing/#pypi-and-pypi-test-distributions","title":"PyPI and PyPI test distributions","text":"<p>Silkaj is distributed to PyPI, the Python Package Index, for further <code>pip</code> installation. Silkaj can be published to PyPI or to PyPI test for testing purposes. Publishing to PyPI or PyPI test can be directly done from the continuous delivery or from Poetry it-self. The CD jobs appear on a tag and have to be triggered manually. Only the project maintainers have the rights to push tags.</p>"},{"location":"contributing/#pypi","title":"PyPI","text":"<p>Publishing to PyPI from Poetry:</p> <pre><code>poetry publish --build\n</code></pre>"},{"location":"contributing/#pypi-test","title":"PyPI test","text":"<p>Publishing to PyPI test from Poetry:</p> <pre><code>poetry config repositories.pypi_test https://test.pypi.org/legacy/\npoetry publish --build --repository pypi_test\n</code></pre> <p>To install this package:</p> <pre><code>pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ silkaj\n</code></pre> <p>The <code>--extra-index-url</code> is used to retrieve dependencies packages from the official PyPI not to get issues with missing or testing dependencies comming from PyPI test repositories.</p>"},{"location":"contributing/#continuous-integration-and-delivery","title":"Continuous integration and delivery","text":""},{"location":"contributing/#own-built-docker-images","title":"Own built Docker images","text":"<p>Silkaj pipeline is running images built on top of official Python images based on latest Debian with Poetry installed on top them.</p> <p>They can be found in this repository.</p>"},{"location":"contributing/#pipeline-and-its-jobs","title":"Pipeline and its jobs","text":"<ul> <li>Checks:<ul> <li>pre-commit hooks</li> <li>Build</li> </ul> </li> <li>Tests on supported Python versions:<ul> <li>Installation</li> <li>Pytest on Python supported versions</li> </ul> </li> <li>Package<ul> <li>PyPI stable</li> <li>PyPI test</li> <li>Docker pip</li> <li>Docker poetry</li> </ul> </li> <li>Website/project documentation commited to be deployed via GitLab Pages</li> </ul>"},{"location":"contributing/#g1-monetary-license-update","title":"\u011e1 monetary license update","text":"<p>To modify the \u011e1 monetary license files, please change them on its repository, since it\u2019s integrated in silkaj repository as a <code>git subtree</code>.</p> <p>\u011e1 monetary license is included in Silkaj repository as a <code>git subtree</code>. To update the licence files, add the license repository as a remote then pull:</p> <pre><code>git remote add g1_monetary_license https://git.duniter.org/documents/g1_monetary_license.git\ngit subtree pull --prefix g1_monetary_license g1_monetary_license master\n</code></pre> <p>Depending on your distribution, you might need to install <code>git-subtree</code>.</p>"},{"location":"contributing/container_usage/","title":"Container usage","text":"<p>There are two kind of containers. The one built with <code>pip</code> for user purposes, and the one built with Poetry for developer purposes.</p> <p>We recommand using <code>podman</code> instead of <code>docker</code> command for not having to run the command as <code>root</code>.</p> <p>In case you use <code>docker</code>, you can add your user into the <code>docker</code> group, so you can manipulate <code>docker</code> executable without <code>root</code> permissions.</p>"},{"location":"contributing/container_usage/#user","title":"User","text":"<p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/pip:latest\n</code></pre> <p>Run Silkaj from outside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/pip:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory is where Silkaj sources are installed in Python <code>site-packages</code>. This is fine for doing small editions. For bigger editions, it is adviced to use a development environment with Poetry.</p>"},{"location":"contributing/container_usage/#developer","title":"Developer","text":"<p><code>git</code> is installed, so it can be used as a development environment.</p> <p>Pull the image:</p> PodmanDocker <pre><code>podman pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <pre><code>sudo docker pull registry.duniter.org/clients/python/silkaj/release/poetry:latest\n</code></pre> <p>Run Silkaj from ouside the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest silkaj info\n</code></pre> <p>Go into the image:</p> PodmanDocker <pre><code>podman run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <pre><code>sudo docker run -it registry.duniter.org/clients/python/silkaj/release/poetry:latest bash\n</code></pre> <p>Then run Silkaj:</p> <pre><code>silkaj info\n</code></pre> <p>The working directory contains Silkaj sources. Set up the repository to have it ready for developments:</p> <pre><code>git checkout dev\ngit remote set-url origin https://git@git.duniter.org/clients/python/silkaj.git\n</code></pre> <pre><code>git config --global user.email \"you@example.com\"\ngit config --global user.name \"Your Name\"\n</code></pre>"},{"location":"contributing/documentation/","title":"Documentation contribution","text":"<p>The project documentation website is based on MkDocs framework and on following theme and plugins:</p> <ul> <li>Mkdocs Material: theme and framework</li> <li>Mike: to publish multiple versions</li> <li>MkDocs Coverage: to integrate coverage report iframe into MkDocs</li> <li>MkDocs Click: generate documentation for Click command line applications</li> <li>MkDocs GitLab plugin: to display links to GitLab references items: used in the changelog page</li> </ul> <p>Please refer to their respective documentation.</p>"},{"location":"contributing/documentation/#set-up","title":"Set up","text":"<p>Install the optional <code>docs</code> group:</p> <pre><code>poetry install --with docs\n</code></pre>"},{"location":"contributing/documentation/#mkdocs","title":"MkDocs","text":"<p>Run the website in development mode:</p> <pre><code>poetry run mkdocs deploy\n</code></pre> <p>Open localhost:8000 in your web browser.</p> <p>The preview will be live-updated once you change the documentation.</p>"},{"location":"contributing/documentation/#mike","title":"Mike","text":"<p>Running following command will serve what\u2019s on <code>pages</code> branch:</p> <pre><code>poetry run mike serve\n</code></pre> <p>This preview won\u2019t be live-updated with your latest changes as it would be with <code>mkdocs serve</code>. This is because Mike simply serves what\u2019s built on <code>pages</code> branch.</p>"},{"location":"contributing/documentation/#changing-the-content","title":"Changing the content","text":"<p>Into <code>docs</code> folder, you can find the Markdown source files which can be edited. <code>mkdocs.yml</code> file lists the website structure.</p>"},{"location":"contributing/documentation/#deployment-workflow","title":"Deployment workflow","text":"<p>Only on <code>main</code> branch, a <code>website</code> job will be triggered containing the documentation build for a specific version. It creates a commit which is added to <code>pages</code> branch with <code>poetry run mike deploy $version</code> command. Then the commit is pushed on the git repository remote from the job with an access token. The coverage report is integrated in the website build. The artefact is retrieved from the coverage job with <code>needs:</code> keyword.</p> <p>From <code>pages</code> branch, an other pipeline is triggered, publishing the documentation website to silkaj.duniter.org for all versions via GitLab Pages.</p>"},{"location":"contributing/documentation/#access-token","title":"Access token","text":"<p>A <code>git push</code> is performed from the job to the remote repository via the authorisation provided via an access token set in CI/CD variables. The access token has to be renew every year, since this is the maximum lifespan we can set for an access token at its creation. The access token has to be created on a project basis with <code>repository_write</code> checked and with Developer role.</p>"},{"location":"contributing/install_poetry/","title":"Poetry installation","text":""},{"location":"contributing/install_poetry/#install-silkaj-in-a-development-environement-with-poetry","title":"Install Silkaj in a development environement with Poetry","text":""},{"location":"contributing/install_poetry/#install-libsodium","title":"Install libsodium","text":"DebianFedora <pre><code>sudo apt install libsodium23\n</code></pre> <pre><code>sudo dnf install libsodium\n</code></pre>"},{"location":"contributing/install_poetry/#install-poetry","title":"Install Poetry","text":"<ul> <li>Installation documentation</li> </ul> <pre><code>pipx install poetry\n</code></pre>"},{"location":"contributing/install_poetry/#install-dependencies-and-the-python-virtual-environment","title":"Install dependencies and the Python virtual environment","text":"<pre><code># Over HTTPS\ngit clone https://git.duniter.org/clients/python/silkaj.git\n\n# Over SSH\ngit clone git@git.duniter.org:clients/python/silkaj.git\n\ncd silkaj\n\n# Installs the runtime and development dependencies\npoetry install\n</code></pre>"},{"location":"contributing/install_poetry/#run-silkaj","title":"Run Silkaj","text":"<p>Within <code>silkaj</code> repository run Silkaj:</p> <pre><code>poetry run silkaj\n</code></pre>"},{"location":"contributing/install_poetry/#poetry-shell","title":"Poetry shell","text":"<p>You can access tools <code>pytest</code> from within the development environment with <code>poetry run</code> or by entering the shell:</p> <pre><code>silkaj> poetry run pytest\n</code></pre> <pre><code>silkaj> poetry shell\n(silkaj-58dUTebQ-py3.12) silkaj> pytest\n</code></pre>"},{"location":"contributing/install_poetry/#make-silkaj-accessible-from-everywhere","title":"Make Silkaj accessible from everywhere","text":"<p>Add following alias to your shell configuration:</p> <pre><code>alias silkaj=\"cd /path/to/silkaj && poetry run silkaj\"\n</code></pre>"},{"location":"contributing/packaging/","title":"Packaging","text":"<p>Silkaj is packaged in official Debian repositories. Packaging details can be found in its repository on Debian forge.</p>"},{"location":"contributing/packaging/#dependencies","title":"Dependencies","text":"<p>DuniterPy might be the only dependency not already into distributions.</p>"},{"location":"contributing/packaging/#manual-pages","title":"Manual pages","text":"<p>To generate manual pages: #179</p> <ul> <li><code>click-man</code></li> </ul>"},{"location":"contributing/packaging/#shell-completion","title":"Shell completion","text":"<p>Shell completion might be set-up as described in the installation documentation.</p>"},{"location":"contributing/testing/","title":"Testing","text":""},{"location":"contributing/testing/#test-and-coverage","title":"Test and coverage","text":""},{"location":"contributing/testing/#install-tests-dependencies","title":"Install tests dependencies","text":"<pre><code>poetry install\n</code></pre>"},{"location":"contributing/testing/#runing-tests","title":"Runing tests:","text":"<p>Simply run:</p> <pre><code>poetry run pytest\n</code></pre> <p>To have a coverage report:</p> <pre><code>poetry run pytest --cov silkaj --cov-report html --cov-report xml --cov-report term\n</code></pre> <p>See pytest documentation for more information</p>"},{"location":"contributing/testing/#writing-tests","title":"Writing tests","text":"<p>There should be three kinds of test:</p> <ul> <li>end to end test: uses the real data and the real blockchain. Obviously don't presume the data value as it can change. These test are written in <code>tests/integration/test_end_to_end.py</code>.</li> <li>integration test: mock some of the input and/or output classes and shouldn't use the actual blockchain, you should use this when mocking a class (used by your code) is too complicated.</li> <li>unit test: for functions that don't need mock or mock can me done easily (you should prefer this to integration tests). Are written in <code>tests/unit/test_*package*.py</code></li> </ul> <p>You should try to write an end to end test first, then if your coverage too bad add some unit tests. If it's still too bad, write an integration test.</p> <p>A better strategy (TDD) is to write first the End to end test. When it fails, before writing the code, you should implement the unit tests. When this one fails too, you can write your code to make your test pass. It's better but takes longer and the code is tested at least twice. So the previous strategy is a better compromise</p>"},{"location":"contributing/testing/#tips","title":"Tips","text":"<p>Test an Exception is raised: https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions</p> <p>Test a function with several values: You can use <code>@pytest.mark.parametrize</code> as done in <code>tests/unit/money/test_transfer.py</code></p> <p>To mock a user input:</p> <pre><code>from unittest.mock import patch\n\nfrom silkaj.cert import certification_confirmation\n\n\n# this will add a mock_input parameter that will be used whenever the code tries to get input from user\n@patch('builtins.input')\ndef test_certification_confirmation(mock_input):\n id_to_certify = {\"pubkey\": \"pubkeyid to certify\"}\n main_id_to_certify = {\"uid\": \"id to certify\"}\n\n # the input will return \"yes\" to the tested function (certification_confirmation)\n mock_input.return_value = \"yes\"\n\n # ensure the tested function returns something\n assert certification_confirmation(\n \"certifier id\",\n \"certifier pubkey\",\n id_to_certify,\n main_id_to_certify)\n\n # ensure that input is called once\n mock_input.assert_called_once()\n</code></pre>"},{"location":"usage/","title":"Usage","text":"<ul> <li>Command-line interface reference</li> <li>Account storage</li> <li>Multi-recipients transfers and automation</li> <li>DeathReaper</li> </ul>"},{"location":"usage/account_storage/","title":"Account storage","text":"<p>Silkaj features the account storage to store and read security-wise important documents from a location on your local computer. It is used to store and read authentication and revocation files with Silkaj. It is recommended to use the storage instead of storing and reading these files anywhere on your system.</p> <p>They are stored into <code>$XDG_DATA_HOME/silkaj</code>, aka <code>$HOME/.local/share/silkaj/$currency/$account_name</code> as:</p> <ul> <li><code>revocation.txt</code></li> <li><code>authentication_file_ed25519.dewif</code> for v1 WIF and EWIF formats based on the approved RFC n\u00b013.</li> <li><code>authentication_file_sr25519.json</code> for v2 encrypted json format</li> </ul> <p>The account name is a local name given to a wallet. It does not necessarily need to be the same identity username stored into the blockchain. No verification what so ever is performed to check any correspondence between the local name stored into Silkaj account storage and the one stored on the blockchain or the indexer.</p>"},{"location":"usage/account_storage/#per-currency-storage","title":"Per currency storage","text":"<p>The storage is organized per currencies. Depending on the specified endpoint with the endpoint options (<code>--endpoint</code>, <code>--gtest</code>) the currency will be determined. Based on the latter, it will be stored into <code>g1</code> or <code>g1-test</code> directory.</p>"},{"location":"usage/account_storage/#authentication","title":"Authentication","text":""},{"location":"usage/account_storage/#import","title":"Import","text":"<p>Import your authentication file into the storage. In case you want to use an other authentication method than the default Scrypt method, use one of the authentication options which can be find in <code>silkaj authentication --help</code> usage.</p> <p>Next command will store the authentication file in <code>$HOME/.local/share/silkaj/g1/test/authentication_file_ed25519.dewif</code></p> <pre><code>silkaj --account test authentication <authentication option>\n</code></pre> <p>Note: <code>g1</code> and <code>test</code> folders come respectively from the default \u011e1 endpoint and <code>test</code> from the name of the passed account.</p>"},{"location":"usage/account_storage/#reading","title":"Reading","text":"<p>Commands using authentication such as <code>money transfer</code>, <code>wot certify</code>, <code>wot membership</code>, and <code>money balance</code> will read the authentication file from the account storage. With the general <code>--account</code> option, it will use the authentication file created in previous step.</p> <pre><code>silkaj --account test money transfer\n</code></pre>"},{"location":"usage/account_storage/#revocation","title":"Revocation","text":""},{"location":"usage/account_storage/#inputoutput","title":"Input/Output","text":"<p>The general <code>--account</code> option (placed between <code>silkaj</code> and the sub-command) is used to read the authentication file and to write the revocation file in the same directory.</p> <pre><code>silkaj --account test authentication\n</code></pre>"},{"location":"usage/account_storage/#creation","title":"Creation","text":"<pre><code>silkaj --gtest --account john wot revocation create\n</code></pre> <p>Will be stored into <code>$HOME/.local/share/silkaj/g1-test/john/revocation.txt</code></p>"},{"location":"usage/account_storage/#reading_1","title":"Reading","text":"<p>The revocation document can be read with <code>wot revocation publish</code> and <code>verify</code> commands as follow:</p> <pre><code>silkaj --gtest --account john wot revocation verify\n</code></pre> <p>Here we are reading the revocation file generated in previous step.</p>"},{"location":"usage/cli/","title":"Command-line interface reference","text":"<p>This page provides documentation of Silkaj command line interface.</p>"},{"location":"usage/cli/#silkaj","title":"silkaj","text":"<p>Usage:</p> <pre><code>silkaj [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>-h</code>, <code>--help</code> boolean Show this message and exit. <code>False</code> <code>-v</code>, <code>--version</code> boolean Show the version and exit. <code>False</code> <code>--endpoint</code>, <code>-ep</code> text Without specifying this option, the default endpoint reaches \u011e1 currency on its official endpoint: https://g1.duniter.org. --endpoint allows to specify a custom endpoint following <code><host>:<port>/<path></code> format. <code>port</code> and <code>path</code> are optional. In case no port is specified, it defaults to 443. NOTE: This argument is mutually exclusive with arguments: [gtest]. None <code>--gtest</code>, <code>-gt</code> boolean Uses official \u011eTest currency endpoint: https://g1-test.duniter.org NOTE: This argument is mutually exclusive with arguments: [endpoint]. <code>False</code> <code>--account</code>, <code>-a</code> text Account name used in storage <code>$HOME/.local/share/silkaj/$currency/$account_name</code> for authentication and revocation. None <code>--password</code>, <code>-p</code> text EWIF authentication password. If you use this option, prefix the command with a space so the password is not saved in your shell history. In case of an encrypted file, password input will be prompted. None <code>--display</code>, <code>-d</code> boolean Display the generated document before sending it <code>False</code> <code>--dry-run</code>, <code>-n</code> boolean By-pass the licence and confirmation. Do not send the document, but display it instead <code>False</code> <p>Subcommands</p> <ul> <li>about: Display program information</li> <li>authentication: Generate and store authentication file</li> <li>blockchain: Blockchain related commands</li> <li>checksum: Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</li> <li>license: Display \u011e1 monetary license</li> <li>money: Money management related commands</li> <li>wot: Web-of-Trust related commands</li> </ul>"},{"location":"usage/cli/#silkaj-about","title":"silkaj about","text":"<p>Display program information</p> <p>Usage:</p> <pre><code>silkaj about [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-authentication","title":"silkaj authentication","text":"<p>Generate and store authentication file</p> <p>Usage:</p> <pre><code>silkaj authentication [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--auth-scrypt</code>, <code>--scrypt</code> boolean Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_wif, auth_seed, auth_file]. <code>False</code> <code>--nrp</code> text Scrypt parameters: defaults N,r,p: \"4096,16,1\" None <code>--auth-file</code>, <code>-af</code> file Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_wif, auth_seed, auth_scrypt]. None <code>--auth-seed</code>, <code>--seed</code> boolean Seed hexadecimal authentication NOTE: This argument is mutually exclusive with arguments: [auth_wif, auth_file, auth_scrypt]. <code>False</code> <code>--auth-wif</code>, <code>--wif</code> boolean WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_file, auth_scrypt]. <code>False</code> <code>--password</code>, <code>-p</code> text EWIF encryption password for the destination file. If no password argument is passed, WIF format will be used. If you use this option prefix the command with a space so the password does not get saved in your shell history. Password input will be suggested via a prompt. None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain","title":"silkaj blockchain","text":"<p>Blockchain related commands</p> <p>Usage:</p> <pre><code>silkaj blockchain [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>blocks: Display blocks: default: 0 for current window size</li> <li>difficulty: Display current Proof-of-Work difficulty level to generate next block</li> <li>info: Currency information</li> </ul>"},{"location":"usage/cli/#silkaj-blockchain-blocks","title":"silkaj blockchain blocks","text":"<p>Display blocks: default: 0 for current window size</p> <p>Usage:</p> <pre><code>silkaj blockchain blocks [OPTIONS] [NUMBER]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--detailed</code>, <code>-d</code> boolean Force detailed view. Compact view happen over 30 blocks <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-difficulty","title":"silkaj blockchain difficulty","text":"<p>Display current Proof-of-Work difficulty level to generate next block</p> <p>Usage:</p> <pre><code>silkaj blockchain difficulty [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-blockchain-info","title":"silkaj blockchain info","text":"<p>Currency information</p> <p>Usage:</p> <pre><code>silkaj blockchain info [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-checksum","title":"silkaj checksum","text":"<p>Generate checksum out of a passed pubkey or an authentication method. Checks if the passed checksum is valid.</p> <p>Usage:</p> <pre><code>silkaj checksum [OPTIONS] [PUBKEY_CHECKSUM]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-license","title":"silkaj license","text":"<p>Display \u011e1 monetary license</p> <p>Usage:</p> <pre><code>silkaj license [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money","title":"silkaj money","text":"<p>Money management related commands</p> <p>Usage:</p> <pre><code>silkaj money [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>balance: Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</li> <li>history: History of wallet money movements</li> <li>transfer: Transfer money</li> </ul>"},{"location":"usage/cli/#silkaj-money-balance","title":"silkaj money balance","text":"<p>Wallet\u00b7s balance\u00b7s. Multiple public keys can be passed, then a sum is computed. Also works with the authentication.</p> <p>Usage:</p> <pre><code>silkaj money balance [OPTIONS] [PUBKEYS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-history","title":"silkaj money history","text":"<p>History of wallet money movements</p> <p>Usage:</p> <pre><code>silkaj money history [OPTIONS] PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--uids</code>, <code>-u</code> boolean Display identities username <code>False</code> <code>--full-pubkey</code>, <code>-f</code> boolean Display full-length public keys <code>False</code> <code>--csv-file</code>, <code>--csv</code> file Write in specified file name in CSV (Comma-separated values) format the history of money movements None <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-money-transfer","title":"silkaj money transfer","text":"<p>Transfer money</p> <p>Usage:</p> <pre><code>silkaj money transfer [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--amount</code>, <code>-a</code> float range (<code>0.01</code> and above) Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amountsud]. None <code>--amountUD</code>, <code>-d</code> float range (<code>1e-06</code> and above) Relative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amounts]. None <code>--allSources</code> boolean Send all sources to one recipient. NOTE: This argument is mutually exclusive with arguments: [file_path, amountsud, amounts]. <code>False</code> <code>--recipient</code>, <code>-r</code> text Public key(s)' recipients + optional checksum: <code><pubkey>[:checksum]</code>. Sending to multiple recipients is possible. With one amount specified, all recipients will receive the same amount. With one amount specified per recipient, recipient 1 will recieve amount 1, and so on. NOTE: This argument is mutually exclusive with arguments: [file_path]. None <code>--file</code>, <code>-f</code> file File's path containing a list of amounts in absolute or relative reference and recipients' pubkeys NOTE: This argument is mutually exclusive with arguments: [amountsUD, recipients, allsources, amounts]. None <code>--reference</code>, <code>-ref</code> text Transfer reference `` <code>--outputBackChange</code> text Pubkey recipient to send the rest of the transaction: <code><pubkey[:checksum]></code> None <code>--yes</code>, <code>-y</code> boolean Assume yes. Do not prompt confirmation <code>False</code> <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot","title":"silkaj wot","text":"<p>Web-of-Trust related commands</p> <p>Usage:</p> <pre><code>silkaj wot [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>certify: Certify identity</li> <li>lookup: Username identifier and public key lookup</li> <li>membership: Send or renew membership.</li> <li>revocation: Manage revocation document commands.</li> <li>status: Check received and sent certifications and consult the membership status of any given identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-certify","title":"silkaj wot certify","text":"<p>Certify identity</p> <p>Usage:</p> <pre><code>silkaj wot certify [OPTIONS] UID_PUBKEY_TO_CERTIFY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-lookup","title":"silkaj wot lookup","text":"<p>Username identifier and public key lookup</p> <p>Usage:</p> <pre><code>silkaj wot lookup [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-membership","title":"silkaj wot membership","text":"<p>Send or renew membership.</p> <p>Usage:</p> <pre><code>silkaj wot membership [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation","title":"silkaj wot revocation","text":"<p>Manage revocation document commands.</p> <p>Usage:</p> <pre><code>silkaj wot revocation [OPTIONS] COMMAND [ARGS]...\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code> <p>Subcommands</p> <ul> <li>create: Create and save revocation document</li> <li>publish: Publish previously created revocation document. Identity will be immediately revoked.</li> <li>revoke: Create and publish revocation document. Will immediately revoke the identity.</li> <li>verify: Verifies that the revocation document is correctly formatted and matches an existing identity</li> </ul>"},{"location":"usage/cli/#silkaj-wot-revocation-create","title":"silkaj wot revocation create","text":"<p>Create and save revocation document</p> <p>Usage:</p> <pre><code>silkaj wot revocation create [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-publish","title":"silkaj wot revocation publish","text":"<p>Publish previously created revocation document. Identity will be immediately revoked.</p> <p>Usage:</p> <pre><code>silkaj wot revocation publish [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-revoke","title":"silkaj wot revocation revoke","text":"<p>Create and publish revocation document. Will immediately revoke the identity.</p> <p>Usage:</p> <pre><code>silkaj wot revocation revoke [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-revocation-verify","title":"silkaj wot revocation verify","text":"<p>Verifies that the revocation document is correctly formatted and matches an existing identity</p> <p>Usage:</p> <pre><code>silkaj wot revocation verify [OPTIONS]\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/cli/#silkaj-wot-status","title":"silkaj wot status","text":"<p>Check received and sent certifications and consult the membership status of any given identity</p> <p>Usage:</p> <pre><code>silkaj wot status [OPTIONS] UID_PUBKEY\n</code></pre> <p>Options:</p> Name Type Description Default <code>--help</code> boolean Show this message and exit. <code>False</code>"},{"location":"usage/deathreaper/","title":"DeathReaper","text":"<p>DeathReaper is a service reporting Web of Trust exclusions on Discourse forums. Images are created containing Silkaj + DeathReaper. These images are operated on DeathReaper repository with pipeline schedules.</p>"},{"location":"usage/deathreaper/#installation","title":"Installation","text":"<p>When installing Silkaj, you have to specify the optional extra <code>deathreaper</code> distribution in order to get DeathReaper\u2019s dependency <code>pydiscourse</code> installed. It will therefore \"activate\" the feature, and <code>silkaj wot exclusions</code> command will become available.</p> <pre><code>pipx install silkaj[deathreaper]\n</code></pre> <p>With Poetry development environment:</p> <pre><code>poetry install --extras deathreaper\n</code></pre>"},{"location":"usage/deathreaper/#usage","title":"Usage","text":"<p>DeathReaper was first released in Silkaj codebase with version 0.12.0. Make sure <code>exclusions</code> command is present under <code>silkaj wot</code>, otherwise something probably went wrong with the installation. Then run <code>silkaj wot exclusions --help</code> to check how to use it.</p> <p>By default it will report the exclusions for the last day, from 24 hours in the past till now. You can specify an other duration with <code>silkaj wot exclusions 0.5</code> for the last 12 hours, half a day, for example.</p> <p>By default the report will be displayed in the terminal. To have the report published on a Discourse forum, you have to pass following options <code>--api-id</code> <code>--*-api-key</code>, <code>--publish</code>. Further code changes have to be done in order to support additional Discourse forums.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/","title":"Multi-recipients transfers and automation","text":"<p>We want to transfer money to multiple recipients and to automate that process.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#create-a-recipients-file","title":"Create a recipients file","text":"<p>Create a file (i.e.: <code>recipients.txt</code>) containing the list of the recipients public keys you want to send money to.</p> recipients.txt<pre><code><ABSOLUTE|RELATIVE>\n\n# comment 1\n<amount1> <pubkey1>\n\n# comment 2\n<amount2> <pubkey2>:[<checksum2>]\n</code></pre> <p>The file content should be prefixed with <code>RELATIVE</code> or <code>ABSOLUTE</code> so the amounts will be expressed in UD \u011e1 or \u011e1.</p>"},{"location":"usage/multi-recipients_transfers_and_automation/#set-up-the-authentication","title":"Set up the authentication","text":"<ul> <li>Check authentication documentation on how to handle the authentication.</li> </ul>"},{"location":"usage/multi-recipients_transfers_and_automation/#transfer","title":"Transfer","text":"<p>Finally, you just have to run following command:</p> <pre><code>silkaj -a <account_name> money transfer --file recipients.txt\n</code></pre>"},{"location":"usage/multi-recipients_transfers_and_automation/#automation","title":"Automation","text":"<p>In case you want to automate a transfer on a regural basis, on the first day of the month in this example, you can set a <code>crontab</code> on your machine (preferably a machine running 7/24):</p> <pre><code>0 0 1 * * silkaj -a <account_name> money transfer --file recipients.txt --yes\n</code></pre> <p>Pass <code>--yes</code> option so no confirmation gets prompted. In case a password is set on the authentication, pass as well the <code>--password <password></code> general option.</p>"},{"location":"coverage/","title":"Coverage report","text":""},{"location":"blog/2025/","title":"2025","text":""},{"location":"blog/2023/","title":"2023","text":""},{"location":"blog/2022/","title":"2022","text":""},{"location":"blog/2021/","title":"2021","text":""},{"location":"blog/2020/","title":"2020","text":""},{"location":"blog/2019/","title":"2019","text":""},{"location":"blog/2018/","title":"2018","text":""},{"location":"blog/2017/","title":"2017","text":""},{"location":"blog/2016/","title":"2016","text":""},{"location":"blog/release/","title":"release","text":""},{"location":"blog/minor/","title":"minor","text":""},{"location":"blog/rc/","title":"rc","text":""},{"location":"blog/page/2/","title":"Blog","text":""},{"location":"blog/page/3/","title":"Blog","text":""},{"location":"blog/page/4/","title":"Blog","text":""},{"location":"blog/page/5/","title":"Blog","text":""},{"location":"blog/minor/page/2/","title":"minor","text":""},{"location":"blog/release/page/2/","title":"release","text":""},{"location":"blog/release/page/3/","title":"release","text":""}]} \ No newline at end of file diff --git a/0.12/sitemap.xml b/0.12/sitemap.xml index 61ff46ce1c0ae9a134e2cb0620f264da7e13747d..2316cc2a876e40fc6153dce88a8d88cb4bc0c322 100644 --- a/0.12/sitemap.xml +++ b/0.12/sitemap.xml @@ -2,234 +2,242 @@ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://silkaj.duniter.org/0.12/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/changelog/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/install/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-new-cli-duniter-client/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v0100/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/call-for-testing-silkaj-v0100rc/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v0110-release/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/call-for-testing-silkaj-v0110rc0/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v0111/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v0112/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> + </url> + <url> + <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v0120-release/</loc> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v020-release/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v030-release-lets-send-money/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v040-release/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v050-release-lets-certify/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v060-release-lets-install/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v061-release/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v070-release-duniterpy-click-transactions-history-debian-website/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v071/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v072/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v073/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v074/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v075/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v076/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v080-release/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v081/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/v090rc/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/silkaj-v090-release/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/contributing/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/contributing/container_usage/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/contributing/documentation/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/contributing/install_poetry/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/contributing/packaging/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/contributing/testing/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/usage/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/usage/account_storage/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/usage/cli/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/usage/deathreaper/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/usage/multi-recipients_transfers_and_automation/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/coverage/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> + </url> + <url> + <loc>https://silkaj.duniter.org/0.12/blog/2025/</loc> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2023/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2022/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2021/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2020/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2019/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2018/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2017/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/2016/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> - <loc>https://silkaj.duniter.org/0.12/blog/minor/</loc> - <lastmod>2025-04-16</lastmod> + <loc>https://silkaj.duniter.org/0.12/blog/release/</loc> + <lastmod>2025-04-22</lastmod> </url> <url> - <loc>https://silkaj.duniter.org/0.12/blog/release/</loc> - <lastmod>2025-04-16</lastmod> + <loc>https://silkaj.duniter.org/0.12/blog/minor/</loc> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/rc/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/page/2/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/page/3/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/page/4/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/page/5/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/minor/page/2/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/release/page/2/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> <url> <loc>https://silkaj.duniter.org/0.12/blog/release/page/3/</loc> - <lastmod>2025-04-16</lastmod> + <lastmod>2025-04-22</lastmod> </url> </urlset> \ No newline at end of file diff --git a/0.12/sitemap.xml.gz b/0.12/sitemap.xml.gz index af5856401a37435d80008dbe8f3db79bc846480a..e7b99f97c343d6f702a1110993e9282efec99bdc 100644 Binary files a/0.12/sitemap.xml.gz and b/0.12/sitemap.xml.gz differ diff --git a/0.12/usage/account_storage/index.html b/0.12/usage/account_storage/index.html index 12aaa4689015b254f83c5bcc1212efd6dd3284fa..bd0d6c734f9d9bb4d924feb6fafaed2648ebf378 100644 --- a/0.12/usage/account_storage/index.html +++ b/0.12/usage/account_storage/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -836,6 +836,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> @@ -1535,15 +1560,15 @@ It is recommended to use the storage instead of storing and reading these files <p>They are stored into <code>$XDG_DATA_HOME/silkaj</code>, aka <code>$HOME/.local/share/silkaj/$currency/$account_name</code> as:</p> <ul> <li><code>revocation.txt</code></li> -<li><code>authentication_file_ed25519.dewif</code> for v1 WIF and EWIF formats based on the approved <a href="https://git.duniter.org/documents/rfcs/-/blob/master/rfc/0013_Duniter_Encrypted_Wallet_Import_Format.md?ref_type=heads">RFC n°13</a>.</li> +<li><code>authentication_file_ed25519.dewif</code> for v1 WIF and EWIF formats based on the approved <a href="https://git.duniter.org/documents/rfcs/-/blob/master/rfc/0013_Duniter_Encrypted_Wallet_Import_Format.md">RFC n°13</a>.</li> <li><code>authentication_file_sr25519.json</code> for v2 encrypted json format</li> </ul> <p>The account name is a local name given to a wallet. -It does not necessarily need to be the same identity nickname/alias stored into the blockchain. +It does not necessarily need to be the same identity username stored into the blockchain. No verification what so ever is performed to check any correspondence between the local name stored into Silkaj account storage and the one stored on the blockchain or the indexer.</p> <h2 id="per-currency-storage">Per currency storage<a class="headerlink" href="#per-currency-storage" title="Permanent link">¶</a></h2> <p>The storage is organized per currencies. -Depending on the specified endpoint with the endpoint options (<code>--endpoint</code>, <code>--gtest</code>) the currency will be determined. Based on the latter, it will stored into <code>g1</code> or <code>g1-test</code> directory.</p> +Depending on the specified endpoint with the endpoint options (<code>--endpoint</code>, <code>--gtest</code>) the currency will be determined. Based on the latter, it will be stored into <code>g1</code> or <code>g1-test</code> directory.</p> <h2 id="authentication">Authentication<a class="headerlink" href="#authentication" title="Permanent link">¶</a></h2> <h3 id="import">Import<a class="headerlink" href="#import" title="Permanent link">¶</a></h3> <p>Import your authentication file into the storage. @@ -1551,7 +1576,7 @@ In case you want to use an other authentication method than the default Scrypt m <p>Next command will store the authentication file in <code>$HOME/.local/share/silkaj/g1/test/authentication_file_ed25519.dewif</code></p> <div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>silkaj --account test authentication <authentication option> </span></code></pre></div> -<p>Note: <code>g1</code> and <code>test</code> folders comes respectively from the default Äž1 endpoint and <code>test</code> from the account passed.</p> +<p>Note: <code>g1</code> and <code>test</code> folders come respectively from the default Äž1 endpoint and <code>test</code> from the name of the passed account.</p> <h3 id="reading">Reading<a class="headerlink" href="#reading" title="Permanent link">¶</a></h3> <p>Commands using authentication such as <code>money transfer</code>, <code>wot certify</code>, <code>wot membership</code>, and <code>money balance</code> will read the authentication file from the account storage. With the general <code>--account</code> option, it will use the authentication file created in previous step.</p> diff --git a/0.12/usage/cli/index.html b/0.12/usage/cli/index.html index 8e3d5e6144a4843ae2dc3309dc2842dcd5768264..d397df55c59b462df39825f8d5769989444e7255 100644 --- a/0.12/usage/cli/index.html +++ b/0.12/usage/cli/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -989,6 +989,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> @@ -1954,7 +1979,7 @@ <tr> <td><code>--auth-scrypt</code>, <code>--scrypt</code></td> <td>boolean</td> -<td>Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_file, auth_wif, auth_seed].</td> +<td>Scrypt authentication. Default method NOTE: This argument is mutually exclusive with arguments: [auth_wif, auth_seed, auth_file].</td> <td><code>False</code></td> </tr> <tr> @@ -1966,19 +1991,19 @@ <tr> <td><code>--auth-file</code>, <code>-af</code></td> <td>file</td> -<td>Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_wif, auth_seed].</td> +<td>Seed hexadecimal authentication from file path NOTE: This argument is mutually exclusive with arguments: [auth_wif, auth_seed, auth_scrypt].</td> <td>None</td> </tr> <tr> <td><code>--auth-seed</code>, <code>--seed</code></td> <td>boolean</td> -<td>Seed hexadecimal authentication NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_wif].</td> +<td>Seed hexadecimal authentication NOTE: This argument is mutually exclusive with arguments: [auth_wif, auth_file, auth_scrypt].</td> <td><code>False</code></td> </tr> <tr> <td><code>--auth-wif</code>, <code>--wif</code></td> <td>boolean</td> -<td>WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_scrypt, auth_file, auth_seed].</td> +<td>WIF and EWIF authentication methods NOTE: This argument is mutually exclusive with arguments: [auth_seed, auth_file, auth_scrypt].</td> <td><code>False</code></td> </tr> <tr> @@ -2266,7 +2291,7 @@ <tr> <td><code>--amount</code>, <code>-a</code></td> <td>float range (<code>0.01</code> and above)</td> -<td>Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [amountsud, allsources, file_path].</td> +<td>Quantitative amount(s). NOTE: This argument is mutually exclusive with arguments: [file_path, allsources, amountsud].</td> <td>None</td> </tr> <tr> diff --git a/0.12/usage/deathreaper/index.html b/0.12/usage/deathreaper/index.html index cad87b06c63629d8257689630042d94551e339dd..1ddd28901fb15c801bbad29324037db9bf4bf6bb 100644 --- a/0.12/usage/deathreaper/index.html +++ b/0.12/usage/deathreaper/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -770,6 +770,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link"> diff --git a/0.12/usage/index.html b/0.12/usage/index.html index abd5eae0ffc21fa939c5ede3170c5c6c783008bc..670c42a0c3904c8e4d5961f10690a40515ce2af5 100644 --- a/0.12/usage/index.html +++ b/0.12/usage/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css"> @@ -720,6 +720,31 @@ + <li class="md-nav__item"> + <a href="../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../blog/2023/" class="md-nav__link"> diff --git a/0.12/usage/multi-recipients_transfers_and_automation/index.html b/0.12/usage/multi-recipients_transfers_and_automation/index.html index 2a02cf57e59d066c03a266f42d1f7bcfe048ee42..8a6bcced1917961a0e4e68b2424ea9ccd6c88294 100644 --- a/0.12/usage/multi-recipients_transfers_and_automation/index.html +++ b/0.12/usage/multi-recipients_transfers_and_automation/index.html @@ -20,7 +20,7 @@ <link rel="icon" href="../../images/silkaj_logo.png"> - <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.12"> @@ -28,7 +28,7 @@ - <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css"> + <link rel="stylesheet" href="../../assets/stylesheets/main.2afb09e1.min.css"> <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css"> @@ -788,6 +788,31 @@ + <li class="md-nav__item"> + <a href="../../blog/2025/" class="md-nav__link"> + + + + <span class="md-ellipsis"> + 2025 + + </span> + + + </a> + </li> + + + + + + + + + + + + <li class="md-nav__item"> <a href="../../blog/2023/" class="md-nav__link">