From 0b076659d6466fb0b4fda3410d005e570be13774 Mon Sep 17 00:00:00 2001 From: Jason Morley Date: Sun, 5 Jul 2026 17:23:09 -1000 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20=F0=9F=95=B8=EF=B8=8F=20Add=20a=20w?= =?UTF-8?q?ebsite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yaml | 56 +++++++++++++++++ .gitignore | 12 ++++ .gitmodules | 3 + .tool-versions | 1 + docs/404.md | 6 ++ docs/Gemfile | 23 +++++++ docs/Gemfile.lock | 103 ++++++++++++++++++++++++++++++++ docs/_config.yml | 41 +++++++++++++ docs/_theme | 1 + docs/assets/css/custom.css | 13 ++++ docs/images/icon_128x128.png | Bin 0 -> 12821 bytes docs/images/icon_128x128@2x.png | Bin 0 -> 30206 bytes docs/index.md | 5 ++ docs/license/index.md | 11 ++++ docs/privacy-policy/index.md | 7 +++ docs/support/index.md | 10 ++++ scripts/build-website.sh | 86 ++++++++++++++++++++++++++ scripts/release-notes.md | 11 ++++ scripts/update-release-notes.sh | 40 +++++++++++++ 19 files changed, 429 insertions(+) create mode 100644 .gitignore create mode 100644 docs/404.md create mode 100644 docs/Gemfile create mode 100644 docs/Gemfile.lock create mode 100644 docs/_config.yml create mode 160000 docs/_theme create mode 100644 docs/assets/css/custom.css create mode 100644 docs/images/icon_128x128.png create mode 100644 docs/images/icon_128x128@2x.png create mode 100644 docs/index.md create mode 100644 docs/license/index.md create mode 100644 docs/privacy-policy/index.md create mode 100644 docs/support/index.md create mode 100755 scripts/build-website.sh create mode 100644 scripts/release-notes.md create mode 100755 scripts/update-release-notes.sh diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f80a342..0e86e41 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -53,6 +53,62 @@ jobs: path: build/build-*.zip if-no-files-found: error + website-build: + + needs: build + + runs-on: ubuntu-latest + + steps: + + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + lfs: true + + - name: Checkout required submodules + run: | + git submodule update --init --depth 1 scripts/build-tools + git submodule update --init --depth 1 scripts/changes + git submodule update --init --depth 1 docs/_theme + + - name: Install the tool dependencies + uses: jdx/mise-action@v4 + + - name: Install dependencies + run: scripts/install-dependencies.sh + + - name: Build website + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + scripts/build-website.sh + chmod -v -R +rX "_site/" + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v5 + + website-deploy: + + needs: website-build + if: ${{ github.ref == 'refs/heads/main' }} + + permissions: + pages: write + id-token: write + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 + sparkle-update: needs: build if: ${{ needs.build.outputs.released == 'true' }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b0f495 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +**.xcuserdatad +.DS_Store +.env +.nova +/.local +/_site +/docs/.jekyll-cache +/docs/_site +/docs/releases +build +temp +xcuserdata/ diff --git a/.gitmodules b/.gitmodules index 3e8cf73..2c17b75 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "scripts/Sparkle"] path = scripts/Sparkle url = https://github.com/sparkle-project/Sparkle +[submodule "docs/_theme"] + path = docs/_theme + url = https://github.com/jbmorley/showcase-theme.git diff --git a/.tool-versions b/.tool-versions index f732415..173612d 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1,2 @@ python 3.12 +ruby 3.1.2 diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 0000000..52f8de6 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,6 @@ +--- +title: Not Found +layout: page +--- + +

The page you requested could not be found.

diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 0000000..65da8ac --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,23 @@ +source "https://rubygems.org" + +gem "jekyll", "~> 4.2.0" +gem "webrick", "~> 1.7" + +gem "theme", path: "_theme" + +group :jekyll_plugins do + gem 'jekyll-environment-variables' + gem "jekyll-feed", "~> 0.12" + gem "jekyll-image-size", "~> 1.2" + gem "jekyll-toc" +end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", "~> 1.2" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 0000000..8b38020 --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,103 @@ +PATH + remote: _theme + specs: + theme (0.5.0) + jekyll (~> 4.2) + +GEM + remote: https://rubygems.org/ + specs: + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + colorator (1.1.0) + concurrent-ruby (1.3.7) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + fastimage (2.4.1) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86_64-darwin) + forwardable-extended (2.6.0) + http_parser.rb (0.8.1) + i18n (1.15.2) + concurrent-ruby (~> 1.0) + jekyll (4.2.2) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (~> 2.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.4.0) + pathutil (~> 0.9) + rouge (~> 3.0) + safe_yaml (~> 1.0) + terminal-table (~> 2.0) + jekyll-environment-variables (1.0.1) + jekyll (>= 3.0, < 5.x) + jekyll-feed (0.17.0) + jekyll (>= 3.7, < 5.0) + jekyll-image-size (1.2.1) + fastimage (>= 1.8) + jekyll (>= 3.7) + jekyll-sass-converter (2.2.0) + sassc (> 2.0.1, < 3.0) + jekyll-toc (0.19.0) + jekyll (>= 3.9) + nokogiri (~> 1.12) + jekyll-watch (2.2.1) + listen (~> 3.0) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.10.0) + logger + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + mercenary (0.4.0) + nokogiri (1.18.10-arm64-darwin) + racc (~> 1.4) + nokogiri (1.18.10-x86_64-darwin) + racc (~> 1.4) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (6.0.2) + racc (1.8.1) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (3.30.0) + safe_yaml (1.0.5) + sassc (2.4.0) + ffi (~> 1.9) + terminal-table (2.0.0) + unicode-display_width (~> 1.1, >= 1.1.1) + unicode-display_width (1.8.0) + webrick (1.9.2) + +PLATFORMS + arm64-darwin + x86_64-darwin + +DEPENDENCIES + jekyll (~> 4.2.0) + jekyll-environment-variables + jekyll-feed (~> 0.12) + jekyll-image-size (~> 1.2) + jekyll-toc + theme! + tzinfo (~> 1.2) + tzinfo-data + wdm (~> 0.1.1) + webrick (~> 1.7) + +BUNDLED WITH + 2.6.9 diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..9ff2364 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,41 @@ +theme: theme +title: TinyBoard +author: Jason Morley +email: support@jbmorley.co.uk +description: USB Keyboard Proxy +image: images/screenshot-default-social@2x.png +baseurl: "" +url: "https://tinyboard.jbmorley.co.uk" +repository: https://github.com/inseven/tinyboard +copyright: 2022-2026 Jason Morley + +navigation: + - title: TinyBoard + href: / + - title: Releases + href: /releases + - title: GitHub + href: https://github.com/inseven/tinyboard + - title: Donate + href: https://jbmorley.co.uk/donate/ + +footer: + - title: Privacy Policy + href: /privacy-policy + - title: Support + href: /support + - title: License + href: /license + - title: More Software + href: https://jbmorley.co.uk/software/ + +plugins: + - jekyll-feed + - jekyll-environment-variables + - jekyll-toc + - jekyll-image-size +destination: ../_site + +defaults: + - values: + layout: "page" diff --git a/docs/_theme b/docs/_theme new file mode 160000 index 0000000..0dc33bf --- /dev/null +++ b/docs/_theme @@ -0,0 +1 @@ +Subproject commit 0dc33bf0659184a866042568a1fefed8e7e5758b diff --git a/docs/assets/css/custom.css b/docs/assets/css/custom.css new file mode 100644 index 0000000..dc81beb --- /dev/null +++ b/docs/assets/css/custom.css @@ -0,0 +1,13 @@ +:root { + --brand-color: color(display-p3 0.542 0.364 0.796); + --showcase-color-high: color(display-p3 0.542 0.364 0.796); + --showcase-color-low: color(display-p3 0.303 0.124 0.557); +} + +@media (prefers-color-scheme: dark) { + :root { + --brand-color: color(display-p3 0.542 0.364 0.796); + --showcase-color-high: color(display-p3 0.542 0.364 0.796); + --showcase-color-low: color(display-p3 0.303 0.124 0.557); + } +} diff --git a/docs/images/icon_128x128.png b/docs/images/icon_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..7135a42fee238315d503fcbb443613ada2db659e GIT binary patch literal 12821 zcma)CRZtzUwmk<9?p7R1f#U8C#ogUqio0`gcP;Mj?k=UcQ{3I%xxGK{{oaqAtVw1v zlk7b!D?2+}K~5YA9uFP>03b<9h$#K*!T&W_=zr}1zu_1F0AFP(EUX|YEc{i$(ay}$ z+7tkg2v1IhQBc;z248v|ljM<+IKy_q&BA>p5Bd`El~9D74EO_%1Xabll(u?HO92gt z-~Kg!s~l4k;ah}_qQY6b&=)LIUD{=ZXJST>+voGA-v^7+f%j#n(-hz1WS89}B)D=M zE0V>)6u>OnmSFE^CuXg~3;BqN3dBL1F{GArIY|)nNS5tV^ah6NIXcaNp}!LVI$EVevgmuka}YpvXDVv$A7Hj$;tc#J4}Ox%gJcJ=^Bc^n}td7#@(U1#hcziER9z$Zkyrp za8LC2$iX)lM>Fd*ZGD~;v6d-dN227c8{p$fD zH!Sm2TH9SoawEy^hTbra!5=*rh?I+f=#N_q;o1w=3S`(qfDob#134IwZ27Cig{ySq z(85#*p-}=e`dk%&58(H$ubdDu{$K3jGa<42RP7<}{9y#4q5Gs6AvOY;U<2$?ar1xR z#SxhxYW{FV#kc``=NV8EL4`^Y*8;N6A)dKj3IeR4 zE`R<3$~4fN0pT(z8;Qm63js*HA7KlV6Mr%kVLRHMO9zQKBxBp@O0^XwrH^4-5mS&V z_lVLb2`eJpsNjdu}MkK!BYZNz;EmNI0A|biV`b zKzt4F&eut}fkGUMy}h(Gb`^SMe%1A4{=^i(+?Tc`1xtPfCk>YY3j=EtbQ&bokE0lD zA>~XVhCUZo5xzeNy#uu)yrT^T1qBI(9qa-BBN!ssF}MIe74rp)Kc12d0X-v0Fd>0G z!AkPH(5tY;g!ymKnP?2fVFE|O>F>kQ*imAvvWUe90@3ar>LIBivmw19btw?JF?q`D zk0S3P=AvDxrR0!gxIf?jSesVgNbO7QC;o9u5?3vyZl=zo{zZ+if?TGf<{{UoC_~we z$zK##pW~R#EGVjoRAx;b+n(YH_VnkL7?_o@B+$aE3UUovl*LypD&;N}tDsk`QsJwj zE+{zq?u^VA*d6X0<(u)LDJvdb^j$%_W-)iM;z3APdR{=3%P52x${qlxu&Y}U{w3oTnM-YTOiW39&~LmPy1`*YKk*QOfF*ps7^r_(SO z*OSa8+{L0(&*S1_+c~}hon6}$AG*)229L2`%!YkVcpHX;BFPa9N(6Y zH2*T8q&~bru|V+<5#eIP`fc_B*OeX)D7$7r}=nO&7#!eQNEVi_4(Bbmit zjcL3bsvP@i2N{bQ{H&xI9_gkTsu}CdBk3#?a}#dAHfzCj1awMt)O6L_{V8%OKgM)Z z_!<}+bj-rdRHxdFMeB_;_ca%^@3rTu0;`rZS~PmnZCH7HA5#A6HuU`ETrpWDsP!vKWU6YonlF6$++6DO|z}2gV527f5bV)VA7up z@&fuo=h5ea86`wKe?$-ES4lU;Qp3t^cxoQ@X2tL+?pS8>F!#9UzRfP(we8JEud8W| zLCb5d_nS|IPrDCQw_-O|ckDajo6_6KyVx7yd+Kuwi~&RdL^Eh@`^erslY3Gk*J&%F zck-)}f{23XbfQ6|fuy}QECD)BJ=@;4&TdVtaGb5R(> zO~bo81-n0Y#1CI5H~IY-`6F;`)-Fg zRDi%g{*^eyI<}>R+-1 zT6)d$7lsxu6~~$nny{MfuwbyrM^NTFE1IX+E+$kG)fKf$(2luIY-IC&gG-p-6XZg0 z)N-s9RsO`@7>C9{rdt5t1p&(@aJ&dJ?EPgR|!a{IyhN?MamFn2IiFr>iKr-FW= z1{qa*!=%l6Ht~!Ayx*CgU61eKi`~%M4h=awxhc6m`xU#+^XNm#P0ldKce}HVy++GN zvoo`qgH>(b76MvTstE?dWxV<(4}4?o>t?rAY?~gP1BGUD7>7{j&`RFcPM4CI$qAkw zl|r>URZn$xHB0rXnwQ$ho(i{?rHc?gZZD|^?+uzYFSne}?gOjDllu4NcaPT`qA>pH zdzRb7cD#x7g!G!Ge67EISAkhBlP)fyjVLzdp{GUn!l4+*o18mNg-w0shWeykb$gVY z)O;^Hse}5q#0cDr4w)XE+de!fgxw-no!TpXNEE@|7fu34P^nsX{%YIt0e&B?&F zbFkGt&sbe@;yHO(=YexGaeH>l*&J(qeDU3QuY-X?VM2){rV^m`s(f#Kal75bH&$`;}EVC=0{yT=W0u?9m)vH$jFcmoLfDXAPGDL1>{xn7l0!HU>;xMlhLm{CmYk^gxDaV z*KemR+e;}EU?DgzqCIE}vqhQz9ZJGhghDG{f&s9)I_A>;m~}Qs0g8O9JG)QI<#+J~ zK84EMUu`bD%OiZR=LY+&_yNa=pgk0j^alRvS58w6Ni$hl0QEl%3jl^%0zm%|@SoxR zGXMZ07vld$z`2nBkN-RQQ|!Ae0PuZNQbb6_9eAGQ6=$-fyJ_b(Wo)j$qFc2Xo80MH zMP>|9PcCDP&0ZH^L+d{}CWrVYWdBdp zI8FID%PY$K8HB_@k>O>$?)_gu<`j`dCw!D}=rpN;YL(%=YP}kJ`&Co^`3dj zak4AzjrHqOwEnW^0+hP$5-r{mt9FAr?1kD~wOB)2fg&qAR`hVO*i5FS^9qY-1Cw&& zf;?8a9cEUHy?WQ&aUu01Nt3|_{5Kg^m*XMB1!h71S?*}LnG4LU=0XO^fw?TP*G5b) zO&1ED^9Qu}&S`pXm=&7HSOosN-*w{M*F&oU9y7Osg zpSSM~EE#s`R+DSf){WJ9)riQp1u78i_3K_po8niY*TfqQY6!?f3HH`oqwT)gy6-FJ z4}XNmhGuiF`RWLlOF*^9!Cx|;Pi0xW!FE>92&+dlht(^7w zxVsVUi5GmY_Hs-bc~>a{IZPtM)@4Zez@p9I;mmBkH++7{#ySv zx4c|9skpR)%Dc%niV~i2q+sd@5OUE=;D#J8Avh8*ylU_=yNKf%7j4*6?Z;uaR(n6f zu%(K~EuFgv#xz84H@0`ph|ZUoEFzv*w;fEP6g=iimzdYKwk6xX+Rc1*JZF$a4-hn?hJ@@C9PIC=~)q2$@Kh%s* zsNd*Ki<{6wwf1E&a_^60*IqChlr#7*s{7fJWjE@$x4=kM1IJuMjUHLs!$`Qtfw#|q zroYyS2IIUy>Gr6N=Y~i0_8{-W)qNB!7exptp^ujN9WwRZb)x4Jr>!cjkf36K5pw4SuIXhx>al4jJ9;RgMyhmmdUwu!X z3tr`7O%}$MVx70HJw?IQsRzi@cafefX}oD zD^5)yrUYW0oK_5(j_kT-v}ioZGO$NV8>4>a3Uo5-v8~sYBQPeJx>9&vOyxV}zY z{2d?2Js=dm6B+EZMC~jPCj&ZVa#u{{%147hM0NK!@-s>eE6SVTs{&ACc3HKIhAOw8 zR!3tIKbB9P(4{RLLE5eyT7Bqs0sotUdwpKTro}5C@=zsN4B=EA57|Hlhu>AtKdO<{ zwT$?4rO*nWS5j>op1rM?ddTZ#zxP$7103TO%-Sfgm%2N!B5P-Ck#@_-R0adwgCwY( ziF|1%_k^%v@t9;evtuu*errQ{KYWZdIdhj=P>4#Ly-PvD-Ux$m4Ut0C;~bdMs`eC? zx2=+^wU&1&>j!HdE|+`pl%#hK$`{PguN$c-P3&xBtpBu^$v!*HaZeVKau&*o(hSal zDWJJnTkf%RJ(R7#k#CH?@62_D7@xHEB=$93`34Y#M_wF?6N-WJMRq9V>Nu^tXh-;Q za?D(q1#{krAH<)y6&fxi)k-a}E-C%;LY{ki%7Cx&S?*0Oj7@s9-lcVxllAwB-*T9I zJD;7mwV3%KiKIIEl>W2MMtQfNYVH4;6To3oPB%?tc9Xni~T=z8z|1*>1%fwHH*BLiJv@Q?G{*4~y9!2tBom5HE_C{NvY8S_X^`8sI41Ba_U4=M|7Ab9A482{5q=*x?#V zoXhp|;c>WVDN;E0Bojgl->g}OFygXC?`G>^l%+{ z+cR|~mpVg(-{JBb_HTF&q1l7VQ0O|a;x6xjak<1!6+l=PsbrJdYxsbH?ee<0l9K;Q z$!QB=U?)BG%zy$DR1Jiw0$Oh;S2Bl&!%a)wA8?aWoroAb{8YcGp{1?>%J3=4lc|v7 zjnuCXIwXODGQoE-ndm1kWH=*Sys7^dJ??)8GvY0%(Yc`K{-rJ6P;sn+9v7jR@-Guv zbh3z1)8<^$vD$D=9kE7-`+^{odoN$6aMOrZ#h#0mrv4-4ngJ>lV&`W)`sZLF$mb>G zqB;gYfr9q_#F_rg?hD;cf7#zg%4iKJTn?bYf>pB?52@fVPv)qQ_T&hOAWa^E0#w`x z#Z?q<&dyzNVa*DLK*wHUrv&WouQ3>o_;}R(-wGqDii=PeSSjFm%umY4^CCCCegVp92P9=@03|IUgJt<0gTp@UGFTa?;12NVAVes8y@eYtI}8trW~^ z>YkYm4wU+h%o$c(L+{)ef_iXOxl+?AQ8-d6U)G1U`yHU;3~ymgFm5YIH~G6*qDQ=! zERGZ*`@X|YhjEB=U zL&UmsQ6bIs-)5bV-J8B=M#9>kHNGh+k5FO)+U($i3dbR$zm@AWokKt5NPzZD(V(UzK7uSGCZgtK$CA&@TzK>YcA znI{^Z@FL-H0}s@LAnUKDbT4EfUK9d0EF3^kzo+xq*pVc;1h6ub_DPXld z`vGMFF|N)PJx?x@?I;2p>Yc^wGk??k=1lZd(YD``xw3ur3I@tDdkW_5(m4pE(8T0=zn?;yQq zbtpv6i=y)`tE(a7d2-F8xe7g$B`a;YKaYMB_@+fP*)Zd#X0*~;doMzQE&47+?=h+8 zxEVl;6SiDa3Dqi4oYaIu*r~bpAbE7bMqX?-4%CrB>pUX&>GzPL#31qYuUQqO5d4ZT zK3iyDht*dTF=wdg5~y)RMy2k$m?*RMm)QaapNuZc2IP<+B4EW!QnT1mImd8ZfV`5w z{8cWseXf)}P+z$$8BnaKMBP)(W=gggNCol!*O?)REKfr_-4_F);xWsLkt9=)Tx1@~ z0Sg)_jyZqbWxQHzkoP3B59~9l908{AA*j@dyYHOhK3UVC)&5bsu%Qc%sM1!d?abfH zTFJ6(k^YVnafHuUgRwyqHjGxJ29b89pz|%<2G`lif_qcBVz}&B?7HjHQ`up{r6XcJ zRbRn+l}mkmQWmSKtf`7rY}tM?T|H%W=xt1TC>~o5Yl_#m@o7?@fR^Z^0{cu+B$N#u z1@t!MjTtda8MDie(_KVz1;*Oh!eWsr^4K#x2N|5S{J64lPJ}r20fU}r2VE|E3ZH&Y z`P$XFyoSX8>0E@B*qXo|UvVAXI3MZ|aMrxuX`qPQ{A_xS488OcVhQ}rm3*s(d-zKw z{6Y1u&c+Qv825lUGI9r{g~rHRa2?Wgeu~sb#+tO%i7kcdT@?C1OL zf%|57(RDPD5$Sgmc}eAaCB9+A-;4cmP74&U zOhAX#oslK_nyN~Zg$3m&>M}O8y7_vr1NpgCHL#bxbYF=t@KEN4=~ew#?K{x-I>Y#h zS}q=P4V4r(4O&Yu;hTM~O)a2C(~2BScQ!35borYxx4XmEUw`Jeovd3#kI!urn<}?J zJDYa&&ZX~-)-z0x`_(VFUe#k4cAhOBViEp0BSEG}YQ?=na7ZM3?o=bw?)Mj_b#)qG z9GWt+=3lm6q&I*34JGS!hmWk=kvp5~lrEkKnjX6nBt*GzkkW<}3m|ah8n&|~vj6Cc zwp$h2LJWu}_d}sXU{xc+AM)=oZ4-L0cqcvvCp7bYi+W0=+lKvdnpI}c-sM|HYP!4{ zD~3HDqhFm_{olDC;}+lMyP5F8tCfJWNg|PS4VXp(FbbQX&2EaPI#42>RwUy|<`^j> zeQ1BvX{OaPv*ph2)t`grY7DO#FB=I;MYuXI%a=m|c`sd%Bl?a?{UNSsOx&%(migGK z-&_Zp3-N5qXSh_pL4=TEQ3?R^Oo3;Pw%lDCMzkMQwVTE#wP5S?zRebo9eB$w?8dD;R4v_%xzv4V6#Ff3F(9np z5`;iY*A$5%{w3ltn^%#*`yfcnEuYjONyeLLxca?-NTXn03V?qviE~Jr(D#LG_9lVm z*|z`crifuf_w9gT^Psr=lF!Y%qxEt_Jksx(*w4|uWXXN(f~FaZf#2;1$21lv)a72C zva3_&X65f7F($S-+5>hQ`VIT*lpXSQi{l|y4#N?v_s%|J-oZ0s`THD?c_%%`<8lc1h0Gb`S=?*e|Bx> zbJ(bDaeX@R>r=^PYcL)~niKP`J9ST$6Ing0eyrF1tag8WbzQX__>x%OP{EM#MIt19 zKtHDH7a%AIR;o+muN2%DF6?eYmT1T^<4rz=O#ZGyTzTT6>UApVC%4O0j@qeb1&?if zj%P$k2z$-eMx{)>`F25mV@58}R00VdI;mu{E~|Q{14YGLp4xdejH< zbe>9uxg%8bYVT?#xWcGCE8hh!yS*#6x4j>I$l^x~b^QK$CrD#BSu-L*#=&MCn>ZWb zwb`uAG6)6Vve>Qlx1I^1QA>G8Dm=)chRmWV zLf-pjVCaI+yJY)~mc^-4=y0y%RTeH+*^sN9j?3Gs|r@u&Xv%0sl zaZ~W(&ZUs6eBtj^SrVvJ#hSUIXkT5a;i@k_xP$1WXpc~xx9N{f=wK=;c+Y}nzogK^ zW2CIw7G&!tR+pc9E7IR?V(IQ?ZL|^EGA$HdDGj3DkOwjcx637`%@Ek8vzRX5C8#{3 z^sUGNMsJzB2$;&#CQHgj-c9=2eB(4L&!6$zKkccU*+~n(qOSq@8`TA9yZIrXv;uI! ze=a6+2d%6}{&_oK>ef#H%3e5Z{EiK93SjnCYA3Qd6~k3_gA`y}SI>muWmPQzM`V%~t|*kQZ068(eKs5xo|kuX#Io$V@nt?+K59%GY4q4qes*KS386pQ~$Z7Arxg-Tp=BC=>jPTUd(YUQi6iK}$ zqNhC~4%x23B>pm?JjZXux8*2wARp;`69JPc7EqmqYWDY@`X8-k^GV}kmfIqfJdLhM zj`D%!_o!Yi%cu@iB=kgxgDCE?0JUNEx~-1v^&xvUmY0pm1Lu1sdQtX<0Z~ zbF%jO9KbITFF;`~+T*&-Sdq(r6q13LCI^-ER&&HQMRr2QgHf6x9{ECCf2qPh zLvX%qlcY<&_A{K6d#4=CE#&Tq)q98HG5YgdqH0WVIrWf;%HXefR`X#tm&|RU36Xsc zDjmcECA;0RkHPR5p*sTvY~iqUf%|pu_09%QPGg1uXtVm8$e=DxHgYZ5*{pa^Q=b-` z;4srFti|nEoU;P&^KXQoiErHbo;TZp^@~5u`&L^m7xh9}a>xbtjB$GCkA3`i#SiY2 z8wQ4M<*yln@3&;80B0ZIOnp5mt&37&O{Q$)pX6Yl5q{IkjQt;d#IFwxuD_Vu$j|t> z9FI&Ku6h;Uo3jPT_mgW6bGX#JpIdq?L4y-H7gS+StVWho06bCY#}~dQPiI@=1i`Gv zYbH-2sjMM`DmFlb7*ihAtHQzF_0Y~X46?}WDUt7OwfH`LaD;5Z^5vQX4M!JB-*2_J zd$ph@7W-V|M)g4XZ%<|Fz|@B4Wp2O-MuM%z;@M+5oWYIqaD2aIK!ev>^v>k!g?92LZ2rtNR|$You4t z%V&h$N6v^dZYA-&9re=$l}9izUj7rl+bk$#<9G)HYFzE!RClr1zzH%OPy0Sl8<{NK zvyNltAFnXH|28TsQqRKcgf13Oa+M=pHD%QIwYIXd8byMOCcG-kX#=$3&M}CO)uyk>!AFnWSJO?3WJiay=FMUy~UufzsZ0b%;$>P z`tvup*o!ML{8lK&jL5w7ZV(Ks18}3{(BCKuHHhE;1y6IvIc24hu~I87dxv$Q_B7iI z=}{wBQIaz8#sOm3&8S+-6x9H<$+93*PFqfH?xaZv`Y?)`i&Pb8I;%H~r@2)KIt`0a zBcymMBi|9-Kh|wW5|IN(etJEx-D5Nwj@MusBmx{v|As4<74cS4woEeO4>^`_i_F{C z{gJ}BEN*w!|3lu>`p$W}6h=PPng4|g3zhd$nOlx8&M;=0-#+xWgXkDA9+53)hK>mI zRHWhVpTd@`1!rKD0D&G#nv{Va()Z$q#k`^iMxXpWjh%Of*@r^5MW7c&7Wn>peOKgs z&+Z#u(-ag%AATQ3_|d01Do;*?%)0PZYzUO*GnXd`jq>21dj6x5UKQ2Wx|bdC0R-^u zwW%vPo23?Xk$KN1u)p5wVBGUii1wNt*JwwQ)EkH9HxN;yx`M@H3&zDN-wtg;7lhzD zP@0w7Hw@&J4%DsK`AS%aLq<|85p|OxA_cxfV{D&Z)3Ago6sZMc{*<4l&Sxf!%I6q~ zY!=Us5!N$O4iLIyO(9iw^+bm?YC!iV1H3@QCFV{c#M4ULZb_r)P;K{8;%Y65dy#MX z9*g_+P|ca5kBjwc!GSqNhf}UV2}6;RDc@*8Z~?)ah>3MCI9XPFS4{d;Y`+bBa`QmQ zcR%=ATimWKi>~y@r)t*j96QPtZ4Owro*U7g_n>L7qnhI|F zkBeZqHx4Xao5Y%m&y#B>(16e?H>cbq$uENxp->FDttUK( zyU7k1y>|d4$;Hgf3UwRnuT3MNpM0s6=j zLL{Lfl@Q`>Bbm9gItl5faZ)+co1EksQH+Ts{6}(iIfFBe<|Biv0o9}haQj*8zi^|X zgo~>RgX9x_bVc%>V)q?_?_tZISEPET_sL!4#4Eu6l2~dH9*2#g0uCvhZUj}FV!Z?b zT=3QCeHR2N2kpvyWe)gqH;R2kYlb@&?GmVLX^4S8qItcoL%Wb!yXrp<3<9hPU!Rrj zD()@BL*R{O{;)aWs{PWEey`;b{iSI4FvgF7*~rXbQX*V2XvHvd!uCBj2+=U`Oy1?& zZt@v@g+Uv9Wg_4Y_@PXWW)v8tB#9bG4^O%w;VIUw75M#y8efXEz$qXusffDf>=H9Y zrTlhJDJ#GbMfOi_n9%$TxkX|esDHhhBDt7h@CAXevt!|JKa4Lbj*WAklUlxAK9iXm zHrBN3wJmpH`$-hwRi)(8BKlp-HVZVZ>AkO_+~X=*W@aIi!!Jv2Zh{+yOPjo68WbgY zw&ofIPYgm_=g7z|a)yV&@Q1g9_Fhi!$>$*~w z%;0Q(MI))b<$&a*<_AXldF0&!uO>nwE<5{~B$wfl)2JTuAUIctbt(<|>o{e5`)}WvAp6IzwlufR>+@~nc$EQc;|i32_S7M+q+DD2wA42jBms0U zsmRHPtclCXzZj%soN+M7uq-D3h>1kSWUD%D(4*`l6CE=`$PweGXH#yO_DhTsFsx&H zBH!q5eD9>d8Ml5LLWH5~gI1!p=R3EFH#SuQ(r;108$sO_H4^ z23A0G$Iq?sXU0c^CDMh?(K5k4H%FLqSn#^?U`vEw)6hgWWn+H?KQz5EZH?4U3s7_+ zW;sSGZWfyL9vE8W1#$}a(OJ%4XZ{5yG7ZAHviz}rXv&&>e|qH1AA~X#zPVh7FXgpp z$r{5Jv5I2gbG-mjboMS%-XjRL;{t{_BRJCVUdoEU7&gG;#N9q)O5Vr^2HG5NDaVm^ zTvl5M)Rc$**?4iDhL^HAAydJS3_E4PF6l>uy)dOv*zZ2Zjf0rlNMHM4vjdNCqx%L{ z$`nRTHAL6fxf=ZpkJI#onw15Y`bf{NimqVuD{+TuVtekI?BG^VBhFy(Vgg4UDgROe zk?tW0Y>8j4CEqKi+Xoo1cIkMJS`pxoS#>%g`jA0i7yOV%gZI6e+K=D-d zFWDAs<~1hH8A>MIQd@bYOAi+VaAG-~DvMSA`jQBNXr%OFUgJ1zG6VmzxohfT$1LSt zu_PYxP|jIr`p2~VLONu&mCC)XEPw;Xo74mKn9XRClyD%7N!_oXazwmj{kX#j=DnnS z1PrU>Yb!G%>OZ6xD!7?e-{(KewmpoHSq&H96+m7ZqbmM5F8J31 zk=r=5m(m~4>F|`B^OFDN2)lN6v%G-bf*B`&-E1$5@HI9|jh7dwHuGJXHm?a|>*Bq| z+or7R%4Dk4APBV(JnDJU9?X>i5j7?riq=RVW>3o!73~TP{u&9Ni0cT697o)q#C#Mv zd0YTF01h#)EgU=2M|xnOL3R`H8C%+eH3QtnY^6(`gHRupDZb>qW+^JY5X9WpS8)f( z`Zx~ko}95HhQUCk?dnzd*!ljdjN5K+eKUmEIaTc?V0exV??itfe&n>rcRvFid6aS# z+e8cB#-6P|wn%bcaA+f=Rq^ ze2VoYBIUMEsXf$X_!Oziqf)vk*6i%zUdzg{ENCy)+o_Ko`y0|}jjEh9X{FSO_o%cb9ld|bJlx6rGm?V%nbslB zEOKR73t%+yYaDQQc_#1?4e8bVaZgjM?WC^ERDU-D5U6e&lmOMwux+LPG6|Y-qwJZc zGuR;6Z7^ef0u>s^#2N&-!`pw{Z8P}Ym+60GD$sup6TP1}iNS$anhCYMZ?sdb+b#k< z;p#7mp@($aTHW;cWez`TGz+r$IN|0Le!3evL(2!j5WU^HwyLbYDnqvo!#O7R`X5V> z`6fLbTcq)xCY`_Rg;tqcd^&nLY_3mj+&Hzrj!ebce-NL(2&nMx;tEDN|9nd8CU3e* z?O@lvFYuh~W=g}4YK1<#w?io-4yy3y%9glw$E8o_M0*4=fYe0x-YtKK%;Q?Bnz15p zoBOE!6>a%PP~|>O&s^C@gC*;F{CDTVes?TW#C}^$3nx8_$Lp`@|GuUHbrx-o&evs$ zp3kq{=T2U>)BQFDu^00Z*9vt|M97K@<>Z$bLGz;57!B?vQo9V^uzox}6-a5j14qK+ z3Snz;;r{-i-t+a`eFU)&c~Q#38{(=jIl`etKF2W`#5`{$kH@tS^Tb9=G(ZjSN`iF1 zyQ||O3^(0Yhf9=W9tU6UQW=i}2HbyTtfD9V*;HyQLid;o`}lQ$15RHe6-T@kn(L!e zqnA>4Ikf#_I@xD)qn_gTl5VFf6yJxs0ymK>Y%;5}VEyVlPcp#U6+#3pvF@7R+t!<~ z{$IA1N7=dPwhG$m72x`lZQK#3tHbv$T#@x@B_vI@!Y)D>as`w}&h;@>W|f^#Gw-V4vKpDAK|-%m5l zUC%Qz+ODcR<+DFAo9KnBM?QCsG9NxjIUW^lz#={ZpxS#Tx(A*7ye*1ER>9yFjKH(8})rA`~VeNrA%&A=%i{|I4O6=P4h_M%=5kqnzbE*3hSD@&BPh=&Ie&k{A1^; ze@@?PD|oX*dhc!aOT}Ai(@-gcs`5H+>hx(8E|OudHEMY8WdSqImB22$^{V}Kb7afM z)}wX$ipSrO#l=WA9-TsBwdEO$3G0QQyG}0$GnrzOjRfpP#JSTw>$8qhHJkkkL}AbU zbyw6j$zT=8HEiJhs5JS858Uih4|4!{PLx60#v%_aErhdQcSGd~xeuwQo;>8C`ik@j zPuBi`)_hlMt)utn*jQ-xzlhqnB+^|bK6LeU%$k|>;D_k3E#Pl?w5AaJ{ms_FYU>Ua zUmyo=GLni6UVA!UyZgA7wkBz#sFx}31a_Zu6P67B(4M_|+aqisi`SqVs;YcS&ZCI% z7fh1ip%6?-)=Msi73Wox&Nr%WXt1=LaB&pE^Dyh0EzikvU?J!#^5q(6KA7X~ly+F( tWcCyNIsAThWF|dNIG6HRM_Tn|KE}~Nl`hG>K_IH{{i!F4V(Y~ literal 0 HcmV?d00001 diff --git a/docs/images/icon_128x128@2x.png b/docs/images/icon_128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..af0c6dd051c808852530b4056d7cddd592413fe4 GIT binary patch literal 30206 zcmdRURZyHy^yT2eHMnbVcMSw5XmAf6+#z@%NYLQ!7Tg^McXxMp7<7P{<@ev(+Sh&E zr@qzw)%~iv&%Ni|+Z~~*EQ^jpi~;}v(BNU9pT1c6sRCscW~RBj(Sk!O)9=|b@TP?CM2qlJ+~ro#GW zSISbgt*43&L()c>zg>o>i%R{+UQPA9?KA#I3qzJ=)n^J0cu(jvGyuZwdgy!A;W{Py zIN9kq2^Ux~{xOo3jaA_B7e4;0h^l$==NG_fha_Nlz7>}YmTr9VVsKMaqL@6!0< znR3%2-u$J% zVk>@rICuD|6_+V3?%YG+w~ek=rv%|T+=8y(4;pU}#JadS)o#6hldWSkz6e8QhhP!T7pdH(3UAt%_*5+(6FLJo&j;pI`P7_SRTn< z|GuQgr;nLX@hf$2hkGs76MFD@cmR~vm;UWtCyRMwQh}3*w)Ch0m-#n0HyYesxl@45 zX{5kU88>MUu({!xFN*qJ>hhb3j<;;4aqK}jxiILtsAxe%HLxDt$SpAJ+o-UgKZV0P zn^0{BeT$3u)rhbqiN;M+E(0BlSUz7t9&96^t!6Wm=8k^~}Rk0J-` zW-#Z6Urty=`I5wOSM`-wPzwZc5D);Tv%@qnM;L3y4+iOWEeXCZh31fkOuK z|5+ohqFjVxNXX`SAKTq2+#$LlfGOLEHX^zrE@fkLfu_TR_EB_$ANzXxzpHaZa!RLi zDWMl5yTZ(c5%qTreXn(^U|b|335@P5Hcc_*H}Nzjsl8YxKL>c=h4tBNvp8S2sFD(- zL^AhY^pg!{4czY{I#b-Bc!_q9ZDLZy66`E(k6njdTU~cPSv_(7;_6A=R`@`7jjV{A z@d4?BeaKnJ=Uzg!-_{Cl3^F)#;pGtr{fN5=yHdOQ2nYyp2n4^qQ6zuE{&x9YfRcg- z{wVhM6D=xEMxsP~JYW0|`HMoI!e(=>m5_7k7>1*G{`j-uqmkGVijV*PEdC*t?%HJ< zP#CZrFdEQSfTuH~OP-Z1@-5;j+EZ9c3Qa;Dr60AksJc}+P&h~!^-Pr2EM;n9%414n zBKd~#&p^vtxkpXuQx~3CQCwY)OE#B;v>N(9JEqvSL#hbBCjUX|Va8&H7!OT`ce+J}X2u5BP&)U-+=OS^R!tx) zDXTgw6Kj=zZ?bZ-0fn|iH=2V-RblrE|1KkDvd;Ph};L0VPW*uO#@j@(7QMmHY|ZjzaI!bXO54VBEZgqN3OL%e0BH;^3hp*-?lY7v zGYj7n8p0T=R-RPGDM2iuvZ6Wqa>R5btVGNm)f(hIg0Q!HQ8#*!IL4sOuw<}gRu#~y z+gj94=HeqZ-L}SNlJCqFRIeh2_}&y@=p36NO1`3c=vY<_FD5>S@S3paoc$B z)KYD9JeI3LHK5)@%}F0(2a+z44(4CPwV!rX`(Na)hQI#B%pcD$R3n>Fm_eR#pP~5f z`(44zytdvO00@x_;tTO_Ac4L*!awf6^0cr6~|ijoAX%ia^rHV{P~pcre>Awuoz!KUR%^6 z$1>(Iv6(GOjT}F}FCmEPqUUNOXXf_x2mRaU)tsZh+G&r@&Ud?eirtDT?l;&xTAo|Z9Iok$G?TJuGET6QEfd!@dXt#x-!yry5!eF_4pp11 zketKZ!YV{sI^0WUCMSe}-wL(vG=FOIY1wF3R)cFIf#sgfOP8UdLOu!)zMIVJKAt(y zuEQS*r*&`3Z{9CC))xjna$6 zORKJ2*XFVr`ucO#i@?R~S#eEoz5Baj?tbpyR)bTAIb`+(&6qigg8b99rF%Wk%b;eV zBX(*y!bFRfp^^facb211VogEA>GS-${g-;(ggpobXJ)b>uw#Hf>!Ty_XwMYnlwIPtX>Lg>v28o7me@_7@Rvj&2gKXW2;#V?@-P_?%?XIUlXZ^~>jfRKPqE z_Cp|{FQdO8pTS+pXpUy}xKY;A*jcqLO)X7uHC^@4mYrAmP18eGUwh0<&CJjh_g1Xm zCrIhd%{IefN!1i*PEIr{NIJ78^X%)RX~ z>wJy@KJvBp{5~~T%-tX6DNO19dTZfL1(m)|C@^3(0A`FF(OVVWsPA3B3RvjKTYmit zV0yPd0ARvw0Pz1KZUF$|_YnYq&4v9xGcbT$xc_VaxA=uxz!dqi)k);%{?Rc<~FY)efIDAJYu4#2zO#|5O>ByV}>bdp$s&8WOFxZN3=?dNZ zQN-)K&-3-k@s+)V8Ns#V&$XL`;=JKq@#v)Eb8Mx*_bTirLL&xK%bh> zL08YHi}P1VKN+(dE!X*{y}5jgp;rq|Yl6UR#J7+W-m8{XV<*dztypzA*?j#M9S-CG z2?%cdyKRg+0!^Y(iKgCB?1Y@l7QJ&@D1 ziNnJ_k_j*{;ODj>GEk66j+&}bNZ`$wVrR!v=x_$TfBh=)d?z63$ z_%!B|zhq{4t#FdKZRg1ucVxigQ~m18-bF)~#&iAoNv!z)oiWKeVq${ zG*!3rn;X=i!aNv+TRaDN^{J4zKGzYvT``Z92QZ)stP{^{aXr$MS*+9TXAYgQtG!`u z=4BsMOyv)?=U#|oHzPt%HHO4*q{Q!IfDm)97*8g)QkOhdz;XL)u;XiIwXvbtbu}!o zHfL+^CdaY0cA@yLxuL#k`}A8D__g&(*ybnP(4aHt3I*R*Ym@Wo)ob^Z-%0gv8~^q?M{st95BWo( zi)c~u)?GAo=g(Qp`mNd6Sh=H{zBuIzjDwgILkX^3Gn_|p$90Q$VM2W#3t?y3LN*H0 zi)UM4GB^th+z_ih2-OruV(5V4sR;@$ z>w97MvE81EX$I{w%_@J6%j64cdTQ|SI^FG>d$MX=s_XVl2@nD7<;|M}czLUV8t0zZ zTlV@-hJY7HTVP&_KPJndb{MhBrj*EdD23mPPuJNsWGsLm&yO!-DAPAx;1s#+#^&OB zUX~Ru^E+W?jSS49mwFx@T+QHy7)E5bR@mlKJOK|S*ADZv2MNZ*QdeI!DR1TA#%35V zroaG435-G-hU$)F2o0v*IEvE5Y(3^h`>SWfO6k*FZqVh#tZv)mU7z=u_|paO<*ob$ z^ZMX<a-vIeOQxb8l$+-n&mzr#rf7~ z`I;lh0BPMoU;G|U{2FBZFqO|Q93<+k$Z@k*y~gk9kU7@8e%ts0xm<$W#a33FLm^Iw zP4NK^t9DeW$Rz;5%#QAQ#zv7x{)zie_)3yEvl`%i-|X$|skZ-$BJicGU3n8)HRZ=9 zW}kU>VU#ZB=WLrWCUmaK(Ugzv=Wut1L51*U&sRcEWS?u$l--Dk1<#KpWGYYzUshl))Ei| zbv~d0{It5x791fnau8rVcbV&9hzpl;Xpnh6y^;v75X0c31#+6wap*|!tI{UdESkw? zV$yi=#4+)Npoio&BnTcPmu`oSX5EgC^uiwgY^gEtf@gapF`1_c=LBHSRrrE0hUgn=XUR1DJ=^{8kg;sp+MS7Xz z6c$->)!JLj0=B6{J2nFs3}YN~{ZAsdyuhLqFPPBE=}8wER%g%LIXln7tWG>SDD>I> z3S0$OE(>{EiCj@ud5u|l0N#vLZT~p8r<;vFa)2A1R4@RwIt&R8@naY$5uJ<2f`HyG z7dOBgl}#|OV?^uWBiiIkaF4X~hE{Df2J;p)WfLNuLf-k{2`jG3{fJxR09UPTaau86 ztmf$2sk5rm;xEa>zQcMZCB9(!J5|F;83g=k4b59J_IWzYfi8;zUF$MNK*3p8NH|eI@UJ8P z5n$BS~t?ODj!k7AUJgTxTA~PsmlQ-d^w3d-~j5j0?K)oc8mmcDRGj1*>D|7g!vr?ho08; zb4-Q|nx1@d6Zn;<$!5FYZD*xS2S2W^=+#7>nAjnBs|`jov)!Vj2jVLMc1wl&l_Npd z4}<)~U5EUdvzv{Hgp5%EdsSUGiUChZS}BhKm370&YPa7Va%uG}9f$^a$_CMG^-Q;L zrZM#cc^zJU=tZ~tDekmS52xapL`Mn)TV_|9*lR?ub){?VIczCBI5cq5Bk1f=Pv)js zG3%^-+iR-MAE5SJxla)bIC&I<)L$Y0bxO4@$M$Hv@MQt4f`K<<0mp;3?0%OjVFRy) zO;rs#hvlM9>ZYzG%sw|sHy!wMa1^U!^U)<8x^J=`XjCY?9jFp|#zwPkpq5wVf|&9? zTH&%yY_tc@_NGZiGQP{LIy39~=iYSaQ}-Hk74Y;KcrEMs`mi^kfTp9Pd&do^i!-}# zUFrf)Ow8Wqjf3R2a+y}-oZ=^|htWC%ou^l@GQWSg`~rKL%kSmAfGQK+PG-7|^P?v; zJ_i(xK`Lk|scD(bf|lw*vg#mp(l5|4>UBqaJ|$2pYSWy;I3gHpBfoWV@N6tpXfTZQ ziwKX;62@sp7=WL-;P|#n(Xq42oc-tsM?qnXP0niJA&-cn8iAegBNg459*SbDh^s!c z;b62~2%F<=&ENG=+;=Sr^Gd6TA7T<9boMx2>Nsd>-}Doypqnk0Ueo&P zs%0O!4uiEy%FJ*4SjLY~7mz>LNoSyG_}0rjz#4jbg;F!fx?Tm35*9lsDM908i$v7H zg9^i+H&ksXG41<1RHcFORqh7?s^-s<)zEHD)*6Q&J`4TC{K0OqqkI?GTPDz^w?+~W z#pPxIsNU$lIF*hq+$+b7%3=n!dla=A`p&nHWDqv}lo53X)lIln%$01O>-E`>rRnNb zkylvfsa8?W&t&%M?Sm$nF7qP1mmUWS*BmYF-onT5mqY;uAmq#dXVAK$Si0Q?GAKJ85 z)2NS_gfXb$TL*7cHml6Ci2JM-$JmNMfZahU-L@a7lC-p!ayiWsn2nQ;gZMI+A)Ez$ zqFhhfm+^YYHvoiV;AbRBy|BMoO6z~4PZF{w>o1t@L9e(Of!T^V_%QW6l8f$JKufFY z^~vJXn{~;)NgCs}boL#(@3*1(A_s1u`HZK6T8?!FJ^O-0mnN6kvhhomd$ph8p1eAn-AuK=uz2JQeP7lA+BVFp6(hzK$^OA_f{)preKRXX$pdkE zqDQ<&I_#y-u~YpWF{H>F>}?1V+R*BNi!DEUJNMl!J7zPNm?&7=j`7?@`1Jg*vK)=7 zEwi$?U$^fte<2Xp3{DJjY_knEudx~OIGm>3vanhYl;#%^D={aTlb;XiX0b=%>wyK| z7!9&nLFiS2gkkrYOD)etgRVweoyykvEJN?n-pz2}NC*XN%M|3@ZBlxiEgV zCZ*(}5NthcL0CKHnnBb#lYq3W>*%A6nk>&3(i|eB#g;eS9%^ruDQHnxHKa^+WeUbl zt@isP%$7{LXU~TVz(X}D7&MN9dwP*hZ_lk`$5aoWUB7TE#0egy4ohqj*`b=U>B4iN ztsAx#|FX@$EZ=(?jIetVnzD}Vw^pm3+tz2iuQFe99DezO;@t6wInHU519~gfLhX;m z;8M5&^DPZ)UNG@DD?ppVo9_|IK4MPCs5pqX{e!~NLFU)qpHDT82T8q_0Wlz94OCLa z;Tv*d&(nV;s;|s8jEu{t>CKeGgy$;8Xdq))AmF!QzpO9M6W#u(l*(ogK?vz&$fUt& zha(I}pxMEFweMUc+yP9OJpvg!U+dksY(xw^qtEb+aVYQvIi}N$rzxMv>HsH0k8h|I zz?aRsl*w~gw`p{d_AwzR-H6F=Xnz&;gL+X>_alCH;hB&UcS-CFOR5SMBJ%*F;C6x< zyDN^@?RO)#8QED_-chjK#Xv%5~oMs$~m)17$$VV>hq=TzA}B`XYLya9!yG!d7nc78H&2 zwkTW&)SYh$mbc>jj{L9LlU{r%r7!M91Dx7b){Lx+f&;@S@}!HP;}U|nCHeN{s6x7` zyCZ+iN{kxxJwf{XxuYh~aEkrv>k*y+QL@7T=xJU`sD=(8Qyc?$x4@Q7Pzx{_9v!`f z90?qwTObvi7K8FUG0{~f9M_#HvO-Y2yVM(7KuH)!sv=c+cMoMj2GLn@WzT4~#9j~V zSRBjjIZs3iZKaU`FEdURZ`7&Kg#)-L|;FDuqq4@~nfimwa9UCR{%JyCMNwWaPv`PIB?=>_ZS1mQtV4QO4sjUhMWBUV} z2R_C1`LSZkIHhFWwr}Cd1*)zFGPQ)S3F`8n>91k6*s;Esbqc;1IZaFNpV7y{bZPj5 z?bO~mBClN(N@q1Z_4A=AHKN`&{fHY7wtd?ZoMLb$@vnKK6m5g&RBt2iWBUSm%S#`( z7U}%Vc6py1w57xonl(D~!DYSPgjDWiELiPIH4($?;iF+q8rLE@>=$MlVkBi&&G&@% z#BM|Yeof%!+%f`uNdA#rBGVf~a@Y#UMf=14Ud91e(*@(u^WKweaZfFPJ>jA}--0M+ zteFBgnTO>h*{G^hbTmsZjZa>7@IHV0LB35XKP`Y+V0laNI?@gDSV>B2l_;)1(AU~D z;R;i8t5~l1l2dCaokTb@hdfK)L?F>jC906K)sAdznouq*?2RrZ(V{DvFw*{hx0gM? zIZFsUUXUC)yUQt3DbfAz=cCse{AS_bCKxvTxWp3hA2eF;Fl=MTp|`V4f>Mbu-Rp+z zAOnCZ{z1x~ee_tRAnu_&S7oRJoO(wVK1|6Mhq!CXfUT^`81lhe@xTc7r})5JXcz8FUVKre7CGaHO1bqmD?uJIakP@ zCpTMki?yqDIiX-mlXoX-;BF$1iOqd{#o&rQt4TBgBE!4BT7w9G$&8ZNK~o&83v^ON ztLJm60#bh4qfrw6_g-6g{Z(5t*b^qoKTN9pEO$0{*#o(g629_rg6xeD3GN{TGP)}V zUFoGgVgRI5l2ejn1X5r04RqD*S6-55ru@M6^BahTch7lTz{y(zer- zJK3f3Sj~-zQJyq}<@m2KW@Z z>&!xynVehSK(Y4g5vOWvYme{&S8_z9BwqCmUj2K){k|_r4$c#kKg0Vy1|(JNxK5hr z{Hl``+>jRF=iaqHg%9Hr^A%(SP-S;9If=uCm5kQdDzk1UMhm@;*{1v39N(JNlx~G% zGzSJdlvE!6yXmU%-)JJ975jzxFlM3u>?Ul_J4M@396d3UxRG}FqxaR0Zme!3ty>px zsCRge)~!GQm;7MXfX>gOfxgjX2x+^bzRo)3cZ5hU8^m%t`gkw_7wxg1l<$RoAP?eJ z6YkilM;P6I*a!Fx9*2Sf6POq`O@y%DuJSe6ACIq92cLW%r-kiPrdgF2?c4WgMmx5J z7p!UmQlauU6jzxy)gUfpA-V92A8ALhf%$~pwXyw9L_Mgr_PjZ!4YAh*U|QmQCH@MV z?fOVw&O+HR{i+>WZ}$vmDfx1HX4qBib<5#n+-vy;y@!Seu66wGbV7w6V~(w%_ENv+ z?FZ56Dw|5~Y-L?DOdC{Ag(I}avKNg)*I;#UrR43OS(j?;OXJ!mTJj1Pnv(o4tczHm z9;FjNCGlPD$M0NTXm0>2VdL>Ys~PlM8dug6m5I(UGovYi)!B2%L9k8Z6{|F!(Ab-M zno2T?RohF}e@EK?)56W>%6w)T{h8e{DiLjR?Y}**7rSuW?u)1{H3#khpkK+`%WJ~^ zl9_!NuzF6*eT?sX?CLSA(0HPL4&n!qzpW(MvkL<*TH!mag!(Ue>jmBw#Hkua)J|Av8d{NAxu$yd-b}SUG>8?#v^W7aQXN6Qp7{1VsMx^huY4Q{CgYKs7@5A7R@R zGwkK;UgZYZtnkneD;`|-j{Ry?n@>M@>=U^&ehMecYsVpP6eox*ngoEGfs{!1HeAqG zddh(aI5)RaQ+{QT9ze!jU(e{F@E#Yw&Bl!jqwsD`xsYY+MP*7D#>}i_hWsR2cL4_nbwq8Ps+~^?2ig@upHrZ0HQIWGErrkJ;yN!sqhPliuDQx7gEmsoDR*y zFF3&8T$LQgNIz_aJ5H>=rGS&wl2eh{xfC9c!4(BB;{GnF*B27dpS$rW z97JVXx{0>w9oyG&D64-%K6}yIt6^nS_;}M#w*%JCmdS)X~zR{#d@iOBt z9b*l{IJm*Ki=j+h(#Rea2`nta!grVg4wjxfx<{zQc)y0sm#Z`A+>}4>l-)?LvGcDM zf0IG|g&rqX8BlmGC)~D%>Ber+?~CgRH|YvfdatjJC4sDQ8n_(Ocf9z(9)uD-OD{Qi z^@;UIf7s=WVy;e%BawP&TT)kqz5_{xX24vVQ9S{AAJsj6(V3hi^0|wUE;@j%-`Zq z8TcDzxw%ildq*R;fC%Vojx*My20NFE;XnK1!Qrcw5(3hVn)q za+!wmOx3ek!h}D&&ik4}qV zk!EqiPVxLak_i2y!^48RbT4g-(zbwYvVJkb`!?=%nXr3Ww#wu2*J>Sn%tXSa_fis@ z$l7`Hy~ed(JhTe8VOtQIHcyis*Oe6$)!ETNdXyPl6uliI{t_U#$#xW`#}d0AwUvuX z>|x>&g)QJDjL;gRcAxSl?+O+2pd%rVeQy|atU`?1EtCV-G`u8-vf|zYe;(Il9V4UA zZb^&b+M3dy4I3-X6C*SgVJ60)3D|n_TbqZ!bNkO>nH8B$Rm-81>q-(*#v77Wx}S5! zrT&V)nB1<@sy${!wLMRXN+rLQay7q-$j>tG{k((;8q93#OYnZd1X%!B4m7gx}~n)F#H2z*P}xv#wHj_*IY??9RlK`<8LwHm}_(z_G%J%Jo*8aqpYMysDX z4hN5nIgP8)XQx)+n9Ii|sA6bd(iN)(mJJ>=$7IaKJkHHs&wMT&#GckXc^|iKyx0(H zaVhcnGVWcZ8B*)kWDKx6KF}5!Jdc6k=(y0Yh5u=?-k5)$UL`!gPRD04T(J~sezUsv z{6!GV>HzZzG*DHyG4F;)R zs$gVVR>{q$6hrUQ=TYEm$02jqiT4Br1R^?74LsPJ2=)~Jmqn5jubJ5}g7;4)vq2b! zR8|#X0uxU$YNUvlt@lBNn4mSDg61ii-bA12`Dk=&G!wTjE{dww57V+kADcIFAd4ol zKC>K&ttWnK9A)Z{XcIJO^Xb=E#+5h7Hr>j=$4mK=s6X2g)9DOSCm!Gjdam}?0zCvk zWhY+zFSu(jhcE&$N2Sr6Y7rOu6ymX5u)G}rQaq6=+DXLPa3M2Xwqu))C7zce>dN9> zFRyPNmDYr6*=qZ&BcZGG&^A6A_8U+lr;pm;ukfI$^4(1X$4o!Jf znoE<4y5iM5C;w&v=-uxhIGepDD~Q=ldOV@h14}De@C0rxj9m;tgTTjAo#%@I=T^9b z-MemrP6+)4qAvW0gaZLDGZR6aoXAgq_dHSdgV+)kcqs^lsN4t8KX?6kAww{zssJQDjBdMwFnh^mN z7fg6UI@yWip$1kE*h}b97kK5TST~A>w&3CymJETSQJF!#Nutk)wNE1bd78 zXD1VKfwK1LhMRx2F7BM@lUevfqBYf1$`)DZ(C_$x*9l}5^7&e%rO2oT2_F-R32?Q+ z+dqZ9+@b0q(Jg4Y<(7Yd#;u(aIoJS={OJmK1j;ze_K`QD-Aw~HH(+03nEP7vCJgm! zB!_eq$vMA9Fa)Dp>Io5g4H`)f<(aya7!25-lyg!kej9adA7pj;-RvD_CPxouDSc0d zsU}JnUwGFn1!;W=aEVJiOqZ7pY`gBz`C~f`c|PAs{3P}=;mv;Y9m_Dv6Hs%(W)DG| z`m-yUZzU6yA;X2E!i4bQabSbMchzkH*;-7>olsOTCTqMQoo}>tB7KN!-LkpfLVp>S zW99Qj+i<#$mecDb6B!;mptcU=v85ew7CE^%nYSf<9F$?~;ttx?HeRb3vd?!Qpizd6 zIF29#L`pu>xj{JYZV-M^2x7I-i=6C%rRbj*nY$(7jsGx6L*^nAy}Ck ztk3lBdB+Xm(X0?L!`h6+S&oR4E9&+`zwzTeKff%Ss0k+=sR$+J>%f(lyu^3AZB?c6p=Ej?DpVxdv*cR+C7+eP6FPA3|~O2GpoS5H+o+mURM zx`5u5y&@G<{-lUL$BJ1cdQ2F>t|wauasp1(><4nM%gAbns?HtjLHT~nykz5b>MpMP zmfWZO3VlWUn^xoSDLk1>`#~5yazC__i6a#>TakaxmfdkjA(vA0aw2P)j38o%`Ze8p zR&$s*4?zmOw7!Cq`8rLrG5VujrOYbFUmuSUPg>bq%UT~mPmUu}L?RrQK}(QJp^Kp2AUf#mP1BRo$!rul>(Gi6uWGbShUem`^)Ql_61;gO zLB3y%#RWcR;x_^Cxcg8xEqi8I`dG3CI0Px1U&b+Cl`tZE#*81mf7<|pkp@L2e2)bI zjzqH8)<=YKh52#UUq}#$uiDS>gCv-Fs6JkX6y|{8@yMOiI0#4vX|g9`Nj<9P8Ht9F zaj!ZjJ~hRC7-u6(40+Ce|J^d0unaR7vz5rdh2&_4Cbj+Pr|+^3Z*#5e{tNDxV%#EvCX9 z|A@ZadV@{k{II>YrK`P?FAqTV0B4w)OHOvSLjOTy`V#!$@Jin?j_BCTLkwyRFV`gi z#SQYe4xFLS)Kdxk)ep}SwFdV#QWAnVR~`s^H(Qldv+#(2OcxJ5jK*by`Xc;oY1bJ= zwD&VpueF4-<;`AbQ`cHE#G&b}MB*R1yhNPF6sv7ELFGBBcG5fuQM9xpNgX#AJ#wW< zPp^bqbk_uqHAcv~l=sIAv!#z~D<%~=E7rs)%eet>1 z!!@yK-}Am48}fktk;7w)unYp=>&nCur^{e{*TT#2Y~nR zBRut*8z+6z(o#ysQNYf^1XB)e5i3q5;B%DIC5+~e(B$L6V(+`1go(}@9|X@Wh)#Vi z{`j@*2|K*Oy!y{ewz~mZ=Lco-zM7?uwT1T+x{bsorT9Ee%<7Z)n1AS@C>*HMx3 zi0i{Geiq;^0Of?)hS^MJ%DFXU(Vu zj?;dec!2ZVKW>R9#n4@Dh?Tvw?0HU~!us-gehwqtX4q4c0Ywbh}~_3 zJ}7BeISVWZy#sF8RD66R5`!pM=z_#+w-ZAiu2-x#SGQ|_6qCD zj5wO|**usSGx9Vv7|@`ORO36ypS}r}PH=-8fy7H2$rbAy{?r?W&81a&`NPd25IbpN zki`6bmXCOIQ*f;}75H@JUvf72>r|STvhV083EQ-Pt&RUl$tLTmQyYh<(}a7$4iJXIo$AmrBH) zjX~Rfv7>p!6k%Ky4sBk1c#mNRgJTWCV%`C+(2X1tHP2E50dlXw#v5Hg7tZ*X6!^*g zF?LkvMp5tGhWO+R)r}F^OrpgI)^f#h$}00p^VngiCz_pdL3hyA#M-K|@g-!(+aoT%6_u;K@$4CpT(oKAI$&p1E~Qsc53d}Y+k5#7}+s89o= zFQb?y9gt7V%dU$x(p}r2;y30>Zt_1x?KOXLOAz4^j(IeH+NaL*|7`&vNJe67kEaN8 zw>$WPt0prh( zY0}`@xzCGQMmN8WZ8G*4_-jr!Nsx)e*15~^kC-t>Ta#m#DK=N;HA}E_v7-9MacH3($g20aRZpbHj?jNo7)Pbo%By#@ROVborGHG6m$ zwH`<>=`X+-y^B8=9)EV~cwSs)oGwphRrM-CvPb~c5!_F0(x6c3Y-;s*x-CET&=*-B z?6N0}yjN|ep=Rp_*^@nLN%ru(6VR_nV*nHG+(2q_Ov2SDH>}o@BAck!qK7f4Vl0Ee z7jndSgPp$yp!;cbqf2mituppYAe}u*1^yPfC(j_2Tt`>e0fTgtz*d63Y))Q&Wl-l5 zwuQm*YHY1(c1rv8gWQ3wdBOMkGFk?kQ$zbp9IhKyt9rqo&oG^Ig6Y!^+WQ1n3`mjq zbna|lUExu60eWu-!#wlMCRMWoSpou0ibkB6gXYTol_a_~ZyFIZ*+C;rk}WSxvcV!t{h>0Q-O$-bbm_2nK>tg8J$ zmQQ>1=G;Okt+0;1dKKq_Q9~Brci!%9Eq}~%{Mp%b54^?&;y(I|yzcBy(QaQB9d<(& z4uv=Gk|y{&ZX%gkk?th#0i04%oI`1<>BpI_7HjH#k5X;l#+=ToT8Kz&0$eOm7^DUA z3tBKW4Quvxds6~i=B@2I$3lGX07g|Z(RS9#`TP-iET}QMilM7xDq2h=da>$ zUMlBFw+k9pUSbr?h^q2VIjVvX_iv3Xi9)>iG{Bd{8wwx5<}Iq9*H}Cm96w{LtDJYF z5c|7a=JXo&PwcbBT?4K60j5ER8zy_`ZH^zb7qQi=_LB2@dqmYWzS!z%>?_cxPp zL@(71&lji%;|KB!jKG<1L!P%1MPFFqYnV+<^Y^Kfe$rcX9SxYLYRPziz@1x`b8^ZI z=0<>C^;*e^GgwLCFF-EaC26yWxxR=fj6u@Os@QFx7iNG*0cBR0M$bHX#d3OYXXw_4cl5 zM&epSrjkI|`&RjoPtOIw%GG{xIe@d4B~r%=qo!Sm-zh@!+YmoHU1<8Jz2oe|fXnAB zrx%%U4v8blQT<|`NXkt$1(yh?8X2{pzUBQ+8&L{5qfXDtgRV?$STh3c!Fg!p0zR1L z0!ci$at7LaQN3CMYTDG*3Pw+gQ2aKVo>%hNnE1(Z4JL?~IvRtGRnGaz*IMAGDyaL(dEnwmUyB5Yh)0V$4A+SlC z)RiaW3_izSZqi*S^2NIJX{;jKlyUS|20iT-mK{ftlOAghiMtS};x_|^)mo|J_glF_ z|01Mhn7au`ayY=D7z9#;QnBG+KK&7%AYJW5H2?Frw1Z0x_v~kh2=SSYdwVOKjL&HB zf(|yyHaFz+BLl34!)(9tzO9Xf7F}<_1RUFcKur4lQO`~Rg-uEJ@W;eUDL5s?dR>4Sve(1R7=B%1!QDKI*WNP_MWwwUt#_3oj5xPJ@yIa^py!0V#QOa@7{*9 zzS8rD&JPkC0{K7vCq}Qtq|#Y^_igaZ=1ZdWD+hU+W|rIH%<7eJHn;eQnhW zXMLzFKBIPH*qw;XXNtL7B9S32_P~AZSAr}LwXn;n#XN;Siv?g9+oV^F4*sGi6tt>~ ziIZWvmmb%>r1g+14`y;8!p>XhaY6GTZ8tI;W`J>Si$sSz4M&_Y;nWZEb@cfZjO4K! zq@j{E66PCIG`sR|lKasW94_eM*V_D@#%uvCNQ3S~k>b0k_<2Dnb<~6T_8)^2%cCasyMf}lmGiLGDWbVPc#m!Z~5$A`qb@O+G9{eycOrP%u%r$ zPrt;5nar247^8e4z4&D33%wXG`mUc!c@xf#))8b4c72JQQ=nh?fes_*nTZ-=$KN4e1vx+7d7u;eK7G}1k;wL9$>dM$fm^%lPH^tI=097-qtUoe z+K&HwW8d@kYAyFq!7bX+wSvzEyBbCE7KBjd^5=8R1~g=sn0$t&xAB8{;ZPV{0j4qe z?V52^06uv7!fy1t2Ov*Z{-S$74R(&sBO0w#E>_e&{h$=_I^yT{7i- zo*K)B0JSG5xb{tZFy6ww*dpXd<{yK+N|Y7u$^IY13fX7|S&C>l-!M*r19k@HID_gztF^4ZY>~HF)1fcxh7`S$LhmRHYL9>zQ?$v75P=xcGq+lYQ`y^Na%WFl(PuW#Cm4Uvc8kz83i2ho11u-YdTJ+4Gj zWXpRHz%}Gu%*jN_s}v1!;O+gd=FYM!j;>k5FhPO`cMXK#?lNd_2ol_aySojN;10oE zLU4C?27+sFcXylN%=7+=^Syhm?%iFxs&>_V6)K(~vG3d3)kWujULcdAr5dt$PP=AB zU&WLBQ5SAC4f_CAh5i6QWpwcjUJ(&YyRHvdEQ#d--OD_<8`#JZ$Wtgrfa)~>`=PMi zifDdaS)t5U45~*tp|q^F3e1lD=H~T*|F}D!cl_PMs&mD-?sZg$s~>UuZr$_7xVzrH znc}&h@`Wnrr+UyP&M9w6+4sVMw@qJBa`b=IQ5K&WfWGt&sPSe}I9~J|jIPYE6FBXo zzJmJzO8th_W8;eD9oii+FuGE;!BuCD7fjeKez+EDr2<-!H|^g4!>< zTD*^UkHQP_=~Pz;Y7v7<&K1V4*bdkpfFQc}3YnZ7v!VqY;rfIpeEUgk6A~R_71e{T zWiOPr=WP&eS5Lc_r*SL@kM+`76=xGhx?AxZ^{p}0bNhG8q>z1o0qmC&Q@WWyu~_N2c??rhFAi*A=|qOHfr^%o0(ap8I}Yh+iq(G2+XS0=1Z9|q@|U7+saj=X?bNY` zW+i&^YN>WNd$DlB2$5_w-W|822BZ3CC!=NkNFIWV`V6x}_JR9iTqmSz=H=J8^K^M% zm)Bm$H@Ph`n8eZ<>lNBAN-@x3^SGQKhrc@_>|{R%mLST?i|i>f7shd< zu#;x2uu#0;gthUnX7oR=Pm9%Yq9uwWH!%BlEKS2m-2P+25fvxKK&nsO=&beIS0Sx? zFPWfF)8Y>#;dXHs(mlIU!s6>?Ux zreCQ(-V*@F_#v`|C|)SYzq|iz^=&tD5AZYI z{jGOBdT(bJUw#ZIXrX^^^Exc;Frl~puwwai*>*V~>a<4lD52r?D=&qVy%|cJv?=fj zTX#kl@&R3Ch&{~i*t>290im0g8CY+kSmAPY;lI4lV(U#_!$3A9pSj%w;Yp!U#@ zWPD{kDortrbbA+@yfhYQL9Fxg#+B=Zqv#8GtFU*FN5!^h67-h&cG7Lem>B4jptvcO zLK9(}n0s3;v<;4@cTatqGrm3ZJqn_vs9q9XA(rN?GXqW^drpU1jv}^3G$Me zO9&M=?DRceN-_U>4A01!pJMwI2C98Mf4dGF7x5IGdkvw4l#e$q8mY#x=fPqnx5+oj z3#)(~LLd=G&5U7VVSzSEut^BAYkCj1o|N(c7S`H!RA9}%9AU~fU2uZQdq&}p8uoW6 z0#~C{nA%^prNXGP)VEDIV}{ChCDgD9qCFJW$dDJx($?9^DU#I5Vw(4y`?q^G9gPxh z*V}4MXuIb8w&TtnpbLDj+BdGitBFUE$F1D(zs{(WnN}tTBHhsGeaEgXnP0E8NkG3O z2APiJv?U4+(ty9?`k{%eF{S7R=8Tf6c-LpnK){HJ3da61!uKL z(ICFZQo#IacE`mG{`92!doNXRTZzOz2w!Awcof;dUys-%`^5S?8eC|xsabJ!U-40S z&yP*J*9Q$aIL40uSO5iXd1QD=q~||rJhyMhTZlJNd+gylev3d4!TV>9-bOb}j^2*0 zPrqa`2s=-I@BcJ%GIfP0Y4I!?dP=*_H>UC-@6hKzP%aS;+wj4=x?fQFWgt&v>DVd{ z1Fv^;y+vJ4z5Y7|=YAM=eD=R?YR_B|bqN!F&h}RI0O^ATMzdbXKVBf+QpH8do&sdc zUT2hgf(yeO5Cf$ntrFr!&}l%7p$&(J?@?!WRSK%_<;|{2(0$a%Ziv@^<=KT&bM&9? zF0}T;6bwzYz_@V}V?t>KqTEJBclz$%UzmzZvIk_;w&Ij4`U~XXaJ$!qeNMsq4;y#2 z{Lq$1zFex!9Xb&$IPnQDabYEr-+kjboNeBcBC|uqG3tNOicT9q_Zb17Ht~`v@)|#} zr17kGoTZxX87p&CtD$M%n)YI4r6y%a=j>{AZt9|Ue2#yd+WA#0E^_b{4KbvTX{R8j zEOe4%kgVi%P5jX3!tj|kb(JLAgUvMfqoaoI_2OJssyya(6!XyzE82h2G|gwzt8XZl z9B2l;*765Zb5teU+WM&N1ZYH7LCRuY*x$Det``E0+`-LQg|5Pof170=gph@N1+213 zcAlxmIj6Ps`eu4tc9D&`v%B2Ea+5{eYjvfhd{Q|tX(0M|vtEAj-7sSf&%mIAlzFw< z-04}Y`qRvLhtj1fwmPQpnNsZ>J6fUFfAr1gf4N=964(aeBgm?EF|=7}DdHv{)t3XL zS$R)ff*`8BSc7KH?Is%~hH}N_k6Y15ld2l?#<@kv)Hdw#3l|G211!oZh;OaD z{}rJVD+PiED6P>;KT4K-K`T~l(|q_7K~!>Cxk~y6p!0gg3LgYlokL9}NqP5P7Jz(X z@d|A5vfdK&5R$>Ez!oXvW-_}Wjx0GNl_XfL!PlUMb-VW0Cul{i69`&YWGoP>H52o# zHg(-c?S~wVcSTfJGeBWL>Unt3R`3vJZDwDk`n z)#-`wax1B6I(yUA+K){*MD(O@q65A3t@;CChUdgXfup%zEs2y|EOy4ENh$&7L~{Q# zvuE8fj;Bv{@U_K%Xjpf8&XRQ?lZ~C#?|Q=>gYb5)J#)QD?{uE6qeqDalySH{V6v3M zK`|jfqUe5hkqRptf^xv_R8*Lsb1azFxpfh_>=!QBh%v)f#YdIZ6cCC-7$hkAfkrs9 z5J&Nt?Y?4$t^Dj^Do?&WR5`m73$!|pj`NL3EpJV5ky|{e=qa}b<#;0@391W z0Vatzl9>~Y#BpMn1qSyRFiB9E|16?Q>BS&!!X*&R)kP2m(iRIu=rVq`x%{7WD<2a#9(@u}%*G zb$3yF7IKWKte?zMH@4-7{G+l?$BQhsB}%-Z0BOK& zJMZ*Q5xs;FbbcCkZtMY9dt5bkBNDQEm}kyOQ0?qJYVI?Tnh|fM8>td_#UM@v;TGq} zUwzr}Z@L!8TiOH-ML)1T< zLL&3(P;0I#mktNfiuGF{x*Z?Fl$AyUluT1sR`OEN%|BH|TQ7!tZ0E7FfNx+nh zmUnG|jv>SxnMV|b2Vr6xcJ913J zOoA4&>E*80mqD=)CggdNMWIYP{W{sB%DwX`1+i!l4QZJH8@^b#71xHhKS&H} zSL0lNdi@#~LmyLY>5sNKttaA%2GdAPF_6D0$)Ut8a1i#TmpgrWc=(8d%}fjx&~ccZ zHKui`N#hUN`QD?}fmQ>SgeUoja>!|EK|!^p@Kb3B(LW;YGv<5n&rNM-xH)d8NN<2S zUYQtbRMd6#NQpR_@^^MtqSt+QFc&b52mWR zh(2D`F{%~y84_JpZRRb@0TIkQ2eXg{peL*c>L^NTT=V@RmJ?&`yHwXgX(sKSJWG8y z?s4}^FxDVHjxc{+?yvE!ndaZ$dn&dg7}?J*QsSY{o7#j@9?|9`-^RPG=B!xjc=;9+ zIX7;E3E^xhJh@11*F$ZUt-z1batxT*&HWMkR#P@)?2($D2IFWG>H$mmWOTiIO3q>W z%aZcwR5~MQis$Bky;K|M(1k-7kNyp#M#iK^sO{pn79eEOiwLmTs=e*X>O{<@nv96u zeN)gKF0J{Mt>n~zh8Gk4i){UzzJXgf{%px$#nR9BK1}#kzyuh9pTn@fEF<=dY~i?( z`y@nIdnVvJ$w!_N7OQQPzi8r9v?3WUQASj2)*+KSl94mZVdvX&kZ9Yi%_RG8?Sjos z#aYV%80r`@ddFYg%ce9dBNv`9E7i57*wDlV>6APm4dIAz#gp2u0{Rv2rx3aOtk9c{{91fS_V@w!@bXA_{YGp_sV%kvz zUqFaVJJPDg*c!yW;t4c}eba2#rmCMwEHC3?QVo{3A}4jdrEp_n%f!m>;H%}tEGeli zvvnB?Zh5r)6?4gKZC?^{f7Uj<=a6tVYgS5oJ|j#9ELFD|n9t;^(;q}SVsfd9^=VBL#)fW9m+9mua}3?j z?{Ob_i`8*}zX(VaX8O}2eu=DdIU?44O4@M!^uqu1#?%;2mUB)pf?MgrlwP&4zPaa zFGVDH-(L8446?6I+HO&hwd(s)%!u)&<1tI~fz_Ftuk5*>cl6ZSvz@NOiqdF@z$JaB z5^4nm$&9^!oA>Z(pM7x1ZCMo0xEDP36$lot3oLcBpXJDc<>&1wfRsV*LS(fBhL>F; z{x4UlIVyOd`zId0UJW%S_wu{O4EU|1o5Fr8Ig07!t|c-=gS25zt=1`egP9QEykfwF zfMIOR`(wr?9SRDOb z*MtHKzzF*WRO1t)u9URO5=&=SQQP<8Rkj`RXw1bDE7m-fGEICGkW$UFDJB*wHpYi>CQ zcR70&`=~oDv~E$!b0|Hq7B`C7=kd6A;MWJnV4UbI^(CuzYekfn5+rH7VsgpYU+5%E z8OIzVPw2+0U+V;P^rHxak3!#r{Pb^3(;H&BKIflk)+$QCgpPwNcM+Pples zjuFdW*BGoD6Psx}))7r~T`e#dtI>17{ z1-=E9(=ol%^wBMJWa$&4CtC7;eBH@ch3y@~N9VebvLx&+@gGx-{(6jzX9Px_%h1m< zR1)rDF#W0xn-sjVleg@#zxPxVBjk!U8k26u-1Z-iBmsz9d46&<8LC#(2=aLA62(2E zW>84C2MsF_PP(rcq2SynOIb_H@PS!ZJUdTFvuB`7;(vavX`X-5ZAG^%CK}-XI?o#L zXRN!Eh#N+l2#yUca6C@(QQ8e_k#;^!^Zl zVCx&8j{QoD;IkbSKSF}06S5ca1k&Jga_^~1e+>BID69#uU-Ufi+Uw9ULvW(TvFkpJ z^|RqVrIu0?&>vuHPtP-%^|HxmELBfAY z>KvHaAHuCk4f)-g{GW7FB|_z*nz9;$;9Q{YYCqH=!)KVADPqPO9GWCwXq>}L(_iG2 z(xu#U>Bkgjh)LD2PtQyl+EK8}6)~4zY^{B>oJZvm$xbGLion9}qiWSWJ{Q#$JU35) zE^PsbL+Ov6Ays)!`(2gt>p2<>M1HY1Ie8(Pq&yt;eKkq-q^+zJXUhiD<(FzZhqzN1 zXw&-yQ?m<>+g|Zf6ynOAnykk6)`L*lMJu~^-L~u4OwFid#MH`a7UN zdfy$SWJZXFO4|5~#dD+g84sP6+5gMNCk2C!vt+#zaX^bW?*of&|8*r3OOQ;xW08@Ln>1Qy9{4xa>0H2- zjAdNuQ$&Utr`Tiw0qIkNKJn0Fv4&>`&l}|G$l5@VLCFvI@b5u^p+&yKKLbD5<09GR z2)JG^%>-rX3*oj@;;an_QILLI^Z#}z*+q9KR}`{Sp#%LR`p^=bDJ!Pi)_NW+WG zc!m+c7`47&wuq}|Ex&B!z?5iyQV(F)mWPYw(o6l}|MCJ|AG=rKtj!k66gUsW9<_Th zwRqfFr;!Iz4b%E{> z{ewk5LdNto0&?}P>V84~ESJt~;a8>@>HV&fe!$KtV@t?vI#qoUSqvrmwgrQnbU{q2 z*?7HScF*9^Oga9C!4n%0B` z>^#*!)m5-N-8`21Ho%QsI)#6y5~!m7`>WqZnAkG6^BQ35=c6)-P%}jT@W&l+L3zum z5|fFQIUk!nxIm!kuLq3`?a(Q1Y8@(hD7UY=0*lyX-knJLq?ZhhhgHJBAR8`FFtNT4 zW^3ZCLn_RbA6oD60o_kKJ-=AlJK>wGW8l9lVrczpXoE(U<`>Zn|HD`?*<|%>c}803 zKg1jw%>t+GD#Rwc=wo5tN%Gb6>z^F%AqEdpg7&MQW}`+Sko)|DL8tB40pTf8dr{%I zS!0&^p>an8VIYZR^8v`!G$bqH3dN1`PyLB`PBYx+sB6+;6%juRd)KqBN70@;4z6_L zuB9G$Ogz~iv`)QGtV1wXo74kQvHF<8n(3L@D@t4RNP~-XmwTQ~$6m985HScwhpT~D zd2vjD{IE7fT|PzccNL*Q7tq?nn9Yy_sZTOXOr+8D%#?!yJJ3;m)G+ANkAC(Fh2s4K zt5e2slzI}gWf1l65Y6-(-5@MHnpy8?j2-X#k|i_xkf@QLsx&L6$909Jd!l}A(bs*= zP)c09ICy@1O&0i!{vT21Wioi@T2f(O+lNr37tMO+wYoBi$^N?irXqi`%s&SW4prwV zhU=sRn3-xc()Ef+utKl8^rdz$CN=+eTF>S;zz-I}mS!)8%B0kZ3At~S4@wNjVKDYx z6-O`y#x}z72t0rJ?Vcnzi@>wx39rs3Oi+vr^jgQ@p;zgDGFqY4`a%#G@bygBAGVtI z*QS5fODG|;{pG2Xn!?-SD8HOJaPZuIE5YM9>HcG+W@+E2o?7l}(HMKgeJZbATa53z zlMz?qvl~tiMZX809pvgqTpGVz=mj#0l^{<1nawgaz z3R+{(yHgfYhXE>_v3E3Z3~H32*01MUdG0VA;n+f|N{BU!`p-E*B-V69(DTIvvnnuiXnL00kK}ga@V}JpV zi%>gL{~f&Jmvwos)(p<+B*35F5%dKGKQ}v5&5*{6H@Ye6hv@1LzwYqFUDB-V9H-D) zbrlC9uMRfB&_VVvMhw%bD`QSQiD&!kgs_r#sY-gG9K=>Pruo{JtZU}z4e*lS$`BO3eKQ4d<*iK!+J*Aq2BTa$AAjR>oZuOembzDLN@ zgKn*H!w_6>h-Y%J9khcDRjY>_sJ~~STqoHgTdK&2@cg!yL~l}yoDYHYzs3y!1#q_V z{ZM4jPpR61eZ$NXgaRAmL~qBM*S(&Ya-%P1$(_p*lR9v`;i(l+cs#wVbN_X_*#_D5{wbP6!IJJD%u3lO)Af)1VRrZ&MzN6Zbo##K!WiV^ z$2JM_qui2nq5YKhhO)Vvdjep;AcyOXq+UjJa=e*a#|EplEU z_Bh<7Se(@+JwU&ZKBeu0nK4rvf2%rsBu7uvBCU6sAZ+!Ju#qWR+>2|Hjqu*`hmyp8 zF_UIPAkZHvQr`mi9u;C%(flcn;rhTnLnyP80+h29>*DfX-8T=1;_tWn$ltTEe z30k0osKzEf5Aq3Lc(L!%#&o87^&ThwZ&%r*<3ojO2n5k`*-jryiNn=tcz-MmP9k4N zh~LH#whX&oHegFy7921~wF7Q?FfSWQs)0V?7BQPU-yUCTHh}YPzoVH%mU6pVr}jbq zu4mJF7f*2)(ZqW~aCa;{kF*yw<_TzU<;&@~mK1{CuX7=exfv6&XMK6QSgR4@(C{x5 zK?ia*O0+ii00QWC164WPO(35)En%%inbR04@yDU>D<~K(*({$eB7juyM!sZyVB4gutzT%lN-)CW;vPudPd$xP8 zQBqvmr|6cA z9K{9hjZng$kj&ADnn^8?OL2~Bx@a6M*@C-Wkn9O0@_Jq$7Ik^UEunno(VTcycwfb0 z7qs3+s=Qro-De8dFQ!M9VMxowW*n1x57!sSW9TCXbaLb%mJ|$;${(Nd3vKHE+R=GM z%VZ^XL;Sy+n8+)_sLwv~V%^(z>E^O~c0L`xEV?GtCzWHjD2O0$`a?4;{_O$;usI*$ zJ_u}+2M$hPINWTwpN>9yMIeSXQ)sDF=f2)z$aHUJ_HUFge?cw)5PBWV7O4m_6)q*`KCkZ{M17vSn(I(Gb%Nzn2TF8x$yhY+&?W#UzpWwUL?rcY>@lLyk|G!s zY(FXJQkf)Bwjeot+Xhfo9*HEk3gJmHlaSdp2Aza$8~brKwxE1|bFXp8STKT?p!q8x zOFlFEKq-Y>H}t?ii83z0bCmE+0)Kd#|NA}Ov4>a2IJ^VoJooqmZ<0vIm*3H%Q)*0y zeKX-jPp78S2wN};0qWbxh=kKL=TQsim~>xBFj){oowx`B8*k! zvZ8y6$HQ?g!5K9a&?{#l`AqfqX%)<#ayGYFnC6)g_V1Za<$lVmK0qWdaK740+sU^2NCmpH6z~%)RFFyPooG_#VVL-_bt_ zv^-cM*Tgr!nUMXGUI(yKLHBqAzs0_gM+Y2BKD>re>TK})=QhuTPA@oAx3hTaCpGSU z!9yNox4rvU*9Oi0+g4H>ffd2=Wo?mDBoSs#`=!)xS;?>v;%3ft?(x>+q)`OJCY@(} zlr6lt_oH78$l<1&pcb0%yM7G{JHda02P3)!uZ{$wm|>g4*p_z3MsAugA6nN{*Kwgz zCG2;zIQZKU5woe!gus}Ir~y@l13Vk?cVM1HLQWW^RM}f0i20$C1WgxKKcp4!$yOX% z%ee_Vb)aY_V*D2Ni`99=K~i=qU!vT}%G*rHQr@V$$iwo)da2P(d(C3ChK;h#nxS_H z{eGoTz_H3c=V|xj#dEu-C^Sd~d9T9|GJOa`i^hH!^2B2Ux@{-L3GYnBU-<^#}q1q-wbZSJD~9ls0W#5{+bl)R}L=nGJyiP@9a@0jjY4Ld^q^2ivrcw5~? zYAq=0ZPNwmGO%YhnGZ9>oZGgTdK-$A;fLT4rmt@o8;rJ1;$=6{=&2aTIL=#^H_34- zu9O+ASm;Ii*9l$rLib%&{P#B?Py^uAf)l>n#qL80@Ek&DIPn1ZN~)N~0=ln#0KK*q zvbAsb98VKYkB~F0Y_xprZsj-g4- z4XD=vqod~A)fLhU{rKBX$vJ4n_xv&8jqi1j2}Uc25(HdacnjsC!3C5lSV%DgJVlA>nN-0)vrN5i zW48&0NLOHlpI-IUw$`EP1kR;Nnv8%$;kc4IA}(Rd8_@ONkKK@*$=6G);b!9(FlfCA zdO!K34_6Ul`tPpTX>KMvuHynL$Nd(Kb)y?c2wtX(-=)n}=Y8;U@IJ9-D58IPbmRL6 z4ygd3qz;Q>$fSQzlKi-&Z*I2(Ru&_D-X-b`_d>TyUXncl2;GY0t^#kVT$yC53BV8n z8SLI-e!|Zks2zU-1{`-8Q9mta@HD-Owp`~fR)V6d>j(+pPB^#K2!bYspS!SzxPoFr z%2T_ADYm_WCiC3b3?>RWQIM4Mpn#)9Ek)4OmmjQP<2-H6m`qK2rA_~*W25Y^?f&vr zJ=EeyY5Oh&0(s=d;c2x{x!tVdc{B#qV?onl14xuYuXsjkq@|~RQMcz zkk3yMBw8^vBQgwpJ#xCOOr>nO`o^TdlseTTHJ@Y-f6k4u;NQa#s*~w%L94)Vp;?&A z)IBWEQpr@~@K64oElS19T%Ao$1G&-okP-p3ow4%N(Xjf7VgZ`wYO182FukKnlO zo6(PK9X@Z@`I+u?KWp`sAYGzNF710MjfJ@TQEXpXI9`57_|sN!i%H3T5AJQLTE`@p zB>FN;iZN@$j#L~yf-Amz%9jbM0lpH6uA<$%?WUW;IQAlM8^D&AN15|*xr!u8zeze^ zkfsdlUFX+Z>HM!|Mr6p_{6xcBE@TDJYuoNKg=*k)P2*8r9m4G-clIU@2*(o^YGrx(|FtaWzt@vgwKBe9C9_C2MX6m6DzNM;RDbGxv(u ztwl6o^|-e^7W6p$b{W(RHGE8yqTf0x7sYygRq7UT-ox_OxZef@niwKHUVUH#&;rrm z(fWEnmTOV^@71qAW~WkgY_YNNj9n@+LlCa#*HKpVu-fd>``FdjrC6G11igcjr+`i0rB}!zu37XB2=O9bN>up;juX)n0n?tBA)FiFGdTmlgZqqP8x+e^eUOcZ} zp<0q0+wGhu4t%36Hp&d;2+avJbgu!D9SbCc_+lP^8(u9J)yqz++5daRh4s3hEBa~+ z^nJsn1W_H+3Lwi}gtT?F0YOwKp=^%6 zhr9F?kzKU>Vb!m+-GuL8Q!lL9!c61uHIMe49gn`*hQua$ykmxAMhay{c)_fo5O_>v z>OOMUqVSo}8W@f+A~0eVKBbDjubs)g3<&3RbqDQ;jYgB3t~Bq(iKd8yc4n8iO2?R? zI%kc{FwZcJCIy1UaEmGfSc`tQOW?_lmnKt3-;2^ldO458%mMm;rHeJ7`Hgxor4JJ{ zkWk`^rbmeI6v=H5>yKU#Kxq~$uBwV+2{g6`+M?5<^nsRRRvJR<9;XvBQ&TkWn{`OD zhnfRBlOH^Aym*VdC2sf58alhpZaKTOFx1D8gNVX7c|{xem)ZS&R=SDbz|gbZio z9;by^xg8M6X5jP0%EE%OKq*9sKsmtZtkiW5>-l~+1?Wb`U`agxk&{42+=vZ9{`!y5 zQ4lkd7{Pl?FKu@I6jSjf&zyR`;FgZ_#aGud z`J>MC8d#~oSL>_f?ADFRCgK2Rik2qkMf>@sLXI~$$kM>w>+YIKOAFJe%kinlyj%e} zb|`jh-rJS^k=^!(gjor zB)XRB#2H=E{aYv?k)b`aG2#oL@ln}S{9GD6NpJ3jDF``v6?>RVuPpo2fU*oTdQ}?V3Ng9~T{;O<9FAAeU zBRBZPVHcs5@K3Rk#SHVfCjzoZAc(zal1j+cgz(2Hs$&QxX(^2rnGPBGFD;@yYgau* zv|Quy2|WgU4zdLyLf%2{*Fvo)(mmWax}oNw;b`^xc0tFqck>;FA8b~^j=C5L;%jv_ zBh2lX=YUG1Pt(uBlKw9gRR5lfRmyQ^yfCs`dgQ`z*X$ubJl~)#{++C8&x2$|${LdN zceGX{9X#h}oBi~be zHLqe^Ql`Hw@>#PWE4Ep0bNIP-{tQQW0*}+cTBQ=~&iUYMHpjha`;U+u>V~<#?6EVO zN56hnr4q8Tm$?ASQ@IaJ@^P`1IlE~U#h973&rU9Z=S4Wam0OQ+^ym}vAILW^p;(fe pIsf5V;)DMB|8zE!>t)XyRt*8sy3U));eWHO /dev/null && pwd )" + +ROOT_DIRECTORY="$SCRIPTS_DIRECTORY/.." +WEBSITE_DIRECTORY="$ROOT_DIRECTORY/docs" + +source "$SCRIPTS_DIRECTORY/environment.sh" + +# Process the command line arguments. +POSITIONAL=() +SERVE=false +while [[ $# -gt 0 ]] +do + key="$1" + case $key in + -s|--serve) + SERVE=true + shift + ;; + *) + POSITIONAL+=("$1") + shift + ;; + esac +done + +# Update the release notes. +"$SCRIPTS_DIRECTORY/update-release-notes.sh" + +# Install the Jekyll dependencies. +export GEM_HOME="$ROOT_DIRECTORY/.local/ruby" +mkdir -p "$GEM_HOME" +export PATH="$GEM_HOME/bin":$PATH +gem install bundler +cd "$WEBSITE_DIRECTORY" +bundle install + +# Get the latest release URL. +if ! DOWNLOAD_URL=$(build-tools latest-github-release inseven tinyboard "TinyBoard-*.zip"); then + echo >&2 failed + exit 1 +fi +# Belt-and-braces check that we managed to get the download URL. +if [[ -z "$DOWNLOAD_URL" ]]; then + echo "Failed to get release download URL." + exit 1 +fi +export DOWNLOAD_URL + +# Determine the version. +VERSION_NUMBER=`changes version` +export VERSION_NUMBER + +# Build the website. +cd "$WEBSITE_DIRECTORY" +if $SERVE ; then + bundle exec jekyll serve --watch +else + bundle exec jekyll build +fi diff --git a/scripts/release-notes.md b/scripts/release-notes.md new file mode 100644 index 0000000..db3c5d7 --- /dev/null +++ b/scripts/release-notes.md @@ -0,0 +1,11 @@ +--- +title: Releases +--- + +{% for release in releases -%} +## {% if release.is_released %}{{ release.version }}{% else %}{{ release.version }} (Unreleased){% endif %} +{% for section in release.sections -%} +{% for change in section.changes | reverse -%} +- {{ change.description | regex_replace("\\s+\\(#(\\d+)\\)$", "") }}{% if change.scope %}{{ change.scope }}{% endif %} +{% endfor %}{% endfor %} +{% endfor %} diff --git a/scripts/update-release-notes.sh b/scripts/update-release-notes.sh new file mode 100755 index 0000000..436ff8b --- /dev/null +++ b/scripts/update-release-notes.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Copyright (c) 2022-2026 Jason Morley +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +set -e +set -o pipefail +set -x +set -u + +SCRIPTS_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +ROOT_DIRECTORY="$SCRIPTS_DIRECTORY/.." +RELEASE_NOTES_TEMPLATE_PATH="$SCRIPTS_DIRECTORY/release-notes.md" +RELEASE_NOTES_DIRECTORY="$ROOT_DIRECTORY/docs/releases" +RELEASE_NOTES_PATH="$RELEASE_NOTES_DIRECTORY/index.md" + +source "$SCRIPTS_DIRECTORY/environment.sh" + +cd "$ROOT_DIRECTORY" + +mkdir -p "$RELEASE_NOTES_DIRECTORY" +changes notes --all --released --template "$RELEASE_NOTES_TEMPLATE_PATH" > "$RELEASE_NOTES_PATH" From ebacee11a31e725df89f2f91e9672fe3622102fe Mon Sep 17 00:00:00 2001 From: Jason Morley Date: Sun, 5 Jul 2026 17:31:10 -1000 Subject: [PATCH 2/3] Use http remotes --- .gitmodules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 2c17b75..9a43f29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,10 +6,10 @@ url = git@github.com:inseven/interact.git [submodule "scripts/changes"] path = scripts/changes - url = git@github.com:jbmorley/changes.git + url = https://github.com/jbmorley/changes.git [submodule "scripts/build-tools"] path = scripts/build-tools - url = git@github.com:jbmorley/build-tools.git + url = https://github.com/jbmorley/build-tools.git [submodule "scripts/Sparkle"] path = scripts/Sparkle url = https://github.com/sparkle-project/Sparkle From e4b65268fd49ba9e7a8d3dc29d7fc73fd1e36470 Mon Sep 17 00:00:00 2001 From: Jason Morley Date: Sun, 5 Jul 2026 17:38:33 -1000 Subject: [PATCH 3/3] Update changes --- scripts/changes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/changes b/scripts/changes index 04dcb21..49d7216 160000 --- a/scripts/changes +++ b/scripts/changes @@ -1 +1 @@ -Subproject commit 04dcb210268151d00a208dd27f162b6bd9d7dc89 +Subproject commit 49d721695e0abbd859ee368186bca297261142d7