简介:

千千静听(以下简称”千千”)从2.0版开始就支持换肤功能,现在已经有不少皮肤可以和Winamp相媲美了,不过由于千千暂时不支持png图片格式及脚本,因而效果是无法和Winamp的现代皮肤或Windows Media Player的皮肤相比的。但千千的皮肤制作起来却要简单许多,不需要任何编程知识和复杂的技术,只要掌握基本的图像编辑操作(Photoshop)和有足够的耐心(Patient)就可以做出漂亮的皮肤出来,看完下面这个教程相信你也可以为千千设计一款个性十足的精美皮肤!

一.皮肤构造

千千的皮肤位于安装目录下的Skin文件夹内,扩展名可以为.skn或.zip,实际上二者是一样的,都是zip格式的压缩文件。对于前者,可以先将.skn的扩展名改为.zip(要在系统中显示文件的扩展名,依次点击”工具”-”文件夹选项”-”查看”,再把”隐藏已知文件类型的扩展名”前的小勾去除即可),然后将其解压到单独的文件夹,进入该文件夹,可以发现里面包含了许多bmp格式的图片和若干个xml文件,其中最重要的是Skin.xml这个xml文件,其它几个xml文件的作用在后面会提到。 bmp图片是各个窗口的背景及按钮图片,Skin.xml则是配置文件,定义了皮肤的基本信息、窗口及按钮的位置、大小等,它是基于XML格式的文件,可直接用系统自带的记事本或者其它文本编辑工具打开,打开后我们可以看到其基本构造:

仔细分析可发现每一行都是以”<”开头,最后以”>”结尾,中间有若干项和参数,可以将它们分为两种类型,第一种结构形如:   像XXX这样的项称作元素,AAA、BBB这样的项称作属性,aaa、bbb则是属性的参数值。在这里AAA、BBB都是XXX的属性,是用于修饰XXX的,比如position属性用于定义元素的位置,image属性用于定义元素的位图等。 在这种类型中,必须同时使用,形成一个闭合回路,就是说前面使用了开头,后面就一定要用来闭合,包含这中间的各项则都属于该元素。使用该类型的主要有主窗口(即player_window元素)、均衡器窗口(即equalizer_window元素)、歌词秀窗口(即lyric_window元素)、播放列表窗口(即playlist_window元素)以及迷你模式窗口(即mini_window元素)这5个基本的窗口,这5个窗口又全部包含在之间。 第二种结构形如:   实际上这是一种缩写形式,即的缩写,它们是最基本的单位元素,分别被包含于各个基本窗口中,用于比如各个按钮,拖动条等。 关于XML文件的格式,可以参照相关的文档,在这里要提一下的是,各元素及属性的顺序是不分先后的,空格的多少也没有关系,只要包含和被包含的位置及基本的格式别弄错了就可以(比如属性的参数值必须用英文双引号引上等),但是为了便于阅读和编辑修改,最好严格按照标准格式来书写。下面我们来详细分析一下Skin.xml,第一行: 这一行用于定义皮肤的基本属性和信息,其中version=”2”指的是皮肤的版本号,不必更改,后面的name、author、url和email属性分别指的是该皮肤的名称、作者的名字、作者主页地址和作者电子邮件地址,这些信息会显示在千千选项的应用皮肤的窗口中;再后面的transparent_color是一个非常重要的属性,即”透明色”,定义了透明色之后,皮肤上有这个颜色的部分都会被显示为透明。因为bmp格式图片是不支持透明的,所以要做出不规则的背景窗口和按钮,就要通过透明色来实现,方法是把要显示为透明的部分用定义好的透明色填充即可。一个皮肤只能定义一个固定的透明色,并用颜色的RGB编码表示,比如纯紫色的RGB码为#FF00FF,RGB编码可以在Photoshop等工具中查看。(透明色应尽量选择皮肤色调相差较大的颜色,否则很容易与皮肤上的颜色重复,导致把必要的部分透明了,一般情况下用纯紫色即可) 接下来就是5个基本窗口的配置,其中迷你模式窗口在后面会单独详细讲解。在Skin.xml中,首先要配置好的就是主窗口,歌词秀窗口,均衡器窗口,播放列表窗口这4个子窗口的相关设置,然后再分别配置各窗口上的按钮等。

