'
+ result += '
' + ' ' + headline_lang + '
'
+ result += '
'
+
+ for (var i = 0; i < Math.min(relatedPosts.length, limit_num); i++) {
+ var cover = relatedPosts[i].cover === false ? relatedPosts[i].randomcover : relatedPosts[i].cover
+ result += '
'
+ return result;
+
+ }
+});
+
+function isTagRelated(tagName, TBDtags) {
+ var result = false;
+ TBDtags.forEach(function (tag) {
+ if (tagName == tag.name) {
+ result = true;
+ };
+ })
+ return result;
+}
+
+function findItem(arrayToSearch, attr, val) {
+ for (var i = 0; i < arrayToSearch.length; i++) {
+ if (arrayToSearch[i][attr] == val) {
+ return i
+ };
+ };
+ return -1;
+}
+
+function compare(attr) {
+ return function (a, b) {
+ var val1 = a[attr];
+ var val2 = b[attr];
+ return val2 - val1;
+ }
+}
\ No newline at end of file
diff --git a/themes/butterfly/scripts/tags/gallery.js b/themes/butterfly/scripts/tags/gallery.js
new file mode 100644
index 00000000..b4bcd28c
--- /dev/null
+++ b/themes/butterfly/scripts/tags/gallery.js
@@ -0,0 +1,27 @@
+const url_for = require('hexo-util').url_for.bind(hexo);
+
+function gallery(args, content) {
+ return `
${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')}
+
`;
+}
+
+function galleryGroup(args){
+ const name = args[0]
+ const desrc = args[1]
+ const url = url_for(args[2])
+ const img = url_for(args[3])
+
+ return `
+
+
+
+ ${name}
+ ${desrc}
+
+
+
+ `
+}
+
+hexo.extend.tag.register('gallery', gallery, {ends: true});
+hexo.extend.tag.register('galleryGroup', galleryGroup);
diff --git a/themes/butterfly/scripts/tags/hide.js b/themes/butterfly/scripts/tags/hide.js
new file mode 100644
index 00000000..fd8e19dd
--- /dev/null
+++ b/themes/butterfly/scripts/tags/hide.js
@@ -0,0 +1,33 @@
+
+/**
+ * {% hideInline content,display,bg,color %}
+ * content不能包含當引號,可用 '
+ */
+function hideInline(args) {
+ args = args.join(' ').split(',')
+ let content = args[0].trim()
+ let display = args[1] || 'Click'
+ let bg = args[2] ==='' || typeof args[2] ==='undefined' ? '' : `background-color:${args[2]}`
+ let color = args[3] || '#fff'
+ return `
${display}
+ ${content}`
+}
+
+/**
+ * {% hideBlock display,bg,color %}
+ * content
+ * {% endhideBlock %}
+ */
+function hideBlock(args,content) {
+ args = args.join(' ').split(',')
+ let display = args[0] || 'Click'
+ let bg = args[1] ==='' || typeof args[2] ==='undefined' ? '' : `background-color:${args[2]}`
+ let color = args[2] || '#fff'
+
+ return `
${display}
+ ${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')} `
+
+}
+
+hexo.extend.tag.register('hideInline', hideInline);
+hexo.extend.tag.register('hideBlock', hideBlock, {ends: true});
\ No newline at end of file
diff --git a/themes/butterfly/scripts/tags/mermaid.js b/themes/butterfly/scripts/tags/mermaid.js
new file mode 100644
index 00000000..319310eb
--- /dev/null
+++ b/themes/butterfly/scripts/tags/mermaid.js
@@ -0,0 +1,7 @@
+function mermaid(args, content) {
+ return `
+ ${content}
+
`;
+}
+
+hexo.extend.tag.register('mermaid', mermaid, {ends: true});
\ No newline at end of file
diff --git a/themes/butterfly/scripts/tags/note.js b/themes/butterfly/scripts/tags/note.js
new file mode 100644
index 00000000..61acd3b8
--- /dev/null
+++ b/themes/butterfly/scripts/tags/note.js
@@ -0,0 +1,15 @@
+/**
+ * note.js
+ * transplant from hexo-theme-next
+ */
+
+'use strict';
+
+function postNote(args, content) {
+ return `
+ ${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')}
+
`;
+}
+
+hexo.extend.tag.register('note', postNote, {ends: true});
+hexo.extend.tag.register('subnote', postNote, {ends: true});
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_global/index.styl b/themes/butterfly/source/css/_global/index.styl
new file mode 100644
index 00000000..09bbb2a1
--- /dev/null
+++ b/themes/butterfly/source/css/_global/index.styl
@@ -0,0 +1,430 @@
+html
+ height: 100%
+ font-size: $rem
+
+body
+ position: relative
+ min-height: 100%
+ background: $body-bg
+ color: $font-black
+ font-size: $font-size
+ font-family: $font-family
+ line-height: $text-line-height
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
+
+ if !hexo-config('copy.enable')
+ user-select: none
+ -moz-user-select: none
+ -webkit-user-select: none
+ -ms-user-select: none
+
+*::-webkit-scrollbar
+ width: 8px
+ height: 8px
+
+*::-webkit-scrollbar-thumb
+ background: $light-blue
+
+*::-webkit-scrollbar-track
+ background-color: transparent
+
+#web_bg
+ position: fixed
+ z-index: -999
+ width: 100%
+ height: 100%
+ background: $web-bg
+ background-attachment: local
+ background-position: center
+ background-size: cover
+ background-repeat: no-repeat
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6
+ position: relative
+ margin: 1rem 0 .7rem
+ color: lighten($font-color, 15%)
+ font-weight: bold
+
+ code
+ font-size: inherit !important
+
+*
+ box-sizing: border-box
+
+#toggle-sidebar
+ position: fixed
+ bottom: $sidebar-icon-top
+ left: $sidebar-icon-left
+ z-index: 100
+ font-size: $sidebar-icon-size
+ // opacity: 0
+ cursor: pointer
+ transition: all .2s
+
+hr
+ position: relative
+ margin: 2rem auto
+ width: calc(100% - 4px)
+ border: 2px dashed lighten($theme-hr-color, 50%)
+
+ &:hover
+ &:before
+ left: calc(95% - 20px)
+
+ &:before
+ position: absolute
+ top: $hr-icon-top
+ left: 5%
+ z-index: 1
+ color: $theme-hr-color
+ content: $hr-icon
+ font-style: normal
+ font-variant: normal
+ font-size: 20px
+ line-height: 1
+ transition: all 1s ease-in-out
+ text-rendering: auto
+ -webkit-font-smoothing: antialiased
+
+ if hexo-config('fontawesome_v5') && hexo-config('fontawesome_v5.enable')
+ font-weight: 600
+ font-family: 'Font Awesome 5 Free'
+ else
+ font-weight: normal
+ font-family: FontAwesome
+
+iframe
+ margin: 0 0 1rem
+
+table
+ display: block
+ overflow: auto
+ margin: 0 0 1rem
+ width: 100%
+ border-spacing: 0
+ border-collapse: collapse
+ empty-cells: show
+
+ thead
+ background: alpha($table-thead-bg, 10%)
+
+ th,
+ td
+ padding: .3rem .6rem
+ border: 1px solid darken($light-grey, 10%)
+ vertical-align: middle
+
+*::selection
+ background: $theme-text-selection-color
+ color: #F7F7F7
+
+// font
+#nav #site_title,
+#nav #site_subtitle,
+#site-name,
+#aside_content .author-info__name,
+#aside_content .author-info__description
+ font-family: $site-name-font
+
+.is_right
+ text-align: right
+
+.is_left
+ text-align: left
+
+.is-center
+ text-align: center
+
+.is_visible
+ display: block !important
+
+.is-visible-inline
+ display: inline-block !important
+
+.is_invisible
+ display: none !important
+
+.is_hidden
+ overflow: hidden
+
+.pull_left
+ float: left
+
+.pull_right
+ float: right
+
+// button hover
+.button--primary
+ color: $theme-button-hover-color
+
+.button--animated
+ transition-duration: 1s
+ transition-property: color
+
+ &:before
+ position: absolute
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ z-index: -1
+ background: $theme-button-hover-color
+ content: ''
+ transition-timing-function: ease-out
+ transition-duration: .5s
+ transition-property: transform
+ transform: scaleX(0)
+ transform-origin: 0 50%
+
+ &:hover
+ &:before
+ transition-timing-function: cubic-bezier(.45, 1.64, .47, .66)
+ transform: scaleX(1)
+
+img[src=''],
+img:not([src])
+ opacity: 0
+
+.img-alt
+ margin: -.5rem 0 .5rem
+
+// hexo tag video
+.video-container
+ position: relative
+ overflow: hidden
+ margin-bottom: .8rem
+ padding-top: 56.25%
+ height: 0
+
+ iframe
+ position: absolute
+ top: 0
+ left: 0
+ margin-top: 0
+ width: 100%
+ height: 100%
+
+// tag-hide
+.hide-inline,
+.hide-block
+ & > .hide-button
+ position: relative
+ z-index: 1
+ display: inline-block
+ padding: 0 1rem
+ background: $tag-hide-bg
+ text-align: center
+ cursor: pointer
+
+ &:hover
+ text-decoration: none !important
+
+ & > .hide-content
+ display: none
+
+.hide-inline
+ & > .hide-button
+ margin: 0 .3rem
+
+ & > .hide-content
+ margin: 0 .3rem
+
+.hide-block
+ margin: 0 0 .8rem
+
+.comment_headling
+ margin-bottom: 10px
+ font-weight: 700
+ font-size: 20px
+
+.post-ad
+ margin: 2rem 0 !important
+
+.ad_height
+ display: block !important
+ height: auto !important
+
+#content-inner,
+#footer
+ animation: main 1s
+
+#nav
+ animation: nav-effect 1s
+
+// #page-header
+// animation: header-effect 1s
+#site_title,
+#site_subtitle
+ animation: titlescale 1s
+
+canvas,
+#web_bg
+ animation: to_show 4s
+
+.card-announcement-animation
+ color: #FF0000
+ animation: announ_animation .8s linear infinite
+
+.scroll-down-effects
+ animation: scroll-down-effect 1.5s infinite
+
+if hexo-config('avatar.effect') == true
+ .avatar-img
+ animation: avatar_turn_around 2s linear infinite
+
+.reward-main
+ animation: donate_effcet .3s .1s ease both
+
+.tocOpenPc
+ .sidebar-toc__title
+ animation: tocsidebarLtoR .5s
+
+ .sidebar-toc__progress
+ animation: tocsidebarLtoR .7s
+
+ .sidebar-toc__content
+ animation: tocsidebarLtoR .9s
+
+.tocOpenMobile
+ .sidebar-toc__title
+ animation: tocsidebarRtoL .5s
+
+ .sidebar-toc__progress
+ animation: tocsidebarRtoL .7s
+
+ .sidebar-toc__content
+ animation: tocsidebarRtoL .9s
+
+@keyframes scroll-down-effect
+ 0%
+ top: 0
+ opacity: .4
+
+ 50%
+ top: -16px
+ opacity: 1
+
+ 100%
+ top: 0
+ opacity: .4
+
+@keyframes nav-effect
+ 0%
+ opacity: 0
+ transform: translateY(-50px)
+
+ 100%
+ opacity: 1
+ transform: translateY(0)
+
+@keyframes header-effect
+ 0%
+ opacity: 0
+
+ 60%
+ opacity: 0
+ transform: translateY(-30px)
+
+ 100%
+ opacity: 1
+ transform: translateY(0)
+
+@keyframes headerNoOpacity
+ 0%
+ transform: translateY(-50px)
+
+ 100%
+ transform: translateY(0)
+
+@keyframes main
+ 0%
+ opacity: 0
+ transform: translateY(50px)
+
+ 100%
+ opacity: 1
+ transform: translateY(0)
+
+@keyframes titlescale
+ 0%
+ opacity: 0
+ transform: scale(.7)
+
+ 100%
+ opacity: 1
+ transform: scale(1)
+
+@keyframes search_close
+ 0%
+ opacity: 1
+ transform: scale(1)
+
+ 100%
+ opacity: 0
+ transform: scale(.7)
+
+@keyframes to_show
+ 0%
+ opacity: 0
+
+ 100%
+ opacity: 1
+
+@keyframes avatar_turn_around
+ from
+ transform: rotate(0)
+
+ to
+ transform: rotate(360deg)
+
+@keyframes sub_menus
+ 0%
+ opacity: 0
+ transform: translateY(10px)
+
+ 100%
+ opacity: 1
+ transform: translateY(0)
+
+@keyframes donate_effcet
+ 0%
+ opacity: 0
+ transform: translateY(-20px)
+
+ 100%
+ opacity: 1
+ transform: translateY(0)
+
+@keyframes announ_animation
+ 0%,
+ to
+ transform: scale(1)
+
+ 50%
+ transform: scale(1.2)
+
+@keyframes sidebarItem
+ 0%
+ transform: translateX(200px)
+
+ 100%
+ transform: translateX(0)
+
+@keyframes tocsidebarRtoL
+ 0%
+ transform: translateX(200px)
+
+ 100%
+ transform: translateX(0)
+
+@keyframes tocsidebarLtoR
+ 0%
+ transform: translateX(-200px)
+
+ 100%
+ transform: translateX(0)
diff --git a/themes/butterfly/source/css/_highlight/diff.styl b/themes/butterfly/source/css/_highlight/diff.styl
new file mode 100644
index 00000000..19aa8d7d
--- /dev/null
+++ b/themes/butterfly/source/css/_highlight/diff.styl
@@ -0,0 +1,8 @@
+$highlight_theme = hexo-config('highlight_theme')
+
+if $highlight_theme == 'light'
+ $highlight-deletion = #fdd
+ $highlight-addition = #dfd
+else
+ $highlight-deletion = #008000
+ $highlight-addition = #800000
diff --git a/themes/butterfly/source/css/_highlight/highlight.styl b/themes/butterfly/source/css/_highlight/highlight.styl
new file mode 100644
index 00000000..12c81dff
--- /dev/null
+++ b/themes/butterfly/source/css/_highlight/highlight.styl
@@ -0,0 +1,276 @@
+// https://github.com/equinusocio/vsc-material-theme
+@require 'theme'
+@require 'diff'
+
+wordWrap = !hexo-config('rootConfig.highlight.line_number') && hexo-config('code_word_wrap')
+
+$code-block
+ overflow: auto
+ margin: 0 0 1rem
+ padding: 0
+ background: $highlight-background
+ color: $highlight-foreground
+ line-height: $line-height-code-block
+
+ if wordWrap
+ counter-reset: line
+ white-space: pre-wrap
+
+.code-area-wrap
+ position: relative
+ margin: 0 0 1rem
+
+figure.highlight
+ position: relative
+
+blockquote
+ margin: 0 0 1rem
+ padding: .1rem .8rem
+ border-left: .2rem solid $blockquote-padding-color
+ background-color: $blockquote-background-color
+ color: $blockquote-color
+
+ a
+ word-break: break-all
+
+ p
+ margin: 0 !important
+ padding: .5rem 0
+
+ footer
+ padding: 0 0 .5rem
+
+ cite
+ &:before
+ padding: 0 .3em
+ content: '—'
+
+#article-container
+ pre,
+ code
+ font-family: $code-font !important
+
+ code
+ padding: .1rem .2rem
+ background: $code-background
+ color: $code-foreground
+ word-wrap: break-word
+ word-break: break-word
+ overflow-wrap: break-word
+
+ pre
+ @extend $code-block
+ padding: 10px 20px
+
+ code
+ padding: 0
+ background: none
+ color: $highlight-foreground
+ text-shadow: none
+
+ figure.highlight
+ @extend $code-block
+ position: relative
+ border-radius: 1px
+
+ if hexo-config('highlight_shrink') == true
+ display: none
+
+ pre
+ margin: 0
+ padding: 8px 0
+ border: none
+
+ .line
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ if wordWrap
+ &:before
+ display: inline-block
+ padding: 0 .3rem 0 0
+ min-width: 1.6rem
+ color: $highlight-gutter.color
+ content: counter(line)
+ counter-increment: line
+ text-align: left
+
+ &.marked
+ background-color: $highlight-selection
+
+ table
+ position: relative
+ display: table
+ margin: 0
+ width: auto
+ border: none
+
+ td
+ padding: 0
+ border: none
+
+ figcaption
+ clearfix()
+ padding: .3rem 0 .1rem .7rem
+ color: $highlight-foreground
+ font-size: 1em
+ line-height: 1em
+
+ a
+ float: right
+ padding-right: 10px
+ color: $highlight-foreground
+
+ &:hover
+ border-bottom-color: $highlight-foreground
+
+ .gutter pre
+ padding-right: .5rem
+ padding-left: .5rem
+ background-color: $highlight-gutter.bg-color
+ color: $highlight-gutter.color
+ text-align: right
+
+ .code pre
+ padding-right: .5rem
+ padding-left: .5rem
+ width: 100%
+ background-color: $highlight-background
+
+ .line
+ height: 1rem
+
+ .gutter
+ user-select: none
+ -webkit-user-select: none
+ -moz-user-select: none
+ -ms-user-select: none
+
+ .gist table
+ width: auto
+
+ td
+ border: none
+
+ // For diff highlight
+ pre .deletion
+ background: $highlight-deletion
+
+ pre .addition
+ background: $highlight-addition
+
+ pre .meta
+ color: $highlight-purple
+
+ pre
+ .comment
+ color: $highlight-comment
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .variable,
+ .attribute,
+ .regexp,
+ .ruby .constant,
+ .xml .tag .title,
+ .xml .pi,
+ .xml .doctype,
+ .html .doctype,
+ .css .id,
+ .tag .name,
+ .css .class,
+ .css .pseudo
+ color: $highlight-red
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .tag
+ color: $highlight-aqua
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .number,
+ .preprocessor,
+ .literal,
+ .params,
+ .constant,
+ .command
+ color: $highlight-orange
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .built_in
+ color: $highlight-yellow
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .ruby .class .title,
+ .css .rules .attribute,
+ .string,
+ .value,
+ .inheritance,
+ .header,
+ .ruby .symbol,
+ .xml .cdata,
+ .special,
+ .number,
+ .formula
+ color: $highlight-green
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .keyword,
+ .title,
+ .css .hexcolor
+ color: $highlight-aqua
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .function,
+ .python .decorator,
+ .python .title,
+ .ruby .function .title,
+ .ruby .title .keyword,
+ .perl .sub,
+ .javascript .title,
+ .coffeescript .title
+ color: $highlight-blue
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+ .tag .attr,
+ .javascript .function
+ color: $highlight-purple
+
+ &::selection
+ background: $highlight-selection
+ color: $highlight-foreground
+
+.highlight-tools
+ position: relative
+ overflow: hidden
+ width: 100%
+ height: 1.4rem
+ background: darken($highlight-background, 5)
+ color: $highlight-foreground
+ font-size: 14px
+
+.highlight-close
+ height: 0 !important
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_highlight/theme.styl b/themes/butterfly/source/css/_highlight/theme.styl
new file mode 100644
index 00000000..c956ce1b
--- /dev/null
+++ b/themes/butterfly/source/css/_highlight/theme.styl
@@ -0,0 +1,91 @@
+$highlight_theme = hexo-config('highlight_theme')
+
+if $highlight_theme == 'default'
+ $highlight-background = #263238
+ $highlight-current-line = #efefef
+ $highlight-selection = #80CBC420
+ $highlight-foreground = #EEFFFF
+ $highlight-comment = #546E7A
+ $highlight-red = #FF5370
+ $highlight-orange = #F78C6C
+ $highlight-yellow = #FFCB6B
+ $highlight-green = #C3E88D
+ $highlight-aqua = #89DDFF
+ $highlight-blue = #82AAFF
+ $highlight-purple = #C792EA
+ $highlight-gutter = {
+ color: #37474F,
+ bg-color: $highlight-background
+ }
+
+if $highlight_theme == 'darker'
+ $highlight-background = #212121
+ $highlight-current-line = #282a2e
+ $highlight-selection = #61616150
+ $highlight-foreground = #EEFFFF
+ $highlight-comment = #4A4A4A
+ $highlight-red = #FF5370
+ $highlight-orange = #F78C6C
+ $highlight-yellow = #FFCB6B
+ $highlight-green = #C3E88D
+ $highlight-aqua = #89DDFF
+ $highlight-blue = #82AAFF
+ $highlight-purple = #C792EA
+ $highlight-gutter = {
+ color: #424242,
+ bg-color: $highlight-background
+ }
+
+if $highlight_theme == 'pale night'
+ $highlight-background = #292D3E
+ $highlight-current-line = #393939
+ $highlight-selection = #717CB450
+ $highlight-foreground = #A6ACCD
+ $highlight-comment = #676E95
+ $highlight-red = #FF5370
+ $highlight-orange = #F78C6C
+ $highlight-yellow = #FFCB6B
+ $highlight-green = #C3E88D
+ $highlight-aqua = #89DDFF
+ $highlight-blue = #82AAFF
+ $highlight-purple = #C792EA
+ $highlight-gutter = {
+ color: #3A3F58,
+ bg-color: $highlight-background
+ }
+
+if $highlight_theme == 'ocean'
+ $highlight-background = #0F111A
+ $highlight-current-line = #000000
+ $highlight-selection = #717CB450
+ $highlight-foreground = #8F93A2
+ $highlight-comment = #464B5D
+ $highlight-red = #FF5370
+ $highlight-orange = #F78C6C
+ $highlight-yellow = #FFCB6B
+ $highlight-green = #C3E88D
+ $highlight-aqua = #89DDFF
+ $highlight-blue = #82AAFF
+ $highlight-purple = #C792EA
+ $highlight-gutter = {
+ color: #3B3F5180,
+ bg-color: $highlight-background
+ }
+
+if $highlight_theme == 'light'
+ $highlight-background = #F6F8FA
+ $highlight-current-line = #00346e
+ $highlight-selection = #80CBC440
+ $highlight-foreground = #90A4AE
+ $highlight-comment = #90A4AE90
+ $highlight-red = #E53935
+ $highlight-orange = #F76D47
+ $highlight-yellow = #FFB62C
+ $highlight-green = #91B859
+ $highlight-aqua = #39ADB5
+ $highlight-blue = #6182B8
+ $highlight-purple = #7C4DFF
+ $highlight-gutter = {
+ color: #CFD8DC,
+ bg-color: $highlight-background
+ }
diff --git a/themes/butterfly/source/css/_layout/404.styl b/themes/butterfly/source/css/_layout/404.styl
new file mode 100644
index 00000000..0ffb194e
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/404.styl
@@ -0,0 +1,44 @@
+if hexo-config('error_404.enable')
+ #nav.error-no-found
+ display: flex
+ flex-direction: column
+ justify-content: center
+ height: 100vh
+
+ &:before
+ width: 100%
+ height: 100%
+ background-color: alpha($dark-black, .5)
+ content: ''
+
+ #error_info
+ position: absolute
+ padding: 0 4rem
+ width: 100%
+ letter-spacing: 3px
+ line-height: 1
+
+ #error_title,
+ #error_subtitle
+ margin: 0
+ padding: 0
+ color: $light-grey
+ letter-spacing: 5px
+ font-family: $site-name-font
+
+ #error_title
+ font-size: 10rem
+
+ #error_subtitle
+ font-size: 2rem
+
+ @media screen and (max-width: $sm)
+ #nav.error-no-found
+ #error_info
+ padding: 0 2rem
+
+ #error_title
+ font-size: 7rem !important
+
+ #error_subtitle
+ font-size: 1rem !important
diff --git a/themes/butterfly/source/css/_layout/aside.styl b/themes/butterfly/source/css/_layout/aside.styl
new file mode 100644
index 00000000..6ed0ff59
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/aside.styl
@@ -0,0 +1,227 @@
+#aside_content
+ width: 25%
+
+ .card-widget:not(:first-child)
+ margin-top: 1rem
+
+ .card-widget
+ overflow: hidden
+ border-radius: 8px
+ background: $card-bg
+ box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06)
+ transition: all .3s
+
+ &:hover
+ box-shadow: 0 4px 12px 12px rgba(7, 17, 27, .15)
+
+ .card-info
+ img
+ display: inline-block
+ width: 110px
+ height: 110px
+ border-radius: 70px
+ transition: all .3s
+
+ &:hover
+ transform: rotate(540deg)
+
+ .author-info
+ &__name
+ font-weight: 500
+ font-size: 1.1rem
+
+ &__description
+ margin-top: -.3rem
+
+ .card-info-data
+ padding: .7rem 0
+
+ & > .card-info-data-item
+ display: inline-block
+ width: 33.3%
+
+ a
+ .headline
+ display: block
+ overflow: hidden
+ color: $font-black
+ // text-transform: uppercase
+ text-overflow: ellipsis
+ white-space: nowrap
+ font-size: .7rem
+
+ .length_num
+ color: $dark-black
+ font-size: 1rem
+
+ .card-info-social-icons
+ margin: .3rem 0 -.3rem
+
+ .social-icon
+ margin: 0 .5rem
+ color: $font-black
+ font-size: 1rem
+ cursor: pointer
+
+ i
+ transition: all .3s
+
+ &:hover
+ transform: rotate(540deg)
+
+ #bookmark-it
+ position: relative
+ z-index: 1
+ display: block
+ background-color: $light-blue
+ color: $button-color
+ text-transform: uppercase
+ line-height: 1.6rem
+
+ span
+ padding-left: .5rem
+
+ .card-content
+ padding: 1rem 1.2rem
+
+ .item-headline
+ font-size: .8rem
+
+ span
+ margin-left: .5rem
+
+ .card-tag-cloud
+ a
+ word-break: keep-all
+
+ &:hover
+ color: $light-blue !important
+
+ .card-recent-post
+ .aside-recent-item
+ margin: 10px 0 -15px
+
+ & > .aside-recent-post
+ margin-bottom: 10px
+
+ & > a
+ color: $font-black
+
+ .aside-post-cover
+ float: left
+ overflow: hidden
+ width: 66px
+ height: 66px
+
+ .aside-post-bg
+ padding: 0
+ max-width: 100%
+ width: 100%
+ height: 100%
+ transition: all .6s
+ object-fit: cover
+
+ &:hover
+ box-shadow: none
+ transform: scale(1.1)
+
+ .aside-post-title
+ .aside-post_meta
+ padding-left: 10px
+ color: $theme-meta-color
+ font-size: .6rem
+
+ .aside-post_title
+ display: -webkit-box
+ overflow: hidden
+ padding-left: 10px
+ height: 40px
+ line-height: 1rem
+ -webkit-line-clamp: 2
+ -webkit-box-orient: vertical
+
+ &:hover
+ color: $light-blue !important
+
+ &.no-aside-cover
+ .aside-post_title
+ height: auto
+
+ .card-archives ul.archive-list,
+ .card-categories ul.aside-category-item
+ margin: 0
+ padding: .2rem 0 0
+ list-style: none
+
+ .card-archives ul.archive-list > .archive-list-item,
+ .card-categories ul.aside-category-item > .aside-category-list
+ padding: .2rem 1rem
+ cursor: pointer
+ transition: all .3s
+
+ &:hover
+ padding: .2rem .85rem
+ background-color: $light-blue
+
+ a
+ color: $font-black
+
+ span
+ display: inline-block
+ overflow: hidden
+ vertical-align: bottom
+ text-overflow: ellipsis
+ white-space: nowrap
+
+ &:first-child
+ width: 80%
+
+ &:last-child
+ width: 20%
+ text-align: right
+
+ .card-categories
+ .aside-category-item
+ &.child
+ padding: 0 0 0 1.2rem
+
+ .card-webinfo
+ .webinfo
+ padding: .2rem 1rem
+
+ .webinfo-item
+ display: block
+ padding: 4px 0 0
+
+ div
+ &:first-child
+ display: inline-block
+
+ &:last-child
+ display: inline-block
+ float: right
+
+@media screen and (max-width: 900px)
+ .layout_page
+ flex-direction: column
+
+ #recent-posts,
+ #aside_content
+ width: 100% !important
+
+ #aside_content
+ .card-widget:first-child
+ margin-top: 1rem
+
+@media screen and (min-width: 900px)
+ #aside_content
+ .card-widget
+ if hexo-config('aside.position') == 'right'
+ margin-left: 15px
+ else
+ margin-right: 15px
+
+if hexo-config('aside.mobile') == false
+ @media screen and (max-width: $sm)
+ #aside_content
+ display: none
diff --git a/themes/butterfly/source/css/_layout/category.styl b/themes/butterfly/source/css/_layout/category.styl
new file mode 100644
index 00000000..2150343c
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/category.styl
@@ -0,0 +1,63 @@
+.category-content
+ ol,
+ ul
+ margin-top: .4rem
+ padding: 0 0 0 .8rem
+ list-style: none
+ counter-reset: li
+
+ p
+ margin: 0
+
+ ol,
+ ul
+ padding-left: .5rem
+
+ li
+ position: relative
+ margin: .3rem 0
+ padding: .1rem .5rem .1rem 1.5rem !important
+
+ &:hover
+ &:before
+ transform: rotate(360deg)
+
+ &:before
+ position: absolute
+ top: 0
+ left: 0
+ background: $light-blue
+ color: $card-bg
+ cursor: pointer
+ transition: all .3s ease-out
+
+ ol
+ li
+ &:before
+ margin-top: .2rem
+ width: w = 1.2rem
+ height: h = w
+ border-radius: .5 * w
+ content: counter(li)
+ counter-increment: li
+ text-align: center
+ font-size: .6rem
+ line-height: h
+
+ ul
+ li
+ &:hover
+ &:before
+ border-color: $theme-button-hover-color
+
+ &:before
+ $w = .3rem
+ top: 10px
+ margin-left: .45rem
+ width: w = $w
+ height: h = w
+ border: .5 * w solid $light-blue
+ border-radius: w
+ background: transparent
+ content: ''
+ line-height: h
diff --git a/themes/butterfly/source/css/_layout/flink.styl b/themes/butterfly/source/css/_layout/flink.styl
new file mode 100644
index 00000000..642478ec
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/flink.styl
@@ -0,0 +1,85 @@
+.flink#article-container
+ .post-cards
+ margin: -10px 10px 0
+
+ .md-links
+ overflow: auto
+ text-align: center
+
+ & > .md-links-item
+ position: relative
+ float: left
+ overflow: hidden
+ margin: 20px 7px
+ width: calc(100% / 3 - 15px)
+ height: 90px
+ border-radius: 8px
+ line-height: 17px
+ transform: perspective(1px) translateZ(0)
+
+ &:hover
+ img
+ transform: rotate(540deg)
+
+ &:before
+ position: absolute
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ z-index: -1
+ background: $light-blue
+ content: ''
+ transition-timing-function: ease-out
+ transition-duration: .3s
+ transition-property: transform
+ transform: scale(0)
+
+ &:hover:before,
+ &:focus:before,
+ &:active:before
+ transform: scale(1)
+
+ a
+ color: $font-color
+ text-decoration: none
+
+ img
+ float: left
+ margin: 13px 0 0 10px
+ width: 65px
+ height: 65px
+ border-radius: 35px
+ transition: all .3s
+
+ .img-alt
+ display: none
+
+ .md-links-title
+ overflow: hidden
+ padding: 16px 10px 0 0
+ height: 40px
+ text-overflow: ellipsis
+ white-space: nowrap
+ font-weight: bold
+ font-size: 20px
+
+ .md-links-des
+ overflow: hidden
+ padding: 16px 10px
+ height: 50px
+ text-overflow: ellipsis
+ white-space: nowrap
+ font-size: 13px
+
+@media screen and (max-width: 1100px)
+ .flink
+ .md-links
+ .md-links-item
+ width: calc(50% - 15px) !important
+
+@media screen and (max-width: 600px)
+ .flink
+ .md-links
+ .md-links-item
+ width: calc(100% - 15px) !important
diff --git a/themes/butterfly/source/css/_layout/footer.styl b/themes/butterfly/source/css/_layout/footer.styl
new file mode 100644
index 00000000..23b7f4d7
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/footer.styl
@@ -0,0 +1,35 @@
+#footer
+ position: relative
+ background: $light-blue
+ background-attachment: local
+ background-position: bottom
+ background-size: cover
+
+ if hexo-config('footer_bg') != false
+ &:before
+ position: absolute
+ width: 100%
+ height: 100%
+ background-color: alpha($dark-black, .5)
+ content: ''
+
+#footer-wrap
+ position: relative
+ padding: 2rem 1rem
+ color: $light-grey
+ text-align: center
+
+ a
+ color: $light-grey
+ cursor: pointer
+
+ &:hover
+ color: $theme-color
+ text-decoration: underline
+
+ .footer-separator
+ margin: 0 .2rem
+
+ .icp-icon
+ padding: 0 4px
+ vertical-align: text-bottom
diff --git a/themes/butterfly/source/css/_layout/gallery.styl b/themes/butterfly/source/css/_layout/gallery.styl
new file mode 100644
index 00000000..6c3b6f52
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/gallery.styl
@@ -0,0 +1,112 @@
+figure.gallery-group
+ position: relative
+ float: left
+ overflow: hidden
+ margin: .3rem .2rem
+ width: calc(50% - .4rem)
+ height: 250px
+ border-radius: 8px
+ background: $dark-black
+ -webkit-transform: translate3d(0, 0, 0)
+
+ &:hover
+ img
+ opacity: .4
+ transform: translate3d(0, 0, 0)
+
+ .gallery-group-name::after
+ transform: translate3d(0, 0, 0)
+
+ p
+ opacity: 1
+ transform: translate3d(0, 0, 0)
+
+ img
+ position: relative
+ margin: 0 !important
+ max-width: none
+ width: calc(100% + 20px)
+ height: 250px
+ backface-visibility: hidden
+ opacity: .8
+ transition: opacity .35s, transform .35s
+ transform: translate3d(-10px, 0, 0)
+ object-fit: cover
+
+ figcaption
+ position: absolute
+ top: 0
+ left: 0
+ padding: 1.5rem
+ width: 100%
+ height: 100%
+ color: $gallery-color
+ text-transform: uppercase
+ backface-visibility: hidden
+
+ & > a
+ position: absolute
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ z-index: 1000
+ opacity: 0
+
+ p
+ display: -webkit-box
+ overflow: hidden
+ margin: 0
+ padding: .4rem 0 0
+ letter-spacing: 1px
+ font-size: .8rem
+ line-height: 1.5
+ opacity: 0
+ transition: opacity .35s, transform .35s
+ transform: translate3d(100%, 0, 0)
+ -webkit-line-clamp: 4
+ -webkit-box-orient: vertical
+
+ .gallery-group-name
+ position: relative
+ display: -webkit-box
+ overflow: hidden
+ margin: 0
+ padding: .4rem 0
+ font-weight: bold
+ font-size: 1.2rem
+ line-height: 1.5
+ -webkit-line-clamp: 2
+ -webkit-box-orient: vertical
+
+ &:after
+ position: absolute
+ bottom: 0
+ left: 0
+ width: 100%
+ height: 2px
+ background: $gallery-color
+ content: ''
+ transition: transform .35s
+ transform: translate3d(-100%, 0, 0)
+
+.gallery-group-main
+ overflow: auto
+ padding: 0 0 .8rem
+
+.justified-gallery
+ margin: 0 0 .8rem
+
+ img
+ opacity: 0
+
+ .img-alt
+ display: none
+
+ .fancybox
+ width: auto
+ text-align: inherit
+
+@media screen and (max-width: 600px)
+ figure.gallery-group
+ width: calc(100% - .4rem)
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_layout/head.styl b/themes/butterfly/source/css/_layout/head.styl
new file mode 100644
index 00000000..2f1d84f6
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/head.styl
@@ -0,0 +1,314 @@
+#nav
+ position: relative
+ width: 100%
+ background-color: $light-blue
+ background-attachment: local
+ background-position: center center
+ background-size: cover
+ background-repeat: no-repeat
+ transition: all .5s
+
+ // index
+ &.full_page
+ height: $index_top_img_height
+
+ #site-info
+ position: absolute
+ top: $index_site_info_top
+ padding: 0 .5rem
+ width: 100%
+
+ #site_title,
+ #site_subtitle,
+ #scroll_down .scroll-down-effects
+ color: $light-grey
+ text-align: center
+ text-shadow: .1rem .1rem .2rem rgba(0, 0, 0, .15)
+ line-height: 1.5
+
+ #site_title
+ margin: 0
+ font-size: 1.3rem
+
+ #site_subtitle
+ font-size: .8rem
+
+ #site_social_icons
+ display: none
+ margin: 0 auto
+ width: 15rem
+ text-align: center
+
+ .social-icon
+ margin: 0 .5rem
+ color: $light-grey
+ text-shadow: .1rem .1rem .2rem rgba(0, 0, 0, .15)
+ font-size: .9rem
+ cursor: pointer
+
+ #scroll_down
+ position: absolute
+ bottom: 0
+ width: 100%
+ cursor: pointer
+
+ .scroll-down-effects
+ position: relative
+ width: 100%
+ font-size: 30px
+
+ // page
+ &.not-index-bg
+ height: 20rem
+
+ #page_site-info
+ position: absolute
+ top: 10rem
+ padding: 0 .5rem
+ width: 100%
+
+ // post
+ &.post-bg
+ height: 20rem
+
+ &:before
+ position: absolute
+ top: 0
+ left: 0
+ display: block
+ width: 100%
+ height: 100%
+ background-color: alpha($dark-black, .5)
+ content: ''
+
+ #post-info
+ position: absolute
+ bottom: 1.5rem
+ padding: 0 8%
+ width: 100%
+ color: $light-grey
+ text-align: left
+
+ #post-title
+ margin-bottom: .4rem
+ font-size: 1.5rem
+
+ .posttitle
+ display: -webkit-box
+ overflow: hidden
+ line-height: 1.5
+ -webkit-line-clamp: 3
+ -webkit-box-orient: vertical
+
+ #post-meta
+ font-size: 95%
+
+ > .meta-secondline,
+ > .meta-thirdline
+ display: inline
+
+ .word-count,
+ #busuanzi_value_page_pv,
+ .comment-count
+ padding-left: .2rem
+
+ .post-meta
+ &__separator
+ margin: 0 .3rem
+
+ &__icon
+ margin-right: .2rem
+
+ a
+ color: $light-grey
+ transition: all .3s ease-out
+
+ &:hover
+ color: $light-blue
+ text-decoration: underline
+
+#page-header
+ position: absolute
+ top: 0
+ z-index: 99
+ padding: 10px 36px
+ width: 100%
+ height: 58px
+ border: none
+ font-size: 18px
+ opacity: 0
+ transition: all .5s
+
+ &:not(.fixed)
+ .menus
+ padding-right: 0 !important
+
+ .toggle-menu
+ display: none
+ padding: .1rem 0 0 .3rem
+ vertical-align: top
+
+ &:hover
+ color: $white
+
+ &.is-visible-inline
+ .site-page
+ font-size: inherit
+
+ a
+ color: $light-grey
+
+ &:hover
+ color: $white
+
+ &.fixed
+ position: fixed
+ top: -60px
+ z-index: 101
+ background: alpha($white, .8)
+ box-shadow: 0 5px 6px -5px alpha($grey, .6)
+ transition: transform .2s ease-in-out, opacity .2s ease-in-out
+
+ a,
+ #site-name,
+ .toggle-menu
+ color: $font-black
+ text-shadow: none
+
+ &:hover
+ color: $light-blue
+
+ &.visible
+ transition: all .5s
+ transform: translate3d(0, 100%, 0)
+
+ .menus_item_child
+ background-color: $white !important
+
+ #site-name
+ text-shadow: .1rem .1rem .2rem rgba($dark-black, .15)
+ font-weight: bold
+ cursor: pointer
+
+ .menus_items
+ display: inline
+
+ .menus_item
+ position: relative
+ display: inline-block
+ padding: 0 0 0 .7rem
+
+ &:hover
+ .menus_item_child
+ display: block
+
+ .menus-expand
+ transform: rotate(180deg) !important
+
+ .menus-expand
+ padding: 4px
+ transition: all .3s
+ transform: rotate(0)
+
+ & > a
+ &:after
+ position: absolute
+ bottom: 0
+ left: 0
+ z-index: -1
+ width: 0
+ height: 3px
+ background-color: lighten($theme-color, 30%)
+ content: ''
+ transition: all .3s ease-in-out
+
+ &:hover
+ &:after
+ width: 100%
+
+ .menus_item_child
+ position: absolute
+ right: 0
+ display: none
+ margin-top: 8px
+ padding: 0
+ width: max-content
+ background-color: alpha($white, .8)
+ box-shadow: 0 5px 20px -4px rgba($dark-black, .5)
+ animation: sub_menus .3s .1s ease both
+
+ &:before
+ position: absolute
+ top: -8px
+ left: 0
+ width: 100%
+ height: 20px
+ content: ''
+
+ li
+ padding: 1px 10px
+ list-style: none
+ text-align: center
+
+ &:hover
+ background: $theme-color
+
+ a
+ color: $font-black
+ text-shadow: none
+
+ #search_button
+ display: inline
+ padding: 0 0 0 .7rem
+
+ .site-page
+ position: relative
+ padding-bottom: .3rem
+ text-shadow: .05rem .05rem .1rem rgba($dark-black, .3)
+ font-size: .7rem
+ cursor: pointer
+
+@media screen and (min-width: $sm)
+ #nav
+ #site_title
+ font-size: 2rem
+
+ #site_subtitle
+ font-size: 1.2rem
+
+@media screen and (max-width: $sm)
+ #page-header
+ padding: 10px .8rem
+
+ #nav
+ #site_social_icons
+ display: block
+
+ &.not-index-bg
+ height: 14rem
+
+ #page_site-info
+ top: 7rem
+
+ &.post-bg
+ height: 18rem
+
+ & > #post-info
+ bottom: 1rem
+ padding: 0 5%
+
+ & > #post-title
+ font-size: 1.2rem
+
+ & > #post-meta
+ font-size: 90%
+
+ .post-meta__categories
+ display: none
+
+ .meta-thirdline
+ display: block
+
+ .post-meta-pv-cv
+ .post-meta__separator:first-child
+ display: none
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_layout/mobile-sidebar.styl b/themes/butterfly/source/css/_layout/mobile-sidebar.styl
new file mode 100644
index 00000000..a8f6583a
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/mobile-sidebar.styl
@@ -0,0 +1,106 @@
+#mobile-sidebar
+ #menu_mask
+ position: fixed
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ z-index: 102
+ display: none
+ background: alpha($dark-black, .8)
+
+ #mobile-sidebar-menus
+ position: fixed
+ top: 0
+ right: -250px
+ z-index: 103
+ display: block
+ overflow: hidden
+ overflow-y: scroll
+ width: 250px
+ height: 100%
+ background: #f6f8fa
+ transition: all .5s
+
+ & > .mobile_author_icon
+ padding: 1.3rem 1.5rem 0
+ text-align: center
+
+ img
+ display: inline-block
+ padding: 0
+ width: 110px
+ height: 110px
+ border-radius: 70px
+ transition: all .3s
+
+ .mobile_post_data
+ padding: .6rem .5rem 0
+
+ .mobile_data_item
+ display: inline-block
+ width: 33.3%
+
+ .mobile_data_link
+ & > a > div
+ overflow: hidden
+ text-overflow: ellipsis
+ white-space: nowrap
+
+ .length_num
+ color: $dark-black
+ font-size: .9rem
+
+ .headline
+ display: block
+ color: $font-black
+ // text-transform: uppercase
+ font-size: .7rem
+
+ hr
+ margin: 1rem auto
+
+ .menus_items
+ margin-bottom: 5rem
+ padding: 0 .5rem
+
+ .site-page
+ position: relative
+ z-index: 0
+ display: block
+ overflow: hidden
+ margin: 0
+ padding: .3rem 1.5rem
+ color: $font-black
+ text-overflow: ellipsis
+ text-shadow: none
+ white-space: nowrap
+ font-size: .8rem
+ cursor: pointer
+
+ i
+ width: 30%
+ text-align: left
+
+ span
+ width: 70%
+
+ &:hover
+ color: $light-blue
+
+ .menus-expand
+ position: absolute
+ right: 0
+ padding: 6px
+ width: 30px !important
+ height: 30px
+ transition: all .3s
+ transform: rotate(0)
+
+ &.menus-closed
+ transition: all .3s
+ transform: rotate(180deg) !important
+
+ .menus_item_child
+ margin: 0
+ list-style: none
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_layout/note.styl b/themes/butterfly/source/css/_layout/note.styl
new file mode 100644
index 00000000..69204071
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/note.styl
@@ -0,0 +1,287 @@
+.note
+ $note-icons = hexo-config('note.icons')
+ $note-style = hexo-config('note.style')
+ position: relative
+ margin: 0 0 1rem
+ padding: 15px
+
+ if ($note-style == 'simple')
+ border: 1px solid $light-grey
+ border-left-width: 5px
+
+ if ($note-style == 'modern')
+ border: 1px solid transparent
+ background-color: $whitesmoke
+
+ if ($note-style == 'flat')
+ border: initial
+ border-left: 5px solid $light-grey
+ background-color: lighten($light-grey, 65%)
+
+ if hexo-config('note.border_radius') is a 'unit'
+ border-radius: unit(hexo-config('note.border_radius'), px)
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ if $note-icons
+ margin-top: 3px
+ else
+ margin-top: 0
+
+ margin-bottom: 0
+ padding-top: 0 !important
+ border-bottom: initial
+
+ p,
+ ul,
+ ol,
+ table,
+ pre,
+ blockquote,
+ img
+ &:first-child
+ margin-top: 0 !important
+
+ &:last-child
+ margin-bottom: 0 !important
+
+ if $note-icons
+ &:not(.no-icon)
+ padding-left: 45px
+
+ &::before
+ position: absolute
+ top: 13px
+ left: 15px
+ font-size: larger
+
+ if hexo-config('fontawesome_v5') && hexo-config('fontawesome_v5.enable')
+ font-weight: 600
+ font-family: 'Font Awesome 5 Free'
+ else
+ font-family: 'FontAwesome'
+
+ &.default
+ if ($note-style == 'flat')
+ background-color: $note-default-bg
+
+ if ($note-style == 'modern')
+ border-color: $note-modern-default-border
+ background-color: $note-modern-default-bg
+ color: $note-modern-default-text
+
+ a,
+ span.exturl
+ &:not(.btn)
+ border-bottom: 1px solid $note-modern-default-text
+ color: $note-modern-default-text
+
+ &:hover
+ border-bottom: 1px solid $note-modern-default-hover
+ color: $note-modern-default-hover
+
+ if ($note-style != 'modern')
+ border-left-color: $note-default-border
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: $note-default-text
+
+ if $note-icons
+ &:not(.no-icon)
+ &::before
+ content: $note-default-icon
+
+ if ($note-style != 'modern')
+ color: $note-default-text
+
+ &.primary
+ if ($note-style == 'flat')
+ background-color: $note-primary-bg
+
+ if ($note-style == 'modern')
+ border-color: $note-modern-primary-border
+ background-color: $note-modern-primary-bg
+ color: $note-modern-primary-text
+
+ a,
+ span.exturl
+ &:not(.btn)
+ border-bottom: 1px solid $note-modern-primary-text
+ color: $note-modern-primary-text
+
+ &:hover
+ border-bottom: 1px solid $note-modern-primary-hover
+ color: $note-modern-primary-hover
+
+ if ($note-style != 'modern')
+ border-left-color: $note-primary-border
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: $note-primary-text
+
+ if $note-icons
+ &:not(.no-icon)
+ &::before
+ content: $note-primary-icon
+
+ if ($note-style != 'modern')
+ color: $note-primary-text
+
+ &.info
+ if ($note-style == 'flat')
+ background-color: $note-info-bg
+
+ if ($note-style == 'modern')
+ border-color: $note-modern-info-border
+ background-color: $note-modern-info-bg
+ color: $note-modern-info-text
+
+ a,
+ span.exturl
+ &:not(.btn)
+ border-bottom: 1px solid $note-modern-info-text
+ color: $note-modern-info-text
+
+ &:hover
+ border-bottom: 1px solid $note-modern-info-hover
+ color: $note-modern-info-hover
+
+ if ($note-style != 'modern')
+ border-left-color: $note-info-border
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: $note-info-text
+
+ if $note-icons
+ &:not(.no-icon)
+ &::before
+ content: $note-info-icon
+
+ if ($note-style != 'modern')
+ color: $note-info-text
+
+ &.success
+ if ($note-style == 'flat')
+ background-color: $note-success-bg
+
+ if ($note-style == 'modern')
+ border-color: $note-modern-success-border
+ background-color: $note-modern-success-bg
+ color: $note-modern-success-text
+
+ a,
+ span.exturl
+ &:not(.btn)
+ border-bottom: 1px solid $note-modern-success-text
+ color: $note-modern-success-text
+
+ &:hover
+ border-bottom: 1px solid $note-modern-success-hover
+ color: $note-modern-success-hover
+
+ if ($note-style != 'modern')
+ border-left-color: $note-success-border
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: $note-success-text
+
+ if $note-icons
+ &:not(.no-icon)
+ &::before
+ content: $note-success-icon
+
+ if ($note-style != 'modern')
+ color: $note-success-text
+
+ &.warning
+ if ($note-style == 'flat')
+ background-color: $note-warning-bg
+
+ if ($note-style == 'modern')
+ border-color: $note-modern-warning-border
+ background-color: $note-modern-warning-bg
+ color: $note-modern-warning-text
+
+ a,
+ span.exturl
+ &:not(.btn)
+ border-bottom: 1px solid $note-modern-warning-text
+ color: $note-modern-warning-text
+
+ &:hover
+ border-bottom: 1px solid $note-modern-warning-hover
+ color: $note-modern-warning-hover
+
+ if ($note-style != 'modern')
+ border-left-color: $note-warning-border
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: $note-warning-text
+
+ if $note-icons
+ &:not(.no-icon)
+ &::before
+ content: $note-warning-icon
+
+ if ($note-style != 'modern')
+ color: $note-warning-text
+
+ &.danger
+ if ($note-style == 'flat')
+ background-color: $note-danger-bg
+
+ if ($note-style == 'modern')
+ border-color: $note-modern-danger-border
+ background-color: $note-modern-danger-bg
+ color: $note-modern-danger-text
+
+ a,
+ span.exturl
+ &:not(.btn)
+ border-bottom: 1px solid $note-modern-danger-text
+ color: $note-modern-danger-text
+
+ &:hover
+ border-bottom: 1px solid $note-modern-danger-hover
+ color: $note-modern-danger-hover
+
+ if ($note-style != 'modern')
+ border-left-color: $note-danger-border
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: $note-danger-text
+
+ if $note-icons
+ &:not(.no-icon)
+ &::before
+ content: $note-danger-icon
+
+ if ($note-style != 'modern')
+ color: $note-danger-text
diff --git a/themes/butterfly/source/css/_layout/page.styl b/themes/butterfly/source/css/_layout/page.styl
new file mode 100644
index 00000000..5f9a8be3
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/page.styl
@@ -0,0 +1,382 @@
+.layout_page
+ display: flex
+ align-items: flex-start
+ margin: 0 auto
+ padding: 2rem 15px
+ max-width: 1200px
+
+// index
+#recent-posts
+ width: 75%
+
+ & > .recent-post-item:not(:first-child)
+ margin-top: 1rem
+
+ & > .recent-post-item
+ display: flex
+ flex-direction: row
+ align-items: center
+ padding: 0
+ height: 280px
+ border-radius: 8px
+ background: $card-bg
+ box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06)
+ transition: all .3s
+
+ &:hover
+ box-shadow: 0 4px 12px 12px rgba(7, 17, 27, .15)
+
+ img.post_bg
+ transform: scale(1.1)
+
+ if hexo-config('cover.position') == 'both'
+ .left_radius
+ border-radius: 8px 0 0 8px
+
+ .right_radius
+ order: 2
+ border-radius: 0 8px 8px 0
+ else if hexo-config('cover.position') == 'left'
+ .left_radius
+ border-radius: 8px 0 0 8px
+
+ .right_radius
+ border-radius: 8px 0 0 8px
+ else if hexo-config('cover.position') == 'right'
+ .left_radius
+ order: 2
+ border-radius: 0 8px 8px 0
+
+ .right_radius
+ order: 2
+ border-radius: 0 8px 8px 0
+
+ .post_cover
+ overflow: hidden
+ width: 45%
+ height: 280px
+ -webkit-mask-image: -webkit-radial-gradient(white, black)
+
+ img.post_bg
+ display: block
+ margin: 0
+ padding: 0
+ width: 100%
+ height: 100%
+ border: 0
+ transition: all .6s
+ object-fit: cover
+
+ &:hover
+ transform: scale(1.1)
+
+ & >.recent-post-info
+ display: inline-block
+ overflow: hidden
+ padding: 0 40px
+ width: 55%
+
+ &.no-cover
+ width: 100%
+
+ & > .article-title
+ display: -webkit-box
+ overflow: hidden
+ margin-bottom: .3rem
+ color: $font-black
+ text-overflow: ellipsis
+ word-wrap: break-word
+ font-size: 1.2rem
+ line-height: 1.4
+ transition: all .2s ease-in-out
+ -webkit-box-orient: vertical
+ -webkit-line-clamp: 2
+
+ &:hover
+ color: $light-blue !important
+
+ & > .article-meta-wrap
+ font-size: 95%
+
+ & > time
+ color: $theme-meta-color
+ cursor: pointer
+
+ & > .article-meta
+ color: $theme-meta-color
+
+ .sticky
+ color: $sticky-color
+
+ i
+ margin: 0 .2rem 0 0
+
+ .article-meta__separator,
+ .article-meta__link
+ margin: 0 .3rem
+
+ .fa-angle-right
+ margin: 0 .3rem
+
+ a.article-meta__categories,
+ a.article-meta__tags
+ color: $theme-meta-color
+
+ &:hover
+ color: $light-blue !important
+ text-decoration: underline
+
+ & > .content
+ display: -webkit-box
+ overflow: hidden
+ margin-top: .3rem
+ height: 85px
+ word-break: break-word
+ -webkit-line-clamp: 3
+ -webkit-box-orient: vertical
+
+// tags page
+.tag-cloud
+ a
+ display: inline-block
+ padding: 0 .4rem
+ cursor: pointer
+ transition: all .3s
+
+ &:hover
+ color: $theme-button-hover-color !important
+ transform: scale(1.1)
+
+ &__title
+ text-align: center
+ font-size: 1.8rem
+
+ &-tags
+ text-align: center
+
+.layout_post > #post,
+.layout_page > div:first-child:not(.recent-posts)
+ padding: 50px 40px
+ border-radius: 8px
+ background: $card-bg
+ box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06)
+ transition: all .3s
+
+ &:hover
+ box-shadow: 0 4px 12px 12px rgba(7, 17, 27, .15)
+
+.layout_page
+ & > div:first-child:not(.recent-posts)
+ width: 75%
+
+.article-sort
+ margin-left: .5rem
+ padding-left: 1rem
+ border-left: 2px solid lighten($light-blue, 20)
+
+ &-title
+ position: relative
+ margin-left: .5rem
+ padding-bottom: 1.2rem
+ padding-left: 1rem
+ font-size: 1.2rem
+ line-height: 1
+
+ &:hover
+ &:before
+ border-color: $theme-button-hover-color
+
+ &:before
+ position: absolute
+ top: .25rem
+ left: calc(-.5rem + 1px)
+ z-index: 1
+ width: w = .5rem
+ height: h = w
+ border: .5 * w solid $light-blue
+ border-radius: w
+ background: $card-bg
+ content: ''
+ line-height: h
+ transition: all .2s ease-in-out
+
+ &:after
+ position: absolute
+ bottom: 0
+ left: 0
+ z-index: 0
+ width: .1rem
+ height: 1.3rem
+ background: lighten($light-blue, 20)
+ content: ''
+
+ &-item
+ position: relative
+ margin: 0 0 1rem .5rem
+ width: 100%
+ height: 80px
+ transition: all .2s ease-in-out
+
+ &:hover
+ &:before
+ border-color: $theme-button-hover-color
+
+ &:before
+ $w = .3rem
+ position: absolute
+ top: 1.8rem
+ left: calc(-1rem - 17px)
+ width: w = $w
+ height: h = w
+ border: .5 * w solid $light-blue
+ border-radius: w
+ background: $card-bg
+ content: ''
+ line-height: h
+ transition: all .2s ease-in-out
+
+ &.no-article-cover
+ display: flex
+ flex-direction: column
+ justify-content: center
+
+ .article-sort-post
+ padding: 0
+ width: 100%
+
+ &.year
+ height: auto
+ font-size: 1rem
+
+ &:hover
+ &:before
+ border-color: $light-blue
+
+ &:before
+ top: .7rem
+ border-color: $theme-button-hover-color
+
+ &__time
+ padding-left: .4rem
+ font-size: .7rem
+
+ &__title
+ display: -webkit-box
+ overflow: hidden
+ color: $font-black
+ font-size: .75rem
+ transition: all .3s
+ -webkit-line-clamp: 2
+ -webkit-box-orient: vertical
+
+ &:hover
+ color: $light-blue
+ transform: translateX(20px)
+
+ &__img
+ img
+ padding: 0
+ width: 100%
+ height: 100%
+ transition: all .6s
+ object-fit: cover
+
+ &:hover
+ transform: scale(1.1)
+
+ &__post
+ color: $theme-meta-color
+
+ &:hover
+ color: $theme-meta-color
+
+ &-img
+ float: left
+ overflow: hidden
+ width: 80px
+ height: 80px
+
+ &-post
+ display: inline-block
+ padding: 0 1rem
+ width: calc(100% - 80px)
+
+.category-lists
+ padding: 1rem 0 1.5rem
+
+ .category__title
+ text-align: center
+ font-size: 1.8rem
+
+.category-list
+ a
+ color: $font-black
+ cursor: pointer
+
+ .category-list-count
+ margin-left: .4rem
+ color: $theme-meta-color
+
+ &:before
+ content: '('
+
+ &:after
+ content: ')'
+
+// 隱藏aside
+.hide-aside
+ max-width: 1000px
+
+ & > div
+ width: 100% !important
+
+@media screen and (max-width: $sm)
+ .layout_page
+ padding: 1rem 5px !important
+
+ & > div:first-child:not(.recent-posts)
+ padding: 1.8rem .7rem
+
+ .category-lists
+ padding: 0
+
+ #recent-posts
+ .recent-post-item
+ flex-direction: column
+ height: auto !important
+
+ .post_cover
+ order: 1 !important
+ width: 100%
+ height: 230px
+ border-radius: 8px 8px 0 0
+
+ .recent-post-info
+ order: 2 !important
+ padding: 1rem 1rem 1.5rem
+ width: 100%
+
+ &.no-cover
+ padding: 1.5rem 1rem
+
+ .article-title
+ font-size: 1rem
+
+ .content
+ height: auto
+
+@media screen and (min-width: 900px)
+ if hexo-config('aside.position') == 'left'
+ #recent-posts,
+ #page,
+ .category-content,
+ #archive,
+ .tag-cloud,
+ #tag,
+ #category
+ order: 2
+
+@media screen and (max-width: 900px)
+ .layout_page
+ & > div:first-child:not(.recent-posts)
+ width: 100% !important
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_layout/pagination.styl b/themes/butterfly/source/css/_layout/pagination.styl
new file mode 100644
index 00000000..f8935c86
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/pagination.styl
@@ -0,0 +1,83 @@
+#pagination
+ overflow: hidden
+ margin-top: 1rem
+ width: 100%
+
+ .pagination
+ text-align: center
+
+ .page-number
+ display: inline-block
+ margin: 0 .2rem
+ min-width: w = 1.2rem
+ height: w
+ text-align: center
+ line-height: w
+ cursor: pointer
+
+ &.current
+ background: $theme-paginator-color
+ color: $button-color
+ cursor: default
+
+ img.prev_cover,
+ img.next_cover
+ position: absolute
+ width: 100%
+ height: 100%
+ opacity: .4
+ transition: all .6s
+ object-fit: cover
+
+ .pagination-info
+ position: absolute
+ top: 50%
+ padding: 1rem 2rem
+ width: 100%
+ transform: translate(0, -50%)
+
+ .prev_info,
+ .next_info
+ overflow: hidden
+ color: $button-color
+ text-overflow: ellipsis
+ white-space: nowrap
+ font-weight: 500
+
+ .next-post
+ .pagination-info
+ text-align: right
+
+ .pull-full
+ width: 100% !important
+
+ .prev-post .label,
+ .next-post .label
+ color: alpha($white, .9)
+ text-transform: uppercase
+ font-size: 90%
+
+ .prev-post,
+ .next-post
+ width: 50%
+
+ a
+ position: relative
+ display: block
+ overflow: hidden
+ height: 150px
+
+ &:hover
+ img.prev_cover,
+ img.next_cover
+ opacity: .8
+ transform: scale(1.1)
+
+ &.pagination_post
+ margin: 2rem 0 !important
+ background: $dark-black
+
+@media screen and (max-width: 768px)
+ .prev-post,
+ .next-post
+ width: 100% !important
diff --git a/themes/butterfly/source/css/_layout/post.styl b/themes/butterfly/source/css/_layout/post.styl
new file mode 100644
index 00000000..93f9ae47
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/post.styl
@@ -0,0 +1,340 @@
+#article-container
+ if hexo-config('beautify.enable')
+ headStyle(fontsize)
+ padding-left: unit(fontsize + .4, 'rem')
+
+ code
+ font-size: unit(fontsize, 'rem')
+
+ &:before
+ margin-left: unit((-(fontsize + .2)), 'rem')
+ font-size: unit(fontsize, 'rem')
+
+ &:hover
+ padding-left: unit(fontsize + .6, 'rem')
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ cursor: pointer
+ transition: all .2s ease-out
+
+ &:before
+ position: absolute
+ top: calc(50% - .35rem)
+ color: $title-prefix-icon-color
+ content: $title-prefix-icon
+ font-style: normal
+ font-variant: normal
+ line-height: 1
+ transition: all .2s ease-out
+ text-rendering: auto
+ -webkit-font-smoothing: antialiased
+
+ if hexo-config('fontawesome_v5') && hexo-config('fontawesome_v5.enable')
+ font-weight: 600
+ font-family: 'Font Awesome 5 Free'
+ else
+ font-weight: normal
+ font-family: FontAwesome
+
+ &:hover
+ &:before
+ color: $light-blue
+
+ h1
+ headStyle(1)
+
+ h2
+ headStyle(.9)
+
+ h3
+ headStyle(.8)
+
+ h4
+ headStyle(.7)
+
+ h5
+ headStyle(.6)
+
+ h6
+ headStyle(.6)
+
+ ol,
+ ul
+ margin-top: .4rem
+ padding: 0 0 0 .8rem
+ list-style: none
+ counter-reset: li
+
+ p
+ margin: 0 0 .5rem
+
+ ol,
+ ul
+ padding-left: .5rem
+
+ li
+ position: relative
+ margin: .2rem 0
+ padding: .1rem .5rem .1rem 1.5rem
+
+ &:hover
+ &:before
+ transform: rotate(360deg)
+
+ &:before
+ position: absolute
+ top: 0
+ left: 0
+ background: $light-blue
+ color: $card-bg
+ cursor: pointer
+ transition: all .3s ease-out
+
+ ol
+ > li
+ &:before
+ margin-top: .2rem
+ width: w = 1.2rem
+ height: h = w
+ border-radius: .5 * w
+ content: counter(li)
+ counter-increment: li
+ text-align: center
+ font-size: .6rem
+ line-height: h
+
+ ul
+ > li
+ &:hover
+ &:before
+ border-color: $theme-button-hover-color
+
+ &:before
+ $w = .3rem
+ top: 10px
+ margin-left: .45rem
+ width: w = $w
+ height: h = w
+ border: .5 * w solid $light-blue
+ border-radius: w
+ background: transparent
+ content: ''
+ line-height: h
+ else
+ ol,
+ ul
+ margin-top: .4rem
+ counter-reset: li
+
+ p
+ margin: 0 0 .5rem
+
+ ol,
+ ul
+ padding-left: .5rem
+
+ li
+ position: relative
+ margin: .3rem 0
+ padding-left: .3rem
+
+a
+ color: $a-link-color
+ text-decoration: none
+ word-wrap: break-word
+ transition: all .2s
+ overflow-wrap: break-word
+
+ &:hover
+ color: $light-blue
+
+a.fancybox
+ outline: none
+
+ &:focus
+ outline: none
+
+ display: inline-block
+ width: 100%
+ text-align: center
+
+p
+ margin: 0 0 .8rem
+
+img
+ max-width: 100%
+ transition: all .2s
+
+// highlight
+.highlight-tools
+ .code-expand
+ position: absolute
+ top: 0
+ z-index: 1
+ padding: 7px 10px
+ color: $highlight-foreground
+ cursor: pointer
+ transition: all .3s
+ transform: rotate(0)
+
+ & + .code-lang
+ left: 30px
+
+ &.code-closed
+ transition: all .3s
+ transform: rotate(-90deg) !important
+
+ .code-lang
+ position: absolute
+ left: 15px
+ z-index: 1
+ color: $highlight-foreground
+ text-transform: capitalize
+ font-weight: bold
+ font-size: .8rem
+ line-height: 1.4rem
+ cursor: pointer
+
+ .copy-notice
+ position: absolute
+ top: 0
+ right: 0
+ z-index: 1
+ background: darken($highlight-background, 5)
+ color: $highlight-aqua
+ opacity: 0
+
+ .fa-clipboard
+ position: absolute
+ top: .4rem
+ right: 10px
+ z-index: 1
+ color: $highlight-aqua
+ cursor: pointer
+ transition: color .2s
+
+ &:hover
+ color: darken($highlight-aqua, 20%)
+
+.katex-wrap
+ overflow: auto
+
+ if hexo-config('katex') && hexo-config('katex.hide_scrollbar')
+ &::-webkit-scrollbar
+ display: none
+
+.layout_post
+ margin: 0 auto
+ padding: 2rem 15px
+ max-width: 1000px
+
+ img
+ display: block
+
+ .tag_share
+ .post-meta
+ &__tag-list
+ display: inline-block
+
+ &__tags
+ display: inline-block
+ margin: .4rem .4rem .4rem 0
+ padding: 0 .6rem
+ width: fit-content
+ border: 1px solid $light-blue
+ border-radius: .6rem
+ color: $light-blue
+ font-size: 12px
+ cursor: pointer
+ transition: all .2s ease-in-out
+
+ &:hover
+ background: $light-blue
+ color: $button-color
+
+ .post_share
+ display: inline-block
+ float: right
+ margin: .4rem 0
+ width: fit-content
+
+ .social-share
+ font-size: 12px
+
+ .social-share-icon
+ margin: 0 4px
+ width: 26px
+ height: 26px
+ font-size: 15px
+ line-height: 25px
+
+ .post-copyright
+ position: relative
+ margin: 2rem 0 .5rem
+ padding: .5rem .8rem
+ border: 1px solid $light-grey
+ transition: box-shadow .3s ease-in-out
+
+ &:before
+ position: absolute
+ top: t = .5rem
+ right: t
+ width: w = .8rem
+ height: w
+ border-radius: w
+ background: $light-blue
+ content: ''
+
+ &:after
+ position: absolute
+ top: t = .7rem
+ right: t
+ width: w = .4rem
+ height: w
+ border-radius: w
+ background: $white
+ content: ''
+
+ &:hover
+ box-shadow: 0 0 8px 0 rgba(232, 237, 250, .6), 0 2px 4px 0 rgba(232, 237, 250, .5)
+
+ .post-copyright
+ &-meta
+ color: $light-blue
+ font-weight: bold
+
+ &-info
+ padding-left: .3rem
+
+ a
+ text-decoration: underline
+ word-break: break-word
+
+ &:hover
+ text-decoration: none
+
+#article-container
+ a
+ color: $theme-link-color
+
+ &:hover
+ text-decoration: underline
+
+ img
+ margin: 0 auto .8rem
+
+@media screen and (max-width: 1024px)
+ .layout_post
+ width: auto
+
+@media screen and (max-width: $sm)
+ .layout_post
+ padding: 1rem 5px
+
+ & > #post
+ padding: 1.8rem .7rem
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_layout/relatedposts.styl b/themes/butterfly/source/css/_layout/relatedposts.styl
new file mode 100644
index 00000000..89ef1595
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/relatedposts.styl
@@ -0,0 +1,61 @@
+.relatedPosts
+ margin-top: 1rem
+
+ .relatedPosts_headline
+ margin-bottom: 5px
+ font-weight: 700
+ font-size: 20px
+
+ .relatedPosts_item
+ position: relative
+ float: left
+ overflow: hidden
+ margin: 5px
+ width: calc(100% / 3 - 10px)
+ height: 200px
+ background: $dark-black
+
+ &:hover
+ .relatedPosts_cover
+ opacity: .8
+ transform: scale(1.1)
+
+ .relatedPosts_cover
+ width: 100%
+ height: 100%
+ opacity: .4
+ transition: all .6s
+ object-fit: cover
+
+ .relatedPosts_main
+ position: absolute
+ top: 50%
+ padding: 0 1rem
+ width: 100%
+ color: $white
+ transform: translate(0, -50%)
+
+ .relatedPosts_date
+ color: $light-grey
+ font-size: 90%
+
+ .relatedPosts_title
+ display: -webkit-box
+ overflow: hidden
+ -webkit-line-clamp: 2
+ -webkit-box-orient: vertical
+
+ .clear_both
+ clear: both
+
+@media screen and (max-width: 768px)
+ .relatedPosts
+ .relatedPosts_item
+ margin: 2px
+ width: calc(100% / 2 - 4px)
+ height: 150px
+
+@media screen and (max-width: 480px)
+ .relatedPosts
+ .relatedPosts_item
+ width: calc(100% - 4px)
diff --git a/themes/butterfly/source/css/_layout/reward.styl b/themes/butterfly/source/css/_layout/reward.styl
new file mode 100644
index 00000000..291b4744
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/reward.styl
@@ -0,0 +1,74 @@
+.post-reward
+ margin: 75px auto 0
+ width: 100%
+ text-align: center
+
+ .reward-button
+ position: relative
+ z-index: 1
+ display: inline-block
+ width: 100px
+ background: $light-blue
+ color: $button-color
+ text-align: center
+ line-height: 36px
+ cursor: pointer
+
+ &:hover
+ .reward-main
+ display: block
+
+ .reward-main
+ position: absolute
+ bottom: 40px
+ left: 0
+ display: none
+ margin: 0
+ padding: 0 0 15px
+ width: 100%
+ transition: all .6s
+
+ .reward-all
+ display: inline-block
+ margin: 0 0 0 -110px
+ padding: 20px 10px 8px
+ width: 320px
+ border-radius: 4px
+ background: $reward-pop-up-bg
+
+ &:before
+ position: absolute
+ bottom: -10px
+ left: 0
+ width: 100%
+ height: 20px
+ content: ''
+
+ &:after
+ position: absolute
+ right: 0
+ bottom: 2px
+ left: 0
+ margin: 0 auto
+ width: 0
+ height: 0
+ border-top: 13px solid $reward-pop-up-bg
+ border-right: 13px solid transparent
+ border-left: 13px solid transparent
+ content: ''
+
+ .reward-item
+ display: inline-block
+ padding: 0 8px
+ list-style-type: none
+
+ img
+ position: relative
+ max-width: 130px
+ width: 130px
+ border-radius: 3px
+
+ .post-qr-code__desc
+ margin: -5px 0
+ color: $reward-pop-up-color
+ text-align: center
diff --git a/themes/butterfly/source/css/_layout/rightside.styl b/themes/butterfly/source/css/_layout/rightside.styl
new file mode 100644
index 00000000..730788eb
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/rightside.styl
@@ -0,0 +1,60 @@
+#rightside
+ position: fixed
+ right: -38px
+ bottom: 40px
+ opacity: 0
+ transition: all .5s
+
+ #rightside-config-hide
+ transform: translate(35px, 0)
+
+ .rightside-in
+ transform: translate(0, 0) !important
+ animation: rightsideIn .3s
+
+ .rightside-out
+ animation: rightsideOut .3s
+
+ & > div
+ & > i,
+ & > a,
+ & > div
+ display: block
+ margin-bottom: 2px
+ width: 30px
+ height: 30px
+ background-color: $light-blue
+ color: $button-color
+ text-align: center
+ font-size: 16px
+ line-height: 29px
+ cursor: pointer
+
+ &:hover
+ background-color: $theme-button-hover-color
+
+ #rightside_config
+ i
+ animation: avatar_turn_around 2s linear infinite
+
+ #mobile-toc-button
+ display: none
+
+@media screen and (max-width: $bg)
+ #rightside
+ #mobile-toc-button
+ display: block
+
+@keyframes rightsideIn
+ 0%
+ transform: translate(30px, 0)
+
+ 100%
+ transform: translate(0, 0)
+
+@keyframes rightsideOut
+ 0%
+ transform: translate(0, 0)
+
+ 100%
+ transform: translate(30px, 0)
diff --git a/themes/butterfly/source/css/_layout/sidebar.styl b/themes/butterfly/source/css/_layout/sidebar.styl
new file mode 100644
index 00000000..823d203f
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/sidebar.styl
@@ -0,0 +1,74 @@
+#sidebar
+ position: fixed
+ top: 0
+ left: -($sidebar-width)
+ z-index: 10
+ padding: 1rem 0 2rem .5rem
+ width: $sidebar-width
+ height: 100%
+ background: $sidebar-background
+ box-shadow: -.25rem 0 .25rem rgba($sidebar-background, .6) inset
+ opacity: .9
+
+ .sidebar-toc
+ ol,
+ li
+ list-style: none
+
+ ol
+ margin-top: .2rem
+ padding-left: .4rem
+
+ &__title
+ padding-right: .5rem
+ text-align: center
+ font-size: 1.3em
+
+ &__content
+ overflow-y: scroll
+ padding-bottom: 5rem
+ height: 90vh
+
+ .toc-link
+ display: block
+ padding-left: .2rem
+ border-right: 3px solid transparent
+ transition: all .2s ease-in-out
+
+ &.active
+ border-right-color: darken($theme-toc-color, 20%)
+ background: $theme-toc-color
+ color: $sidebar-active-color
+
+ &__progress
+ position: relative
+ margin-bottom: .3rem
+ padding-left: .6rem
+ color: $theme-toc-color
+
+ .progress-notice
+ margin-right: .4rem
+
+ .progress-num
+ display: inline-block
+ min-width: .9rem
+
+ &-bar
+ width: 0
+ height: 1px
+ background: $theme-toc-color
+
+@media screen and (max-width: $bg)
+ i#toggle-sidebar
+ display: none
+
+ #sidebar
+ right: -($mobile-sidebar-width)
+ left: auto
+ z-index: 103
+ width: $mobile-sidebar-width
+ opacity: 1
+ transition: all .4s
+
+ .toc-child
+ display: block !important
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_layout/third-party.styl b/themes/butterfly/source/css/_layout/third-party.styl
new file mode 100644
index 00000000..e5e6519d
--- /dev/null
+++ b/themes/butterfly/source/css/_layout/third-party.styl
@@ -0,0 +1,88 @@
+if hexo-config('valine.enable')
+ // valine
+ #vcomment
+ button
+ padding: .3rem 1rem
+ border-color: $button-color
+ background-color: $light-blue
+ color: $button-color
+ font-size: .7rem
+
+ &:hover
+ background-color: $theme-button-hover-color
+
+ textarea
+ if hexo-config('valine.bg')
+ background: url(hexo-config('valine.bg')) 100% 100% no-repeat
+
+ .info
+ display: none
+
+ .vimg
+ border: 0
+
+ &:hover
+ transform: rotate(540deg)
+
+ .vat
+ padding: 0 .8rem
+ border: 1px solid $light-blue
+ border-radius: 5px
+ color: $light-blue
+ font-size: .7125rem
+
+ &:hover
+ background-color: $light-blue
+ color: $button-color
+
+if hexo-config('beautify.enable')
+ #article-container
+ .aplayer
+ ol,
+ ul
+ margin: 0
+ padding: 0
+
+ li
+ margin: 0
+ padding: 0 15px
+
+ &:before
+ content: none
+
+// third-party
+.fireworks
+ position: fixed
+ top: 0
+ left: 0
+ z-index: 999999
+ pointer-events: none
+
+.medium-zoom-image--opened
+ z-index: 99999 !important
+ margin: 0 !important
+
+.medium-zoom-overlay
+ z-index: 99999 !important
+
+.mermaid
+ overflow: auto
+ margin: 0 0 1rem
+ background: $white
+ text-align: center
+ opacity: 0
+ transition: all .3s
+
+ &[data-processed]
+ opacity: 1
+
+.utterances
+ max-width: 100%
+
+#gitalk-container
+ .gt-meta
+ margin: 0 0 .8em
+ padding: .3rem 0 .8em
+
+.has-jax
+ overflow: auto
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_mode/darkmode.styl b/themes/butterfly/source/css/_mode/darkmode.styl
new file mode 100644
index 00000000..ed126562
--- /dev/null
+++ b/themes/butterfly/source/css/_mode/darkmode.styl
@@ -0,0 +1,370 @@
+if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark'
+ [data-theme='dark']
+ body
+ background-color: darken(#121212, 2)
+ color: alpha(#FFFFFF, .6)
+
+ ::-webkit-scrollbar-thumb
+ background: lighten(#121212, 5)
+
+ // 網站背景,footer背景
+ #web_bg[data-type=color],
+ #footer[data-type=color]
+ background: darken(#121212, 2)
+
+ #web_bg[data-type=photo]:before,
+ #footer[data-type=photo]:before
+ position: absolute
+ width: 100%
+ height: 100%
+ background-color: alpha($dark-black, .7)
+ content: ''
+
+ #nav,
+ .layout_post > #post,
+ .layout_page > div:first-child:not(.recent-posts)
+ background-color: #121212
+
+ #sidebar
+ background: #121212
+ box-shadow: -.25rem 0 .25rem #121212
+
+ #article-container code
+ background: #2c2c2c
+
+ .recent-posts
+ .recent-post-item
+ background: #121212 !important
+
+ .article-title
+ color: alpha(#FFFFFF, .8) !important
+
+ #page-header
+ &.fixed
+ background: alpha(#121212, .8)
+ box-shadow: 0 5px 6px -5px rgba(133, 133, 133, 0)
+
+ .toggle-menu,
+ #site-name,
+ a
+ color: alpha(#FFFFFF, .8)
+
+ .menus_item_child
+ background-color: lighten(#121212, 5) !important
+
+ li
+ &:hover
+ background: lighten(#121212, 20)
+
+ a
+ color: alpha(#FFFFFF, .6)
+
+ // 代碼框
+ #article-container pre,
+ #article-container pre code
+ background-color: lighten(#121212, 2)
+
+ .highlight-tools
+ background: lighten(#121212, 3)
+
+ #article-container .highlight:not(.js-file-line-container)
+ background-color: lighten(#121212, 2)
+
+ .code pre,
+ .gutter pre
+ background-color: lighten(#121212, 2)
+
+ table
+ .copy-notice
+ background: lighten(#121212, 3)
+
+ .copy-notice
+ background: lighten(#121212, 3)
+
+ blockquote
+ background-color: lighten(#121212, 10)
+ color: alpha(#FFFFFF, .6)
+
+ hr
+ border: 2px dashed alpha(#FFFFFF, .3)
+ background: 0
+
+ &:before
+ color: alpha(#FFFFFF, .6)
+
+ .layout_post .tag_share .post-meta__tags
+ border: 1px solid alpha(#FFFFFF, .6)
+ color: alpha(#FFFFFF, .6)
+
+ &:hover
+ background: darken(#FFFFFF, 60)
+
+ // 文章版權
+ .post-copyright
+ border: 1px solid alpha(#FFFFFF, .6)
+
+ .post-copyright-meta
+ color: alpha(#FFFFFF, .8)
+
+ .post-copyright-info
+ color: alpha(#FFFFFF, .6)
+
+ // 音樂播放器
+ .aplayer
+ filter: brightness(.7)
+ color: $dark-black
+
+ // 右下角按鈕
+ #rightside
+ & > div
+ & > i,
+ & > a,
+ & > div
+ background-color: lighten(#121212, 5) !important
+ color: alpha(#FFFFFF, .6) !important
+
+ &:hover
+ background: lighten(#121212, 20) !important
+
+ // 打賞按鈕
+ .post-reward
+ .reward-button
+ background-color: lighten(#121212, 10) !important
+
+ .reward-all
+ background-color: lighten(#121212, 10) !important
+
+ &:after
+ border-top: 13px solid lighten(#121212, 10) !important
+
+ .md-links-item:before,
+ .aside-category-list:hover,
+ .archive-list-item:hover,
+ #bookmark-it
+ background-color: lighten(#121212, 10) !important
+
+ img,
+ iframe:not(.utterances-frame),
+ .gist
+ filter: brightness(.7)
+
+ // 側邊欄
+ #aside_content
+ .card-widget
+ background: #121212 !important
+
+ .headline,
+ .length_num,
+ .aside-post_title,
+ .aside-category-list_link,
+ .archive-list-link,
+ .social-icon
+ color: alpha(#FFFFFF, .6) !important
+
+ .button--animated:before
+ background: lighten(#121212, 20) !important
+
+ // 頭部
+ #nav
+ &:before
+ position: absolute
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ background-color: alpha($dark-black, .7)
+ content: ''
+
+ #nav span,
+ #nav i,
+ #page-header a,
+ #page-header .toggle-menu,
+ #post-meta,
+ #post-meta a,
+ #footer-wrap,
+ #footer-wrap a
+ color: alpha(#FFFFFF, .6) !important
+
+ .posttitle,
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ color: alpha(#FFFFFF, .8)
+
+ .recent-posts .post-meta__date,
+ .recent-posts .article-meta,
+ .recent-posts a,
+ .post-reward .reward-button,
+ .fa-clipboard,
+ .gutter pre,
+ #bookmark-it,
+ .copy-notice,
+ .md-links-item a,
+ .category-list-link,
+ .relatedPosts_date,
+ .prev-post .label,
+ .next-post .label
+ color: alpha(#FFFFFF, .6) !important
+
+ .prev_info,
+ .next_info,
+ .relatedPosts_title
+ color: alpha(#FFFFFF, .8) !important
+
+ // 時間軸界面
+ .article-sort-item__title
+ color: alpha(#FFFFFF, .6)
+
+ &:hover
+ color: #49b1f5
+
+ // 手機 MENU,TOC
+ #mobile-sidebar
+ #mobile-sidebar-menus
+ background: #121212
+
+ .headline
+ color: alpha(#FFFFFF, .6) !important
+
+ .length_num
+ color: alpha(#FFFFFF, .8) !important
+
+ a
+ color: alpha(#FFFFFF, .6) !important
+
+ // note
+ if hexo-config('note.style') == 'modern'
+ .note
+ filter: brightness(.7)
+
+ if hexo-config('note.style') == 'flat'
+ .note
+ filter: brightness(.7)
+ color: #4c4948
+
+ // 第三方
+ // 插件 hexo-blog-encrypt
+ #hexo-blog-encrypt
+ label,
+ input
+ color: alpha(#FFFFFF, .6) !important
+
+ input
+ background-color: #121212
+
+ if hexo-config('gitalk') && hexo-config('gitalk.enable')
+ #gitalk-container
+ .gt-header-textarea,
+ .gt-header-preview,
+ .gt-comment-content,
+ button,
+ .gt-popup
+ filter: brightness(.7)
+
+ svg
+ fill: alpha(#FFFFFF, .6) !important
+
+ if hexo-config('valine') && hexo-config('valine.enable')
+ // 評論
+ #vcomment
+ p,
+ a,
+ textarea,
+ .vemoji-btn,
+ .vpreview-btn,
+ input,
+ path,
+ .vcount,
+ .vnum,
+ .vtime,
+ .vsys,
+ .vsys,
+ .vnick
+ color: alpha(#FFFFFF, .6) !important
+
+ .vsys
+ background: rgb(97, 106, 107) !important
+
+ .vbtn,
+ .vat
+ border: 1px solid alpha(#FFFFFF, .6)
+ background: lighten(#121212, 5) !important
+ color: alpha(#FFFFFF, .6) !important
+
+ &:hover
+ background: lighten(#121212, 20) !important
+
+ .vwrap
+ border: 1px solid alpha(#FFFFFF, .6)
+
+ input
+ border-bottom: 1px dashed #616a6b
+
+ .vh
+ border-bottom: 1px dashed #616a6b
+
+ pre
+ border: 1px solid alpha(#FFFFFF, .6)
+ background-color: #121212
+
+ code
+ background: transparent
+
+ code
+ background-color: #2c2c2c
+ color: alpha(#FFFFFF, .6)
+
+ .vcontent.expand:before
+ background: linear-gradient(180deg, hsla(0, 0, 0, 0), hsl(218, 8%, 19%))
+
+ .vcontent.expand:after
+ background: hsla(204, 5%, 22%, 1)
+
+ if hexo-config('local_search') && hexo-config('local_search.enable')
+ #local-search
+ background: #121212
+
+ .local-search-box--input
+ background: #121212
+ color: alpha(#FFFFFF, .6)
+
+ .search-result-title
+ color: alpha(#FFFFFF, .6)
+
+ if hexo-config('algolia_search.enable')
+ #algolia-search
+ background: #121212
+
+ .ais-search-box--input
+ background: #121212
+ color: alpha(#FFFFFF, .6)
+
+ #algolia-search-results
+ .algolia-hit-item-link
+ color: alpha(#FFFFFF, .6)
+
+ if hexo-config('disqusjs.enable')
+ #disqus_thread
+ #dsqjs
+ .dsqjs-tab-active,
+ .dsqjs-no-comment
+ color: alpha(#FFFFFF, .6)
+
+ .dsqjs-order-label
+ background-color: lighten(#121212, 5)
+
+ .dsqjs-post-body
+ color: alpha(#FFFFFF, .6)
+
+ code,
+ pre
+ background: #2c2c2c
+
+ blockquote
+ color: alpha(#FFFFFF, .6)
+
+ .mermaid
+ filter: brightness(.7)
diff --git a/themes/butterfly/source/css/_mode/readmode.styl b/themes/butterfly/source/css/_mode/readmode.styl
new file mode 100644
index 00000000..c89cb924
--- /dev/null
+++ b/themes/butterfly/source/css/_mode/readmode.styl
@@ -0,0 +1,147 @@
+if hexo-config('readmode') && hexo-config('readmode.enable')
+ [data-theme='light']
+ .read-mode
+ background: #fff
+
+ #nav.post-bg
+ a
+ color: $font-black !important
+
+ #article-container
+ pre,
+ .highlight:not(.js-file-line-container)
+ background: #f7f7f7 !important
+
+ code
+ color: #4c4948
+
+ blockquote
+ border-left: .2rem solid #ddd
+ background-color: transparent
+
+ ol,
+ li
+ &:before
+ background: transparent
+ color: #4c4948
+
+ ul
+ >li
+ &:before
+ border: .2rem solid #90a4ae
+
+ hr
+ border: 2px dashed #d6dbdf
+ background: transparent
+
+ &:before
+ color: darken(#d6dbdf, 10)
+
+ .hide-button
+ background: darken(#d6dbdf, 10) !important
+
+ .note
+ border: 2px solid #eee
+ border-left-color: transparent
+ background-color: transparent
+
+ #mobile-sidebar-menus,
+ #rightside i,
+ #rightside a,
+ #rightside #rightside_config
+ background: darken(#d6dbdf, 10) !important
+
+ [data-theme='dark']
+ .read-mode
+ background: #0d0d0d
+
+ #article-container
+ code
+ color: rgba(255, 255, 255, .6)
+
+ blockquote
+ border-left: .2rem solid rgba(255, 255, 255, .6)
+ background-color: transparent
+
+ ol,
+ li
+ &:before
+ background: transparent
+ color: rgba(255, 255, 255, .6)
+
+ ul
+ >li
+ &:before
+ border: .15rem solid rgba(255, 255, 255, .6)
+
+ .note
+ border: 2px solid rgba(255, 255, 255, .6)
+ border-left-color: transparent
+ filter: none
+ background-color: transparent
+ color: rgba(255, 255, 255, .6)
+
+ .hide-button
+ background: #1f1f1f !important
+
+ .read-mode
+ #body-wrap
+ padding-left: 0 !important
+
+ #nav.post-bg
+ background-color: transparent
+ background-image: none !important
+
+ a
+ text-shadow: none !important
+
+ &:before
+ opacity: 0
+
+ & > #post-info
+ padding: 0
+ color: $font-black
+ text-align: center
+
+ .layout_post
+ > #post
+ background: transparent
+ box-shadow: none
+
+ &:hover
+ box-shadow: none
+
+ .highlight
+ display: block !important
+
+ #rightside
+ #darkmode
+ display: none
+
+ & > canvas
+ display: none !important
+
+ .code-area-wrap > .highlight-tools,
+ #footer,
+ #post > *:not(:first-child),
+ #to_comment,
+ #sidebar,
+ #toggle-sidebar,
+ #mobile-toc-button,
+ #page-header
+ display: none !important
+
+ #web_bg
+ background: none
+
+ #article-container
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6
+ padding: 0
+
+ &:before
+ content: ''
diff --git a/themes/butterfly/source/css/_search/algolia.styl b/themes/butterfly/source/css/_search/algolia.styl
new file mode 100644
index 00000000..6dab0833
--- /dev/null
+++ b/themes/butterfly/source/css/_search/algolia.styl
@@ -0,0 +1,73 @@
+#algolia-search
+ animation: titlescale .5s
+
+ .ais-search-box
+ margin: 0 auto
+ max-width: 100%
+ width: 100%
+
+ input
+ padding: .25rem .7rem
+ outline: none
+ border: 2px solid $search-color
+ border-radius: 2rem
+ background: $search-bg
+ font-size: 14px
+
+ .ais-hits--item.algolia-hit-item
+ position: relative
+ padding-left: 1.5rem
+
+ &:hover
+ &:before
+ border-color: $theme-button-hover-color
+
+ &:before
+ $w = .3rem
+ position: absolute
+ top: .4rem
+ left: 0
+ width: w = $w
+ height: h = w
+ border: .5 * w solid $search-color
+ border-radius: w
+ background: transparent
+ content: ''
+ line-height: h
+ transition: all .2s ease-in-out
+
+ a
+ display: block
+ color: $font-black
+ font-size: 14px
+ cursor: pointer
+
+ &:hover
+ color: $search-color
+
+ .ais-pagination.pagination
+ margin: .8rem 0 0
+ padding: 0
+ text-align: center
+
+ .ais-pagination--item
+ margin: 0 .2rem
+ padding: 0
+
+ a
+ display: inline-block
+ min-width: 1.2rem
+ height: 1.2rem
+ text-align: center
+ line-height: 1.2rem
+
+ .ais-pagination--item.current
+ a
+ background: $theme-paginator-color
+ color: #eee
+ cursor: default
+
+ .algolia-logo
+ padding-top: 2px
+ width: 4rem
+ height: 1.5rem
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_search/index.styl b/themes/butterfly/source/css/_search/index.styl
new file mode 100644
index 00000000..bf3794e8
--- /dev/null
+++ b/themes/butterfly/source/css/_search/index.styl
@@ -0,0 +1,53 @@
+.search-dialog
+ position: fixed
+ top: 5rem
+ left: 50%
+ z-index: 1001
+ display: none
+ margin-left: -15rem
+ padding: 1rem
+ width: 30rem
+ background: $search-bg
+
+ hr
+ margin: 1rem auto
+
+ span.search-close-button
+ position: absolute
+ top: .8rem
+ right: 1rem
+ color: $grey
+ font-size: 1rem
+ line-height: 1
+ cursor: pointer
+ transition: color .2s ease-in-out
+
+ &:hover
+ color: $search-color
+
+ &__title
+ padding: 0 0 .7rem
+ color: $search-color
+ font-size: 1rem
+ line-height: 1
+
+.search-mask
+ position: fixed
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ z-index: 1000
+ display: none
+ background: rgba($dark-black, .6)
+
+@media screen and (max-width: $sm)
+ .search-dialog
+ top: 0
+ left: 0
+ margin: 0
+ width: 100%
+ height: 100%
+
+ .search-result-list
+ max-height: 100% !important
diff --git a/themes/butterfly/source/css/_search/local-search.styl b/themes/butterfly/source/css/_search/local-search.styl
new file mode 100644
index 00000000..e1861f99
--- /dev/null
+++ b/themes/butterfly/source/css/_search/local-search.styl
@@ -0,0 +1,55 @@
+#local-search
+ animation: titlescale .5s
+
+ .local-search-box
+ margin: 0 auto
+ max-width: 100%
+ width: 100%
+
+ input
+ padding: .25rem .7rem
+ width: 100%
+ outline: none
+ border: 2px solid $search-color
+ border-radius: 2rem
+ background: $search-bg
+ font-size: 14px
+ -webkit-appearance: none
+
+ .local-search__hit-item
+ position: relative
+ padding-left: 1.5rem
+
+ &:hover
+ &:before
+ border-color: $theme-button-hover-color
+
+ &:before
+ $w = .3rem
+ position: absolute
+ top: .4rem
+ left: 0
+ width: w = $w
+ height: h = w
+ border: .5 * w solid $search-color
+ border-radius: w
+ background: transparent
+ content: ''
+ line-height: h
+ transition: all .2s ease-in-out
+
+ a
+ display: block
+ color: $font-black
+ font-size: 14px
+ cursor: pointer
+
+ &:hover
+ color: $search-color
+
+ .local-search-stats__hr
+ display: none !important
+
+ .search-result-list
+ overflow-y: auto
+ max-height: 10.5rem
\ No newline at end of file
diff --git a/themes/butterfly/source/css/_third-party/normalize.min.css b/themes/butterfly/source/css/_third-party/normalize.min.css
new file mode 100644
index 00000000..1854c297
--- /dev/null
+++ b/themes/butterfly/source/css/_third-party/normalize.min.css
@@ -0,0 +1 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
\ No newline at end of file
diff --git a/themes/butterfly/source/css/index.styl b/themes/butterfly/source/css/index.styl
new file mode 100644
index 00000000..a7df5307
--- /dev/null
+++ b/themes/butterfly/source/css/index.styl
@@ -0,0 +1,17 @@
+@import 'nib'
+@import '_third-party/normalize.min.css'
+// project
+@import 'var'
+@import '_global'
+@import '_highlight/highlight'
+@import '_layout/*'
+@import '_mode/*'
+
+// search
+if hexo-config('algolia_search.enable')
+ @import '_search/index'
+ @import '_search/algolia'
+
+if hexo-config('local_search') && hexo-config('local_search.enable')
+ @import '_search/index'
+ @import '_search/local-search'
diff --git a/themes/butterfly/source/css/var.styl b/themes/butterfly/source/css/var.styl
new file mode 100644
index 00000000..84d34293
--- /dev/null
+++ b/themes/butterfly/source/css/var.styl
@@ -0,0 +1,144 @@
+// color
+$bright-blue = #49B1F5
+$strong-cyan = #00c4b6
+$light-orange = #FF7242
+$light-red = #F47466
+
+$themeColorEnable = hexo-config('theme_color') && hexo-config('theme_color.enable')
+$theme-color = $themeColorEnable ? convert(hexo-config('theme_color.main')) : $bright-blue
+$theme-paginator-color = $themeColorEnable ? convert(hexo-config('theme_color.paginator')) : $strong-cyan
+$theme-button-hover-color = $themeColorEnable ? convert(hexo-config('theme_color.button_hover')) : $light-orange
+$theme-text-selection-color = $themeColorEnable ? convert(hexo-config('theme_color.text_selection')) : $strong-cyan
+$theme-link-color = $themeColorEnable ? convert(hexo-config('theme_color.link_color')) : $bright-blue
+$theme-hr-color = $themeColorEnable ? convert(hexo-config('theme_color.hr_color')) : $bright-blue
+$code-foreground = $themeColorEnable ? convert(hexo-config('theme_color.code_foreground')) : $light-red
+$code-background = $themeColorEnable ? convert(hexo-config('theme_color.code_background')) : rgba(27, 31, 35, .05)
+$theme-toc-color = $themeColorEnable ? convert(hexo-config('theme_color.toc_color')) : $strong-cyan
+
+// font
+$fontEnable = hexo-config('font') && hexo-config('font.enable')
+$font-family = $fontEnable ? convert(hexo-config('font.font-family')) : Lato, Helvetica Neue For Number, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, PingFang SC, Hiragino Sans GB, "Microsoft YaHei", Helvetica Neue, Helvetica, Arial, sans-serif
+$code-font = $fontEnable ? convert(hexo-config('font.code-font')) : consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace, Helvetica Neue For Number
+$site-name-font = convert(hexo-config('blog_title_font.font-family')) || '"Titillium Web",Lato,PingFang SC, Hiragino Sans GB, "Microsoft JhengHei", "Microsoft YaHei", Helvetica Neue, Helvetica, Arial, sans-serif'
+
+//hr
+$hrEnable = hexo-config('hr') && hexo-config('hr.enable')
+$hr-icon = $hrEnable ? hexo-config('hr.icon') : '\f0c4'
+$hr-icon-top = $hrEnable ? convert(hexo-config('hr.icon-top')) : -10px
+
+//page beatutify
+$beautifyEnable = hexo-config('beautify.enable')
+$title-prefix-icon = $beautifyEnable ? hexo-config('beautify.title-prefix-icon') : '\f0c1'
+$title-prefix-icon-color = $beautifyEnable ? convert(hexo-config('beautify.title-prefix-icon-color')) : $light-red
+
+// Global Variables
+$font-size = 14px
+$font-color = #1F2D3D
+$button-color = #fff
+$rem = 20px
+$text-line-height = 2
+$sm = 768px
+$bg = 1024px
+$web-bg = convert(hexo-config('background'))
+$index_top_img_height = convert(hexo-config('index_top_img_height')) || 100vh
+$index_site_info_top = convert(hexo-config('index_site_info_top')) || 43%
+// Global color & SVG
+$light-blue = $theme-color
+$dark-black = #000000
+$light-grey = #EEEEEE
+$grey = #858585
+$white = #FFFFFF
+$whitesmoke = #f5f5f5
+$font-black = #4C4948
+$card-bg = $white
+// code
+$code-font-family = $font-family
+$line-height-code-block = 20px
+$blockquote-color = #6a737d
+$blockquote-padding-color = $themeColorEnable ? convert(hexo-config('theme_color.blockquote_padding_color')) : #49B1F5
+$blockquote-background-color = $themeColorEnable ? alpha(convert(hexo-config('theme_color.blockquote_background_color')),.1) : alpha($blockquote-padding-color,.1)
+// page
+$body-bg = #fff
+$a-link-color = #99a9bf
+$sticky-color = $light-orange
+$theme-meta-color = $themeColorEnable ? convert(hexo-config('theme_color.meta_color')) : #858585
+// sidebar
+$sidebar-icon-top = 20px
+$sidebar-icon-left = $sidebar-icon-top - 4px
+$sidebar-icon-size = 16px
+$sidebar-width = 300px
+$sidebar-background = #f6f8fa
+$sidebar-active-color = #fff
+$mobile-sidebar-width = 250px
+// table
+$table-thead-bg = #99a9bf
+// reward
+$reward-pop-up-bg = #f5f5f5
+$reward-pop-up-color = #858585
+// search
+$search-bg = #f6f8fa
+$search-color = $theme-color
+//gallery
+$gallery-color = #fff
+// tag-hide
+$tag-hide-bg = $theme-color
+
+
+
+// Note colors
+// --------------------------------------------------
+hexo-config('note.light_bg_offset') is a 'unit' ? ($lbg = unit(hexo-config('note.light_bg_offset'), '%')) : ($lbg = 0)
+// Default
+$note-default-border = #777
+$note-default-bg = lighten(spin($note-default-border, 0), 94% + $lbg)
+$note-default-text = $note-default-border
+$note-default-icon = '\f0a9'
+$note-modern-default-border = #e1e1e1
+$note-modern-default-bg = lighten(spin($note-modern-default-border, 10), 60% + ($lbg * 4))
+$note-modern-default-text = #666
+$note-modern-default-hover = darken(spin($note-modern-default-text, -10), 32%)
+// Primary
+$note-primary-border = #6f42c1
+$note-primary-bg = lighten(spin($note-primary-border, 10), 92% + $lbg)
+$note-primary-text = $note-primary-border
+$note-primary-icon = '\f055'
+$note-modern-primary-border = #e1c2ff
+$note-modern-primary-bg = lighten(spin($note-modern-primary-border, 10), 40% + ($lbg * 4))
+$note-modern-primary-text = #6f42c1
+$note-modern-primary-hover = darken(spin($note-modern-primary-text, -10), 22%)
+// Info
+$note-info-border = #428bca
+$note-info-bg = lighten(spin($note-info-border, -10), 91% + $lbg)
+$note-info-text = $note-info-border
+$note-info-icon = '\f05a'
+$note-modern-info-border = #b3e5ef
+$note-modern-info-bg = lighten(spin($note-modern-info-border, 10), 50% + ($lbg * 4))
+$note-modern-info-text = #31708f
+$note-modern-info-hover = darken(spin($note-modern-info-text, -10), 32%)
+// Success
+$note-success-border = #5cb85c
+$note-success-bg = lighten(spin($note-success-border, 10), 90% + $lbg)
+$note-success-text = $note-success-border
+$note-success-icon = '\f058'
+$note-modern-success-border = #d0e6be
+$note-modern-success-bg = lighten(spin($note-modern-success-border, 10), 40% + ($lbg * 4))
+$note-modern-success-text = #3c763d
+$note-modern-success-hover = darken(spin($note-modern-success-text, -10), 27%)
+// Warning
+$note-warning-border = #f0ad4e
+$note-warning-bg = lighten(spin($note-warning-border, 10), 88% + $lbg)
+$note-warning-text = $note-warning-border
+$note-warning-icon = '\f06a'
+$note-modern-warning-border = #fae4cd
+$note-modern-warning-bg = lighten(spin($note-modern-warning-border, 10), 43% + ($lbg * 4))
+$note-modern-warning-text = #8a6d3b
+$note-modern-warning-hover = darken(spin($note-modern-warning-text, -10), 18%)
+// Danger
+$note-danger-border = #d9534f
+$note-danger-bg = lighten(spin($note-danger-border, -10), 92% + $lbg)
+$note-danger-text = $note-danger-border
+$note-danger-icon = '\f056'
+$note-modern-danger-border = #ebcdd2
+$note-modern-danger-bg = lighten(spin($note-modern-danger-border, 10), 35% + ($lbg * 4))
+$note-modern-danger-text = #a94442
+$note-modern-danger-hover = darken(spin($note-modern-danger-text, -10), 22%)
diff --git a/themes/butterfly/source/img/1avatar.png b/themes/butterfly/source/img/1avatar.png
new file mode 100644
index 00000000..90fb8569
Binary files /dev/null and b/themes/butterfly/source/img/1avatar.png differ
diff --git a/themes/butterfly/source/img/404.jpg b/themes/butterfly/source/img/404.jpg
new file mode 100644
index 00000000..4bab3c3f
Binary files /dev/null and b/themes/butterfly/source/img/404.jpg differ
diff --git a/themes/butterfly/source/img/DerrickAlipay.jpg b/themes/butterfly/source/img/DerrickAlipay.jpg
new file mode 100644
index 00000000..4feced37
Binary files /dev/null and b/themes/butterfly/source/img/DerrickAlipay.jpg differ
diff --git a/themes/butterfly/source/img/DerrickWechat.png b/themes/butterfly/source/img/DerrickWechat.png
new file mode 100644
index 00000000..8f210820
Binary files /dev/null and b/themes/butterfly/source/img/DerrickWechat.png differ
diff --git a/themes/butterfly/source/img/algolia.svg b/themes/butterfly/source/img/algolia.svg
new file mode 100644
index 00000000..47024234
--- /dev/null
+++ b/themes/butterfly/source/img/algolia.svg
@@ -0,0 +1,9 @@
+
diff --git a/themes/butterfly/source/img/avatar.png b/themes/butterfly/source/img/avatar.png
new file mode 100644
index 00000000..75b12906
Binary files /dev/null and b/themes/butterfly/source/img/avatar.png differ
diff --git a/themes/butterfly/source/img/comment_bg.png b/themes/butterfly/source/img/comment_bg.png
new file mode 100644
index 00000000..1ce39384
Binary files /dev/null and b/themes/butterfly/source/img/comment_bg.png differ
diff --git a/themes/butterfly/source/img/favicon.ico b/themes/butterfly/source/img/favicon.ico
new file mode 100644
index 00000000..e07d73ac
Binary files /dev/null and b/themes/butterfly/source/img/favicon.ico differ
diff --git a/themes/butterfly/source/img/friend_404.gif b/themes/butterfly/source/img/friend_404.gif
new file mode 100644
index 00000000..91dd56a2
Binary files /dev/null and b/themes/butterfly/source/img/friend_404.gif differ
diff --git a/themes/butterfly/source/img/icp.png b/themes/butterfly/source/img/icp.png
new file mode 100644
index 00000000..3b5539df
Binary files /dev/null and b/themes/butterfly/source/img/icp.png differ
diff --git a/themes/butterfly/source/img/index.jpg b/themes/butterfly/source/img/index.jpg
new file mode 100644
index 00000000..6e18f891
Binary files /dev/null and b/themes/butterfly/source/img/index.jpg differ
diff --git a/themes/butterfly/source/img/loading.gif b/themes/butterfly/source/img/loading.gif
new file mode 100644
index 00000000..46df25ad
Binary files /dev/null and b/themes/butterfly/source/img/loading.gif differ
diff --git a/themes/butterfly/source/img/post.jpg b/themes/butterfly/source/img/post.jpg
new file mode 100644
index 00000000..49a812c5
Binary files /dev/null and b/themes/butterfly/source/img/post.jpg differ
diff --git a/themes/butterfly/source/img/post_loadding.svg b/themes/butterfly/source/img/post_loadding.svg
new file mode 100644
index 00000000..ef01327f
--- /dev/null
+++ b/themes/butterfly/source/img/post_loadding.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/themes/butterfly/source/js/main.js b/themes/butterfly/source/js/main.js
new file mode 100644
index 00000000..7ce67048
--- /dev/null
+++ b/themes/butterfly/source/js/main.js
@@ -0,0 +1,751 @@
+$(function () {
+ const isSnackbar = GLOBAL_CONFIG.Snackbar !== undefined
+ const $pageHead = $('#page-header')
+ const $rightside = $('#rightside')
+ const $body = $('body')
+
+ /**
+ * 當menu過多時,自動適配,避免UI錯亂
+ * 傳入 1 sidebar打開時
+ * 傳入 2 正常狀態下
+ */
+ var blogNameWidth = $('#blog_name').width()
+ var menusWidth = $('.menus').width()
+ var sidebarWidth = $('#sidebar').width()
+
+ function isAdjust (n) {
+ var t
+ if (n === 1) {
+ t = blogNameWidth + menusWidth > $pageHead.width() - sidebarWidth - 20
+ } else if (n === 2) {
+ t = blogNameWidth + menusWidth > $pageHead.width() - 20
+ }
+
+ if (t) headerAdjust()
+ else headerAdjustBack()
+ }
+
+ function headerAdjust () {
+ $pageHead.find('.toggle-menu').addClass('is-visible-inline')
+ $pageHead.find('.menus_items').addClass('is_invisible')
+ $pageHead.find('#search_button span').addClass('is_invisible')
+ }
+
+ function headerAdjustBack () {
+ $pageHead.find('.toggle-menu').removeClass('is-visible-inline')
+ $pageHead.find('.menus_items').removeClass('is_invisible')
+ $pageHead.find('#search_button span').removeClass('is_invisible')
+ }
+
+ // 初始化header
+ function initAjust () {
+ if (window.innerWidth < 768) headerAdjust()
+ else isAdjust(2)
+ }
+
+ initAjust()
+ $('#page-header').css({ opacity: '1', animation: 'headerNoOpacity 1s' })
+
+ $(window).on('resize', function () {
+ if ($('#sidebar').hasClass('tocOpenPc') && $pageHead.hasClass('fixed')) {
+ isAdjust(1)
+ } else {
+ initAjust()
+ }
+ })
+
+ /**
+ * windows時 設置主頁top_img 為 fixed
+ */
+ if (GLOBAL_CONFIG_SITE.isHome) {
+ var isSafari = /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)
+ if (!isSafari && isDesktop()) {
+ $('#nav').css('background-attachment', 'fixed')
+ }
+ }
+
+ /**
+ * 進入post頁sidebar處理
+ */
+ if (GLOBAL_CONFIG_SITE.isPost) {
+ if (window.innerWidth > 1024 && $('#toggle-sidebar').hasClass('on')) {
+ setTimeout(function () {
+ openSidebar()
+ }, 400)
+ }
+ }
+
+ /**
+ * 點擊左下角箭頭,顯示sidebar
+ */
+
+ function closeSidebar () {
+ $('#sidebar').removeClass('tocOpenPc')
+ $('.menus').animate({
+ paddingRight: 0
+ }, 400)
+ $('#body-wrap').animate({
+ paddingLeft: 0
+ }, 400)
+ $('#sidebar').animate({
+ left: '-300px'
+ }, 400)
+ $('#toggle-sidebar').css({
+ transform: 'rotateZ(0deg)',
+ color: '#1F2D3D',
+ opacity: '1'
+ })
+ setTimeout(function () {
+ isAdjust(2)
+ }, 400)
+ }
+
+ function openSidebar () {
+ $('#sidebar').addClass('tocOpenPc')
+ $('.menus').animate({
+ paddingRight: 300
+ }, 400)
+ $('#body-wrap').animate({
+ paddingLeft: 300
+ }, 400)
+ $('#sidebar').animate({
+ left: 0
+ }, 400)
+ $('#toggle-sidebar').css({
+ transform: 'rotateZ(180deg)',
+ color: '#99a9bf',
+ opacity: '1'
+ })
+ var isAdjustTimeCount = window.setInterval(function () {
+ if ($pageHead.hasClass('fixed')) isAdjust(1)
+ else isAdjust(2)
+ }, 100)
+ setTimeout(function () {
+ clearInterval(isAdjustTimeCount)
+ }, 400)
+ }
+
+ $('#toggle-sidebar').on('click', function () {
+ var isOpen = $(this).hasClass('on')
+ isOpen ? $(this).removeClass('on') : $(this).addClass('on')
+ if (isOpen) {
+ closeSidebar()
+ } else {
+ openSidebar()
+ }
+ })
+
+ /**
+ * 手機menu和toc按鈕點擊
+ * 顯示menu和toc的sidebar
+ */
+
+ var $toggleMenu = $('.toggle-menu')
+ var $mobileSidevarMenus = $('#mobile-sidebar-menus')
+ var $mobileTocButton = $('#mobile-toc-button')
+ var $menuMask = $('#menu_mask')
+
+ function openMobileSidebar (name) {
+ sidebarPaddingR()
+ $('body').css('overflow', 'hidden')
+ $menuMask.fadeIn()
+
+ if (name === 'menu') {
+ $toggleMenu.removeClass('close').addClass('open')
+ $mobileSidevarMenus.css('transform', 'translate3d(-100%,0,0)')
+ var $mobileSidevarMenusChild = $mobileSidevarMenus.children()
+ for (let i = 0; i <= $mobileSidevarMenusChild.length; i++) {
+ const duration = i / 5 + 0.2
+ $mobileSidevarMenusChild.eq(i).css('animation', 'sidebarItem ' + duration + 's')
+ }
+ }
+
+ if (name === 'toc') {
+ $mobileTocButton.removeClass('close').addClass('open')
+ $('#sidebar').addClass('tocOpenMobile')
+ $('#sidebar').css({ transform: 'translate3d(-100%,0,0)', left: '' })
+ }
+ }
+
+ function closeMobileSidebar (name) {
+ $('body').css({ overflow: '', 'padding-right': '' })
+ $menuMask.fadeOut()
+
+ if (name === 'menu') {
+ $toggleMenu.removeClass('open').addClass('close')
+ $mobileSidevarMenus.css('transform', '')
+ $('#mobile-sidebar-menus > div,#mobile-sidebar-menus > hr').css('animation', '')
+ }
+
+ if (name === 'toc') {
+ $mobileTocButton.removeClass('open').addClass('close')
+ $('#sidebar').removeClass('tocOpenMobile')
+ $('#sidebar').css({ transform: '' })
+ }
+ }
+
+ $toggleMenu.on('click', function () {
+ openMobileSidebar('menu')
+ })
+
+ $mobileTocButton.on('click', function () {
+ openMobileSidebar('toc')
+ })
+
+ $menuMask.on('click touchstart', function (e) {
+ if ($toggleMenu.hasClass('open')) {
+ closeMobileSidebar('menu')
+ }
+ if ($mobileTocButton.hasClass('open')) {
+ closeMobileSidebar('toc')
+ }
+ })
+
+ $(window).on('resize', function (e) {
+ if (!$toggleMenu.is(':visible')) {
+ if ($toggleMenu.hasClass('open')) closeMobileSidebar('menu')
+ }
+ })
+
+ const mql = window.matchMedia('(max-width: 1024px)')
+ mql.addListener(function (ev) {
+ if (ev.matches) {
+ if ($('#sidebar').hasClass('tocOpenPc')) closeSidebar()
+ } else {
+ if ($('#toggle-sidebar').hasClass('on')) openSidebar()
+ if ($mobileTocButton.hasClass('open')) closeMobileSidebar('toc')
+ }
+ })
+
+ /**
+ * 首頁top_img底下的箭頭
+ */
+ $('#scroll_down').on('click', function () {
+ scrollTo('#content-inner')
+ })
+
+ /**
+ * BOOKMARK 書簽
+ */
+ $('#bookmark-it').on('click', function () {
+ if (window.sidebar && window.sidebar.addPanel) { // Mozilla Firefox Bookmark
+ window.sidebar.addPanel(document.title, window.location.href, '')
+ } else if (window.external && ('AddFavorite' in window.external)) { // IE Favorite
+ window.external.AddFavorite(location.href, document.title)
+ } else if (window.opera && window.print) { // Opera Hotlist
+ this.title = document.title
+ return true
+ } else { // webkit - safari/chrome
+ if (isSnackbar) {
+ var bookmarkText = GLOBAL_CONFIG.Snackbar.bookmark.message_prev + ' ' + (navigator.userAgent.toLowerCase().indexOf('mac') !== -1 ? 'Command/Cmd' : 'CTRL') + '+ D ' + GLOBAL_CONFIG.Snackbar.bookmark.message_next + '.'
+ snackbarShow(bookmarkText)
+ } else {
+ alert(GLOBAL_CONFIG.bookmark.message_prev + ' ' + (navigator.userAgent.toLowerCase().indexOf('mac') !== -1 ? 'Command/Cmd' : 'CTRL') + '+ D ' + GLOBAL_CONFIG.bookmark.message_next + '.')
+ }
+ }
+ })
+
+ /**
+ * 代碼
+ */
+ const isHighlightCopy = GLOBAL_CONFIG.highlightCopy
+ const isHighlightLang = GLOBAL_CONFIG.highlightLang
+ const isHighlightShrink = GLOBAL_CONFIG.highlightShrink
+ const $figureHighlight = $('figure.highlight')
+ if (isHighlightCopy || isHighlightLang || isHighlightShrink !== 'none') {
+ $figureHighlight.wrap('
').before('
')
+ }
+
+ /**
+ * 代碼收縮
+ */
+ const $highlightTools = $('.highlight-tools')
+ if (isHighlightShrink === 'true') {
+ $highlightTools.append('
')
+ } else if (isHighlightShrink === 'false') {
+ $highlightTools.append('
')
+ }
+
+ $(document).on('click', '.highlight-tools >.code-expand', function () {
+ var $table = $(this).parent().next()
+ if ($(this).hasClass('code-closed')) {
+ $table.css('display', 'block')
+ $(this).removeClass('code-closed')
+ } else {
+ $table.css('display', 'none')
+ $(this).addClass('code-closed')
+ }
+ })
+
+ /**
+ * 代碼語言
+ */
+ if (isHighlightLang) {
+ var langNameIndex, langName
+ $figureHighlight.each(function () {
+ langNameIndex = langName = $(this).attr('class').split(' ')[1]
+ if (langNameIndex === 'plain') langName = 'Code'
+ $(this).prev().append('
' + langName + '
')
+ })
+ }
+ /**
+ * 代碼copy
+ * copy function
+ */
+ if (isHighlightCopy) {
+ $highlightTools.append('
')
+ var copy = function (text, ctx) {
+ if (document.queryCommandSupported && document.queryCommandSupported('copy')) {
+ try {
+ document.execCommand('copy') // Security exception may be thrown by some browsers.
+ if (isSnackbar) {
+ snackbarShow(GLOBAL_CONFIG.copy.success)
+ } else {
+ $(ctx).prev('.copy-notice')
+ .text(GLOBAL_CONFIG.copy.success)
+ .animate({
+ opacity: 1,
+ right: 30
+ }, 450, function () {
+ setTimeout(function () {
+ $(ctx).prev('.copy-notice').animate({
+ opacity: 0,
+ right: 0
+ }, 650)
+ }, 400)
+ })
+ }
+ } catch (ex) {
+ if (isSnackbar) {
+ snackbarShow(GLOBAL_CONFIG.copy.success)
+ } else {
+ $(ctx).prev('.copy-notice')
+ .text(GLOBAL_CONFIG.copy.error)
+ .animate({
+ opacity: 1,
+ right: 30
+ }, 650, function () {
+ setTimeout(function () {
+ $(ctx).prev('.copy-notice').animate({
+ opacity: 0,
+ right: 0
+ }, 650)
+ }, 400)
+ })
+ return false
+ }
+ }
+ } else {
+ if (isSnackbar) {
+ snackbarShow(GLOBAL_CONFIG.copy.noSupport)
+ } else {
+ $(ctx).prev('.copy-notice').text(GLOBAL_CONFIG.copy.noSupport)
+ }
+ }
+ }
+
+ // click events
+ $(document).on('click', '.highlight-tools>.fa-clipboard', function () {
+ var selection = window.getSelection()
+ var range = document.createRange()
+ range.selectNodeContents($(this).parent().next().find('.code pre')[0])
+ selection.removeAllRanges()
+ selection.addRange(range)
+ var text = selection.toString()
+ copy(text, this)
+ selection.removeAllRanges()
+ })
+ }
+
+ /**
+ * justified-gallery 圖庫排版
+ */
+ var $justifiedGallery = $('.justified-gallery')
+ if ($justifiedGallery.length) {
+ var $imgList = $justifiedGallery.find('img')
+ $imgList.unwrap()
+ if ($imgList.length) {
+ $imgList.each(function (i, o) {
+ if ($(o).attr('data-src')) $(o).attr('src', $(o).attr('data-src'))
+ $(o).wrap('
')
+ })
+ }
+ $('head').append('
')
+ loadScript('https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js', function () {
+ $justifiedGallery.not($('.hide-content .justified-gallery')).justifiedGallery({
+ rowHeight: 220,
+ margins: 4
+ })
+ })
+ }
+
+ /**
+ * fancybox和 mediumZoom
+ */
+
+ var isMediumZoom = GLOBAL_CONFIG.medium_zoom
+ var isFancybox = GLOBAL_CONFIG.fancybox
+ if (isFancybox) {
+ var images = $('#article-container img:not(.gallery-group-img)').not($('a>img'))
+ images.each(function (i, o) {
+ var lazyloadSrc = $(o).attr('data-src') ? $(o).attr('data-src') : $(o).attr('src')
+ $(o).wrap(
+ '
'
+ )
+ })
+
+ $().fancybox({
+ selector: '[data-fancybox]',
+ loop: true,
+ transitionEffect: 'slide',
+ protect: true,
+ buttons: ['slideShow', 'fullScreen', 'thumbs', 'close']
+ })
+ } else if (isMediumZoom) {
+ const zoom = mediumZoom(document.querySelectorAll('#article-container :not(a)>img'))
+ zoom.on('open', function (event) {
+ var photoBg = $(document.documentElement).attr('data-theme') === 'dark' ? '#121212' : '#fff'
+ zoom.update({
+ background: photoBg
+ })
+ })
+ }
+
+ /**
+ * 滾動處理
+ */
+ var initTop = 0
+ $(window).scroll(function (event) {
+ var currentTop = $(this).scrollTop()
+ var isUp = scrollDirection(currentTop)
+ if (currentTop > 56) {
+ if (isUp) {
+ if ($pageHead.hasClass('visible')) $pageHead.removeClass('visible')
+ } else {
+ if (!$pageHead.hasClass('visible')) $pageHead.addClass('visible')
+ }
+ $pageHead.addClass('fixed')
+ if ($rightside.css('opacity') === '0') {
+ $rightside.css({ opacity: '1', transform: 'translateX(-38px)' })
+ }
+ } else {
+ if (currentTop === 0) {
+ $pageHead.removeClass('fixed').removeClass('visible')
+ }
+ $rightside.css({ opacity: '', transform: '' })
+ }
+ })
+
+ // find the scroll direction
+ function scrollDirection (currentTop) {
+ var result = currentTop > initTop // true is down & false is up
+ initTop = currentTop
+ return result
+ }
+
+ /**
+ * 點擊滾回頂部
+ */
+ $('#go-up').on('click', function () {
+ scrollTo('body')
+ })
+
+ /**
+ * toc
+ */
+
+ if (GLOBAL_CONFIG_SITE.isPost && GLOBAL_CONFIG_SITE.isSidebar) {
+ $('.toc-child').hide()
+
+ // main of scroll
+ $(window).scroll(throttle(function (event) {
+ var currentTop = $(this).scrollTop()
+ scrollPercent(currentTop)
+ findHeadPosition(currentTop)
+ autoScrollToc(currentTop)
+ }, 100))
+
+ // scroll
+ $('.toc-link').on('click', function (e) {
+ if (window.innerWidth <= 1024) {
+ closeMobileSidebar('toc')
+ } else {
+ e.preventDefault()
+ scrollTo($(this).attr('href'))
+ }
+ })
+
+ // expand toc-item
+ var expandToc = function ($item) {
+ if ($item.is(':visible')) {
+ return
+ }
+ $item.fadeIn(400)
+ }
+
+ var scrollPercent = function (currentTop) {
+ var docHeight = $('#article-container').height()
+ var winHeight = $(window).height()
+ var contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : ($(document).height() - winHeight)
+ var scrollPercent = (currentTop) / (contentMath)
+ var scrollPercentRounded = Math.round(scrollPercent * 100)
+ var percentage = (scrollPercentRounded > 100) ? 100
+ : (scrollPercentRounded <= 0) ? 0
+ : scrollPercentRounded
+ $('.progress-num').text(percentage)
+ $('.sidebar-toc__progress-bar').animate({
+ width: percentage + '%'
+ }, 100)
+ }
+
+ var updateAnchor = function (anchor) {
+ if (window.history.replaceState && anchor !== window.location.hash) {
+ window.history.replaceState(undefined, undefined, anchor)
+ }
+ }
+
+ // find head position & add active class
+ // DOM Hierarchy:
+ // ol.toc > (li.toc-item, ...)
+ // li.toc-item > (a.toc-link, ol.toc-child > (li.toc-item, ...))
+ var findHeadPosition = function (top) {
+ // assume that we are not in the post page if no TOC link be found,
+ // thus no need to update the status
+ if ($('.toc-link').length === 0) {
+ return false
+ }
+
+ var list = $('#article-container').find('h1,h2,h3,h4,h5,h6')
+ var currentId = ''
+ list.each(function () {
+ var head = $(this)
+ if (top > head.offset().top - 25) {
+ currentId = '#' + $(this).attr('id')
+ }
+ })
+
+ if (currentId === '') {
+ $('.toc-link').removeClass('active')
+ $('.toc-child').hide()
+ }
+
+ var currentActive = $('.toc-link.active')
+ if (currentId && currentActive.attr('href') !== currentId) {
+ updateAnchor(currentId)
+
+ $('.toc-link').removeClass('active')
+
+ var _this = $('.toc-link[href="' + currentId + '"]')
+ _this.addClass('active')
+
+ var parents = _this.parents('.toc-child')
+ // Returned list is in reverse order of the DOM elements
+ // Thus `parents.last()` is the outermost .toc-child container
+ // i.e. list of subsections
+ var topLink = (parents.length > 0) ? parents.last() : _this
+ expandToc(topLink.closest('.toc-item').find('.toc-child'))
+ topLink
+ // Find all top-level .toc-item containers, i.e. sections
+ // excluding the currently active one
+ .closest('.toc-item').siblings('.toc-item')
+ // Hide their respective list of subsections
+ .find('.toc-child').hide()
+ }
+ }
+
+ var autoScrollToc = function (currentTop) {
+ if ($('.toc-link').hasClass('active')) {
+ var activePosition = $('.active').offset().top
+ var sidebarScrolltop = $('#sidebar .sidebar-toc__content').scrollTop()
+ if (activePosition > (currentTop + $(window).height() - 100)) {
+ $('#sidebar .sidebar-toc__content').scrollTop(sidebarScrolltop + 100)
+ }
+ if (activePosition < currentTop + 100) {
+ $('#sidebar .sidebar-toc__content').scrollTop(sidebarScrolltop - 100)
+ }
+ }
+ }
+ }
+
+ /**
+ * 閲讀模式
+ */
+ $('#readmode').click(function () {
+ $('body').toggleClass('read-mode')
+ })
+
+ /**
+ * 字體調整
+ */
+ $('#font_plus').click(function () {
+ $body.css('font-size', parseFloat($body.css('font-size')) + 1)
+ })
+ $('#font_minus').click(function () {
+ $body.css('font-size', parseFloat($body.css('font-size')) - 1)
+ })
+
+ /**
+ * menu
+ * 側邊欄sub-menu 展開/收縮
+ * 解決menus在觸摸屏下,滑動屏幕menus_item_child不消失的問題(手機hover的bug)
+ */
+ $('#mobile-sidebar-menus .menus-expand').on('click', function () {
+ if ($(this).hasClass('menus-closed')) {
+ $(this).parents('.menus_item').find('.menus_item_child').slideDown()
+ $(this).removeClass('menus-closed')
+ } else {
+ $(this).parents('.menus_item').find('.menus_item_child').slideUp()
+ $(this).addClass('menus-closed')
+ }
+ })
+
+ $(window).on('touchmove', function (e) {
+ var $menusChild = $('#page-header .menus_item_child')
+ if ($menusChild.is(':visible')) {
+ $menusChild.css('display', 'none')
+ }
+ })
+
+ /**
+ * rightside 點擊設置 按鈕 展開
+ */
+ $('#rightside_config').on('click', function () {
+ if ($('#rightside-config-hide').hasClass('rightside-in')) {
+ $('#rightside-config-hide').removeClass('rightside-in').addClass('rightside-out')
+ } else {
+ $('#rightside-config-hide').removeClass('rightside-out').addClass('rightside-in')
+ }
+ })
+
+ /**
+ * 複製時加上版權信息
+ */
+ var copyright = GLOBAL_CONFIG.copyright
+ if (copyright !== undefined) {
+ document.body.oncopy = function (event) {
+ event.preventDefault()
+ let textFont; const copyFont = window.getSelection(0).toString()
+ if (copyFont.length > 45) {
+ textFont = copyFont + '\n' + '\n' + '\n' +
+ copyright.languages.author + '\n' +
+ copyright.languages.link + window.location.href + '\n' +
+ copyright.languages.source + '\n' +
+ copyright.languages.info
+ } else {
+ textFont = copyFont
+ }
+ if (event.clipboardData) {
+ return event.clipboardData.setData('text', textFont)
+ } else {
+ // 兼容IE
+ return window.clipboardData.setData('text', textFont)
+ }
+ }
+ }
+
+ /**
+ * Darkmode
+ */
+ var isFontAwesomeV5 = GLOBAL_CONFIG.isFontAwesomeV5
+ var $darkModeButtom = $('#darkmode')
+ if (typeof autoChangeMode !== 'undefined') {
+ document.documentElement.getAttribute('data-theme') === 'dark' ? changeLightIcon() : changeDarkIcon()
+ }
+
+ function changeLightIcon () {
+ isFontAwesomeV5 ? $darkModeButtom.removeClass('fa-moon').addClass('fa-sun') : $darkModeButtom.removeClass('fa-moon-o').addClass('fa-sun-o')
+ }
+
+ function changeDarkIcon () {
+ isFontAwesomeV5 ? $darkModeButtom.removeClass('fa-sun').addClass('fa-moon') : $darkModeButtom.removeClass('fa-sun-o').addClass('fa-moon-o')
+ }
+
+ function switchReadMode () {
+ var nowMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
+ if (nowMode === 'light') {
+ changeLightIcon()
+ activateDarkMode()
+ Cookies.set('theme', 'dark', { expires: 2 })
+ if (isSnackbar) snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night)
+ } else {
+ changeDarkIcon()
+ activateLightMode()
+ Cookies.set('theme', 'light', { expires: 2 })
+ if (isSnackbar) snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day)
+ }
+ }
+
+ $darkModeButtom.click(function () {
+ switchReadMode()
+ try {
+ utterancesTheme()
+ } catch (e) {
+ return false
+ }
+ })
+
+ /**
+ * 網頁運行時間
+ */
+ if (GLOBAL_CONFIG.runtime) {
+ // get user config
+ var $runtimeCount = $('#webinfo-runtime-count')
+ var startDate = $runtimeCount.attr('start_date')
+ var showDateTime = function () {
+ var BirthDay = new Date(startDate)
+ var today = new Date()
+ var timeold = (today.getTime() - BirthDay.getTime())
+ var daysold = Math.floor(timeold / (24 * 60 * 60 * 1000))
+ $runtimeCount.text(daysold + ' ' + GLOBAL_CONFIG.runtime_unit)
+ }
+ var interval
+ showDateTime()
+ clearInterval(interval)
+ interval = setInterval(showDateTime, 10000)
+ }
+
+ if (GLOBAL_CONFIG.baiduPush) {
+ (function () {
+ var bp = document.createElement('script')
+ var curProtocol = window.location.protocol.split(':')[0]
+ if (curProtocol === 'https') {
+ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'
+ } else {
+ bp.src = 'http://push.zhanzhang.baidu.com/push.js'
+ }
+ var s = document.getElementsByTagName('script')[0]
+ s.parentNode.insertBefore(bp, s)
+ })()
+ }
+
+ /**
+ * tag-hide
+ */
+ var $hideInline = $('.hide-button')
+ $hideInline.on('click', function (e) {
+ e.preventDefault()
+ $(this).hide()
+ var $hideContent = $(this).next('.hide-content')
+ $hideContent.show()
+ $hideContent.find('.justified-gallery').justifiedGallery({
+ rowHeight: 220,
+ margins: 4
+ })
+ })
+
+ function addPhotoFigcaption () {
+ var images = $('#article-container img')
+ images.each(function (i, o) {
+ var $this = $(o)
+ if ($this.attr('alt')) {
+ var t = $('
' + $this.attr('alt') + '
')
+ $this.after(t)
+ }
+ })
+ }
+ if (GLOBAL_CONFIG.isPhotoFigcaption) addPhotoFigcaption()
+})
diff --git a/themes/butterfly/source/js/search/algolia.js b/themes/butterfly/source/js/search/algolia.js
new file mode 100644
index 00000000..8f024599
--- /dev/null
+++ b/themes/butterfly/source/js/search/algolia.js
@@ -0,0 +1,133 @@
+$(function () {
+ $('a.social-icon.search').on('click', function () {
+ $('body').css({ width: '100%', overflow: 'hidden' })
+ $('.search-dialog').css('display', 'block')
+ $('.ais-search-box--input').focus()
+ $('.search-mask').fadeIn()
+ // shortcut: ESC
+ document.addEventListener('keydown', function f (event) {
+ if (event.code === 'Escape') {
+ closeSearch()
+ document.removeEventListener('keydown', f)
+ }
+ })
+ })
+
+ var closeSearch = function () {
+ $('body').css('width', '')
+ $('body').css('overflow', '')
+ $('.search-dialog').css({
+ animation: 'search_close .5s'
+ })
+
+ $('.search-dialog').animate({}, function () {
+ setTimeout(function () {
+ $('.search-dialog').css({
+ animation: '',
+ display: 'none'
+ })
+ }, 500)
+ })
+
+ $('.search-mask').fadeOut()
+ }
+ $('.search-mask, .search-close-button').on('click touchstart', closeSearch)
+
+ var algolia = GLOBAL_CONFIG.algolia
+ var isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName
+ if (!isAlgoliaValid) {
+ return console.error('Algolia setting is invalid!')
+ }
+
+ var search = instantsearch({
+ appId: algolia.appId,
+ apiKey: algolia.apiKey,
+ indexName: algolia.indexName,
+ searchParameters: {
+ hitsPerPage: algolia.hits.per_page || 10
+ },
+ searchFunction: function (helper) {
+ var searchInput = $('#algolia-search-input').find('input')
+
+ if (searchInput.val()) {
+ helper.search()
+ }
+ }
+ })
+
+ search.addWidget(
+ instantsearch.widgets.searchBox({
+ container: '#algolia-search-input',
+ reset: false,
+ magnifier: false,
+ placeholder: GLOBAL_CONFIG.algolia.languages.input_placeholder
+ })
+ )
+ search.addWidget(
+ instantsearch.widgets.hits({
+ container: '#algolia-hits',
+ templates: {
+ item: function (data) {
+ var link = data.permalink ? data.permalink : (GLOBAL_CONFIG.root + data.path)
+ return (
+ '
' +
+ data._highlightResult.title.value +
+ ''
+ )
+ },
+ empty: function (data) {
+ return (
+ '
' +
+ GLOBAL_CONFIG.algolia.languages.hits_empty.replace(/\$\{query}/, data.query) +
+ '
'
+ )
+ }
+ },
+ cssClasses: {
+ item: 'algolia-hit-item'
+ }
+ })
+ )
+
+ search.addWidget(
+ instantsearch.widgets.stats({
+ container: '#algolia-stats',
+ templates: {
+ body: function (data) {
+ var stats = GLOBAL_CONFIG.algolia.languages.hits_stats
+ .replace(/\$\{hits}/, data.nbHits)
+ .replace(/\$\{time}/, data.processingTimeMS)
+ return (
+ '
' +
+ stats +
+ '
' +
+ '
' +
+ ''
+ )
+ }
+ }
+ })
+ )
+
+ search.addWidget(
+ instantsearch.widgets.pagination({
+ container: '#algolia-pagination',
+ scrollTo: false,
+ showFirstLast: false,
+ labels: {
+ first: '
',
+ last: '
',
+ previous: '
',
+ next: '
'
+ },
+ cssClasses: {
+ root: 'pagination',
+ item: 'pagination-item',
+ link: 'page-number',
+ active: 'current',
+ disabled: 'disabled-item'
+ }
+ })
+ )
+ search.start()
+})
diff --git a/themes/butterfly/source/js/search/local-search.js b/themes/butterfly/source/js/search/local-search.js
new file mode 100644
index 00000000..efcec8ab
--- /dev/null
+++ b/themes/butterfly/source/js/search/local-search.js
@@ -0,0 +1,104 @@
+$(function () {
+ var loadFlag = false
+ $('a.social-icon.search').on('click', function () {
+ $('body').css({ width: '100%', overflow: 'hidden' })
+ $('.search-dialog').css('display', 'block')
+ $('#local-search-input input').focus()
+ $('.search-mask').fadeIn()
+ if (!loadFlag) {
+ search(GLOBAL_CONFIG.localSearch.path)
+ loadFlag = true
+ }
+
+ // shortcut: ESC
+ document.addEventListener('keydown', function f (event) {
+ if (event.code === 'Escape') {
+ closeSearch()
+ document.removeEventListener('keydown', f)
+ }
+ })
+ })
+
+ var closeSearch = function () {
+ $('body').css('width', '')
+ $('body').css('overflow', '')
+ $('.search-dialog').css({
+ animation: 'search_close .5s'
+ })
+
+ $('.search-dialog').animate({}, function () {
+ setTimeout(function () {
+ $('.search-dialog').css({
+ animation: '',
+ display: 'none'
+ })
+ }, 500)
+ })
+
+ $('.search-mask').fadeOut()
+ }
+ $('.search-mask, .search-close-button').on('click touchstart', closeSearch)
+
+ function search (path) {
+ $.ajax({
+ url: GLOBAL_CONFIG.root + path,
+ dataType: 'xml',
+ success: function (xmlResponse) {
+ // get the contents from search data
+ var datas = $('entry', xmlResponse).map(function () {
+ return {
+ title: $('title', this).text(),
+ content: $('content', this).text(),
+ url: $('url', this).text()
+ }
+ }).get()
+ var $input = $('#local-search-input input')[0]
+ var $resultContent = $('#local-hits')[0]
+ $input.addEventListener('input', function () {
+ var str = '
'
+ var keywords = this.value.trim().toLowerCase().split(/[\s]+/)
+ $resultContent.innerHTML = ''
+ if (this.value.trim().length <= 0) {
+ $('.local-search-stats__hr').hide()
+ return
+ }
+ var count = 0
+ // perform local searching
+ datas.forEach(function (data) {
+ var isMatch = true
+ var dataTitle = data.title.trim().toLowerCase()
+ var dataContent = data.content.trim().replace(/<[^>]+>/g, '').toLowerCase()
+ var dataUrl = data.url
+ var indexTitle = -1
+ var indexContent = -1
+ // only match artiles with not empty titles and contents
+ if (dataTitle !== '' && dataContent !== '') {
+ keywords.forEach(function (keyword, i) {
+ indexTitle = dataTitle.indexOf(keyword)
+ indexContent = dataContent.indexOf(keyword)
+ if (indexTitle < 0 && indexContent < 0) {
+ isMatch = false
+ } else {
+ if (indexContent < 0) {
+ indexContent = 0
+ }
+ }
+ })
+ }
+ // show search results
+ if (isMatch) {
+ str += '
'
+ count += 1
+ $('.local-search-stats__hr').show()
+ }
+ })
+ if (count === 0) {
+ str += '
' + GLOBAL_CONFIG.localSearch.languages.hits_empty.replace(/\$\{query}/, this.value.trim()) +
+ '
'
+ }
+ $resultContent.innerHTML = str
+ })
+ }
+ })
+ }
+})
diff --git a/themes/butterfly/source/js/third-party/ClickShowText.js b/themes/butterfly/source/js/third-party/ClickShowText.js
new file mode 100644
index 00000000..d17ac766
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/ClickShowText.js
@@ -0,0 +1,42 @@
+function co(){
+ var colorElements = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f";
+ var colorArray = colorElements.split(",");
+ var color ="#";
+ for(var i =0;i<6;i++){
+ color+=colorArray[Math.floor(Math.random()*16)];
+ }
+ return color;
+};
+var a_idx = 0;
+jQuery(document).ready(function($) {
+ $("body").click(function (e) {
+
+ var config = GLOBAL_CONFIG.ClickShowText;
+
+ /*这个数组中的每一个字符是你要浮动显示的词或句子,每次点击鼠标后按顺序出现*/
+ var a = config.text.split(",");
+ var $i = $("
").text(a[a_idx]);
+ a_idx = (a_idx + 1) % a.length;
+ var x = e.pageX,
+ y = e.pageY;
+ $i.css({
+ "z-index": 150,
+ "top": y - 20,
+ "left": x -40,
+ "position": "absolute",
+ "font-weight": "bold",
+ "color": co(),
+ "cursor": "default",
+ "font-size": config.fontSize || "inherit"
+ });
+ $("body").append($i);
+ $i.animate({
+ "top": y - 180,
+ "opacity": 0
+ },
+ 1500,
+ function() {
+ $i.remove();
+ });
+});
+});
\ No newline at end of file
diff --git a/themes/butterfly/source/js/third-party/activate-power-mode.js b/themes/butterfly/source/js/third-party/activate-power-mode.js
new file mode 100644
index 00000000..975190b8
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/activate-power-mode.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.POWERMODE=e():t.POWERMODE=e()}(this,(function(){return function(t){var e={};function o(n){if(e[n])return e[n].exports;var r=e[n]={exports:{},id:n,loaded:!1};return t[n].call(r.exports,r,r.exports,o),r.loaded=!0,r.exports}return o.m=t,o.c=e,o.p="",o(0)}([function(t,e,o){"use strict";var n=document.createElement("canvas");n.width=window.innerWidth,n.height=window.innerHeight,n.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:999999",window.addEventListener("resize",(function(){n.width=window.innerWidth,n.height=window.innerHeight})),document.body.appendChild(n);var r=n.getContext("2d"),i=[],a=0,d=!1;function l(t,e){return Math.random()*(e-t)+t}function c(t){if(p.colorful){var e=l(0,360);return"hsla("+l(e-10,e+10)+", 100%, "+l(50,80)+"%, 1)"}return window.getComputedStyle(t).color}function u(t,e,o){return{x:t,y:e,alpha:1,color:o,velocity:{x:2*Math.random()-1,y:2*Math.random()-3.5}}}function p(){for(var t=function(){var t,e=document.activeElement;if("TEXTAREA"===e.tagName||"INPUT"===e.tagName&&"text"===e.getAttribute("type")){var n=o(1)(e,e.selectionEnd);return t=e.getBoundingClientRect(),{x:n.left+t.left,y:n.top+t.top,color:c(e)}}var r=window.getSelection();if(r.rangeCount){var i=r.getRangeAt(0),a=i.startContainer;return a.nodeType===document.TEXT_NODE&&(a=a.parentNode),{x:(t=i.getBoundingClientRect()).left,y:t.top,color:c(a)}}return{x:0,y:0,color:"transparent"}}(),e=5+Math.round(10*Math.random());e--;)i[a]=u(t.x,t.y,t.color),a=(a+1)%500;if(p.shake){var n=1+2*Math.random(),r=n*(Math.random()>.5?-1:1),l=n*(Math.random()>.5?-1:1);document.body.style.marginLeft=r+"px",document.body.style.marginTop=l+"px",setTimeout((function(){document.body.style.marginLeft="",document.body.style.marginTop=""}),75)}d||requestAnimationFrame(f)}function f(){d=!0,r.clearRect(0,0,n.width,n.height);for(var t=!1,e=n.getBoundingClientRect(),o=0;o
parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",d.textContent=t.value.substring(0,n),"INPUT"===t.nodeName&&(d.textContent=d.textContent.replace(/\s/g," "));var u=document.createElement("span");u.textContent=t.value.substring(n)||".",d.appendChild(u);var p={top:u.offsetTop+parseInt(c.borderTopWidth),left:u.offsetLeft+parseInt(c.borderLeftWidth)};return i?u.style.backgroundColor="#aaa":document.body.removeChild(d),p}void 0!==t&&void 0!==t.exports?t.exports=n:window.getCaretCoordinates=n}()}])}));
\ No newline at end of file
diff --git a/themes/butterfly/source/js/third-party/canvas-nest.js b/themes/butterfly/source/js/third-party/canvas-nest.js
new file mode 100644
index 00000000..50d3e870
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/canvas-nest.js
@@ -0,0 +1,88 @@
+! function () {
+ var cn = document.getElementById('canvas_nest');
+ var mb = cn.getAttribute("mobile");
+
+ if (mb == 'false' && (/Android|webOS|iPhone|iPod|iPad|BlackBerry/i.test(navigator.userAgent))) {
+ return;
+ }
+
+ function o(w, v, i) {
+ return w.getAttribute(v) || i
+ }
+
+ function j(i) {
+ return document.getElementsByTagName(i)
+ }
+
+ function l() {
+ var i = j("script"),
+ w = i.length,
+ v = i[w - 1];
+ return {
+ l: w,
+ z: o(v, "zIndex", -1),
+ o: o(v, "opacity", 0.5),
+ c: o(v, "color", "0,0,0"),
+ n: o(v, "count", 99)
+ }
+ }
+
+ function k() {
+ r = u.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, n = u.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
+ }
+
+ function b() {
+ e.clearRect(0, 0, r, n);
+ var w = [f].concat(t);
+ var x, v, A, B, z, y;
+ t.forEach(function (i) {
+ i.x += i.xa, i.y += i.ya, i.xa *= i.x > r || i.x < 0 ? -1 : 1, i.ya *= i.y > n || i.y < 0 ? -1 : 1, e.fillRect(i.x - 0.5, i.y - 0.5, 1, 1);
+ for (v = 0; v < w.length; v++) {
+ x = w[v];
+ if (i !== x && null !== x.x && null !== x.y) {
+ B = i.x - x.x, z = i.y - x.y, y = B * B + z * z;
+ y < x.max && (x === f && y >= x.max / 2 && (i.x -= 0.03 * B, i.y -= 0.03 * z), A = (x.max - y) / x.max, e.beginPath(), e.lineWidth = A / 2, e.strokeStyle = "rgba(" + s.c + "," + (A + 0.2) + ")", e.moveTo(i.x, i.y), e.lineTo(x.x, x.y), e.stroke())
+ }
+ }
+ w.splice(w.indexOf(i), 1)
+ }), m(b)
+ }
+ var u = document.createElement("canvas"),
+ s = l(),
+ c = "c_n" + s.l,
+ e = u.getContext("2d"),
+ r, n, m = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (i) {
+ window.setTimeout(i, 1000 / 45)
+ },
+ a = Math.random,
+ f = {
+ x: null,
+ y: null,
+ max: 20000
+ };
+ u.id = c;
+ u.style.cssText = "position:fixed;top:0;left:0;z-index:" + s.z + ";opacity:" + s.o;
+ j("body")[0].appendChild(u);
+ k(), window.onresize = k;
+ window.onmousemove = function (i) {
+ i = i || window.event, f.x = i.clientX, f.y = i.clientY
+ }, window.onmouseout = function () {
+ f.x = null, f.y = null
+ };
+ for (var t = [], p = 0; s.n > p; p++) {
+ var h = a() * r,
+ g = a() * n,
+ q = 2 * a() - 1,
+ d = 2 * a() - 1;
+ t.push({
+ x: h,
+ y: g,
+ xa: q,
+ ya: d,
+ max: 6000
+ })
+ }
+ setTimeout(function () {
+ b()
+ }, 100)
+}();
\ No newline at end of file
diff --git a/themes/butterfly/source/js/third-party/canvas-ribbon.js b/themes/butterfly/source/js/third-party/canvas-ribbon.js
new file mode 100644
index 00000000..74bce999
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/canvas-ribbon.js
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016 hustcc
+ * License: MIT
+ * Version: v1.0.1
+ * GitHub: https://github.com/hustcc/ribbon.js
+ **/
+
+!(function () {
+
+ var script = document.getElementById('ribbon');
+ var mb = script.getAttribute("mobile");
+ if (mb == 'false' && (/Android|webOS|iPhone|iPod|iPad|BlackBerry/i.test(navigator.userAgent))) {
+ return;
+ }
+
+ config = {
+ z: attr(script, 'zIndex', -1), // z-index
+ a: attr(script, 'alpha', 0.6), // alpha
+ s: attr(script, 'size', 90), // size
+ c: attr(script, 'data-click', true) // click-to-change
+ }
+
+
+ function attr (node, attr, default_value) {
+ if (default_value === true) {
+ return node.getAttribute(attr) || default_value
+ }
+ return Number(node.getAttribute(attr)) || default_value
+ }
+
+ var canvas = document.createElement('canvas'),
+ g2d = canvas.getContext('2d'),
+ pr = window.devicePixelRatio || 1,
+ width = window.innerWidth,
+ height = window.innerHeight,
+ f = config.s,
+ q,
+ t,
+ m = Math,
+ r = 0,
+ pi = m.PI * 2,
+ cos = m.cos,
+ random = m.random
+ canvas.width = width * pr
+ canvas.height = height * pr
+ g2d.scale(pr, pr)
+ g2d.globalAlpha = config.a
+ canvas.style.cssText =
+ 'opacity: ' +
+ config.a +
+ ';position:fixed;top:0;left:0;z-index: ' +
+ config.z +
+ ';width:100%;height:100%;pointer-events:none;'
+ // create canvas
+ document.getElementsByTagName('body')[0].appendChild(canvas)
+
+ function redraw () {
+ g2d.clearRect(0, 0, width, height)
+ q = [{ x: 0, y: height * 0.7 + f }, { x: 0, y: height * 0.7 - f }]
+ while (q[1].x < width + f) draw(q[0], q[1])
+ }
+ function draw (i, j) {
+ g2d.beginPath()
+ g2d.moveTo(i.x, i.y)
+ g2d.lineTo(j.x, j.y)
+ var k = j.x + (random() * 2 - 0.25) * f,
+ n = line(j.y)
+ g2d.lineTo(k, n)
+ g2d.closePath()
+ r -= pi / -50
+ g2d.fillStyle =
+ '#' +
+ (
+ ((cos(r) * 127 + 128) << 16) |
+ ((cos(r + pi / 3) * 127 + 128) << 8) |
+ (cos(r + (pi / 3) * 2) * 127 + 128)
+ ).toString(16)
+ g2d.fill()
+ q[0] = q[1]
+ q[1] = { x: k, y: n }
+ }
+ function line (p) {
+ t = p + (random() * 2 - 1.1) * f
+ return t > height || t < 0 ? line(p) : t
+ }
+ if (config.c !== 'false') {
+ document.onclick = redraw
+ document.ontouchstart = redraw
+ }
+ redraw()
+})()
\ No newline at end of file
diff --git a/themes/butterfly/source/js/third-party/click_heart.js b/themes/butterfly/source/js/third-party/click_heart.js
new file mode 100644
index 00000000..21aeef9b
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/click_heart.js
@@ -0,0 +1,73 @@
+!(function(e, t, a) {
+ function r(e) {
+ var a = t.createElement("div");
+ (a.className = "heart"),
+ n.push({
+ el: a,
+ x: e.clientX - 5,
+ y: e.clientY - 5,
+ scale: 1,
+ alpha: 1,
+ color:
+ "rgb(" +
+ ~~(255 * Math.random()) +
+ "," +
+ ~~(255 * Math.random()) +
+ "," +
+ ~~(255 * Math.random()) +
+ ")"
+ }),
+ t.body.appendChild(a);
+ }
+ var n = [];
+ (e.requestAnimationFrame =
+ e.requestAnimationFrame ||
+ e.webkitRequestAnimationFrame ||
+ e.mozRequestAnimationFrame ||
+ e.oRequestAnimationFrame ||
+ e.msRequestAnimationFrame ||
+ function(e) {
+ setTimeout(e, 1e3 / 60);
+ }),
+ (function(e) {
+ var a = t.createElement("style");
+ a.type = "text/css";
+ try {
+ a.appendChild(t.createTextNode(e));
+ } catch (t) {
+ a.styleSheet.cssText = e;
+ }
+ t.getElementsByTagName("head")[0].appendChild(a);
+ })(
+ ".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}"
+ ),
+ (function() {
+ var t = "function" == typeof e.onclick && e.onclick;
+ e.onclick = function(e) {
+ t && t(), r(e);
+ };
+ })(),
+ (function e() {
+ for (var a = 0; a < n.length; a++)
+ n[a].alpha <= 0
+ ? (t.body.removeChild(n[a].el), n.splice(a, 1))
+ : (n[a].y--,
+ (n[a].scale += 0.004),
+ (n[a].alpha -= 0.013),
+ (n[a].el.style.cssText =
+ "left:" +
+ n[a].x +
+ "px;top:" +
+ n[a].y +
+ "px;opacity:" +
+ n[a].alpha +
+ ";transform:scale(" +
+ n[a].scale +
+ "," +
+ n[a].scale +
+ ") rotate(45deg);background:" +
+ n[a].color +
+ ";z-index:99999"));
+ requestAnimationFrame(e);
+ })();
+})(window, document);
diff --git a/themes/butterfly/source/js/third-party/fireworks.js b/themes/butterfly/source/js/third-party/fireworks.js
new file mode 100644
index 00000000..91993a71
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/fireworks.js
@@ -0,0 +1,129 @@
+var canvasEl = document.querySelector('.fireworks')
+if (canvasEl) {
+ var ctx = canvasEl.getContext('2d')
+ var numberOfParticules = 30
+ var pointerX = 0
+ var pointerY = 0
+ // var tap = ('ontouchstart' in window || navigator.msMaxTouchPoints) ? 'touchstart' : 'mousedown'
+ // Fixed the mobile scroll
+ var tap = 'mousedown'
+ var colors = ['#FF1461', '#18FF92', '#5A87FF', '#FBF38C']
+
+ var setCanvasSize = debounce(function () {
+ canvasEl.width = window.innerWidth
+ canvasEl.height = window.innerHeight
+ canvasEl.style.width = window.innerWidth + 'px'
+ canvasEl.style.height = window.innerHeight + 'px'
+ canvasEl.getContext('2d').scale(1, 1)
+ }, 500)
+
+ var render = anime({
+ duration: Infinity,
+ update: function () {
+ ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)
+ }
+ })
+
+ document.addEventListener(tap, function (e) {
+ if (e.target.id !== 'sidebar' && e.target.id !== 'toggle-sidebar' && e.target.nodeName !== 'A' && e.target.nodeName !== 'IMG') {
+ render.play()
+ updateCoords(e)
+ animateParticules(pointerX, pointerY)
+ }
+ }, false)
+
+ setCanvasSize()
+ window.addEventListener('resize', setCanvasSize, false)
+}
+
+function updateCoords (e) {
+ pointerX = (e.clientX || e.touches[0].clientX) - canvasEl.getBoundingClientRect().left
+ pointerY = e.clientY || e.touches[0].clientY - canvasEl.getBoundingClientRect().top
+}
+
+function setParticuleDirection (p) {
+ var angle = anime.random(0, 360) * Math.PI / 180
+ var value = anime.random(50, 180)
+ var radius = [-1, 1][anime.random(0, 1)] * value
+ return {
+ x: p.x + radius * Math.cos(angle),
+ y: p.y + radius * Math.sin(angle)
+ }
+}
+
+function createParticule (x, y) {
+ var p = {}
+ p.x = x
+ p.y = y
+ p.color = colors[anime.random(0, colors.length - 1)]
+ p.radius = anime.random(16, 32)
+ p.endPos = setParticuleDirection(p)
+ p.draw = function () {
+ ctx.beginPath()
+ ctx.arc(p.x, p.y, p.radius, 0, 2 * Math.PI, true)
+ ctx.fillStyle = p.color
+ ctx.fill()
+ }
+ return p
+}
+
+function createCircle (x, y) {
+ var p = {}
+ p.x = x
+ p.y = y
+ p.color = '#F00'
+ p.radius = 0.1
+ p.alpha = 0.5
+ p.lineWidth = 6
+ p.draw = function () {
+ ctx.globalAlpha = p.alpha
+ ctx.beginPath()
+ ctx.arc(p.x, p.y, p.radius, 0, 2 * Math.PI, true)
+ ctx.lineWidth = p.lineWidth
+ ctx.strokeStyle = p.color
+ ctx.stroke()
+ ctx.globalAlpha = 1
+ }
+ return p
+}
+
+function renderParticule (anim) {
+ for (var i = 0; i < anim.animatables.length; i++) {
+ anim.animatables[i].target.draw()
+ }
+}
+
+function animateParticules (x, y) {
+ var circle = createCircle(x, y)
+ var particules = []
+ for (var i = 0; i < numberOfParticules; i++) {
+ particules.push(createParticule(x, y))
+ }
+ anime.timeline().add({
+ targets: particules,
+ x: function (p) {
+ return p.endPos.x
+ },
+ y: function (p) {
+ return p.endPos.y
+ },
+ radius: 0.1,
+ duration: anime.random(1200, 1800),
+ easing: 'easeOutExpo',
+ update: renderParticule
+ })
+ .add({
+ targets: circle,
+ radius: anime.random(80, 160),
+ lineWidth: 0,
+ alpha: {
+ value: 0,
+ easing: 'linear',
+ duration: anime.random(600, 800)
+ },
+ duration: anime.random(1200, 1800),
+ easing: 'easeOutExpo',
+ update: renderParticule,
+ offset: 0
+ })
+}
\ No newline at end of file
diff --git a/themes/butterfly/source/js/third-party/piao.js b/themes/butterfly/source/js/third-party/piao.js
new file mode 100644
index 00000000..1e020baf
--- /dev/null
+++ b/themes/butterfly/source/js/third-party/piao.js
@@ -0,0 +1,334 @@
+
+ (function (name, factory) {
+ if (typeof window === "object") {
+ window[name] = factory()
+ }
+ })("Ribbons", function () {
+ var _w = window,
+ _b = document.body,
+ _d = document.documentElement;
+ var random = function () {
+ if (arguments.length === 1) {
+ if (Array.isArray(arguments[0])) {
+ var index = Math.round(random(0, arguments[0].length - 1));
+ return arguments[0][index]
+ }
+ return random(0, arguments[0])
+ } else if (arguments.length === 2) {
+ return Math.random() * (arguments[1] - arguments[0]) + arguments[0]
+ }
+ return 0
+ };
+ var screenInfo = function (e) {
+ var width = Math.max(0, _w.innerWidth || _d.clientWidth || _b.clientWidth || 0),
+ height = Math.max(0, _w.innerHeight || _d.clientHeight || _b.clientHeight || 0),
+ scrollx = Math.max(0, _w.pageXOffset || _d.scrollLeft || _b.scrollLeft || 0) - (_d.clientLeft || 0),
+ scrolly = Math.max(0, _w.pageYOffset || _d.scrollTop || _b.scrollTop || 0) - (_d.clientTop || 0);
+ return {
+ width: width,
+ height: height,
+ ratio: width / height,
+ centerx: width / 2,
+ centery: height / 2,
+ scrollx: scrollx,
+ scrolly: scrolly
+ }
+ };
+ var mouseInfo = function (e) {
+ var screen = screenInfo(e),
+ mousex = e ? Math.max(0, e.pageX || e.clientX || 0) : 0,
+ mousey = e ? Math.max(0, e.pageY || e.clientY || 0) : 0;
+ return {
+ mousex: mousex,
+ mousey: mousey,
+ centerx: mousex - screen.width / 2,
+ centery: mousey - screen.height / 2
+ }
+ };
+ var Point = function (x, y) {
+ this.x = 0;
+ this.y = 0;
+ this.set(x, y)
+ };
+ Point.prototype = {
+ constructor: Point,
+ set: function (x, y) {
+ this.x = x || 0;
+ this.y = y || 0
+ },
+ copy: function (point) {
+ this.x = point.x || 0;
+ this.y = point.y || 0;
+ return this
+ },
+ multiply: function (x, y) {
+ this.x *= x || 1;
+ this.y *= y || 1;
+ return this
+ },
+ divide: function (x, y) {
+ this.x /= x || 1;
+ this.y /= y || 1;
+ return this
+ },
+ add: function (x, y) {
+ this.x += x || 0;
+ this.y += y || 0;
+ return this
+ },
+ subtract: function (x, y) {
+ this.x -= x || 0;
+ this.y -= y || 0;
+ return this
+ },
+ clampX: function (min, max) {
+ this.x = Math.max(min, Math.min(this.x, max));
+ return this
+ },
+ clampY: function (min, max) {
+ this.y = Math.max(min, Math.min(this.y, max));
+ return this
+ },
+ flipX: function () {
+ this.x *= -1;
+ return this
+ },
+ flipY: function () {
+ this.y *= -1;
+ return this
+ }
+ };
+ var Factory = function (options) {
+ this._canvas = null;
+ this._context = null;
+ this._sto = null;
+ this._width = 0;
+ this._height = 0;
+ this._scroll = 0;
+ this._ribbons = [];
+ this._options = {
+ colorSaturation: "80%",
+ colorBrightness: "60%",
+ colorAlpha: 0.65,
+ colorCycleSpeed: 6,
+ verticalPosition: "center",
+ horizontalSpeed: 150,
+ ribbonCount: 5,
+ strokeSize: 5,
+ parallaxAmount: -0.5,
+ animateSections: true
+ };
+ this._onDraw = this._onDraw.bind(this);
+ this._onResize = this._onResize.bind(this);
+ this._onScroll = this._onScroll.bind(this);
+ this.setOptions(options);
+ this.init()
+ };
+ Factory.prototype = {
+ constructor: Factory,
+ setOptions: function (options) {
+ if (typeof options === "object") {
+ for (var key in options) {
+ if (options.hasOwnProperty(key)) {
+ this._options[key] = options[key]
+ }
+ }
+ }
+ },
+ init: function () {
+ try {
+ this._canvas = document.createElement("canvas");
+ this._canvas.style["display"] = "block";
+ this._canvas.style["position"] = "fixed";
+ this._canvas.style["margin"] = "0";
+ this._canvas.style["padding"] = "0";
+ this._canvas.style["border"] = "0";
+ this._canvas.style["outline"] = "0";
+ this._canvas.style["left"] = "0";
+ this._canvas.style["top"] = "0";
+ this._canvas.style["width"] = "100%";
+ this._canvas.style["height"] = "100%";
+ this._canvas.style["z-index"] = "-1";
+ this._onResize();
+ this._context = this._canvas.getContext("2d");
+ this._context.clearRect(0, 0, this._width, this._height);
+ this._context.globalAlpha = this._options.colorAlpha;
+ window.addEventListener("resize", this._onResize);
+ window.addEventListener("scroll", this._onScroll);
+ document.body.appendChild(this._canvas)
+ } catch (e) {
+ console.warn("Canvas Context Error: " + e.toString());
+ return
+ }
+ this._onDraw()
+ },
+ addRibbon: function () {
+ var dir = Math.round(random(1, 9)) > 5 ? "right" : "left",
+ stop = 1000,
+ hide = 200,
+ min = 0 - hide,
+ max = this._width + hide,
+ movex = 0,
+ movey = 0,
+ startx = dir === "right" ? min : max,
+ starty = Math.round(random(0, this._height));
+ if (/^(top|min)$/i.test(this._options.verticalPosition)) {
+ starty = 0 + hide
+ } else if (/^(middle|center)$/i.test(this._options.verticalPosition)) {
+ starty = this._height / 2
+ } else if (/^(bottom|max)$/i.test(this._options.verticalPosition)) {
+ starty = this._height - hide
+ }
+ var ribbon = [],
+ point1 = new Point(startx, starty),
+ point2 = new Point(startx, starty),
+ point3 = null,
+ color = Math.round(random(0, 360)),
+ delay = 0;
+ while (true) {
+ if (stop <= 0) break;
+ stop--;
+ movex = Math.round((Math.random() * 1 - 0.2) * this._options.horizontalSpeed);
+ movey = Math.round((Math.random() * 1 - 0.5) * (this._height * 0.25));
+ point3 = new Point();
+ point3.copy(point2);
+ if (dir === "right") {
+ point3.add(movex, movey);
+ if (point2.x >= max) break
+ } else if (dir === "left") {
+ point3.subtract(movex, movey);
+ if (point2.x <= min) break
+ }
+ ribbon.push({
+ point1: new Point(point1.x, point1.y),
+ point2: new Point(point2.x, point2.y),
+ point3: point3,
+ color: color,
+ delay: delay,
+ dir: dir,
+ alpha: 0,
+ phase: 0
+ });
+ point1.copy(point2);
+ point2.copy(point3);
+ delay += 4;
+ color += this._options.colorCycleSpeed
+ }
+ this._ribbons.push(ribbon)
+ },
+ _drawRibbonSection: function (section) {
+ if (section) {
+ if (section.phase >= 1 && section.alpha <= 0) {
+ return true
+ }
+ if (section.delay <= 0) {
+ section.phase += 0.02;
+ section.alpha = Math.sin(section.phase) * 1;
+ section.alpha = section.alpha <= 0 ? 0 : section.alpha;
+ section.alpha = section.alpha >= 1 ? 1 : section.alpha;
+ if (this._options.animateSections) {
+ var mod = Math.sin(1 + section.phase * Math.PI / 2) * 0.1;
+ if (section.dir === "right") {
+ section.point1.add(mod, 0);
+ section.point2.add(mod, 0);
+ section.point3.add(mod, 0)
+ } else {
+ section.point1.subtract(mod, 0);
+ section.point2.subtract(mod, 0);
+ section.point3.subtract(mod, 0)
+ }
+ section.point1.add(0, mod);
+ section.point2.add(0, mod);
+ section.point3.add(0, mod)
+ }
+ } else {
+ section.delay -= 0.5
+ }
+ var s = this._options.colorSaturation,
+ l = this._options.colorBrightness,
+ c = "hsla(" + section.color + ", " + s + ", " + l + ", " + section.alpha + " )";
+ this._context.save();
+ if (this._options.parallaxAmount !== 0) {
+ this._context.translate(0, this._scroll * this._options.parallaxAmount)
+ }
+ this._context.beginPath();
+ this._context.moveTo(section.point1.x, section.point1.y);
+ this._context.lineTo(section.point2.x, section.point2.y);
+ this._context.lineTo(section.point3.x, section.point3.y);
+ this._context.fillStyle = c;
+ this._context.fill();
+ if (this._options.strokeSize > 0) {
+ this._context.lineWidth = this._options.strokeSize;
+ this._context.strokeStyle = c;
+ this._context.lineCap = "round";
+ this._context.stroke()
+ }
+ this._context.restore()
+ }
+ return false
+ },
+ _onDraw: function () {
+ for (var i = 0, t = this._ribbons.length; i < t; ++i) {
+ if (!this._ribbons[i]) {
+ this._ribbons.splice(i, 1)
+ }
+ }
+ this._context.clearRect(0, 0, this._width, this._height);
+ for (var a = 0; a < this._ribbons.length; ++a) {
+ var ribbon = this._ribbons[a],
+ numSections = ribbon.length,
+ numDone = 0;
+ for (var b = 0; b < numSections; ++b) {
+ if (this._drawRibbonSection(ribbon[b])) {
+ numDone++
+ }
+ }
+ if (numDone >= numSections) {
+ this._ribbons[a] = null
+ }
+ }
+ if (this._ribbons.length < this._options.ribbonCount) {
+ this.addRibbon()
+ }
+ requestAnimationFrame(this._onDraw)
+ },
+ _onResize: function (e) {
+ var screen = screenInfo(e);
+ this._width = screen.width;
+ this._height = screen.height;
+ if (this._canvas) {
+ this._canvas.width = this._width;
+ this._canvas.height = this._height;
+ if (this._context) {
+ this._context.globalAlpha = this._options.colorAlpha
+ }
+ }
+ },
+ _onScroll: function (e) {
+ var screen = screenInfo(e);
+ this._scroll = screen.scrolly
+ }
+ };
+ return Factory
+ });
+
+ var cn = document.getElementById('ribbon_piao');
+ var mb = cn.getAttribute("mobile");
+
+ if ( mb == 'false' && (/Android|webOS|iPhone|iPod|iPad|BlackBerry/i.test(navigator.userAgent))) {
+
+ } else {
+ new Ribbons({
+ colorSaturation: "60%",
+ colorBrightness: "50%",
+ colorAlpha: 0.5,
+ colorCycleSpeed: 5,
+ verticalPosition: "random",
+ horizontalSpeed: 200,
+ ribbonCount: 3,
+ strokeSize: 0,
+ parallaxAmount: -0.2,
+ animateSections: true
+ });
+ }
+
diff --git a/themes/butterfly/source/js/tw_cn.js b/themes/butterfly/source/js/tw_cn.js
new file mode 100644
index 00000000..660bfb8d
--- /dev/null
+++ b/themes/butterfly/source/js/tw_cn.js
@@ -0,0 +1,123 @@
+var translate = GLOBAL_CONFIG.translate;
+var Snackbar_tl = GLOBAL_CONFIG.Snackbar;
+
+var defaultEncoding = translate.defaultEncoding; // 網站默認語言,1: 繁體中文, 2: 簡體中文
+var translateDelay = translate.translateDelay; //延遲時間,若不在前, 要設定延遲翻譯時間, 如100表示100ms,默認為0
+var cookieDomain = translate.cookieDomain; //更改為你的博客網址
+var msgToTraditionalChinese = translate.msgToTraditionalChinese; //此處可以更改為你想要顯示的文字
+var msgToSimplifiedChinese = translate.msgToSimplifiedChinese; //同上,但兩處均不建議更改
+var translateButtonId = "translateLink"; //默認互換id
+var currentEncoding = defaultEncoding;
+var targetEncodingCookie = "targetEncoding" + cookieDomain.replace(/\./g, "");
+var targetEncoding =
+ Cookies.get(targetEncodingCookie) == null
+ ? defaultEncoding
+ : Cookies.get(targetEncodingCookie);
+var translateButtonObject;
+var isSnackbar = GLOBAL_CONFIG.Snackbar !== undefined ? true : false;
+
+function translateText(txt) {
+ if (txt == "" || txt == null) return "";
+ if (currentEncoding == 1 && targetEncoding == 2) return Simplized(txt);
+ else if (currentEncoding == 2 && targetEncoding == 1)
+ return Traditionalized(txt);
+ else return txt;
+}
+function translateBody(fobj) {
+ if (typeof fobj == "object") var objs = fobj.childNodes;
+ else var objs = document.body.childNodes;
+ for (var i = 0; i < objs.length; i++) {
+ var obj = objs.item(i);
+ if (
+ "||BR|HR|TEXTAREA|".indexOf("|" + obj.tagName + "|") > 0 ||
+ obj == translateButtonObject
+ )
+ continue;
+ if (obj.title != "" && obj.title != null)
+ obj.title = translateText(obj.title);
+ if (obj.alt != "" && obj.alt != null) obj.alt = translateText(obj.alt);
+ if (
+ obj.tagName == "INPUT" &&
+ obj.value != "" &&
+ obj.type != "text" &&
+ obj.type != "hidden"
+ )
+ obj.value = translateText(obj.value);
+ if (obj.nodeType == 3) obj.data = translateText(obj.data);
+ else translateBody(obj);
+ }
+}
+function translatePage() {
+ if (targetEncoding == 1) {
+ currentEncoding = 1;
+ targetEncoding = 2;
+ translateButtonObject.innerHTML = msgToTraditionalChinese;
+ Cookies.set(targetEncodingCookie, targetEncoding, {
+ expires: 7,
+ path: "/"
+ });
+ translateBody();
+ if (isSnackbar) snackbarShow(Snackbar_tl.cht_to_chs);
+ } else if (targetEncoding == 2) {
+ currentEncoding = 2;
+ targetEncoding = 1;
+ translateButtonObject.innerHTML = msgToSimplifiedChinese;
+ Cookies.set(targetEncodingCookie, targetEncoding, {
+ expires: 7,
+ path: "/"
+ });
+ translateBody();
+ if (isSnackbar) snackbarShow(Snackbar_tl.chs_to_cht);
+ }
+}
+function JTPYStr() {
+ return "万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾";
+}
+function FTPYStr() {
+ return "萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽";
+}
+function Traditionalized(cc) {
+ var str = "";
+ var ss = JTPYStr();
+ var tt = FTPYStr();
+ for (var i = 0; i < cc.length; i++) {
+ if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) != -1)
+ str += tt.charAt(ss.indexOf(cc.charAt(i)));
+ else str += cc.charAt(i);
+ }
+ return str;
+}
+function Simplized(cc) {
+ var str = "";
+ var ss = JTPYStr();
+ var tt = FTPYStr();
+ for (var i = 0; i < cc.length; i++) {
+ if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) != -1)
+ str += ss.charAt(tt.indexOf(cc.charAt(i)));
+ else str += cc.charAt(i);
+ }
+ return str;
+}
+function translateInitilization() {
+ translateButtonObject = document.getElementById(translateButtonId);
+ if (translateButtonObject) {
+ with (translateButtonObject) {
+ if (typeof document.all != "object") {
+ href = "javascript:translatePage();";
+ } else {
+ href = "#";
+ onclick = new Function("translatePage(); return false;");
+ }
+ }
+ if (currentEncoding != targetEncoding) {
+ setTimeout("translateBody()", translateDelay);
+ if (targetEncoding == 1)
+ translateButtonObject.innerHTML = msgToSimplifiedChinese;
+ else translateButtonObject.innerHTML = msgToTraditionalChinese;
+ }
+ }
+}
+
+(function() {
+ translateInitilization()
+})()
diff --git a/themes/butterfly/source/js/utils.js b/themes/butterfly/source/js/utils.js
new file mode 100644
index 00000000..038bc5e9
--- /dev/null
+++ b/themes/butterfly/source/js/utils.js
@@ -0,0 +1,126 @@
+function debounce (func, wait, immediate) {
+ var timeout
+ return function () {
+ var context = this
+ var args = arguments
+ var later = function () {
+ timeout = null
+ if (!immediate) func.apply(context, args)
+ }
+ var callNow = immediate && !timeout
+ clearTimeout(timeout)
+ timeout = setTimeout(later, wait)
+ if (callNow) func.apply(context, args)
+ }
+};
+
+function throttle (func, wait, options) {
+ var timeout, context, args
+ var previous = 0
+ if (!options) options = {}
+
+ var later = function () {
+ previous = options.leading === false ? 0 : new Date().getTime()
+ timeout = null
+ func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+
+ var throttled = function () {
+ var now = new Date().getTime()
+ if (!previous && options.leading === false) previous = now
+ var remaining = wait - (now - previous)
+ context = this
+ args = arguments
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout)
+ timeout = null
+ }
+ previous = now
+ func.apply(context, args)
+ if (!timeout) context = args = null
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining)
+ }
+ }
+
+ return throttled
+}
+
+function sidebarPaddingR() {
+ let innerWidth = window.innerWidth
+ let clientWidth = document.body.clientWidth
+ let paddingRight = innerWidth - clientWidth
+ if (innerWidth !== clientWidth) {
+ $('body').css('padding-right', paddingRight)
+ }
+}
+
+// iPadOS
+function isIpad () {
+ return navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1
+}
+
+function isTMobile () {
+ var ua = navigator.userAgent
+ var pa = /iPad|iPhone|iPod|Android|Opera Mini|BlackBerry|webOS|UCWEB|Blazer|PSP|IEMobile|Symbian/g
+ return window.screen.width < 992 && pa.test(ua)
+}
+
+function isMobile () {
+ return this.isIpad() || this.isTMobile()
+}
+
+function isDesktop () {
+ return !this.isMobile()
+}
+
+function scrollTo (name) {
+ var scrollOffset = $(name).offset()
+ $('body,html').animate({
+ scrollTop: scrollOffset.top
+ })
+};
+
+function loadScript (url, callback) {
+ var script = document.createElement('script')
+ script.type = 'text/javascript'
+ if (script.readyState) { // IE
+ script.onreadystatechange = function () {
+ if (script.readyState === 'loaded' ||
+ script.readyState === 'complete') {
+ script.onreadystatechange = null
+ callback()
+ }
+ }
+ } else { // Others
+ script.onload = function () {
+ callback()
+ }
+ }
+ script.src = url
+ document.body.appendChild(script)
+};
+
+function snackbarShow (text, showAction, duration) {
+ var a = (typeof showAction !== 'undefined') ? showAction : false
+ var d = (typeof duration !== 'undefined') ? duration : 2000
+ var position = GLOBAL_CONFIG.Snackbar.position
+ var bg = document.documentElement.getAttribute('data-theme') === 'light' ? GLOBAL_CONFIG.Snackbar.bgLight : GLOBAL_CONFIG.Snackbar.bgDark
+ Snackbar.show({
+ text: text,
+ backgroundColor: bg,
+ showAction: a,
+ duration: d,
+ pos: position
+ })
+}
+
+window.debounce = debounce
+
+window.throttle = throttle
+
+window.isMobile = isMobile
+
+window.loadScript = loadScript
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 00000000..cb84ba5f
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,1924 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/babel-types@*", "@types/babel-types@^7.0.0":
+ version "7.0.9"
+ resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41"
+ integrity sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==
+
+"@types/babylon@^6.16.2":
+ version "6.16.5"
+ resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4"
+ integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==
+ dependencies:
+ "@types/babel-types" "*"
+
+"@types/color-name@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=
+
+JSONStream@^1.0.7:
+ version "1.3.5"
+ resolved "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
+ integrity sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=
+ dependencies:
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
+
+a-sync-waterfall@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7"
+ integrity sha1-dba2qnJZi0l6El56J3DxT0yKH6c=
+
+abbrev@1, abbrev@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=
+
+accepts@~1.3.5:
+ version "1.3.7"
+ resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80=
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+acorn-globals@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+ integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=
+ dependencies:
+ acorn "^4.0.4"
+
+acorn@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+ integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
+
+acorn@^4.0.4, acorn@~4.0.2:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+ integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
+
+acorn@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.npm.taobao.org/acorn/download/acorn-7.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
+ integrity sha1-41Zo3gtALzWd5RXFSCoaufiaab8=
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+
+ansi-regex@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+ integrity sha1-kK51xCTQCNJiTFvynq0xd+v881k=
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ color-convert "^2.0.1"
+
+anymatch@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+ integrity sha1-xV7PAhheJGklk5kxDBc84xIzsUI=
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+archy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+ integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz?cache=0&sync_timestamp=1571657259891&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fargparse%2Fdownload%2Fargparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=
+ dependencies:
+ sprintf-js "~1.0.2"
+
+asap@^2.0.3, asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+
+async@~0.2.6:
+ version "0.2.10"
+ resolved "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+ integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=
+
+babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+basic-auth@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npm.taobao.org/basic-auth/download/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
+ integrity sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=
+ dependencies:
+ safe-buffer "5.1.2"
+
+binary-extensions@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
+ integrity sha1-I8DfFPaogHf1+YbA0WfsA8PVU3w=
+
+bluebird@^3.2.2, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.5:
+ version "3.7.2"
+ resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
+ dependencies:
+ fill-range "^7.0.1"
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
+
+call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camel-case@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camel-case@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547"
+ integrity sha1-H8QchU8A4vfQE53+uhVC1olv5Uc=
+ dependencies:
+ pascal-case "^3.1.1"
+ tslib "^1.10.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+ integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+character-parser@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+ integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A=
+ dependencies:
+ is-regex "^1.0.3"
+
+chokidar@^3.0.0, chokidar@^3.3.0:
+ version "3.3.1"
+ resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.3.1.tgz?cache=0&sync_timestamp=1584609518131&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
+ integrity sha1-yE5bPRjZpNd1WP70ZrG/FrvrNFA=
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.3.0"
+ optionalDependencies:
+ fsevents "~2.1.2"
+
+clean-css@^4.1.11:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
+ integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
+ dependencies:
+ source-map "~0.6.0"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz?cache=0&sync_timestamp=1573943292170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=
+
+command-exists@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291"
+ integrity sha1-cVrO/dEiO5ybNxEKFJxjksKFIpE=
+
+commander@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npm.taobao.org/commander/download/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha1-aDfD+2d62ZM9HPukLdFNURfWs54=
+
+compressible@~2.0.16:
+ version "2.0.18"
+ resolved "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz?cache=0&sync_timestamp=1578286264482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompressible%2Fdownload%2Fcompressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+ integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=
+ dependencies:
+ mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+ integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.16"
+ debug "2.6.9"
+ on-headers "~1.0.2"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+connect@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.npm.taobao.org/connect/download/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
+ integrity sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=
+ dependencies:
+ debug "2.6.9"
+ finalhandler "1.1.2"
+ parseurl "~1.3.3"
+ utils-merge "1.0.1"
+
+constantinople@^3.0.1, constantinople@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
+ integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==
+ dependencies:
+ "@types/babel-types" "^7.0.0"
+ "@types/babylon" "^6.16.2"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+
+core-js@^2.4.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
+ integrity sha1-0Nfc+nTokRXHYZ9PchqU4f23FtY=
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-parse@1.7.x:
+ version "1.7.0"
+ resolved "https://registry.npm.taobao.org/css-parse/download/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+ integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=
+
+css-parse@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/css-parse/download/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4"
+ integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=
+ dependencies:
+ css "^2.0.0"
+
+css@^2.0.0:
+ version "2.2.4"
+ resolved "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
+ integrity sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=
+ dependencies:
+ inherits "^2.0.3"
+ source-map "^0.6.1"
+ source-map-resolve "^0.5.2"
+ urix "^0.1.0"
+
+cuid@^2.1.4:
+ version "2.1.8"
+ resolved "https://registry.npm.taobao.org/cuid/download/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0"
+ integrity sha1-y7iPlUFx4NV0dgbAE5+2XFEB6sA=
+
+debug@*:
+ version "4.1.1"
+ resolved "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=
+ dependencies:
+ ms "^2.1.1"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=
+ dependencies:
+ ms "2.0.0"
+
+debug@~3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deepmerge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz?cache=0&sync_timestamp=1572279720382&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+ integrity sha1-RNLqNnm49NT/ujPwPYZfwee/SVU=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+depd@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+doctypes@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+ integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=
+
+dom-serializer@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1573447907918&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+domelementtype@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
+ integrity sha1-H4vf6R9aeAYydOgDtL3O326U+U0=
+
+domhandler@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/domhandler/download/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
+ integrity sha1-Uc0T78ox2pW7sMW+46SDAOMzs+k=
+ dependencies:
+ domelementtype "^2.0.1"
+
+domutils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/domutils/download/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
+ integrity sha1-Fbgnjje/qEaNFXR4xYw2dxgTPAg=
+ dependencies:
+ dom-serializer "^0.2.1"
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+ejs@^2.6.1:
+ version "2.7.4"
+ resolved "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz?cache=0&sync_timestamp=1585507353335&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fejs%2Fdownload%2Fejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+ integrity sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/entities/download/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
+ integrity sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q=
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1586278520081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-2.0.0.tgz?cache=0&sync_timestamp=1586278520081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q=
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha1-GRmmp8df44ssfHflGYU12prN2kA=
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ statuses "~1.5.0"
+ unpipe "~1.0.0"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.2.tgz?cache=0&sync_timestamp=1584609355366&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
+ integrity sha1-TAofs0vGjlQ7S4Kp7Dkr+9qECAU=
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+get-intrinsic@^1.0.2:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+glob-parent@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.0.x:
+ version "7.0.6"
+ resolved "https://registry.npm.taobao.org/glob/download/glob-7.0.6.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+ integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^6.0.1:
+ version "6.0.4"
+ resolved "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+ integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.1.3:
+ version "7.1.6"
+ resolved "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1573078121947&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.3:
+ version "4.2.3"
+ resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
+ integrity sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
+
+has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hexo-bunyan@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-bunyan/download/hexo-bunyan-2.0.0.tgz#020d7a51104cc7fe50df9005020c359ac504309e"
+ integrity sha1-Ag16URBMx/5Q35AFAgw1msUEMJ4=
+ optionalDependencies:
+ moment "^2.10.6"
+ mv "~2"
+ safe-json-stringify "~1"
+
+hexo-cli@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-3.1.0.tgz#a7414d4647333fe73762f86d77e5660659c0d05b"
+ integrity sha1-p0FNRkczP+c3Yvhtd+VmBlnA0Fs=
+ dependencies:
+ abbrev "^1.1.1"
+ acorn "^7.0.0"
+ bluebird "^3.5.5"
+ chalk "^2.4.2"
+ command-exists "^1.2.8"
+ hexo-fs "^2.0.0"
+ hexo-log "^1.0.0"
+ hexo-util "^1.4.0"
+ minimist "^1.2.0"
+ resolve "^1.11.0"
+ tildify "^2.0.0"
+
+hexo-deployer-git@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hexo-deployer-git/-/hexo-deployer-git-2.1.0.tgz#2e72f05d7b318dbe29929d156ea13f9132354ff1"
+ integrity sha512-0rx8YVd1UrwD9vUzIPrB7mljLdcmUv0zRj3MAMCBxY7HqI2RM5ZEV0uKxi34qB7LYA80BNl3FWHl2ghO/tKVTA==
+ dependencies:
+ bluebird "^3.5.0"
+ chalk "^3.0.0"
+ hexo-fs "^2.0.0"
+ hexo-util "^1.0.0"
+ moment "^2.18.0"
+ swig-templates "^2.0.2"
+
+hexo-front-matter@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-1.0.0.tgz#0b48b1c1ed143e8cb25b3b223a9037385d910655"
+ integrity sha1-C0ixwe0UPoyyWzsiOpA3OF2RBlU=
+ dependencies:
+ js-yaml "^3.13.1"
+
+hexo-fs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-2.0.0.tgz#0bc421bc0c975a85a25061aca9537fb59292d279"
+ integrity sha1-C8QhvAyXWoWiUGGsqVN/tZKS0nk=
+ dependencies:
+ bluebird "^3.5.1"
+ chokidar "^3.0.0"
+ escape-string-regexp "^2.0.0"
+ graceful-fs "^4.1.11"
+
+hexo-generator-archive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-generator-archive/download/hexo-generator-archive-1.0.0.tgz#ad2afb12232a65e2f8608fc1ca3f19162fb63786"
+ integrity sha1-rSr7EiMqZeL4YI/Byj8ZFi+2N4Y=
+ dependencies:
+ hexo-pagination "1.0.0"
+
+hexo-generator-category@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-generator-category/download/hexo-generator-category-1.0.0.tgz#cd2a2b03eb326da3ef821d6e29408488cc132eb5"
+ integrity sha1-zSorA+sybaPvgh1uKUCEiMwTLrU=
+ dependencies:
+ hexo-pagination "1.0.0"
+
+hexo-generator-index@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-generator-index/download/hexo-generator-index-1.0.0.tgz#8c9f157dcfa0af4f8417f77a4eb5b3831f69a719"
+ integrity sha1-jJ8Vfc+gr0+EF/d6TrWzgx9ppxk=
+ dependencies:
+ hexo-pagination "1.0.0"
+
+hexo-generator-tag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-generator-tag/download/hexo-generator-tag-1.0.0.tgz#54ec23de9409c75584ea81e36057a59031b022f1"
+ integrity sha1-VOwj3pQJx1WE6oHjYFelkDGwIvE=
+ dependencies:
+ hexo-pagination "1.0.0"
+
+hexo-i18n@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-1.0.0.tgz#7983fb3a313e90615b84dd8fa946a71c489ef5bd"
+ integrity sha1-eYP7OjE+kGFbhN2PqUanHEie9b0=
+ dependencies:
+ sprintf-js "^1.0.3"
+
+hexo-log@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-log/download/hexo-log-1.0.0.tgz?cache=0&sync_timestamp=1576460624180&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhexo-log%2Fdownload%2Fhexo-log-1.0.0.tgz#6f0d39e0e9e76b04a4617b242c3e101d5c4283c7"
+ integrity sha1-bw054OnnawSkYXskLD4QHVxCg8c=
+ dependencies:
+ chalk "^2.4.1"
+ hexo-bunyan "^2.0.0"
+
+hexo-pagination@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-pagination/download/hexo-pagination-1.0.0.tgz#c9c0ca3665267b9e9d0a89fc3edcaf3276907dc1"
+ integrity sha1-ycDKNmUme56dCon8PtyvMnaQfcE=
+
+hexo-renderer-ejs@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-renderer-ejs/download/hexo-renderer-ejs-1.0.0.tgz#43c4de49eeae224036a457df860eb1c14c68b4b4"
+ integrity sha1-Q8TeSe6uIkA2pFffhg6xwUxotLQ=
+ dependencies:
+ ejs "^2.6.1"
+
+hexo-renderer-marked@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-renderer-marked/download/hexo-renderer-marked-2.0.0.tgz#458540b014141e7cf72145a82ec591be359cdba1"
+ integrity sha1-RYVAsBQUHnz3IUWoLsWRvjWc26E=
+ dependencies:
+ hexo-util "1.0.0"
+ marked "^0.7.0"
+ strip-indent "^3.0.0"
+
+hexo-renderer-pug@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hexo-renderer-pug/-/hexo-renderer-pug-1.0.0.tgz#e23cfa53d308a0985ae8ec2b25a4f8d24c4b4dcc"
+ integrity sha512-lzTSZvPxInGsYJGpv8Z9TQ0n1ZWI6fuSbtyvRmX5tloWPQNNdBhlDIlOsSc2KYQ28QOGuti8GkJ0wPBqLeKf8A==
+ dependencies:
+ pug "^2.0.1"
+
+hexo-renderer-stylus@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npm.taobao.org/hexo-renderer-stylus/download/hexo-renderer-stylus-1.1.0.tgz#7a0a107bcf4b74fdf88f28da2db47b8dc9e208e5"
+ integrity sha1-egoQe89LdP34jyjaLbR7jcniCOU=
+ dependencies:
+ nib "^1.1.2"
+ stylus "^0.54.5"
+
+hexo-server@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-server/download/hexo-server-1.0.0.tgz#af89fcc0a07740ad2a7f33d1d003889aab22927e"
+ integrity sha1-r4n8wKB3QK0qfzPR0AOImqsikn4=
+ dependencies:
+ bluebird "^3.5.5"
+ chalk "^2.4.2"
+ compression "^1.7.4"
+ connect "^3.7.0"
+ mime "^2.4.3"
+ morgan "^1.9.1"
+ open "^6.3.0"
+ serve-static "^1.14.1"
+
+hexo-util@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/hexo-util/download/hexo-util-1.0.0.tgz#2545efcd66e345ef92fe48a73a35470cd65f0b2a"
+ integrity sha1-JUXvzWbjRe+S/kinOjVHDNZfCyo=
+ dependencies:
+ bluebird "^3.5.2"
+ camel-case "^3.0.0"
+ cross-spawn "^6.0.5"
+ highlight.js "^9.13.1"
+ html-entities "^1.2.1"
+ striptags "^3.1.1"
+
+hexo-util@^1.0.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/hexo-util/-/hexo-util-1.9.1.tgz#15dc10d0dca474c978cdba9c20e8d0417ac993de"
+ integrity sha512-B6+nVi4Zpy7NPzlIcTLn9YBGb2Ly0q11mRzg6DyFWg0IfcrfF4tlWO0vRXqJVhvRyg+tIfUihmgypkiUW1IjNQ==
+ dependencies:
+ bluebird "^3.5.2"
+ camel-case "^4.0.0"
+ cross-spawn "^7.0.0"
+ deepmerge "^4.2.2"
+ highlight.js "^9.13.1"
+ htmlparser2 "^4.0.0"
+ prismjs "^1.17.1"
+ punycode.js "^2.1.0"
+ strip-indent "^3.0.0"
+ striptags "^3.1.1"
+
+hexo-util@^1.4.0, hexo-util@^1.8.0:
+ version "1.9.0"
+ resolved "https://registry.npm.taobao.org/hexo-util/download/hexo-util-1.9.0.tgz#0018429319720599253b2a3ddde0c5e4e4cfc652"
+ integrity sha1-ABhCkxlyBZklOyo93eDF5OTPxlI=
+ dependencies:
+ bluebird "^3.5.2"
+ camel-case "^4.0.0"
+ cross-spawn "^7.0.0"
+ deepmerge "^4.2.2"
+ highlight.js "^9.13.1"
+ htmlparser2 "^4.0.0"
+ prismjs "^1.17.1"
+ punycode.js "^2.1.0"
+ strip-indent "^3.0.0"
+ striptags "^3.1.1"
+
+hexo@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.npm.taobao.org/hexo/download/hexo-4.2.0.tgz#dd306abe801ca47623cae7c86818af4425b466ec"
+ integrity sha1-3TBqvoAcpHYjyufIaBivRCW0Zuw=
+ dependencies:
+ abbrev "^1.1.1"
+ archy "^1.0.0"
+ bluebird "^3.5.2"
+ chalk "^3.0.0"
+ hexo-cli "^3.0.0"
+ hexo-front-matter "^1.0.0"
+ hexo-fs "^2.0.0"
+ hexo-i18n "^1.0.0"
+ hexo-log "^1.0.0"
+ hexo-util "^1.8.0"
+ js-yaml "^3.12.0"
+ lodash "^4.17.11"
+ micromatch "^4.0.2"
+ moment "^2.22.2"
+ moment-timezone "^0.5.21"
+ nunjucks "^3.1.3"
+ pretty-hrtime "^1.0.3"
+ resolve "^1.8.1"
+ strip-ansi "^6.0.0"
+ strip-indent "^3.0.0"
+ swig-extras "0.0.1"
+ swig-templates "^2.0.3"
+ text-table "^0.2.0"
+ tildify "^2.0.0"
+ titlecase "^1.1.2"
+ warehouse "^3.0.1"
+
+highlight.js@^9.13.1:
+ version "9.18.5"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825"
+ integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==
+
+html-entities@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+ integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=
+
+htmlparser2@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
+ integrity sha1-mk7xYfLkYl6/ffvmwKL1LRilnng=
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+ domutils "^2.0.0"
+ entities "^2.0.0"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha1-76ouqdqg16suoTqXsritUf776L4=
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-expression@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
+ integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=
+ dependencies:
+ acorn "~4.0.2"
+ object-assign "^4.0.1"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=
+
+is-plain-object@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
+ integrity sha1-R7/F2htdUNZBEIBsGZNZSC51qSg=
+ dependencies:
+ isobject "^4.0.0"
+
+is-promise@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+ integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
+is-regex@^1.0.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npm.taobao.org/isobject/download/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
+ integrity sha1-PxyRVec7GSAiqAgZus0DQ3EWl7A=
+
+js-stringify@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+ integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds=
+
+js-yaml@^3.12.0, js-yaml@^3.13.1:
+ version "3.13.1"
+ resolved "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
+ integrity sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsonparse@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+ integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
+
+jstransformer@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+ integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=
+ dependencies:
+ is-promise "^2.0.0"
+ promise "^7.0.1"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+ integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
+
+lodash@^4.17.11:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lodash@^4.17.4:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+ integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
+
+lower-case@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+ integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+
+lower-case@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7"
+ integrity sha1-Oe6zbjlhFcwF4pQi6uqeaSyUCMc=
+ dependencies:
+ tslib "^1.10.0"
+
+markdown@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npm.taobao.org/markdown/download/markdown-0.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmarkdown%2Fdownload%2Fmarkdown-0.5.0.tgz#28205b565a8ae7592de207463d6637dc182722b2"
+ integrity sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=
+ dependencies:
+ nopt "~2.1.1"
+
+marked@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npm.taobao.org/marked/download/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
+ integrity sha1-tkIB8FHScbHtwQoE0a6bdLuOXA4=
+
+micromatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+ integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.0.5"
+
+mime-db@1.43.0, "mime-db@>= 1.43.0 < 2":
+ version "1.43.0"
+ resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.43.0.tgz?cache=0&sync_timestamp=1578281104943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
+ integrity sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=
+
+mime-types@~2.1.24:
+ version "2.1.26"
+ resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
+ integrity sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=
+ dependencies:
+ mime-db "1.43.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=
+
+mime@^2.4.3:
+ version "2.4.4"
+ resolved "https://registry.npm.taobao.org/mime/download/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
+ integrity sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=
+
+min-indent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256"
+ integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=
+
+"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
+
+minimist@~0.0.1:
+ version "0.0.10"
+ resolved "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+ integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
+
+mkdirp@0.5.x, mkdirp@~0.5.1, mkdirp@~0.5.x:
+ version "0.5.5"
+ resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=
+ dependencies:
+ minimist "^1.2.5"
+
+moment-timezone@^0.5.21:
+ version "0.5.28"
+ resolved "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338"
+ integrity sha1-8JPXidCR7XsFXYKqgagkZ/cuQzg=
+ dependencies:
+ moment ">= 2.9.0"
+
+"moment@>= 2.9.0", moment@^2.10.6, moment@^2.22.2:
+ version "2.24.0"
+ resolved "https://registry.npm.taobao.org/moment/download/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
+ integrity sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s=
+
+moment@^2.18.0:
+ version "2.29.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
+ integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
+
+morgan@^1.9.1:
+ version "1.10.0"
+ resolved "https://registry.npm.taobao.org/morgan/download/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
+ integrity sha1-CRd4q8H8R801CYJGU9rh+qtrF9c=
+ dependencies:
+ basic-auth "~2.0.1"
+ debug "2.6.9"
+ depd "~2.0.0"
+ on-finished "~2.3.0"
+ on-headers "~1.0.2"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=
+
+ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=
+
+mv@~2:
+ version "2.1.1"
+ resolved "https://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2"
+ integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=
+ dependencies:
+ mkdirp "~0.5.1"
+ ncp "~2.0.0"
+ rimraf "~2.4.0"
+
+ncp@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz?cache=0&sync_timestamp=1583168467545&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fncp%2Fdownload%2Fncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
+ integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=
+
+nib@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npm.taobao.org/nib/download/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7"
+ integrity sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=
+ dependencies:
+ stylus "0.54.5"
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=
+
+no-case@^2.2.0:
+ version "2.3.2"
+ resolved "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz?cache=0&sync_timestamp=1576721537540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+ integrity sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=
+ dependencies:
+ lower-case "^1.1.1"
+
+no-case@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npm.taobao.org/no-case/download/no-case-3.0.3.tgz?cache=0&sync_timestamp=1576721537540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8"
+ integrity sha1-whtDTB/+SLOQh+hs+00lgunfGPg=
+ dependencies:
+ lower-case "^2.0.1"
+ tslib "^1.10.0"
+
+nopt@~2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npm.taobao.org/nopt/download/nopt-2.1.2.tgz?cache=0&sync_timestamp=1583704549918&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnopt%2Fdownload%2Fnopt-2.1.2.tgz#6cccd977b80132a07731d6e8ce58c2c8303cf9af"
+ integrity sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=
+ dependencies:
+ abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=
+
+nunjucks@^3.1.3:
+ version "3.2.1"
+ resolved "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnunjucks%2Fdownload%2Fnunjucks-3.2.1.tgz#f229539281e92c6ad25d8c578c9bdb41655caf83"
+ integrity sha1-8ilTkoHpLGrSXYxXjJvbQWVcr4M=
+ dependencies:
+ a-sync-waterfall "^1.0.0"
+ asap "^2.0.3"
+ commander "^3.0.2"
+ optionalDependencies:
+ chokidar "^3.3.0"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^6.3.0:
+ version "6.4.0"
+ resolved "https://registry.npm.taobao.org/open/download/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9"
+ integrity sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=
+ dependencies:
+ is-wsl "^1.1.0"
+
+optimist@~0.6:
+ version "0.6.1"
+ resolved "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=
+
+pascal-case@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.1.tgz?cache=0&sync_timestamp=1579861579813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpascal-case%2Fdownload%2Fpascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f"
+ integrity sha1-WsGXUTPtYZKB6Ikglz0s0fJ53l8=
+ dependencies:
+ no-case "^3.0.3"
+ tslib "^1.10.0"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7:
+ version "2.2.2"
+ resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz?cache=0&sync_timestamp=1584790434095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpicomatch%2Fdownload%2Fpicomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=
+
+pretty-hrtime@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+ integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
+
+prismjs@^1.17.1:
+ version "1.25.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756"
+ integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==
+
+promise@^7.0.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
+pug-attrs@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336"
+ integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==
+ dependencies:
+ constantinople "^3.0.1"
+ js-stringify "^1.0.1"
+ pug-runtime "^2.0.5"
+
+pug-code-gen@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.3.tgz#122eb9ada9b5bf601705fe15aaa0a7d26bc134ab"
+ integrity sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==
+ dependencies:
+ constantinople "^3.1.2"
+ doctypes "^1.1.0"
+ js-stringify "^1.0.1"
+ pug-attrs "^2.0.4"
+ pug-error "^1.3.3"
+ pug-runtime "^2.0.5"
+ void-elements "^2.0.1"
+ with "^5.0.0"
+
+pug-error@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6"
+ integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==
+
+pug-filters@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7"
+ integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==
+ dependencies:
+ clean-css "^4.1.11"
+ constantinople "^3.0.1"
+ jstransformer "1.0.0"
+ pug-error "^1.3.3"
+ pug-walk "^1.1.8"
+ resolve "^1.1.6"
+ uglify-js "^2.6.1"
+
+pug-lexer@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd"
+ integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==
+ dependencies:
+ character-parser "^2.1.1"
+ is-expression "^3.0.0"
+ pug-error "^1.3.3"
+
+pug-linker@^3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb"
+ integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==
+ dependencies:
+ pug-error "^1.3.3"
+ pug-walk "^1.1.8"
+
+pug-load@^2.0.12:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b"
+ integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==
+ dependencies:
+ object-assign "^4.1.0"
+ pug-walk "^1.1.8"
+
+pug-parser@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9"
+ integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==
+ dependencies:
+ pug-error "^1.3.3"
+ token-stream "0.0.1"
+
+pug-runtime@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a"
+ integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==
+
+pug-strip-comments@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8"
+ integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==
+ dependencies:
+ pug-error "^1.3.3"
+
+pug-walk@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a"
+ integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==
+
+pug@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d"
+ integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==
+ dependencies:
+ pug-code-gen "^2.0.2"
+ pug-filters "^3.1.1"
+ pug-lexer "^4.1.0"
+ pug-linker "^3.0.6"
+ pug-load "^2.0.12"
+ pug-parser "^5.0.1"
+ pug-runtime "^2.0.5"
+ pug-strip-comments "^1.0.4"
+
+punycode.js@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npm.taobao.org/punycode.js/download/punycode.js-2.1.0.tgz#f3937f7a914152c2dc17e9c280a2cf86a26b7cda"
+ integrity sha1-85N/epFBUsLcF+nCgKLPhqJrfNo=
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=
+
+readdirp@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
+ integrity sha1-mERY0ToeQuLp9YQbEp4WLzaa/xc=
+ dependencies:
+ picomatch "^2.0.7"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.1.6:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+resolve@^1.11.0, resolve@^1.8.1:
+ version "1.15.1"
+ resolved "https://registry.npm.taobao.org/resolve/download/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
+ integrity sha1-J73N7/6vLWJEuVuw+fS0ZTRR8+g=
+ dependencies:
+ path-parse "^1.0.6"
+
+rfdc@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npm.taobao.org/rfdc/download/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2"
+ integrity sha1-unLME2egzNnPgahws7WL060H+MI=
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8=
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@~2.4.0:
+ version "2.4.5"
+ resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.4.5.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da"
+ integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=
+ dependencies:
+ glob "^6.0.1"
+
+safe-buffer@5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
+
+safe-json-stringify@~1:
+ version "1.2.0"
+ resolved "https://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd"
+ integrity sha1-NW5EvJjx+TzkXfFLzXwBzahuCv0=
+
+safer-buffer@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=
+
+sax@0.5.x:
+ version "0.5.8"
+ resolved "https://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
+ integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=
+
+sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk=
+
+semver@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1586534511518&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=
+
+semver@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586534511518&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.7.2"
+ mime "1.6.0"
+ ms "2.1.1"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+serve-static@^1.14.1:
+ version "1.14.1"
+ resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=
+
+source-map-resolve@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz?cache=0&sync_timestamp=1584829515586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-resolve%2Fdownload%2Fsource-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho=
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
+source-map@0.1.x:
+ version "0.1.43"
+ resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+ integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.6.1, source-map@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3:
+ version "0.7.3"
+ resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=
+
+source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1571657176668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+sprintf-js@^1.0.3:
+ version "1.1.2"
+ resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+ integrity sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM=
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npm.taobao.org/strip-indent/download/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=
+ dependencies:
+ min-indent "^1.0.0"
+
+striptags@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052"
+ integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==
+
+stylus@0.54.5:
+ version "0.54.5"
+ resolved "https://registry.npm.taobao.org/stylus/download/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
+ integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=
+ dependencies:
+ css-parse "1.7.x"
+ debug "*"
+ glob "7.0.x"
+ mkdirp "0.5.x"
+ sax "0.5.x"
+ source-map "0.1.x"
+
+stylus@^0.54.5:
+ version "0.54.7"
+ resolved "https://registry.npm.taobao.org/stylus/download/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2"
+ integrity sha1-xs5Hk5Ze5Ti86+UPMVN7/ATYjNI=
+ dependencies:
+ css-parse "~2.0.0"
+ debug "~3.1.0"
+ glob "^7.1.3"
+ mkdirp "~0.5.x"
+ safer-buffer "^2.1.2"
+ sax "~1.2.4"
+ semver "^6.0.0"
+ source-map "^0.7.3"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=
+ dependencies:
+ has-flag "^4.0.0"
+
+swig-extras@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npm.taobao.org/swig-extras/download/swig-extras-0.0.1.tgz#b503fede372ab9c24c6ac68caf656bcef1872328"
+ integrity sha1-tQP+3jcqucJMasaMr2VrzvGHIyg=
+ dependencies:
+ markdown "~0.5.0"
+
+swig-templates@^2.0.2, swig-templates@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.3.tgz#6b4c43b462175df2a8da857a2043379ec6ea6fd0"
+ integrity sha1-a0xDtGIXXfKo2oV6IEM3nsbqb9A=
+ dependencies:
+ optimist "~0.6"
+ uglify-js "2.6.0"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+"through@>=2.2.7 <3":
+ version "2.3.8"
+ resolved "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+tildify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npm.taobao.org/tildify/download/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
+ integrity sha1-8gXzZ01nfOaYtwZ6melJzgO0dUo=
+
+titlecase@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.3.tgz#fc6d65ff582b0602410768ef1a09b70506313dc3"
+ integrity sha1-/G1l/1grBgJBB2jvGgm3BQYxPcM=
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=
+
+token-stream@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
+ integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=
+
+tslib@^1.10.0:
+ version "1.11.1"
+ resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
+ integrity sha1-6xXRKIJ/vuKEFUnhcfRe0zisfjU=
+
+uglify-js@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz?cache=0&sync_timestamp=1585357516255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.6.0.tgz#25eaa1cc3550e39410ceefafd1cfbb6b6d15f001"
+ integrity sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=
+ dependencies:
+ async "~0.2.6"
+ source-map "~0.5.1"
+ uglify-to-browserify "~1.0.0"
+ yargs "~3.10.0"
+
+uglify-js@^2.6.1:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0=
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+ integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=
+
+unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+upper-case@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+ integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+void-elements@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+ integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
+
+warehouse@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.npm.taobao.org/warehouse/download/warehouse-3.0.2.tgz#4c02f6fcf2b33130656f3d033c44bf5673af0433"
+ integrity sha1-TAL2/PKzMTBlbz0DPES/VnOvBDM=
+ dependencies:
+ JSONStream "^1.0.7"
+ bluebird "^3.2.2"
+ cuid "^2.1.4"
+ graceful-fs "^4.1.3"
+ is-plain-object "^3.0.0"
+ rfdc "^1.1.4"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1574116720213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116720213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=
+ dependencies:
+ isexe "^2.0.0"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+ integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=
+
+with@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
+ integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=
+ dependencies:
+ acorn "^3.1.0"
+ acorn-globals "^3.0.0"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+ integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+ integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"