Compare commits
7 Commits
2d8fadb968
...
8ef51cb9de
Author | SHA1 | Date |
---|---|---|
Jez Cope | 8ef51cb9de | |
Jez Cope | 72dc0ac56a | |
Jez Cope | 5830d2c6e2 | |
Jez Cope | 1dba4581e8 | |
Jez Cope | ff711a80e4 | |
Jez Cope | 6169653e0a | |
Jez Cope | e5ca41b07e |
|
@ -0,0 +1,99 @@
|
|||
#+title: Projects
|
||||
#+linktitle: projects
|
||||
#+menu: main
|
||||
#+type: page
|
||||
|
||||
I'm trying to move away from relying on any one [[https://en.wikipedia.org/wiki/Forge_(software)][forge]] (e.g. GitHub, GitLab, etc.) for project hosting, so here's a rundown of some of the little open source projects I have scattered around the web right now.
|
||||
|
||||
Some of them have their own issue trackers --- feel free to tell me about bugs or make pull requests there --- but you can also send me bugs, comments or patches at [[mailto:projects@erambler.co.uk][projects@erambler.co.uk]].
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
* Active
|
||||
:PROPERTIES:
|
||||
:ID: ae2de630-b353-4fa3-8139-a6cbb2709442
|
||||
:END:
|
||||
|
||||
Projects that can be considered current: I may or may not have made any significant changes to them recently, but I certainly use them and I would love it if you did too!
|
||||
|
||||
** mxadm
|
||||
|
||||
A simple CLI interface to basic Matrix room admin tasks.
|
||||
|
||||
+ Source: [[https://tildegit.org/petrichor/mxadm]]
|
||||
+ Rust crate: [[https://lib.rs/crates/mxadm][mxadm on lib.rs]]; [[https://crates.io/crates/mxadm][mxadm on crates.io]]
|
||||
|
||||
** Template iPython magics 🎩
|
||||
|
||||
This package provides simple IPython magics to render cells as templates in a variety of different templating languages. It currently supports [[https://www.makotemplates.org/][Mako]] and [[https://jinja.palletsprojects.com/][Jinja2]].
|
||||
|
||||
- Source: [[https://gitlab.com/jezcope/template-ipython-magic]]
|
||||
- Python package: [[https://pypi.org/project/template-ipython-magic/][template-ipython-magic on PyPI]]
|
||||
|
||||
** remarkable-scripts
|
||||
|
||||
A small collection of useful scripts for users of [[https://remarkable.com/][reMarkable paper tablets]].
|
||||
|
||||
- Source: [[https://tildegit.org/petrichor/remarkable-scripts]]
|
||||
|
||||
# ** theme-bl-remark
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
* Dormant
|
||||
|
||||
Projects that I've started and done some work on, often to the point of a working prototype, and that I intend to develop further, but which haven't seen any love recently.
|
||||
|
||||
** pyrefine
|
||||
|
||||
Execute OpenRefine JSON scripts without OpenRefine (or Java).
|
||||
|
||||
- Source: [[https://github.com/jezcope/pyrefine]]
|
||||
|
||||
** csvy-python
|
||||
|
||||
Read CSVY (https://csvy.org/) data packages from Python.
|
||||
|
||||
- Source: [[https://github.com/jezcope/csvy-python]]
|
||||
|
||||
# ** sagadoc
|
||||
|
||||
# ** nix-gently
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
* Experiments & toys
|
||||
|
||||
Things that were done to try something out, or to do a very simple job that I no longer need.
|
||||
|
||||
- doi2oa
|
||||
- altmedals2012
|
||||
- runkeeper-data
|
||||
- Shipton Mill queue checker
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
* Educational examples
|
||||
|
||||
Things that simply exist to demonstrate for others how a thing can be done.
|
||||
|
||||
- binder-nix-flakes
|
||||
- zenodo-example-py
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
* Abandoned
|
||||
|
||||
Stuff that I started and used for a while, but which no longer serve any purpose for me. Feel free to learn from these or [[https://en.wikipedia.org/wiki/Fork_(software_development)][fork]] them as the basis for something of your own
|
||||
|
||||
- dropbox-conflicts-el :: An [[https://www.gnu.org/software/emacs/][emacs]] package to detect conflicted copies of files in your Dropbox on open. [[https://github.com/jezcope/dropbox-conflicts-el]]
|
||||
|
||||
# - beamer-uob
|
||||
# - theme-sidmouth-nikola
|
||||
# - theme-sidmouth-hugo
|
||||
# - Org.tmbundle
|
||||
# - nikola-series
|
||||
# - chrome-scroll-back
|
||||
# - sakaiws-ruby
|
||||
# - OmniSync
|
||||
# - minty
|
|
@ -4,10 +4,10 @@ date: 2020-10-21 14:00:04 UTC+01:00
|
|||
slug: talks
|
||||
type: text
|
||||
data: data/talks.yaml
|
||||
menu:
|
||||
main:
|
||||
name: talks
|
||||
weight: 50
|
||||
# menu:
|
||||
# main:
|
||||
# name: talks
|
||||
# weight: 50
|
||||
---
|
||||
|
||||
Here is a selection of talks that I've given.
|
||||
|
|
12
flake.lock
12
flake.lock
|
@ -2,11 +2,11 @@
|
|||
"nodes": {
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1623875721,
|
||||
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
|
||||
"lastModified": 1631561581,
|
||||
"narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
|
||||
"rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -17,11 +17,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1624992828,
|
||||
"narHash": "sha256-whhfrjqOa1BUQAQu4J0QSRUG+iZbTeJpnsl52kLPBfc=",
|
||||
"lastModified": 1632768365,
|
||||
"narHash": "sha256-dewSDOFvHS9mGXBOB8E4nciQ2QavKpsNRXMSnCKJOxE=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "520da1d00f26d2f4d31eb3cd3c5dc8b3a1e998c6",
|
||||
"rev": "75b5e5ee2642c28687592c24420d2085c1238f4c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
35
flake.nix
35
flake.nix
|
@ -5,12 +5,35 @@
|
|||
inputs.flake-utils.url = "github:numtide/flake-utils";
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
(flake-utils.lib.eachDefaultSystem (system:
|
||||
let pkgs = nixpkgs.legacyPackages.${system};
|
||||
{
|
||||
overlay = self: super:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${super.system};
|
||||
buildIosevka = pkgs.callPackage ./nix/iosevka.nix;
|
||||
in rec {
|
||||
iosevka = buildIosevka { set = "mnemosyne"; };
|
||||
iosevka-aile = buildIosevka { set = "aile-mnemosyne"; };
|
||||
iosevka-etoile = buildIosevka { set = "etoile-mnemosyne"; };
|
||||
|
||||
fonts = pkgs.symlinkJoin {
|
||||
name = "mnemosyne-fonts";
|
||||
paths = [ iosevka iosevka-aile iosevka-etoile ];
|
||||
};
|
||||
|
||||
erambler = pkgs.callPackage ./nix/build.nix { inherit fonts; };
|
||||
};
|
||||
} // flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ self.overlay ];
|
||||
};
|
||||
in {
|
||||
defaultPackage = pkgs.callPackage ./nix/build.nix { };
|
||||
packages = {
|
||||
inherit (pkgs) erambler iosevka iosevka-aile iosevka-etoile fonts;
|
||||
};
|
||||
defaultPackage = pkgs.erambler;
|
||||
|
||||
devShell = pkgs.callPackage ./nix/shell.nix { };
|
||||
})) // {
|
||||
nixosModule = import ./nix/server.nix { inherit self; };
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,13 +1,15 @@
|
|||
{ pkgs, ... }:
|
||||
{ pkgs, fonts, lndir, ... }:
|
||||
|
||||
with pkgs;
|
||||
stdenv.mkDerivation {
|
||||
name = "erambler-html";
|
||||
src = ../.;
|
||||
nativeBuildInputs = [ hugo ];
|
||||
nativeBuildInputs = [ hugo fonts ];
|
||||
buildPhase = "hugo";
|
||||
installPhase = ''
|
||||
mkdir $out
|
||||
cp -R public/* public/.well-known $out
|
||||
cp -R public/* public/.well-known "$out"
|
||||
mkdir -p "$out/font"
|
||||
${lndir}/bin/lndir -silent ${fonts} "$out/font"
|
||||
'';
|
||||
}
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
{ stdenv, lib, nodejs, nodePackages, remarshal, ttfautohint-nox
|
||||
, privateBuildPlan ? builtins.readFile ./private-build-plans.toml
|
||||
, extraParameters ? null, set ? null }:
|
||||
|
||||
assert (privateBuildPlan != null) -> set != null;
|
||||
assert (extraParameters != null) -> set != null;
|
||||
|
||||
let
|
||||
# We don't know the attribute name for the Iosevka package as it
|
||||
# changes not when our update script is run (which in turn updates
|
||||
# node-packages.json, but when node-packages/generate.sh is run
|
||||
# (which updates node-packages.nix).
|
||||
#
|
||||
# Doing it this way ensures that the package can always be built,
|
||||
# although possibly an older version than ioseva-bin.
|
||||
nodeIosevka =
|
||||
(lib.findSingle (drv: drv ? packageName && drv.packageName == "iosevka")
|
||||
(throw "no 'iosevka' package found in nodePackages")
|
||||
(throw "multiple 'iosevka' packages found in nodePackages")
|
||||
(lib.attrValues nodePackages)).override (drv: { dontNpmInstall = true; });
|
||||
in stdenv.mkDerivation rec {
|
||||
pname = if set != null then "iosevka-${set}" else "iosevka";
|
||||
inherit (nodeIosevka) version src;
|
||||
|
||||
nativeBuildInputs = [ nodejs nodeIosevka remarshal ttfautohint-nox ];
|
||||
|
||||
buildPlan = if builtins.isAttrs privateBuildPlan then
|
||||
builtins.toJSON { buildPlans.${pname} = privateBuildPlan; }
|
||||
else
|
||||
privateBuildPlan;
|
||||
|
||||
inherit extraParameters;
|
||||
passAsFile = [ "buildPlan" "extraParameters" ];
|
||||
|
||||
configurePhase = ''
|
||||
runHook preConfigure
|
||||
${lib.optionalString (builtins.isAttrs privateBuildPlan) ''
|
||||
remarshal -i "$buildPlanPath" -o private-build-plans.toml -if json -of toml
|
||||
''}
|
||||
${lib.optionalString (builtins.isString privateBuildPlan) ''
|
||||
cp "$buildPlanPath" private-build-plans.toml
|
||||
''}
|
||||
${lib.optionalString (extraParameters != null) ''
|
||||
echo -e "\n" >> params/parameters.toml
|
||||
cat "$extraParametersPath" >> params/parameters.toml
|
||||
''}
|
||||
ln -s ${nodeIosevka}/lib/node_modules/iosevka/node_modules .
|
||||
runHook postConfigure
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
npm run build --no-update-notifier -- --jCmd=$NIX_BUILD_CORES contents::$pname >/dev/null
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
install -d "$out/ttf"
|
||||
install -d "$out/woff2"
|
||||
install "dist/$pname/ttf"/* "$out/ttf"
|
||||
install "dist/$pname/woff2"/* "$out/woff2"
|
||||
install "dist/$pname/$pname.css" "$out"
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
passthru = { updateScript = ./update-default.sh; };
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://be5invis.github.io/Iosevka";
|
||||
downloadPage = "https://github.com/be5invis/Iosevka/releases";
|
||||
description = ''
|
||||
Slender monospace sans-serif and slab-serif typeface inspired by Pragmata
|
||||
Pro, M+ and PF DIN Mono, designed to be the ideal font for programming.
|
||||
'';
|
||||
license = licenses.ofl;
|
||||
platforms = platforms.all;
|
||||
maintainers = with maintainers; [
|
||||
cstrahan
|
||||
jfrankenau
|
||||
ttuegel
|
||||
babariviere
|
||||
rileyinman
|
||||
AluisioASG
|
||||
];
|
||||
};
|
||||
}
|
|
@ -124,6 +124,10 @@ shape = "italic"
|
|||
menu = "italic"
|
||||
css = "italic"
|
||||
|
||||
[buildPlans.iosevka-mnemosyne.widths.normal]
|
||||
shape = 500
|
||||
menu = 5
|
||||
css = "normal"
|
||||
|
||||
|
||||
[buildPlans.iosevka-etoile-mnemosyne]
|
|
@ -1,8 +1,8 @@
|
|||
@charset "utf-8"
|
||||
|
||||
@import url('../font/iosevka-aile.css')
|
||||
@import url('../font/iosevka-etoile.css')
|
||||
@import url('../font/iosevka.css')
|
||||
@import url('../font/iosevka-aile-mnemosyne.css')
|
||||
@import url('../font/iosevka-etoile-mnemosyne.css')
|
||||
@import url('../font/iosevka-mnemosyne.css')
|
||||
|
||||
@function make-light($c)
|
||||
@return scale-color($c, $lightness: 30%, $saturation: -25%)
|
||||
|
@ -34,7 +34,7 @@ $link: $turquoise
|
|||
@import '_code.scss'
|
||||
|
||||
body
|
||||
font-size: 14px
|
||||
font-size: 16px
|
||||
|
||||
h1, h2, h3, h4, h5, h6
|
||||
font-family: $family-sans-serif
|
||||
|
@ -54,11 +54,14 @@ h1
|
|||
|
||||
h2, .content h2
|
||||
font-size: $size-medium
|
||||
margin: 2em 0 1em;
|
||||
|
||||
&:before
|
||||
content: "## "
|
||||
|
||||
h3, .content h3
|
||||
margin: 2em 0 1em;
|
||||
|
||||
&:before
|
||||
content: "### "
|
||||
|
||||
|
@ -82,7 +85,9 @@ h6, .content h6
|
|||
text-decoration: underline
|
||||
|
||||
ul
|
||||
*:marker
|
||||
margin-left: 2ex
|
||||
|
||||
*::marker
|
||||
font-weight: bold
|
||||
|
||||
list-style-type: "* "
|
||||
|
@ -101,6 +106,12 @@ h6, .content h6
|
|||
&.taxonomy-list.tags-list
|
||||
column-count: 4
|
||||
|
||||
dt
|
||||
font-weight: bold
|
||||
font-style: italic
|
||||
dd
|
||||
margin-left: 2ex
|
||||
|
||||
.summary
|
||||
@extend .hero
|
||||
@extend .my-5
|
||||
|
@ -198,6 +209,8 @@ h6, .content h6
|
|||
padding-bottom: 1em
|
||||
.cactus-comment-avatar
|
||||
flex-shrink: 0
|
||||
.cactus-message-text
|
||||
@extend .content
|
||||
|
||||
#current
|
||||
font-weight: bold
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{{ if . }}
|
||||
<div class="page-tags">
|
||||
<strong>Tags:</strong>
|
||||
{{ range . }}
|
||||
<a href="{{ "/tags/" | relLangURL }}{{ . | urlize }}">[{{ . }}]</a>
|
||||
{{ else }}
|
||||
<em>None</em>
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Aile Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: normal;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-aile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-regular.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Aile Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: normal;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-aile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-italic.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Aile Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: normal;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-aile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bold.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Aile Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: normal;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-aile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bolditalic.ttf') format('truetype');
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Etoile Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: normal;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-etoile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-regular.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Etoile Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: normal;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-etoile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-italic.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Etoile Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: normal;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-etoile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bold.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Etoile Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: normal;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-etoile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bolditalic.ttf') format('truetype');
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: normal;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-regular.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: expanded;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-mnemosyne-extended.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extended.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: normal;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-italic.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
font-stretch: expanded;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-mnemosyne-extendeditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendeditalic.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: normal;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bold.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: expanded;
|
||||
font-style: normal;
|
||||
src: url('woff2/iosevka-mnemosyne-extendedbold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbold.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: normal;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bolditalic.ttf') format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Iosevka Web';
|
||||
font-display: swap;
|
||||
font-weight: 700;
|
||||
font-stretch: expanded;
|
||||
font-style: italic;
|
||||
src: url('woff2/iosevka-mnemosyne-extendedbolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbolditalic.ttf') format('truetype');
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue