');mask-image:url('data:image/svg+xml;charset=utf-8,');width:16px}.markdown-module--markdown_body--eb520 details,.markdown-module--markdown_body--eb520 figcaption,.markdown-module--markdown_body--eb520 figure{display:block}.markdown-module--markdown_body--eb520 summary{display:list-item}.markdown-module--markdown_body--eb520 [hidden]{display:none!important}.markdown-module--markdown_body--eb520 a{background-color:transparent;color:#58a6ff;text-decoration:none}.markdown-module--markdown_body--eb520 a:active,.markdown-module--markdown_body--eb520 a:hover{outline-width:0}.markdown-module--markdown_body--eb520 abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-module--markdown_body--eb520 b,.markdown-module--markdown_body--eb520 strong{font-weight:600}.markdown-module--markdown_body--eb520 dfn{font-style:italic}.markdown-module--markdown_body--eb520 h1{border-bottom:1px solid #21262d;font-size:2em;font-weight:600;margin:.67em 0;padding-bottom:.3em}.markdown-module--markdown_body--eb520 mark{background-color:rgba(187,128,9,.15);color:#c9d1d9}.markdown-module--markdown_body--eb520 small{font-size:90%}.markdown-module--markdown_body--eb520 sub,.markdown-module--markdown_body--eb520 sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-module--markdown_body--eb520 sub{bottom:-.25em}.markdown-module--markdown_body--eb520 sup{top:-.5em}.markdown-module--markdown_body--eb520 code,.markdown-module--markdown_body--eb520 kbd,.markdown-module--markdown_body--eb520 pre,.markdown-module--markdown_body--eb520 samp{font-family:liberation_mono,monospace,monospace;font-size:1em}.markdown-module--markdown_body--eb520 figure{margin:1em 40px}.markdown-module--markdown_body--eb520 hr{background:transparent;background-color:#30363d;border:0;box-sizing:content-box;height:.25em;margin:24px 0;overflow:hidden;padding:0}.markdown-module--markdown_body--eb520 input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}.markdown-module--markdown_body--eb520 [type=button],.markdown-module--markdown_body--eb520 [type=reset],.markdown-module--markdown_body--eb520 [type=submit]{-webkit-appearance:button}.markdown-module--markdown_body--eb520 [type=button]::-moz-focus-inner,.markdown-module--markdown_body--eb520 [type=reset]::-moz-focus-inner,.markdown-module--markdown_body--eb520 [type=submit]::-moz-focus-inner{border-style:none;padding:0}.markdown-module--markdown_body--eb520 [type=button]:-moz-focusring,.markdown-module--markdown_body--eb520 [type=reset]:-moz-focusring,.markdown-module--markdown_body--eb520 [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.markdown-module--markdown_body--eb520 [type=checkbox],.markdown-module--markdown_body--eb520 [type=radio]{box-sizing:border-box;padding:0}.markdown-module--markdown_body--eb520 [type=number]::-webkit-inner-spin-button,.markdown-module--markdown_body--eb520 [type=number]::-webkit-outer-spin-button{height:auto}.markdown-module--markdown_body--eb520 [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.markdown-module--markdown_body--eb520 [type=search]::-webkit-search-cancel-button,.markdown-module--markdown_body--eb520 [type=search]::-webkit-search-decoration{-webkit-appearance:none}.markdown-module--markdown_body--eb520 ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-module--markdown_body--eb520 ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown-module--markdown_body--eb520 a:hover{text-decoration:underline}.markdown-module--markdown_body--eb520 hr:before{content:"";display:table}.markdown-module--markdown_body--eb520 hr:after{clear:both;content:"";display:table}.markdown-module--markdown_body--eb520 table{border-collapse:collapse;border-spacing:0;display:block;max-width:100%;overflow:auto;width:-webkit-max-content;width:max-content}.markdown-module--markdown_body--eb520 td,.markdown-module--markdown_body--eb520 th{padding:0}.markdown-module--markdown_body--eb520 details summary{cursor:pointer}.markdown-module--markdown_body--eb520 details:not([open])>:not(summary){display:none!important}.markdown-module--markdown_body--eb520 kbd{background-color:#161b22;border:1px solid hsla(215,8%,47%,.4);border-radius:6px;box-shadow:inset 0 -1px 0 hsla(215,8%,47%,.4);color:#c9d1d9;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}.markdown-module--markdown_body--eb520 h1,.markdown-module--markdown_body--eb520 h2,.markdown-module--markdown_body--eb520 h3,.markdown-module--markdown_body--eb520 h4,.markdown-module--markdown_body--eb520 h5,.markdown-module--markdown_body--eb520 h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-module--markdown_body--eb520 h2{border-bottom:1px solid #21262d;font-size:1.5em;font-weight:600;padding-bottom:.3em}.markdown-module--markdown_body--eb520 h3{font-size:1.25em;font-weight:600}.markdown-module--markdown_body--eb520 h4{font-size:1em;font-weight:600}.markdown-module--markdown_body--eb520 h5{font-size:.875em;font-weight:600}.markdown-module--markdown_body--eb520 h6{color:#8b949e;font-size:.85em;font-weight:600}.markdown-module--markdown_body--eb520 p{margin-bottom:10px;margin-top:0}.markdown-module--markdown_body--eb520 blockquote{border-left:.25em solid #30363d;color:#8b949e;margin:0;padding:0 1em}.markdown-module--markdown_body--eb520 ol,.markdown-module--markdown_body--eb520 ul{margin-bottom:0;margin-top:0;padding-left:2em}.markdown-module--markdown_body--eb520 ol ol,.markdown-module--markdown_body--eb520 ul ol{list-style-type:lower-roman}.markdown-module--markdown_body--eb520 ol ol ol,.markdown-module--markdown_body--eb520 ol ul ol,.markdown-module--markdown_body--eb520 ul ol ol,.markdown-module--markdown_body--eb520 ul ul ol{list-style-type:lower-alpha}.markdown-module--markdown_body--eb520 dd{margin-left:0}.markdown-module--markdown_body--eb520 code,.markdown-module--markdown_body--eb520 pre,.markdown-module--markdown_body--eb520 tt{font-family:liberation_mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-module--markdown_body--eb520 pre{word-wrap:normal;margin-bottom:0;margin-top:0}.markdown-module--markdown_body--eb520 .markdown-module--octicon--78f14{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}.markdown-module--markdown_body--eb520 ::placeholder{color:#484f58;opacity:1}.markdown-module--markdown_body--eb520 input::-webkit-inner-spin-button,.markdown-module--markdown_body--eb520 input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.markdown-module--markdown_body--eb520 .markdown-module--pl-c--90eb6{color:#8b949e}.markdown-module--markdown_body--eb520 .markdown-module--pl-c1--b216a,.markdown-module--markdown_body--eb520 .markdown-module--pl-s--00e05 .markdown-module--pl-v--a4f40{color:#79c0ff}.markdown-module--markdown_body--eb520 .markdown-module--pl-e--7e9aa,.markdown-module--markdown_body--eb520 .markdown-module--pl-en--7bdcb{color:#d2a8ff}.markdown-module--markdown_body--eb520 .markdown-module--pl-s--00e05 .markdown-module--pl-s1--2d554,.markdown-module--markdown_body--eb520 .markdown-module--pl-smi--cea59{color:#c9d1d9}.markdown-module--markdown_body--eb520 .markdown-module--pl-ent--06629{color:#7ee787}.markdown-module--markdown_body--eb520 .markdown-module--pl-k--6adde{color:#ff7b72}.markdown-module--markdown_body--eb520 .markdown-module--pl-pds--d32b8,.markdown-module--markdown_body--eb520 .markdown-module--pl-s--00e05,.markdown-module--markdown_body--eb520 .markdown-module--pl-s--00e05 .markdown-module--pl-pse--406e6 .markdown-module--pl-s1--2d554,.markdown-module--markdown_body--eb520 .markdown-module--pl-sr--93f62,.markdown-module--markdown_body--eb520 .markdown-module--pl-sr--93f62 .markdown-module--pl-cce--c4600,.markdown-module--markdown_body--eb520 .markdown-module--pl-sr--93f62 .markdown-module--pl-sra--2d34e,.markdown-module--markdown_body--eb520 .markdown-module--pl-sr--93f62 .markdown-module--pl-sre--0de45{color:#a5d6ff}.markdown-module--markdown_body--eb520 .markdown-module--pl-smw--69a5a,.markdown-module--markdown_body--eb520 .markdown-module--pl-v--a4f40{color:#ffa657}.markdown-module--markdown_body--eb520 .markdown-module--pl-bu--7662b{color:#f85149}.markdown-module--markdown_body--eb520 .markdown-module--pl-ii--82dcf{background-color:#8e1519;color:#f0f6fc}.markdown-module--markdown_body--eb520 .markdown-module--pl-c2--6a86d{background-color:#b62324;color:#f0f6fc}.markdown-module--markdown_body--eb520 .markdown-module--pl-sr--93f62 .markdown-module--pl-cce--c4600{color:#7ee787;font-weight:700}.markdown-module--markdown_body--eb520 .markdown-module--pl-ml--a8965{color:#f2cc60}.markdown-module--markdown_body--eb520 .markdown-module--pl-mh--01678,.markdown-module--markdown_body--eb520 .markdown-module--pl-mh--01678 .markdown-module--pl-en--7bdcb,.markdown-module--markdown_body--eb520 .markdown-module--pl-ms--f3381{color:#1f6feb;font-weight:700}.markdown-module--markdown_body--eb520 .markdown-module--pl-mi--fa833{color:#c9d1d9;font-style:italic}.markdown-module--markdown_body--eb520 .markdown-module--pl-mb--87573{color:#c9d1d9;font-weight:700}.markdown-module--markdown_body--eb520 .markdown-module--pl-md--e0a1e{background-color:#67060c;color:#ffdcd7}.markdown-module--markdown_body--eb520 .markdown-module--pl-mi1--f8fb2{background-color:#033a16;color:#aff5b4}.markdown-module--markdown_body--eb520 .markdown-module--pl-mc--c6d4a{background-color:#5a1e02;color:#ffdfb6}.markdown-module--markdown_body--eb520 .markdown-module--pl-mi2--548ba{background-color:#1158c7;color:#c9d1d9}.markdown-module--markdown_body--eb520 .markdown-module--pl-mdr--c0e41{color:#d2a8ff;font-weight:700}.markdown-module--markdown_body--eb520 .markdown-module--pl-ba--8ce22{color:#8b949e}.markdown-module--markdown_body--eb520 .markdown-module--pl-sg--24057{color:#484f58}.markdown-module--markdown_body--eb520 .markdown-module--pl-corl--3c642{color:#a5d6ff;text-decoration:underline}.markdown-module--markdown_body--eb520 [data-catalyst]{display:block}.markdown-module--markdown_body--eb520 g-emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:400;line-height:1;vertical-align:-.075em}.markdown-module--markdown_body--eb520 g-emoji img{height:1em;width:1em}.markdown-module--markdown_body--eb520:before{content:"";display:table}.markdown-module--markdown_body--eb520:after{clear:both;content:"";display:table}.markdown-module--markdown_body--eb520>:first-child{margin-top:0!important}.markdown-module--markdown_body--eb520>:last-child{margin-bottom:0!important}.markdown-module--markdown_body--eb520 a:not([href]){color:inherit;text-decoration:none}.markdown-module--markdown_body--eb520 .markdown-module--absent--105d2{color:#f85149}.markdown-module--markdown_body--eb520 .markdown-module--anchor--c327e{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-module--markdown_body--eb520 .markdown-module--anchor--c327e:focus{outline:none}.markdown-module--markdown_body--eb520 blockquote,.markdown-module--markdown_body--eb520 details,.markdown-module--markdown_body--eb520 dl,.markdown-module--markdown_body--eb520 ol,.markdown-module--markdown_body--eb520 p,.markdown-module--markdown_body--eb520 pre,.markdown-module--markdown_body--eb520 table,.markdown-module--markdown_body--eb520 ul{margin-bottom:16px;margin-top:0}.markdown-module--markdown_body--eb520 blockquote>:first-child{margin-top:0}.markdown-module--markdown_body--eb520 blockquote>:last-child{margin-bottom:0}.markdown-module--markdown_body--eb520 sup>a:before{content:"["}.markdown-module--markdown_body--eb520 sup>a:after{content:"]"}.markdown-module--markdown_body--eb520 h1 .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h2 .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h3 .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h4 .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h5 .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h6 .markdown-module--octicon-link--dc394{color:#c9d1d9;vertical-align:middle;visibility:hidden}.markdown-module--markdown_body--eb520 h1:hover .markdown-module--anchor--c327e,.markdown-module--markdown_body--eb520 h2:hover .markdown-module--anchor--c327e,.markdown-module--markdown_body--eb520 h3:hover .markdown-module--anchor--c327e,.markdown-module--markdown_body--eb520 h4:hover .markdown-module--anchor--c327e,.markdown-module--markdown_body--eb520 h5:hover .markdown-module--anchor--c327e,.markdown-module--markdown_body--eb520 h6:hover .markdown-module--anchor--c327e{text-decoration:none}.markdown-module--markdown_body--eb520 h1:hover .markdown-module--anchor--c327e .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h2:hover .markdown-module--anchor--c327e .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h3:hover .markdown-module--anchor--c327e .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h4:hover .markdown-module--anchor--c327e .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h5:hover .markdown-module--anchor--c327e .markdown-module--octicon-link--dc394,.markdown-module--markdown_body--eb520 h6:hover .markdown-module--anchor--c327e .markdown-module--octicon-link--dc394{visibility:visible}.markdown-module--markdown_body--eb520 h1 code,.markdown-module--markdown_body--eb520 h1 tt,.markdown-module--markdown_body--eb520 h2 code,.markdown-module--markdown_body--eb520 h2 tt,.markdown-module--markdown_body--eb520 h3 code,.markdown-module--markdown_body--eb520 h3 tt,.markdown-module--markdown_body--eb520 h4 code,.markdown-module--markdown_body--eb520 h4 tt,.markdown-module--markdown_body--eb520 h5 code,.markdown-module--markdown_body--eb520 h5 tt,.markdown-module--markdown_body--eb520 h6 code,.markdown-module--markdown_body--eb520 h6 tt{font-size:inherit;padding:0 .2em}.markdown-module--markdown_body--eb520 ol.markdown-module--no-list--5b2a6,.markdown-module--markdown_body--eb520 ul.markdown-module--no-list--5b2a6{list-style-type:none;padding:0}.markdown-module--markdown_body--eb520 ol[type="1"]{list-style-type:decimal}.markdown-module--markdown_body--eb520 ol[type=a]{list-style-type:lower-alpha}.markdown-module--markdown_body--eb520 ol[type=i]{list-style-type:lower-roman}.markdown-module--markdown_body--eb520 div>ol:not([type]){list-style-type:decimal}.markdown-module--markdown_body--eb520 ol ol,.markdown-module--markdown_body--eb520 ol ul,.markdown-module--markdown_body--eb520 ul ol,.markdown-module--markdown_body--eb520 ul ul{margin-bottom:0;margin-top:0}.markdown-module--markdown_body--eb520 li>p{margin-top:16px}.markdown-module--markdown_body--eb520 li+li{margin-top:.25em}.markdown-module--markdown_body--eb520 dl{padding:0}.markdown-module--markdown_body--eb520 dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}.markdown-module--markdown_body--eb520 dl dd{margin-bottom:16px;padding:0 16px}.markdown-module--markdown_body--eb520 table th{font-weight:600}.markdown-module--markdown_body--eb520 table td,.markdown-module--markdown_body--eb520 table th{border:1px solid #30363d;padding:6px 13px}.markdown-module--markdown_body--eb520 table tr{background-color:#0d1117;border-top:1px solid #21262d}.markdown-module--markdown_body--eb520 table tr:nth-child(2n){background-color:#161b22}.markdown-module--markdown_body--eb520 table img{background-color:transparent}.markdown-module--markdown_body--eb520 img[align=right]{padding-left:20px}.markdown-module--markdown_body--eb520 img[align=left]{padding-right:20px}.markdown-module--markdown_body--eb520 .markdown-module--emoji--71079{background-color:transparent;max-width:none;vertical-align:text-top}.markdown-module--markdown_body--eb520 span.markdown-module--frame--3dbaf{display:block;overflow:hidden}.markdown-module--markdown_body--eb520 span.markdown-module--frame--3dbaf>span{border:1px solid #30363d;display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-module--markdown_body--eb520 span.markdown-module--frame--3dbaf span img{display:block;float:left}.markdown-module--markdown_body--eb520 span.markdown-module--frame--3dbaf span span{clear:both;color:#c9d1d9;display:block;padding:5px 0 0}.markdown-module--markdown_body--eb520 span.markdown-module--align-center--f2759{clear:both;display:block;overflow:hidden}.markdown-module--markdown_body--eb520 span.markdown-module--align-center--f2759>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-module--markdown_body--eb520 span.markdown-module--align-center--f2759 span img{margin:0 auto;text-align:center}.markdown-module--markdown_body--eb520 span.markdown-module--align-right--499e4{clear:both;display:block;overflow:hidden}.markdown-module--markdown_body--eb520 span.markdown-module--align-right--499e4>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-module--markdown_body--eb520 span.markdown-module--align-right--499e4 span img{margin:0;text-align:right}.markdown-module--markdown_body--eb520 span.markdown-module--float-left--1de13{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-module--markdown_body--eb520 span.markdown-module--float-left--1de13 span{margin:13px 0 0}.markdown-module--markdown_body--eb520 span.markdown-module--float-right--cdc74{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-module--markdown_body--eb520 span.markdown-module--float-right--cdc74>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-module--markdown_body--eb520 code,.markdown-module--markdown_body--eb520 tt{background-color:hsla(215,8%,47%,.4);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em}.markdown-module--markdown_body--eb520 code br,.markdown-module--markdown_body--eb520 tt br{display:none}.markdown-module--markdown_body--eb520 del code{text-decoration:inherit}.markdown-module--markdown_body--eb520 pre code{font-size:100%}.markdown-module--markdown_body--eb520 pre>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-module--markdown_body--eb520 .markdown-module--highlight--16556{margin-bottom:16px}.markdown-module--markdown_body--eb520 .markdown-module--highlight--16556 pre{margin-bottom:0;word-break:normal}.markdown-module--markdown_body--eb520 .markdown-module--highlight--16556 pre,.markdown-module--markdown_body--eb520 pre{background-color:#161b22;border-radius:6px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-module--markdown_body--eb520 pre code,.markdown-module--markdown_body--eb520 pre tt{word-wrap:normal;background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}.markdown-module--markdown_body--eb520 .markdown-module--csv-data--6c01a td,.markdown-module--markdown_body--eb520 .markdown-module--csv-data--6c01a th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-module--markdown_body--eb520 .markdown-module--csv-data--6c01a .markdown-module--blob-num--d8f3a{background:#0d1117;border:0;padding:10px 8px 9px;text-align:right}.markdown-module--markdown_body--eb520 .markdown-module--csv-data--6c01a tr{border-top:0}.markdown-module--markdown_body--eb520 .markdown-module--csv-data--6c01a th{background:#161b22;border-top:0;font-weight:600}.markdown-module--markdown_body--eb520 .markdown-module--footnotes--0f78e{border-top:1px solid #30363d;color:#8b949e;font-size:12px}.markdown-module--markdown_body--eb520 .markdown-module--footnotes--0f78e ol{padding-left:16px}.markdown-module--markdown_body--eb520 .markdown-module--footnotes--0f78e li{position:relative}.markdown-module--markdown_body--eb520 .markdown-module--footnotes--0f78e li:target:before{border:2px solid #1f6feb;border-radius:6px;bottom:-8px;content:"";left:-24px;pointer-events:none;position:absolute;right:-8px;top:-8px}.markdown-module--markdown_body--eb520 .markdown-module--footnotes--0f78e li:target{color:#c9d1d9}.markdown-module--markdown_body--eb520 .markdown-module--footnotes--0f78e .markdown-module--data-footnote-backref--88bfd g-emoji{font-family:liberation_mono,monospace}.markdown-module--markdown_body--eb520 .markdown-module--task-list-item--66537{list-style-type:none}.markdown-module--markdown_body--eb520 .markdown-module--task-list-item--66537 label{font-weight:400}.markdown-module--markdown_body--eb520 .markdown-module--task-list-item--66537.markdown-module--enabled--3ed7c label{cursor:pointer}.markdown-module--markdown_body--eb520 .markdown-module--task-list-item--66537+.markdown-module--task-list-item--66537{margin-top:3px}.markdown-module--markdown_body--eb520 .markdown-module--task-list-item--66537 .markdown-module--handle--cfbf5{display:none}.markdown-module--markdown_body--eb520 .markdown-module--task-list-item-checkbox--2fa7b{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-module--markdown_body--eb520 .markdown-module--contains-task-list--94ba2:dir(rtl) .markdown-module--task-list-item-checkbox--2fa7b{margin:0 -1.6em .25em .2em}.markdown-module--markdown_body--eb520 ::-webkit-calendar-picker-indicator{filter:invert(50%)}.utils-module--block--dae27,.utils-module--main_block--4b45a{background:#212529;border-radius:3px;display:inline-block;padding:10px 16px}main_block{margin-top:16px}.utils-module--link--f5973{margin-bottom:16px;margin-right:20px;text-decoration:none}.utils-module--link--f5973:hover{background-color:hsla(0,0%,100%,.4)}.utils-module--spacer--54e98{clear:both;content:"";display:table}.photography-module--photos--ab385{align-items:center;display:flex;flex-direction:column;gap:64px;margin-bottom:16px;margin-top:48px}.photography-module--photo_wrapper--4d7ef{background:#fff;padding:2%}.photography-module--photo--faba5{max-width:60vh}.photography-module--slim_photo--1b603{margin-bottom:16px;margin-left:8px;margin-right:8px}.sub_heading-module--sub_heading--57ccd{background-color:#343a40;border-radius:3px;display:inline-block;padding:9px 7px;width:100%}.sub_heading-module--sub_heading--57ccd h1{font-size:40px;padding:0 7px;word-break:break-word}.sub_heading-module--sub_heading--57ccd hr{border-color:#fff;margin-bottom:10px;margin-top:10px}.about-module--container--517ce{display:flex}.about-module--rocket--01bfd{display:flex;justify-content:center;margin:-8px}.about-module--rocket_elements--68efa{max-width:800px}.about-module--rocket--01bfd:after{clear:both;content:"";display:table}.about-module--left--8bc07,.about-module--right--30a60{background:#212529;border-radius:3px;clear:both;display:inline-block;margin:8px;max-width:80%;padding:10px 16px}.about-module--left--8bc07{float:right}.about-module--right--30a60{float:left}.about-module--contacts--bca3c{float:right;width:50%}.about-module--contact--06c17{float:left;padding-left:16px;text-decoration:none;width:50%}.about-module--contact--06c17:after{clear:both;content:"";display:table}.about-module--contact--06c17:hover .about-module--icon--48658{mask-size:91% 91%;-webkit-mask-size:91% 91%}.about-module--contact--06c17:hover hr{border-color:#31afd4}.about-module--content--ce717{background-color:#212529;border-radius:3px;margin-bottom:16px;padding:10px}.about-module--content--ce717 hr{border-color:orange;margin:5px -5px 10px;transition:border-color .3s}.about-module--icon--48658{background-color:#fff;display:inline-block;height:10vh;mask-position:center;-webkit-mask-position:center;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;mask-size:90% 90%;-webkit-mask-size:90% 90%;transition:-webkit-mask-size -webkit-mask-size .3s .3s;transition:mask-size -webkit-mask-size .3s .3s;transition:mask-size -webkit-mask-size .3s .3s,-webkit-mask-size -webkit-mask-size .3s .3s;width:100%}.about-module--pgp_container--82cd0{float:left;padding-left:16px;width:100%}.about-module--pgp--8d21a{font-family:liberation_mono,Courier New,monospace;font-size:.8vw;overflow:scroll;padding:10px}.about-module--music_container--5626a,.about-module--pgp--8d21a{background-color:#212529;border-radius:3px;margin-bottom:16px}.about-module--music--22425{font-family:liberation_mono,Courier New,monospace;overflow:scroll;padding:10px}@media(max-width:1200px){.about-module--container--517ce{flex-direction:column}.about-module--rocket--01bfd{width:100%}.about-module--contacts--bca3c{margin-top:16px;width:100%}.about-module--contact--06c17{padding-left:0;width:100%}.about-module--pgp_container--82cd0{padding-left:0}.about-module--pgp--8d21a{font-size:2.35vw}}.half_element-module--wrapper--9a857{margin:0}.half_element-module--element--0c2bb{float:right;height:auto;margin-left:16px;max-width:60%}.half_element-module--full_element--5ef23{float:left;height:auto;margin-bottom:16px;max-width:100%;width:100%}.half_element-module--before--e884c{clear:both;content:"";display:table}.half_element-module--after--d5ca2{display:none}@media(max-width:1100px){.half_element-module--wrapper--9a857{margin-bottom:16px}.half_element-module--element--0c2bb{float:left;margin-left:0;max-width:100%}.half_element-module--before--e884c{display:none}.half_element-module--after--d5ca2{clear:both;display:table}}.video-module--video--888c7,.video-module--video_no_print--81236{height:auto;width:100%}.video-module--removed_warn--a954c{display:none}@media print{.video-module--video_no_print--81236{display:none}.video-module--removed_warn--a954c{display:block}}.half_image-module--image--945b6{width:100%}.iframe-module--wrapper--530bb{padding-top:56.25%;position:relative;width:100%}.iframe-module--iframe--dbdbd{height:100%;left:0;position:absolute;top:0;width:100%}
find . -name '*.mp3' \-printf 'echo $(exiftool -json "%p" | jq -r .[0].Track | python3 -c "print(str(int(input())).rjust(3, \\"0\\"))") "-" ' \-printf '$(exiftool -json "%p" | jq -r .[0].Title) | ' \-printf 'mv "%p" "%h/$(tee).mp3" && ' \-printf 'echo "%p" \n' | \sh
Ok, let me break this down for you:
find . -name '*.mp3' -printf '%p'
get's all files ending with .mp3
(and directories too but I didn't bother adding -type f
to exclude them).
Then it prints something for each file (without adding newlines between the files).
%p
gets replaced by the file's path.
Instead of just printing the file name we print multiple commands that get piped into sh. Each one consists of two parts plus a cherry on top.
Bash replaces $(some_cmd)
with the output of some_cmd
.
Therefore
echo $(exiftool -json "%p" | jq -r .[0].Track | python3 -c "print(str(int(input())).rjust(3, \\"0\\"))") "-"
expands to the output of that big concoction plus the little dash after the last brace.
In bash pipes, denoted by |
, take the output of the left-hand command and input it into the right-hand one.
This is used to get all the metadata of our MP3 file in JSON format (exiftool -json "%p"
) and extract the track number with jq -r .[0].Track
.
But we want to pad that number to always have three digits (007
instead of 7
).
There are thousands of different ways to do that but I didn't bother looking them up and settled for probably the most complicated one:
We're going to use Python!
python3 -c 'print("Hello World")'`
runs
print("Hello World")
So
python3 -c "print(str(int(input())).rjust(3, \"0\"))"
runs (\"
gets escaped to "
)
print(str(int(input())).rjust(3, "0"))
which does the padding in a very, very bad way.
But we're not here to do clean stuff, we're here to bodge.
To make this run in the -printf
flag, we have to escape the \
(which we used to escape the "
) with another \
.
-printf '$(exiftool -json "%p" | jq -r .[0].Title) | ' \
Does the same as what we've just seen but with the song title, which doesn't require our Python bodge magic.
So the entire first part prints out 007 - song name
.
Now we want to use this to name our MP3 file.
Therefore we pipe the first part's output into mv.
But mv doesn't support pipes like that so we have to spill some tee.
I'm terribly sorry, I mean $(tee)
.
The tee command does a lot of stuff but for all intents and purposes it just prints out whatever is piped into it.
So
-printf 'mv "%p" "%h/$(tee).mp3"'
first replaces %p
with the file's original path and %h
with the path to the directory the file is located in.
Then $(tee).mp3
get's replaced with the output of our echo command plus the file extension.
So it changes the name to 007 - song name.mp3
.
Once all that has been done,
-printf 'echo "%p" \n'
ensures that after mv did it's business, the file path get's printed to the console, so that the user knows something is happening. And it also adds a linebreak in the end so that sh executes one command at a time.
sh executes a list of commands that got printf-ed by find.
In the end these commands change the name of a file to something else.
And that something else got created by echo, which is printing a string that bash expands to the track number, a -
and a string that bash expands to the song title.
Bash does that by cleaning up the output of exiftool.
This cleaning up is in turn being partially performed by python3, which runs a tiny Python script.
Pretty easy, isn't it?
Getting this one-liner to work with files that include '
and/or "
is left as an exercise to the reader.
Oh and it might also delete files without a track number, maybe try fixing that too.