# HG changeset patch # User matac42 # Date 1683962085 -32400 # Node ID efea60e8455a200747b44f673f875f4aba1c901f # Parent 2e2ddc184572412994638ca7f4329ebc18b06199 ... diff -r 2e2ddc184572 -r efea60e8455a marp-slide/slide.html --- a/marp-slide/slide.html Sat May 13 16:03:48 2023 +0900 +++ b/marp-slide/slide.html Sat May 13 16:14:45 2023 +0900 @@ -11,34 +11,115 @@ */div#\:\$p>svg>foreignObject>section{--color-prettylights-syntax-comment:#6e7781;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#8250df;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069;--color-fg-default:#24292f;--color-fg-muted:#57606a;--color-fg-subtle:#6e7781;--color-canvas-default:#fff;--color-canvas-subtle:#f6f8fa;--color-border-default:#d0d7de;--color-border-muted:#d8dee4;--color-neutral-muted:rgba(175,184,193,.2);--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-attention-subtle:#fff8c5;--color-danger-fg:#cf222e;color-scheme:light}div#\:\$p>svg>foreignObject>section:where(.invert){--color-prettylights-syntax-comment:#8b949e;--color-prettylights-syntax-constant:#79c0ff;--color-prettylights-syntax-entity:#d2a8ff;--color-prettylights-syntax-storage-modifier-import:#c9d1d9;--color-prettylights-syntax-entity-tag:#7ee787;--color-prettylights-syntax-keyword:#ff7b72;--color-prettylights-syntax-string:#a5d6ff;--color-prettylights-syntax-variable:#ffa657;--color-prettylights-syntax-brackethighlighter-unmatched:#f85149;--color-prettylights-syntax-invalid-illegal-text:#f0f6fc;--color-prettylights-syntax-invalid-illegal-bg:#8e1519;--color-prettylights-syntax-carriage-return-text:#f0f6fc;--color-prettylights-syntax-carriage-return-bg:#b62324;--color-prettylights-syntax-string-regexp:#7ee787;--color-prettylights-syntax-markup-list:#f2cc60;--color-prettylights-syntax-markup-heading:#1f6feb;--color-prettylights-syntax-markup-italic:#c9d1d9;--color-prettylights-syntax-markup-bold:#c9d1d9;--color-prettylights-syntax-markup-deleted-text:#ffdcd7;--color-prettylights-syntax-markup-deleted-bg:#67060c;--color-prettylights-syntax-markup-inserted-text:#aff5b4;--color-prettylights-syntax-markup-inserted-bg:#033a16;--color-prettylights-syntax-markup-changed-text:#ffdfb6;--color-prettylights-syntax-markup-changed-bg:#5a1e02;--color-prettylights-syntax-markup-ignored-text:#c9d1d9;--color-prettylights-syntax-markup-ignored-bg:#1158c7;--color-prettylights-syntax-meta-diff-range:#d2a8ff;--color-prettylights-syntax-brackethighlighter-angle:#8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark:#484f58;--color-prettylights-syntax-constant-other-reference-link:#a5d6ff;--color-fg-default:#c9d1d9;--color-fg-muted:#8b949e;--color-fg-subtle:#6e7681;--color-canvas-default:#0d1117;--color-canvas-subtle:#161b22;--color-border-default:#30363d;--color-border-muted:#21262d;--color-neutral-muted:hsla(215,8%,47%,.4);--color-accent-fg:#58a6ff;--color-accent-emphasis:#1f6feb;--color-attention-subtle:rgba(187,128,9,.15);--color-danger-fg:#f85149;color-scheme:dark}div#\:\$p>svg>foreignObject>section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;word-wrap:break-word;background-color:var(--color-canvas-default);color:var(--color-fg-default);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;line-height:1.5;margin:0}div#\:\$p>svg>foreignObject>section{--marpit-root-font-size:16px}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1):hover .anchor .octicon-link:before,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2):hover .anchor .octicon-link:before,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3):hover .anchor .octicon-link:before,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4):hover .anchor .octicon-link:before,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5):hover .anchor .octicon-link:before,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6):hover .anchor .octicon-link:before{background-color:currentColor;content:" ";display:inline-block;height:16px;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,');width:16px}div#\:\$p>svg>foreignObject>section details,div#\:\$p>svg>foreignObject>section figcaption,div#\:\$p>svg>foreignObject>section figure{display:block}div#\:\$p>svg>foreignObject>section summary{display:list-item}div#\:\$p>svg>foreignObject>section [hidden]{display:none!important}div#\:\$p>svg>foreignObject>section a{background-color:transparent;color:var(--color-accent-fg);text-decoration:none}div#\:\$p>svg>foreignObject>section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#\:\$p>svg>foreignObject>section b,div#\:\$p>svg>foreignObject>section strong{font-weight:var(--base-text-weight-semibold,600)}div#\:\$p>svg>foreignObject>section dfn{font-style:italic}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1){border-bottom:1px solid var(--color-border-muted);font-size:2em;font-weight:var(--base-text-weight-semibold,600);margin:.67em 0;padding-bottom:.3em}div#\:\$p>svg>foreignObject>section mark{background-color:var(--color-attention-subtle);color:var(--color-fg-default)}div#\:\$p>svg>foreignObject>section small{font-size:90%}div#\:\$p>svg>foreignObject>section sub,div#\:\$p>svg>foreignObject>section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#\:\$p>svg>foreignObject>section sub{bottom:-.25em}div#\:\$p>svg>foreignObject>section sup{top:-.5em}div#\:\$p>svg>foreignObject>section img{background-color:var(--color-canvas-default);border-style:none;box-sizing:content-box;max-width:100%}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre),div#\:\$p>svg>foreignObject>section code,div#\:\$p>svg>foreignObject>section kbd,div#\:\$p>svg>foreignObject>section samp{font-family:monospace;font-size:1em}div#\:\$p>svg>foreignObject>section figure{margin:1em 40px}div#\:\$p>svg>foreignObject>section hr{background:transparent;background-color:var(--color-border-default);border:0;box-sizing:content-box;height:.25em;margin:24px 0;overflow:hidden;padding:0}div#\:\$p>svg>foreignObject>section input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}div#\:\$p>svg>foreignObject>section [type=button],div#\:\$p>svg>foreignObject>section [type=reset],div#\:\$p>svg>foreignObject>section [type=submit]{-webkit-appearance:button}div#\:\$p>svg>foreignObject>section [type=checkbox],div#\:\$p>svg>foreignObject>section [type=radio]{box-sizing:border-box;padding:0}div#\:\$p>svg>foreignObject>section [type=number]::-webkit-inner-spin-button,div#\:\$p>svg>foreignObject>section [type=number]::-webkit-outer-spin-button{height:auto}div#\:\$p>svg>foreignObject>section [type=search]::-webkit-search-cancel-button,div#\:\$p>svg>foreignObject>section [type=search]::-webkit-search-decoration{-webkit-appearance:none}div#\:\$p>svg>foreignObject>section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#\:\$p>svg>foreignObject>section ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}div#\:\$p>svg>foreignObject>section a:hover{text-decoration:underline}div#\:\$p>svg>foreignObject>section ::-moz-placeholder{color:var(--color-fg-subtle);opacity:1}div#\:\$p>svg>foreignObject>section ::placeholder{color:var(--color-fg-subtle);opacity:1}div#\:\$p>svg>foreignObject>section hr:after,div#\:\$p>svg>foreignObject>section hr:before{content:"";display:table}div#\:\$p>svg>foreignObject>section hr:after{clear:both}div#\:\$p>svg>foreignObject>section table{border-collapse:collapse;border-spacing:0;display:block;max-width:100%;overflow:auto;width:-moz-max-content;width:max-content}div#\:\$p>svg>foreignObject>section td,div#\:\$p>svg>foreignObject>section th{padding:0}div#\:\$p>svg>foreignObject>section details summary{cursor:pointer}div#\:\$p>svg>foreignObject>section details:not([open])>:not(summary){display:none!important}div#\:\$p>svg>foreignObject>section [role=button]:focus,div#\:\$p>svg>foreignObject>section a:focus,div#\:\$p>svg>foreignObject>section input[type=checkbox]:focus,div#\:\$p>svg>foreignObject>section input[type=radio]:focus{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}div#\:\$p>svg>foreignObject>section [role=button]:focus:not(:focus-visible),div#\:\$p>svg>foreignObject>section a:focus:not(:focus-visible),div#\:\$p>svg>foreignObject>section input[type=checkbox]:focus:not(:focus-visible),div#\:\$p>svg>foreignObject>section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#\:\$p>svg>foreignObject>section [role=button]:focus-visible,div#\:\$p>svg>foreignObject>section a:focus-visible,div#\:\$p>svg>foreignObject>section input[type=checkbox]:focus-visible,div#\:\$p>svg>foreignObject>section input[type=radio]:focus-visible{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}div#\:\$p>svg>foreignObject>section a:not([class]):focus,div#\:\$p>svg>foreignObject>section a:not([class]):focus-visible,div#\:\$p>svg>foreignObject>section input[type=checkbox]:focus,div#\:\$p>svg>foreignObject>section input[type=checkbox]:focus-visible,div#\:\$p>svg>foreignObject>section input[type=radio]:focus,div#\:\$p>svg>foreignObject>section input[type=radio]:focus-visible{outline-offset:0}div#\:\$p>svg>foreignObject>section kbd{background-color:var(--color-canvas-subtle);border-bottom-color:var(--color-neutral-muted);border:1px solid var(--color-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--color-neutral-muted);color:var(--color-fg-default);display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1),div#\:\$p>svg>foreignObject>section :is(h2,marp-h2),div#\:\$p>svg>foreignObject>section :is(h3,marp-h3),div#\:\$p>svg>foreignObject>section :is(h4,marp-h4),div#\:\$p>svg>foreignObject>section :is(h5,marp-h5),div#\:\$p>svg>foreignObject>section :is(h6,marp-h6){font-weight:var(--base-text-weight-semibold,600);line-height:1.25;margin-bottom:16px;margin-top:24px}div#\:\$p>svg>foreignObject>section :is(h2,marp-h2){border-bottom:1px solid var(--color-border-muted);font-size:1.5em;padding-bottom:.3em}div#\:\$p>svg>foreignObject>section :is(h2,marp-h2),div#\:\$p>svg>foreignObject>section :is(h3,marp-h3){font-weight:var(--base-text-weight-semibold,600)}div#\:\$p>svg>foreignObject>section :is(h3,marp-h3){font-size:1.25em}div#\:\$p>svg>foreignObject>section :is(h4,marp-h4){font-size:1em}div#\:\$p>svg>foreignObject>section :is(h4,marp-h4),div#\:\$p>svg>foreignObject>section :is(h5,marp-h5){font-weight:var(--base-text-weight-semibold,600)}div#\:\$p>svg>foreignObject>section :is(h5,marp-h5){font-size:.875em}div#\:\$p>svg>foreignObject>section :is(h6,marp-h6){color:var(--color-fg-muted);font-size:.85em;font-weight:var(--base-text-weight-semibold,600)}div#\:\$p>svg>foreignObject>section p{margin-bottom:10px;margin-top:0}div#\:\$p>svg>foreignObject>section blockquote{border-left:.25em solid var(--color-border-default);color:var(--color-fg-muted);margin:0;padding:0 1em}div#\:\$p>svg>foreignObject>section ol,div#\:\$p>svg>foreignObject>section ul{margin-bottom:0;margin-top:0;padding-left:2em}div#\:\$p>svg>foreignObject>section ol ol,div#\:\$p>svg>foreignObject>section ul ol{list-style-type:lower-roman}div#\:\$p>svg>foreignObject>section ol ol ol,div#\:\$p>svg>foreignObject>section ol ul ol,div#\:\$p>svg>foreignObject>section ul ol ol,div#\:\$p>svg>foreignObject>section ul ul ol{list-style-type:lower-alpha}div#\:\$p>svg>foreignObject>section dd{margin-left:0}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre),div#\:\$p>svg>foreignObject>section code,div#\:\$p>svg>foreignObject>section samp,div#\:\$p>svg>foreignObject>section tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre){word-wrap:normal;margin-bottom:0;margin-top:0}div#\:\$p>svg>foreignObject>section .octicon{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}div#\:\$p>svg>foreignObject>section input::-webkit-inner-spin-button,div#\:\$p>svg>foreignObject>section input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}div#\:\$p>svg>foreignObject>section:after,div#\:\$p>svg>foreignObject>section:before{ /* content:""; */display:table}div#\:\$p>svg>foreignObject>section:after{clear:both}div#\:\$p>svg>foreignObject>section>:first-child{margin-top:0!important}div#\:\$p>svg>foreignObject>section>:last-child{margin-bottom:0!important}div#\:\$p>svg>foreignObject>section a:not([href]){color:inherit;text-decoration:none}div#\:\$p>svg>foreignObject>section .absent{color:var(--color-danger-fg)}div#\:\$p>svg>foreignObject>section .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}div#\:\$p>svg>foreignObject>section .anchor:focus{outline:none}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre),div#\:\$p>svg>foreignObject>section blockquote,div#\:\$p>svg>foreignObject>section details,div#\:\$p>svg>foreignObject>section dl,div#\:\$p>svg>foreignObject>section ol,div#\:\$p>svg>foreignObject>section p,div#\:\$p>svg>foreignObject>section table,div#\:\$p>svg>foreignObject>section ul{margin-bottom:16px;margin-top:0}div#\:\$p>svg>foreignObject>section blockquote>:first-child{margin-top:0}div#\:\$p>svg>foreignObject>section blockquote>:last-child{margin-bottom:0}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1) .octicon-link,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2) .octicon-link,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3) .octicon-link,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4) .octicon-link,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5) .octicon-link,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6) .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1):hover .anchor,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2):hover .anchor,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3):hover .anchor,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4):hover .anchor,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5):hover .anchor,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6):hover .anchor{text-decoration:none}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1):hover .anchor .octicon-link,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2):hover .anchor .octicon-link,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3):hover .anchor .octicon-link,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4):hover .anchor .octicon-link,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5):hover .anchor .octicon-link,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6):hover .anchor .octicon-link{visibility:visible}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1) code,div#\:\$p>svg>foreignObject>section :is(h1,marp-h1) tt,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2) code,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2) tt,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3) code,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3) tt,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4) code,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4) tt,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5) code,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5) tt,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6) code,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6) tt{font-size:inherit;padding:0 .2em}div#\:\$p>svg>foreignObject>section summary :is(h1,marp-h1),div#\:\$p>svg>foreignObject>section summary :is(h2,marp-h2),div#\:\$p>svg>foreignObject>section summary :is(h3,marp-h3),div#\:\$p>svg>foreignObject>section summary :is(h4,marp-h4),div#\:\$p>svg>foreignObject>section summary :is(h5,marp-h5),div#\:\$p>svg>foreignObject>section summary :is(h6,marp-h6){display:inline-block}div#\:\$p>svg>foreignObject>section summary :is(h1,marp-h1) .anchor,div#\:\$p>svg>foreignObject>section summary :is(h2,marp-h2) .anchor,div#\:\$p>svg>foreignObject>section summary :is(h3,marp-h3) .anchor,div#\:\$p>svg>foreignObject>section summary :is(h4,marp-h4) .anchor,div#\:\$p>svg>foreignObject>section summary :is(h5,marp-h5) .anchor,div#\:\$p>svg>foreignObject>section summary :is(h6,marp-h6) .anchor{margin-left:-40px}div#\:\$p>svg>foreignObject>section summary :is(h1,marp-h1),div#\:\$p>svg>foreignObject>section summary :is(h2,marp-h2){border-bottom:0;padding-bottom:0}div#\:\$p>svg>foreignObject>section ol.no-list,div#\:\$p>svg>foreignObject>section ul.no-list{list-style-type:none;padding:0}div#\:\$p>svg>foreignObject>section ol[type=a]{list-style-type:lower-alpha}div#\:\$p>svg>foreignObject>section ol[type=A]{list-style-type:upper-alpha}div#\:\$p>svg>foreignObject>section ol[type=i]{list-style-type:lower-roman}div#\:\$p>svg>foreignObject>section ol[type=I]{list-style-type:upper-roman}div#\:\$p>svg>foreignObject>section div>ol:not([type]),div#\:\$p>svg>foreignObject>section ol[type="1"]{list-style-type:decimal}div#\:\$p>svg>foreignObject>section ol ol,div#\:\$p>svg>foreignObject>section ol ul,div#\:\$p>svg>foreignObject>section ul ol,div#\:\$p>svg>foreignObject>section ul ul{margin-bottom:0;margin-top:0}div#\:\$p>svg>foreignObject>section li>p{margin-top:16px}div#\:\$p>svg>foreignObject>section li+li{margin-top:.25em}div#\:\$p>svg>foreignObject>section dl{padding:0}div#\:\$p>svg>foreignObject>section dl dt{font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold,600);margin-top:16px;padding:0}div#\:\$p>svg>foreignObject>section dl dd{margin-bottom:16px;padding:0 16px}div#\:\$p>svg>foreignObject>section table th{font-weight:var(--base-text-weight-semibold,600)}div#\:\$p>svg>foreignObject>section table td,div#\:\$p>svg>foreignObject>section table th{border:1px solid var(--color-border-default);padding:6px 13px}div#\:\$p>svg>foreignObject>section table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}div#\:\$p>svg>foreignObject>section table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}div#\:\$p>svg>foreignObject>section table img{background-color:transparent}div#\:\$p>svg>foreignObject>section img[align=right]{padding-left:20px}div#\:\$p>svg>foreignObject>section img[align=left]{padding-right:20px}div#\:\$p>svg>foreignObject>section .emoji{background-color:transparent;max-width:none;vertical-align:text-top}div#\:\$p>svg>foreignObject>section :is(span,marp-span).frame,div#\:\$p>svg>foreignObject>section :is(span,marp-span).frame>:is(span,marp-span){display:block;overflow:hidden}div#\:\$p>svg>foreignObject>section :is(span,marp-span).frame>:is(span,marp-span){border:1px solid var(--color-border-default);float:left;margin:13px 0 0;padding:7px;width:auto}div#\:\$p>svg>foreignObject>section :is(span,marp-span).frame :is(span,marp-span) img{display:block;float:left}div#\:\$p>svg>foreignObject>section :is(span,marp-span).frame :is(span,marp-span) :is(span,marp-span){clear:both;color:var(--color-fg-default);display:block;padding:5px 0 0}div#\:\$p>svg>foreignObject>section :is(span,marp-span).align-center{clear:both;display:block;overflow:hidden}div#\:\$p>svg>foreignObject>section :is(span,marp-span).align-center>:is(span,marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#\:\$p>svg>foreignObject>section :is(span,marp-span).align-center :is(span,marp-span) img{margin:0 auto;text-align:center}div#\:\$p>svg>foreignObject>section :is(span,marp-span).align-right{clear:both;display:block;overflow:hidden}div#\:\$p>svg>foreignObject>section :is(span,marp-span).align-right>:is(span,marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#\:\$p>svg>foreignObject>section :is(span,marp-span).align-right :is(span,marp-span) img{margin:0;text-align:right}div#\:\$p>svg>foreignObject>section :is(span,marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#\:\$p>svg>foreignObject>section :is(span,marp-span).float-left :is(span,marp-span){margin:13px 0 0}div#\:\$p>svg>foreignObject>section :is(span,marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#\:\$p>svg>foreignObject>section :is(span,marp-span).float-right>:is(span,marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#\:\$p>svg>foreignObject>section code,div#\:\$p>svg>foreignObject>section tt{background-color:var(--color-neutral-muted);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em;white-space:break-spaces}div#\:\$p>svg>foreignObject>section code br,div#\:\$p>svg>foreignObject>section tt br{display:none}div#\:\$p>svg>foreignObject>section del code{text-decoration:inherit}div#\:\$p>svg>foreignObject>section samp{font-size:85%}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) code{font-size:100%}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre)>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}div#\:\$p>svg>foreignObject>section .highlight{margin-bottom:16px}div#\:\$p>svg>foreignObject>section .highlight :is(pre,marp-pre){margin-bottom:0;word-break:normal}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre){background-color:var(--color-canvas-subtle);border-radius:6px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) code,div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) tt{word-wrap:normal;background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}div#\:\$p>svg>foreignObject>section .csv-data td,div#\:\$p>svg>foreignObject>section .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}div#\:\$p>svg>foreignObject>section .csv-data .blob-num{background:var(--color-canvas-default);border:0;padding:10px 8px 9px;text-align:right}div#\:\$p>svg>foreignObject>section .csv-data tr{border-top:0}div#\:\$p>svg>foreignObject>section .csv-data th{background:var(--color-canvas-subtle);border-top:0;font-weight:var(--base-text-weight-semibold,600)}div#\:\$p>svg>foreignObject>section [data-footnote-ref]:before{content:"["}div#\:\$p>svg>foreignObject>section [data-footnote-ref]:after{content:"]"}div#\:\$p>svg>foreignObject>section .footnotes{border-top:1px solid var(--color-border-default);color:var(--color-fg-muted);font-size:12px}div#\:\$p>svg>foreignObject>section div#\:\$p>svg>foreignObject>section section.footnotes{--marpit-root-font-size:12px}div#\:\$p>svg>foreignObject>section .footnotes ol{padding-left:16px}div#\:\$p>svg>foreignObject>section .footnotes ol ul{display:inline-block;margin-top:16px;padding-left:16px}div#\:\$p>svg>foreignObject>section .footnotes li{position:relative}div#\:\$p>svg>foreignObject>section .footnotes li:target:before{border:2px solid var(--color-accent-emphasis);border-radius:6px;bottom:-8px;content:"";left:-24px;pointer-events:none;position:absolute;right:-8px;top:-8px}div#\:\$p>svg>foreignObject>section .footnotes li:target{color:var(--color-fg-default)}div#\:\$p>svg>foreignObject>section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#\:\$p>svg>foreignObject>section .pl-c{color:var(--color-prettylights-syntax-comment)}div#\:\$p>svg>foreignObject>section .pl-c1,div#\:\$p>svg>foreignObject>section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#\:\$p>svg>foreignObject>section .pl-e,div#\:\$p>svg>foreignObject>section .pl-en{color:var(--color-prettylights-syntax-entity)}div#\:\$p>svg>foreignObject>section .pl-s .pl-s1,div#\:\$p>svg>foreignObject>section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p>svg>foreignObject>section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p>svg>foreignObject>section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#\:\$p>svg>foreignObject>section .pl-pds,div#\:\$p>svg>foreignObject>section .pl-s,div#\:\$p>svg>foreignObject>section .pl-s .pl-pse .pl-s1,div#\:\$p>svg>foreignObject>section .pl-sr,div#\:\$p>svg>foreignObject>section .pl-sr .pl-cce,div#\:\$p>svg>foreignObject>section .pl-sr .pl-sra,div#\:\$p>svg>foreignObject>section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#\:\$p>svg>foreignObject>section .pl-smw,div#\:\$p>svg>foreignObject>section .pl-v{color:var(--color-prettylights-syntax-variable)}div#\:\$p>svg>foreignObject>section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#\:\$p>svg>foreignObject>section .pl-ii{background-color:var(--color-prettylights-syntax-invalid-illegal-bg);color:var(--color-prettylights-syntax-invalid-illegal-text)}div#\:\$p>svg>foreignObject>section .pl-c2{background-color:var(--color-prettylights-syntax-carriage-return-bg);color:var(--color-prettylights-syntax-carriage-return-text)}div#\:\$p>svg>foreignObject>section .pl-sr .pl-cce{color:var(--color-prettylights-syntax-string-regexp);font-weight:700}div#\:\$p>svg>foreignObject>section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#\:\$p>svg>foreignObject>section .pl-mh,div#\:\$p>svg>foreignObject>section .pl-mh .pl-en,div#\:\$p>svg>foreignObject>section .pl-ms{color:var(--color-prettylights-syntax-markup-heading);font-weight:700}div#\:\$p>svg>foreignObject>section .pl-mi{color:var(--color-prettylights-syntax-markup-italic);font-style:italic}div#\:\$p>svg>foreignObject>section .pl-mb{color:var(--color-prettylights-syntax-markup-bold);font-weight:700}div#\:\$p>svg>foreignObject>section .pl-md{background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}div#\:\$p>svg>foreignObject>section .pl-mi1{background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}div#\:\$p>svg>foreignObject>section .pl-mc{background-color:var(--color-prettylights-syntax-markup-changed-bg);color:var(--color-prettylights-syntax-markup-changed-text)}div#\:\$p>svg>foreignObject>section .pl-mi2{background-color:var(--color-prettylights-syntax-markup-ignored-bg);color:var(--color-prettylights-syntax-markup-ignored-text)}div#\:\$p>svg>foreignObject>section .pl-mdr{color:var(--color-prettylights-syntax-meta-diff-range);font-weight:700}div#\:\$p>svg>foreignObject>section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#\:\$p>svg>foreignObject>section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#\:\$p>svg>foreignObject>section .pl-corl{color:var(--color-prettylights-syntax-constant-other-reference-link);text-decoration:underline}div#\:\$p>svg>foreignObject>section g-emoji{display:inline-block;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal,400);line-height:1;min-width:1ch;vertical-align:-.075em}div#\:\$p>svg>foreignObject>section g-emoji img{height:1em;width:1em}div#\:\$p>svg>foreignObject>section .task-list-item{list-style-type:none}div#\:\$p>svg>foreignObject>section .task-list-item label{font-weight:var(--base-text-weight-normal,400)}div#\:\$p>svg>foreignObject>section .task-list-item.enabled label{cursor:pointer}div#\:\$p>svg>foreignObject>section .task-list-item+.task-list-item{margin-top:4px}div#\:\$p>svg>foreignObject>section .task-list-item .handle{display:none}div#\:\$p>svg>foreignObject>section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#\:\$p>svg>foreignObject>section .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p>svg>foreignObject>section .contains-task-list{position:relative}div#\:\$p>svg>foreignObject>section .contains-task-list:focus-within .task-list-item-convert-container,div#\:\$p>svg>foreignObject>section .contains-task-list:hover .task-list-item-convert-container{clip:auto;display:block;height:24px;overflow:visible;width:auto}div#\:\$p>svg>foreignObject>section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1){color:var(--h1-color);font-size:1.6em}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1),div#\:\$p>svg>foreignObject>section :is(h2,marp-h2){border-bottom:none}div#\:\$p>svg>foreignObject>section :is(h2,marp-h2){font-size:1.3em}div#\:\$p>svg>foreignObject>section :is(h3,marp-h3){font-size:1.1em}div#\:\$p>svg>foreignObject>section :is(h4,marp-h4){font-size:1.05em}div#\:\$p>svg>foreignObject>section :is(h5,marp-h5){font-size:1em}div#\:\$p>svg>foreignObject>section :is(h6,marp-h6){font-size:.9em}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1) strong,div#\:\$p>svg>foreignObject>section :is(h2,marp-h2) strong,div#\:\$p>svg>foreignObject>section :is(h3,marp-h3) strong,div#\:\$p>svg>foreignObject>section :is(h4,marp-h4) strong,div#\:\$p>svg>foreignObject>section :is(h5,marp-h5) strong,div#\:\$p>svg>foreignObject>section :is(h6,marp-h6) strong{color:var(--heading-strong-color);font-weight:inherit}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1)::part(auto-scaling),div#\:\$p>svg>foreignObject>section :is(h2,marp-h2)::part(auto-scaling),div#\:\$p>svg>foreignObject>section :is(h3,marp-h3)::part(auto-scaling),div#\:\$p>svg>foreignObject>section :is(h4,marp-h4)::part(auto-scaling),div#\:\$p>svg>foreignObject>section :is(h5,marp-h5)::part(auto-scaling),div#\:\$p>svg>foreignObject>section :is(h6,marp-h6)::part(auto-scaling){max-height:563px}div#\:\$p>svg>foreignObject>section hr{height:0;padding-top:.25em}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre){border:1px solid var(--color-border-default);line-height:1.15;overflow:visible}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre)::part(auto-scaling){max-height:529px}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-doctag),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-keyword),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-meta .hljs-keyword),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-template-tag),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-template-variable),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-type),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title.class_),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title.class_.inherited__),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-attr),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-attribute),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-literal),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-meta),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-number),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-operator),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-attr),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-class),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-id),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-meta .hljs-string),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-regexp),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-built_in),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-code),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-comment),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-name),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-quote),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-pseudo),div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-section){color:var(--color-prettylights-syntax-markup-heading);font-weight:700}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-emphasis){color:var(--color-prettylights-syntax-markup-italic);font-style:italic}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-strong){color:var(--color-prettylights-syntax-markup-bold);font-weight:700}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-addition){background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}div#\:\$p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-deletion){background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}div#\:\$p>svg>foreignObject>section footer,div#\:\$p>svg>foreignObject>section header{color:var(--header-footer-color);font-size:18px;left:30px;margin:0;position:absolute}div#\:\$p>svg>foreignObject>section header{top:21px}div#\:\$p>svg>foreignObject>section footer{bottom:21px}div#\:\$p>svg>foreignObject>section{--h1-color:#246;--header-footer-color:hsla(0,0%,40%,.75);--heading-strong-color:#48c;--paginate-color:#777;align-items:stretch;display:flex;flex-flow:column nowrap;font-size:29px;height:720px;justify-content:center;padding:78.5px;width:1280px}div#\:\$p>svg>foreignObject>section{--marpit-root-font-size:29px}div#\:\$p>svg>foreignObject>section:where(.invert){--h1-color:#cee7ff;--header-footer-color:hsla(0,0%,60%,.75);--heading-strong-color:#7bf;--paginate-color:#999}div#\:\$p>svg>foreignObject>section>:last-child,div#\:\$p>svg>foreignObject>section[data-footer]>:nth-last-child(2){margin-bottom:0}div#\:\$p>svg>foreignObject>section>:first-child,div#\:\$p>svg>foreignObject>section>header:first-child+*{margin-top:0}div#\:\$p>svg>foreignObject>section:after{bottom:21px;color:var(--paginate-color);font-size:24px;padding:0;position:absolute;right:30px}div#\:\$p>svg>foreignObject>section:after{--marpit-root-font-size:24px}div#\:\$p>svg>foreignObject>section[data-color] :is(h1,marp-h1),div#\:\$p>svg>foreignObject>section[data-color] :is(h2,marp-h2),div#\:\$p>svg>foreignObject>section[data-color] :is(h3,marp-h3),div#\:\$p>svg>foreignObject>section[data-color] :is(h4,marp-h4),div#\:\$p>svg>foreignObject>section[data-color] :is(h5,marp-h5),div#\:\$p>svg>foreignObject>section[data-color] :is(h6,marp-h6){color:currentcolor}div#\:\$p>svg>foreignObject>section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em} -/* @theme cr */div#\:\$p>svg>foreignObject>section{background-image:url('./logo.svg');background-repeat:no-repeat;background-position:right calc(var(--marpit-root-font-size, 1rem) * 2) bottom calc(var(--marpit-root-font-size, 1rem) * 0.6);background-size:12%}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1){color:#828db2;font-size:calc(var(--marpit-root-font-size, 1rem) * 2.1)}div#\:\$p>svg>foreignObject>section :is(h2,marp-h2){background-color:#828db2;color:#fff;padding:calc(var(--marpit-root-font-size, 1rem) * 0.3);font-size:calc(var(--marpit-root-font-size, 1rem) * 2.1)}div#\:\$p>svg>foreignObject>section p{font-size:calc(var(--marpit-root-font-size, 1rem) * 1.3)}div#\:\$p>svg>foreignObject>section ol,div#\:\$p>svg>foreignObject>section ul{font-size:calc(var(--marpit-root-font-size, 1rem) * 1.2)}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content],div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#\:\$p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}
+/* @theme cr */div#\:\$p>svg>foreignObject>section{background-image:url('./logo.svg');background-repeat:no-repeat;background-position:right calc(var(--marpit-root-font-size, 1rem) * 2) bottom calc(var(--marpit-root-font-size, 1rem) * 0.6);background-size:12%}div#\:\$p>svg>foreignObject>section :is(h1,marp-h1){color:#828db2;font-size:calc(var(--marpit-root-font-size, 1rem) * 2.1)}div#\:\$p>svg>foreignObject>section :is(h2,marp-h2){background-color:#828db2;color:#fff;padding:calc(var(--marpit-root-font-size, 1rem) * 0.3);font-size:calc(var(--marpit-root-font-size, 1rem) * 2.1)}div#\:\$p>svg>foreignObject>section p{font-size:calc(var(--marpit-root-font-size, 1rem) * 1.3)}div#\:\$p>svg>foreignObject>section ol,div#\:\$p>svg>foreignObject>section ul{font-size:calc(var(--marpit-root-font-size, 1rem) * 1.2)}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=content],div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#\:\$p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#\:\$p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}