position:这是众元素中最基本的属性之一,用于定义窗口背景及按钮的位置及大小,参数值格式为 “a, b ,c ,d”,这4个数值既固定了元素的位置也确定了其大小,其中(a, b)为左上角的坐标,(c, d)为右下角的坐标,c-a 就是长度,d-b 就是高度,坐标原点要分两种情况:如果是歌词秀、均衡器、播放列表这3个子窗口的position,则是把主窗口的左上角作为它们的坐标原点;如果是各窗口内部按钮的position,则是把对应的各窗口的左上角作为坐标原点,比如歌词秀窗口中的”关闭”按钮就是以歌词秀背景图片的左上角为原点,其它依此类推!

特别地:①播放列表中的scrollbar元素不需要定义position属性,它的位置会自动固定在playlist的最右边;②主窗口中的progress、volume元素及均衡器窗口中的balance、surround、preamp元素的position属性表示的是滑块能够移动的范围的坐标;③播放列表衡器窗口中的playlist元素、歌词秀衡器窗口中的lyric元素的position属性表示的是播放列表和歌词的显示范围,当播放列表窗口和歌词秀窗口改变大小时,这两个元素会自动跟着改变大小,但它们的四个边和窗口的四个边的距离就是通过这个position来体现的;

resize_rect:歌词秀和播放列表窗口特有的属性,用于定义这两个窗口可被拉伸的部分,其参数格式同position,代表的是当改变窗口大小时只有这个矩形框内的部分才会被拉长,在这个范围外的部分则不会变化,另外还有一个属性resize_tile是对应使用的,其参数值可以为0或1,其中0表示在改变窗口大小时采用拉伸的方式,1表示采用平铺的方式,该属性可省略不写,即使用默认值0;

此外,歌词秀和播放列表窗口还有一个可选择的元素:title,可在有特定需要时(比如在改变窗口大小时标题保持居中等)使用,格式如下:

