From 6b1103ba6b41fee81411afc65b1aaa49f19c58c0 Mon Sep 17 00:00:00 2001 From: qrxnz Date: Sat, 23 Nov 2024 17:05:58 +0100 Subject: [PATCH] jane --- .gitmodules | 3 + content/about.md | 11 + flake.nix | 1 + hugo.toml | 142 +- public/404.html | 634 +++---- public/about/index.html | 911 +++++----- public/categories/index.html | 678 ++++---- public/categories/index.xml | 4 +- public/css/hugo-easy-gallery.css | 83 +- ...899e1723434a82af0d59da9097a8d0233147d9.css | 2 + public/favicon-16x16.png | Bin 0 -> 197 bytes public/favicon-32x32.png | Bin 0 -> 315 bytes public/favicon.ico | Bin 0 -> 4286 bytes public/image/blank-profile.png | Bin 0 -> 16185 bytes public/image/example.jpg | Bin 0 -> 39309 bytes public/index.html | 832 +++++---- public/index.xml | 774 ++++++++- public/js/load-photoswipe.js | 149 +- ...a373b326f3d701bd3304bf8ab6446bdef16653f.js | 177 ++ public/lib/gitment/gitment-0.0.3.min.css | 1 + public/lib/gitment/gitment-0.0.3.min.js | 1 + .../default-skin/default-skin.min.css | 1 + .../photoswipe/default-skin/default-skin.png | Bin 0 -> 547 bytes .../photoswipe/default-skin/default-skin.svg | 1 + .../lib/photoswipe/default-skin/preloader.gif | Bin 0 -> 866 bytes .../photoswipe/photoswipe-ui-default.min.js | 4 + public/lib/photoswipe/photoswipe.min.css | 1 + public/lib/photoswipe/photoswipe.min.js | 4 + public/notes/index.html | 1531 +++++++++++------ public/page/1/index.html | 2 +- public/post/index.html | 755 ++++---- public/post/index.xml | 6 +- public/post/nix-resources/index.html | 868 +++++----- public/post/page/1/index.html | 10 + public/robots.txt | 2 + public/search/index.html | 484 ++++++ public/search/index.xml | 20 + public/search/page/1/index.html | 10 + public/search/placeholder/index.html | 517 ++++++ public/sitemap.xml | 88 +- public/sitemap.xsl | 115 ++ public/tags/dev/index.html | 840 +++++---- public/tags/dev/index.xml | 6 +- public/tags/dev/page/1/index.html | 2 +- public/tags/devops/index.html | 842 +++++---- public/tags/devops/index.xml | 6 +- public/tags/devops/page/1/index.html | 2 +- public/tags/index.html | 751 ++++---- public/tags/index.xml | 19 +- public/tags/linux/index.html | 840 +++++---- public/tags/linux/index.xml | 6 +- public/tags/linux/page/1/index.html | 2 +- ...-conflict-20241123-170347-ADXJBHQ.html.tmp | 488 ++++++ public/tags/nix/index.html | 840 +++++---- ...sync-conflict-20241123-170347-ADXJBHQ.html | 488 ++++++ public/tags/nix/index.xml | 6 +- public/tags/nix/page/1/index.html | 2 +- public/tags/nixos/index.html | 840 +++++---- public/tags/nixos/index.xml | 6 +- public/tags/nixos/page/1/index.html | 2 +- ...s_a9a4924366e3029dbe2e1e55a5076ff9.content | 2 + ...scss_a9a4924366e3029dbe2e1e55a5076ff9.json | 1 + themes/hugo-theme-jane | 1 + 63 files changed, 9131 insertions(+), 5683 deletions(-) create mode 100644 content/about.md create mode 100644 public/css/style.min.6751e1d764328a0738c08294da899e1723434a82af0d59da9097a8d0233147d9.css create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/image/blank-profile.png create mode 100644 public/image/example.jpg create mode 100644 public/js/main.5a843afd465e16c1316cf2f9aa373b326f3d701bd3304bf8ab6446bdef16653f.js create mode 100644 public/lib/gitment/gitment-0.0.3.min.css create mode 100644 public/lib/gitment/gitment-0.0.3.min.js create mode 100644 public/lib/photoswipe/default-skin/default-skin.min.css create mode 100644 public/lib/photoswipe/default-skin/default-skin.png create mode 100644 public/lib/photoswipe/default-skin/default-skin.svg create mode 100644 public/lib/photoswipe/default-skin/preloader.gif create mode 100644 public/lib/photoswipe/photoswipe-ui-default.min.js create mode 100644 public/lib/photoswipe/photoswipe.min.css create mode 100644 public/lib/photoswipe/photoswipe.min.js create mode 100644 public/post/page/1/index.html create mode 100644 public/robots.txt create mode 100644 public/search/index.html create mode 100644 public/search/index.xml create mode 100644 public/search/page/1/index.html create mode 100644 public/search/placeholder/index.html create mode 100644 public/sitemap.xsl create mode 100644 public/tags/nix/.syncthing.index.sync-conflict-20241123-170347-ADXJBHQ.html.tmp create mode 100644 public/tags/nix/index.sync-conflict-20241123-170347-ADXJBHQ.html create mode 100644 resources/_gen/assets/sass/jane.scss_a9a4924366e3029dbe2e1e55a5076ff9.content create mode 100644 resources/_gen/assets/sass/jane.scss_a9a4924366e3029dbe2e1e55a5076ff9.json create mode 160000 themes/hugo-theme-jane diff --git a/.gitmodules b/.gitmodules index dc54414..4fb78e9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "themes/hugo-theme-cleanwhite"] path = themes/hugo-theme-cleanwhite url = https://github.com/qrxnz/hugo-theme-cleanwhite.git +[submodule "themes/hugo-theme-jane"] + path = themes/hugo-theme-jane + url = https://github.com/qrxnz/hugo-theme-jane.git diff --git a/content/about.md b/content/about.md new file mode 100644 index 0000000..fa441b8 --- /dev/null +++ b/content/about.md @@ -0,0 +1,11 @@ +--- +layout: page +multilingual: false +--- + +## About Me +I am a cybersecurity enthusiast, primarily interested in web and hardware. I enjoy developing open source projects, treating it as a fun activity. In my free time, I mainly ride my skateboard and read books… + +I'm trying to regularly upload videos on [YouTube](https://www.youtube.com/@qrxnz9209) and [Odysee](https://odysee.com/@qrxnz:6?r=6t7UjNAVVT5zLF9LhSrzZZ479VWpVXrE) + +soon ... diff --git a/flake.nix b/flake.nix index 2615c49..e8e2c7c 100644 --- a/flake.nix +++ b/flake.nix @@ -17,6 +17,7 @@ { nativeBuildInputs = with pkgs; [ hugo + dart-sass just watchexec treefmt2 diff --git a/hugo.toml b/hugo.toml index 1f58553..9999c95 100644 --- a/hugo.toml +++ b/hugo.toml @@ -1,91 +1,77 @@ -baseurl = "https://qrxnz.dev" +baseURL = "http://qrxnz.dev" title = "qrxnz's blog" -theme = "hugo-theme-cleanwhite" -languageCode = "en-us" -preserveTaxonomyNames = true -paginate = 5 #frontpage pagination -hasCJKLanguage = true +enableRobotsTXT = true +enableEmoji = true +theme = "hugo-theme-jane" -[outputs] -home = ["HTML", "RSS", "Algolia"] +hasCJKLanguage = true # has chinese/japanese/korean ? # 自动检测是否包含 中文\日文\韩文 +rssLimit = 20 # Limit Entry Count to Rss file # 限制 Rss 文章输出数量 +copyright = "" # default: params.author.name ↓ # 默认为下面配置的params.author.name ↓ -[params] - header_image = "img/banner.jpg" - SEOTitle = ":(){ :|:& };:" - description = "re, hardware, web, lincox blah blah blah" - keyword = "linux, foss, nix, floss, nixos, hardware, pentesting, web, web3, android, vulnlab, hackthebox, reverse engineering, hacking, pentesting, itsec, cybersecurity, crypto" - slogan = "first step to not being a noob is to not think like a noob ~ geohot" - upstreamAttribution = true - - image_404 = "img/404-bg.jpg" - title_404 = ":(" - omit_categories = false +[pagination] + pagerSize = 5 # Number of articles displayed on the homepage # 首页每页显示的文章数 - # algolia site search - algolia_search = false - algolia_appId = "" - algolia_indexName = "" - algolia_apiKey = "" +# language support # en / zh-cn / other... translations present in i18n/ +defaultContentLanguage = "en" # Default language to use +[languages.en] + languageCode = "en" - # Sidebar settings - sidebar_about_description = "I am a cybersecurity enthusiast, primarily interested in web and hardware. I enjoy developing open source projects, treating it as a fun activity. In my free time, I mainly ride my skateboard and read books…" - sidebar_avatar = "img/avatar.jpg" # use absolute URL, seeing it's used in both `/` and `/about/` +[sitemap] # essential # 必需 + changefreq = "weekly" + priority = 0.5 + filename = "sitemap.xml" - featured_tags = false - featured_condition_size = 1 +[[menu.main]] # config your menu # 配置目录 + name = "This is Home" + weight = 10 + identifier = "home" + pageref = "/" +[[menu.main]] + name = "Archives" + weight = 20 + identifier = "archives" + pageref = "/post/" +[[menu.main]] + name = "About me" + weight = 20 + identifier = "about" + pageref = "/about" +[[menu.main]] + name = "Tags" + weight = 30 + identifier = "tags" + pageref = "/tags/" - ba_track_id = "" - - reward = false +[params] + since = "2024" # Site creation time # 站点建立时间 + homeFullContent = false # if false, show post summaries on home page. Otherwise show full content. + rssFullContent = true # if false, Rss feed instead of the summary - friends = false - bookmarks = false - about_me = true + author.name = "qrxnz" # essential # 必需 + author.email = "send@qrxnz.dev" # optional, for RSS # 可选 - [params.social] - rss = true - email = "send@qrxnz.dev" - github = "https://github.com/qrxnz" - mastodon = "https://mastodon.social/@qrxnz" - linkedin = "https://linkedin.com/in/karol-skoczyk-a0255b335" - - [[params.friend_link]] - title = "Linda的博客" - href = "https://zhaozhihan.com" + # site info (optional) # 站点信息(可选,不需要的可以直接注释掉) + logoTitle = "qrxnz.dev" # default: the title value # 默认值: 上面设置的title值 + keywords = ["Hugo", "theme","jane"] + description = "qrxnz's blog" - [[params.bookmark_link]] - title = "Martin Fowler" - href = "https://martinfowler.com" - [[params.bookmark_link]] - title = "ServiceMesher" - href = "http://www.servicemesher.com" - [[params.bookmark_link]] - title = "Pxhere" - href = "https://pxhere.com" - [[params.bookmark_link]] - title = "unsplash" - href = "https://unsplash.com" - - [[params.addtional_menus]] - title = "NOTES" - href = "/notes/" - [[params.addtional_menus]] - title = "ABOUT" - href = "/about/" + # The date format to use; for a list of valid formats, see https://gohugo.io/functions/format/ + dateFormatToUse = "2006-01-02" -[outputFormats.Algolia] -baseName = "algolia" -isPlainText = true -mediaType = "application/json" -notAlternative = true + # 一些全局开关,你也可以在每一篇内容的 front matter 中针对单篇内容关闭或开启某些功能,在 archetypes/default.md 查看更多信息。 + # Some global options, you can also close or open something in front matter for a single post, see more information from `archetypes/default.md`. + toc = true # 是否开启目录 + photoswipe = true # see https://github.com/dimsemenov/PhotoSwipe # 是否启用PhotoSwipe(图片可点击) + contentCopyright = false -[params.algolia] -vars = ["title", "summary", "date", "publishdate", "expirydate", "permalink"] -params = ["categories", "tags"] + # Link custom CSS and JS assets + # (relative to /static/css and /static/js respectively) + customCSS = [] # if ['custom.css'], load '/static/css/custom.css' file + customJS = [] # if ['custom.js'], load '/static/js/custom.js' file -[markup] - [markup.tableOfContents] - endLevel = 2 - startLevel = 1 - [markup.highlight] - style = "dracula" + [params.social] # 社交链接 + a-email = "mailto:send@qrxnz.dev" + g-github = "https://github.com/qrxnz" + e-linkedin = "https://www.linkedin.com/in/karol-skoczyk-a0255b335" + s-mastodon = "https://mastodon.social/@qrxnz" + t-youtube = "https://www.youtube.com/@qrxnz9209" diff --git a/public/404.html b/public/404.html index cbda1f2..78320ea 100644 --- a/public/404.html +++ b/public/404.html @@ -1,386 +1,420 @@ - + + - - - + + + + 404 page not found - qrxnz's blog + - - - - - - - + + - - - - - - - - - - + + - - - - - - + + + + + - 404 Page not found | :(){ :|:& };: + - - - - - + - - - - + - - - - - - - - + + - - - - - - - + + - - + -
-
-
-
-
-

qrxnz's blog

- - "😺 first step to not being a noob is to not think like a noob 😺" ~ geohot -
-
-
-
-
-
-
-
-
-
-

404