Gears OSのファイルシステムとDB

琉球大学 理工学研究科 知能情報プログラム
河野研究室

-

又吉 雄斗, 佐野 巧曜, 河野 真治

+

又吉 雄斗, 佐野 巧曜, 河野 真治

-
-

研究目的

+
+

システム全体の信頼性を上げたい

+
    +
  • システムの構成要素全体の信頼性を上げる必要がある +
      +
    • アプリケーション
    • +
    • OS
    • +
    • ファイルシステム
    • +
    • DB
    • +
    • メモリとSSD
    • +
    • 分散ノード
    • +
    • ネットワーク
    • +
    +
  • +
+
+
+

Gears OSを使って実現する

+
    +
  • CodeGear
      -
    • アプリケーションの信頼性を保証するために,
      -アプリケーションが動作するOSの信頼性を高める必要がある
    • -
    • 信頼性確保の方法として定理証明やモデル検査がある
    • -
    • 当研究室では,信頼性の保証を目的としたGears OSを開発している
    • -
    • 証明や検証を容易に行えるよう,ファイルシステムのシンプルな実装を考えたい
    • +
    • 処理の単位
    • +
    +
  • +
  • DataGear +
      +
    • データの単位
    • +
    +
  • +
  • metaGear +
      +
    • データの整合性
    • +
    • 資源管理
    • +
    +
  • +