<p>‘’’<title position="..." image="..." align="..." />‘’’</p> <p>image:用于定义该元素所使用的图片。一般地,按钮图片大部分都是由4个大小相同的图片并排组合在一起的,分别代表按钮的4种不同状态:按钮正常、鼠标经过按钮、鼠标按下按钮、按钮无效,</p> <p>注:①如果按钮在这4种状态下都是一样的,同样需要将4张图片并排在一起才能正常显示;②存在于播放列表中的scroll元素内的scrollbar_button和scrollbar_button属性所对应的图片只有3种状态:按钮正常、鼠标经过按钮和鼠标按下按钮; </p> <p> align:用于定义元素的对齐方式,参数值分两种情况:一种是存在于主窗口中的led、info、stereo、status元素内,此时可以取值为left、center、right,代表这些文字的缩进方式;第二种是存在于歌词秀窗口中的title、close、ontop元素内,播放列表窗口的title、close、toolbar元素内,此时可以取值为left、center、right、top、bottom等,代表当调整窗口大小时元素位置相对于边框移动,如果要同时设置垂直对齐和水平对齐方式,可以用英文加号将二者连在一起,比如”top+left”表示在垂直方向上顶部对齐、在水平方向上左对齐; </p> <p>  thumb_image、fill_image、bar_image:存在于主窗口中的progress、volume元素和均衡器窗口的balance、surround、preamp、eqfactor元素内,分别用于定义滑块的图片、移动滑块时填充的图片和移动范围内的背景图片; </p> <p> vertical:存在于主窗口中的progress、volume元素,参数值可以为true或false,其中取true时指滑块按垂直方向移动,取false时滑块按水平方向移动; </p> <p> color、bkgnd、font、font_size:存在于主窗口中的info、stereo、status元素内,用于定义文字的颜色、背景色、字体和字体大小,如要显示透明文字则不需要指定背景色(bkgnd); </p> <p> thumb_resize_center:存在于播放列表窗口中的scrollbar元素内,用于定义scrollbar的thumb滑块中间可以进行平铺缩放的部分的大小,如果取值为0,则代表在改变播放列表窗口高度大小时滑块进行不缩放; </p> <p> thumb_resize_tile:存在于播放列表窗口中的scrollbar元素内,作用与播放列表窗口和歌词秀窗口的resize_tile相同; </p> <p> hot_image:存在于播放列表窗口中的toolbar元素内,用于定义播放列表工具栏中当鼠标经过时的图片形态。此属性可选择,如省略不写的话程序会自动生成鼠标经过时的按钮状态; </p> <p> eq_interval:存在于均衡器窗口中的equalizer_window元素内,指eqfactor元素中10个波段的间隔大小(另:eqfactor元素的position属性表示的是10个滑块中第一个滑块的位置,而其它属性对于所有10个滑块都有效); </p> <p> icon:存在于主窗口中的icon元素内,用于自定义皮肤图标,必须将图标文件(<em>.ico,16</em>16)放于皮肤文件夹中并一起打包压缩。此属性可选择,如省略不写的话则使用默认的程序图标; </p> <p> left_top_color、right_bottom_color:存在于歌词秀窗口中的mini_border元素内,用于定义在迷你模式下歌词秀窗口的左上边框和右下边框的颜色; </p> <p> 在这里重点介绍一下迷你模式窗口: </p> <p> 如上图,迷你模式其实是独立于主窗口外的另外一个皮肤,不过在迷你模式下省略了播放列表和均衡器窗口、简化了歌词秀窗口和主窗口。迷你窗口里的所有元素、属性及参数都是和主窗口一样的,它们都被包含于<mini_window>和</mini_window>中,相当于主窗口中的<player_window> </player_window>; </p> <p> 迷你模式就是为了减小屏幕大小占用及简化按钮,故迷你窗口各按钮也要相应调整缩小,并省略部分不常用的按钮,比如音量调节等,一般只保留下”播放/暂停”、”停止”、”后退”、”前进”、”静音”、”图标”、”视觉效果”等即可。另外,迷你模式下的歌词秀窗口的位置和长度是固定的,高度则是和迷你模式的背景图片高度相同</p> <p>三.打包压缩 </p> <p> 当把所有图片都制作完成并配置好Skin.xml后还需做一件事情,那就是添加 Lyric.xml、Playlist.xml、Visual.xml 等3个xml文件,它们分别是作为歌词秀、播放列表、视觉效果的配色方案及相关的设置,如果不加上这3个文件皮肤就按默认的配色来显示,所以建议给每个皮肤都加上合适的配色便于与整体配套,从而使得皮肤更为美观漂亮,另外,如果皮肤没有自带配色文件的话,从其它有配色的皮肤切换到该皮肤时,会把原先皮肤的配色也一起带过来,效果非常难看。 </p> <p> 它们的参数和Skin.xml类似的,可以用记事本打开后进行配置,不过还有另外一种更为简洁高效的方法,那就是在 “千千选项” 里配置好,然后分别在每个选项卡中点击”配置文件”-”保存到文件”,并分别保存为”Playlist.xml”、”Lyric.xml”、”Visual.xml”,再将它们复制到相同目录下的皮肤文件夹即可,如图: </p> <p> 最后就是将这些文件一起打包压缩制作成皮肤了,可以用WinRAR或WinZIP等压缩工具,以WinRAR为例,先按键盘上的Ctrl+A全选所有文件,然后将全部文件添加到压缩文件夹,压缩文件格式选择”zip”,压缩方式可选择”最好”,再点击”确定”就行了! </p> <p> 到这里皮肤就已经全部制作完成了,将这个压缩文件复制到千千安装目录下的Skin文件夹,然后在”千千选项…”-”皮肤”中就可以选择应用皮肤了,或直接在主面板上点击右键-”选择皮肤”即可! </p> <p>皮肤制作注意事项及技巧: </p> <p>1.压缩皮肤文件时,不是压缩整个文件夹,而是应该进入文件夹后按Ctrl+A全选所有文件,然后再添加到压缩文件(zip格式),否则皮肤无效; </p> <p>2.播放列表和歌词秀窗口的position属性定义了这两个窗口初始化时的大小,这个大小可以不是图片的实际大小。这两个窗口在初始化时就会按照resize_rect的规则拉伸窗口至所设置的大小。此外,这两个窗口最大可以拉伸到与屏幕同样大小,但最小只能缩小到与原始图片同样的大小,所以原始图片应该尽量画得小一些,这样可以方便用户把窗口缩成最小,同时还可以稍微减少图片及皮肤大小; </p> <p>注:这个时候窗口上的按钮的position属性是按图片的实际大小来确定坐标的; </p> <p>3.bmp图片(尤其是几个面积较大的窗口背景图片)应尽量转换为8位的索引颜色,这样可以极大地减少图片及皮肤的大小,同时在应用皮肤时可以减少内存占用率。 </p> <p>具体的方法为:在Adobe Photoshop中,打开RGB模式的图片,然后点击”图像”-”模式”-”索引颜色”,再保存即可!注:如果有透明色时要注意两点:①在填充透明色时,一定不要选”容差”;②转换时一定要选中”保留原实际颜色”,以防止填充的透明色被改掉。 </p> <p> 4.当按钮很小的时候,不要将其透明,而是和背景图片连在一起!因为我们知道,皮肤中透明的部分是不感应鼠标动作的,因此当按钮比较小的时候如果中间有很小的缝隙,鼠标移动到上面时就会乱跳,不便于点击操作!正确的做法是别把对应位置的背景图片连在一起作为按钮,如图所示: </p> <p> 5.千千现在可以支持包括.zip和.skn在内的两种皮肤格式,但是如果你的皮肤做好后要发布在网上时,建议把扩展名改为.skn,然后再压缩为rar文件(因为一般论坛不支持.skn文件格式上传)。这样别人下载后解压就可以得到有正确皮肤文件名的skn格式皮肤(这个只是为了方便管理,程序是从Skin.xml中读取皮肤文件名的,而和皮肤文件本身的文件名没有关系);另外,这样还可以防止别人误将zip文件解压而不能正确使用皮肤的情况; </p> <p>6.在制作皮肤时不一定要在全部图片都制作完成并配置好Skin.xml后才去看最终的效果,而是可以在制作到一半左右时就多预览几次,如果发现有不对的地方赶紧回来修改,这样有利于节省时间和提高效率; </p> <p>7.如果要独立设计一款完整的皮肤,恐怕需要一定的设计水平和花费不少的时间,其实还有一种更为快速有效的皮肤制作方法,那就是从其它现成的播放器皮肤移植到千千上来,比如Winamp(后缀名一般为.wal)、Windows Media Player(后缀名为一般为.wmz)等,将它们的后缀名改为zip后解压就可以得到其按钮素材,然后再用这些已经做好的按钮来做千千的皮肤就方便许多了! </p> <p>8.花一个月的时间做10个皮肤不如花半个月时间用心做好一个皮肤!现在千千不缺皮肤,缺的是精品的皮肤,因此建议大家想做皮肤的话要抱着”做了就要做最好”的决心去做,追求完美地,尽量把一个皮肤完善!无论是自己原创制作,还是从winamp、WMP皮肤文件改造,都应该把皮肤做完整,包括按钮要有四种不同的鼠标感应状态、要有迷你模式、要有配色文件等; </p> <p>9.如果不想在主窗口或迷你模式中显示图标,可以将图标的position设置为超过窗口大小,比如”500, 500, 516, 516”;如果想让歌词秀或播放列表固定大小而不能拉伸,可以resize_rect的矩形范围任意一边大小设置为0即可,比如”100, 20, 100, 30”</p> <p>10.在主窗口中的led元素(即播放时间)有两种显示方式,一种是已播放的时间,一种是未播放的时间,鼠标点击即可在两种显示方式之间切换。后者比前者多了一个负号,因此在主窗口上应至少给led留出6位的空间,以防止在显示剩余时间时数字覆盖到面板上的其它部分而影响美观;led元素使用的图片必须是12张同样大小的图片排在一起,分别代表0-9十个数字、冒号和减号(可以使用透明色); </p> <p>11.如果不想显示某个窗口或者各窗口上的某些元素,把相应的元素代码全部删除即可; </p> <p> 制作千千皮肤的基本方法就只有这么多,但是技巧远不止这些,大家可以在制作的过程中不断实践摸索,并发挥自己的创造力,设计出各种有创意的皮肤来,比如可换照片式皮肤等!最后祝千千越来越好,同时也希望更多的人参与到千千的皮肤制作中来,为这款优秀的国产软件作出自己小小的贡献</p> </article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="mailto:undefined">Shine.Shen</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://shineshen.cn/study/computer/3.html">https://shineshen.cn/study/computer/3.html</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://shineshen.cn" target="_blank">省心资源</a>!</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E8%BD%AF%E4%BB%B6/">软件</a><a class="post-meta__tags" href="/tags/%E5%8D%83%E5%8D%83%E9%9D%99%E5%90%AC/">千千静听</a></div><div class="post_share"><div class="addtoany"><div class="a2a_kit a2a_kit_size_32 a2a_default_style"><a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_wechat"></a><a class="a2a_button_sina_weibo"></a><a class="a2a_button_facebook_messenger"></a><a class="a2a_button_email"></a><a class="a2a_button_copy_link"></a><a class="a2a_dd" target="_blank" rel="noopener" href="https://www.addtoany.com/share"></a></div></div><script async="async" src="https://static.addtoany.com/menu/page.js"></script></div></div><div class="post-reward"><div class="reward-button button--animated"><i class="fas fa-qrcode"></i> 打赏</div><div class="reward-main"><ul class="reward-all"><li class="reward-item"><a href="/ShineShen/wx.shine.jpg" target="_blank"><img class="post-qr-code-img" src="/ShineShen/wx.shine.jpg" alt="微信扫一扫"/></a><div class="post-qr-code-desc">微信扫一扫</div></li><li class="reward-item"><a href="/ShineShen/zfb.shine.jpg" target="_blank"><img class="post-qr-code-img" src="/ShineShen/zfb.shine.jpg" alt="支付宝扫一扫"/></a><div class="post-qr-code-desc">支付宝扫一扫</div></li></ul></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/study/other/20210528.html"><img class="prev-cover" src="/ShineShen/China.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">我要记歌词 <You Raise Me Up></div></div></a></div><div class="next-post pull-right"><a href="/about/zhanzhang/1.html"><img class="next-cover" src="/ShineShen/China.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">My Short Introduction</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span> 相关推荐</span></div><div class="relatedPosts-list"><div><a href="/study/computer/2897.html" title="相见恨晚的50个CAD技巧,都是诚意!"><img class="cover" src="/ShineShen/China.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2019-02-12</div><div class="title">相见恨晚的50个CAD技巧,都是诚意!</div></div></a></div></div></div><hr/><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i><span> 评论</span></div></div><div class="comment-wrap"><div><div class="vcomment" id="vcomment"></div></div></div></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%AE%80%E4%BB%8B%EF%BC%9A"><span class="toc-text">简介:</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%80-%E7%9A%AE%E8%82%A4%E6%9E%84%E9%80%A0"><span class="toc-text">一.皮肤构造</span></a></li></ol></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2012 - 2021 By Shine.Shen</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div><div class="footer_custom_text">友链: <a href="http://shineshen.cn/yh/index.php">省心优惠</a> | <a target="_blank" rel="noopener" href="http://5xlh.com">我的心里话</a> | <a target="_blank" rel="noopener" href="https://www.floraer.com">漠子荀</a> | <a target="_blank" rel="noopener" href="https://akilar.top/">Akilar の糖果屋</a> | <a target="_blank" rel="noopener" href="https://www.hack-gov.com.cn/">御网尚书</a> | <a target="_blank" rel="noopener" href="http://www.zjghjjxzz.com/">华军地摊网</a> | <a target="_blank" rel="noopener" href="http://www.ekanghome.com/">亿康网</a> | <a href="# " target="_blank">友情链接广告位</a> <br><br><img class="icp-icon" src="/img/icp.png">备案号:<a target="_blank" rel="noopener" href="https://beian.miit.gov.cn/"><span>苏ICP备16013421号-1</span></a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="font-plus" type="button" title="放大字体"><i class="fas fa-plus"></i></button><button id="font-minus" type="button" title="缩小字体"><i class="fas fa-minus"></i></button><button id="translateLink" type="button" title="简繁转换">简</button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><a id="to_comment" href="#post-comment" title="直达评论"><i class="fas fa-comments"></i></a><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script>var preloader = { endLoading: () => { document.body.style.overflow = 'auto'; document.getElementById('loading-box').classList.add("loaded") }, initLoading: () => { document.body.style.overflow = ''; document.getElementById('loading-box').classList.remove("loaded") } } window.addEventListener('load',preloader.endLoading())</script><div class="js-pjax"><script>function loadValine () { function initValine () { const valine = new Valine(Object.assign({ el: '#vcomment', appId: 'KaYO309f9UDY05iuYKSLp2jo-MdYXbMMI', appKey: 'Kllh6UWmqOTEwwW5Ix1RClwX', placeholder: '留下你最美的身影', avatar: 'robohash', meta: 'nick,mail,link'.split(','), pageSize: '10', lang: 'zh-CN', recordIP: true, serverURLs: '', emojiCDN: '', emojiMaps: "", enableQQ: true, path: window.location.pathname, requiredFields: ["nick,mail"], visitor: false }, null)) } if (typeof Valine === 'function') initValine() else getScript('https://cdn.jsdelivr.net/npm/valine/dist/Valine.min.js').then(initValine) } if ('Valine' === 'Valine' || !false) { if (false) btf.loadComment(document.getElementById('vcomment'),loadValine) else setTimeout(loadValine, 0) } else { function loadOtherComment () { loadValine() } }</script></div><script src="/js/pool.min.js"></script><script src="/js/hideMobileSidebar.js"></script><script async src="/js/diytitle.js"></script><script defer src="/ShineShen/live2d-widget/autoload.js"></script><script id="canvas_nest" defer="defer" color="0,0,255" opacity="0.7" zIndex="-1" count="99" mobile="true" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-nest.min.js"></script><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/activate-power-mode.min.js"></script><script>POWERMODE.colorful = true; POWERMODE.shake = false; POWERMODE.mobile = true; document.body.addEventListener('input', POWERMODE); </script><script id="click-heart" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/click-heart.min.js" async="async" mobile="true"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>