- :( -
-
-
-
-
- - + - + + - - + + +
+ + + +
+

About Me

I am a cybersecurity enthusiast, primarily interested in web and hardware. I enjoy developing open source projects, treating it as a fun activity. In my free time, I mainly ride my skateboard and read books…

I’m trying to regularly upload videos on YouTube and Odysee

-

Talks

- - - - - - - - - - - - - -
YearCityConferenceTitleSlidesVideo

soon …

-

Open Source Projects

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ProjectDescription
dotfilesLinux dotfiles and NixOS configuration built with Snowfall. My setup is tailored for IT security and DevOps tasks
qrackSimple bruteforcer for CrackMe binaries
jshSimple revshell written in JavaScript (experimental)
blogPersonal blog built with hugo framework
nveemPersonal neovim configuration with nix flake support
stego-toolkit-nixThe finest collection of steganography tools. - You like Docker? You like Podman? You love Nix ❤️
- - - +
+ + - - - - - - - - - - - - - + + + + + + - - + - + + + + + + + + + + - - loadAsync("\/js\/jquery.nav.js", function () { - $('.catalog-body').onePageNav({ - currentClass: "active", - changeHash: !1, - easing: "swing", - filter: "", - scrollSpeed: 700, - scrollOffset: 0, - scrollThreshold: .2, - begin: null, - end: null, - scrollChange: null, - padding: 80 - }); - }); - @@ -554,4 +544,5 @@
FEATURED TAGS
+ diff --git a/public/categories/index.html b/public/categories/index.html index d763518..ad97f91 100644 --- a/public/categories/index.html +++ b/public/categories/index.html @@ -1,413 +1,412 @@ - + + - - - + + + + Categories - qrxnz's blog + - - - - - - - + + - - - - - - - - - - + + - - - - - - + + + + + - Categories | :(){ :|:& };: + - - - - - + - - - - + - - + - - - - - - + + - - - - - - - + + - - + -
-
-
-
-
-

qrxnz's blog

- - "😺 first step to not being a noob is to not think like a noob 😺" ~ geohot -
-
-
-
-
- - - - -
-
-
- -
- - - - - - -
- - -
-
-
- - - - - - + + + + + + + + + + - + + +
+ + + +
+ + + + + + + + + + + +
+ +
-
-
- - -
- -
- -
- -

- Resources for learning Nix and NixOS! -

- -
- -

Nix is difficult…

+ + + + + + + +
+ + +
+

+ + Resources for learning Nix and NixOS! + +

+ + + +
+ +
+ +
+

Nix is difficult…

Nix is difficult… the documentation is poor, and you may encounter many concepts for the first time. While learning Nix and NixOS, YouTube videos can be very helpful, so I have prepared a list of videos that greatly assisted me during my learning.

List of usefull videos:

    @@ -223,336 +357,161 @@

    Nix is difficult…

I also recommend the text guide awesome-nix created by the Nix community.

- -
- -
+ +
+ Read more +
-

+
+ + + + + + + + + + + + + + + + + + + + + -
-
-
- -
- - -
+ +
+ + - + - + - - + + + + - @@ -560,4 +519,5 @@
FEATURED TAGS
+ diff --git a/public/index.xml b/public/index.xml index 4238eaf..0a1bd3b 100644 --- a/public/index.xml +++ b/public/index.xml @@ -4,30 +4,792 @@ qrxnz's blog http://localhost:1313/ Recent content on qrxnz's blog - Hugo - en-us + Hugo -- gohugo.io + en + send@qrxnz.dev (qrxnz) + send@qrxnz.dev (qrxnz) Mon, 18 Nov 2024 07:07:07 +0100 - + + + + Resources for learning Nix and NixOS! http://localhost:1313/post/nix-resources/ Mon, 18 Nov 2024 07:07:07 +0100 + send@qrxnz.dev (qrxnz) http://localhost:1313/post/nix-resources/ - <h2 id="nix-is-difficult">Nix is difficult&hellip;</h2> <p>Nix is difficult&hellip; the documentation is poor, and you may encounter many concepts for the first time. While learning Nix and NixOS, YouTube videos can be very helpful, so I have prepared a list of videos that greatly assisted me during my learning.</p> <p>List of usefull videos:</p> <ul> <li>Jake Hamilton <ul> <li><a href="https://youtu.be/Atn565V7tt8?si=3FJfgV0GbW5_Sfc9">What is Nix?</a></li> <li><a href="https://youtu.be/cw4wJjjQYMU?si=GUyIrX3svknWr01G">Nix Flakes - An Overview</a></li> <li><a href="https://youtu.be/ARjAsEJ9WVY?si=gES1FUphCNaY-FPd">NixOS Flake Tour</a></li> </ul> </li> <li>IogaMaster <ul> <li><a href="https://youtu.be/ua3bjgrcOg8?si=mlNDOKD3b8sYaWdr">Intro to Nix</a></li> <li><a href="https://youtu.be/ylL6CFEw0Ck?si=9ixZ0ovIC4xS_NlM">Nix: Flakes</a></li> <li><a href="https://youtu.be/1ED9b7ERTzI?si=hXwHTY--Lk0EqbFX">HOW to REALLY learn NixOS</a></li> <li><a href="https://youtu.be/C4_P2wVbdFU?si=CD5AuUiHJKUX-YSC">Snowfall | Flakes made EASY</a></li> </ul> </li> <li>Vimjoyer <ul> <li><a href="https://youtu.be/bjTxiFLSNFA?si=KVUZICc45O3qx5-3">NixOS beginner guide</a></li> <li><a href="https://youtu.be/S3VBi6kHw5c?si=fuBQ82LEKozUDXqN">Nix flakes explained</a></li> <li><a href="https://youtu.be/rEovNpg7J0M?si=F5tpV6bxNnmvE8hs">Move your NixOS into a Flake!</a></li> <li><a href="https://youtu.be/FcC2dzecovw?si=1MC0Hf2xmKm2NJau">Nix home-manager tutorial: Declare your entire home directory</a></li> <li><a href="https://youtu.be/diIh0P12arA?si=q6W0vLKbSu_MEidW">Best NixOS Way to Write Your Scripts</a></li> <li><a href="https://youtu.be/yQwW8dkuHqw?si=PcXos65_tsZR8pm-">Nix Dev Environments | Declare Your Coding Projects</a></li> <li><a href="https://youtu.be/G5f6GC7SnhU?si=ITlTAsHtHw7_MQz6">NixOS Secrets Management | SOPS-NIX</a></li> <li><a href="https://youtu.be/F5L8e6WGEF0?si=EEdEeHfpJHTplPWL">Ultimate NixOS Guide | Flakes | Home-manager</a></li> <li><a href="https://youtu.be/YPKwkWtK7l0?si=PPjA35yA0dqncpVH">Perfect NixOS | Impermanence Setup</a></li> </ul> </li> </ul> <p>I also recommend the text guide <a href="https://nix-community.github.io/awesome-nix/">awesome-nix</a> created by the Nix community.</p> + + <h2 id="nix-is-difficult">Nix is difficult&hellip;</h2> +<p>Nix is difficult&hellip; the documentation is poor, and you may encounter many concepts for the first time. While learning Nix and NixOS, YouTube videos can be very helpful, so I have prepared a list of videos that greatly assisted me during my learning.</p> +<p>List of usefull videos:</p> +<ul> +<li>Jake Hamilton +<ul> +<li><a href="https://youtu.be/Atn565V7tt8?si=3FJfgV0GbW5_Sfc9">What is Nix?</a></li> +<li><a href="https://youtu.be/cw4wJjjQYMU?si=GUyIrX3svknWr01G">Nix Flakes - An Overview</a></li> +<li><a href="https://youtu.be/ARjAsEJ9WVY?si=gES1FUphCNaY-FPd">NixOS Flake Tour</a></li> +</ul> +</li> +<li>IogaMaster +<ul> +<li><a href="https://youtu.be/ua3bjgrcOg8?si=mlNDOKD3b8sYaWdr">Intro to Nix</a></li> +<li><a href="https://youtu.be/ylL6CFEw0Ck?si=9ixZ0ovIC4xS_NlM">Nix: Flakes</a></li> +<li><a href="https://youtu.be/1ED9b7ERTzI?si=hXwHTY--Lk0EqbFX">HOW to REALLY learn NixOS</a></li> +<li><a href="https://youtu.be/C4_P2wVbdFU?si=CD5AuUiHJKUX-YSC">Snowfall | Flakes made EASY</a></li> +</ul> +</li> +<li>Vimjoyer +<ul> +<li><a href="https://youtu.be/bjTxiFLSNFA?si=KVUZICc45O3qx5-3">NixOS beginner guide</a></li> +<li><a href="https://youtu.be/S3VBi6kHw5c?si=fuBQ82LEKozUDXqN">Nix flakes explained</a></li> +<li><a href="https://youtu.be/rEovNpg7J0M?si=F5tpV6bxNnmvE8hs">Move your NixOS into a Flake!</a></li> +<li><a href="https://youtu.be/FcC2dzecovw?si=1MC0Hf2xmKm2NJau">Nix home-manager tutorial: Declare your entire home directory</a></li> +<li><a href="https://youtu.be/diIh0P12arA?si=q6W0vLKbSu_MEidW">Best NixOS Way to Write Your Scripts</a></li> +<li><a href="https://youtu.be/yQwW8dkuHqw?si=PcXos65_tsZR8pm-">Nix Dev Environments | Declare Your Coding Projects</a></li> +<li><a href="https://youtu.be/G5f6GC7SnhU?si=ITlTAsHtHw7_MQz6">NixOS Secrets Management | SOPS-NIX</a></li> +<li><a href="https://youtu.be/F5L8e6WGEF0?si=EEdEeHfpJHTplPWL">Ultimate NixOS Guide | Flakes | Home-manager</a></li> +<li><a href="https://youtu.be/YPKwkWtK7l0?si=PPjA35yA0dqncpVH">Perfect NixOS | Impermanence Setup</a></li> +</ul> +</li> +</ul> +<p>I also recommend the text guide <a href="https://nix-community.github.io/awesome-nix/">awesome-nix</a> created by the Nix community.</p> +<p>I hope this list helps someone in their Nix journey.</p> + + + http://localhost:1313/about/ Mon, 01 Jan 0001 00:00:00 +0000 + send@qrxnz.dev (qrxnz) http://localhost:1313/about/ - <h2 id="about-me">About Me</h2> <p>I am a cybersecurity enthusiast, primarily interested in web and hardware. I enjoy developing open source projects, treating it as a fun activity. In my free time, I mainly ride my skateboard and read books…</p> <p>I&rsquo;m trying to regularly upload videos on <a href="https://www.youtube.com/@qrxnz9209">YouTube</a> and <a href="https://odysee.com/@qrxnz:6?r=6t7UjNAVVT5zLF9LhSrzZZ479VWpVXrE">Odysee</a></p> <h2 id="talks">Talks</h2> <table> <thead> <tr> <th style="text-align: left">Year</th> <th style="text-align: left">City</th> <th style="text-align: left">Conference</th> <th style="text-align: left">Title</th> <th style="text-align: left">Slides</th> <th style="text-align: left">Video</th> </tr> </thead> <tbody> </tbody> </table> <p>soon &hellip;</p> <h2 id="open-source-projects">Open Source Projects</h2> <table> <thead> <tr> <th style="text-align: left">Project</th> <th style="text-align: left">Description</th> </tr> </thead> <tbody> <tr> <td style="text-align: left"><a href="https://github.com/qrxnz/dotfiles">dotfiles</a></td> <td style="text-align: left">Linux dotfiles and NixOS configuration built with Snowfall. My setup is tailored for IT security and DevOps tasks</td> </tr> <tr> <td style="text-align: left"><a href="https://github.com/qrxnz/qrack">qrack</a></td> <td style="text-align: left">Simple bruteforcer for CrackMe binaries</td> </tr> <tr> <td style="text-align: left"><a href="https://github.com/qrxnz/jsh">jsh</a></td> <td style="text-align: left">Simple revshell written in JavaScript (experimental)</td> </tr> <tr> <td style="text-align: left"><a href="https://github.com/qrxnz/blog">blog</a></td> <td style="text-align: left">Personal blog built with hugo framework</td> </tr> <tr> <td style="text-align: left"><a href="https://github.com/qrxnz/nveem">nveem</a></td> <td style="text-align: left">Personal neovim configuration with nix flake support</td> </tr> <tr> <td style="text-align: left"><a href="https://github.com/qrxnz/stego-toolkit-nix">stego-toolkit-nix</a></td> <td style="text-align: left">The finest collection of steganography tools. - You like Docker? You like Podman? You love Nix ❤️</td> </tr> </tbody> </table> + + <h2 id="about-me">About Me</h2> +<p>I am a cybersecurity enthusiast, primarily interested in web and hardware. I enjoy developing open source projects, treating it as a fun activity. In my free time, I mainly ride my skateboard and read books…</p> +<p>I&rsquo;m trying to regularly upload videos on <a href="https://www.youtube.com/@qrxnz9209">YouTube</a> and <a href="https://odysee.com/@qrxnz:6?r=6t7UjNAVVT5zLF9LhSrzZZ479VWpVXrE">Odysee</a></p> +<p>soon &hellip;</p> + + + http://localhost:1313/notes/ Mon, 01 Jan 0001 00:00:00 +0000 + send@qrxnz.dev (qrxnz) http://localhost:1313/notes/ - <h1 id="table-of-contents">Table of contents</h1> <!-- raw HTML omitted --> <ul> <li><a href="#nixos">nixos</a> <ul> <li><a href="#flakes">flakes</a> <ul> <li><a href="#dev">dev</a></li> </ul> </li> <li><a href="#network-bridges">network bridges</a></li> </ul> </li> <li><a href="#tools">tools</a> <ul> <li><a href="#nmap">nmap</a></li> <li><a href="#sliver">sliver</a> <ul> <li><a href="#download-the-latest-version">Download the latest version</a></li> </ul> </li> <li><a href="#hydra">hydra</a> <ul> <li><a href="#ssh">ssh</a></li> </ul> </li> <li><a href="#netexec">netexec</a> <ul> <li><a href="#smb">smb</a></li> <li><a href="#ftp">ftp</a></li> <li><a href="#ldap">ldap</a></li> <li><a href="#bloodhound">bloodhound</a></li> <li><a href="#mssql">mssql</a></li> </ul> </li> <li><a href="#john-the-ripper">john the ripper</a> <ul> <li><a href="#yescrypt">yescrypt</a></li> </ul> </li> </ul> </li> <li><a href="#bash-scripts">bash scripts</a> <ul> <li><a href="#tcp-server-with-log">tcp server with log</a></li> </ul> </li> <li><a href="#powershell-scripts">powershell scripts</a> <ul> <li><a href="#decode-base64">decode base64</a></li> <li><a href="#open-ports">open ports</a></li> </ul> </li> <li><a href="#hardware">hardware</a> <ul> <li><a href="#rp-2040">RP 2040</a> <ul> <li><a href="#list-of-useful-firmware">list of useful firmware</a></li> </ul> </li> </ul> </li> </ul> <!-- raw HTML omitted --> <!-- raw HTML omitted --> <h2 id="nixos">nixos</h2> <!-- raw HTML omitted --> <h3 id="flakes">flakes</h3> <!-- raw HTML omitted --> <h4 id="dev">dev</h4> <p>Examples:</p> + + <h1 id="table-of-contents">Table of contents</h1> +<!-- raw HTML omitted --> +<ul> +<li><a href="http://localhost:1313/notes/#nixos">nixos</a> +<ul> +<li><a href="http://localhost:1313/notes/#flakes">flakes</a> +<ul> +<li><a href="http://localhost:1313/notes/#dev">dev</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#network-bridges">network bridges</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#tools">tools</a> +<ul> +<li><a href="http://localhost:1313/notes/#nmap">nmap</a></li> +<li><a href="http://localhost:1313/notes/#sliver">sliver</a> +<ul> +<li><a href="http://localhost:1313/notes/#download-the-latest-version">Download the latest version</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#hydra">hydra</a> +<ul> +<li><a href="http://localhost:1313/notes/#ssh">ssh</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#netexec">netexec</a> +<ul> +<li><a href="http://localhost:1313/notes/#smb">smb</a></li> +<li><a href="http://localhost:1313/notes/#ftp">ftp</a></li> +<li><a href="http://localhost:1313/notes/#ldap">ldap</a></li> +<li><a href="http://localhost:1313/notes/#bloodhound">bloodhound</a></li> +<li><a href="http://localhost:1313/notes/#mssql">mssql</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#john-the-ripper">john the ripper</a> +<ul> +<li><a href="http://localhost:1313/notes/#yescrypt">yescrypt</a></li> +</ul> +</li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#bash-scripts">bash scripts</a> +<ul> +<li><a href="http://localhost:1313/notes/#tcp-server-with-log">tcp server with log</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#powershell-scripts">powershell scripts</a> +<ul> +<li><a href="http://localhost:1313/notes/#decode-base64">decode base64</a></li> +<li><a href="http://localhost:1313/notes/#open-ports">open ports</a></li> +</ul> +</li> +<li><a href="http://localhost:1313/notes/#hardware">hardware</a> +<ul> +<li><a href="http://localhost:1313/notes/#rp-2040">RP 2040</a> +<ul> +<li><a href="http://localhost:1313/notes/#list-of-useful-firmware">list of useful firmware</a></li> +</ul> +</li> +</ul> +</li> +</ul> +<!-- raw HTML omitted --> +<!-- raw HTML omitted --> +<h2 id="nixos">nixos</h2> +<!-- raw HTML omitted --> +<h3 id="flakes">flakes</h3> +<!-- raw HTML omitted --> +<h4 id="dev">dev</h4> +<p>Examples:</p> +<ul> +<li>Python</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nix" data-lang="nix"><span style="display:flex;"><span>{ +</span></span><span style="display:flex;"><span> description <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;test&#34;</span>; +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> inputs <span style="color:#f92672">=</span> { +</span></span><span style="display:flex;"><span> nixpkgs<span style="color:#f92672">.</span>url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;github:nixos/nixpkgs/nixos-unstable&#34;</span>; +</span></span><span style="display:flex;"><span> }; +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> outputs <span style="color:#f92672">=</span> { +</span></span><span style="display:flex;"><span> self<span style="color:#f92672">,</span> +</span></span><span style="display:flex;"><span> nixpkgs<span style="color:#f92672">,</span> +</span></span><span style="display:flex;"><span> <span style="color:#f92672">...</span> +</span></span><span style="display:flex;"><span> } <span style="color:#f92672">@</span> inputs: <span style="color:#66d9ef">let</span> +</span></span><span style="display:flex;"><span> system <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;x86_64-linux&#34;</span>; +</span></span><span style="display:flex;"><span> pkgs <span style="color:#f92672">=</span> nixpkgs<span style="color:#f92672">.</span>legacyPackages<span style="color:#f92672">.</span><span style="color:#e6db74">${</span>system<span style="color:#e6db74">}</span>; +</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">in</span> { +</span></span><span style="display:flex;"><span> devShells<span style="color:#f92672">.</span>x86_64-linux<span style="color:#f92672">.</span>default <span style="color:#f92672">=</span> +</span></span><span style="display:flex;"><span> pkgs<span style="color:#f92672">.</span>mkShell +</span></span><span style="display:flex;"><span> { +</span></span><span style="display:flex;"><span> nativeBuildInputs <span style="color:#f92672">=</span> <span style="color:#66d9ef">with</span> pkgs; [ +</span></span><span style="display:flex;"><span> python311Full +</span></span><span style="display:flex;"><span> python311Packages<span style="color:#f92672">.</span>pycryptodomex +</span></span><span style="display:flex;"><span> ]; +</span></span><span style="display:flex;"><span> }; +</span></span><span style="display:flex;"><span> }; +</span></span><span style="display:flex;"><span>}</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h3 id="network-bridges">network bridges</h3> +<p>Example:</p> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nix" data-lang="nix"><span style="display:flex;"><span> networking<span style="color:#f92672">.</span>interfaces<span style="color:#f92672">.</span>eno1<span style="color:#f92672">.</span>useDHCP <span style="color:#960050;background-color:#1e0010">=</span> <span style="color:#66d9ef">true</span>; +</span></span><span style="display:flex;"><span> networking<span style="color:#f92672">.</span>interfaces<span style="color:#f92672">.</span>virbr0<span style="color:#f92672">.</span>useDHCP <span style="color:#960050;background-color:#1e0010">=</span> <span style="color:#66d9ef">true</span>; +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> networking<span style="color:#f92672">.</span>bridges <span style="color:#960050;background-color:#1e0010">=</span> { +</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;virbr0&#34;</span> <span style="color:#f92672">=</span> { +</span></span><span style="display:flex;"><span> interfaces <span style="color:#f92672">=</span> [ <span style="color:#e6db74">&#34;eno1&#34;</span> ]; +</span></span><span style="display:flex;"><span> }; +</span></span><span style="display:flex;"><span> };</span></span></code></pre></div> +</div> +<p>If you use a firewall, also remember to add your interface to a trust group:</p> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nix" data-lang="nix"><span style="display:flex;"><span>networking<span style="color:#f92672">.</span>firewall<span style="color:#f92672">.</span>trustedInterfaces <span style="color:#960050;background-color:#1e0010">=</span> [ <span style="color:#e6db74">&#34;virbr0&#34;</span> ];</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h2 id="tools">tools</h2> +<!-- raw HTML omitted --> +<h3 id="nmap">nmap</h3> +<ul> +<li>default</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo nmap -sCV -T4 --min-rate <span style="color:#ae81ff">10000</span> <span style="color:#f92672">{</span>IP<span style="color:#f92672">}</span> -v -oA tcp_default</span></span></code></pre></div> +</div> +<ul> +<li>udp</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo nmap -sUCV -T4 --min-rate <span style="color:#ae81ff">10000</span> <span style="color:#f92672">{</span>IP<span style="color:#f92672">}</span> -v -oA udp_default</span></span></code></pre></div> +</div> +<ul> +<li>slient</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo nmap -sS -Pn -T1 --scan-delay 500ms --max-retries <span style="color:#ae81ff">1</span> --max-scan-delay 1000ms -f -p- <span style="color:#f92672">{</span>IP<span style="color:#f92672">}</span></span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h3 id="sliver">sliver</h3> +<!-- raw HTML omitted --> +<h4 id="download-the-latest-version">Download the latest version</h4> +<ul> +<li>server</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>curl -L https://github.com/BishopFox/sliver/releases/latest/download/sliver-server_linux -s --output sliver</span></span></code></pre></div> +</div> +<ul> +<li>client</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>curl -L https://github.com/BishopFox/sliver/releases/latest/download/sliver-client_linux -s --output sliver</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h3 id="hydra">hydra</h3> +<!-- raw HTML omitted --> +<h4 id="ssh">ssh</h4> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>hydra -v -V -u -l <span style="color:#f92672">{</span>Username<span style="color:#f92672">}</span> -P <span style="color:#f92672">{</span>Big_Passwordlist<span style="color:#f92672">}</span> -t <span style="color:#ae81ff">1</span> <span style="color:#f92672">{</span>IP<span style="color:#f92672">}</span> ssh</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h3 id="netexec">netexec</h3> +<!-- raw HTML omitted --> +<h4 id="smb">smb</h4> +<ul> +<li>initial enumeration</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target</span></span></code></pre></div> +</div> +<ul> +<li>null authentication</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u <span style="color:#e6db74">&#39;&#39;</span> -p <span style="color:#e6db74">&#39;&#39;</span></span></span></code></pre></div> +</div> +<ul> +<li>guest authentication</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u <span style="color:#e6db74">&#39;guest&#39;</span> -p <span style="color:#e6db74">&#39;&#39;</span></span></span></code></pre></div> +</div> +<ul> +<li>list shares</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u <span style="color:#e6db74">&#39;&#39;</span> -p <span style="color:#e6db74">&#39;&#39;</span> --shares</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --shares</span></span></code></pre></div> +</div> +<ul> +<li>list usernames</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u <span style="color:#e6db74">&#39;&#39;</span> -p <span style="color:#e6db74">&#39;&#39;</span> --users</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u <span style="color:#e6db74">&#39;&#39;</span> -p <span style="color:#e6db74">&#39;&#39;</span> --rid-brute</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --users</span></span></code></pre></div> +</div> +<ul> +<li>local authentication</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --local-auth</span></span></code></pre></div> +</div> +<ul> +<li>using kerberos</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -k</span></span></code></pre></div> +</div> +<ul> +<li>password spray</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u users.txt -p password --continue-on-success</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u usernames.txt -p passwords.txt --no-bruteforce --continue-on-success</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ssh target -u username -p password --continue-on-success</span></span></code></pre></div> +</div> +<ul> +<li>all in one</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --groups --local-groups --loggedon-users --rid-brute --sessions --users --shares --pass-pol</span></span></code></pre></div> +</div> +<ul> +<li>spider_plus module</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -M spider_plus</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -k --get-file target_file output_file --share sharename</span></span></code></pre></div> +</div> +<ul> +<li>dump a specific file</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -k --get-file target_file output_file --share sharename</span></span></code></pre></div> +</div> +<ul> +<li>dump lsa secrets</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --local-auth --lsa</span></span></code></pre></div> +</div> +<ul> +<li>group policy preferences</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -M gpp_password</span></span></code></pre></div> +</div> +<ul> +<li>dump laps v1 and v2 password</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --laps</span></span></code></pre></div> +</div> +<ul> +<li>dump dpapi credentials</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --laps --dpapi</span></span></code></pre></div> +</div> +<ul> +<li>dump ntds.dit</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password --ntds</span></span></code></pre></div> +</div> +<ul> +<li>webdav - checks whether the webclient service is running on the target</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb ip -u username -p password -M webdav </span></span></code></pre></div> +</div> +<ul> +<li>veeam - extracts credentials from local veeam sql database</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -M veeam</span></span></code></pre></div> +</div> +<ul> +<li>slinky - creates windows shortcuts with the icon attribute containing a UNC path to the specified SMB server in all shares with write permissions</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb ip -u username -p password -M slinky </span></span></code></pre></div> +</div> +<ul> +<li>ntdsutil - dump ntds with ntdsutil</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb ip -u username -p password -M ntdsutil</span></span></code></pre></div> +</div> +<ul> +<li>dump lsass</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -M lsassy</span></span></code></pre></div> +</div> +<ul> +<li>retrieve msol account password</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec smb target -u username -p password -M msol</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h4 id="ftp">ftp</h4> +<ul> +<li>list folders and files</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ftp target -u username -p password --ls</span></span></code></pre></div> +</div> +<ul> +<li>list files inside a folder</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ftp target -u username -p password --ls folder_name</span></span></code></pre></div> +</div> +<ul> +<li>retrieve a specific file</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ftp target -u username -p password --ls folder_name --get file_name</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h4 id="ldap">ldap</h4> +<ul> +<li>enumerate users using ldap</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u <span style="color:#e6db74">&#39;&#39;</span> -p <span style="color:#e6db74">&#39;&#39;</span> --users</span></span></code></pre></div> +</div> +<ul> +<li>all in one</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password --trusted-for-delegation --password-not-required --admin-count --users --groups</span></span></code></pre></div> +</div> +<ul> +<li>kerberoast</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password --kerberoasting kerb.txt</span></span></code></pre></div> +</div> +<ul> +<li>asreproast</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password --asreproast asrep.txt</span></span></code></pre></div> +</div> +<ul> +<li>gmsa</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password --gmsa-convert-id id</span></span></code></pre></div> +</div> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap domain -u username -p password --gmsa-decrypt-lsa gmsa_account</span></span></code></pre></div> +</div> +<ul> +<li>check the machine account quota</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password -M maq</span></span></code></pre></div> +</div> +<ul> +<li>adcs enumeration</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password -M adcs</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h4 id="bloodhound">bloodhound</h4> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec ldap target -u username -p password --bloodhound -ns ip --collection All</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h4 id="mssql">mssql</h4> +<ul> +<li>authentication</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec mssql target -u username -p password</span></span></code></pre></div> +</div> +<ul> +<li>execute commands using xp_cmdshell</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec mssql target -u username -p password -x command_to_execute</span></span></code></pre></div> +</div> +<blockquote> +<p>-X for powershell and -x for cmd</p> +</blockquote> +<ul> +<li>get a file</li> +</ul> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>netexec mssql target -u username -p password --get-file output_file target_file</span></span></code></pre></div> +</div> +<p>source: <a href="https://github.com/seriotonctf/cme-nxc-cheat-sheet">https://github.com/seriotonctf/cme-nxc-cheat-sheet</a></p> +<!-- raw HTML omitted --> +<h3 id="john-the-ripper">john the ripper</h3> +<!-- raw HTML omitted --> +<h4 id="yescrypt">yescrypt</h4> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo unshadow passwd shadow &gt; unshadow.txt <span style="color:#f92672">&amp;&amp;</span> sudo john --format<span style="color:#f92672">=</span>crypt unshadow.txt -w<span style="color:#f92672">=</span>/usr/share/wordlists/rockyou.txt</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h2 id="bash-scripts">bash scripts</h2> +<!-- raw HTML omitted --> +<h3 id="tcp-server-with-log">tcp server with log</h3> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>cd /tmp/ <span style="color:#f92672">&amp;&amp;</span> <span style="color:#66d9ef">while</span> :; <span style="color:#66d9ef">do</span> nc -l -p <span style="color:#ae81ff">4444</span> | tee output.log; sleep 1; <span style="color:#66d9ef">done</span></span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h2 id="powershell-scripts">powershell scripts</h2> +<!-- raw HTML omitted --> +<h3 id="decode-base64">decode base64</h3> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ps1" data-lang="ps1"><span style="display:flex;"><span>Get-Content base64.txt | %{[<span style="color:#66d9ef">Text.Encoding</span>]::UTF8.GetString([<span style="color:#66d9ef">Convert</span>]::FromBase64String($_))}</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h3 id="open-ports">open ports</h3> +<div class="highlight-container"> + + <button class="copy-code-btn outline">Copy</button> + + + <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ps1" data-lang="ps1"><span style="display:flex;"><span>$system_ports = Get-NetTCPConnection -State Listen +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>$text_port = Get-Content -Path C:\Users\Administrator\Desktop\ports.txt +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#66d9ef">foreach</span>($port <span style="color:#66d9ef">in</span> $text_port){ +</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span>($port -in $system_ports.LocalPort){ +</span></span><span style="display:flex;"><span> echo $port +</span></span><span style="display:flex;"><span> } +</span></span><span style="display:flex;"><span> }</span></span></code></pre></div> +</div> +<!-- raw HTML omitted --> +<h2 id="hardware">hardware</h2> +<!-- raw HTML omitted --> +<h3 id="rp-2040">RP 2040</h3> +<!-- raw HTML omitted --> +<h4 id="list-of-useful-firmware">list of useful firmware</h4> +<ul> +<li><a href="https://git.lain.faith/sys64738/DragonProbe">DragonProbe</a></li> +</ul> +<blockquote> +<p>Adding Bus Pirate/..-style debugging &amp; probing features to regular MCU boards such as the Raspberry Pi Pico</p> +</blockquote> +<ul> +<li><a href="https://github.com/kholia/xvc-pico">xvc-pico</a></li> +</ul> +<blockquote> +<p>Raspberry Pico powered Xilinx Virtual Cable - Xilinx JTAG Cable! This is now quite fast, thanks to tom01h! We also support JTAG + serial terminal over a single cable now</p> +</blockquote> +<ul> +<li><a href="https://github.com/stacksmashing/pico-tpmsniffer">pico-tpmsniffer</a></li> +</ul> +<blockquote> +<p>A simple, very experimental TPM sniffer for LPC bus</p> +</blockquote> + + + + + + http://localhost:1313/search/placeholder/ + Mon, 01 Jan 0001 00:00:00 +0000 + send@qrxnz.dev (qrxnz) + http://localhost:1313/search/placeholder/ + + + + + diff --git a/public/js/load-photoswipe.js b/public/js/load-photoswipe.js index 978c66d..a9508a1 100644 --- a/public/js/load-photoswipe.js +++ b/public/js/load-photoswipe.js @@ -5,76 +5,87 @@ Documentation and licence at https://github.com/liwenyip/hugo-easy-gallery/ /* Show an alert if this js file has been loaded twice */ if (window.loadphotoswipejs) { - window.alert("You've loaded load-photoswipe.js twice. See https://github.com/liwenyip/hugo-easy-gallery/issues/6") -} + window.alert("You've loaded load-photoswipe.js twice. See https://github.com/liwenyip/hugo-easy-gallery/issues/6") +} var loadphotoswipejs = 1 /* TODO: Make the share function work */ $( document ).ready(function() { - /* - Initialise Photoswipe - */ - var items = []; // array of slide objects that will be passed to PhotoSwipe() - // for every figure element on the page: - $('figure').each( function() { - if ($(this).attr('class') == 'no-photoswipe') return true; // ignore any figures where class="no-photoswipe" - // get properties from child a/img/figcaption elements, - var $figure = $(this), - $a = $figure.find('a'), - $img = $figure.find('img'), - $src = $a.attr('href'), - $title = $img.attr('alt'), - $msrc = $img.attr('src'); - // if data-size on tag is set, read it and create an item - if ($a.data('size')) { - var $size = $a.data('size').split('x'); - var item = { - src : $src, - w : $size[0], - h : $size[1], - title : $title, - msrc : $msrc - }; - console.log("Using pre-defined dimensions for " + $src); - // if not, set temp default size then load the image to check actual size - } else { - var item = { - src : $src, - w : 800, // temp default size - h : 600, // temp default size - title : $title, - msrc : $msrc - }; - console.log("Using default dimensions for " + $src); - // load the image to check its dimensions - // update the item as soon as w and h are known (check every 30ms) - var img = new Image(); - img.src = $src; - var wait = setInterval(function() { - var w = img.naturalWidth, - h = img.naturalHeight; - if (w && h) { - clearInterval(wait); - item.w = w; - item.h = h; - console.log("Got actual dimensions for " + img.src); - } - }, 30); - } - // Save the index of this image then add it to the array - var index = items.length; - items.push(item); - // Event handler for click on a figure - $figure.on('click', function(event) { - event.preventDefault(); // prevent the normal behaviour i.e. load the hyperlink - // Get the PSWP element and initialise it with the desired options - var $pswp = $('.pswp')[0]; - var options = { - index: index, - bgOpacity: 0.8, - showHideOpacity: true - } - new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options).init(); - }); - }); -}); \ No newline at end of file + /* + Initialise Photoswipe + */ + var items = []; // array of slide objects that will be passed to PhotoSwipe() + + // for every figure & image element on the page: + $('.post-content p > img, figure').each(function () { + var $this = $(this); + var $a, $img, $src, $title, $msrc; + if ($this.attr('class') == 'no-photoswipe') return true; // ignore any figures where class="no-photoswipe" + + // get image properties, + if ($this[0].tagName === 'IMG') { + $src = $this[0].src; + $msrc = $this[0].src; + $title = $this[0].alt; + } else { + // else figure image + $a = $this.find('a'), + $img = $this.find('img'), + $src = $a.attr('href'), + $title = $img.attr('alt'), + $msrc = $img.attr('src'); + } + + // if data-size on tag is set, read it and create an item + if ($a && $a.data('size')) { + var $size = $a.data('size').split('x'); + var item = { + src: $src, + w: $size[0], + h: $size[1], + title: $title, + msrc: $msrc + }; + // console.log("Using pre-defined dimensions for " + $src); + // if not, set temp default size then load the image to check actual size + } else { + var item = { + src: $src, + w: 800, // temp default size + h: 600, // temp default size + title: $title, + msrc: $msrc + }; + // console.log("Using default dimensions for " + $src); + // load the image to check its dimensions + // update the item as soon as w and h are known (check every 30ms) + var img = new Image(); + img.src = $src; + var wait = setInterval(function() { + var w = img.naturalWidth, + h = img.naturalHeight; + if (w && h) { + clearInterval(wait); + item.w = w; + item.h = h; + // console.log("Got actual dimensions for " + img.src); + } + }, 30); + } + // Save the index of this image then add it to the array + var index = items.length; + items.push(item); + // Event handler for click on a figure + $this.on('click', function(event) { + event.preventDefault(); // prevent the normal behaviour i.e. load the hyperlink + // Get the PSWP element and initialise it with the desired options + var $pswp = $('.pswp')[0]; + var options = { + index: index, + bgOpacity: 0.8, + showHideOpacity: true + } + new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options).init(); + }); + }); +}); diff --git a/public/js/main.5a843afd465e16c1316cf2f9aa373b326f3d701bd3304bf8ab6446bdef16653f.js b/public/js/main.5a843afd465e16c1316cf2f9aa373b326f3d701bd3304bf8ab6446bdef16653f.js new file mode 100644 index 0000000..962a62c --- /dev/null +++ b/public/js/main.5a843afd465e16c1316cf2f9aa373b326f3d701bd3304bf8ab6446bdef16653f.js @@ -0,0 +1,177 @@ +(() => { + // ns-hugo:/home/qrxnz/Sync/Dev/deploy/blog/themes/hugo-theme-jane/assets/js/initMobileNavbar.js + var initMobileNavbar = () => { + const mobileNav = document.getElementById("mobile-navbar"); + const mobileNavIcon = document.getElementById("mobile-navbar-icon"); + const mobileMenu = document.getElementById("mobile-menu"); + const mobileMenuCloseModal = document.getElementById("mobile-menu-close-modal"); + mobileNavIcon.addEventListener("click", () => { + mobileMenu.style.width = "80vw"; + mobileMenuCloseModal.style.display = "block"; + document.body.style.overflow = "hidden"; + }); + mobileMenuCloseModal.addEventListener("click", () => { + mobileMenu.style.width = "0"; + mobileMenuCloseModal.style.display = "none"; + document.body.style.overflow = ""; + }); + document.querySelectorAll(".mobile-submenu-open").forEach((submenuOpen) => { + submenuOpen.addEventListener("click", function() { + const mobileSubmenuList = document.querySelectorAll(".mobile-submenu-list"); + const mobileMenuParent = document.querySelectorAll(".mobile-menu-parent"); + if (this.parentElement.nextElementSibling.style.display === "none") { + mobileSubmenuList.forEach((submenu) => { + submenu.style.display = "none"; + submenu.style.height = "0px"; + }); + const nextUl = this.parentElement.nextElementSibling; + nextUl.style.display = "block"; + nextUl.style.height = nextUl.scrollHeight + "px"; + this.parentElement.classList.add("mobile-submenu-show"); + mobileMenuParent.forEach((parent) => { + if (parent !== this.parentElement) { + parent.classList.remove("mobile-submenu-show"); + } + }); + } else { + const nextUl = this.parentElement.nextElementSibling; + nextUl.style.height = "0px"; + setTimeout(() => { + nextUl.style.display = "none"; + }, 300); + this.parentElement.classList.remove("mobile-submenu-show"); + } + }); + }); + }; + var initMobileNavbar_default = initMobileNavbar; + + // ns-hugo:/home/qrxnz/Sync/Dev/deploy/blog/themes/hugo-theme-jane/assets/js/initToc.js + function createTocObserver() { + const headings = document.querySelectorAll("article h1[id], article h2[id], article h3[id], article h4[id], article h5[id], article h6[id]"); + const setCurrentActive = () => { + const allActive = document.querySelectorAll(`#TableOfContents .active`); + if (allActive.length === 0) { + return; + } else { + document.querySelector(`#TableOfContents .current`)?.classList.remove("current"); + document.querySelectorAll(`#TableOfContents .active`)[0]?.classList.add("current"); + } + }; + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + const id = entry.target.getAttribute("id"); + if (entry.intersectionRatio > 0) { + document.querySelector(`#TableOfContents li a[href="#${id}"]`)?.parentElement?.classList.add("active"); + } else { + document.querySelector(`#TableOfContents li a[href="#${id}"]`)?.parentElement?.classList.remove("active"); + } + setCurrentActive(); + }); + }); + headings.forEach((section) => { + observer.observe(section); + }); + } + var initToc = () => { + const tocContainer = document.getElementById("toc"); + if (tocContainer !== null) { + const toc = document.getElementById("TableOfContents"); + if (toc === null) { + tocContainer.parentNode.removeChild(tocContainer); + } else { + createTocObserver(); + } + } + }; + var initToc_default = initToc; + + // ns-hugo:/home/qrxnz/Sync/Dev/deploy/blog/themes/hugo-theme-jane/assets/js/initHeaderAnchor.js + var anchorForId = (id) => { + var anchor = document.createElement("a"); + anchor.className = "header-link"; + anchor.href = "#" + id; + anchor.innerHTML = ''; + return anchor; + }; + var linkifyAnchors = (level, containingElement) => { + var headers = containingElement.getElementsByTagName("h" + level); + for (var h = 0; h < headers.length; h++) { + var header = headers[h]; + header.className = "post-content-header"; + if (typeof header.id !== "undefined" && header.id !== "") { + header.appendChild(anchorForId(header.id)); + } + } + }; + var initHeaderAnchor = () => { + var contentBlock = document.getElementsByClassName("post-content")[0]; + if (!contentBlock) { + return; + } + for (var level = 1; level <= 4; level++) { + linkifyAnchors(level, contentBlock); + } + }; + var initHeaderAnchor_default = initHeaderAnchor; + + // ns-hugo:/home/qrxnz/Sync/Dev/deploy/blog/themes/hugo-theme-jane/assets/js/initToggleTheme.js + function initThemeToggle() { + const html = document.documentElement; + const themeToggles = document.querySelectorAll(".theme-toggle"); + function setTheme(theme) { + html.setAttribute("data-theme", theme); + localStorage.setItem("theme", theme); + } + function toggleTheme() { + const currentTheme = html.getAttribute("data-theme"); + const newTheme = currentTheme === "light" ? "dark" : "light"; + setTheme(newTheme); + } + themeToggles.forEach((toggle) => { + toggle.addEventListener("click", function(e) { + e.preventDefault(); + toggleTheme(); + }); + }); + } + var initToggleTheme_default = initThemeToggle; + + // ns-hugo:/home/qrxnz/Sync/Dev/deploy/blog/themes/hugo-theme-jane/assets/js/initCopyCode.js + var initCopyCode = () => { + const containers = document.querySelectorAll(".highlight-container"); + containers.forEach((container) => { + const copyBtn = container.querySelector(".copy-code-btn"); + const codeElement = container.querySelector(".highlight code[data-lang]"); + copyBtn.addEventListener("click", function() { + navigator.clipboard.writeText(codeElement.textContent).then(function() { + copyBtn.blur(); + copyBtn.innerText = "Copied!"; + setTimeout(function() { + copyBtn.innerText = "Copy"; + }, 2e3); + }, function(error) { + copyBtn.innerText = "Error"; + }); + }); + }); + }; + var initCopyCode_default = initCopyCode; + + // + async function initApp() { + try { + await initToggleTheme_default(); + await Promise.all([ + initMobileNavbar_default(), + initToc_default(), + initHeaderAnchor_default(), + initCopyCode_default() + ]); + console.log("All modules initialized successfully"); + } catch (error) { + console.error("Error occurred during initialization:", error); + } + } + document.addEventListener("DOMContentLoaded", initApp); +})(); diff --git a/public/lib/gitment/gitment-0.0.3.min.css b/public/lib/gitment/gitment-0.0.3.min.css new file mode 100644 index 0000000..9ec26a6 --- /dev/null +++ b/public/lib/gitment/gitment-0.0.3.min.css @@ -0,0 +1 @@ +.gitment-markdown hr::after,.gitment-markdown::after{clear:both}.gitment-container{font-family:sans-serif;font-size:14px;line-height:1.5;color:#333;word-wrap:break-word}.gitment-container *{box-sizing:border-box}.gitment-container :disabled{cursor:not-allowed}.gitment-container a,.gitment-container a:visited{cursor:pointer;text-decoration:none}.gitment-container a:hover{text-decoration:underline}.gitment-container .gitment-hidden{display:none}.gitment-container .gitment-spinner-icon{fill:#333;-webkit-animation:gitment-spin 1s steps(12) infinite;animation:gitment-spin 1s steps(12) infinite}@-webkit-keyframes gitment-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes gitment-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.gitment-header-container,.gitment-root-container{margin:19px 0}.gitment-comment-like-btn,.gitment-comment-reply-btn,.gitment-header-like-btn{cursor:pointer}.gitment-comment-like-btn,.gitment-comment-reply-btn{float:right}.gitment-comment-like-btn.liked{color:#F44336}.gitment-header-like-btn svg{vertical-align:middle;height:30px}.gitment-comment-like-btn svg,.gitment-comment-reply-btn svg{vertical-align:middle;height:20px}.gitment-comment-like-btn.liked svg,.gitment-header-like-btn.liked svg{fill:#F44336}a.gitment-header-issue-link,a.gitment-header-issue-link:visited{float:right;line-height:30px;color:#666}a.gitment-header-issue-link:hover{color:#666}.gitment-comments-empty,.gitment-comments-error,.gitment-comments-loading{text-align:center;margin:50px 0}.gitment-comments-list{list-style:none;padding-left:0;margin:0 0 38px}.gitment-comment,.gitment-editor-container{position:relative;min-height:60px;padding-left:60px;margin:19px 0}.gitment-comment-avatar,.gitment-editor-avatar{float:left;margin-left:-60px}.gitment-comment-avatar,.gitment-comment-avatar-img,.gitment-editor-avatar svg,.gitment-editor-avatar-img{width:44px;height:44px;border-radius:3px}.gitment-editor-avatar .gitment-github-icon{fill:#fff;background-color:#333}.gitment-comment-main,.gitment-editor-main{position:relative;border:1px solid #CFD8DC;border-radius:0}.gitment-comment-main::after,.gitment-comment-main::before,.gitment-editor-main::after,.gitment-editor-main::before{position:absolute;top:11px;left:-16px;display:block;width:0;height:0;pointer-events:none;content:"";border-color:transparent;border-style:solid solid outset}.gitment-comment-main::before,.gitment-editor-main::before{border-width:8px;border-right-color:#CFD8DC}.gitment-comment-main::after,.gitment-editor-main::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.gitment-comment-header{margin:12px 15px;color:#666;background-color:#fff;border-radius:3px}.gitment-editor-header{padding:0;margin:0;border-bottom:1px solid #CFD8DC}a.gitment-comment-name,a.gitment-comment-name:visited{font-weight:600;color:#666}.gitment-editor-tabs{margin-bottom:-1px;margin-left:-1px}.gitment-editor-tab{display:inline-block;padding:11px 12px;font-size:14px;line-height:20px;color:#666;text-decoration:none;background-color:transparent;border-width:0 1px;border-style:solid;border-color:transparent;border-radius:0;white-space:nowrap;cursor:pointer;user-select:none;outline:0}.gitment-editor-tab.gitment-selected{color:#333;background-color:#fff;border-color:#CFD8DC}.gitment-editor-login{float:right;margin-top:-30px;margin-right:15px}a.gitment-editor-login-link,a.gitment-editor-login-link:visited,a.gitment-footer-project-link,a.gitment-footer-project-link:visited{color:#2196F3}a.gitment-editor-logout-link,a.gitment-editor-logout-link:visited{color:#666}a.gitment-editor-logout-link:hover{color:#2196F3;text-decoration:none}.gitment-comment-body{position:relative;margin:12px 15px;overflow:hidden;border-radius:3px}.gitment-comment-body-folded::after,.gitment-comment-body-folded::before{display:block!important;position:absolute;left:0;pointer-events:none;width:100%}.gitment-comment-body-folded{cursor:pointer}.gitment-comment-body-folded::before{content:"";top:0;bottom:50px;background:-webkit-linear-gradient(top,rgba(255,255,255,0),rgba(255,255,255,.9));background:linear-gradient(180deg,rgba(255,255,255,0),rgba(255,255,255,.9))}.gitment-comment-body-folded::after{content:"Click to Expand"!important;text-align:center;color:#666;height:50px;line-height:50px;bottom:0;background:rgba(255,255,255,.9)}.gitment-editor-body{margin:0}.gitment-comment-body>:first-child,.gitment-editor-preview>:first-child{margin-top:0!important}.gitment-comment-body>:last-child,.gitment-editor-preview>:last-child{margin-bottom:0!important}.gitment-editor-body textarea{display:block;width:100%;min-height:150px;max-height:500px;padding:16px;resize:vertical;max-width:100%;margin:0;font-size:14px;line-height:1.6;background-color:#fff;color:#333;vertical-align:middle;border:none;border-radius:0;outline:0;box-shadow:none;overflow:visible}.gitment-editor-body textarea:focus{background-color:#fff}.gitment-editor-preview{min-height:150px;padding:16px;background-color:transparent;width:100%;font-size:14px;line-height:1.5;word-wrap:break-word}.gitment-editor-footer{padding:0;margin-top:10px}.gitment-editor-footer::after{display:table;clear:both;content:""}a.gitment-editor-footer-tip{display:inline-block;padding-top:10px;font-size:12px;color:#666}a.gitment-editor-footer-tip:hover{color:#2196F3;text-decoration:none}.gitment-comments-pagination{list-style:none;text-align:right;border-radius:0;margin:-19px 0 19px}.gitment-comments-page-item{display:inline-block;cursor:pointer;border:1px solid #CFD8DC;margin-left:-1px;padding:.25rem .5rem}.gitment-comments-page-item.gitment-selected,.gitment-comments-page-item:hover{background-color:#f5f5f5}.gitment-comments-init-btn,.gitment-editor-submit{color:#fff;background-color:#00BCD4;position:relative;display:inline-block;padding:7px 13px;font-size:14px;font-weight:600;line-height:20px;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-size:110% 110%;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.gitment-comments-init-btn:hover,.gitment-editor-submit:hover{background-color:#00ACC1}.gitment-comments-init-btn:disabled,.gitment-editor-submit:disabled{color:rgba(255,255,255,.75);background-color:#4DD0E1;box-shadow:none}.gitment-editor-submit{float:right}.gitment-footer-container{margin-top:30px;margin-bottom:20px;text-align:right;font-size:12px}.gitment-markdown{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#333;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.gitment-markdown .pl-c{color:#969896}.gitment-markdown .pl-c1,.gitment-markdown .pl-s .pl-v{color:#0086b3}.gitment-markdown .pl-e,.gitment-markdown .pl-en{color:#795da3}.gitment-markdown .pl-s .pl-s1,.gitment-markdown .pl-smi{color:#333}.gitment-markdown .pl-ent{color:#63a35c}.gitment-markdown .pl-k{color:#a71d5d}.gitment-markdown .pl-pds,.gitment-markdown .pl-s,.gitment-markdown .pl-s .pl-pse .pl-s1,.gitment-markdown .pl-sr,.gitment-markdown .pl-sr .pl-cce,.gitment-markdown .pl-sr .pl-sra,.gitment-markdown .pl-sr .pl-sre{color:#183691}.gitment-markdown .pl-smw,.gitment-markdown .pl-v{color:#ed6a43}.gitment-markdown .pl-bu{color:#b52a1d}.gitment-markdown .pl-c2,.gitment-markdown .pl-ii{color:#f8f8f8;background-color:#b52a1d}.gitment-markdown .pl-c2::before{content:"^M"}.gitment-markdown .pl-sr .pl-cce{font-weight:700;color:#63a35c}.gitment-markdown .pl-ml{color:#693a17}.gitment-markdown .pl-mh,.gitment-markdown .pl-mh .pl-en,.gitment-markdown .pl-ms{font-weight:700;color:#1d3e81}.gitment-markdown .pl-mq{color:teal}.gitment-markdown .pl-mi{font-style:italic;color:#333}.gitment-markdown .pl-mb{font-weight:700;color:#333}.gitment-markdown .pl-md{color:#bd2c00;background-color:#ffecec}.gitment-markdown .pl-mi1{color:#55a532;background-color:#eaffea}.gitment-markdown .pl-mc{color:#ef9700;background-color:#ffe3b4}.gitment-markdown .pl-mi2{color:#d8d8d8;background-color:grey}.gitment-markdown .pl-mdr{font-weight:700;color:#795da3}.gitment-markdown .pl-mo{color:#1d3e81}.gitment-markdown .pl-ba{color:#595e62}.gitment-markdown .pl-sg{color:silver}.gitment-markdown .pl-corl{text-decoration:underline;color:#183691}.gitment-markdown .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.gitment-markdown hr::after,.gitment-markdown hr::before,.gitment-markdown::after,.gitment-markdown::before{display:table;content:""}.gitment-markdown a{background-color:transparent;-webkit-text-decoration-skip:objects;color:#0366d6;text-decoration:none}.gitment-markdown a:active,.gitment-markdown a:hover{outline-width:0}.gitment-markdown h1{margin:.67em 0}.gitment-markdown img{border-style:none}.gitment-markdown svg:not(:root){overflow:hidden}.gitment-markdown hr{box-sizing:content-box}.gitment-markdown input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.gitment-markdown [type=checkbox]{box-sizing:border-box;padding:0}.gitment-markdown *{box-sizing:border-box}.gitment-markdown a:hover{text-decoration:underline}.gitment-markdown strong{font-weight:600}.gitment-markdown td,.gitment-markdown th{padding:0}.gitment-markdown blockquote{margin:0}.gitment-markdown ol ol,.gitment-markdown ul ol{list-style-type:lower-roman}.gitment-markdown ol ol ol,.gitment-markdown ol ul ol,.gitment-markdown ul ol ol,.gitment-markdown ul ul ol{list-style-type:lower-alpha}.gitment-markdown dd{margin-left:0}.gitment-markdown code{font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace}.gitment-markdown pre{font:12px SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;word-wrap:normal}.gitment-markdown .pl-0{padding-left:0!important}.gitment-markdown .pl-1{padding-left:4px!important}.gitment-markdown .pl-2{padding-left:8px!important}.gitment-markdown .pl-3{padding-left:16px!important}.gitment-markdown .pl-4{padding-left:24px!important}.gitment-markdown .pl-5{padding-left:32px!important}.gitment-markdown .pl-6{padding-left:40px!important}.gitment-markdown>:first-child{margin-top:0!important}.gitment-markdown>:last-child{margin-bottom:0!important}.gitment-markdown a:not([href]){color:inherit;text-decoration:none}.gitment-markdown .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.gitment-markdown .anchor:focus{outline:0}.gitment-markdown blockquote,.gitment-markdown dl,.gitment-markdown ol,.gitment-markdown p,.gitment-markdown pre,.gitment-markdown table,.gitment-markdown ul{margin-top:0;margin-bottom:16px}.gitment-markdown hr{overflow:hidden;background:#e1e4e8;height:.25em;padding:0;margin:24px 0;border:0}.gitment-markdown blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.gitment-markdown h1,.gitment-markdown h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}.gitment-markdown blockquote>:first-child{margin-top:0}.gitment-markdown blockquote>:last-child{margin-bottom:0}.gitment-markdown h1,.gitment-markdown h2,.gitment-markdown h3,.gitment-markdown h4,.gitment-markdown h5,.gitment-markdown h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.gitment-markdown h1 .octicon-link,.gitment-markdown h2 .octicon-link,.gitment-markdown h3 .octicon-link,.gitment-markdown h4 .octicon-link,.gitment-markdown h5 .octicon-link,.gitment-markdown h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.gitment-markdown h1:hover .anchor,.gitment-markdown h2:hover .anchor,.gitment-markdown h3:hover .anchor,.gitment-markdown h4:hover .anchor,.gitment-markdown h5:hover .anchor,.gitment-markdown h6:hover .anchor{text-decoration:none}.gitment-markdown h1:hover .anchor .octicon-link,.gitment-markdown h2:hover .anchor .octicon-link,.gitment-markdown h3:hover .anchor .octicon-link,.gitment-markdown h4:hover .anchor .octicon-link,.gitment-markdown h5:hover .anchor .octicon-link,.gitment-markdown h6:hover .anchor .octicon-link{visibility:visible}.gitment-markdown h1{font-size:2em}.gitment-markdown h2{font-size:1.5em}.gitment-markdown h3{font-size:1.25em}.gitment-markdown h4{font-size:1em}.gitment-markdown h5{font-size:.875em}.gitment-markdown h6{font-size:.85em;color:#6a737d}.gitment-markdown ol,.gitment-markdown ul{padding-left:2em}.gitment-markdown ol ol,.gitment-markdown ol ul,.gitment-markdown ul ol,.gitment-markdown ul ul{margin-top:0;margin-bottom:0}.gitment-markdown li>p{margin-top:16px}.gitment-markdown li+li{margin-top:.25em}.gitment-markdown dl{padding:0}.gitment-markdown dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.gitment-markdown dl dd{padding:0 16px;margin-bottom:16px}.gitment-markdown table{border-spacing:0;border-collapse:collapse;display:block;width:100%;overflow:auto}.gitment-markdown table th{font-weight:600}.gitment-markdown table td,.gitment-markdown table th{padding:6px 13px;border:1px solid #dfe2e5}.gitment-markdown table tr{background-color:#fff;border-top:1px solid #c6cbd1}.gitment-markdown table tr:nth-child(2n){background-color:#f5f5f5}.gitment-markdown img{max-width:100%;box-sizing:content-box;background-color:#fff}.gitment-markdown code{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:0}.gitment-markdown code::after,.gitment-markdown code::before{letter-spacing:-.2em;content:"\00a0"}.gitment-markdown pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.gitment-markdown .highlight{margin-bottom:16px}.gitment-markdown .highlight pre{margin-bottom:0;word-break:normal}.gitment-markdown .highlight pre,.gitment-markdown pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f5f5f5;border-radius:0}.gitment-markdown pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.gitment-markdown pre code::after,.gitment-markdown pre code::before{content:normal}.gitment-markdown .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.gitment-markdown kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fcfcfc;border:1px solid #c6cbd1;border-bottom-color:#959da5;border-radius:0;box-shadow:inset 0 -1px 0 #959da5}.gitment-markdown :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.gitment-markdown .task-list-item{list-style-type:none}.gitment-markdown .task-list-item+.task-list-item{margin-top:3px}.gitment-markdown .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.gitment-markdown hr{border-bottom-color:#eee} \ No newline at end of file diff --git a/public/lib/gitment/gitment-0.0.3.min.js b/public/lib/gitment/gitment-0.0.3.min.js new file mode 100644 index 0000000..9b2592d --- /dev/null +++ b/public/lib/gitment/gitment-0.0.3.min.js @@ -0,0 +1 @@ +var Gitment=function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LS_ACCESS_TOKEN_KEY="gitment-comments-token",t.LS_USER_KEY="gitment-user-info",t.NOT_INITIALIZED_ERROR=new Error("Comments Not Initialized")},function(e,t,n){"use strict";(function(n){function r(e){return function(t,n,r){return r&&"function"==typeof r.value?(r.value=V(e,r.value),r.enumerable=!1,r.configurable=!0,r):Kt(e).apply(this,arguments)}}function i(e,t,n){var r="string"==typeof e?e:e.name||"",i="function"==typeof e?e:t,o="function"==typeof e?t:n;return wt("function"==typeof i,vt("m002")),wt(0===i.length,vt("m003")),wt("string"==typeof r&&r.length>0,"actions should have valid names, got: '"+r+"'"),z(r,i,o,void 0)}function o(e){return"function"==typeof e&&!0===e.isMobxAction}function a(e,t,n){var r=function(){return z(t,n,e,arguments)};r.isMobxAction=!0,Ct(e,t,r)}function s(e,t,n){function r(){a(u)}var i,a,s;"string"==typeof e?(i=e,a=t,s=n):(i=e.name||"Autorun@"+bt(),a=e,s=t),wt("function"==typeof a,vt("m004")),wt(!1===o(a),vt("m005")),s&&(a=a.bind(s));var u=new fn(i,function(){this.track(r)});return u.schedule(),u.getDisposer()}function u(e,t,n,r){var i,o,a,u;return"string"==typeof e?(i=e,o=t,a=n,u=r):(i="When@"+bt(),o=e,a=t,u=n),s(i,function(e){if(o.call(u)){e.dispose();var t=te();a.call(u),ne(t)}})}function c(e,t,n,r){function i(){s(h)}var a,s,u,c;"string"==typeof e?(a=e,s=t,u=n,c=r):(a=e.name||"AutorunAsync@"+bt(),s=e,u=t,c=n),wt(!1===o(s),vt("m006")),void 0===u&&(u=1),c&&(s=s.bind(c));var l=!1,h=new fn(a,function(){l||(l=!0,setTimeout(function(){l=!1,h.isDisposed||h.track(i)},u))});return h.schedule(),h.getDisposer()}function l(e,t,n){function r(){if(!u.isDisposed){var n=!1;u.track(function(){var t=e(u);n=Tt(i.compareStructural,o,t),o=t}),a&&i.fireImmediately&&t(o,u),a||!0!==n||t(o,u),a&&(a=!1)}}arguments.length>3&&yt(vt("m007")),Ve(e)&&yt(vt("m008"));var i;i="object"===(void 0===n?"undefined":Ut(n))?n:{},i.name=i.name||e.name||t.name||"Reaction@"+bt(),i.fireImmediately=!0===n||!0===i.fireImmediately,i.delay=i.delay||0,i.compareStructural=i.compareStructural||i.struct||!1,t=Yt(i.name,i.context?t.bind(i.context):t),i.context&&(e=e.bind(i.context));var o,a=!0,s=!1,u=new fn(i.name,function(){a||i.delay<1?r():s||(s=!0,setTimeout(function(){s=!1,r()},i.delay))});return u.schedule(),u.getDisposer()}function h(e){return ct(function(t,n,r,i,o){wt(void 0!==o,vt("m009")),wt("function"==typeof o.get,vt("m010")),Ze(Fe(t,""),n,o.get,o.set,e,!1)},function(e){var t=this.$mobx.values[e];if(void 0!==t)return t.get()},function(e,t){this.$mobx.values[e].set(t)},!1,!1)}function d(e,t){wt("function"==typeof e&&e.length<2,"createTransformer expects a function that accepts one argument");var n={},r=pn.resetId,i=function(r){function i(t,n){var i=r.call(this,function(){return e(n)},void 0,!1,"Transformer-"+e.name+"-"+t,void 0)||this;return i.sourceIdentifier=t,i.sourceObject=n,i}return Ht(i,r),i.prototype.onBecomeUnobserved=function(){var e=this.value;r.prototype.onBecomeUnobserved.call(this),delete n[this.sourceIdentifier],t&&t(e,this.sourceObject)},i}(sn);return function(e){r!==pn.resetId&&(n={},r=pn.resetId);var t=p(e),o=n[t];return o?o.get():(o=n[t]=new i(t,e),o.get())}}function p(e){if("string"==typeof e||"number"==typeof e)return e;if(null===e||"object"!==(void 0===e?"undefined":Ut(e)))throw new Error("[mobx] transform expected some kind of object or primitive value, got: "+e);var t=e.$transformId;return void 0===t&&(t=bt(),Ct(e,"$transformId",t)),t}function f(e,t){return J()||console.warn(vt("m013")),Jt(e,{context:t}).get()}function m(e){for(var t=[],n=1;n=2,vt("m014")),wt("object"===(void 0===e?"undefined":Ut(e)),vt("m015")),wt(!Tn(e),vt("m016")),n.forEach(function(e){wt("object"===(void 0===e?"undefined":Ut(e)),vt("m017")),wt(!A(e),vt("m018"))});for(var r=Fe(e),i={},o=n.length-1;o>=0;o--){var a=n[o];for(var s in a)if(!0!==i[s]&&Lt(a,s)){if(i[s]=!0,e===a&&!jt(e,s))continue;var u=Object.getOwnPropertyDescriptor(a,s);Xe(r,s,u,t)}}return e}function b(e,t){return y(at(e,t))}function y(e){var t={name:e.name};return e.observing&&e.observing.length>0&&(t.dependencies=St(e.observing).map(y)),t}function w(e,t){return _(at(e,t))}function _(e){var t={name:e.name};return se(e)&&(t.observers=ue(e).map(_)),t}function x(e,t,n){return"function"==typeof n?O(e,t,n):S(e,t)}function S(e,t){return st(e).intercept(t)}function O(e,t,n){return st(e,t).intercept(n)}function k(e,t){if(null===e||void 0===e)return!1;if(void 0!==t){if(!1===ot(e))return!1;var n=at(e,t);return cn(n)}return cn(e)}function A(e,t){if(null===e||void 0===e)return!1;if(void 0!==t){if(qe(e)||Tn(e))throw new Error(vt("m019"));if(ot(e)){var n=e.$mobx;return n.values&&!!n.values[t]}return!1}return ot(e)||!!e.$mobx||an(e)||gn(e)||cn(e)}function E(e){if(void 0===e&&(e=void 0),"string"==typeof arguments[1])return Ft.apply(null,arguments);if(wt(arguments.length<=1,vt("m021")),wt(!Ve(e),vt("m020")),A(e))return e;var t=Be(e,void 0,void 0);return t!==e?t:nn.box(e)}function T(e){yt("Expected one or two arguments to observable."+e+". Did you accidentally try to use observable."+e+" as decorator?")}function L(e){return wt(!!e,":("),ct(function(t,n,r,i,o){Rt(t,n),wt(!o||!o.get,vt("m022")),Qe(Fe(t,void 0),n,r,e)},function(e){var t=this.$mobx.values[e];if(void 0!==t)return t.get()},function(e,t){rt(this,e,t)},!0,!1)}function C(e,t,n,r){return"function"==typeof n?j(e,t,n,r):I(e,t,n)}function I(e,t,n){return st(e).observe(t,n)}function j(e,t,n,r){return st(e,t).observe(n,r)}function R(e,t,n){function r(r){return t&&n.push([e,r]),r}if(void 0===t&&(t=!0),void 0===n&&(n=[]),A(e)){if(t&&null===n&&(n=[]),t&&null!==e&&"object"===(void 0===e?"undefined":Ut(e)))for(var i=0,o=n.length;i0,"actions should have valid names, got: '"+e+"'");var n=function(){return z(e,t,this,arguments)};return n.originalFn=t,n.isMobxAction=!0,n}function z(e,t,n,r){var i=B(e,t,n,r);try{return t.apply(n,r)}finally{$(i)}}function B(e,t,n,r){var i=Se()&&!!e,o=0;if(i){o=Date.now();var a=r&&r.length||0,s=new Array(a);if(a>0)for(var u=0;u0;pn.computationDepth>0&&t&&yt(vt("m031")+e.name),!pn.allowStateChanges&&t&&yt(vt(pn.strictMode?"m030a":"m030b")+e.name)}function X(e,t,n){re(e),e.newObserving=new Array(e.observing.length+100),e.unboundDepsCount=0,e.runId=++pn.runId;var r=pn.trackingDerivation;pn.trackingDerivation=e;var i;try{i=t.call(n)}catch(e){i=new ln(e)}return pn.trackingDerivation=r,Q(e),i}function Q(e){var t=e.observing,n=e.observing=e.newObserving,r=un.UP_TO_DATE;e.newObserving=null;for(var i=0,o=e.unboundDepsCount,a=0;ar&&(r=s.dependenciesState)}for(n.length=i,o=t.length;o--;){var s=t[o];0===s.diffValue&&le(s,e),s.diffValue=0}for(;i--;){var s=n[i];1===s.diffValue&&(s.diffValue=0,ce(s,e))}r!==un.UP_TO_DATE&&(e.dependenciesState=r,e.onBecomeStale())}function Z(e){var t=e.observing;e.observing=[];for(var n=t.length;n--;)le(t[n],e);e.dependenciesState=un.NOT_TRACKING}function ee(e){var t=te(),n=e();return ne(t),n}function te(){var e=pn.trackingDerivation;return pn.trackingDerivation=null,e}function ne(e){pn.trackingDerivation=e}function re(e){if(e.dependenciesState!==un.UP_TO_DATE){e.dependenciesState=un.UP_TO_DATE;for(var t=e.observing,n=t.length;n--;)t[n].lowestObserverState=un.UP_TO_DATE}}function ie(){var e=gt(),t=pn;if(e.__mobservableTrackingStack||e.__mobservableViewStack)throw new Error("[mobx] An incompatible version of mobservable is already loaded.");if(e.__mobxGlobal&&e.__mobxGlobal.version!==t.version)throw new Error("[mobx] An incompatible version of mobx is already loaded.");e.__mobxGlobal?pn=e.__mobxGlobal:e.__mobxGlobal=t}function oe(){return pn}function ae(){pn.resetId++;var e=new dn;for(var t in e)-1===hn.indexOf(t)&&(pn[t]=e[t]);pn.allowStateChanges=!pn.strictMode}function se(e){return e.observers&&e.observers.length>0}function ue(e){return e.observers}function ce(e,t){var n=e.observers.length;n&&(e.observersIndexes[t.__mapid]=n),e.observers[n]=t,e.lowestObserverState>t.dependenciesState&&(e.lowestObserverState=t.dependenciesState)}function le(e,t){if(1===e.observers.length)e.observers.length=0,he(e);else{var n=e.observers,r=e.observersIndexes,i=n.pop();if(i!==t){var o=r[t.__mapid]||0;o?r[i.__mapid]=o:delete r[i.__mapid],n[o]=i}delete r[t.__mapid]}}function he(e){e.isPendingUnobservation||(e.isPendingUnobservation=!0,pn.pendingUnobservations.push(e))}function de(){pn.inBatch++}function pe(){if(0==--pn.inBatch){we();for(var e=pn.pendingUnobservations,t=0;t=0&&pn.globalReactionErrorHandlers.splice(t,1)}}function we(){pn.inBatch>0||pn.isRunningReactions||vn(_e)}function _e(){pn.isRunningReactions=!0;for(var e=pn.pendingReactions,t=0;e.length>0;){++t===mn&&(console.error("Reaction doesn't converge to a stable state after "+mn+" iterations. Probably there is a cycle in the reactive function: "+e[0]),e.splice(0));for(var n=e.splice(0),r=0,i=n.length;r0}function Le(e,t){var n=e.interceptors||(e.interceptors=[]);return n.push(t),xt(function(){var e=n.indexOf(t);-1!==e&&n.splice(e,1)})}function Ce(e,t){var n=te();try{var r=e.interceptors;if(r)for(var i=0,o=r.length;i0}function je(e,t){var n=e.changeListeners||(e.changeListeners=[]);return n.push(t),xt(function(){var e=n.indexOf(t);-1!==e&&n.splice(e,1)})}function Re(e,t){var n=te(),r=e.changeListeners;if(r){r=r.slice();for(var i=0,o=r.length;i=this.length,value:tt?" (... and "+(e.length-t)+"more)":""):""}function kt(e){return null!==e&&"object"===(void 0===e?"undefined":Ut(e))}function At(e){if(null===e||"object"!==(void 0===e?"undefined":Ut(e)))return!1;var t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function Et(){for(var e=arguments[0],t=1,n=arguments.length;t=0;i--)if(!Mt(e[i],t[i]))return!1;return!0}if(r){if(e.size!==t.size)return!1;var o=!0;return e.forEach(function(e,n){o=o&&Mt(t.get(n),e)}),o}if("object"===(void 0===e?"undefined":Ut(e))&&"object"===(void 0===t?"undefined":Ut(t))){if(null===e||null===t)return!1;if(Vt(e)&&Vt(t))return e.size===t.size&&Mt(nn.shallowMap(e).entries(),nn.shallowMap(t).entries());if(Pt(e).length!==Pt(t).length)return!1;for(var a in e){if(!(a in t))return!1;if(!Mt(e[a],t[a]))return!1}return!0}return!1}function Dt(e,t){var n="isMobX"+e;return t.prototype[n]=!0,function(e){return kt(e)&&!0===e[n]}}function Nt(e){return Array.isArray(e)||qe(e)}function Vt(e){return zt(e)||Tn(e)}function zt(e){return void 0!==gt().Map&&e instanceof gt().Map}function Bt(){return"function"==typeof Symbol&&Symbol.toPrimitive||"@@toPrimitive"}function $t(e){return null===e?null:"object"===(void 0===e?"undefined":Ut(e))?""+e:e}var Ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ht=function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0}),t.extras={allowStateChanges:K,deepEqual:Mt,getAtom:at,getDebugName:ut,getDependencyTree:b,getAdministration:st,getGlobalState:oe,getObserverTree:w,isComputingDerivation:J,isSpyEnabled:Se,onReactionError:ye,reserveArrayBuffer:We,resetGlobalState:ae,shareGlobalState:ie,spyReport:Oe,spyReportEnd:Ae,spyReportStart:ke,setReactionScheduler:xe},"object"===("undefined"==typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__?"undefined":Ut(__MOBX_DEVTOOLS_GLOBAL_HOOK__))&&__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx(e.exports),e.exports.default=e.exports;var Kt=ct(function(e,t,n,r,i){var o=r&&1===r.length?r[0]:n.name||t||"";Ct(e,t,Yt(o,n))},function(e){return this[e]},function(){wt(!1,vt("m001"))},!1,!0),Gt=ct(function(e,t,n){a(e,t,n)},function(e){return this[e]},function(){wt(!1,vt("m001"))},!1,!1),Yt=function(e,t,n,i){return 1===arguments.length&&"function"==typeof e?V(e.name||"",e):2===arguments.length&&"function"==typeof t?V(e,t):1===arguments.length&&"string"==typeof e?r(e):r(t).apply(null,arguments)};t.action=Yt,Yt.bound=function(e,t,n){if("function"==typeof e){var r=V("",e);return r.autoBind=!0,r}return Gt.apply(null,arguments)},t.runInAction=i,t.isAction=o,t.autorun=s,t.when=u,t.autorunAsync=c,t.reaction=l;var Wt=h(!1),qt=h(!0),Jt=function(e,t,n){if("string"==typeof t)return Wt.apply(null,arguments);wt("function"==typeof e,vt("m011")),wt(arguments.length<3,vt("m012"));var r="object"===(void 0===t?"undefined":Ut(t))?t:{};return r.setter="function"==typeof t?t:r.setter,new sn(e,r.context,r.compareStructural||r.struct||!1,r.name||e.name||"",r.setter)};t.computed=Jt,Jt.struct=qt,t.createTransformer=d,t.expr=f,t.extendObservable=m,t.extendShallowObservable=v,t.intercept=x,t.isComputed=k,t.isObservable=A;var Ft=L(Be),Xt=L($e),Qt=L(Ue),Zt=L(He),en=L(Ke),tn=function(){function e(){}return e.prototype.box=function(e,t){return arguments.length>2&&T("box"),new Pn(e,Be,t)},e.prototype.shallowBox=function(e,t){return arguments.length>2&&T("shallowBox"),new Pn(e,Ue,t)},e.prototype.array=function(e,t){return arguments.length>2&&T("array"),new Sn(e,Be,t)},e.prototype.shallowArray=function(e,t){return arguments.length>2&&T("shallowArray"),new Sn(e,Ue,t)},e.prototype.map=function(e,t){return arguments.length>2&&T("map"),new En(e,Be,t)},e.prototype.shallowMap=function(e,t){return arguments.length>2&&T("shallowMap"),new En(e,Ue,t)},e.prototype.object=function(e,t){arguments.length>2&&T("object");var n={};return Fe(n,t),m(n,e),n},e.prototype.shallowObject=function(e,t){arguments.length>2&&T("shallowObject");var n={};return Fe(n,t),v(n,e),n},e.prototype.ref=function(){return arguments.length<2?ze(Ue,arguments[0]):Qt.apply(null,arguments)},e.prototype.shallow=function(){return arguments.length<2?ze($e,arguments[0]):Xt.apply(null,arguments)},e.prototype.deep=function(){return arguments.length<2?ze(Be,arguments[0]):Ft.apply(null,arguments)},e.prototype.struct=function(){return arguments.length<2?ze(He,arguments[0]):Zt.apply(null,arguments)},e}();t.IObservableFactories=tn;var nn=E;t.observable=nn,Object.keys(tn.prototype).forEach(function(e){return nn[e]=tn.prototype[e]}),nn.deep.struct=nn.struct,nn.ref.struct=function(){return arguments.length<2?ze(Ke,arguments[0]):en.apply(null,arguments)},t.observe=C,t.toJS=R,t.transaction=P,t.whyRun=N,t.useStrict=U,t.isStrictModeEnabled=H;var rn=function(){function e(e){void 0===e&&(e="Atom@"+bt()),this.name=e,this.isPendingUnobservation=!0,this.observers=[],this.observersIndexes={},this.diffValue=0,this.lastAccessedBy=0,this.lowestObserverState=un.NOT_TRACKING}return e.prototype.onBecomeUnobserved=function(){},e.prototype.reportObserved=function(){fe(this)},e.prototype.reportChanged=function(){de(),me(this),pe()},e.prototype.toString=function(){return this.name},e}();t.BaseAtom=rn;var on=function(e){function t(t,n,r){void 0===t&&(t="Atom@"+bt()),void 0===n&&(n=Bn),void 0===r&&(r=Bn);var i=e.call(this,t)||this;return i.name=t,i.onBecomeObservedHandler=n,i.onBecomeUnobservedHandler=r,i.isPendingUnobservation=!1,i.isBeingTracked=!1,i}return Ht(t,e),t.prototype.reportObserved=function(){return de(),e.prototype.reportObserved.call(this),this.isBeingTracked||(this.isBeingTracked=!0,this.onBecomeObservedHandler()),pe(),!!pn.trackingDerivation},t.prototype.onBecomeUnobserved=function(){this.isBeingTracked=!1,this.onBecomeUnobservedHandler()},t}(rn);t.Atom=on;var an=Dt("Atom",rn),sn=function(){function e(e,t,n,r,i){this.derivation=e,this.scope=t,this.compareStructural=n,this.dependenciesState=un.NOT_TRACKING,this.observing=[],this.newObserving=null,this.isPendingUnobservation=!1,this.observers=[],this.observersIndexes={},this.diffValue=0,this.runId=0,this.lastAccessedBy=0,this.lowestObserverState=un.UP_TO_DATE,this.unboundDepsCount=0,this.__mapid="#"+bt(),this.value=void 0,this.isComputing=!1,this.isRunningSetter=!1,this.name=r||"ComputedValue@"+bt(),i&&(this.setter=V(r+"-setter",i))}return e.prototype.onBecomeStale=function(){ge(this)},e.prototype.onBecomeUnobserved=function(){Z(this),this.value=void 0},e.prototype.get=function(){wt(!this.isComputing,"Cycle detected in computation "+this.name,this.derivation),0===pn.inBatch?(de(),q(this)&&(this.value=this.computeValue(!1)),pe()):(fe(this),q(this)&&this.trackAndCompute()&&ve(this));var e=this.value;if(W(e))throw e.cause;return e},e.prototype.peek=function(){var e=this.computeValue(!1);if(W(e))throw e.cause;return e},e.prototype.set=function(e){if(this.setter){wt(!this.isRunningSetter,"The setter of computed value '"+this.name+"' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"),this.isRunningSetter=!0;try{this.setter.call(this.scope,e)}finally{this.isRunningSetter=!1}}else wt(!1,"[ComputedValue '"+this.name+"'] It is not possible to assign a new value to a computed value.")},e.prototype.trackAndCompute=function(){Se()&&Oe({object:this.scope,type:"compute",fn:this.derivation});var e=this.value,t=this.value=this.computeValue(!0);return W(t)||Tt(this.compareStructural,t,e)},e.prototype.computeValue=function(e){this.isComputing=!0,pn.computationDepth++;var t;if(e)t=X(this,this.derivation,this.scope);else try{t=this.derivation.call(this.scope)}catch(e){t=new ln(e)}return pn.computationDepth--,this.isComputing=!1,t},e.prototype.observe=function(e,t){var n=this,r=!0,i=void 0;return s(function(){var o=n.get();if(!r||t){var a=te();e({type:"update",object:n,newValue:o,oldValue:i}),ne(a)}r=!1,i=o})},e.prototype.toJSON=function(){return this.get()},e.prototype.toString=function(){return this.name+"["+this.derivation.toString()+"]"},e.prototype.valueOf=function(){return $t(this.get())},e.prototype.whyRun=function(){var e=Boolean(pn.trackingDerivation),t=St(this.isComputing?this.newObserving:this.observing).map(function(e){return e.name}),n=St(ue(this).map(function(e){return e.name}));return"\nWhyRun? computation '"+this.name+"':\n * Running because: "+(e?"[active] the value of this computation is needed by a reaction":this.isComputing?"[get] The value of this computed was requested outside a reaction":"[idle] not running at the moment")+"\n"+(this.dependenciesState===un.NOT_TRACKING?vt("m032"):" * This computation will re-run if any of the following observables changes:\n "+Ot(t)+"\n "+(this.isComputing&&e?" (... or any observable accessed during the remainder of the current run)":"")+"\n\t"+vt("m038")+"\n\n * If the outcome of this computation changes, the following observers will be re-run:\n "+Ot(n)+"\n")},e}();sn.prototype[Bt()]=sn.prototype.valueOf;var un,cn=Dt("ComputedValue",sn);!function(e){e[e.NOT_TRACKING=-1]="NOT_TRACKING",e[e.UP_TO_DATE=0]="UP_TO_DATE",e[e.POSSIBLY_STALE=1]="POSSIBLY_STALE",e[e.STALE=2]="STALE"}(un||(un={})),t.IDerivationState=un;var ln=function(){function e(e){this.cause=e}return e}();t.untracked=ee;var hn=["mobxGuid","resetId","spyListeners","strictMode","runId"],dn=function(){function e(){this.version=5,this.trackingDerivation=null,this.computationDepth=0,this.runId=0,this.mobxGuid=0,this.inBatch=0,this.pendingUnobservations=[],this.pendingReactions=[],this.isRunningReactions=!1,this.allowStateChanges=!0,this.strictMode=!1,this.resetId=0,this.spyListeners=[],this.globalReactionErrorHandlers=[]}return e}(),pn=new dn,fn=function(){function e(e,t){void 0===e&&(e="Reaction@"+bt()),this.name=e,this.onInvalidate=t,this.observing=[],this.newObserving=[],this.dependenciesState=un.NOT_TRACKING,this.diffValue=0,this.runId=0,this.unboundDepsCount=0,this.__mapid="#"+bt(),this.isDisposed=!1,this._isScheduled=!1,this._isTrackPending=!1,this._isRunning=!1}return e.prototype.onBecomeStale=function(){this.schedule()},e.prototype.schedule=function(){this._isScheduled||(this._isScheduled=!0,pn.pendingReactions.push(this),we())},e.prototype.isScheduled=function(){return this._isScheduled},e.prototype.runReaction=function(){this.isDisposed||(de(),this._isScheduled=!1,q(this)&&(this._isTrackPending=!0,this.onInvalidate(),this._isTrackPending&&Se()&&Oe({object:this,type:"scheduled-reaction"})),pe())},e.prototype.track=function(e){de();var t,n=Se();n&&(t=Date.now(),ke({object:this,type:"reaction",fn:e})),this._isRunning=!0;var r=X(this,e,void 0);this._isRunning=!1,this._isTrackPending=!1,this.isDisposed&&Z(this),W(r)&&this.reportExceptionInDerivation(r.cause),n&&Ae({time:Date.now()-t}),pe()},e.prototype.reportExceptionInDerivation=function(e){var t=this;if(this.errorHandler)return void this.errorHandler(e,this);var n="[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '"+this,r=vt("m037");console.error(n||r,e),Se()&&Oe({type:"error",message:n,error:e,object:this}),pn.globalReactionErrorHandlers.forEach(function(n){return n(e,t)})},e.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._isRunning||(de(),Z(this),pe()))},e.prototype.getDisposer=function(){var e=this.dispose.bind(this);return e.$mobx=this,e.onError=be,e},e.prototype.toString=function(){return"Reaction["+this.name+"]"},e.prototype.whyRun=function(){var e=St(this._isRunning?this.newObserving:this.observing).map(function(e){return e.name});return"\nWhyRun? reaction '"+this.name+"':\n * Status: ["+(this.isDisposed?"stopped":this._isRunning?"running":this.isScheduled()?"scheduled":"idle")+"]\n * This reaction will re-run if any of the following observables changes:\n "+Ot(e)+"\n "+(this._isRunning?" (... or any observable accessed during the remainder of the current run)":"")+"\n\t"+vt("m038")+"\n"},e}();t.Reaction=fn;var mn=100,vn=function(e){return e()},gn=Dt("Reaction",fn),bn={spyReportEnd:!0};t.spy=Ee,t.asReference=Pe,t.asStructure=Me,t.asFlat=De,t.asMap=Ne,t.isModifierDescriptor=Ve;var yn=function(){var e=!1,t={};return Object.defineProperty(t,"0",{set:function(){e=!0}}),Object.create(t)[0]=1,!1===e}(),wn=0,_n=function(){function e(){}return e}();_n.prototype=[];var xn=function(){function e(e,t,n,r){this.array=n,this.owned=r,this.lastKnownLength=0,this.interceptors=null,this.changeListeners=null,this.atom=new rn(e||"ObservableArray@"+bt()),this.enhancer=function(n,r){return t(n,r,e+"[..]")}}return e.prototype.intercept=function(e){return Le(this,e)},e.prototype.observe=function(e,t){return void 0===t&&(t=!1),t&&e({object:this.array,type:"splice",index:0,added:this.values.slice(),addedCount:this.values.length,removed:[],removedCount:0}),je(this,e)},e.prototype.getArrayLength=function(){return this.atom.reportObserved(),this.values.length},e.prototype.setArrayLength=function(e){if("number"!=typeof e||e<0)throw new Error("[mobx.array] Out of range: "+e);var t=this.values.length;if(e!==t)if(e>t){for(var n=new Array(e-t),r=0;r0&&e+t+1>wn&&We(e+t+1)},e.prototype.spliceWithArray=function(e,t,n){var r=this;F(this.atom);var i=this.values.length;if(void 0===e?e=0:e>i?e=i:e<0&&(e=Math.max(0,i+e)),t=1===arguments.length?i-e:void 0===t||null===t?0:Math.max(0,Math.min(t,i-e)),void 0===n&&(n=[]),Te(this)){var o=Ce(this,{object:this.array,type:"splice",index:e,removedCount:t,added:n});if(!o)return Vn;t=o.removedCount,n=o.added}n=n.map(function(e){return r.enhancer(e,void 0)});var a=n.length-t;this.updateArrayLength(i,a);var s=this.spliceItemsIntoValues(e,t,n);return 0===t&&0===n.length||this.notifyArraySplice(e,n,s),s},e.prototype.spliceItemsIntoValues=function(e,t,n){if(n.length<1e4)return(i=this.values).splice.apply(i,[e,t].concat(n));var r=this.values.slice(e,e+t);return this.values=this.values.slice(0,e).concat(n,this.values.slice(e+t)),r;var i},e.prototype.notifyArrayChildUpdate=function(e,t,n){var r=!this.owned&&Se(),i=Ie(this),o=i||r?{object:this.array,type:"update",index:e,newValue:t,oldValue:n}:null;r&&ke(o),this.atom.reportChanged(),i&&Re(this,o),r&&Ae()},e.prototype.notifyArraySplice=function(e,t,n){var r=!this.owned&&Se(),i=Ie(this),o=i||r?{object:this.array,type:"splice",index:e,removed:n,added:t,removedCount:n.length,addedCount:t.length}:null;r&&ke(o),this.atom.reportChanged(),i&&Re(this,o),r&&Ae()},e}(),Sn=function(e){function t(t,n,r,i){void 0===r&&(r="ObservableArray@"+bt()),void 0===i&&(i=!1);var o=e.call(this)||this,a=new xn(r,n,o,i);return It(o,"$mobx",a),t&&t.length?(a.updateArrayLength(0,t.length),a.values=t.map(function(e){return n(e,void 0,r+"[..]")}),a.notifyArraySplice(0,a.values.slice(),Vn)):a.values=[],yn&&Object.defineProperty(a.array,"0",On),o}return Ht(t,e),t.prototype.intercept=function(e){return this.$mobx.intercept(e)},t.prototype.observe=function(e,t){return void 0===t&&(t=!1),this.$mobx.observe(e,t)},t.prototype.clear=function(){return this.splice(0)},t.prototype.concat=function(){for(var e=[],t=0;t-1&&(this.splice(t,1),!0)},t.prototype.move=function(e,t){function n(e){if(e<0)throw new Error("[mobx.array] Index out of bounds: "+e+" is negative");var t=this.$mobx.values.length;if(e>=t)throw new Error("[mobx.array] Index out of bounds: "+e+" is not smaller than "+t)}if(n.call(this,e),n.call(this,t),e!==t){var r,i=this.$mobx.values;r=e"+n.reactions.heart+" Liked":"")+"\n ",s?(a.classList.add("liked"),a.onclick=function(){return t.unlike()}):(a.classList.remove("liked"),a.onclick=function(){return t.like()}),o.appendChild(a);var u=document.createElement("span");u.innerHTML="\n "+(n.comments?" • "+n.comments+" Comments":"")+"\n ",o.appendChild(u);var l=document.createElement("a");return l.className="gitment-header-issue-link",l.href=n.html_url,l.target="_blank",l.innerText="Issue Page",o.appendChild(l),o}function i(e,t){var n=e.meta,r=e.comments,i=e.commentReactions,o=e.currentPage,a=e.user,s=e.error,u=document.createElement("div");if(u.lang="en-US",u.className="gitment-container gitment-comments-container",s){var h=document.createElement("div");if(h.className="gitment-comments-error",s===l.NOT_INITIALIZED_ERROR&&a.login&&a.login.toLowerCase()===t.owner.toLowerCase()){var d=document.createElement("div"),p=document.createElement("button");p.className="gitment-comments-init-btn",p.onclick=function(){p.setAttribute("disabled",!0),t.init().catch(function(e){p.removeAttribute("disabled"),alert(e)})},p.innerText="Initialize Comments",d.appendChild(p),h.appendChild(d)}else h.innerText=s;return u.appendChild(h),u}if(void 0===r){var f=document.createElement("div");return f.innerText="Loading comments...",f.className="gitment-comments-loading",u.appendChild(f),u}if(!r.length){var m=document.createElement("div");return m.className="gitment-comments-empty",m.innerText="No Comment Yet",u.appendChild(m),u}var v=document.createElement("ul");if(v.className="gitment-comments-list",r.forEach(function(e){var n=new Date(e.created_at),r=new Date(e.updated_at),o=document.createElement("li");o.className="gitment-comment",o.innerHTML='\n \n \n \n
\n
\n \n '+e.user.login+'\n \n commented on\n '+n.toDateString()+"\n "+(n.toString()!==r.toString()?' • edited':"")+'\n
'+c.reply+'
\n
'+c.heart+" "+(e.reactions.heart||"")+'
\n
\n
'+e.body_html+"
\n
\n ";var s=o.querySelector(".gitment-comment-like-btn");i[e.id]&&i[e.id].find(function(e){return"heart"===e.content&&e.user.login===a.login})?(s.classList.add("liked"),s.onclick=function(){return t.unlikeAComment(e.id)}):(s.classList.remove("liked"),s.onclick=function(){return t.likeAComment(e.id)}),o.querySelector(".gitment-comment-reply-btn").onclick=function(){return t.replyAComment(e.user.login)};var u=document.createElement("img"),l=o.querySelector(".gitment-comment-body");u.className="gitment-hidden",u.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",u.onload=function(){l.clientHeight>t.maxCommentHeight&&(l.classList.add("gitment-comment-body-folded"),l.style.maxHeight=t.maxCommentHeight+"px",l.title="Click to Expand",l.onclick=function(){l.classList.remove("gitment-comment-body-folded"),l.style.maxHeight="",l.title="",l.onclick=null})},o.appendChild(u),v.appendChild(o)}),u.appendChild(v),n){var g=Math.ceil(n.comments/t.perPage);if(g>1){var b=document.createElement("ul");if(b.className="gitment-comments-pagination",o>1){var y=document.createElement("li");y.className="gitment-comments-page-item",y.innerText="Previous",y.onclick=function(){return t.goto(o-1)},b.appendChild(y)}for(var w=1;w<=g;w++)!function(e){var n=document.createElement("li");n.className="gitment-comments-page-item",n.innerText=e,n.onclick=function(){return t.goto(e)},o===e&&n.classList.add("gitment-selected"),b.appendChild(n)}(w);if(o\n \n ':n.isLoggingIn?'
'+c.spinner+"
":'\n '+c.github+"\n ")+'\n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n \n ",n.login&&(i.querySelector(".gitment-editor-logout-link").onclick=function(){return t.logout()});var s=i.querySelector(".gitment-editor-write-field"),l=i.querySelector(".gitment-editor-preview-field"),h=s.querySelector("textarea");h.oninput=function(){h.style.height="auto";var e=window.getComputedStyle(h,null),t=parseInt(e.height,10),n=h.clientHeight,r=h.scrollHeight;n1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"https://api.github.com",i=new XMLHttpRequest,o=localStorage.getItem(a.LS_ACCESS_TOKEN_KEY),s=""+r+t,c=null;"GET"!==e&&"DELETE"!==e||(s+=u.stringify(n));var l=new Promise(function(e,t){i.addEventListener("load",function(){var n=i.getResponseHeader("content-type"),r=i.responseText;if(!/json/.test(n))return void e(r);var o=i.responseText?JSON.parse(r):{};o.message?t(new Error(o.message)):e(o)}),i.addEventListener("error",function(e){return t(e)})});return i.open(e,s,!0),i.setRequestHeader("Accept","application/vnd.github.squirrel-girl-preview, application/vnd.github.html+json"),o&&i.setRequestHeader("Authorization","token "+o),"GET"!==e&&"DELETE"!==e&&(c=JSON.stringify(n),i.setRequestHeader("Content-Type","application/json")),i.send(c),l}}Object.defineProperty(t,"__esModule",{value:!0}),t.http=t.Query=t.isString=void 0;var o=function(){function e(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&s.return&&s.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.getTargetContainer=r;var a=n(0),s=t.isString=function(e){return"[object String]"===toString.call(e)},u=t.Query={parse:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.search;if(!e)return{};var t="?"===e[0]?e.substring(1):e,n={};return t.split("&").forEach(function(e){var t=e.split("="),r=o(t,2),i=r[0],a=r[1];i&&(n[i]=a)}),n},stringify:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"?",n=Object.keys(e).map(function(t){return t+"="+encodeURIComponent(e[t]||"")}).join("&");return n?t+n:""}};t.http={get:i("GET"),post:i("POST"),delete:i("DELETE"),put:i("PUT")}},function(e,t,n){"use strict";var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(e){"object"===("undefined"==typeof window?"undefined":i(window))&&(r=window)}e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){e[t]=function(n){var r=(0,u.getTargetContainer)(n),i=e.theme[t]||e.defaultTheme[t];return(0,a.autorun)(function(){var t=i(e.state,e);r.firstChild?r.replaceChild(t,r.firstChild):r.appendChild(t)}),r}}var o=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};r(this,e),this.defaultTheme=l.default,this.useTheme(l.default),Object.assign(this,{id:window.location.href,title:window.document.title,link:window.location.href,desc:"",labels:[],theme:l.default,oauth:{},perPage:20,maxCommentHeight:250},n),this.useTheme(this.theme);var i={};try{var o=localStorage.getItem(s.LS_USER_KEY);this.accessToken&&o&&Object.assign(i,JSON.parse(o),{fromCache:!0})}catch(e){localStorage.removeItem(s.LS_USER_KEY)}this.state=(0,a.observable)({user:i,error:null,meta:{},comments:void 0,reactions:[],commentReactions:{},currentPage:1});var c=u.Query.parse();if(c.code){var h=this.oauth,d=h.client_id,p=h.client_secret,f=c.code;delete c.code;var m=u.Query.stringify(c),v=""+window.location.origin+window.location.pathname+m+window.location.hash;history.replaceState({},"",v),Object.assign(this,{id:v,link:v},n),this.state.user.isLoggingIn=!0,u.http.post("https://gh-oauth.imsun.net",{code:f,client_id:d,client_secret:p},"").then(function(e){t.accessToken=e.access_token,t.update()}).catch(function(e){t.state.user.isLoggingIn=!1,alert(e)})}else this.update()}return o(e,[{key:"accessToken",get:function(){return localStorage.getItem(s.LS_ACCESS_TOKEN_KEY)},set:function(e){localStorage.setItem(s.LS_ACCESS_TOKEN_KEY,e)}},{key:"loginLink",get:function(){var e=this.oauth.redirect_uri||window.location.href,t=Object.assign({scope:"public_repo",redirect_uri:e},this.oauth);return"https://github.com/login/oauth/authorize"+u.Query.stringify(t)}}]),o(e,[{key:"init",value:function(){var e=this;return this.createIssue().then(function(){return e.loadComments()}).then(function(t){return e.state.error=null,t})}},{key:"useTheme",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.theme=t,Object.keys(this.theme).forEach(function(t){return i(e,t)})}},{key:"update",value:function(){var e=this;return Promise.all([this.loadMeta(),this.loadUserInfo()]).then(function(){return Promise.all([e.loadComments().then(function(){return e.loadCommentReactions()}),e.loadReactions()])}).catch(function(t){return e.state.error=t})}},{key:"markdown",value:function(e){return u.http.post("/markdown",{text:e,mode:"gfm"})}},{key:"createIssue",value:function(){var e=this,t=this.id,n=this.owner,r=this.repo,i=this.title,o=this.link,a=this.desc,s=this.labels;return u.http.post("/repos/"+n+"/"+r+"/issues",{title:i,labels:s.concat(["gitment",t]),body:o+"\n\n"+a}).then(function(t){return e.state.meta=t,t})}},{key:"getIssue",value:function(){return this.state.meta.id?Promise.resolve(this.state.meta):this.loadMeta()}},{key:"post",value:function(e){var t=this;return this.getIssue().then(function(t){return u.http.post(t.comments_url,{body:e},"")}).then(function(e){t.state.meta.comments++;var n=Math.ceil(t.state.meta.comments/t.perPage);return t.state.currentPage===n&&t.state.comments.push(e),e})}},{key:"loadMeta",value:function(){var e=this,t=this.id,n=this.owner,r=this.repo;return u.http.get("/repos/"+n+"/"+r+"/issues",{creator:n,labels:t}).then(function(t){return t.length?(e.state.meta=t[0],t[0]):Promise.reject(s.NOT_INITIALIZED_ERROR)})}},{key:"loadComments",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentPage;return this.getIssue().then(function(n){return u.http.get(n.comments_url,{page:t,per_page:e.perPage},"")}).then(function(t){return e.state.comments=t,t})}},{key:"loadUserInfo",value:function(){var e=this;return this.accessToken?u.http.get("/user").then(function(t){return e.state.user=t,localStorage.setItem(s.LS_USER_KEY,JSON.stringify(t)),t}):(this.logout(),Promise.resolve({}))}},{key:"loadReactions",value:function(){var e=this;return this.accessToken?this.getIssue().then(function(e){return e.reactions.total_count?u.http.get(e.reactions.url,{},""):[]}).then(function(t){return e.state.reactions=t,t}):(this.state.reactions=[],Promise.resolve([]))}},{key:"loadCommentReactions",value:function(){var e=this;if(!this.accessToken)return this.state.commentReactions={},Promise.resolve([]);var t=this.state.comments,n={};return Promise.all(t.map(function(t){if(!t.reactions.total_count)return[];var n=e.owner,r=e.repo;return u.http.get("/repos/"+n+"/"+r+"/issues/comments/"+t.id+"/reactions",{})})).then(function(r){return t.forEach(function(e,t){n[e.id]=r[t]}),e.state.commentReactions=n,n})}},{key:"login",value:function(){window.location.href=this.loginLink}},{key:"logout",value:function(){localStorage.removeItem(s.LS_ACCESS_TOKEN_KEY),localStorage.removeItem(s.LS_USER_KEY),this.state.user={}}},{key:"goto",value:function(e){return this.state.currentPage=e,this.state.comments=void 0,this.loadComments(e)}},{key:"like",value:function(){var e=this;if(!this.accessToken)return alert("Login to Like"),Promise.reject();var t=this.owner,n=this.repo;return u.http.post("/repos/"+t+"/"+n+"/issues/"+this.state.meta.number+"/reactions",{content:"heart"}).then(function(t){e.state.reactions.push(t),e.state.meta.reactions.heart++})}},{key:"unlike",value:function(){var e=this;if(!this.accessToken)return Promise.reject();var t=this.state,n=t.user,r=t.reactions,i=r.findIndex(function(e){return e.user.login===n.login});return u.http.delete("/reactions/"+r[i].id).then(function(){r.splice(i,1),e.state.meta.reactions.heart--})}},{key:"likeAComment",value:function(e){var t=this;if(!this.accessToken)return alert("Login to Like"),Promise.reject();var n=this.owner,r=this.repo,i=this.state.comments.find(function(t){return t.id===e});return u.http.post("/repos/"+n+"/"+r+"/issues/comments/"+e+"/reactions",{content:"heart"}).then(function(n){t.state.commentReactions[e].push(n),i.reactions.heart++})}},{key:"unlikeAComment",value:function(e){if(!this.accessToken)return Promise.reject();var t=this.state.commentReactions[e],n=this.state.comments.find(function(t){return t.id===e}),r=this.state.user,i=t.findIndex(function(e){return e.user.login===r.login});return u.http.delete("/reactions/"+t[i].id).then(function(){t.splice(i,1),n.reactions.heart--})}},{key:"replyAComment",value:function(e){if(!this.accessToken)return Promise.reject();var t=document.getElementById("gitment-editor");t.innerText+="@"+e+" ",t.focus()}}]),e}();e.exports=h},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.close='',t.github='',t.heart='',t.spinner='',t.reply=''}]); \ No newline at end of file diff --git a/public/lib/photoswipe/default-skin/default-skin.min.css b/public/lib/photoswipe/default-skin/default-skin.min.css new file mode 100644 index 0000000..e1a80ce --- /dev/null +++ b/public/lib/photoswipe/default-skin/default-skin.min.css @@ -0,0 +1 @@ +/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */.pswp__button{width:44px;height:44px;position:relative;background:0;cursor:pointer;overflow:visible;-webkit-appearance:none;display:block;border:0;padding:0;margin:0;float:right;opacity:.75;-webkit-transition:opacity .2s;transition:opacity .2s;-webkit-box-shadow:none;box-shadow:none}.pswp__button:focus,.pswp__button:hover{opacity:1}.pswp__button:active{outline:0;opacity:.9}.pswp__button::-moz-focus-inner{padding:0;border:0}.pswp__ui--over-close .pswp__button--close{opacity:1}.pswp__button,.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{background:url(default-skin.png) 0 0 no-repeat;background-size:264px 88px;width:44px;height:44px}@media(-webkit-min-device-pixel-ratio:1.1),(-webkit-min-device-pixel-ratio:1.09375),(min-resolution:105dpi),(min-resolution:1.1dppx){.pswp--svg .pswp__button,.pswp--svg .pswp__button--arrow--left:before,.pswp--svg .pswp__button--arrow--right:before{background-image:url(default-skin.svg)}.pswp--svg .pswp__button--arrow--left,.pswp--svg .pswp__button--arrow--right{background:0}}.pswp__button--close{background-position:0 -44px}.pswp__button--share{background-position:-44px -44px}.pswp__button--fs{display:none}.pswp--supports-fs .pswp__button--fs{display:block}.pswp--fs .pswp__button--fs{background-position:-44px 0}.pswp__button--zoom{display:none;background-position:-88px 0}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__button--zoom{background-position:-132px 0}.pswp--touch .pswp__button--arrow--left,.pswp--touch .pswp__button--arrow--right{visibility:hidden}.pswp__button--arrow--left,.pswp__button--arrow--right{background:0;top:50%;margin-top:-50px;width:70px;height:100px;position:absolute}.pswp__button--arrow--left{left:0}.pswp__button--arrow--right{right:0}.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{content:'';top:35px;background-color:rgba(0,0,0,0.3);height:30px;width:32px;position:absolute}.pswp__button--arrow--left:before{left:6px;background-position:-138px -44px}.pswp__button--arrow--right:before{right:6px;background-position:-94px -44px}.pswp__counter,.pswp__share-modal{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pswp__share-modal{display:block;background:rgba(0,0,0,0.5);width:100%;height:100%;top:0;left:0;padding:10px;position:absolute;z-index:1600;opacity:0;-webkit-transition:opacity .25s ease-out;transition:opacity .25s ease-out;-webkit-backface-visibility:hidden;will-change:opacity}.pswp__share-modal--hidden{display:none}.pswp__share-tooltip{z-index:1620;position:absolute;background:#FFF;top:56px;border-radius:2px;display:block;width:auto;right:44px;-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.25);box-shadow:0 2px 5px rgba(0,0,0,0.25);-webkit-transform:translateY(6px);-ms-transform:translateY(6px);transform:translateY(6px);-webkit-transition:-webkit-transform .25s;transition:transform .25s;-webkit-backface-visibility:hidden;will-change:transform}.pswp__share-tooltip a{display:block;padding:8px 12px;color:#000;text-decoration:none;font-size:14px;line-height:18px}.pswp__share-tooltip a:hover{text-decoration:none;color:#000}.pswp__share-tooltip a:first-child{border-radius:2px 2px 0 0}.pswp__share-tooltip a:last-child{border-radius:0 0 2px 2px}.pswp__share-modal--fade-in{opacity:1}.pswp__share-modal--fade-in .pswp__share-tooltip{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.pswp--touch .pswp__share-tooltip a{padding:16px 12px}a.pswp__share--facebook:before{content:'';display:block;width:0;height:0;position:absolute;top:-12px;right:15px;border:6px solid transparent;border-bottom-color:#FFF;-webkit-pointer-events:none;-moz-pointer-events:none;pointer-events:none}a.pswp__share--facebook:hover{background:#3e5c9a;color:#FFF}a.pswp__share--facebook:hover:before{border-bottom-color:#3e5c9a}a.pswp__share--twitter:hover{background:#55acee;color:#FFF}a.pswp__share--pinterest:hover{background:#CCC;color:#ce272d}a.pswp__share--download:hover{background:#DDD}.pswp__counter{position:absolute;left:0;top:0;height:44px;font-size:13px;line-height:44px;color:#FFF;opacity:.75;padding:0 10px}.pswp__caption{position:absolute;left:0;bottom:0;width:100%;min-height:44px}.pswp__caption small{font-size:11px;color:#BBB}.pswp__caption__center{text-align:left;max-width:420px;margin:0 auto;font-size:13px;padding:10px;line-height:20px;color:#CCC}.pswp__caption--empty{display:none}.pswp__caption--fake{visibility:hidden}.pswp__preloader{width:44px;height:44px;position:absolute;top:0;left:50%;margin-left:-22px;opacity:0;-webkit-transition:opacity .25s ease-out;transition:opacity .25s ease-out;will-change:opacity;direction:ltr}.pswp__preloader__icn{width:20px;height:20px;margin:12px}.pswp__preloader--active{opacity:1}.pswp__preloader--active .pswp__preloader__icn{background:url(preloader.gif) 0 0 no-repeat}.pswp--css_animation .pswp__preloader--active{opacity:1}.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn{-webkit-animation:clockwise 500ms linear infinite;animation:clockwise 500ms linear infinite}.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut{-webkit-animation:donut-rotate 1000ms cubic-bezier(0.4,0,0.22,1) infinite;animation:donut-rotate 1000ms cubic-bezier(0.4,0,0.22,1) infinite}.pswp--css_animation .pswp__preloader__icn{background:0;opacity:.75;width:14px;height:14px;position:absolute;left:15px;top:15px;margin:0}.pswp--css_animation .pswp__preloader__cut{position:relative;width:7px;height:14px;overflow:hidden}.pswp--css_animation .pswp__preloader__donut{-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;border:2px solid #FFF;border-radius:50%;border-left-color:transparent;border-bottom-color:transparent;position:absolute;top:0;left:0;background:0;margin:0}@media screen and (max-width:1024px){.pswp__preloader{position:relative;left:auto;top:auto;margin:0;float:right}}@-webkit-keyframes clockwise{0{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes clockwise{0{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes donut-rotate{0{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(-140deg);transform:rotate(-140deg)}100%{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes donut-rotate{0{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(-140deg);transform:rotate(-140deg)}100%{-webkit-transform:rotate(0);transform:rotate(0)}}.pswp__ui{-webkit-font-smoothing:auto;visibility:visible;opacity:1;z-index:1550}.pswp__top-bar{position:absolute;left:0;top:0;height:44px;width:100%}.pswp__caption,.pswp__top-bar,.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right{-webkit-backface-visibility:hidden;will-change:opacity;-webkit-transition:opacity 333ms cubic-bezier(0.4,0,0.22,1);transition:opacity 333ms cubic-bezier(0.4,0,0.22,1)}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right{visibility:visible}.pswp__top-bar,.pswp__caption{background-color:rgba(0,0,0,0.5)}.pswp__ui--fit .pswp__top-bar,.pswp__ui--fit .pswp__caption{background-color:rgba(0,0,0,0.3)}.pswp__ui--idle .pswp__top-bar{opacity:0}.pswp__ui--idle .pswp__button--arrow--left,.pswp__ui--idle .pswp__button--arrow--right{opacity:0}.pswp__ui--hidden .pswp__top-bar,.pswp__ui--hidden .pswp__caption,.pswp__ui--hidden .pswp__button--arrow--left,.pswp__ui--hidden .pswp__button--arrow--right{opacity:.001}.pswp__ui--one-slide .pswp__button--arrow--left,.pswp__ui--one-slide .pswp__button--arrow--right,.pswp__ui--one-slide .pswp__counter{display:none}.pswp__element--disabled{display:none !important}.pswp--minimal--dark .pswp__top-bar{background:0} \ No newline at end of file diff --git a/public/lib/photoswipe/default-skin/default-skin.png b/public/lib/photoswipe/default-skin/default-skin.png new file mode 100644 index 0000000000000000000000000000000000000000..441c502c92fe66534f0ca07b1c639a02a9bfc6e8 GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0y~yVB`R@BRE)q> zQzfg0DSPAQu=lA~!r-)AA>V`{IQs4>>BL>kcznXerunmlb=| zWcaU3Q?y({((8tixy!m+M^9AR2>U-@Q#M^%Df}$cvwDB2dmHkM!%s>?s`+*-6<*}b zC6z+Z%-w!koN!M(Vgcu$6vxWM6}@S%6da&YLklvPaws&rO=B5mA?S z`j1}n(OIHjt=UhUKbx#56!7%kz(zdN0WP!2crw3%tChOzkj<5G+?=I5j*G7gE&0rKP}eS!-QI|4{hH?XQwM7IF@KnRe$O+> z{=5>|J!M5a2Uz(xeHVC@V0bikU*S=2|Myc@XUBb*dfe5v>F)hwKM!2~;rOU>BEr>~ b?RAXa8OAS+-W5gzBcH+3)z4*}Q$iB}<;L|a literal 0 HcmV?d00001 diff --git a/public/lib/photoswipe/default-skin/default-skin.svg b/public/lib/photoswipe/default-skin/default-skin.svg new file mode 100644 index 0000000..9d5f0c6 --- /dev/null +++ b/public/lib/photoswipe/default-skin/default-skin.svg @@ -0,0 +1 @@ +default-skin 2 \ No newline at end of file diff --git a/public/lib/photoswipe/default-skin/preloader.gif b/public/lib/photoswipe/default-skin/preloader.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8faa697c58d574f24ad1295e75f0d5acd807f5e GIT binary patch literal 866 zcmZ?wbhEHb6k!ly_{_o3-rjC+Zyz2WuCA_r{`~pv+qci3KR-V||NsC04A_9;e{Mh5 zkYH!W09PYD17=2`8pWS1tn3UN3_2k7AY&a^f(1@`u68|kN2-anp`@o>g(G~Sn2@7~ zvrSHk@6L6-E23jkXGSe|W^B}1J~?m6<|idKEbm%BM24;D%DJ|N(R9l~ccCqU+Q+*; zC5ucI@C@nw^6r%q!X8EjMg}1uWMJ_VIH~Eq&?0*FO2eyaf-K)^A9_r?%$cNpd!OXZ zyRr-qE*mIV$)11C{jT81{0Z$J3}?0<))hG5vRG1UYSC0B7N*W^r@l5FO#1Xzrq1ia zTn=1T^n$F=WVos(%8F{m-NFaLj%Zde9n3X=TfxLgq!o+{fL6S;ys9S2hHAxJg$Kcb zXjU{H=yiZw!NyFa73aYLC2&=Zkpb0;Sb+zV6Va?_KDagjZUqMmkyf;Ve38j;h?fCw1rHl`E7%!y z;3-1&&(c.onTap(),d=!0);if(d){a.stopPropagation&&a.stopPropagation(),r=!0;var h=b.features.isOldAndroid?600:30;s=setTimeout(function(){r=!1},h)}},B=function(){return!a.likelyTouchDevice||q.mouseUsed||screen.width>q.fitControlsWidth},C=function(a,c,d){b[(d?"add":"remove")+"Class"](a,"pswp__"+c)},D=function(){var a=1===q.getNumItemsFn();a!==p&&(C(d,"ui--one-slide",a),p=a)},E=function(){C(i,"share-modal--hidden",y)},F=function(){return y=!y,y?(b.removeClass(i,"pswp__share-modal--fade-in"),setTimeout(function(){y&&E()},300)):(E(),setTimeout(function(){y||b.addClass(i,"pswp__share-modal--fade-in")},30)),y||H(),!1},G=function(b){b=b||window.event;var c=b.target||b.srcElement;return a.shout("shareLinkClick",b,c),!!c.href&&(!!c.hasAttribute("download")||(window.open(c.href,"pswp_share","scrollbars=yes,resizable=yes,toolbar=no,location=yes,width=550,height=420,top=100,left="+(window.screen?Math.round(screen.width/2-275):100)),y||F(),!1))},H=function(){for(var a,b,c,d,e,f="",g=0;g