+
+
+

信頼性を上げる方法

+
    +
  • 証明 +
      +
    • GearsAgdaを使ってinvariantを証明する
    • +
    +
  • +
  • テスト
  • +
  • モデル検査
  • +
  • システムの構成要素全体にこれらの方法を適用したい
-
-

RedBlackTreeを用いたFSの構築

+
+

FSとDBの要素をRBTreeに対応させる

+
    +
  • ファイルシステムとDBをRedBlackTreeで統一する +
      +
    • 信頼性向上のために必要なDBの仕組み
    • +
    • データ持続性に必要なファイルシステムの仕組み
    • +
    +
  • +
  • RedBlackTreeはinvariantで証明する
      -
    • Gears OSへファイルシステムを実装するにあたり,RedBlackTreeを用いる
    • -
    • DBはファイルシステムと本質的に同じ役割を持っているため,同じRedBlackTreeでDBも表現することが可能であると考える
    • +
    • RedBlackTreeのみのシンプルな実装
    • +
    +
  • +
+
+
+

Continuation based C

+
    +
  • Cの下位言語である
  • +
  • 処理の単位 CodeGear
  • +
  • データの単位 DataGear
  • +
  • ノーマルレベルとメタレベルの切り分け
  • +
  • gotoによる軽量継続
-

Gears OSにおけるファイルシステムの設計を信頼性の向上と, RedBlackTreeのみのシンプルな構造を基軸として考える

+
+
+

CodeGearとmetaCodeGearの関係

+
    +
  • ノーマルレベルとメタレベルの存在
  • +
+

-
-

信頼性の保証を目的としたOS

-

3種類のGears OS

+
+

Context

+
    +
  • Gears OS上全てのCodeGear,DataGearの参照を持つ
  • +
  • OS上の処理の実行単位 +
      +
    • プロセスに相当
    • +
    +
  • +
  • Gearの概念ではmetaDataGearに当たる
  • +
  • ノーマルレベルから直接参照されない +
      +
    • metaCodeGearから参照される
    • +
    +
  • +
+
+
+

3種類のGears OS

  • GearsAgda(Agda)
      @@ -57,189 +138,310 @@
-
-

Gears OS(CbC x.v6)

-
    -
  • 当研究室にて,信頼性と拡張性の両立を目的として開発している
  • -
  • CbCで記述されている
  • -
  • Gearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ
  • -
  • ノーマルレベルとメタレベルの処理を切り分けることが容易にできる
  • -
-
-
-

CodeGearとmetaCodeGearの関係

-

ノーマルレベルとメタレベルの存在

-
    -
  • CodeGearがDataGearを受け取り,処理後にDataGearを次のCodeGearに渡すという動作をしているように見える
  • -
  • 実際にはデータの整合性の確認や資源管理などのメタレベルの処理が存在し,それらの計算はMetaCodeGearで行われる
  • -
-
-
-

CodeGearとmetaCodeGearの関係

-

-
-
-

Context

-
    -
  • Gears OS上全てのCodeGear,DataGearの参照を持つ
  • -
  • OS上の処理の実行単位
  • -
  • Gearの概念ではMetaDataGearに当たる
  • -
  • ノーマルレベルから直接参照されず,必ずMetaDataGearとしてMetaCodeGearから参照される
  • -
-
-
+

CodeGear遷移の流れ

-
-

非破壊的なRedBlackTree

+
+

ファイルシステムとDB

+
    +
  • 両方ともRedBlackTreeで実装する
      -
    • Gears OSにおける永続データは非破壊的な編集を行うRedBlackTreeを用いて保存する
    • -
    • ディレクトリシステム自体にバックアップの機能を搭載することが可能と考える
    • +
    • 本質的な役割は一緒
    • +
    • 信頼性の向上
    • +
    • 証明のしやすさ
    • +
    +
  • +
  • 非破壊Tree +
      +
    • データの持続性
    • +
    +
-
-

非破壊的なRedBlackTree

+
+

非破壊的なRedBlackTree

-
-

ディスク上とメモリ上のデータ構造

+
+

RedBlackTreeはDBのテーブル

    -
  • ディスク上とメモリ上でデータの構造は,RedBlackTreeに統一する
  • -
  • ブロックアクセス数の観点ではRedBlackTreeはB-Treeに劣る
  • -
  • しかしながら,SSDはランダムアクセスによってデータにアクセスするため,RedBlackTreeでなくB-Treeを用いる利点は少ないと考える
  • -
  • データ構造を統一することで,ディスク上とメモリ上のデータのやりとりは単純なコピーで実装できる
  • +
  • テーブルのキーがRedBlackTreeのkey
  • +
  • トランザクションはテーブルのルートの置き換え
  • +
  • 複数の書き込みポイント
-
-

データのロールバックとバックアップ

+
+

データの持続性

    -
  • RDBのロールバックは,コミットするまではトランザクションの開始時点に戻ることができる機能を持つ
  • -
  • ロールバックはコミットが完了するとそれ以前の状態に戻すことはできないが,データのバックアップをとっておくことで復元を行う
  • -
  • このような,ロールバックとバックアップの仕組みをファイルシステムに実装したい
  • +
  • オンメモリーなRedBlackTree
  • +
  • SSD上のコピー +
      +
    • ログ的にコピーしていく
    • +
    • +
    • Copying GC
    -
-
-

データのロールバックとバックアップ

-
    -
  • RedBlackTreeのルートノードがデータのバージョンの役割を果たしていることを利用する
  • -
  • 非破壊的なTree編集はアップデートのたびに,ルートノードを増やす
  • -
  • つまり,ルートノードはアップデートのログと言えその時点のデータのバージョンを表していると考えることができる
  • -
  • よって,ロールバックを行いたい場合は参照を過去のルートノードに切り替える
  • +
-
-

データのロールバックとバックアップ

+
+

スキーマ

    -
  • ルートノードはデータのアップデート時に増えるため,データが際限なく増加していく問題がある
  • -
  • この問題はCopyingGCを行うことによって解決する
  • -
  • まず,RedBlackTreeを丸ごとコピーして最新のルートを残して他のルートは削除する
  • -
  • その後,コピーしたものはバックアップないしログとしてディスクに書き込む
  • -
  • データの増加によるリソースの枯渇を防ぎ,かつデータのログ付きバックアップを作成することで信頼性の向上が期待できる
  • +
  • DBの各テーブルのレコードの型定義
  • +
  • Contextに登録されているDataGearの型
  • +
  • キーを用いたDataGearの参照
-
-

トランザクション

+
+

インピーダンスミスマッチ

+
    +
  • プログラムで使用するデータ構造
      -
    • トランザクションはDBの重要な機能の一つである
    • -
    • データの競合を防ぎ信頼性を向上させるために,トランザクションの仕組みを考える必要がある
    • -
    • ファイルシステムは全てRedBlackTreeで実装するため,RedBlackTreeのノードに対するトランザクションを考える
    • -
    • トランザクションをwriteとreadに分けて考える
    • +
    • queue
    • +
    • stack
    • +
    +
  • +
  • DBにはリストやキューは入らない +
      +
    • 第一正規系でないから
    • +
    +
  • +
  • データ構造を持続的にしたい +
      +
    • なのでファイルシステムが必要
    • +
    +
-
-

トランザクション

-

writeする場合

+
+

RedBlackTreeベースのファイルシステム

+
    +
  • i-node番号をkeyにする
  • +
  • inodeにはDGのリストが入る
  • +
  • 持続性
      -
    • トランザクションはRedBlackTreeのルートの置き換えと対応する
    • -
    • writeするために,まずルートを生やし書き込みが終わった後ルートを置き換える
    • -
    • ルートの置き換えは競合的なので,複数プロセスから同時に書き込みを行っても1つしか成功しない
    • -
    • 単一のRedBlackTreeに複数の書き込みポイントを作り,並行実行可能にする必要がある
    • +
    • オンメモリーなRedBlackTree
    • +
    • SSD上のコピー +
        +
      • ログ的にコピーしていく
      • +
      +
    • +
    +
-
-

トランザクション

-

複数の書き込みポイント

+
+

バックアップとロールバック

    -
  • RedBlackTreeに複数の書き込みポイントを作るために,キーごとのルートを作成する
  • -
  • ノードはそれぞれがキーとRedBlackTreeを持つ状態になる
  • -
  • writeする際は,そのキーのルートを置き換える
  • +
  • ロールバックの必要性 +
      +
    • トランザクションの失敗
    • +
    • システムクラッシュ
    -
-
-

トランザクション

+ +
  • SSDのログからロールバックする
      -
    • Aの木はファイルシステム全体を表すRedBlackTreeである
    • -
    • ノードNのデータに対して書き込みすることを考える
    • -
    • キーがaであるBの木のルートからロックしCの木を作成して,Bの木からCの木のルートに入れ替えることで書き込みを行う
    • +
    • Copying GCによるバックアップ
    • +
    • ルートノードがデータのバージョン
    • +
    +
  • -
    -

    トランザクション

    -

    readする場合

    +
    +

    構成要素

    +
      +
    • すべてRedBlackTreeで構成されている
        -
      • readはデータに変更を加えないため,複数同時に同じノードを読み込むことが可能である
      • -
      • しかし,常に最新の情報を読み込めるとは限らない
      • -
      • 最新の情報が欲しい場合は書き込みを一旦止めるような処理が必要になる
      • +
      • 検証はRedBlackTreeだけで良い
      • +
      • invariantで証明する
      • +
      +
    • +
    • RedBlackTreeによる権限の表現 +
        +
      • metaDGで行う
      • +
      • ContextからアクセスできるRedBlackTreeがある
      • +
      +
    -
    -

    ファイルシステムにおけるスキーマ

    +
    +

    信頼性の保証

    +
      +
    • RedBlackTreeの変更の正しさ
    • +
    • トランザクションの正しさ
    • +
    • アクセス権限の正しさ
    • +
    • SSDへのコピーの正しさ
    • +
    • ポータビリティ
        -
      • Gears OSのデータは全てDataGearで表されるため,Gears OSにおけるファイルシステムはDataGearの集合となる
      • -
      • Gears OSにおけるスキーマとはDataGear上のキーの構成であることがわかる
      • -
      • 今回のRedBlackTreeによる構成の場合,キーはRedBlackTreeを指す
      • -
      • KernelのContext上にキーを用いたDataGearの参照を書き込む
      • +
      • 異なる計算機アーキテクチャ
      • +
      • 異なるエンコード
      • +
      • 異なる分散ノード
      • +
      +
    • +
    • 正しくスキーマに対応しているかどうか +
        +
      • 違反しても良い
      • +
      +
    -
    -

    権限の表現

    +
    +

    今後の課題

    +
      +
    • データクエリ言語
        -
      • ファイルの権限はファイルシステムの重要な機能の一つである
      • -
      • 今回のRedBlackTreeによる構成の場合,木のルートの所持者を設定することがファイルに対して権限を設定することにあたる
      • -
      • ルートに対してアクセスする権限がなければ,読み書きができないといった実装になると考える
      • +
      • SQL
      • +
      • SQLより良いものが欲しい +
          +
        • ファイルシステムとDBの両方で使える
        • +
        +
      -
    -
    -

    今後の課題・展望

    + +
  • 時系列データ
      -
    • データクエリ言語
    • -
    • 時系列データ
    • -
    • スタンドアロンDB
    • +
    • データ圧縮
    • +
    +
  • +
  • スタンドアロンなDB +
      +
    • ポータビリティ
    • +
    +
  • スピーカーノート

    ## ファイルシステムにおけるスキーマ +

    スピーカーノート

    - CodeGearがDataGearを受け取り,処理後にDataGearを次のCodeGearに渡すという動作をしているように見える +- 実際にはデータの整合性の確認や資源管理などのメタレベルの処理が存在し,それらの計算はMetaCodeGearで行われる

    ## RedBlackTreeを用いたFSの構築 + +- Gears OSへファイルシステムを実装するにあたり,RedBlackTreeを用いる +- DBはファイルシステムと本質的に同じ役割を持っているため,同じRedBlackTreeでDBも表現することが可能であると考える + +### Gears OSにおけるDBの機能を持ち合わせたファイルシステムの設計を</br>信頼性の向上と, RedBlackTreeのみのシンプルな構造を基軸として考える + + +--- + +## 非破壊的なRedBlackTree + +- Gears OSにおける永続データは非破壊的な編集を行うRedBlackTreeを用いて保存する +- ディレクトリシステム自体にバックアップの機能を搭載することが可能と考える + +--- + +## 非破壊的なRedBlackTree + +![w:1100](figs/nondestructive_tree_modification.png) + +--- + +## ディスク上とメモリ上のデータ構造 + +- ディスク上とメモリ上でデータの構造は,RedBlackTreeに統一する +- ブロックアクセス数の観点ではRedBlackTreeはB-Treeに劣る +- しかしながら,SSDはランダムアクセスによってデータにアクセスするため,RedBlackTreeでなくB-Treeを用いる利点は少ないと考える +- データ構造を統一することで,ディスク上とメモリ上のデータのやりとりは単純なコピーで実装できる + +--- + +## データのロールバックとバックアップ + +- RDBのロールバックは,コミットするまではトランザクションの開始時点に戻ることができる機能を持つ +- ロールバックはコミットが完了するとそれ以前の状態に戻すことはできないが,データのバックアップをとっておくことで復元を行う +- このような,ロールバックとバックアップの仕組みをファイルシステムに実装したい + +--- + +## データのロールバックとバックアップ + +- RedBlackTreeのルートノードがデータのバージョンの役割を果たしていることを利用する +- 非破壊的なTree編集はアップデートのたびに,ルートノードを増やす +- つまり,ルートノードはアップデートのログと言えその時点のデータのバージョンを表していると考えることができる +- よって,ロールバックを行いたい場合は参照を過去のルートノードに切り替える + +--- + +## データのロールバックとバックアップ -- 従来のRDBのようなスキーマが存在すると,個別にバックアップなどを取らない限りスキーマの変更以前にロールバックすることができない. -- しかしながら,実際運用する上でスキーマを変更することは多々ある. -- これは,データの信頼性を低下させると考える. +- ルートノードはデータのアップデート時に増えるため,データが際限なく増加していく問題がある +- この問題はCopyingGCを行うことによって解決する +- まず,RedBlackTreeを丸ごとコピーして最新のルートを残して他のルートは削除する +- その後,コピーしたものはバックアップないしログとしてディスクに書き込む +- データの増加によるリソースの枯渇を防ぎ,かつデータのログ付きバックアップを作成することで信頼性の向上が期待できる + +--- + +## トランザクション + +- トランザクションはDBの重要な機能の一つである +- データの競合を防ぎ信頼性を向上させるために,トランザクションの仕組みを考える必要がある +- ファイルシステムは全てRedBlackTreeで実装するため,RedBlackTreeのノードに対するトランザクションを考える +- トランザクションをwriteとreadに分けて考える + +--- + +## トランザクション + +### writeする場合 + +- トランザクションはRedBlackTreeのルートの置き換えと対応する +- writeするために,まずルートを生やし書き込みが終わった後ルートを置き換える +- ルートの置き換えは競合的なので,複数プロセスから同時に書き込みを行っても1つしか成功しない +- 単一のRedBlackTreeに複数の書き込みポイントを作り,並行実行可能にする必要がある + +--- + +## トランザクション + +### 複数の書き込みポイント + +- RedBlackTreeに複数の書き込みポイントを作るために,キーごとのルートを作成する +- ノードはそれぞれがキーとRedBlackTreeを持つ状態になる +- writeする際は,そのキーのルートを置き換える + + +--- + +## トランザクション + +- Aの木はファイルシステム全体を表すRedBlackTreeである +- ノードNのデータに対して書き込みすることを考える +- キーがaであるBの木のルートからロックしCの木を作成して,Bの木からCの木のルートに入れ替えることで書き込みを行う + +![bg right:45% 65%](figs/transaction.svg) + +--- + +## トランザクション + +### readする場合 + +- readはデータに変更を加えないため,複数同時に同じノードを読み込むことが可能である +- しかし,常に最新の情報を読み込めるとは限らない +- 最新の情報が欲しい場合は書き込みを一旦止めるような処理が必要になる --- ## ファイルシステムにおけるスキーマ -- DB上のデータ構造とプログラム上で扱うデータ構造に差が生まれるインピーダンスミスマッチが発生し,DBのデータをプログラムが扱う際に -その差を埋めるような変換を必要とする場合が生まれる +- Gears OSのデータは全てDataGearで表されるため,Gears OSにおけるファイルシステムはDataGearの集合となる +- Gears OSにおけるスキーマとはDataGear上のキーの構成であることがわかる +- 今回のRedBlackTreeによる構成の場合,キーはRedBlackTreeを指す +- KernelのContext上にキーを用いたDataGearの参照を書き込む --- -## ファイルシステムにおけるスキーマ +## 権限の表現 -一方で,スキーマがあることによってデータに対して高度な操作を行うことができ, -また,インデックスを容易に作成することができるといったメリットがある. -よって,スキーマフルなDBとスキーマレスなDBはそれぞれメリットデメリットがあり, -状況によって使い分けるのが良いと考える. +- ファイルの権限はファイルシステムの重要な機能の一つである +- 今回のRedBlackTreeによる構成の場合,木のルートの所持者を設定することがファイルに対して権限を設定することにあたる +- ルートに対してアクセスする権限がなければ,読み書きができないといった実装になると考える --- -## ファイルシステムにおけるスキーマ +## 今後の課題・展望 -今回は,非構造化データ内であれば構造化データを扱うことが可能であることと, -信頼性を保証したいという点から, -スキーマレスなDBとしてのファイルシステムを考える. -しかしながら,トランザクションの仕組みを作る上でRedBlackTreeに対し, -キーを設定することから完全なスキーマレスとは言えない構成となる. - ----

    \ No newline at end of file diff -r 2e2ddc184572 -r efea60e8455a marp-slide/slide.md --- a/marp-slide/slide.md Sat May 13 16:03:48 2023 +0900 +++ b/marp-slide/slide.md Sat May 13 16:14:45 2023 +0900 @@ -55,7 +55,10 @@ ## FSとDBの要素をRBTreeに対応させる - ファイルシステムとDBをRedBlackTreeで統一する + - 信頼性向上のために必要なDBの仕組み + - データ持続性に必要なファイルシステムの仕組み - RedBlackTreeはinvariantで証明する + - RedBlackTreeのみのシンプルな実装 --- @@ -137,6 +140,7 @@ - オンメモリーなRedBlackTree - SSD上のコピー - ログ的にコピーしていく + - - Copying GC ---