8&&void 0!==arguments[8]&&arguments[8];const u=e&&e.children,p=e?e.shapeFlag:0,d=t.children,{patchFlag:h,shapeFlag:f}=t;if(h>0){if(128&h)return void T(u,d,n,r,l,i,o,s,a);if(256&h)return void I(u,d,n,r,l,i,o,s,a)}8&f?(16&p&&D(u,l,i),d!==u&&c(n,d)):16&p?16&f?T(u,d,n,r,l,i,o,s,a):D(u,l,i,!0):(8&p&&c(n,""),16&f&&k(d,n,r,l,i,o,s,a))},I=(e,t,n,r,l,i,o,s,a)=>{t=t||P;const c=(e=e||P).length,u=t.length,p=Math.min(c,u);let d;for(d=0;du?D(e,l,i,!0,!1,p):k(t,n,r,l,i,o,s,a,p)},T=(e,t,n,r,l,i,o,s,a)=>{let c=0;const u=t.length;let p=e.length-1,d=u-1;for(;c<=p&&c<=d;){const r=e[c],u=t[c]=a?ol(t[c]):il(t[c]);if(!Qr(r,u))break;f(r,u,n,null,l,i,o,s,a),c++}for(;c<=p&&c<=d;){const r=e[p],c=t[d]=a?ol(t[d]):il(t[d]);if(!Qr(r,c))break;f(r,c,n,null,l,i,o,s,a),p--,d--}if(c>p){if(c<=d){const e=d+1,p=ed)for(;c<=p;)O(e[c],l,i,!0),c++;else{const h=c,g=c,m=new Map;for(c=g;c<=d;c++){const e=t[c]=a?ol(t[c]):il(t[c]);null!=e.key&&m.set(e.key,c)}let v,y=0;const w=d-g+1;let b=!1,k=0;const x=new Array(w);for(c=0;c=w){O(r,l,i,!0);continue}let u;if(null!=r.key)u=m.get(r.key);else for(v=g;v<=d;v++)if(0===x[v-g]&&Qr(r,t[v])){u=v;break}void 0===u?O(r,l,i,!0):(x[u-g]=c+1,u>=k?k=u:b=!0,f(r,t[u],n,null,l,i,o,s,a),y++)}const _=b?function(e){const t=e.slice(),n=[0];let r,l,i,o,s;const a=e.length;for(r=0;r>1,e[n[s]] 0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}(x):P;for(v=_.length-1,c=w-1;c>=0;c--){const e=g+c,p=t[e],d=e+14&&void 0!==arguments[4]?arguments[4]:null;const{el:o,type:s,transition:a,children:c,shapeFlag:u}=e;if(6&u)j(e.component.subTree,t,r,l);else if(128&u)e.suspense.move(t,r,l);else if(64&u)s.move(e,t,r,W);else if(s!==Mr)if(s!==Vr)if(2!==l&&1&u&&a)if(0===l)a.beforeEnter(o),n(o,t,r),Tr((()=>a.enter(o)),i);else{const{leave:e,delayLeave:l,afterLeave:i}=a,s=()=>n(o,t,r),c=()=>{e(o,(()=>{s(),i&&i()}))};l?l(o,s,c):c()}else n(o,t,r);else((e,t,r)=>{let l,{el:i,anchor:o}=e;for(;i&&i!==o;)l=p(i),n(i,t,r),i=l;n(o,t,r)})(e,t,r);else{n(o,t,r);for(let e=0;e3&&void 0!==arguments[3]&&arguments[3],l=arguments.length>4&&void 0!==arguments[4]&&arguments[4];const{type:i,props:o,ref:s,children:a,dynamicChildren:c,shapeFlag:u,patchFlag:p,dirs:d}=e;if(null!=s&&Ir(s,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&d,f=!Zn(e);let g;if(f&&(g=o&&o.onVnodeBeforeUnmount)&&al(g,t,e),6&u)N(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);h&&Wn(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,l,W,r):c&&(i!==Mr||p>0&&64&p)?D(c,t,n,!1,!0):(i===Mr&&384&p||!l&&16&u)&&D(a,t,n),r&&U(e)}(f&&(g=o&&o.onVnodeUnmounted)||h)&&Tr((()=>{g&&al(g,t,e),h&&Wn(e,null,t,"unmounted")}),n)},U=e=>{const{type:t,el:n,anchor:l,transition:i}=e;if(t===Mr)return void V(n,l);if(t===Vr)return void(e=>{let t,{el:n,anchor:l}=e;for(;n&&n!==l;)t=p(n),r(n),n=t;r(l)})(e);const o=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){const{leave:t,delayLeave:r}=i,l=()=>t(n,o);r?r(e.el,o,l):l()}else o()},V=(e,t)=>{let n;for(;e!==t;)n=p(e),r(e),e=n;r(t)},N=(e,t,n)=>{const{bum:r,scope:l,update:i,subTree:o,um:s}=e;r&&ve(r),l.stop(),i&&(i.active=!1,O(o,e,t,n)),s&&Tr(s,t),Tr((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},D=function(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],l=arguments.length>4&&void 0!==arguments[4]&&arguments[4];for(let i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;i6&e.shapeFlag?H(e.component.subTree):128&e.shapeFlag?e.suspense.next():p(e.anchor||e.el),B=(e,t,n)=>{null==e?t._vnode&&O(t._vnode,null,null,!0):f(t._vnode||null,e,t,null,null,null,n),$n(),Cn(),t._vnode=e},W={p:f,um:O,m:j,r:U,mt:A,mc:k,pc:L,pbc:_,n:H,o:e};let q,K;return{render:B,hydrate:q,createApp:mr(B,q)}}(e)}function Or(e,t){let{effect:n,update:r}=e;n.allowRecurse=r.allowRecurse=t}function Ur(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const r=e.children,l=t.children;if(K(r)&&K(l))for(let e=0;e0&&void 0!==arguments[0]&&arguments[0];Nr.push(Dr=e?null:[])}let Br=1;function Wr(e){Br+=e}function qr(e){return e.dynamicChildren=Br>0?Dr||P:null,Nr.pop(),Dr=Nr[Nr.length-1]||null,Br>0&&Dr&&Dr.push(e),e}function Zr(e,t,n,r,l,i){return qr(el(e,t,n,r,l,i,!0))}function Kr(e,t,n,r,l){return qr(tl(e,t,n,r,l,!0))}function Gr(e){return!!e&&!0===e.__v_isVNode}function Qr(e,t){return e.type===t.type&&e.key===t.key}const Jr="__vInternal",Xr=e=>{let{key:t}=e;return null!=t?t:null},Yr=e=>{let{ref:t,ref_key:n,ref_for:r}=e;return"number"==typeof t&&(t=""+t),null!=t?Y(t)||Yt(t)||X(t)?{i:In,r:t,k:n,f:!!r}:t:null};function el(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:e===Mr?0:1,o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],s=arguments.length>7&&void 0!==arguments[7]&&arguments[7];const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Xr(t),ref:t&&Yr(t),scopeId:Tn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:l,dynamicChildren:null,appContext:null,ctx:In};return s?(sl(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=Y(n)?8:16),Br>0&&!o&&Dr&&(a.patchFlag>0||6&i)&&32!==a.patchFlag&&Dr.push(a),a}const tl=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,i=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&e!==Yn||(e=Fr),Gr(e)){const r=nl(e,t,!0);return n&&sl(r,n),Br>0&&!i&&Dr&&(6&r.shapeFlag?Dr[Dr.indexOf(e)]=r:Dr.push(r)),r.patchFlag|=-2,r}var o;if(X(o=e)&&"__vccOpts"in o&&(e=e.__vccOpts),t){t=function(e){return e?qt(e)||Jr in e?B({},e):e:null}(t);let{class:e,style:n}=t;e&&!Y(e)&&(t.class=Ae(e)),te(n)&&(qt(n)&&!K(n)&&(n=B({},n)),t.style=xe(n))}return el(e,t,n,r,l,Y(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:te(e)?4:X(e)?2:0,i,!0)};function nl(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const{props:r,ref:l,patchFlag:i,children:o}=e,s=t?function(){const e={};for(let t=0;t0&&void 0!==arguments[0]?arguments[0]:" ",arguments.length>1&&void 0!==arguments[1]?arguments[1]:0)}function ll(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return arguments.length>1&&void 0!==arguments[1]&&arguments[1]?(Hr(),Kr(Fr,null,e)):tl(Fr,null,e)}function il(e){return null==e||"boolean"==typeof e?tl(Fr):K(e)?tl(Mr,null,e.slice()):"object"==typeof e?ol(e):tl(Pr,null,String(e))}function ol(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:nl(e)}function sl(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if(K(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),sl(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||Jr in t?3===r&&In&&(1===In.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=In}}else X(t)?(t={default:t,_ctx:In},n=32):(t=String(t),64&r?(n=16,t=[rl(t)]):n=8);e.children=t,e.shapeFlag|=n}function al(e,t,n){un(e,t,7,[n,arguments.length>3&&void 0!==arguments[3]?arguments[3]:null])}const cl=fr();let ul=0,pl=null;const dl=()=>pl||In;let hl,fl,gl="__VUE_INSTANCE_SETTERS__";(fl=ke()[gl])||(fl=ke()[gl]=[]),fl.push((e=>pl=e)),hl=e=>{fl.length>1?fl.forEach((t=>t(e))):fl[0](e)};const ml=e=>{hl(e),e.scope.on()},vl=()=>{pl&&pl.scope.off(),hl(null)};function yl(e){return 4&e.vnode.shapeFlag}let wl,bl=!1;function kl(e,t,n){X(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:te(t)&&(e.setupState=sn(t)),xl(e,n)}function xl(e,t,n){const r=e.type;if(!e.render){if(!t&&wl&&!r.render){const t=r.template||function(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:l,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,s=i.get(t);let a;return s?a=s:l.length||n||r?(a={},l.length&&l.forEach((e=>sr(a,e,o,!0))),sr(a,t,o)):a=t,te(t)&&i.set(t,a),a}(e).template;if(t){const{isCustomElement:n,compilerOptions:l}=e.appContext.config,{delimiters:i,compilerOptions:o}=r,s=B(B({isCustomElement:n,delimiters:i},l),o);r.render=wl(t,s)}}e.render=r.render||F}}function _l(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(sn(Kt(e.exposed)),{get:(t,n)=>n in t?t[n]:n in rr?rr[n](e):void 0,has:(e,t)=>t in e||t in rr}))}const $l=(e,t)=>function(e,t){let n,r,l=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=X(e);return i?(n=e,r=F):(n=e.get,r=e.set),new an(n,r,i||!r,l)}(e,0,bl);function Cl(e,t,n){const r=arguments.length;return 2===r?te(t)&&!K(t)?Gr(t)?tl(e,null,[t]):tl(e,t):tl(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&Gr(n)&&(n=[n]),tl(e,t,n))}const Sl=Symbol.for("v-scx"),Al=()=>yr(Sl),Rl="3.3.4",El="undefined"!=typeof document?document:null,zl=El&&El.createElement("template"),Ll={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const l=t?El.createElementNS("http://www.w3.org/2000/svg",e):El.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&l.setAttribute("multiple",r.multiple),l},createText:e=>El.createTextNode(e),createComment:e=>El.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>El.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,l,i){const o=n?n.previousSibling:t.lastChild;if(l&&(l===i||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),l!==i&&(l=l.nextSibling););else{zl.innerHTML=r?`${e} `:e;const l=zl.content;if(r){const e=l.firstChild;for(;e.firstChild;)l.appendChild(e.firstChild);l.removeChild(e)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Il=/\s*!important$/;function Tl(e,t,n){if(K(n))n.forEach((n=>Tl(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=Ol[t];if(n)return n;let r=pe(t);if("filter"!==r&&r in e)return Ol[t]=r;r=fe(r);for(let n=0;nFl||(Vl.then((()=>Fl=0)),Fl=Date.now()),Dl=/^on[a-z]/,Hl=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?e=>ve(t,e):t};function Bl(e){e.target.composing=!0}function Wl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ql={created(e,t,n){let{modifiers:{lazy:r,trim:l,number:i}}=t;e._assign=Hl(n);const o=i||n.props&&"number"===n.props.type;Ml(e,r?"change":"input",(t=>{if(t.target.composing)return;let n=e.value;l&&(n=n.trim()),o&&(n=we(n)),e._assign(n)})),l&&Ml(e,"change",(()=>{e.value=e.value.trim()})),r||(Ml(e,"compositionstart",Bl),Ml(e,"compositionend",Wl),Ml(e,"change",Wl))},mounted(e,t){let{value:n}=t;e.value=null==n?"":n},beforeUpdate(e,t,n){let{value:r,modifiers:{lazy:l,trim:i,number:o}}=t;if(e._assign=Hl(n),e.composing)return;if(document.activeElement===e&&"range"!==e.type){if(l)return;if(i&&e.value.trim()===r)return;if((o||"number"===e.type)&&we(e.value)===r)return}const s=null==r?"":r;e.value!==s&&(e.value=s)}},Zl={deep:!0,created(e,t,n){e._assign=Hl(n),Ml(e,"change",(()=>{const t=e._modelValue,n=Xl(e),r=e.checked,l=e._assign;if(K(t)){const e=Le(t,n),i=-1!==e;if(r&&!i)l(t.concat(n));else if(!r&&i){const n=[...t];n.splice(e,1),l(n)}}else if(Q(t)){const e=new Set(t);r?e.add(n):e.delete(n),l(e)}else l(Yl(e,r))}))},mounted:Kl,beforeUpdate(e,t,n){e._assign=Hl(n),Kl(e,t,n)}};function Kl(e,t,n){let{value:r,oldValue:l}=t;e._modelValue=r,K(r)?e.checked=Le(r,n.props.value)>-1:Q(r)?e.checked=r.has(n.props.value):r!==l&&(e.checked=ze(r,Yl(e,!0)))}const Gl={created(e,t,n){let{value:r}=t;e.checked=ze(r,n.props.value),e._assign=Hl(n),Ml(e,"change",(()=>{e._assign(Xl(e))}))},beforeUpdate(e,t,n){let{value:r,oldValue:l}=t;e._assign=Hl(n),r!==l&&(e.checked=ze(r,n.props.value))}},Ql={deep:!0,created(e,t,n){let{value:r,modifiers:{number:l}}=t;const i=Q(r);Ml(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>l?we(Xl(e)):Xl(e)));e._assign(e.multiple?i?new Set(t):t:t[0])})),e._assign=Hl(n)},mounted(e,t){let{value:n}=t;Jl(e,n)},beforeUpdate(e,t,n){e._assign=Hl(n)},updated(e,t){let{value:n}=t;Jl(e,n)}};function Jl(e,t){const n=e.multiple;if(!n||K(t)||Q(t)){for(let r=0,l=e.options.length;r-1:l.selected=t.has(i);else if(ze(Xl(l),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function Xl(e){return"_value"in e?e._value:e.value}function Yl(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const ei={created(e,t,n){ti(e,t,n,null,"created")},mounted(e,t,n){ti(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){ti(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){ti(e,t,n,r,"updated")}};function ti(e,t,n,r,l){const i=function(e,t){switch(e){case"SELECT":return Ql;case"TEXTAREA":return ql;default:switch(t){case"checkbox":return Zl;case"radio":return Gl;default:return ql}}}(e.tagName,n.props&&n.props.type)[l];i&&i(e,t,n,r)}const ni={beforeMount(e,t,n){let{value:r}=t,{transition:l}=n;e._vod="none"===e.style.display?"":e.style.display,l&&r?l.beforeEnter(e):ri(e,r)},mounted(e,t,n){let{value:r}=t,{transition:l}=n;l&&r&&l.enter(e)},updated(e,t,n){let{value:r,oldValue:l}=t,{transition:i}=n;!r!=!l&&(i?r?(i.beforeEnter(e),ri(e,!0),i.enter(e)):i.leave(e,(()=>{ri(e,!1)})):ri(e,r))},beforeUnmount(e,t){let{value:n}=t;ri(e,n)}};function ri(e,t){e.style.display=t?e._vod:"none"}const li=B({patchProp:function(e,t,n,r){let l=arguments.length>4&&void 0!==arguments[4]&&arguments[4],i=arguments.length>5?arguments[5]:void 0,o=arguments.length>6?arguments[6]:void 0,s=arguments.length>7?arguments[7]:void 0,a=arguments.length>8?arguments[8]:void 0;"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,l):"style"===t?function(e,t,n){const r=e.style,l=Y(n);if(n&&!l){if(t&&!Y(t))for(const e in t)null==n[e]&&Tl(r,e,"");for(const e in n)Tl(r,e,n[e])}else{const i=r.display;l?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):D(t)?H(t)||function(e,t,n,r){let l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null;const i=e._vei||(e._vei={}),o=i[t];if(r&&o)o.value=r;else{const[n,s]=function(e){let t;if(Pl.test(e)){let n;for(t={};n=e.match(Pl);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):he(e.slice(2)),t]}(t);if(r){const o=i[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();un(function(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=Nl(),n}(r,l);Ml(e,n,o,s)}else o&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,o,s),i[t]=void 0)}}(e,t,0,r,o):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){return r?"innerHTML"===t||"textContent"===t||!!(t in e&&Dl.test(t)&&X(n)):"spellcheck"!==t&&"draggable"!==t&&"translate"!==t&&("form"!==t&&(("list"!==t||"INPUT"!==e.tagName)&&(("type"!==t||"TEXTAREA"!==e.tagName)&&((!Dl.test(t)||!Y(n))&&t in e))))}(e,t,r,l))?function(e,t,n,r,l,i,o){if("innerHTML"===t||"textContent"===t)return r&&o(r,l,i),void(e[t]=null==n?"":n);const s=e.tagName;if("value"===t&&"PROGRESS"!==s&&!s.includes("-")){e._value=n;const r=null==n?"":n;return("OPTION"===s?e.getAttribute("value"):e.value)!==r&&(e.value=r),void(null==n&&e.removeAttribute(t))}let a=!1;if(""===n||null==n){const r=typeof e[t];"boolean"===r?n=Ee(n):null==n&&"string"===r?(n="",a=!0):"number"===r&&(n=0,a=!0)}try{e[t]=n}catch(e){}a&&e.removeAttribute(t)}(e,t,r,i,o,s,a):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,l){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(Ul,t.slice(6,t.length)):e.setAttributeNS(Ul,t,n);else{const r=Re(t);null==n||r&&!Ee(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,l))}},Ll);let ii;function oi(e){return!!Ue()&&(function(e){je&&je.cleanups.push(e)}(e),!0)}function si(e){return"function"==typeof e?e():ln(e)}const ai="undefined"!=typeof window&&"undefined"!=typeof document,ci=Object.prototype.toString,ui=e=>"[object Object]"===ci.call(e),pi=()=>{};function di(e,t){return function(){for(var n=arguments.length,r=new Array(n),l=0;l{Promise.resolve(e((()=>t.apply(this,r)),{fn:t,thisArg:this,args:r})).then(n).catch(l)}))}}const hi=e=>e();function fi(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];dl()?Gn(e):t?e():kn(e)}function gi(e){var t;const n=si(e);return null!=(t=null==n?void 0:n.$el)?t:n}const mi=ai?window:void 0,vi=ai?window.document:void 0;function yi(){let e,t,n,r;for(var l=arguments.length,i=new Array(l),o=0;o{s.forEach((e=>e())),s.length=0},c=Nn((()=>[gi(e),si(r)]),(e=>{let[r,l]=e;if(a(),!r)return;const i=ui(l)?{...l}:l;s.push(...t.flatMap((e=>n.map((t=>((e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)))(r,e,t,i))))))}),{immediate:!0,flush:"post"}),u=()=>{c(),a()};return oi(u),u}const wi="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},bi="__vueuse_ssr_handlers__",ki=(bi in wi||(wi[bi]=wi[bi]||{}),wi[bi]);const xi={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},_i="vueuse-storage";function $i(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};var l;const{flush:i="pre",deep:o=!0,listenToStorageChanges:s=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:p=mi,eventFilter:d,onError:h=(e=>{console.error(e)})}=r,f=(u?tn:en)(t);if(!n)try{n=(ki.getDefaultStorage||(()=>{var e;return null==(e=mi)?void 0:e.localStorage}))()}catch(e){h(e)}if(!n)return f;const g=si(t),m=function(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}(g),v=null!=(l=r.serializer)?l:xi[m],{pause:y,resume:w}=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{eventFilter:r,...l}=n,{eventFilter:i,pause:o,resume:s,isActive:a}=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:hi;const t=en(!0);return{isActive:Nt(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:function(){t.value&&e(...arguments)}}}(r),c=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{eventFilter:r=hi,...l}=n;return Nn(e,di(r,t),l)}(e,t,{...l,eventFilter:i});return{stop:c,pause:o,resume:s,isActive:a}}(f,(()=>function(t){try{if(null==t)n.removeItem(e);else{const r=v.write(t),l=n.getItem(e);l!==r&&(n.setItem(e,r),p&&p.dispatchEvent(new CustomEvent(_i,{detail:{key:e,oldValue:l,newValue:r,storageArea:n}})))}}catch(e){h(e)}}(f.value)),{flush:i,deep:o,eventFilter:d});return p&&s&&(yi(p,"storage",b),yi(p,_i,(function(e){b(e.detail)}))),b(),f;function b(t){if(!t||t.storageArea===n)if(t&&null==t.key)f.value=g;else if(!t||t.key===e){y();try{(null==t?void 0:t.newValue)!==v.write(f.value)&&(f.value=function(t){const r=t?t.newValue:n.getItem(e);if(null==r)return a&&null!==g&&n.setItem(e,v.write(g)),g;if(!t&&c){const e=v.read(r);return"function"==typeof c?c(e,g):"object"!==m||Array.isArray(e)?e:{...g,...e}}return"string"!=typeof r?r:v.read(r)}(t))}catch(e){h(e)}finally{t?kn(w):w()}}}}let Ci=0;const Si=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";return`${t?`${t}/`:""}${arguments.length>2&&void 0!==arguments[2]?arguments[2]:""}${e}${n?`.${n}`:""}`},Ai=e=>{"AbortError"!==e.name&&console.error(e.message)},Ri=e=>e instanceof HTMLElement?e:"string"==typeof e?document.querySelector(e):null,Ei=e=>e.type.includes("image"),zi=e=>{const t=Array.from(e).find(Ei);return t?t.getAsFile():null};let Li={async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,hooks:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1};const Ii=/[&<>"']/,Ti=new RegExp(Ii.source,"g"),ji=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Oi=new RegExp(ji.source,"g"),Ui={"&":"&","<":"<",">":">",'"':""","'":"'"},Mi=e=>Ui[e];function Pi(e,t){if(t){if(Ii.test(e))return e.replace(Ti,Mi)}else if(ji.test(e))return e.replace(Oi,Mi);return e}const Fi=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function Vi(e){return e.replace(Fi,((e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}const Ni=/(^|[^\[])\^/g;function Di(e,t){e="string"==typeof e?e:e.source,t=t||"";const n={replace:(t,r)=>(r=(r=r.source||r).replace(Ni,"$1"),e=e.replace(t,r),n),getRegex:()=>new RegExp(e,t)};return n}const Hi=/[^\w:]/g,Bi=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function Wi(e,t,n){if(e){let t;try{t=decodeURIComponent(Vi(n)).replace(Hi,"").toLowerCase()}catch(e){return null}if(0===t.indexOf("javascript:")||0===t.indexOf("vbscript:")||0===t.indexOf("data:"))return null}t&&!Bi.test(n)&&(n=function(e,t){qi[" "+e]||(Zi.test(e)?qi[" "+e]=e+"/":qi[" "+e]=Xi(e,"/",!0));const n=-1===(e=qi[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(Ki,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(Gi,"$1")+t:e+t}(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(e){return null}return n}const qi={},Zi=/^[^:]+:\/*[^/]*$/,Ki=/^([^:]+:)[\s\S]*$/,Gi=/^([^:]+:\/*[^/]*)[\s\S]*$/,Qi={exec:function(){}};function Ji(e,t){const n=e.replace(/\|/g,((e,t,n)=>{let r=!1,l=t;for(;--l>=0&&"\\"===n[l];)r=!r;return r?"|":" |"})).split(/ \|/);let r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),n.length>t)n.splice(t);else for(;n.length1;)1&t&&(n+=e),t>>=1,e+=e;return n+e}function eo(e,t,n,r){const l=t.href,i=t.title?Pi(t.title):null,o=e[1].replace(/\\([\[\]])/g,"$1");if("!"!==e[0].charAt(0)){r.state.inLink=!0;const e={type:"link",raw:n,href:l,title:i,text:o,tokens:r.inlineTokens(o)};return r.state.inLink=!1,e}return{type:"image",raw:n,href:l,title:i,text:Pi(o)}}class to{constructor(e){this.options=e||Li}space(e){const t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:Xi(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t){const n=e.match(/^(\s+)(?:```)/);if(null===n)return t;const r=n[1];return t.split("\n").map((e=>{const t=e.match(/^\s+/);if(null===t)return e;const[n]=t;return n.length>=r.length?e.slice(r.length):e})).join("\n")}(e,t[3]||"");return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline._escapes,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){const t=Xi(e,"#");this.options.pedantic?e=t.trim():t&&!/ $/.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){const e=t[0].replace(/^ *>[ \t]?/gm,""),n=this.lexer.state.top;this.lexer.state.top=!0;const r=this.lexer.blockTokens(e);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:r,text:e}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n,r,l,i,o,s,a,c,u,p,d,h,f=t[1].trim();const g=f.length>1,m={type:"list",raw:"",ordered:g,start:g?+f.slice(0,-1):"",loose:!1,items:[]};f=g?`\\d{1,9}\\${f.slice(-1)}`:`\\${f}`,this.options.pedantic&&(f=g?f:"[*+-]");const v=new RegExp(`^( {0,3}${f})((?:[\t ][^\\n]*)?(?:\\n|$))`);for(;e&&(h=!1,t=v.exec(e))&&!this.rules.block.hr.test(e);){if(n=t[0],e=e.substring(n.length),c=t[2].split("\n",1)[0].replace(/^\t+/,(e=>" ".repeat(3*e.length))),u=e.split("\n",1)[0],this.options.pedantic?(i=2,d=c.trimLeft()):(i=t[2].search(/[^ ]/),i=i>4?1:i,d=c.slice(i),i+=t[1].length),s=!1,!c&&/^ *$/.test(u)&&(n+=u+"\n",e=e.substring(u.length+1),h=!0),!h){const t=new RegExp(`^ {0,${Math.min(3,i-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),r=new RegExp(`^ {0,${Math.min(3,i-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),l=new RegExp(`^ {0,${Math.min(3,i-1)}}(?:\`\`\`|~~~)`),o=new RegExp(`^ {0,${Math.min(3,i-1)}}#`);for(;e&&(p=e.split("\n",1)[0],u=p,this.options.pedantic&&(u=u.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),!l.test(u))&&!o.test(u)&&!t.test(u)&&!r.test(e);){if(u.search(/[^ ]/)>=i||!u.trim())d+="\n"+u.slice(i);else{if(s)break;if(c.search(/[^ ]/)>=4)break;if(l.test(c))break;if(o.test(c))break;if(r.test(c))break;d+="\n"+u}s||u.trim()||(s=!0),n+=p+"\n",e=e.substring(p.length+1),c=u.slice(i)}}m.loose||(a?m.loose=!0:/\n *\n *$/.test(n)&&(a=!0)),this.options.gfm&&(r=/^\[[ xX]\] /.exec(d),r&&(l="[ ] "!==r[0],d=d.replace(/^\[[ xX]\] +/,""))),m.items.push({type:"list_item",raw:n,task:!!r,checked:l,loose:!1,text:d}),m.raw+=n}m.items[m.items.length-1].raw=n.trimRight(),m.items[m.items.length-1].text=d.trimRight(),m.raw=m.raw.trimRight();const y=m.items.length;for(o=0;o"space"===e.type)),t=e.length>0&&e.some((e=>/\n.*\n/.test(e.raw)));m.loose=t}if(m.loose)for(o=0;o$/,"$1").replace(this.rules.inline._escapes,"$1"):"",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline._escapes,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:r}}}table(e){const t=this.rules.block.table.exec(e);if(t){const e={type:"table",header:Ji(t[1]).map((e=>({text:e}))),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[]};if(e.header.length===e.align.length){e.raw=t[0];let n,r,l,i,o=e.align.length;for(n=0;n({text:e})));for(o=e.header.length,r=0;r/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):Pi(t[0]):t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;const t=Xi(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;const n=e.length;let r=0,l=0;for(;l-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],r="";if(this.options.pedantic){const e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],r=e[3])}else r=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^$/.test(e)?n.slice(1):n.slice(1,-1)),eo(t,{href:n?n.replace(this.rules.inline._escapes,"$1"):n,title:r?r.replace(this.rules.inline._escapes,"$1"):r},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let e=(n[2]||n[1]).replace(/\s+/g," ");if(e=t[e.toLowerCase()],!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return eo(n,e,n[0],this.lexer)}}emStrong(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=this.rules.inline.emStrong.lDelim.exec(e);if(!r)return;if(r[3]&&n.match(/[\p{L}\p{N}]/u))return;const l=r[1]||r[2]||"";if(!l||l&&(""===n||this.rules.inline.punctuation.exec(n))){const n=r[0].length-1;let l,i,o=n,s=0;const a="*"===r[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(a.lastIndex=0,t=t.slice(-1*e.length+n);null!=(r=a.exec(t));){if(l=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!l)continue;if(i=l.length,r[3]||r[4]){o+=i;continue}if((r[5]||r[6])&&n%3&&!((n+i)%3)){s+=i;continue}if(o-=i,o>0)continue;i=Math.min(i,i+o+s);const t=e.slice(0,n+r.index+(r[0].length-l.length)+i);if(Math.min(n,i)%2){const e=t.slice(1,-1);return{type:"em",raw:t,text:e,tokens:this.lexer.inlineTokens(e)}}const a=t.slice(2,-2);return{type:"strong",raw:t,text:a,tokens:this.lexer.inlineTokens(a)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g," ");const n=/[^ ]/.test(e),r=/^ /.test(e)&&/ $/.test(e);return n&&r&&(e=e.substring(1,e.length-1)),e=Pi(e,!0),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e,t){const n=this.rules.inline.autolink.exec(e);if(n){let e,r;return"@"===n[2]?(e=Pi(this.options.mangle?t(n[1]):n[1]),r="mailto:"+e):(e=Pi(n[1]),r=e),{type:"link",raw:n[0],text:e,href:r,tokens:[{type:"text",raw:e,text:e}]}}}url(e,t){let n;if(n=this.rules.inline.url.exec(e)){let e,r;if("@"===n[2])e=Pi(this.options.mangle?t(n[0]):n[0]),r="mailto:"+e;else{let t;do{t=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(t!==n[0]);e=Pi(n[0]),r="www."===n[1]?"http://"+n[0]:n[0]}return{type:"link",raw:n[0],text:e,href:r,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e,t){const n=this.rules.inline.text.exec(e);if(n){let e;return e=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(n[0]):Pi(n[0]):n[0]:Pi(this.options.smartypants?t(n[0]):n[0]),{type:"text",raw:n[0],text:e}}}}const no={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:Qi,lheading:/^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};no.def=Di(no.def).replace("label",no._label).replace("title",no._title).getRegex(),no.bullet=/(?:[*+-]|\d{1,9}[.)])/,no.listItemStart=Di(/^( *)(bull) */).replace("bull",no.bullet).getRegex(),no.list=Di(no.list).replace(/bull/g,no.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+no.def.source+")").getRegex(),no._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",no._comment=/|$)/,no.html=Di(no.html,"i").replace("comment",no._comment).replace("tag",no._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),no.paragraph=Di(no._paragraph).replace("hr",no.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",no._tag).getRegex(),no.blockquote=Di(no.blockquote).replace("paragraph",no.paragraph).getRegex(),no.normal={...no},no.gfm={...no.normal,table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"},no.gfm.table=Di(no.gfm.table).replace("hr",no.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",no._tag).getRegex(),no.gfm.paragraph=Di(no._paragraph).replace("hr",no.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",no.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",no._tag).getRegex(),no.pedantic={...no.normal,html:Di("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)| \\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",no._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Qi,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Di(no.normal._paragraph).replace("hr",no.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",no.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()};const ro={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Qi,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,rDelimUnd:/^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Qi,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\.5&&(n="x"+n.toString(16)),r+=""+n+";";return r}ro._punctuation="!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~",ro.punctuation=Di(ro.punctuation).replace(/punctuation/g,ro._punctuation).getRegex(),ro.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,ro.escapedEmSt=/(?:^|[^\\])(?:\\\\)*\\[*_]/g,ro._comment=Di(no._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),ro.emStrong.lDelim=Di(ro.emStrong.lDelim).replace(/punct/g,ro._punctuation).getRegex(),ro.emStrong.rDelimAst=Di(ro.emStrong.rDelimAst,"g").replace(/punct/g,ro._punctuation).getRegex(),ro.emStrong.rDelimUnd=Di(ro.emStrong.rDelimUnd,"g").replace(/punct/g,ro._punctuation).getRegex(),ro._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,ro._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,ro._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,ro.autolink=Di(ro.autolink).replace("scheme",ro._scheme).replace("email",ro._email).getRegex(),ro._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,ro.tag=Di(ro.tag).replace("comment",ro._comment).replace("attribute",ro._attribute).getRegex(),ro._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,ro._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,ro._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,ro.link=Di(ro.link).replace("label",ro._label).replace("href",ro._href).replace("title",ro._title).getRegex(),ro.reflink=Di(ro.reflink).replace("label",ro._label).replace("ref",no._label).getRegex(),ro.nolink=Di(ro.nolink).replace("ref",no._label).getRegex(),ro.reflinkSearch=Di(ro.reflinkSearch,"g").replace("reflink",ro.reflink).replace("nolink",ro.nolink).getRegex(),ro.normal={...ro},ro.pedantic={...ro.normal,strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Di(/^!?\[(label)\]\((.*?)\)/).replace("label",ro._label).getRegex(),reflink:Di(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",ro._label).getRegex()},ro.gfm={...ro.normal,escape:Di(ro.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\1&&void 0!==arguments[1]?arguments[1]:[];for(e=this.options.pedantic?e.replace(/\t/g," ").replace(/^ +$/gm,""):e.replace(/^( *)(\t+)/gm,((e,t,n)=>t+" ".repeat(n.length)));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((n=>!!(t=n.call({lexer:this},e,i))&&(e=e.substring(t.raw.length),i.push(t),!0)))))if(t=this.tokenizer.space(e))e=e.substring(t.raw.length),1===t.raw.length&&i.length>0?i[i.length-1].raw+="\n":i.push(t);else if(t=this.tokenizer.code(e))e=e.substring(t.raw.length),n=i[i.length-1],!n||"paragraph"!==n.type&&"text"!==n.type?i.push(t):(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue[this.inlineQueue.length-1].src=n.text);else if(t=this.tokenizer.fences(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.heading(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.hr(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.blockquote(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.list(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.html(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.def(e))e=e.substring(t.raw.length),n=i[i.length-1],!n||"paragraph"!==n.type&&"text"!==n.type?this.tokens.links[t.tag]||(this.tokens.links[t.tag]={href:t.href,title:t.title}):(n.raw+="\n"+t.raw,n.text+="\n"+t.raw,this.inlineQueue[this.inlineQueue.length-1].src=n.text);else if(t=this.tokenizer.table(e))e=e.substring(t.raw.length),i.push(t);else if(t=this.tokenizer.lheading(e))e=e.substring(t.raw.length),i.push(t);else{if(r=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let l;this.options.extensions.startBlock.forEach((function(e){l=e.call({lexer:this},n),"number"==typeof l&&l>=0&&(t=Math.min(t,l))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(this.state.top&&(t=this.tokenizer.paragraph(r)))n=i[i.length-1],l&&"paragraph"===n.type?(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):i.push(t),l=r.length!==e.length,e=e.substring(t.raw.length);else if(t=this.tokenizer.text(e))e=e.substring(t.raw.length),n=i[i.length-1],n&&"text"===n.type?(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):i.push(t);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,i}inline(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e){let t,n,r,l,i,o,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],a=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(l=this.tokenizer.rules.inline.reflinkSearch.exec(a));)e.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(a=a.slice(0,l.index)+"["+Yi("a",l[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(l=this.tokenizer.rules.inline.blockSkip.exec(a));)a=a.slice(0,l.index)+"["+Yi("a",l[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(l=this.tokenizer.rules.inline.escapedEmSt.exec(a));)a=a.slice(0,l.index+l[0].length-2)+"++"+a.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex),this.tokenizer.rules.inline.escapedEmSt.lastIndex--;for(;e;)if(i||(o=""),i=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((n=>!!(t=n.call({lexer:this},e,s))&&(e=e.substring(t.raw.length),s.push(t),!0)))))if(t=this.tokenizer.escape(e))e=e.substring(t.raw.length),s.push(t);else if(t=this.tokenizer.tag(e))e=e.substring(t.raw.length),n=s[s.length-1],n&&"text"===t.type&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):s.push(t);else if(t=this.tokenizer.link(e))e=e.substring(t.raw.length),s.push(t);else if(t=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(t.raw.length),n=s[s.length-1],n&&"text"===t.type&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):s.push(t);else if(t=this.tokenizer.emStrong(e,a,o))e=e.substring(t.raw.length),s.push(t);else if(t=this.tokenizer.codespan(e))e=e.substring(t.raw.length),s.push(t);else if(t=this.tokenizer.br(e))e=e.substring(t.raw.length),s.push(t);else if(t=this.tokenizer.del(e))e=e.substring(t.raw.length),s.push(t);else if(t=this.tokenizer.autolink(e,io))e=e.substring(t.raw.length),s.push(t);else if(this.state.inLink||!(t=this.tokenizer.url(e,io))){if(r=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let l;this.options.extensions.startInline.forEach((function(e){l=e.call({lexer:this},n),"number"==typeof l&&l>=0&&(t=Math.min(t,l))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(t=this.tokenizer.inlineText(r,lo))e=e.substring(t.raw.length),"_"!==t.raw.slice(-1)&&(o=t.raw.slice(-1)),i=!0,n=s[s.length-1],n&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):s.push(t);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(t.raw.length),s.push(t);return s}}class so{constructor(e){this.options=e||Li}code(e,t,n){const r=(t||"").match(/\S*/)[0];if(this.options.highlight){const t=this.options.highlight(e,r);null!=t&&t!==e&&(n=!0,e=t)}return e=e.replace(/\n$/,"")+"\n",r?''+(n?e:Pi(e,!0))+"
\n":""+(n?e:Pi(e,!0))+"
\n"}blockquote(e){return`\n${e} \n`}html(e){return e}heading(e,t,n,r){return this.options.headerIds?`\n`:`${e} \n`}hr(){return this.options.xhtml?" \n":" \n"}list(e,t,n){const r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"}listitem(e){return`${e} \n`}checkbox(e){return" "}paragraph(e){return`${e}
\n`}table(e,t){return t&&(t=`${t} `),"\n"}tablerow(e){return`\n${e} \n`}tablecell(e,t){const n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`${n}>\n`}strong(e){return`${e} `}em(e){return`${e} `}codespan(e){return`${e}
`}br(){return this.options.xhtml?" ":" "}del(e){return`${e}`}link(e,t,n){if(null===(e=Wi(this.options.sanitize,this.options.baseUrl,e)))return n;let r='"+n+" ",r}image(e,t,n){if(null===(e=Wi(this.options.sanitize,this.options.baseUrl,e)))return n;let r=` ":">",r}text(e){return e}}class ao{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,n){return""+n}image(e,t,n){return""+n}br(){return""}}class co{constructor(){this.seen={}}serialize(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}getNextSafeSlug(e,t){let n=e,r=0;if(this.seen.hasOwnProperty(n)){r=this.seen[e];do{r++,n=e+"-"+r}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=r,this.seen[n]=0),n}slug(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)}}class uo{constructor(e){this.options=e||Li,this.options.renderer=this.options.renderer||new so,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ao,this.slugger=new co}static parse(e,t){return new uo(t).parse(e)}static parseInline(e,t){return new uo(t).parseInline(e)}parse(e){let t,n,r,l,i,o,s,a,c,u,p,d,h,f,g,m,v,y,w,b=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],k="";const x=e.length;for(t=0;t0&&"paragraph"===g.tokens[0].type?(g.tokens[0].text=y+" "+g.tokens[0].text,g.tokens[0].tokens&&g.tokens[0].tokens.length>0&&"text"===g.tokens[0].tokens[0].type&&(g.tokens[0].tokens[0].text=y+" "+g.tokens[0].tokens[0].text)):g.tokens.unshift({type:"text",text:y}):f+=y),f+=this.parse(g.tokens,h),c+=this.renderer.listitem(f,v,m);k+=this.renderer.list(c,p,d);continue;case"html":k+=this.renderer.html(u.text);continue;case"paragraph":k+=this.renderer.paragraph(this.parseInline(u.tokens));continue;case"text":for(c=u.tokens?this.parseInline(u.tokens):u.text;t+1{"function"==typeof r&&(l=r,r=null);const i={...r},o=function(e,t,n){return r=>{if(r.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="An error occurred:
"+Pi(r.message+"",!0)+" ";return t?Promise.resolve(e):n?void n(null,e):e}if(t)return Promise.reject(r);if(!n)throw r;n(r)}}((r={...fo.defaults,...i}).silent,r.async,l);if(null==n)return o(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof n)return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(function(e){e&&e.sanitize&&!e.silent&&console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options")}(r),r.hooks&&(r.hooks.options=r),l){const i=r.highlight;let s;try{r.hooks&&(n=r.hooks.preprocess(n)),s=e(n,r)}catch(e){return o(e)}const a=function(e){let n;if(!e)try{r.walkTokens&&fo.walkTokens(s,r.walkTokens),n=t(s,r),r.hooks&&(n=r.hooks.postprocess(n))}catch(t){e=t}return r.highlight=i,e?o(e):l(null,n)};if(!i||i.length<3)return a();if(delete r.highlight,!s.length)return a();let c=0;return fo.walkTokens(s,(function(e){"code"===e.type&&(c++,setTimeout((()=>{i(e.text,e.lang,(function(t,n){if(t)return a(t);null!=n&&n!==e.text&&(e.text=n,e.escaped=!0),c--,0===c&&a()}))}),0))})),void(0===c&&a())}if(r.async)return Promise.resolve(r.hooks?r.hooks.preprocess(n):n).then((t=>e(t,r))).then((e=>r.walkTokens?Promise.all(fo.walkTokens(e,r.walkTokens)).then((()=>e)):e)).then((e=>t(e,r))).then((e=>r.hooks?r.hooks.postprocess(e):e)).catch(o);try{r.hooks&&(n=r.hooks.preprocess(n));const l=e(n,r);r.walkTokens&&fo.walkTokens(l,r.walkTokens);let i=t(l,r);return r.hooks&&(i=r.hooks.postprocess(i)),i}catch(e){return o(e)}}}function fo(e,t,n){return ho(oo.lex,uo.parse)(e,t,n)}fo.options=fo.setOptions=function(e){var t;return fo.defaults={...fo.defaults,...e},t=fo.defaults,Li=t,fo},fo.getDefaults=function(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,hooks:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}},fo.defaults=Li,fo.use=function(){const e=fo.defaults.extensions||{renderers:{},childTokens:{}};for(var t=arguments.length,n=new Array(t),r=0;r{const n={...t};if(n.async=fo.defaults.async||n.async||!1,t.extensions&&(t.extensions.forEach((t=>{if(!t.name)throw new Error("extension name required");if(t.renderer){const n=e.renderers[t.name];e.renderers[t.name]=n?function(){for(var e=arguments.length,r=new Array(e),l=0;l{if(fo.defaults.async)return Promise.resolve(t.hooks[n].call(e,l)).then((t=>r.call(e,t)));const i=t.hooks[n].call(e,l);return r.call(e,i)}:e[n]=function(){for(var l=arguments.length,i=new Array(l),o=0;o1&&void 0!==arguments[1]?arguments[1]:{};return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").replace(/:(.+?):/g,((t,n)=>e[n]?` `:t))},wo=e=>e.dataset.path||e.getAttribute("id"),bo=e=>{let{serverURL:t,path:n=window.location.pathname,selector:r=".waline-comment-count",lang:l=navigator.language}=e;const i=new AbortController,o=document.querySelectorAll(r);return o.length&&(e=>{let{serverURL:t,lang:n,paths:r,signal:l}=e;return fetch(`${t}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${n}`,{signal:l}).then((e=>e.json())).then((e=>Array.isArray(e)?e:[e]))})({serverURL:z(t),paths:Array.from(o).map((e=>A(e.dataset.path||e.getAttribute("id")||n))),lang:l,signal:i.signal}).then((e=>{o.forEach(((t,n)=>{t.innerText=e[n].toString()}))})).catch(Ai),i.abort.bind(i)},ko=e=>{let{size:t}=e;return Cl("svg",{class:"wl-close-icon",viewBox:"0 0 1024 1024",width:t,height:t},[Cl("path",{d:"M697.173 85.333h-369.92c-144.64 0-241.92 101.547-241.92 252.587v348.587c0 150.613 97.28 252.16 241.92 252.16h369.92c144.64 0 241.494-101.547 241.494-252.16V337.92c0-151.04-96.854-252.587-241.494-252.587z",fill:"currentColor"}),Cl("path",{d:"m640.683 587.52-75.947-75.861 75.904-75.862a37.29 37.29 0 0 0 0-52.778 37.205 37.205 0 0 0-52.779 0l-75.946 75.818-75.862-75.946a37.419 37.419 0 0 0-52.821 0 37.419 37.419 0 0 0 0 52.821l75.947 75.947-75.776 75.733a37.29 37.29 0 1 0 52.778 52.821l75.776-75.776 75.947 75.947a37.376 37.376 0 0 0 52.779-52.821z",fill:"#888"})])},xo=()=>Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},Cl("path",{d:"m341.013 394.667 27.755 393.45h271.83l27.733-393.45h64.106l-28.01 397.952a64 64 0 0 1-63.83 59.498H368.768a64 64 0 0 1-63.83-59.52l-28.053-397.93h64.128zm139.307 19.818v298.667h-64V414.485h64zm117.013 0v298.667h-64V414.485h64zM181.333 288h640v64h-640v-64zm453.483-106.667v64h-256v-64h256z",fill:"red"})),_o=()=>Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},Cl("path",{d:"M563.2 463.3 677 540c1.7 1.2 3.7 1.8 5.8 1.8.7 0 1.4-.1 2-.2 2.7-.5 5.1-2.1 6.6-4.4l25.3-37.8c1.5-2.3 2.1-5.1 1.6-7.8s-2.1-5.1-4.4-6.6l-73.6-49.1 73.6-49.1c2.3-1.5 3.9-3.9 4.4-6.6.5-2.7 0-5.5-1.6-7.8l-25.3-37.8a10.1 10.1 0 0 0-6.6-4.4c-.7-.1-1.3-.2-2-.2-2.1 0-4.1.6-5.8 1.8l-113.8 76.6c-9.2 6.2-14.7 16.4-14.7 27.5.1 11 5.5 21.3 14.7 27.4zM387 348.8h-45.5c-5.7 0-10.4 4.7-10.4 10.4v153.3c0 5.7 4.7 10.4 10.4 10.4H387c5.7 0 10.4-4.7 10.4-10.4V359.2c0-5.7-4.7-10.4-10.4-10.4zm333.8 241.3-41-20a10.3 10.3 0 0 0-8.1-.5c-2.6.9-4.8 2.9-5.9 5.4-30.1 64.9-93.1 109.1-164.4 115.2-5.7.5-9.9 5.5-9.5 11.2l3.9 45.5c.5 5.3 5 9.5 10.3 9.5h.9c94.8-8 178.5-66.5 218.6-152.7 2.4-5 .3-11.2-4.8-13.6zm186-186.1c-11.9-42-30.5-81.4-55.2-117.1-24.1-34.9-53.5-65.6-87.5-91.2-33.9-25.6-71.5-45.5-111.6-59.2-41.2-14-84.1-21.1-127.8-21.1h-1.2c-75.4 0-148.8 21.4-212.5 61.7-63.7 40.3-114.3 97.6-146.5 165.8-32.2 68.1-44.3 143.6-35.1 218.4 9.3 74.8 39.4 145 87.3 203.3.1.2.3.3.4.5l36.2 38.4c1.1 1.2 2.5 2.1 3.9 2.6 73.3 66.7 168.2 103.5 267.5 103.5 73.3 0 145.2-20.3 207.7-58.7 37.3-22.9 70.3-51.5 98.1-85 27.1-32.7 48.7-69.5 64.2-109.1 15.5-39.7 24.4-81.3 26.6-123.8 2.4-43.6-2.5-87-14.5-129zm-60.5 181.1c-8.3 37-22.8 72-43 104-19.7 31.1-44.3 58.6-73.1 81.7-28.8 23.1-61 41-95.7 53.4-35.6 12.7-72.9 19.1-110.9 19.1-82.6 0-161.7-30.6-222.8-86.2l-34.1-35.8c-23.9-29.3-42.4-62.2-55.1-97.7-12.4-34.7-18.8-71-19.2-107.9-.4-36.9 5.4-73.3 17.1-108.2 12-35.8 30-69.2 53.4-99.1 31.7-40.4 71.1-72 117.2-94.1 44.5-21.3 94-32.6 143.4-32.6 49.3 0 97 10.8 141.8 32 34.3 16.3 65.3 38.1 92 64.8 26.1 26 47.5 56 63.6 89.2 16.2 33.2 26.6 68.5 31 105.1 4.6 37.5 2.7 75.3-5.6 112.3z",fill:"currentColor"})),$o=()=>Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[Cl("path",{d:"M784 112H240c-88 0-160 72-160 160v480c0 88 72 160 160 160h544c88 0 160-72 160-160V272c0-88-72-160-160-160zm96 640c0 52.8-43.2 96-96 96H240c-52.8 0-96-43.2-96-96V272c0-52.8 43.2-96 96-96h544c52.8 0 96 43.2 96 96v480z",fill:"currentColor"}),Cl("path",{d:"M352 480c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96zm0-128c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32zm462.4 379.2-3.2-3.2-177.6-177.6c-25.6-25.6-65.6-25.6-91.2 0l-80 80-36.8-36.8c-25.6-25.6-65.6-25.6-91.2 0L200 728c-4.8 6.4-8 14.4-8 24 0 17.6 14.4 32 32 32 9.6 0 16-3.2 22.4-9.6L380.8 640l134.4 134.4c6.4 6.4 14.4 9.6 24 9.6 17.6 0 32-14.4 32-32 0-9.6-4.8-17.6-9.6-24l-52.8-52.8 80-80L769.6 776c6.4 4.8 12.8 8 20.8 8 17.6 0 32-14.4 32-32 0-8-3.2-16-8-20.8z",fill:"currentColor"})]),Co=e=>{let{active:t=!1}=e;return Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[Cl("path",{d:"M850.654 323.804c-11.042-25.625-26.862-48.532-46.885-68.225-20.022-19.61-43.258-34.936-69.213-45.73-26.78-11.124-55.124-16.727-84.375-16.727-40.622 0-80.256 11.123-114.698 32.135A214.79 214.79 0 0 0 512 241.819a214.79 214.79 0 0 0-23.483-16.562c-34.442-21.012-74.076-32.135-114.698-32.135-29.25 0-57.595 5.603-84.375 16.727-25.872 10.711-49.19 26.12-69.213 45.73-20.105 19.693-35.843 42.6-46.885 68.225-11.453 26.615-17.303 54.877-17.303 83.963 0 27.439 5.603 56.03 16.727 85.117 9.31 24.307 22.659 49.52 39.715 74.981 27.027 40.293 64.188 82.316 110.33 124.915 76.465 70.615 152.189 119.394 155.402 121.371l19.528 12.525c8.652 5.52 19.776 5.52 28.427 0l19.529-12.525c3.213-2.06 78.854-50.756 155.401-121.371 46.143-42.6 83.304-84.622 110.33-124.915 17.057-25.46 30.487-50.674 39.716-74.981 11.124-29.087 16.727-57.678 16.727-85.117.082-29.086-5.768-57.348-17.221-83.963z"+(t?"":"M512 761.5S218.665 573.55 218.665 407.767c0-83.963 69.461-152.023 155.154-152.023 60.233 0 112.473 33.618 138.181 82.727 25.708-49.109 77.948-82.727 138.18-82.727 85.694 0 155.155 68.06 155.155 152.023C805.335 573.551 512 761.5 512 761.5z"),fill:t?"red":"currentColor"})])},So=()=>Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[Cl("path",{d:"M710.816 654.301c70.323-96.639 61.084-230.578-23.705-314.843-46.098-46.098-107.183-71.109-172.28-71.109-65.008 0-126.092 25.444-172.28 71.109-45.227 46.098-70.756 107.183-70.756 172.106 0 64.923 25.444 126.007 71.194 172.106 46.099 46.098 107.184 71.109 172.28 71.109 51.414 0 100.648-16.212 142.824-47.404l126.53 126.006c7.058 7.06 16.297 10.979 26.406 10.979 10.105 0 19.343-3.919 26.402-10.979 14.467-14.467 14.467-38.172 0-52.723L710.816 654.301zm-315.107-23.265c-65.88-65.88-65.88-172.54 0-238.42 32.069-32.07 74.245-49.149 119.471-49.149 45.227 0 87.407 17.603 119.472 49.149 65.88 65.879 65.88 172.539 0 238.42-63.612 63.178-175.242 63.178-238.943 0zm0 0",fill:"currentColor"}),Cl("path",{d:"M703.319 121.603H321.03c-109.8 0-199.469 89.146-199.469 199.38v382.034c0 109.796 89.236 199.38 199.469 199.38h207.397c20.653 0 37.384-16.645 37.384-37.299 0-20.649-16.731-37.296-37.384-37.296H321.03c-68.582 0-124.352-55.77-124.352-124.267V321.421c0-68.496 55.77-124.267 124.352-124.267h382.289c68.582 0 124.352 55.771 124.352 124.267V524.72c0 20.654 16.736 37.299 37.385 37.299 20.654 0 37.384-16.645 37.384-37.299V320.549c-.085-109.8-89.321-198.946-199.121-198.946zm0 0",fill:"currentColor"})]),Ao=()=>Cl("svg",{width:"16",height:"16",ariaHidden:"true"},Cl("path",{d:"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z",fill:"currentColor"})),Ro=()=>Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},Cl("path",{d:"M810.667 213.333a64 64 0 0 1 64 64V704a64 64 0 0 1-64 64H478.336l-146.645 96.107a21.333 21.333 0 0 1-33.024-17.856V768h-85.334a64 64 0 0 1-64-64V277.333a64 64 0 0 1 64-64h597.334zm0 64H213.333V704h149.334v63.296L459.243 704h351.424V277.333zm-271.36 213.334v64h-176.64v-64h176.64zm122.026-128v64H362.667v-64h298.666z",fill:"currentColor"})),Eo=()=>Cl("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},Cl("path",{d:"M813.039 318.772L480.53 651.278H360.718V531.463L693.227 198.961C697.904 194.284 704.027 192 710.157 192C716.302 192 722.436 194.284 727.114 198.961L813.039 284.88C817.72 289.561 820 295.684 820 301.825C820 307.95 817.72 314.093 813.039 318.772ZM710.172 261.888L420.624 551.431V591.376H460.561L750.109 301.825L710.172 261.888ZM490.517 291.845H240.906V771.09H720.156V521.479C720.156 504.947 733.559 491.529 750.109 491.529C766.653 491.529 780.063 504.947 780.063 521.479V791.059C780.063 813.118 762.18 831 740.125 831H220.937C198.882 831 181 813.118 181 791.059V271.872C181 249.817 198.882 231.935 220.937 231.935H490.517C507.06 231.935 520.47 245.352 520.47 261.888C520.47 278.424 507.06 291.845 490.517 291.845Z",fill:"currentColor"})),zo=()=>Cl("svg",{class:"verified-icon",viewBox:"0 0 1024 1024",width:"14",height:"14"},Cl("path",{d:"m894.4 461.56-54.4-63.2c-10.4-12-18.8-34.4-18.8-50.4v-68c0-42.4-34.8-77.2-77.2-77.2h-68c-15.6 0-38.4-8.4-50.4-18.8l-63.2-54.4c-27.6-23.6-72.8-23.6-100.8 0l-62.8 54.8c-12 10-34.8 18.4-50.4 18.4h-69.2c-42.4 0-77.2 34.8-77.2 77.2v68.4c0 15.6-8.4 38-18.4 50l-54 63.6c-23.2 27.6-23.2 72.4 0 100l54 63.6c10 12 18.4 34.4 18.4 50v68.4c0 42.4 34.8 77.2 77.2 77.2h69.2c15.6 0 38.4 8.4 50.4 18.8l63.2 54.4c27.6 23.6 72.8 23.6 100.8 0l63.2-54.4c12-10.4 34.4-18.8 50.4-18.8h68c42.4 0 77.2-34.8 77.2-77.2v-68c0-15.6 8.4-38.4 18.8-50.4l54.4-63.2c23.2-27.6 23.2-73.2-.4-100.8zm-216-25.2-193.2 193.2a30 30 0 0 1-42.4 0l-96.8-96.8a30.16 30.16 0 0 1 0-42.4c11.6-11.6 30.8-11.6 42.4 0l75.6 75.6 172-172c11.6-11.6 30.8-11.6 42.4 0 11.6 11.6 11.6 30.8 0 42.4z",fill:"#27ae60"})),Lo=e=>{let{size:t=100}=e;return Cl("svg",{width:t,height:t,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},Cl("circle",{cx:50,cy:50,fill:"none",stroke:"currentColor",strokeWidth:"4",r:"40","stroke-dasharray":"85 30"},Cl("animateTransform",{attributeName:"transform",type:"rotate",repeatCount:"indefinite",dur:"1s",values:"0 50 50;360 50 50",keyTimes:"0;1"})))},Io=()=>Cl("svg",{width:24,height:24,fill:"currentcolor",viewBox:"0 0 24 24"},[Cl("path",{style:"transform: translateY(0.5px)",d:"M18.968 10.5H15.968V11.484H17.984V12.984H15.968V15H14.468V9H18.968V10.5V10.5ZM8.984 9C9.26533 9 9.49967 9.09367 9.687 9.281C9.87433 9.46833 9.968 9.70267 9.968 9.984V10.5H6.499V13.5H8.468V12H9.968V14.016C9.968 14.2973 9.87433 14.5317 9.687 14.719C9.49967 14.9063 9.26533 15 8.984 15H5.984C5.70267 15 5.46833 14.9063 5.281 14.719C5.09367 14.5317 5 14.2973 5 14.016V9.985C5 9.70367 5.09367 9.46933 5.281 9.282C5.46833 9.09467 5.70267 9.001 5.984 9.001H8.984V9ZM11.468 9H12.968V15H11.468V9V9Z"}),Cl("path",{d:"M18.5 3H5.75C3.6875 3 2 4.6875 2 6.75V18C2 20.0625 3.6875 21.75 5.75 21.75H18.5C20.5625 21.75 22.25 20.0625 22.25 18V6.75C22.25 4.6875 20.5625 3 18.5 3ZM20.75 18C20.75 19.2375 19.7375 20.25 18.5 20.25H5.75C4.5125 20.25 3.5 19.2375 3.5 18V6.75C3.5 5.5125 4.5125 4.5 5.75 4.5H18.5C19.7375 4.5 20.75 5.5125 20.75 6.75V18Z"})]);e.commentCount=bo;let To=null;const jo=()=>To||(To=$i("WALINE_LIKE",[]));let Oo=null;var Uo="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},Mo={},Po={},Fo={},Vo=Uo&&Uo.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(l,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function s(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?l(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}a((r=r.apply(e,t||[])).next())}))},No=Uo&&Uo.__generator||function(e,t){var n,r,l,i,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(l=2&i[0]?r.return:i[0]?r.throw||((l=r.return)&&l.call(r),0):r.next)&&!(l=l.call(r,i[1])).done)return l;switch(r=0,l&&(i=[2&i[0],l.value]),i[0]){case 0:case 1:l=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!((l=(l=o.trys).length>0&&l[l.length-1])||6!==i[0]&&2!==i[0])){o=0;continue}if(3===i[0]&&(!l||i[1]>l[0]&&i[1]Zo??(Zo=$i("WALINE_USER",{})),Go={key:0,class:"wl-reaction"},Qo=["textContent"],Jo={class:"wl-reaction-list"},Xo=["onClick"],Yo={class:"wl-reaction-img"},es=["src","alt"],ts=["textContent"],ns=["textContent"];var rs=qn({__name:"ArticleReaction",setup(e,t){let{expose:n}=t;n();const r=Oo??(Oo=$i("WALINE_REACTION",{})),l=yr("config"),i=en(-1),o=en([]),s=$l((()=>l.value.locale)),a=$l((()=>l.value.reaction.length>0)),c=$l((()=>{const{reaction:e,path:t}=l.value;return e.map(((e,n)=>({icon:e,desc:s.value[`reaction${n}`],active:r.value[t]===n})))}));let u;return Gn((()=>{Nn((()=>[l.value.serverURL,l.value.path]),(()=>{(async()=>{if(a.value){const{serverURL:e,lang:t,path:n,reaction:r}=l.value,i=new AbortController;u=i.abort.bind(i);const s=await $({serverURL:e,lang:t,paths:[n],type:r.map(((e,t)=>`reaction${t}`)),signal:i.signal});if(Array.isArray(s)||"number"==typeof s)return;o.value=r.map(((e,t)=>s[`reaction${t}`]))}})()}),{immediate:!0})})),Jn((()=>u?.())),(e,t)=>c.value.length?(Hr(),Zr("div",Go,[el("div",{class:"wl-reaction-title",textContent:Ie(s.value.reactionTitle)},null,8,Qo),el("ul",Jo,[(Hr(!0),Zr(Mr,null,tr(c.value,((e,t)=>{let{active:n,icon:s,desc:a}=e;return Hr(),Zr("li",{key:t,class:Ae(["wl-reaction-item",{active:n}]),onClick:e=>(async e=>{if(-1===i.value){const{serverURL:t,lang:n,path:s}=l.value,a=r.value[s];i.value=e,void 0!==a&&(await C({serverURL:t,lang:n,path:s,type:`reaction${a}`,action:"desc"}),o.value[a]=Math.max(o.value[a]-1,0)),a!==e&&(await C({serverURL:t,lang:n,path:s,type:`reaction${e}`}),o.value[e]=(o.value[e]||0)+1),a===e?delete r.value[s]:r.value[s]=e,i.value=-1}})(t)},[el("div",Yo,[el("img",{src:s,alt:a},null,8,es),i.value===t?(Hr(),Kr(ln(Lo),{key:0,class:"wl-reaction-loading"})):(Hr(),Zr("div",{key:1,class:"wl-reaction-votes",textContent:Ie(o.value[t]||0)},null,8,ts))]),el("div",{class:"wl-reaction-text",textContent:Ie(a)},null,8,ns)],10,Xo)})),128))])])):ll("v-if",!0)}}),ls=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n},is=ls(rs,[["__file","ArticleReaction.vue"]]),os=new Map;function ss(e){var t=os.get(e);t&&t.destroy()}function as(e){var t=os.get(e);t&&t.update()}var cs=null;"undefined"==typeof window?((cs=function(e){return e}).destroy=function(e){return e},cs.update=function(e){return e}):((cs=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],(function(e){return function(e){if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!os.has(e)){var t,n=null,r=window.getComputedStyle(e),l=(t=e.value,function(){o({testForHeightReduction:""===t||!e.value.startsWith(t),restoreTextAlign:null}),t=e.value}),i=function(t){e.removeEventListener("autosize:destroy",i),e.removeEventListener("autosize:update",s),e.removeEventListener("input",l),window.removeEventListener("resize",s),Object.keys(t).forEach((function(n){return e.style[n]=t[n]})),os.delete(e)}.bind(e,{height:e.style.height,resize:e.style.resize,textAlign:e.style.textAlign,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",i),e.addEventListener("autosize:update",s),e.addEventListener("input",l),window.addEventListener("resize",s),e.style.overflowX="hidden",e.style.wordWrap="break-word",os.set(e,{destroy:i,update:s}),s()}function o(t){var l,i,s=t.restoreTextAlign,a=void 0===s?null:s,c=t.testForHeightReduction,u=void 0===c||c,p=r.overflowY;if(0!==e.scrollHeight&&("vertical"===r.resize?e.style.resize="none":"both"===r.resize&&(e.style.resize="horizontal"),u&&(l=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push([e.parentNode,e.parentNode.scrollTop]),e=e.parentNode;return function(){return t.forEach((function(e){var t=e[0],n=e[1];t.style.scrollBehavior="auto",t.scrollTop=n,t.style.scrollBehavior=null}))}}(e),e.style.height=""),i="content-box"===r.boxSizing?e.scrollHeight-(parseFloat(r.paddingTop)+parseFloat(r.paddingBottom)):e.scrollHeight+parseFloat(r.borderTopWidth)+parseFloat(r.borderBottomWidth),"none"!==r.maxHeight&&i>parseFloat(r.maxHeight)?("hidden"===r.overflowY&&(e.style.overflow="scroll"),i=parseFloat(r.maxHeight)):"hidden"!==r.overflowY&&(e.style.overflow="hidden"),e.style.height=i+"px",a&&(e.style.textAlign=a),l&&l(),n!==i&&(e.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),n=i),p!==r.overflow&&!a)){var d=r.textAlign;"hidden"===r.overflow&&(e.style.textAlign="start"===d?"end":"start"),o({restoreTextAlign:d,testForHeightReduction:!0})}}function s(){o({testForHeightReduction:!0,restoreTextAlign:null})}}(e)})),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],ss),e},cs.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],as),e});var us=cs;const ps=["data-index"],ds=["src","title","onClick"];var hs=qn({__name:"ImageWall",props:{items:{default:()=>[]},columnWidth:{default:300},gap:{default:0}},emits:["insert"],setup(e,t){let{expose:n}=t;const r=e;n();let l=null;const i=en(null),o=en({}),s=en([]),a=()=>{const e=Math.floor((i.value.getBoundingClientRect().width+r.gap)/(r.columnWidth+r.gap));return e>0?e:1},c=async e=>{if(e>=r.items.length)return;await kn();const t=Array.from(i.value?.children||[]).reduce(((e,t)=>t.getBoundingClientRect().height0&&void 0!==arguments[0]&&arguments[0];if(s.value.length===a()&&!e)return;var t;s.value=(t=a(),new Array(t).fill(null).map((()=>[])));const n=window.scrollY;await c(0),window.scrollTo({top:n})},p=e=>{o.value[e.target.src]=!0};return Gn((()=>{u(!0),l=new ResizeObserver((()=>{u()})),l.observe(i.value),Nn((()=>[r.items]),(()=>{o.value={},u(!0)})),Nn((()=>[r.columnWidth,r.gap]),(()=>{u()}))})),Qn((()=>l.unobserve(i.value))),(e,t)=>(Hr(),Zr("div",{ref_key:"wall",ref:i,class:"wl-gallery",style:xe({gap:`${e.gap}px`})},[(Hr(!0),Zr(Mr,null,tr(s.value,((t,n)=>(Hr(),Zr("div",{key:n,class:"wl-gallery-column","data-index":n,style:xe({gap:`${e.gap}px`})},[(Hr(!0),Zr(Mr,null,tr(t,(t=>(Hr(),Zr(Mr,{key:t},[o.value[e.items[t].src]?ll("v-if",!0):(Hr(),Kr(ln(Lo),{key:0,size:36,style:{margin:"20px auto"}})),el("img",{class:"wl-gallery-item",src:e.items[t].src,title:e.items[t].title,loading:"lazy",onLoad:p,onClick:n=>e.$emit("insert",`![](${e.items[t].src})`)},null,40,ds)],64)))),128))],12,ps)))),128))],4))}}),fs=ls(hs,[["__file","ImageWall.vue"]]);const gs={class:"wl-comment"},ms={key:0,class:"wl-login-info"},vs={class:"wl-avatar"},ys=["title"],ws=["title"],bs=["src"],ks=["title","textContent"],xs={class:"wl-panel"},_s=["for","textContent"],$s=["id","onUpdate:modelValue","name","type"],Cs=["placeholder"],Ss={class:"wl-preview"},As=el("hr",null,null,-1),Rs=["innerHTML"],Es={class:"wl-footer"},zs={class:"wl-actions"},Ls={href:"https://guides.github.com/features/mastering-markdown/",title:"Markdown Guide","aria-label":"Markdown is supported",class:"wl-action",target:"_blank",rel:"noopener noreferrer"},Is=["title"],Ts=["title"],js=["title"],Os=["title"],Us={class:"wl-info"},Ms=el("div",{class:"wl-captcha-container"},null,-1),Ps={class:"wl-text-number"},Fs={key:0},Vs=["textContent"],Ns=["textContent"],Ds=["disabled"],Hs=["placeholder"],Bs={key:1,class:"wl-loading"},Ws={key:0,class:"wl-tab-wrapper"},qs=["title","onClick"],Zs=["src","alt"],Ks={key:0,class:"wl-tabs"},Gs=["onClick"],Qs=["src","alt","title"],Js=["title"];var Xs=qn({__name:"CommentBox",props:{edit:{default:null},rootId:{default:""},replyId:{default:""},replyUser:{default:""}},emits:["log","cancelEdit","cancelReply","submit"],setup(e,t){let{expose:n,emit:r}=t;const l=e;n();const i=yr("config"),o=$i("WALINE_COMMENT_BOX_EDITOR",""),s=$i("WALINE_USER_META",{nick:"",mail:"",link:""}),a=Ko(),c=en({}),u=en(null),p=en(null),d=en(null),h=en(null),f=en(null),g=en(null),m=en(null),v=en({tabs:[],map:{}}),y=en(0),w=en(!1),b=en(!1),k=en(!1),x=en(""),_=en(0),$=Vt({loading:!0,list:[]}),C=en(0),A=en(!1),E=en(""),z=en(!1),L=en(!1),I=$l((()=>i.value.locale)),T=$l((()=>Boolean(a.value?.token))),j=$l((()=>!1!==i.value.imageUploader)),U=e=>{const t=u.value,n=t.selectionStart,r=t.selectionEnd||0,l=t.scrollTop;o.value=t.value.substring(0,n)+e+t.value.substring(r,t.value.length),t.focus(),t.selectionStart=n+e.length,t.selectionEnd=n+e.length,t.scrollTop=l},M=e=>{const t=e.key;(e.ctrlKey||e.metaKey)&&"Enter"===t&&D()},P=e=>{const t=`![${i.value.locale.uploading} ${e.name}]()`;return U(t),z.value=!0,Promise.resolve().then((()=>i.value.imageUploader(e))).then((n=>{o.value=o.value.replace(t,`\r\n![${e.name}](${n})`)})).catch((e=>{alert(e.message),o.value=o.value.replace(t,"")})).then((()=>{z.value=!1}))},F=e=>{if(e.dataTransfer?.items){const t=zi(e.dataTransfer.items);t&&j.value&&(P(t),e.preventDefault())}},V=e=>{if(e.clipboardData){const t=zi(e.clipboardData.items);t&&j.value&&P(t)}},N=()=>{const e=p.value;e.files&&j.value&&P(e.files[0]).then((()=>{e.value=""}))},D=async()=>{const{serverURL:e,lang:t,login:n,wordLimit:p,requiredMeta:d,recaptchaV3Key:h,turnstileKey:f}=i.value,g=await(async()=>{if(!navigator)return"";const{userAgentData:e}=navigator;let t=navigator.userAgent;if(!e||"Windows"!==e.platform)return t;const{platformVersion:n}=await e.getHighEntropyValues(["platformVersion"]);return n?(parseInt(n.split(".")[0])>=13&&(t=t.replace("Windows NT 10.0","Windows NT 11.0")),t):t})(),m={comment:E.value,nick:s.value.nick,mail:s.value.mail,link:s.value.link,url:i.value.path,ua:g};if(a.value?.token)m.nick=a.value.display_name,m.mail=a.value.email,m.link=a.value.url;else{if("force"===n)return;if(d.indexOf("nick")>-1&&!m.nick)return c.value.nick?.focus(),alert(I.value.nickError);if(d.indexOf("mail")>-1&&!m.mail||m.mail&&(y=m.mail,!O.test(y)))return c.value.mail?.focus(),alert(I.value.mailError);m.nick||(m.nick=I.value.anonymous)}var y;if(m.comment){if(!A.value)return alert(I.value.wordHint.replace("$0",p[0].toString()).replace("$1",p[1].toString()).replace("$2",_.value.toString()));m.comment=yo(m.comment,v.value.map),l.replyId&&l.rootId&&(m.pid=l.replyId,m.rid=l.rootId,m.at=l.replyUser),z.value=!0;try{h&&(m.recaptchaV3=await(e=>{const t=qo[e]??(qo[e]=Mo.load(e,{useRecaptchaNet:!0,autoHideBadge:!0}));return{execute:e=>t.then((t=>t.execute(e)))}})(h).execute("social")),f&&(m.turnstile=await(w=f,{execute:async e=>{const{load:t}=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:pi,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{immediate:r=!0,manual:l=!1,type:i="text/javascript",async:o=!0,crossOrigin:s,referrerPolicy:a,noModule:c,defer:u,document:p=vi,attrs:d={}}=n,h=en(null);let f=null;const g=function(){return f||(f=(n=>new Promise(((r,l)=>{const f=e=>(h.value=e,r(e),e);if(!p)return void r(!1);let g=!1,m=p.querySelector(`script[src="${si(e)}"]`);m?m.hasAttribute("data-loaded")&&f(m):(m=p.createElement("script"),m.type=i,m.async=o,m.src=si(e),u&&(m.defer=u),s&&(m.crossOrigin=s),c&&(m.noModule=c),a&&(m.referrerPolicy=a),Object.entries(d).forEach((e=>{let[t,n]=e;return null==m?void 0:m.setAttribute(t,n)})),g=!0),m.addEventListener("error",(e=>l(e))),m.addEventListener("abort",(e=>l(e))),m.addEventListener("load",(()=>{m.setAttribute("data-loaded","true"),t(m),f(m)})),g&&(m=p.head.appendChild(m)),n||f(m)})))(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])),f},m=()=>{if(!p)return;f=null,h.value&&(h.value=null);const t=p.querySelector(`script[src="${si(e)}"]`);t&&p.head.removeChild(t)};var v;return r&&!l&&fi(g),l||(v=m,dl()&&Jn(v)),{scriptTag:h,load:g,unload:m}}("https://challenges.cloudflare.com/turnstile/v0/api.js",void 0,{async:!1});await t();const n=window?.turnstile;return new Promise((t=>{n?.ready((()=>{n?.render(".wl-captcha-container",{sitekey:w,action:e,size:"compact",callback:t})}))}))}}).execute("social"));const n={serverURL:e,lang:t,token:a.value?.token,comment:m},i=await(l.edit?S({objectId:l.edit.objectId,...n}):(e=>{let{serverURL:t,lang:n,token:r,comment:l}=e;const i={"Content-Type":"application/json"};return r&&(i.Authorization=`Bearer ${r}`),fetch(`${t}/comment?lang=${n}`,{method:"POST",headers:i,body:JSON.stringify(l)}).then((e=>e.json()))})(n));if(z.value=!1,i.errmsg)return alert(i.errmsg);r("submit",i.data),o.value="",x.value="",l.replyId&&r("cancelReply"),l.edit?.objectId&&r("cancelEdit")}catch(e){z.value=!1,alert(e.message)}var w}else u.value?.focus()},H=e=>{e.preventDefault();const{lang:t,serverURL:n}=i.value;(e=>{let{lang:t,serverURL:n}=e;const r=(window.innerWidth-450)/2,l=(window.innerHeight-450)/2,i=window.open(`${n}/ui/login?lng=${encodeURIComponent(t)}`,"_blank",`width=450,height=450,left=${r},top=${l},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return i?.postMessage({type:"TOKEN",data:null},"*"),new Promise((e=>{const t=n=>{let{data:r}=n;r&&"object"==typeof r&&"userInfo"===r.type&&r.data.token&&(i?.close(),window.removeEventListener("message",t),e(r.data))};window.addEventListener("message",t)}))})({serverURL:n,lang:t}).then((e=>{a.value=e,(e.remember?localStorage:sessionStorage).setItem("WALINE_USER",JSON.stringify(e)),r("log")}))},B=()=>{a.value={},localStorage.setItem("WALINE_USER","null"),sessionStorage.setItem("WALINE_USER","null"),r("log")},W=e=>{e.preventDefault();const{lang:t,serverURL:n}=i.value,r=(window.innerWidth-800)/2,l=(window.innerHeight-800)/2,o=new URLSearchParams({lng:t,token:a.value.token}),s=window.open(`${n}/ui/profile?${o.toString()}`,"_blank",`width=800,height=800,left=${r},top=${l},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);s?.postMessage({type:"TOKEN",data:a.value.token},"*")},q=e=>{d.value?.contains(e.target)||h.value?.contains(e.target)||(w.value=!1),f.value?.contains(e.target)||g.value?.contains(e.target)||(b.value=!1)},Z=async e=>{const{scrollTop:t,clientHeight:n,scrollHeight:r}=e.target,l=(n+t)/r,o=i.value.search,s=m.value?.value||"";l<.9||$.loading||L.value||($.loading=!0,(o.more&&$.list.length?await o.more(s,$.list.length):await o.search(s)).length?$.list=[...$.list,...o.more&&$.list.length?await o.more(s,$.list.length):await o.search(s)]:L.value=!0,$.loading=!1,setTimeout((()=>{e.target.scrollTop=t}),50))},K=function(e){return di(function(e){let t,n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},l=pi;const i=e=>{clearTimeout(e),l(),l=pi};return o=>{const s=si(e),a=si(r.maxWait);return t&&i(t),s<=0||void 0!==a&&a<=0?(n&&(i(n),n=null),Promise.resolve(o())):new Promise(((e,c)=>{l=r.rejectOnCancel?c:e,a&&!n&&(n=setTimeout((()=>{t&&i(t),n=null,e(o())}),a)),t=setTimeout((()=>{n&&i(n),n=null,e(o())}),s)}))}}(arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}),e)}((e=>{$.list=[],L.value=!1,Z(e)}),300);Nn([i,_],(e=>{let[t,n]=e;const{wordLimit:r}=t;r?nr[1]?(C.value=r[1],A.value=!1):(C.value=r[1],A.value=!0):(C.value=0,A.value=!0)}),{immediate:!0});const G=e=>{let{data:t}=e;t&&"profile"===t.type&&(a.value={...a.value,...t.data},[localStorage,sessionStorage].filter((e=>e.getItem("WALINE_USER"))).forEach((e=>e.setItem("WALINE_USER",JSON.stringify(a)))))};return Gn((()=>{document.body.addEventListener("click",q),window.addEventListener("message",G),l.edit?.objectId&&(o.value=l.edit.orig),Nn(b,(async e=>{if(!e)return;const t=i.value.search;m.value&&(m.value.value=""),$.loading=!0,$.list=t.default?await t.default():await t.search(""),$.loading=!1})),Nn((()=>o.value),(e=>{const{highlighter:t,texRenderer:n}=i.value;E.value=e,x.value=((e,t)=>{let{emojiMap:n,highlighter:r,texRenderer:l}=t;if(fo.setOptions({highlight:r||void 0,breaks:!0,smartLists:!0,smartypants:!0}),l){const e=(e=>[{name:"blockMath",level:"block",tokenizer(t){const n=vo.exec(t);if(null!==n)return{type:"html",raw:n[0],text:e(!0,n[1])}}},{name:"inlineMath",level:"inline",start(e){const t=e.search(go);return-1!==t?t:e.length},tokenizer(t){const n=mo.exec(t);if(null!==n)return{type:"html",raw:n[0],text:e(!1,n[1])}}}])(l);fo.use({extensions:e})}return fo.parse(yo(e,n))})(e,{emojiMap:v.value.map,highlighter:t,texRenderer:n}),_.value=(e=>((e=>e.match(/[\w\d\s,.\u00C0-\u024F\u0400-\u04FF]+/giu))(e)?.reduce(((e,t)=>e+(""===t.trim()?0:t.trim().split(/\s+/u).length)),0)||0)+((e=>e.match(/[\u4E00-\u9FD5]/gu))(e)?.length||0))(e),e?us(u.value):us.destroy(u.value)}),{immediate:!0}),Nn((()=>i.value.emoji),(e=>{return(t=e,Promise.all(t.map((e=>"string"==typeof e?(e=>{const t=$i("WALINE_EMOJI",{}),n=Boolean(/@[0-9]+\.[0-9]+\.[0-9]+/.test(e));if(n){const n=t.value[e];if(n)return Promise.resolve(n)}return fetch(`${e}/info.json`).then((e=>e.json())).then((r=>{const l={folder:e,...r};return n&&(t.value[e]=l),l}))})(R(e)):Promise.resolve(e)))).then((e=>{const t={tabs:[],map:{}};return e.forEach((e=>{const{name:n,folder:r,icon:l,prefix:i,type:o,items:s}=e;t.tabs.push({name:n,icon:Si(l,r,i,o),items:s.map((e=>{const n=`${i||""}${e}`;return t.map[n]=Si(e,r,i,o),n}))})})),t}))).then((e=>{v.value=e}));var t}),{immediate:!0})})),Jn((()=>{document.body.removeEventListener("click",q),window.removeEventListener("message",G)})),(e,t)=>(Hr(),Zr("div",gs,["disable"!==ln(i).login&&T.value&&!e.edit?.objectId?(Hr(),Zr("div",ms,[el("div",vs,[el("button",{type:"submit",class:"wl-logout-btn",title:I.value.logout,onClick:B},[tl(ln(ko),{size:14})],8,ys),el("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:I.value.profile,onClick:W},[el("img",{src:ln(a).avatar,alt:"avatar"},null,8,bs)],8,ws)]),el("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:I.value.profile,onClick:W,textContent:Ie(ln(a).display_name)},null,8,ks)])):ll("v-if",!0),el("div",xs,["force"!==ln(i).login&&ln(i).meta.length&&!T.value?(Hr(),Zr("div",{key:0,class:Ae(["wl-header",`item${ln(i).meta.length}`])},[(Hr(!0),Zr(Mr,null,tr(ln(i).meta,(e=>(Hr(),Zr("div",{key:e,class:"wl-header-item"},[el("label",{for:`wl-${e}`,textContent:Ie(I.value[e]+(ln(i).requiredMeta.includes(e)||!ln(i).requiredMeta.length?"":`(${I.value.optional})`))},null,8,_s),Bn(el("input",{id:`wl-${e}`,ref_for:!0,ref:t=>{t&&(c.value[e]=t)},"onUpdate:modelValue":t=>ln(s)[e]=t,class:Ae(["wl-input",`wl-${e}`]),name:e,type:"mail"===e?"email":"text"},null,10,$s),[[ei,ln(s)[e]]])])))),128))],2)):ll("v-if",!0),Bn(el("textarea",{id:"wl-edit",ref_key:"editorRef",ref:u,"onUpdate:modelValue":t[0]||(t[0]=e=>Yt(o)?o.value=e:null),class:"wl-editor",placeholder:e.replyUser?`@${e.replyUser}`:I.value.placeholder,onKeydown:M,onDrop:F,onPaste:V},null,40,Cs),[[ql,ln(o)]]),Bn(el("div",Ss,[As,el("h4",null,Ie(I.value.preview)+":",1),el("div",{class:"wl-content",innerHTML:x.value},null,8,Rs)],512),[[ni,k.value]]),el("div",Es,[el("div",zs,[el("a",Ls,[tl(ln(Ao))]),Bn(el("button",{ref_key:"emojiButtonRef",ref:d,type:"button",class:Ae(["wl-action",{active:w.value}]),title:I.value.emoji,onClick:t[1]||(t[1]=e=>w.value=!w.value)},[tl(ln(_o))],10,Is),[[ni,v.value.tabs.length]]),ln(i).search?(Hr(),Zr("button",{key:0,ref_key:"gifButtonRef",ref:f,type:"button",class:Ae(["wl-action",{active:b.value}]),title:I.value.gif,onClick:t[2]||(t[2]=e=>b.value=!b.value)},[tl(ln(Io))],10,Ts)):ll("v-if",!0),el("input",{id:"wl-image-upload",ref_key:"imageUploadRef",ref:p,class:"upload",type:"file",accept:".png,.jpg,.jpeg,.webp,.bmp,.gif",onChange:N},null,544),j.value?(Hr(),Zr("label",{key:1,for:"wl-image-upload",class:"wl-action",title:I.value.uploadImage},[tl(ln($o))],8,js)):ll("v-if",!0),el("button",{type:"button",class:Ae(["wl-action",{active:k.value}]),title:I.value.preview,onClick:t[3]||(t[3]=e=>k.value=!k.value)},[tl(ln(So))],10,Os)]),el("div",Us,[Ms,el("div",Ps,[rl(Ie(_.value)+" ",1),ln(i).wordLimit?(Hr(),Zr("span",Fs,[rl(" / "),el("span",{class:Ae({illegal:!A.value}),textContent:Ie(C.value)},null,10,Vs)])):ll("v-if",!0),rl(" "+Ie(I.value.word),1)]),"disable"===ln(i).login||T.value?ll("v-if",!0):(Hr(),Zr("button",{key:0,type:"button",class:"wl-btn",onClick:H,textContent:Ie(I.value.login)},null,8,Ns)),"force"!==ln(i).login||T.value?(Hr(),Zr("button",{key:1,type:"submit",class:"primary wl-btn",title:"Cmd|Ctrl + Enter",disabled:z.value,onClick:D},[z.value?(Hr(),Kr(ln(Lo),{key:0,size:16})):(Hr(),Zr(Mr,{key:1},[rl(Ie(I.value.submit),1)],64))],8,Ds)):ll("v-if",!0)]),el("div",{ref_key:"gifPopupRef",ref:g,class:Ae(["wl-gif-popup",{display:b.value}])},[el("input",{ref_key:"gifSearchInputRef",ref:m,type:"text",placeholder:I.value.gifSearchPlaceholder,onInput:t[4]||(t[4]=function(){return ln(K)&&ln(K)(...arguments)})},null,40,Hs),$.list.length?(Hr(),Kr(fs,{key:0,items:$.list,"column-width":200,gap:6,onInsert:t[5]||(t[5]=e=>U(e)),onScroll:Z},null,8,["items"])):ll("v-if",!0),$.loading?(Hr(),Zr("div",Bs,[tl(ln(Lo),{size:30})])):ll("v-if",!0)],2),el("div",{ref_key:"emojiPopupRef",ref:h,class:Ae(["wl-emoji-popup",{display:w.value}])},[(Hr(!0),Zr(Mr,null,tr(v.value.tabs,((e,t)=>(Hr(),Zr(Mr,{key:e.name},[t===y.value?(Hr(),Zr("div",Ws,[(Hr(!0),Zr(Mr,null,tr(e.items,(e=>(Hr(),Zr("button",{key:e,type:"button",title:e,onClick:t=>U(`:${e}:`)},[w.value?(Hr(),Zr("img",{key:0,class:"wl-emoji",src:v.value.map[e],alt:e,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Zs)):ll("v-if",!0)],8,qs)))),128))])):ll("v-if",!0)],64)))),128)),v.value.tabs.length>1?(Hr(),Zr("div",Ks,[(Hr(!0),Zr(Mr,null,tr(v.value.tabs,((e,t)=>(Hr(),Zr("button",{key:e.name,type:"button",class:Ae(["wl-tab",{active:y.value===t}]),onClick:e=>y.value=t},[el("img",{class:"wl-emoji",src:e.icon,alt:e.name,title:e.name,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Qs)],10,Gs)))),128))])):ll("v-if",!0)],2)])]),e.replyId||e.edit?.objectId?(Hr(),Zr("button",{key:1,type:"button",class:"wl-close",title:I.value.cancelReply,onClick:t[6]||(t[6]=t=>e.$emit(e.replyId?"cancelReply":"cancelEdit"))},[tl(ln(ko),{size:24})],8,Js)):ll("v-if",!0)]))}}),Ys=ls(Xs,[["__file","CommentBox.vue"]]);const ea=["id"],ta={class:"wl-user","aria-hidden":"true"},na=["src"],ra={class:"wl-card"},la={class:"wl-head"},ia=["href"],oa={key:1,class:"wl-nick"},sa=["textContent"],aa=["textContent"],ca=["textContent"],ua=["textContent"],pa=["textContent"],da={class:"wl-comment-actions"},ha=["title"],fa=["textContent"],ga=["title"],ma={class:"wl-meta","aria-hidden":"true"},va=["data-value","textContent"],ya=["data-value","textContent"],wa=["data-value","textContent"],ba=["innerHTML"],ka={key:1,class:"wl-admin-actions"},xa={class:"wl-comment-status"},_a=["disabled","onClick","textContent"],$a={key:3,class:"wl-quote"};var Ca=ls(qn({__name:"CommentCard",props:{comment:{},edit:{default:null},rootId:{},reply:{default:null}},emits:["log","submit","delete","edit","like","status","sticky","reply"],setup(e){const t=e,n=["approved","waiting","spam"],r=yr("config"),l=jo(),i=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{controls:t=!1,interval:n="requestAnimationFrame"}=e,r=en(new Date),l=()=>r.value=new Date,i="requestAnimationFrame"===n?function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{immediate:n=!0,window:r=mi}=t,l=en(!1);let i=0,o=null;function s(t){l.value&&r&&(e({delta:t-(i||t),timestamp:t}),i=t,o=r.requestAnimationFrame(s))}function a(){!l.value&&r&&(l.value=!0,o=r.requestAnimationFrame(s))}function c(){l.value=!1,null!=o&&r&&(r.cancelAnimationFrame(o),o=null)}return n&&a(),oi(c),{isActive:Nt(l),pause:c,resume:a}}(l,{immediate:!0}):function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{immediate:r=!0,immediateCallback:l=!1}=n;let i=null;const o=en(!1);function s(){i&&(clearInterval(i),i=null)}function a(){o.value=!1,s()}function c(){const n=si(t);n<=0||(o.value=!0,l&&e(),s(),i=setInterval(e,n))}return r&&ai&&c(),(Yt(t)||"function"==typeof t)&&oi(Nn(t,(()=>{o.value&&ai&&c()}))),oi(a),{isActive:o,pause:a,resume:c}}(l,n,{immediate:!0});return t?{now:r,...i}:r}(),o=Ko(),s=$l((()=>r.value.locale)),a=$l((()=>{const{link:e}=t.comment;return e?E(e)?e:`https://${e}`:""})),c=$l((()=>l.value.includes(t.comment.objectId))),u=$l((()=>((e,t,n)=>{if(!e)return"";const r="string"==typeof e?new Date(-1!==e.indexOf(" ")?e.replace(/-/g,"/"):e):e,l=t.getTime()-r.getTime(),i=Math.floor(l/864e5);if(0===i){const e=l%864e5,t=Math.floor(e/36e5);if(0===t){const t=e%36e5,r=Math.floor(t/6e4);if(0===r){const e=t%6e4;return`${Math.round(e/1e3)} ${n.seconds}`}return`${r} ${n.minutes}`}return`${t} ${n.hours}`}return i<0?n.now:i<8?`${i} ${n.days}`:(e=>{const t=j(e.getDate(),2),n=j(e.getMonth()+1,2);return`${j(e.getFullYear(),2)}-${n}-${t}`})(r)})(t.comment.insertedAt,i.value,s.value))),p=$l((()=>"administrator"===o.value.type)),d=$l((()=>t.comment.user_id&&o.value.objectId===t.comment.user_id)),h=$l((()=>t.comment.objectId===t.reply?.objectId)),f=$l((()=>t.comment.objectId===t.edit?.objectId));return(e,t)=>{const r=function(e,t){return function(e,t){let n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];const r=In||pl;if(r){const l=r.type;if(e===Xn){const e=function(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return X(e)?e.displayName||e.name:e.name||t&&e.__name}(l,!1);if(e&&(e===t||e===pe(t)||e===fe(pe(t))))return l}const i=er(r[e]||l[e],t)||er(r.appContext[e],t);return!i&&n?l:i}}(Xn,e,!0,t)||e}("CommentCard",!0);return Hr(),Zr("div",{id:e.comment.objectId,class:"wl-card-item"},[el("div",ta,[e.comment.avatar?(Hr(),Zr("img",{key:0,src:e.comment.avatar},null,8,na)):ll("v-if",!0),e.comment.type?(Hr(),Kr(ln(zo),{key:1})):ll("v-if",!0)]),el("div",ra,[el("div",la,[a.value?(Hr(),Zr("a",{key:0,class:"wl-nick",href:a.value,target:"_blank",rel:"nofollow noopener noreferrer"},Ie(e.comment.nick),9,ia)):(Hr(),Zr("span",oa,Ie(e.comment.nick),1)),"administrator"===e.comment.type?(Hr(),Zr("span",{key:2,class:"wl-badge",textContent:Ie(s.value.admin)},null,8,sa)):ll("v-if",!0),e.comment.label?(Hr(),Zr("span",{key:3,class:"wl-badge",textContent:Ie(e.comment.label)},null,8,aa)):ll("v-if",!0),e.comment.sticky?(Hr(),Zr("span",{key:4,class:"wl-badge",textContent:Ie(s.value.sticky)},null,8,ca)):ll("v-if",!0),void 0!==e.comment.level&&e.comment.level>=0?(Hr(),Zr("span",{key:5,class:Ae(`wl-badge level${e.comment.level}`),textContent:Ie(s.value[`level${e.comment.level}`]||`Level ${e.comment.level}`)},null,10,ua)):ll("v-if",!0),el("span",{class:"wl-time",textContent:Ie(u.value)},null,8,pa),el("div",da,[p.value||d.value?(Hr(),Zr("button",{key:0,type:"button",class:"wl-edit",onClick:t[0]||(t[0]=()=>e.$emit("edit",e.comment))},[tl(ln(Eo))])):ll("v-if",!0),p.value||d.value?(Hr(),Zr("button",{key:1,type:"button",class:"wl-delete",onClick:t[1]||(t[1]=t=>e.$emit("delete",e.comment))},[tl(ln(xo))])):ll("v-if",!0),el("button",{type:"button",class:"wl-like",title:c.value?s.value.cancelLike:s.value.like,onClick:t[2]||(t[2]=t=>e.$emit("like",e.comment))},[tl(ln(Co),{active:c.value},null,8,["active"]),"like"in e.comment?(Hr(),Zr("span",{key:0,textContent:Ie(e.comment.like)},null,8,fa)):ll("v-if",!0)],8,ha),el("button",{type:"button",class:Ae(["wl-reply",{active:h.value}]),title:h.value?s.value.cancelReply:s.value.reply,onClick:t[3]||(t[3]=t=>e.$emit("reply",h.value?null:e.comment))},[tl(ln(Ro))],10,ga)])]),el("div",ma,[e.comment.addr?(Hr(),Zr("span",{key:0,class:"wl-addr","data-value":e.comment.addr,textContent:Ie(e.comment.addr)},null,8,va)):ll("v-if",!0),e.comment.browser?(Hr(),Zr("span",{key:1,class:"wl-browser","data-value":e.comment.browser,textContent:Ie(e.comment.browser)},null,8,ya)):ll("v-if",!0),e.comment.os?(Hr(),Zr("span",{key:2,class:"wl-os","data-value":e.comment.os,textContent:Ie(e.comment.os)},null,8,wa)):ll("v-if",!0)]),f.value?ll("v-if",!0):(Hr(),Zr("div",{key:0,class:"wl-content",innerHTML:e.comment.comment},null,8,ba)),p.value&&!f.value?(Hr(),Zr("div",ka,[el("span",xa,[(Hr(),Zr(Mr,null,tr(n,(t=>el("button",{key:t,type:"submit",class:Ae(`wl-btn wl-${t}`),disabled:e.comment.status===t,onClick:n=>e.$emit("status",{status:t,comment:e.comment}),textContent:Ie(s.value[t])},null,10,_a))),64))]),p.value&&!e.comment.rid?(Hr(),Zr("button",{key:0,type:"submit",class:"wl-btn wl-sticky",onClick:t[4]||(t[4]=t=>e.$emit("sticky",e.comment))},Ie(e.comment.sticky?s.value.unsticky:s.value.sticky),1)):ll("v-if",!0)])):ll("v-if",!0),h.value||f.value?(Hr(),Zr("div",{key:2,class:Ae({"wl-reply-wrapper":h.value,"wl-edit-wrapper":f.value})},[tl(Ys,{edit:e.edit,"reply-id":e.reply?.objectId,"reply-user":e.comment.nick,"root-id":e.rootId,onLog:t[5]||(t[5]=t=>e.$emit("log")),onCancelReply:t[6]||(t[6]=t=>e.$emit("reply",null)),onCancelEdit:t[7]||(t[7]=t=>e.$emit("edit",null)),onSubmit:t[8]||(t[8]=t=>e.$emit("submit",t))},null,8,["edit","reply-id","reply-user","root-id"])],2)):ll("v-if",!0),e.comment.children?(Hr(),Zr("div",$a,[(Hr(!0),Zr(Mr,null,tr(e.comment.children,(n=>(Hr(),Kr(r,{key:n.objectId,comment:n,reply:e.reply,edit:e.edit,"root-id":e.rootId,onLog:t[9]||(t[9]=t=>e.$emit("log")),onDelete:t[10]||(t[10]=t=>e.$emit("delete",t)),onEdit:t[11]||(t[11]=t=>e.$emit("edit",t)),onLike:t[12]||(t[12]=t=>e.$emit("like",t)),onReply:t[13]||(t[13]=t=>e.$emit("reply",t)),onStatus:t[14]||(t[14]=t=>e.$emit("status",t)),onSticky:t[15]||(t[15]=t=>e.$emit("sticky",t)),onSubmit:t[16]||(t[16]=t=>e.$emit("submit",t))},null,8,["comment","reply","edit","root-id"])))),128))])):ll("v-if",!0)])],8,ea)}}}),[["__file","CommentCard.vue"]]);const Sa="2.15.8",Aa={"data-waline":""},Ra={class:"wl-meta-head"},Ea={class:"wl-count"},za=["textContent"],La={class:"wl-sort"},Ia=["onClick"],Ta={class:"wl-cards"},ja={key:1,class:"wl-operation"},Oa=["textContent"],Ua={key:0,class:"wl-loading"},Ma=["textContent"],Pa={key:2,class:"wl-operation"},Fa=["textContent"],Va={key:3,class:"wl-power"},Na=el("a",{href:"https://github.com/walinejs/waline",target:"_blank",rel:"noopener noreferrer"}," Waline ",-1);e.version=Sa;var Da=qn({__name:"WalineComment",props:["serverURL","path","meta","requiredMeta","dark","commentSorting","lang","locale","pageSize","wordLimit","emoji","login","highlighter","texRenderer","imageUploader","search","copyright","recaptchaV3Key","turnstileKey","reaction"],setup(e){const t=e,c={latest:"insertedAt_desc",oldest:"insertedAt_asc",hottest:"like_desc"},u=Object.keys(c),p=Ko(),h=jo(),f=en("loading"),g=en(0),m=en(1),v=en(0),y=$l((()=>(e=>{let{serverURL:t,path:c=location.pathname,lang:u=("undefined"==typeof navigator?"en-US":navigator.language),locale:p,emoji:h=r,meta:f=["nick","mail","link"],requiredMeta:g=[],dark:m=!1,pageSize:v=10,wordLimit:y,imageUploader:w,highlighter:b,texRenderer:x,copyright:_=!0,login:$="enable",search:C,reaction:S,recaptchaV3Key:R="",turnstileKey:E="",commentSorting:T="latest",...j}=e;return{serverURL:z(t),path:A(c),locale:{...k[u]||k[l],..."object"==typeof p?p:{}},wordLimit:L(y),meta:n(f),requiredMeta:n(g),imageUploader:I(w,o),highlighter:I(b,d),texRenderer:I(x,s),lang:Object.keys(k).includes(u)?u:"en-US",dark:m,emoji:"boolean"==typeof h?h?r:[]:h,pageSize:v,login:$,copyright:_,search:!1!==C&&("object"==typeof C?C:a(u)),recaptchaV3Key:R,turnstileKey:E,reaction:Array.isArray(S)?S:!0===S?i:[],commentSorting:T,...j}})(t))),w=en(y.value.commentSorting),b=en([]),x=en(null),$=en(null),C=$l((()=>{return"string"==typeof(e=y.value.dark)?"auto"===e?`@media(prefers-color-scheme:dark){body${T}}`:`${e}${T}`:!0===e?`:root${T}`:"";var e})),R=$l((()=>y.value.locale));let E;!function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=en(!1),{document:r=vi,immediate:l=!0,manual:i=!1,id:o="vueuse_styletag_"+ ++Ci}=t,s=en(e);let a=()=>{};l&&!i&&fi((()=>{if(!r)return;const e=r.getElementById(o)||r.createElement("style");e.isConnected||(e.id=o,t.media&&(e.media=t.media),r.head.appendChild(e)),n.value||(a=Nn(s,(t=>{e.textContent=t}),{immediate:!0}),n.value=!0)})),i||oi((()=>{r&&n.value&&(a(),r.head.removeChild(r.getElementById(o)),n.value=!1)})),Nt(n)}(C,{id:"waline-darkmode"});const j=e=>{const{serverURL:t,path:n,pageSize:r}=y.value,l=new AbortController;f.value="loading",E?.(),(e=>{let{serverURL:t,lang:n,path:r,page:l,pageSize:i,sortBy:o,signal:s,token:a}=e;const c={};return a&&(c.Authorization=`Bearer ${a}`),fetch(`${t}/comment?path=${encodeURIComponent(r)}&pageSize=${i}&page=${l}&lang=${n}&sortBy=${o}`,{signal:s,headers:c}).then((e=>e.json())).then((e=>_(e,"Get comment data")))})({serverURL:t,lang:y.value.lang,path:n,pageSize:r,sortBy:c[w.value],page:e,signal:l.signal,token:p.value?.token}).then((t=>{f.value="success",g.value=t.count,b.value.push(...t.data),m.value=e,v.value=t.totalPages})).catch((e=>{"AbortError"!==e.name&&(console.error(e.message),f.value="error")})),E=l.abort.bind(l)},O=()=>j(m.value+1),U=()=>{g.value=0,b.value=[],j(1)},M=e=>{x.value=e},P=e=>{$.value=e},F=e=>{if($.value)$.value.comment=e.comment,$.value.orig=e.orig;else if(e.rid){const t=b.value.find((t=>{let{objectId:n}=t;return n===e.rid}));if(!t)return;Array.isArray(t.children)||(t.children=[]),t.children.push(e)}else b.value.unshift(e),g.value+=1},V=async e=>{let{comment:t,status:n}=e;if(t.status===n)return;const{serverURL:r,lang:l}=y.value;await S({serverURL:r,lang:l,token:p.value?.token,objectId:t.objectId,comment:{status:n}}),t.status=n},N=async e=>{if(e.rid)return;const{serverURL:t,lang:n}=y.value;await S({serverURL:t,lang:n,token:p.value?.token,objectId:e.objectId,comment:{sticky:e.sticky?0:1}}),e.sticky=!e.sticky},D=async e=>{let{objectId:t}=e;if(!confirm("Are you sure you want to delete this comment?"))return;const{serverURL:n,lang:r}=y.value;await(e=>{let{serverURL:t,lang:n,token:r,objectId:l}=e;return fetch(`${t}/comment/${l}?lang=${n}`,{method:"DELETE",headers:{Authorization:`Bearer ${r}`}}).then((e=>e.json())).then((e=>_(e,"Delete comment")))})({serverURL:n,lang:r,token:p.value?.token,objectId:t}),b.value.some(((e,n)=>e.objectId===t?(b.value=b.value.filter(((e,t)=>t!==n)),!0):e.children.some(((r,l)=>r.objectId===t&&(b.value[n].children=e.children.filter(((e,t)=>t!==l)),!0)))))},H=async e=>{const{serverURL:t,lang:n}=y.value,{objectId:r}=e,l=h.value.includes(r);await S({serverURL:t,lang:n,objectId:r,token:p.value?.token,comment:{like:!l}}),l?h.value=h.value.filter((e=>e!==r)):(h.value=[...h.value,r],h.value.length>50&&(h.value=h.value.slice(-50))),e.like=(e.like||0)+(l?-1:1)};return function(e,t){if(pl){let e=pl.provides;const n=pl.parent&&pl.parent.provides;n===e&&(e=pl.provides=Object.create(n)),e.config=t}}(0,y),Gn((()=>{Nn((()=>[t.serverURL,t.path]),(()=>U()),{immediate:!0})})),Jn((()=>E?.())),(e,t)=>(Hr(),Zr("div",Aa,[tl(is),x.value?ll("v-if",!0):(Hr(),Kr(Ys,{key:0,onLog:U,onSubmit:F})),el("div",Ra,[el("div",Ea,[g.value?(Hr(),Zr("span",{key:0,class:"wl-num",textContent:Ie(g.value)},null,8,za)):ll("v-if",!0),rl(" "+Ie(R.value.comment),1)]),el("ul",La,[(Hr(!0),Zr(Mr,null,tr(ln(u),(e=>(Hr(),Zr("li",{key:e,class:Ae([e===w.value?"active":""]),onClick:t=>(e=>{w.value!==e&&(w.value=e,U())})(e)},Ie(R.value[e]),11,Ia)))),128))])]),el("div",Ta,[(Hr(!0),Zr(Mr,null,tr(b.value,(e=>(Hr(),Kr(Ca,{key:e.objectId,"root-id":e.objectId,comment:e,reply:x.value,edit:$.value,onLog:U,onReply:M,onEdit:P,onSubmit:F,onStatus:V,onDelete:D,onSticky:N,onLike:H},null,8,["root-id","comment","reply","edit"])))),128))]),"error"===f.value?(Hr(),Zr("div",ja,[el("button",{type:"button",class:"wl-btn",onClick:U,textContent:Ie(R.value.refresh)},null,8,Oa)])):(Hr(),Zr(Mr,{key:2},["loading"===f.value?(Hr(),Zr("div",Ua,[tl(ln(Lo),{size:30})])):b.value.length?m.value{t.forEach(((t,n)=>{t.innerText=e[n].toString()}))},Wa=e=>{let{serverURL:t,path:n=window.location.pathname,selector:r=".waline-pageview-count",update:l=!0,lang:i=navigator.language}=e;const o=new AbortController,s=Array.from(document.querySelectorAll(r)),a=e=>{const t=wo(e);return null!==t&&n!==t},c=e=>(e=>{let{serverURL:t,lang:n,paths:r,signal:l}=e;return $({serverURL:t,lang:n,paths:r,type:["time"],signal:l}).then((e=>Array.isArray(e)?e:[e]))})({serverURL:z(t),paths:e.map((e=>wo(e)||n)),lang:i,signal:o.signal}).then((t=>Ba(t,e))).catch(Ai);if(l){const e=s.filter((e=>!a(e))),r=s.filter(a);(u={serverURL:z(t),path:n,lang:i},C({...u,type:"time",action:"inc"})).then((t=>Ba(new Array(e.length).fill(t),e))),r.length&&c(r)}else c(s);var u;return o.abort.bind(o)};e.UserList=e=>{let{el:t,serverURL:n,count:r,locale:i,lang:o=navigator.language,mode:s="list"}=e;const a=Ri(t),c=new AbortController;return(e=>{let{serverURL:t,signal:n,pageSize:r,lang:l}=e;return fetch(`${t}/user?pageSize=${r}&lang=${l}`,{signal:n}).then((e=>e.json())).then((e=>_(e,"user list"))).then((e=>e.data))})({serverURL:n,pageSize:r,lang:o,signal:c.signal}).then((e=>a&&e.length?(i={...k[o]||k[l],..."object"==typeof i?i:{}},a.innerHTML=``,{users:e,destroy:()=>{c.abort(),a.innerHTML=""}}):{users:e,destroy:()=>c.abort()}))},e.RecentComments=e=>{let{el:t,serverURL:n,count:r,lang:l=navigator.language}=e;const i=Ko(),o=Ri(t),s=new AbortController;return(e=>{let{serverURL:t,lang:n,count:r,signal:l,token:i}=e;const o={};return i&&(o.Authorization=`Bearer ${i}`),fetch(`${t}/comment?type=recent&count=${r}&lang=${n}`,{signal:l,headers:o}).then((e=>e.json()))})({serverURL:n,count:r,lang:l,signal:s.signal,token:i.value?.token}).then((e=>o&&e.length?(o.innerHTML=`${e.map((e=>`${e.nick} :${e.comment} `)).join("")} `,{comments:e,destroy:()=>{s.abort(),o.innerHTML=""}}):{comments:e,destroy:()=>s.abort()}))},e.init=e=>{let{el:t="#waline",path:n=window.location.pathname,comment:r=!1,pageview:l=!1,...i}=e;const o=t?Ri(t):null;if(t&&!o)throw new Error("Option 'el' do not match any domElement!");if(!i.serverURL)throw new Error("Option 'serverURL' is missing!");const s=Vt({...i}),a=Vt({comment:r,pageview:l,path:n}),c=o?function(){const e=(ii||(ii=jr(li))).createApp(...arguments),{mount:t}=e;return e.mount=n=>{const r=function(e){return Y(e)?document.querySelector(e):e}(n);if(!r)return;const l=e._component;X(l)||l.render||l.template||(l.template=r.innerHTML),r.innerHTML="";const i=t(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},e}((()=>Cl(Ha,{path:a.path,...s}))):null;c&&c.mount(o);const u=Fn((()=>{a.comment&&bo({serverURL:s.serverURL,path:a.path,selector:"string"==typeof a.comment?a.comment:void 0})})),p=Fn((()=>{a.pageview&&Wa({serverURL:s.serverURL,path:a.path,selector:"string"==typeof a.pageview?a.pageview:void 0})}));return{el:o,update:function(){let{comment:e,pageview:t,path:n=window.location.pathname,...r}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.entries(r).forEach((e=>{let[t,n]=e;s[t]=n})),a.path=n,void 0!==e&&(a.comment=e),void 0!==t&&(a.pageview=t)},destroy:()=>{c?.unmount(),u(),p()}}},e.pageviewCount=Wa}));
+//# sourceMappingURL=waline.js.map
diff --git a/css/main.css b/css/main.css
new file mode 100644
index 00000000..1c262c95
--- /dev/null
+++ b/css/main.css
@@ -0,0 +1,2791 @@
+:root {
+ --body-bg-color: #eee;
+ --content-bg-color: #fff;
+ --card-bg-color: #f5f5f5;
+ --text-color: #555;
+ --blockquote-color: #666;
+ --link-color: #555;
+ --link-hover-color: #222;
+ --brand-color: #fff;
+ --brand-hover-color: #fff;
+ --table-row-odd-bg-color: #f9f9f9;
+ --table-row-hover-bg-color: #f5f5f5;
+ --menu-item-bg-color: #f5f5f5;
+ --theme-color: #222;
+ --btn-default-bg: #fff;
+ --btn-default-color: #555;
+ --btn-default-border-color: #555;
+ --btn-default-hover-bg: #222;
+ --btn-default-hover-color: #fff;
+ --btn-default-hover-border-color: #222;
+ --highlight-background: #fff;
+ --highlight-foreground: #24292e;
+ --highlight-gutter-background: #e9e9ea;
+ --highlight-gutter-foreground: #393e42;
+ color-scheme: light;
+}
+html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+body {
+ margin: 0;
+}
+main {
+ display: block;
+}
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+}
+pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+a {
+ background: transparent;
+}
+abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+}
+b,
+strong {
+ font-weight: bolder;
+}
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+img {
+ border-style: none;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+}
+button,
+input {
+/* 1 */
+ overflow: visible;
+}
+button,
+select {
+/* 1 */
+ text-transform: none;
+}
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+}
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+button:-moz-focusring,
+[type='button']:-moz-focusring,
+[type='reset']:-moz-focusring,
+[type='submit']:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+}
+progress {
+ vertical-align: baseline;
+}
+textarea {
+ overflow: auto;
+}
+[type='checkbox'],
+[type='radio'] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+ height: auto;
+}
+[type='search'] {
+ outline-offset: -2px; /* 2 */
+ -webkit-appearance: textfield; /* 1 */
+}
+[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+ font: inherit; /* 2 */
+ -webkit-appearance: button; /* 1 */
+}
+details {
+ display: block;
+}
+summary {
+ display: list-item;
+}
+template {
+ display: none;
+}
+[hidden] {
+ display: none;
+}
+::selection {
+ background: #262a30;
+ color: #eee;
+}
+html,
+body {
+ height: 100%;
+}
+body {
+ background: url("/images/background3.svg");
+ background-repeat: repeat;
+ background-attachment: fixed;
+ box-sizing: border-box;
+ color: var(--text-color);
+ font-family: 'LXGW WenKai Lite';
+ font-size: 1em;
+ line-height: 2;
+ min-height: 100%;
+ position: relative;
+ transition: padding 0.2s ease-in-out;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: 'LXGW WenKai Lite';
+ font-weight: bold;
+ line-height: 1.5;
+ margin: 30px 0 15px;
+}
+h1 {
+ font-size: 1.5em;
+}
+h2 {
+ font-size: 1.375em;
+}
+h3 {
+ font-size: 1.25em;
+}
+h4 {
+ font-size: 1.125em;
+}
+h5 {
+ font-size: 1em;
+}
+h6 {
+ font-size: 0.875em;
+}
+p {
+ margin: 0 0 20px;
+}
+a {
+ border-bottom: 1px solid #999;
+ color: var(--link-color);
+ cursor: pointer;
+ outline: 0;
+ text-decoration: none;
+ overflow-wrap: break-word;
+ transition: color 0.3s, border-bottom-color 0.3s;
+}
+a:hover {
+ border-bottom-color: var(--link-hover-color);
+ color: var(--link-hover-color);
+}
+iframe,
+img,
+video,
+embed {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+ max-width: 100%;
+}
+hr {
+ background-image: repeating-linear-gradient(-45deg, #ddd, #ddd 4px, transparent 4px, transparent 8px);
+ border: 0;
+ height: 3px;
+ margin: 40px 0;
+}
+blockquote {
+ border-left: 4px solid #ddd;
+ color: var(--blockquote-color);
+ margin: 0;
+ padding: 0 15px;
+}
+blockquote cite::before {
+ content: '-';
+ padding: 0 5px;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin: 0;
+ padding: 0;
+}
+.table-container {
+ overflow: auto;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ font-size: 0.875em;
+ margin: 0 0 20px;
+ width: 100%;
+}
+tbody tr:nth-of-type(odd) {
+ background: var(--table-row-odd-bg-color);
+}
+tbody tr:hover {
+ background: var(--table-row-hover-bg-color);
+}
+caption,
+th,
+td {
+ padding: 8px;
+}
+th,
+td {
+ border: 1px solid #ddd;
+ border-bottom: 3px solid #ddd;
+}
+th {
+ font-weight: 700;
+ padding-bottom: 10px;
+}
+td {
+ border-bottom-width: 1px;
+}
+.btn {
+ background: var(--btn-default-bg);
+ border: 2px solid var(--btn-default-border-color);
+ border-radius: 2px;
+ color: var(--btn-default-color);
+ display: inline-block;
+ font-size: 0.875em;
+ line-height: 2;
+ padding: 0 20px;
+ transition: background-color 0.2s ease-in-out;
+}
+.btn:hover {
+ background: var(--btn-default-hover-bg);
+ border-color: var(--btn-default-hover-border-color);
+ color: var(--btn-default-hover-color);
+}
+.btn + .btn {
+ margin: 0 0 8px 8px;
+}
+.btn .fa-fw {
+ text-align: left;
+ width: 1.285714285714286em;
+}
+.toggle {
+ line-height: 0;
+}
+.toggle .toggle-line {
+ background: #fff;
+ display: block;
+ height: 2px;
+ left: 0;
+ position: relative;
+ top: 0;
+ transition: all 0.4s;
+ width: 100%;
+}
+.toggle .toggle-line:first-child {
+ margin-top: 1px;
+}
+.toggle .toggle-line:not(:first-child) {
+ margin-top: 4px;
+}
+.toggle.toggle-arrow :first-child {
+ left: 50%;
+ top: 2px;
+ transform: rotate(45deg);
+ width: 50%;
+}
+.toggle.toggle-arrow :last-child {
+ left: 50%;
+ top: -2px;
+ transform: rotate(-45deg);
+ width: 50%;
+}
+.toggle.toggle-close :nth-child(2) {
+ opacity: 0;
+}
+.toggle.toggle-close :first-child {
+ top: 6px;
+ transform: rotate(45deg);
+}
+.toggle.toggle-close :last-child {
+ top: -6px;
+ transform: rotate(-45deg);
+}
+code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+pre[class*="language-"].line-numbers {
+ position: relative;
+ padding-left: 3.8em;
+ counter-reset: linenumber;
+}
+
+pre[class*="language-"].line-numbers > code {
+ position: relative;
+ white-space: inherit;
+}
+
+.line-numbers .line-numbers-rows {
+ position: absolute;
+ pointer-events: none;
+ top: 0;
+ font-size: 100%;
+ left: -3.8em;
+ width: 3em; /* works for line-numbers below 1000 lines */
+ letter-spacing: -1px;
+ border-right: 1px solid #999;
+
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+}
+
+ .line-numbers-rows > span {
+ display: block;
+ counter-increment: linenumber;
+ }
+
+ .line-numbers-rows > span:before {
+ content: counter(linenumber);
+ color: #999;
+ display: block;
+ padding-right: 0.8em;
+ text-align: right;
+ }
+
+.highlight:hover .copy-btn,
+.code-container:hover .copy-btn {
+ opacity: 1;
+ visibility: visible;
+}
+.code-container:hover pre[class*="language-"]::before {
+ opacity: 0;
+ visibility: hidden;
+}
+.code-container {
+ position: relative;
+}
+pre[class*="language-"] {
+ border-radius: 3px;
+}
+pre[class*="language-"]::before {
+ content: attr(data-language);
+ opacity: 0.5;
+ visibility: visible;
+ font-weight: 700;
+ position: absolute;
+ right: 5px;
+ top: 5px;
+ transition: opacity 0.3s, visibility 0.3s;
+}
+.copy-btn {
+ color: #333;
+ cursor: pointer;
+ line-height: 1.6;
+ opacity: 0;
+ visibility: hidden;
+ padding: 2px 6px;
+ position: absolute;
+ transition: opacity 0.2s ease-in-out, background-color 0.3s, visibility 0.3s;
+ background: #fff;
+ border-radius: 2.5px;
+ font-size: 0.8125em;
+ right: 5px;
+ top: 5px;
+}
+.copy-btn:hover {
+ background-color: #eee;
+}
+code,
+kbd,
+figure.highlight,
+pre {
+ background: var(--highlight-background);
+ color: var(--highlight-foreground);
+}
+figure.highlight,
+pre {
+ line-height: 1.6;
+ margin: 0 auto 20px;
+}
+figure.highlight figcaption,
+pre .caption,
+pre figcaption {
+ background: var(--highlight-gutter-background);
+ color: var(--highlight-foreground);
+ display: flow-root;
+ font-size: 0.875em;
+ line-height: 1.2;
+ padding: 0.5em;
+}
+figure.highlight figcaption a,
+pre .caption a,
+pre figcaption a {
+ color: var(--highlight-foreground);
+ float: right;
+}
+figure.highlight figcaption a:hover,
+pre .caption a:hover,
+pre figcaption a:hover {
+ border-bottom-color: var(--highlight-foreground);
+}
+pre,
+code {
+ font-family: consolas, Menlo, monospace, 'LXGW WenKai Lite';
+}
+code {
+ border-radius: 3px;
+ font-size: 0.875em;
+ padding: 2px 4px;
+ overflow-wrap: break-word;
+}
+kbd {
+ border: 2px solid #ccc;
+ border-radius: 0.2em;
+ box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1);
+ font-family: inherit;
+ padding: 0.1em 0.3em;
+ white-space: nowrap;
+}
+figure.highlight {
+ overflow: auto;
+ position: relative;
+}
+figure.highlight pre {
+ border: 0;
+ margin: 0;
+ padding: 10px 0;
+}
+figure.highlight table {
+ border: 0;
+ margin: 0;
+ width: auto;
+}
+figure.highlight td {
+ border: 0;
+ padding: 0;
+}
+figure.highlight .gutter {
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+figure.highlight .gutter pre {
+ background: var(--highlight-gutter-background);
+ color: var(--highlight-gutter-foreground);
+ padding-left: 10px;
+ padding-right: 10px;
+ text-align: right;
+}
+figure.highlight .code pre {
+ padding-left: 10px;
+ width: 100%;
+}
+figure.highlight .marked {
+ background: rgba(0,0,0,0.3);
+}
+pre .caption,
+pre figcaption {
+ margin-bottom: 10px;
+}
+.gist table {
+ width: auto;
+}
+.gist table td {
+ border: 0;
+}
+pre {
+ overflow: auto;
+ padding: 10px;
+}
+pre code {
+ background: none;
+ padding: 0;
+ text-shadow: none;
+}
+.blockquote-center {
+ border-left: 0;
+ margin: 40px 0;
+ padding: 0;
+ position: relative;
+ text-align: center;
+}
+.blockquote-center::before,
+.blockquote-center::after {
+ left: 0;
+ line-height: 1;
+ opacity: 0.6;
+ position: absolute;
+ width: 100%;
+}
+.blockquote-center::before {
+ border-top: 1px solid #ccc;
+ text-align: left;
+ top: -20px;
+ content: '\f10d';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+}
+.blockquote-center::after {
+ border-bottom: 1px solid #ccc;
+ bottom: -20px;
+ text-align: right;
+ content: '\f10e';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+}
+.blockquote-center p,
+.blockquote-center div {
+ text-align: center;
+}
+.group-picture {
+ margin-bottom: 20px;
+}
+.group-picture .group-picture-row {
+ display: flex;
+ gap: 3px;
+ margin-bottom: 3px;
+}
+.group-picture .group-picture-column {
+ flex: 1;
+}
+.group-picture .group-picture-column img {
+ height: 100%;
+ margin: 0;
+ object-fit: cover;
+ width: 100%;
+}
+.post-body .label {
+ color: #555;
+ padding: 0 2px;
+}
+.post-body .label.default {
+ background: #f0f0f0;
+}
+.post-body .label.primary {
+ background: #efe6f7;
+}
+.post-body .label.info {
+ background: #e5f2f8;
+}
+.post-body .label.success {
+ background: #e7f4e9;
+}
+.post-body .label.warning {
+ background: #fcf6e1;
+}
+.post-body .label.danger {
+ background: #fae8eb;
+}
+.post-body .link-grid {
+ display: grid;
+ grid-gap: 1.5rem;
+ gap: 1.5rem;
+ grid-template-columns: 1fr 1fr;
+ margin-bottom: 20px;
+ padding: 1rem;
+}
+@media (max-width: 767px) {
+ .post-body .link-grid {
+ grid-template-columns: 1fr;
+ }
+}
+.post-body .link-grid .link-grid-container {
+ border: solid #ddd;
+ box-shadow: 1rem 1rem 0.5rem rgba(0,0,0,0.5);
+ min-height: 5rem;
+ min-width: 0;
+ padding: 0.5rem;
+ position: relative;
+ transition: background 0.3s;
+}
+.post-body .link-grid .link-grid-container:hover {
+ animation: next-shake 0.5s;
+ background: var(--card-bg-color);
+}
+.post-body .link-grid .link-grid-container:active {
+ box-shadow: 0.5rem 0.5rem 0.25rem rgba(0,0,0,0.5);
+ transform: translate(0.2rem, 0.2rem);
+}
+.post-body .link-grid .link-grid-container .link-grid-image {
+ border: 1px solid #ddd;
+ border-radius: 50%;
+ box-sizing: border-box;
+ height: 5rem;
+ padding: 3px;
+ position: absolute;
+ width: 5rem;
+}
+.post-body .link-grid .link-grid-container p {
+ margin: 0 1rem 0 6rem;
+}
+.post-body .link-grid .link-grid-container p:first-of-type {
+ font-size: 1.2em;
+}
+.post-body .link-grid .link-grid-container p:last-of-type {
+ font-size: 0.8em;
+ line-height: 1.3rem;
+ opacity: 0.7;
+}
+.post-body .link-grid .link-grid-container a {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+@keyframes next-shake {
+ 0% {
+ transform: translate(1pt, 1pt) rotate(0deg);
+ }
+ 10% {
+ transform: translate(-1pt, -2pt) rotate(-1deg);
+ }
+ 20% {
+ transform: translate(-3pt, 0pt) rotate(1deg);
+ }
+ 30% {
+ transform: translate(3pt, 2pt) rotate(0deg);
+ }
+ 40% {
+ transform: translate(1pt, -1pt) rotate(1deg);
+ }
+ 50% {
+ transform: translate(-1pt, 2pt) rotate(-1deg);
+ }
+ 60% {
+ transform: translate(-3pt, 1pt) rotate(0deg);
+ }
+ 70% {
+ transform: translate(3pt, 1pt) rotate(-1deg);
+ }
+ 80% {
+ transform: translate(-1pt, -1pt) rotate(1deg);
+ }
+ 90% {
+ transform: translate(1pt, 2pt) rotate(0deg);
+ }
+ 100% {
+ transform: translate(1pt, -2pt) rotate(-1deg);
+ }
+}
+.post-body .note {
+ border-radius: 3px;
+ margin-bottom: 20px;
+ padding: 1em;
+ position: relative;
+ background: #f9f9f9;
+ border: initial;
+ border-left: 3px solid #eee;
+}
+.post-body .note summary {
+ cursor: pointer;
+ outline: 0;
+}
+.post-body .note summary p {
+ display: inline;
+}
+.post-body .note h2,
+.post-body .note h3,
+.post-body .note h4,
+.post-body .note h5,
+.post-body .note h6 {
+ border-bottom: initial;
+ margin: 0;
+ padding-top: 0;
+}
+.post-body .note :first-child {
+ margin-top: 0;
+}
+.post-body .note :last-child {
+ margin-bottom: 0;
+}
+.post-body .note:not(.no-icon) {
+ padding-left: 2.5em;
+}
+.post-body .note:not(.no-icon)::before {
+ font-size: 1.5em;
+ left: 0.3em;
+ position: absolute;
+ top: calc(50% - 1em);
+}
+.post-body .note.default {
+ background: #f7f7f7;
+ border-left-color: #777;
+}
+.post-body .note.default h2,
+.post-body .note.default h3,
+.post-body .note.default h4,
+.post-body .note.default h5,
+.post-body .note.default h6 {
+ color: #777;
+}
+.post-body .note.default:not(.no-icon)::before {
+ content: '\f0a9';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+ color: #777;
+}
+.post-body .note.primary {
+ background: #f5f0fa;
+ border-left-color: #6f42c1;
+}
+.post-body .note.primary h2,
+.post-body .note.primary h3,
+.post-body .note.primary h4,
+.post-body .note.primary h5,
+.post-body .note.primary h6 {
+ color: #6f42c1;
+}
+.post-body .note.primary:not(.no-icon)::before {
+ content: '\f055';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+ color: #6f42c1;
+}
+.post-body .note.info {
+ background: #eef7fa;
+ border-left-color: #428bca;
+}
+.post-body .note.info h2,
+.post-body .note.info h3,
+.post-body .note.info h4,
+.post-body .note.info h5,
+.post-body .note.info h6 {
+ color: #428bca;
+}
+.post-body .note.info:not(.no-icon)::before {
+ content: '\f05a';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+ color: #428bca;
+}
+.post-body .note.success {
+ background: #eff8f0;
+ border-left-color: #5cb85c;
+}
+.post-body .note.success h2,
+.post-body .note.success h3,
+.post-body .note.success h4,
+.post-body .note.success h5,
+.post-body .note.success h6 {
+ color: #5cb85c;
+}
+.post-body .note.success:not(.no-icon)::before {
+ content: '\f058';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+ color: #5cb85c;
+}
+.post-body .note.warning {
+ background: #fdf8ea;
+ border-left-color: #f0ad4e;
+}
+.post-body .note.warning h2,
+.post-body .note.warning h3,
+.post-body .note.warning h4,
+.post-body .note.warning h5,
+.post-body .note.warning h6 {
+ color: #f0ad4e;
+}
+.post-body .note.warning:not(.no-icon)::before {
+ content: '\f06a';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+ color: #f0ad4e;
+}
+.post-body .note.danger {
+ background: #fcf1f2;
+ border-left-color: #d9534f;
+}
+.post-body .note.danger h2,
+.post-body .note.danger h3,
+.post-body .note.danger h4,
+.post-body .note.danger h5,
+.post-body .note.danger h6 {
+ color: #d9534f;
+}
+.post-body .note.danger:not(.no-icon)::before {
+ content: '\f056';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+ color: #d9534f;
+}
+.post-body .tabs {
+ margin-bottom: 20px;
+}
+.post-body .tabs,
+.tabs-comment {
+ padding-top: 10px;
+}
+.post-body .tabs ul.nav-tabs,
+.tabs-comment ul.nav-tabs {
+ background: var(--content-bg-color);
+ display: flex;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ margin: 0;
+ padding: 0;
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 5;
+}
+@media (max-width: 413px) {
+ .post-body .tabs ul.nav-tabs,
+ .tabs-comment ul.nav-tabs {
+ display: block;
+ margin-bottom: 5px;
+ }
+}
+.post-body .tabs ul.nav-tabs li.tab,
+.tabs-comment ul.nav-tabs li.tab {
+ border-bottom: 1px solid #ddd;
+ border-left: 1px solid transparent;
+ border-right: 1px solid transparent;
+ border-radius: 3px 3px 0 0;
+ border-top: 3px solid transparent;
+ flex-grow: 1;
+ list-style-type: none;
+}
+@media (max-width: 413px) {
+ .post-body .tabs ul.nav-tabs li.tab,
+ .tabs-comment ul.nav-tabs li.tab {
+ border-bottom: 1px solid transparent;
+ border-left: 3px solid transparent;
+ border-right: 1px solid transparent;
+ border-top: 1px solid transparent;
+ }
+}
+@media (max-width: 413px) {
+ .post-body .tabs ul.nav-tabs li.tab,
+ .tabs-comment ul.nav-tabs li.tab {
+ border-radius: 3px;
+ }
+}
+.post-body .tabs ul.nav-tabs li.tab a,
+.tabs-comment ul.nav-tabs li.tab a {
+ border-bottom: initial;
+ display: block;
+ line-height: 1.8;
+ padding: 0.25em 0.75em;
+ text-align: center;
+ transition: all 0.2s ease-out;
+}
+.post-body .tabs ul.nav-tabs li.tab a i[class^='fa'],
+.tabs-comment ul.nav-tabs li.tab a i[class^='fa'] {
+ width: 1.285714285714286em;
+}
+.post-body .tabs ul.nav-tabs li.tab.active,
+.tabs-comment ul.nav-tabs li.tab.active {
+ border-bottom-color: transparent;
+ border-left-color: #ddd;
+ border-right-color: #ddd;
+ border-top-color: #333;
+}
+@media (max-width: 413px) {
+ .post-body .tabs ul.nav-tabs li.tab.active,
+ .tabs-comment ul.nav-tabs li.tab.active {
+ border-bottom-color: #ddd;
+ border-left-color: #333;
+ border-right-color: #ddd;
+ border-top-color: #ddd;
+ }
+}
+.post-body .tabs ul.nav-tabs li.tab.active a,
+.tabs-comment ul.nav-tabs li.tab.active a {
+ cursor: default;
+}
+.post-body .tabs .tab-content,
+.tabs-comment .tab-content {
+ border: 1px solid #ddd;
+ border-radius: 0 0 3px 3px;
+ border-top-color: transparent;
+}
+@media (max-width: 413px) {
+ .post-body .tabs .tab-content,
+ .tabs-comment .tab-content {
+ border-radius: 3px;
+ border-top-color: #ddd;
+ }
+}
+.post-body .tabs .tab-content .tab-pane,
+.tabs-comment .tab-content .tab-pane {
+ padding: 20px 20px 0;
+}
+.post-body .tabs .tab-content .tab-pane:not(.active),
+.tabs-comment .tab-content .tab-pane:not(.active) {
+ display: none;
+}
+.pagination .prev,
+.pagination .next,
+.pagination .page-number,
+.pagination .space {
+ display: inline-block;
+ margin: -1px 10px 0;
+ padding: 0 10px;
+}
+@media (max-width: 767px) {
+ .pagination .prev,
+ .pagination .next,
+ .pagination .page-number,
+ .pagination .space {
+ margin: 0 5px;
+ }
+}
+.pagination .page-number.current {
+ background: #ccc;
+ border-color: #ccc;
+ color: var(--content-bg-color);
+}
+.pagination {
+ margin: 120px 0 0;
+ text-align: center;
+}
+.pagination .prev,
+.pagination .next,
+.pagination .page-number {
+ border-bottom: 0;
+ border-radius: 3px;
+ transition: background-color 0.2s ease-in-out;
+}
+.pagination .prev:hover,
+.pagination .next:hover,
+.pagination .page-number:hover {
+ background-color: #ddd;
+}
+@media (max-width: 767px) {
+ .pagination {
+ border-top: 0;
+ }
+ .pagination .prev,
+ .pagination .next,
+ .pagination .page-number {
+ border-bottom: 1px solid #eee;
+ border-top: 0;
+ }
+ .pagination .prev:hover,
+ .pagination .next:hover,
+ .pagination .page-number:hover {
+ border-bottom-color: var(--link-hover-color);
+ }
+}
+.pagination .space {
+ margin: 0;
+ padding: 0;
+ color: #bcbcbc;
+}
+.comments {
+ margin-top: 60px;
+ overflow: hidden;
+}
+.comment-button-group {
+ display: flex;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ justify-content: center;
+ margin: 1em 0;
+}
+.comment-button-group .comment-button {
+ margin: 0.1em 0.2em;
+}
+.comment-button-group .comment-button.active {
+ background: var(--btn-default-hover-bg);
+ border-color: var(--btn-default-hover-border-color);
+ color: var(--btn-default-hover-color);
+}
+.comment-position {
+ display: none;
+}
+.comment-position.active {
+ display: block;
+}
+.tabs-comment {
+ margin-top: 4em;
+ padding-top: 0;
+}
+.tabs-comment .comments {
+ margin-top: 0;
+ padding-top: 0;
+}
+.headband {
+ display: none;
+}
+.site-brand-container {
+ display: flex;
+ flex-shrink: 0;
+ padding: 0 10px;
+ border-radius: 5px 5px 0 0;
+}
+@media (max-width: 767px) {
+ .site-brand-container {
+ border-radius: 0;
+ }
+}
+.use-motion .column,
+.use-motion .site-brand-container .toggle {
+ opacity: 0;
+}
+.site-meta {
+ flex-grow: 1;
+ text-align: center;
+}
+@media (max-width: 767px) {
+ .site-meta {
+ text-align: center;
+ }
+}
+.custom-logo-image {
+ margin-top: 20px;
+}
+@media (max-width: 991px) {
+ .custom-logo-image {
+ display: none;
+ }
+}
+.brand {
+ border-bottom: 0;
+ color: var(--brand-color);
+ display: inline-block;
+ padding: 0;
+}
+.brand:hover {
+ color: var(--brand-hover-color);
+}
+.site-title {
+ font-family: 'LXGW WenKai Lite';
+ font-size: 1.375em;
+ font-weight: normal;
+ line-height: 1.5;
+ margin: 0;
+}
+.site-subtitle {
+ color: #ddd;
+ font-size: 0.8125em;
+ margin: 10px 10px 0;
+}
+.use-motion .site-title,
+.use-motion .site-subtitle,
+.use-motion .custom-logo-image {
+ opacity: 0;
+ position: relative;
+ top: -10px;
+}
+.site-nav-toggle,
+.site-nav-right {
+ display: none;
+}
+@media (max-width: 767px) {
+ .site-nav-toggle,
+ .site-nav-right {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ }
+}
+.site-nav-toggle .toggle,
+.site-nav-right .toggle {
+ color: var(--text-color);
+ padding: 10px;
+ width: 22px;
+}
+.site-nav-toggle .toggle .toggle-line,
+.site-nav-right .toggle .toggle-line {
+ background: var(--text-color);
+ border-radius: 1px;
+}
+@media (max-width: 767px) {
+ .site-nav {
+ --scroll-height: 0;
+ height: 0;
+ overflow: hidden;
+ transition: 0.2s ease-in-out;
+ transition-property: height, visibility;
+ visibility: hidden;
+ }
+ body:not(.site-nav-on) .site-nav .animated {
+ animation: none;
+ }
+ body.site-nav-on .site-nav {
+ height: var(--scroll-height);
+ visibility: unset;
+ }
+}
+.menu {
+ margin: 0;
+ padding: 1em 0;
+ text-align: center;
+}
+.menu-item {
+ display: inline-block;
+ list-style: none;
+ margin: 0 10px;
+}
+@media (max-width: 767px) {
+ .menu-item {
+ display: block;
+ margin-top: 10px;
+ }
+ .menu-item.menu-item-search {
+ display: none;
+ }
+}
+.menu-item a {
+ border-bottom: 0;
+ display: block;
+ font-size: 0.8125em;
+ transition: border-color 0.2s ease-in-out;
+}
+.menu-item a:hover,
+.menu-item a.menu-item-active {
+ background: var(--menu-item-bg-color);
+}
+.menu-item i[class^='fa'] {
+ margin-right: 8px;
+}
+.menu-item .badge {
+ display: inline-block;
+ font-weight: bold;
+ line-height: 1;
+ margin-left: 0.35em;
+ margin-top: 0.35em;
+ text-align: center;
+ white-space: nowrap;
+}
+@media (max-width: 767px) {
+ .menu-item .badge {
+ float: right;
+ margin-left: 0;
+ }
+}
+.use-motion .menu-item {
+ visibility: hidden;
+}
+.sidebar-inner {
+ color: #999;
+ padding: 18px 10px;
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+.cc-license .cc-opacity {
+ border-bottom: 0;
+ opacity: 0.7;
+}
+.cc-license .cc-opacity:hover {
+ opacity: 0.9;
+}
+.cc-license img {
+ display: inline-block;
+}
+.site-author-image {
+ border: 1px solid #eee;
+ max-width: 120px;
+ padding: 2px;
+}
+.site-author-name {
+ color: var(--text-color);
+ font-weight: 600;
+ margin: 0;
+}
+.site-description {
+ color: #999;
+ font-size: 0.8125em;
+ margin-top: 0;
+}
+.links-of-author a {
+ font-size: 0.8125em;
+}
+.links-of-author i[class^='fa'] {
+ margin-right: 2px;
+}
+.sidebar .sidebar-button:not(:first-child) {
+ margin-top: 15px;
+}
+.sidebar .sidebar-button button {
+ background: transparent;
+ color: #fc6423;
+ cursor: pointer;
+ line-height: 2;
+ padding: 0 15px;
+ border: 1px solid #fc6423;
+ border-radius: 4px;
+}
+.sidebar .sidebar-button button:hover {
+ background: #fc6423;
+ color: #fff;
+}
+.sidebar .sidebar-button button i[class^='fa'] {
+ margin-right: 5px;
+}
+.links-of-blogroll {
+ font-size: 0.8125em;
+}
+.links-of-blogroll-title {
+ font-size: 0.875em;
+ font-weight: 600;
+}
+.links-of-blogroll-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.sidebar-nav {
+ font-size: 0.875em;
+ height: 0;
+ margin: 0;
+ overflow: hidden;
+ padding-left: 0;
+ pointer-events: none;
+ transition: 0.2s ease-in-out;
+ transition-property: height, visibility;
+ visibility: hidden;
+}
+.sidebar-nav-active .sidebar-nav {
+ height: calc(2em + 1px);
+ pointer-events: unset;
+ visibility: unset;
+}
+.sidebar-nav li {
+ border-bottom: 1px solid transparent;
+ color: var(--text-color);
+ cursor: pointer;
+ display: inline-block;
+ transition: 0.2s ease-in-out;
+ transition-property: border-bottom-color, color;
+}
+.sidebar-nav li.sidebar-nav-overview {
+ margin-left: 10px;
+}
+.sidebar-nav li:hover {
+ color: #222;
+}
+.sidebar-toc-active .sidebar-nav-toc,
+.sidebar-overview-active .sidebar-nav-overview {
+ border-bottom-color: #222;
+ color: #222;
+ transition-delay: 0.2s;
+}
+.sidebar-toc-active .sidebar-nav-toc:hover,
+.sidebar-overview-active .sidebar-nav-overview:hover {
+ color: #222;
+}
+.sidebar-panel-container {
+ align-items: start;
+ display: grid;
+ flex: 1;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding-top: 0;
+ transition: padding-top 0.2s ease-in-out;
+}
+.sidebar-nav-active .sidebar-panel-container {
+ padding-top: 20px;
+}
+.sidebar-panel {
+ animation: deactivate-sidebar-panel 0.2s ease-in-out;
+ grid-area: 1/1;
+ height: 0;
+ opacity: 0;
+ overflow: hidden;
+ pointer-events: none;
+ transform: translateY(0);
+ transition: 0.2s ease-in-out;
+ transition-delay: 0s;
+ transition-property: opacity, transform, visibility;
+ visibility: hidden;
+}
+.sidebar-nav-active .sidebar-panel,
+.sidebar-overview-active .sidebar-panel.post-toc-wrap {
+ transform: translateY(-20px);
+}
+.sidebar-overview-active:not(.sidebar-nav-active) .sidebar-panel.post-toc-wrap {
+ transition-delay: 0s, 0.2s, 0s;
+}
+.sidebar-overview-active .sidebar-panel.site-overview-wrap,
+.sidebar-toc-active .sidebar-panel.post-toc-wrap {
+ animation-name: activate-sidebar-panel;
+ height: auto;
+ opacity: 1;
+ pointer-events: unset;
+ transform: translateY(0);
+ transition-delay: 0.2s, 0.2s, 0s;
+ visibility: unset;
+}
+.sidebar-panel.site-overview-wrap {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 10px;
+ justify-content: flex-start;
+}
+@keyframes deactivate-sidebar-panel {
+ from {
+ height: var(--inactive-panel-height, 0);
+ }
+ to {
+ height: var(--active-panel-height, 0);
+ }
+}
+@keyframes activate-sidebar-panel {
+ from {
+ height: var(--inactive-panel-height, auto);
+ }
+ to {
+ height: var(--active-panel-height, auto);
+ }
+}
+.sidebar-toggle {
+ bottom: 61px;
+ height: 16px;
+ padding: 5px;
+ width: 16px;
+ background: #222;
+ cursor: pointer;
+ opacity: 0.6;
+ position: fixed;
+ z-index: 30;
+ right: 30px;
+}
+@media (max-width: 991px) {
+ .sidebar-toggle {
+ right: 20px;
+ }
+}
+.sidebar-toggle:hover {
+ opacity: 0.8;
+}
+@media (max-width: 991px) {
+ .sidebar-toggle {
+ opacity: 0.8;
+ }
+}
+.sidebar-toggle:hover .toggle-line {
+ background: #222;
+}
+@media (any-hover: hover) {
+ body:not(.sidebar-active) .sidebar-toggle:hover :first-child {
+ left: 50%;
+ top: 2px;
+ transform: rotate(45deg);
+ width: 50%;
+ }
+ body:not(.sidebar-active) .sidebar-toggle:hover :last-child {
+ left: 50%;
+ top: -2px;
+ transform: rotate(-45deg);
+ width: 50%;
+ }
+}
+.sidebar-active .sidebar-toggle :nth-child(2) {
+ opacity: 0;
+}
+.sidebar-active .sidebar-toggle :first-child {
+ top: 6px;
+ transform: rotate(45deg);
+}
+.sidebar-active .sidebar-toggle :last-child {
+ top: -6px;
+ transform: rotate(-45deg);
+}
+.post-toc {
+ font-size: 0.875em;
+}
+.post-toc ol {
+ list-style: none;
+ margin: 0;
+ padding: 0 2px 0 10px;
+ text-align: left;
+}
+.post-toc ol > :last-child {
+ margin-bottom: 5px;
+}
+.post-toc ol > ol {
+ padding-left: 0;
+}
+.post-toc ol a {
+ transition: all 0.2s ease-in-out;
+}
+.post-toc .nav-item {
+ line-height: 1.8;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.post-toc .nav-item a {
+ color: #a9a9a9;
+ border-bottom: none;
+}
+.post-toc .nav-item a:hover {
+ color: #222;
+}
+.post-toc .nav .nav-child {
+ --height: 0;
+ height: 0;
+ opacity: 0;
+ overflow: hidden;
+ transition-property: height, opacity, visibility;
+ transition: 0.2s ease-in-out;
+ visibility: hidden;
+}
+.post-toc .nav .active > .nav-child {
+ height: var(--height, auto);
+ opacity: 1;
+ visibility: unset;
+}
+.post-toc .nav .active > a {
+ border-bottom-color: #222;
+ color: #222;
+}
+.post-toc .nav .active-current > a {
+ color: #222;
+}
+.post-toc .nav .active-current > a:hover {
+ color: #222;
+}
+.site-state {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ line-height: 1.4;
+}
+.site-state-item {
+ padding: 0 15px;
+}
+.site-state-item a {
+ border-bottom: 0;
+ display: block;
+}
+.site-state-item-count {
+ display: block;
+ font-size: 1em;
+ font-weight: 600;
+}
+.site-state-item-name {
+ color: #999;
+ font-size: 0.8125em;
+}
+.footer {
+ color: #999;
+ font-size: 0.875em;
+ padding: 20px 0;
+ transition: 0.2s ease-in-out;
+ transition-property: left, right;
+}
+.footer.footer-fixed {
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+}
+.footer-inner {
+ box-sizing: border-box;
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ margin: 0 auto;
+ width: calc(100% - 20px);
+}
+@media (max-width: 767px) {
+ .footer-inner {
+ width: auto;
+ }
+}
+@media (min-width: 1200px) {
+ .footer-inner {
+ width: 1160px;
+ }
+}
+@media (min-width: 1600px) {
+ .footer-inner {
+ width: 73%;
+ }
+}
+.use-motion .footer {
+ opacity: 0;
+}
+.languages {
+ display: inline-block;
+ font-size: 1.125em;
+ position: relative;
+}
+.languages .lang-select-label span {
+ margin: 0 0.5em;
+}
+.languages .lang-select {
+ height: 100%;
+ left: 0;
+ opacity: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.with-love {
+ color: #aaa;
+ display: inline-block;
+ margin: 0 5px;
+}
+@keyframes icon-animate {
+ 0%, 100% {
+ transform: scale(1);
+ }
+ 10%, 30% {
+ transform: scale(0.9);
+ }
+ 20%, 40%, 60%, 80% {
+ transform: scale(1.1);
+ }
+ 50%, 70% {
+ transform: scale(1.1);
+ }
+}
+.back-to-top {
+ font-size: 12px;
+ margin: 8px -10px -20px;
+ opacity: 0;
+ transition: opacity 0.2s ease-in-out;
+}
+.back-to-top span {
+ margin-right: 8px;
+}
+.back-to-top .fa {
+ text-align: center;
+ width: 26px;
+}
+.back-to-top.back-to-top-on {
+ cursor: pointer;
+ opacity: 0.6;
+}
+.back-to-top.back-to-top-on:hover {
+ opacity: 0.8;
+}
+.rtl.post-body p,
+.rtl.post-body a,
+.rtl.post-body h1,
+.rtl.post-body h2,
+.rtl.post-body h3,
+.rtl.post-body h4,
+.rtl.post-body h5,
+.rtl.post-body h6,
+.rtl.post-body li,
+.rtl.post-body ul,
+.rtl.post-body ol {
+ direction: rtl;
+ font-family: UKIJ Ekran;
+}
+.rtl.post-title {
+ font-family: UKIJ Ekran;
+}
+.post-button {
+ margin-top: 40px;
+ text-align: center;
+}
+.use-motion .post-block,
+.use-motion .pagination,
+.use-motion .comments {
+ visibility: hidden;
+}
+.use-motion .post-header {
+ visibility: hidden;
+}
+.use-motion .post-body {
+ visibility: hidden;
+}
+.use-motion .collection-header {
+ visibility: hidden;
+}
+.posts-collapse .post-content {
+ margin-bottom: 35px;
+ margin-left: 35px;
+ position: relative;
+}
+@media (max-width: 767px) {
+ .posts-collapse .post-content {
+ margin-left: 0;
+ margin-right: 0;
+ }
+}
+.posts-collapse .post-content .collection-title {
+ font-size: 1.125em;
+ position: relative;
+}
+.posts-collapse .post-content .collection-title::before {
+ background: #999;
+ border: 1px solid #fff;
+ margin-left: -6px;
+ margin-top: -4px;
+ position: absolute;
+ top: 50%;
+ border-radius: 50%;
+ content: ' ';
+ height: 10px;
+ width: 10px;
+}
+.posts-collapse .post-content .collection-year {
+ font-size: 1.5em;
+ font-weight: bold;
+ margin: 60px 0;
+ position: relative;
+}
+.posts-collapse .post-content .collection-year::before {
+ background: #bbb;
+ margin-left: -4px;
+ margin-top: -4px;
+ position: absolute;
+ top: 50%;
+ border-radius: 50%;
+ content: ' ';
+ height: 8px;
+ width: 8px;
+}
+.posts-collapse .post-content .collection-header {
+ display: block;
+ margin-left: 20px;
+}
+.posts-collapse .post-content .collection-header small {
+ color: #bbb;
+ margin-left: 5px;
+}
+.posts-collapse .post-content .post-header {
+ border-bottom: 1px dashed #ccc;
+ margin: 30px 2px 0;
+ padding-left: 15px;
+ position: relative;
+ transition: border 0.2s ease-in-out;
+}
+.posts-collapse .post-content .post-header::before {
+ background: #bbb;
+ border: 1px solid #fff;
+ left: -6px;
+ position: absolute;
+ top: 0.75em;
+ transition: background 0.2s ease-in-out;
+ border-radius: 50%;
+ content: ' ';
+ height: 6px;
+ width: 6px;
+}
+.posts-collapse .post-content .post-header:hover {
+ border-bottom-color: #666;
+}
+.posts-collapse .post-content .post-header:hover::before {
+ background: #222;
+}
+.posts-collapse .post-content .post-meta-container {
+ display: inline;
+ font-size: 0.75em;
+ margin-right: 10px;
+}
+.posts-collapse .post-content .post-title {
+ display: inline;
+}
+.posts-collapse .post-content .post-title a {
+ border-bottom: 0;
+ color: var(--link-color);
+}
+.posts-collapse .post-content::before {
+ background: #f5f5f5;
+ content: ' ';
+ height: 100%;
+ margin-left: -2px;
+ position: absolute;
+ top: 1.25em;
+ width: 4px;
+}
+.post-body {
+ font-family: 'LXGW WenKai Lite';
+ overflow-wrap: break-word;
+}
+@media (min-width: 1200px) {
+ .post-body {
+ font-size: 1.125em;
+ }
+}
+@media (min-width: 992px) {
+ .post-body {
+ text-align: justify;
+ }
+}
+@media (max-width: 991px) {
+ .post-body {
+ text-align: justify;
+ }
+}
+.post-body h1 .header-anchor,
+.post-body h2 .header-anchor,
+.post-body h3 .header-anchor,
+.post-body h4 .header-anchor,
+.post-body h5 .header-anchor,
+.post-body h6 .header-anchor,
+.post-body h1 .headerlink,
+.post-body h2 .headerlink,
+.post-body h3 .headerlink,
+.post-body h4 .headerlink,
+.post-body h5 .headerlink,
+.post-body h6 .headerlink {
+ border-bottom-style: none;
+ color: inherit;
+ float: right;
+ font-size: 0.875em;
+ margin-left: 10px;
+ opacity: 0;
+ transition: opacity 0.3s;
+}
+.post-body h1 .header-anchor::before,
+.post-body h2 .header-anchor::before,
+.post-body h3 .header-anchor::before,
+.post-body h4 .header-anchor::before,
+.post-body h5 .header-anchor::before,
+.post-body h6 .header-anchor::before,
+.post-body h1 .headerlink::before,
+.post-body h2 .headerlink::before,
+.post-body h3 .headerlink::before,
+.post-body h4 .headerlink::before,
+.post-body h5 .headerlink::before,
+.post-body h6 .headerlink::before {
+ content: '\23';
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+}
+.post-body h1:hover .header-anchor,
+.post-body h2:hover .header-anchor,
+.post-body h3:hover .header-anchor,
+.post-body h4:hover .header-anchor,
+.post-body h5:hover .header-anchor,
+.post-body h6:hover .header-anchor,
+.post-body h1:hover .headerlink,
+.post-body h2:hover .headerlink,
+.post-body h3:hover .headerlink,
+.post-body h4:hover .headerlink,
+.post-body h5:hover .headerlink,
+.post-body h6:hover .headerlink {
+ opacity: 0.5;
+}
+.post-body h1:hover .header-anchor:hover,
+.post-body h2:hover .header-anchor:hover,
+.post-body h3:hover .header-anchor:hover,
+.post-body h4:hover .header-anchor:hover,
+.post-body h5:hover .header-anchor:hover,
+.post-body h6:hover .header-anchor:hover,
+.post-body h1:hover .headerlink:hover,
+.post-body h2:hover .headerlink:hover,
+.post-body h3:hover .headerlink:hover,
+.post-body h4:hover .headerlink:hover,
+.post-body h5:hover .headerlink:hover,
+.post-body h6:hover .headerlink:hover {
+ opacity: 1;
+}
+.post-body .exturl .fa {
+ font-size: 0.875em;
+ margin-left: 4px;
+}
+.post-body img + figcaption,
+.post-body .fancybox + figcaption {
+ color: #999;
+ font-size: 0.875em;
+ font-weight: bold;
+ line-height: 1;
+ margin: -15px auto 15px;
+ text-align: center;
+}
+.post-body iframe,
+.post-body img,
+.post-body video,
+.post-body embed {
+ margin-bottom: 20px;
+}
+.post-body img {
+ border-radius: 5px;
+ box-shadow: 5px 5px 5px rgba(0,0,0,0.06), -2px -2px 5px rgba(0,0,0,0.04);
+}
+.post-body .video-container {
+ height: 0;
+ margin-bottom: 20px;
+ overflow: hidden;
+ padding-top: 75%;
+ position: relative;
+ width: 100%;
+}
+.post-body .video-container iframe,
+.post-body .video-container object,
+.post-body .video-container embed {
+ height: 100%;
+ left: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.post-gallery {
+ display: flex;
+ min-height: 200px;
+}
+.post-gallery .post-gallery-image {
+ flex: 1;
+}
+.post-gallery .post-gallery-image:not(:first-child) {
+ clip-path: polygon(40px 0, 100% 0, 100% 100%, 0 100%);
+ margin-left: -20px;
+}
+.post-gallery .post-gallery-image:not(:last-child) {
+ margin-right: -20px;
+}
+.post-gallery .post-gallery-image img {
+ height: 100%;
+ object-fit: cover;
+ opacity: 1;
+ width: 100%;
+}
+.posts-expand .post-gallery {
+ margin-bottom: 60px;
+}
+.posts-collapse .post-gallery {
+ margin: 15px 0;
+}
+.posts-expand .post-header {
+ font-size: 1.125em;
+ margin-bottom: 25px;
+}
+.posts-expand .post-title {
+ font-size: 1.5em;
+ text-align: left;
+ border-left: 8px solid #333;
+ border-radius: 3px;
+ padding-left: 10px;
+ font-weight: bolder;
+ margin: initial;
+ overflow-wrap: break-word;
+}
+.posts-expand .post-title-link {
+ border-bottom: 0;
+ color: var(--link-color);
+ display: inline-block;
+ position: relative;
+}
+.posts-expand .post-title-link::before {
+ background: var(--link-color);
+ bottom: 0;
+ content: '';
+ height: 2px;
+ left: 0;
+ position: absolute;
+ transform: scaleX(0);
+ transition: transform 0.2s ease-in-out;
+ width: 100%;
+}
+.posts-expand .post-title-link:hover::before {
+ transform: scaleX(1);
+}
+.posts-expand .post-title-link .fa {
+ font-size: 0.875em;
+ margin-left: 5px;
+}
+.post-sticky-flag {
+ display: inline-block;
+ margin-right: 8px;
+ transform: rotate(30deg);
+}
+.posts-expand .post-meta-container {
+ color: #999;
+ font-family: 'LXGW WenKai Lite';
+ font-size: 0.75em;
+ margin-top: 3px;
+}
+.posts-expand .post-meta-container .post-description {
+ font-size: 0.875em;
+ margin-top: 2px;
+}
+.posts-expand .post-meta-container time {
+ border-bottom: 1px dashed #999;
+}
+.post-meta {
+ display: flex;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ justify-content: left;
+}
+:not(.post-meta-break) + .post-meta-item::before {
+ content: '|';
+ margin: 0 0.5em;
+}
+.post-meta-item-icon {
+ margin-right: 3px;
+}
+@media (max-width: 991px) {
+ .post-meta-item-text {
+ display: none;
+ }
+}
+.post-meta-break {
+ flex-basis: 100%;
+ height: 0;
+}
+.post-nav {
+ border-top: 1px solid #eee;
+ display: flex;
+ gap: 30px;
+ justify-content: space-between;
+ margin-top: 1em;
+ padding: 10px 5px 0;
+}
+.post-nav-item {
+ flex: 1;
+}
+.post-nav-item a {
+ border-bottom: 0;
+ display: block;
+ font-size: 0.875em;
+ line-height: 1.6;
+}
+.post-nav-item a:active {
+ top: 2px;
+}
+.post-nav-item .fa {
+ font-size: 0.75em;
+}
+.post-nav-item:first-child .fa {
+ margin-right: 5px;
+}
+.post-nav-item:last-child {
+ text-align: right;
+}
+.post-nav-item:last-child .fa {
+ margin-left: 5px;
+}
+.post-footer {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+.post-eof {
+ background: #ccc;
+ height: 1px;
+ margin: 80px auto 60px;
+ width: 8%;
+}
+.post-block:last-of-type .post-eof {
+ display: none;
+}
+.post-tags {
+ margin-top: 40px;
+ text-align: center;
+}
+.post-tags a {
+ display: inline-block;
+ font-size: 0.8125em;
+ border-bottom: none;
+}
+.post-tags a:not(:last-child) {
+ margin-right: 10px;
+}
+.social-like {
+ border-top: 1px solid #eee;
+ font-size: 0.875em;
+ margin-top: 1em;
+ padding-top: 1em;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+.social-like a {
+ border-bottom: none;
+}
+.reward-container {
+ margin: 1em 0 0;
+ padding: 1em 0;
+ text-align: center;
+}
+.reward-container button {
+ background: transparent;
+ color: #222;
+ cursor: pointer;
+ line-height: 2;
+ padding: 0 15px;
+ border: 2px solid #222;
+ border-radius: 2px;
+ outline: 0;
+ transition: all 0.2s ease-in-out;
+ vertical-align: text-top;
+}
+.reward-container button:hover {
+ background: #222;
+ color: #fff;
+}
+.post-reward {
+ display: none;
+ padding-top: 20px;
+}
+.post-reward.active {
+ display: block;
+}
+.post-reward div {
+ display: inline-block;
+}
+.post-reward div span {
+ display: block;
+}
+.post-reward img {
+ display: inline-block;
+ margin: 0.8em 2em 0;
+ max-width: 100%;
+ width: 180px;
+}
+@keyframes next-roll {
+ from {
+ transform: rotateZ(30deg);
+ }
+ to {
+ transform: rotateZ(-30deg);
+ }
+}
+.category-all-page .category-all-title {
+ text-align: center;
+}
+.category-all-page .category-all {
+ margin-top: 20px;
+}
+.category-all-page .category-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.category-all-page .category-list-item {
+ margin: 5px 10px;
+}
+.category-all-page .category-list-count {
+ color: #bbb;
+}
+.category-all-page .category-list-count::before {
+ content: ' (';
+}
+.category-all-page .category-list-count::after {
+ content: ') ';
+}
+.category-all-page .category-list-child {
+ padding-left: 10px;
+}
+.event-list hr {
+ background: #222;
+ margin: 20px 0 45px;
+}
+.event-list hr::after {
+ background: #222;
+ color: #fff;
+ content: 'NOW';
+ display: inline-block;
+ font-weight: bold;
+ padding: 0 5px;
+}
+.event-list .event {
+ --event-background: #222;
+ --event-foreground: #bbb;
+ --event-title: #fff;
+ background: var(--event-background);
+ padding: 15px;
+}
+.event-list .event .event-summary {
+ border-bottom: 0;
+ color: var(--event-title);
+ margin: 0;
+ padding: 0 0 0 35px;
+ position: relative;
+}
+.event-list .event .event-summary::before {
+ animation: dot-flash 1s alternate infinite ease-in-out;
+ background: var(--event-title);
+ left: 0;
+ margin-top: -6px;
+ position: absolute;
+ top: 50%;
+ border-radius: 50%;
+ content: ' ';
+ height: 12px;
+ width: 12px;
+}
+.event-list .event:nth-of-type(odd) .event-summary::before {
+ animation-delay: 0.5s;
+}
+.event-list .event:not(:last-child) {
+ margin-bottom: 20px;
+}
+.event-list .event .event-relative-time {
+ color: var(--event-foreground);
+ display: inline-block;
+ font-size: 12px;
+ font-weight: normal;
+ padding-left: 12px;
+}
+.event-list .event .event-details {
+ color: var(--event-foreground);
+ display: block;
+ line-height: 18px;
+ padding: 6px 0 6px 35px;
+}
+.event-list .event .event-details::before {
+ color: var(--event-foreground);
+ display: inline-block;
+ margin-right: 9px;
+ width: 14px;
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 900;
+}
+.event-list .event .event-details.event-location::before {
+ content: '\f041';
+}
+.event-list .event .event-details.event-duration::before {
+ content: '\f017';
+}
+.event-list .event .event-details.event-description::before {
+ content: '\f024';
+}
+.event-list .event-past {
+ --event-background: #f5f5f5;
+ --event-foreground: #999;
+ --event-title: #222;
+}
+@keyframes dot-flash {
+ from {
+ opacity: 1;
+ transform: scale(1);
+ }
+ to {
+ opacity: 0;
+ transform: scale(0.8);
+ }
+}
+ul.breadcrumb {
+ font-size: 0.75em;
+ list-style: none;
+ margin: 1em 0;
+ padding: 0 2em;
+ text-align: center;
+}
+ul.breadcrumb li {
+ display: inline;
+}
+ul.breadcrumb li:not(:first-child)::before {
+ content: '/\00a0';
+ font-weight: normal;
+ padding: 0.5em;
+}
+ul.breadcrumb li:last-child {
+ font-weight: bold;
+}
+.tag-cloud {
+ text-align: center;
+}
+.tag-cloud .tag-cloud-title {
+ text-align: left;
+}
+.tag-cloud a {
+ display: inline-block;
+ margin: 10px;
+ border-bottom: none;
+ border-radius: 4px;
+ box-shadow: 0.8px 0.8px rgba(0,0,0,0.08), -0.8px -0.8px rgba(0,0,0,0.08);
+ transition: color 0.3s, background-color 0.3s, box-shadow 0.3s;
+}
+.tag-cloud a:hover {
+ color: #fff;
+ background-color: #333;
+ box-shadow: 3px 3px 5px rgba(0,0,0,0.1);
+}
+.tag-cloud-0 {
+ border-bottom-color: #aaa;
+ color: #aaa;
+}
+.tag-cloud-1 {
+ border-bottom-color: #9a9a9a;
+ color: #9a9a9a;
+}
+.tag-cloud-2 {
+ border-bottom-color: #8b8b8b;
+ color: #8b8b8b;
+}
+.tag-cloud-3 {
+ border-bottom-color: #7c7c7c;
+ color: #7c7c7c;
+}
+.tag-cloud-4 {
+ border-bottom-color: #6c6c6c;
+ color: #6c6c6c;
+}
+.tag-cloud-5 {
+ border-bottom-color: #5d5d5d;
+ color: #5d5d5d;
+}
+.tag-cloud-6 {
+ border-bottom-color: #4e4e4e;
+ color: #4e4e4e;
+}
+.tag-cloud-7 {
+ border-bottom-color: #3e3e3e;
+ color: #3e3e3e;
+}
+.tag-cloud-8 {
+ border-bottom-color: #2f2f2f;
+ color: #2f2f2f;
+}
+.tag-cloud-9 {
+ border-bottom-color: #202020;
+ color: #202020;
+}
+.tag-cloud-10 {
+ border-bottom-color: #111;
+ color: #111;
+}
+.search-active {
+ overflow: hidden;
+}
+.search-pop-overlay {
+ background: rgba(0,0,0,0);
+ display: flex;
+ height: 100%;
+ left: 0;
+ position: fixed;
+ top: 0;
+ transition: visibility 0.4s, background 0.4s;
+ visibility: hidden;
+ width: 100%;
+ z-index: 40;
+}
+.search-active .search-pop-overlay {
+ background: rgba(0,0,0,0.3);
+ visibility: visible;
+}
+.search-popup {
+ background: var(--card-bg-color);
+ border-radius: 5px;
+ height: 80%;
+ margin: auto;
+ transform: translate(-200%);
+ transition: transform 0.6s;
+ width: 700px;
+}
+.search-active .search-popup {
+ transform: translate(0);
+}
+@media (max-width: 767px) {
+ .search-popup {
+ border-radius: 0;
+ height: 100%;
+ width: 100%;
+ }
+}
+.search-popup .search-icon,
+.search-popup .popup-btn-close {
+ color: #999;
+ font-size: 18px;
+ padding: 0 10px;
+}
+.search-popup .popup-btn-close {
+ cursor: pointer;
+}
+.search-popup .popup-btn-close:hover .fa {
+ color: #222;
+}
+.search-popup .search-header {
+ background: #eee;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ display: flex;
+ padding: 5px;
+}
+.search-popup input.search-input {
+ background: transparent;
+ border: 0;
+ outline: 0;
+ width: 100%;
+}
+.search-popup input.search-input::-webkit-search-cancel-button {
+ display: none;
+}
+.search-popup .search-result-container {
+ height: calc(100% - 55px);
+ overflow: auto;
+ padding: 5px 25px;
+}
+.search-popup .search-result-container hr {
+ margin: 5px 0 10px;
+}
+.search-popup .search-result-container hr:first-child {
+ display: none;
+}
+.search-popup .search-result-list {
+ margin: 0 5px;
+ padding: 0;
+}
+.search-popup .search-result-list li::marker {
+ content: none;
+}
+.search-popup a.search-result-title {
+ font-weight: bold;
+}
+.search-popup p.search-result {
+ border-bottom: 1px dashed #ccc;
+ padding: 5px 0;
+}
+.search-popup .search-input-container {
+ flex-grow: 1;
+ padding: 2px;
+}
+.search-popup .no-result {
+ display: flex;
+}
+.search-popup .search-result-list {
+ width: 100%;
+}
+.search-popup .search-result-icon {
+ color: #ccc;
+ margin: auto;
+}
+mark.search-keyword {
+ background: transparent;
+ border-bottom: 1px dashed #000;
+ color: #000;
+ font-weight: bold;
+}
+mjx-container[jax='CHTML'][display='true'],
+.has-jax {
+ overflow: auto hidden;
+}
+mjx-container[display='true'] + br {
+ display: none;
+}
+.use-motion .animated {
+ animation-fill-mode: none;
+ visibility: inherit;
+}
+.use-motion .sidebar .animated {
+ animation-fill-mode: both;
+}
+header.header {
+ background: var(--content-bg-color);
+ border-radius: 5px;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12);
+ margin-top: 10px;
+}
+@media (max-width: 767px) {
+ header.header {
+ margin-top: 0;
+ }
+}
+@media (max-width: 991px) {
+ header.header {
+ border-radius: initial;
+ }
+}
+.main {
+ align-items: stretch;
+ display: flex;
+ justify-content: space-between;
+ margin: 0 auto;
+ width: calc(100% - 20px);
+}
+@media (max-width: 767px) {
+ .main {
+ width: auto;
+ }
+}
+@media (min-width: 1200px) {
+ .main {
+ width: 1160px;
+ }
+}
+@media (min-width: 1600px) {
+ .main {
+ width: 73%;
+ }
+}
+@media (max-width: 991px) {
+ .main {
+ display: block;
+ width: auto;
+ }
+}
+.main-inner {
+ border-radius: 0 0 5px 5px;
+ box-sizing: border-box;
+ width: calc(100% - 252px);
+}
+@media (max-width: 991px) {
+ .main-inner {
+ border-radius: initial;
+ width: 100%;
+ }
+}
+.footer-inner {
+ padding-left: 252px;
+}
+@media (max-width: 991px) {
+ .footer-inner {
+ padding-left: 0;
+ padding-right: 0;
+ width: auto;
+ }
+}
+.column {
+ width: 240px;
+}
+@media (max-width: 991px) {
+ .column {
+ width: auto;
+ }
+}
+.site-brand-container {
+ background: var(--theme-color);
+}
+@media (max-width: 991px) {
+ .site-nav-on .site-brand-container {
+ box-shadow: 0 0 16px rgba(0,0,0,0.5);
+ }
+}
+.site-meta {
+ padding: 20px 0;
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .site-nav-toggle,
+ .site-nav-right {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ }
+}
+.site-nav-toggle .toggle,
+.site-nav-right .toggle {
+ color: #fff;
+}
+.site-nav-toggle .toggle .toggle-line,
+.site-nav-right .toggle .toggle-line {
+ background: #fff;
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .site-nav {
+ --scroll-height: 0;
+ height: 0;
+ overflow: hidden;
+ transition: 0.2s ease-in-out;
+ transition-property: height, visibility;
+ visibility: hidden;
+ }
+ body:not(.site-nav-on) .site-nav .animated {
+ animation: none;
+ }
+ body.site-nav-on .site-nav {
+ height: var(--scroll-height);
+ visibility: unset;
+ }
+}
+.menu .menu-item {
+ display: block;
+ margin: auto;
+ padding-left: 5%;
+}
+.menu .menu-item a {
+ padding: 5px 20px;
+ position: relative;
+ text-align: left;
+ border-radius: 3px;
+ transition-property: background-color;
+}
+@media (max-width: 991px) {
+ .menu .menu-item.menu-item-search {
+ display: none;
+ }
+}
+.menu .menu-item .badge {
+ background: #ccc;
+ border-radius: 10px;
+ color: var(--content-bg-color);
+ float: right;
+ padding: 2px 5px;
+ text-shadow: 1px 1px 0 rgba(0,0,0,0.1);
+}
+.morebtn-item {
+ visibility: hidden;
+ opacity: 0;
+ padding: 0 !important;
+ height: 0;
+ transition: all 0.4s !important;
+}
+a#morebtn:hover ~ .morebtn-item,
+.menu-item-more:hover .morebtn-item {
+ visibility: visible;
+ opacity: 1;
+ padding: 5px 20px !important;
+ height: 26px;
+}
+@media (max-width: 991px) {
+ .morebtn-item {
+ visibility: visible;
+ opacity: 1;
+ padding: 5px 20px !important;
+ height: 26px;
+ }
+}
+.main-menu .menu-item-active::before {
+ background: #bfbfbf;
+ border-radius: 6px;
+ content: "";
+ height: 1.5rem;
+ left: calc(0.5rem * -1);
+ position: absolute;
+ top: calc(50% - 12px);
+ width: 0.25rem;
+}
+.sub-menu {
+ margin: 0;
+ padding: 6px 0;
+}
+.sub-menu .menu-item {
+ display: inline-block;
+}
+.sub-menu .menu-item a {
+ background: transparent;
+ margin: 5px 10px;
+ padding: initial;
+}
+.sub-menu .menu-item a:hover {
+ background: transparent;
+ color: #222;
+}
+.sub-menu .menu-item-active {
+ border-bottom-color: #222;
+ color: #222;
+}
+.sub-menu .menu-item-active:hover {
+ border-bottom-color: #222;
+}
+.sidebar {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 12px;
+}
+@media (max-width: 991px) {
+ .sidebar {
+ display: none;
+ }
+}
+.sidebar-inner {
+ background: var(--content-bg-color);
+ border-radius: 5px;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12), 0 -1px 0.5px 0 rgba(0,0,0,0.09);
+ box-sizing: border-box;
+ color: var(--text-color);
+ margin-top: 12px;
+ max-height: calc(100vh - 24px);
+}
+.site-state-item {
+ padding: 0 10px;
+}
+.sidebar .sidebar-button {
+ border-bottom: 1px dotted #ccc;
+ border-top: 1px dotted #ccc;
+}
+.sidebar .sidebar-button button {
+ border: 0;
+ color: #fc6423;
+ display: block;
+ width: 100%;
+}
+.sidebar .sidebar-button button:hover {
+ background: none;
+ border: 0;
+ color: #e34603;
+}
+.links-of-author {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+.links-of-author-item {
+ margin: 5px 0 0;
+ width: 50%;
+}
+.links-of-author-item a {
+ box-sizing: border-box;
+ display: inline-block;
+ max-width: 100%;
+ overflow: hidden;
+ padding: 0 5px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.links-of-author-item a {
+ border-bottom: 0;
+ border-radius: 4px;
+ display: block;
+ transition: background 0.3s;
+}
+.links-of-author-item a:hover {
+ background: var(--body-bg-color);
+}
+.back-to-top {
+ background: var(--body-bg-color);
+ margin: -4px -10px -18px;
+}
+.back-to-top.back-to-top-on {
+ margin-top: 16px;
+}
+.main-inner {
+ margin-top: 10px;
+}
+.main-inner .sub-menu,
+.main-inner .post-block,
+.main-inner .tabs-comment,
+.main-inner > .comments,
+.main-inner .comment-position .comments,
+.main-inner .pagination {
+ background: var(--content-bg-color);
+ border-radius: 5px;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12);
+}
+.main-inner .post-block:not(:first-child):not(:first-child) {
+ border-radius: 5px;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12), 0 -1px 0.5px 0 rgba(0,0,0,0.09);
+ margin-top: 12px;
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .main-inner .post-block:not(:first-child):not(:first-child) {
+ margin-top: 10px;
+ }
+}
+@media (max-width: 767px) {
+ .main-inner .post-block:not(:first-child):not(:first-child) {
+ margin-top: 8px;
+ }
+}
+.main-inner .tabs-comment,
+.main-inner > .comments,
+.main-inner .comment-position .comments,
+.main-inner .pagination {
+ border-radius: 5px;
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.06), 0 1px 5px 0 rgba(0,0,0,0.12), 0 -1px 0.5px 0 rgba(0,0,0,0.09);
+ margin-top: 12px;
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .main-inner .tabs-comment,
+ .main-inner > .comments,
+ .main-inner .comment-position .comments,
+ .main-inner .pagination {
+ margin-top: 10px;
+ }
+}
+@media (max-width: 767px) {
+ .main-inner .tabs-comment,
+ .main-inner > .comments,
+ .main-inner .comment-position .comments,
+ .main-inner .pagination {
+ margin-top: 8px;
+ }
+}
+.post-block,
+.comments {
+ padding: 40px;
+}
+.post-eof {
+ display: none;
+}
+.pagination {
+ border-top: initial;
+ padding: 10px 0;
+}
+.post-body h1,
+.post-body h2 {
+ border-bottom: 1px solid #eee;
+}
+.post-body h3 {
+ border-bottom: 1px dotted #eee;
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .main-inner {
+ padding: 10px;
+ }
+ .posts-expand .post-button {
+ margin-top: 20px;
+ }
+ .post-block {
+ padding: 20px;
+ }
+ .comments {
+ padding: 10px 20px;
+ }
+}
+@media (max-width: 767px) {
+ .main-inner {
+ padding: 8px;
+ }
+ .posts-expand .post-button {
+ margin: 12px 0;
+ }
+ .post-block {
+ padding: 12px;
+ }
+ .comments {
+ padding: 10px 12px;
+ }
+}
diff --git a/css/noscript.css b/css/noscript.css
new file mode 100644
index 00000000..6418c57d
--- /dev/null
+++ b/css/noscript.css
@@ -0,0 +1,48 @@
+body {
+ margin-top: 2rem;
+}
+.use-motion .menu-item,
+.use-motion .sidebar,
+.use-motion .sidebar-inner,
+.use-motion .post-block,
+.use-motion .pagination,
+.use-motion .comments,
+.use-motion .post-header,
+.use-motion .post-body,
+.use-motion .collection-header {
+ visibility: visible;
+}
+.use-motion .column,
+.use-motion .site-brand-container .toggle,
+.use-motion .footer {
+ opacity: initial;
+}
+.use-motion .site-title,
+.use-motion .site-subtitle,
+.use-motion .custom-logo-image {
+ opacity: initial;
+ top: initial;
+}
+.use-motion .logo-line {
+ transform: scaleX(1);
+}
+.search-pop-overlay,
+.sidebar-nav {
+ display: none;
+}
+.sidebar-panel {
+ display: block;
+}
+.noscript-warning {
+ background-color: #f55;
+ color: #fff;
+ font-family: sans-serif;
+ font-size: 1rem;
+ font-weight: bold;
+ left: 0;
+ position: fixed;
+ text-align: center;
+ top: 0;
+ width: 100%;
+ z-index: 50;
+}
diff --git a/friends/index.html b/friends/index.html
new file mode 100644
index 00000000..8ded2aef
--- /dev/null
+++ b/friends/index.html
@@ -0,0 +1,496 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+友情链接 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/images/background3.svg b/images/background3.svg
new file mode 100644
index 00000000..6f1e59f9
--- /dev/null
+++ b/images/background3.svg
@@ -0,0 +1 @@
+
diff --git a/images/icon-16x16.png b/images/icon-16x16.png
new file mode 100644
index 00000000..87ca6565
Binary files /dev/null and b/images/icon-16x16.png differ
diff --git a/images/icon-32x32.png b/images/icon-32x32.png
new file mode 100644
index 00000000..2a2bd00f
Binary files /dev/null and b/images/icon-32x32.png differ
diff --git a/images/icon.png b/images/icon.png
new file mode 100644
index 00000000..37f878c9
Binary files /dev/null and b/images/icon.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..727a92ef
--- /dev/null
+++ b/index.html
@@ -0,0 +1,715 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这是记录写简单的一个 Chomium 扩展的一篇文章。 主要是用扩展覆盖默认标签页,随后 HTML 引用 JS 进行(模拟)重定向到 chrome-search://local-ntp/local-ntp.html。
+
开始 浏览器扩展都需要 manifest.json 文件。先新建一个文件夹,在里面添加了这个文件。
+
由于需要覆盖新标签页,需要 chrome_url_overrides.newtab
属性。它可以覆盖新的标签页,指定为扩展(文件夹)内的 HTML 文件(不能使用第三方 URL)。 随后还需要增加必要的值:name
,version
和 manifest_version
。它们分别对应扩展显示的名字,显示的版本和 manifest 的版本,manifest 的版本填 3 就可以了。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
看了看“归档 ”页面才发现自己没有在 2024 发布 过文章。最近寒假作业写累了(思维导图太烦啦),就更新了下留言板,从 giscus 换成了 waline ,不用登录就可以留言了,管理也更方便。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
写在前面的废话: 又是一篇分类于“琐碎”的文章。 加上这篇文章,这个分类下才有三篇文章。想来这个博客在运行 hexo init
之初,我就没想过写生活向的文章。如今“琐碎”下,一篇是画,两篇是作文收集,勉强算是透露了点生活向。 想想自己喜欢的,是 HTML, CSS, JavaScript 给我带来的样式美化 、多样性 和自主性 。不然我怎么不记到 .txt 里呢?也不知初衷是什么,唉,这样弄又有些喧宾夺主了。多年后看到,也就微微一笑,笑自己写出的东西古怪? 吧。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这篇文章主要是为了记录自己用 Hexo 建站(主题 NexT)的经过,方便他人查阅和自己以后用。 关于 Hexo 的准备,可以看官方文档 ,关于主题 NexT 的,可以看 这里
+
如果你是的阅读目的是准备第一次使用 Hexo 搭博客,可以遵照本文提示看。 如果你准备美化你的 Hexo(最好且主题为 NexT)的博客,可以跳到 更多高阶美化
+
操作系统的异同
+
各种操作系统的过程基本一致。本文中的安装环境的主要做法是直接通过官网下载安装,其他下载方法也可行,这里不列举。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
从 ncase.me 学来的,可以自己看源码。主要是通过背景图片 的位置实现。结合了 CSS 和 JS。 可以自己增加一个函数在隐藏时执行。 你只要这样就可以:
+
< p>
+ 美好的文字
+ Have a good day!
+ < div class = " scratcher" > </ div>
+</ p>
+
+
代码和示例请看下面。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/js/bookmark.js b/js/bookmark.js
new file mode 100644
index 00000000..8e3ae6ad
--- /dev/null
+++ b/js/bookmark.js
@@ -0,0 +1,56 @@
+/* global CONFIG */
+
+document.addEventListener('DOMContentLoaded', () => {
+ 'use strict';
+
+ const doSaveScroll = () => {
+ localStorage.setItem('bookmark' + location.pathname, window.scrollY);
+ };
+
+ const scrollToMark = () => {
+ let top = localStorage.getItem('bookmark' + location.pathname);
+ top = parseInt(top, 10);
+ // If the page opens with a specific hash, just jump out
+ if (!isNaN(top) && location.hash === '') {
+ // Auto scroll to the position
+ window.anime({
+ targets : document.scrollingElement,
+ duration : 200,
+ easing : 'linear',
+ scrollTop: top
+ });
+ }
+ };
+ // Register everything
+ const init = function(trigger) {
+ // Create a link element
+ const link = document.querySelector('.book-mark-link');
+ // Scroll event
+ window.addEventListener('scroll', () => link.classList.toggle('book-mark-link-fixed', window.scrollY === 0), { passive: true });
+ // Register beforeunload event when the trigger is auto
+ if (trigger === 'auto') {
+ // Register beforeunload event
+ window.addEventListener('beforeunload', doSaveScroll);
+ document.addEventListener('pjax:send', doSaveScroll);
+ }
+ // Save the position by clicking the icon
+ link.addEventListener('click', () => {
+ doSaveScroll();
+ window.anime({
+ targets : link,
+ duration: 200,
+ easing : 'linear',
+ top : -30,
+ complete: () => {
+ setTimeout(() => {
+ link.style.top = '';
+ }, 400);
+ }
+ });
+ });
+ scrollToMark();
+ document.addEventListener('pjax:success', scrollToMark);
+ };
+
+ init(CONFIG.bookmark.save);
+});
diff --git a/js/comments-buttons.js b/js/comments-buttons.js
new file mode 100644
index 00000000..505c21b7
--- /dev/null
+++ b/js/comments-buttons.js
@@ -0,0 +1,25 @@
+/* global CONFIG */
+
+(function() {
+ const commentButton = document.querySelectorAll('.comment-button');
+ commentButton.forEach(element => {
+ const commentClass = element.classList[2];
+ element.addEventListener('click', () => {
+ commentButton.forEach(active => active.classList.toggle('active', active === element));
+ document.querySelectorAll('.comment-position').forEach(active => active.classList.toggle('active', active.classList.contains(commentClass)));
+ if (CONFIG.comments.storage) {
+ localStorage.setItem('comments_active', commentClass);
+ }
+ });
+ });
+ let { activeClass } = CONFIG.comments;
+ if (CONFIG.comments.storage) {
+ activeClass = localStorage.getItem('comments_active') || activeClass;
+ }
+ if (activeClass) {
+ const activeButton = document.querySelector(`.comment-button.${activeClass}`);
+ if (activeButton) {
+ activeButton.click();
+ }
+ }
+})();
diff --git a/js/comments.js b/js/comments.js
new file mode 100644
index 00000000..4045e8c0
--- /dev/null
+++ b/js/comments.js
@@ -0,0 +1,21 @@
+/* global CONFIG */
+
+window.addEventListener('tabs:register', () => {
+ let { activeClass } = CONFIG.comments;
+ if (CONFIG.comments.storage) {
+ activeClass = localStorage.getItem('comments_active') || activeClass;
+ }
+ if (activeClass) {
+ const activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
+ if (activeTab) {
+ activeTab.click();
+ }
+ }
+});
+if (CONFIG.comments.storage) {
+ window.addEventListener('tabs:click', event => {
+ if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
+ const commentClass = event.target.classList[1];
+ localStorage.setItem('comments_active', commentClass);
+ });
+}
diff --git a/js/config.js b/js/config.js
new file mode 100644
index 00000000..caa0075b
--- /dev/null
+++ b/js/config.js
@@ -0,0 +1,66 @@
+if (!window.NexT) window.NexT = {};
+
+(function() {
+ const className = 'next-config';
+
+ const staticConfig = {};
+ let variableConfig = {};
+
+ const parse = text => JSON.parse(text || '{}');
+
+ const update = name => {
+ const targetEle = document.querySelector(`.${className}[data-name="${name}"]`);
+ if (!targetEle) return;
+ const parsedConfig = parse(targetEle.text);
+ if (name === 'main') {
+ Object.assign(staticConfig, parsedConfig);
+ } else {
+ variableConfig[name] = parsedConfig;
+ }
+ };
+
+ update('main');
+
+ window.CONFIG = new Proxy({}, {
+ get(overrideConfig, name) {
+ let existing;
+ if (name in staticConfig) {
+ existing = staticConfig[name];
+ } else {
+ if (!(name in variableConfig)) update(name);
+ existing = variableConfig[name];
+ }
+
+ // For unset override and mixable existing
+ if (!(name in overrideConfig) && typeof existing === 'object') {
+ // Get ready to mix.
+ overrideConfig[name] = {};
+ }
+
+ if (name in overrideConfig) {
+ const override = overrideConfig[name];
+
+ // When mixable
+ if (typeof override === 'object' && typeof existing === 'object') {
+ // Mix, proxy changes to the override.
+ return new Proxy({ ...existing, ...override }, {
+ set(target, prop, value) {
+ target[prop] = value;
+ override[prop] = value;
+ return true;
+ }
+ });
+ }
+
+ return override;
+ }
+
+ // Only when not mixable and override hasn't been set.
+ return existing;
+ }
+ });
+
+ document.addEventListener('pjax:success', () => {
+ variableConfig = {};
+ });
+})();
diff --git a/js/motion.js b/js/motion.js
new file mode 100644
index 00000000..aad22db1
--- /dev/null
+++ b/js/motion.js
@@ -0,0 +1,140 @@
+/* global NexT, CONFIG */
+
+NexT.motion = {};
+
+NexT.motion.integrator = {
+ queue: [],
+ init : function() {
+ this.queue = [];
+ return this;
+ },
+ add: function(fn) {
+ const sequence = fn();
+ if (CONFIG.motion.async) this.queue.push(sequence);
+ else this.queue = this.queue.concat(sequence);
+ return this;
+ },
+ bootstrap: function() {
+ if (!CONFIG.motion.async) this.queue = [this.queue];
+ this.queue.forEach(sequence => {
+ const timeline = window.anime.timeline({
+ duration: 200,
+ easing : 'linear'
+ });
+ sequence.forEach(item => {
+ if (item.deltaT) timeline.add(item, item.deltaT);
+ else timeline.add(item);
+ });
+ });
+ }
+};
+
+NexT.motion.middleWares = {
+ header: function() {
+ const sequence = [];
+
+ function getMistLineSettings(targets) {
+ sequence.push({
+ targets,
+ scaleX : [0, 1],
+ duration: 500,
+ deltaT : '-=200'
+ });
+ }
+
+ function pushToSequence(targets, sequenceQueue = false) {
+ sequence.push({
+ targets,
+ opacity: 1,
+ top : 0,
+ deltaT : sequenceQueue ? '-=200' : '-=0'
+ });
+ }
+
+ pushToSequence('.column');
+ CONFIG.scheme === 'Mist' && getMistLineSettings('.logo-line');
+ CONFIG.scheme === 'Muse' && pushToSequence('.custom-logo-image');
+ pushToSequence('.site-title');
+ pushToSequence('.site-brand-container .toggle', true);
+ pushToSequence('.site-subtitle');
+ (CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') && pushToSequence('.custom-logo-image');
+
+ const menuItemTransition = CONFIG.motion.transition.menu_item;
+ if (menuItemTransition) {
+ document.querySelectorAll('.menu-item').forEach(targets => {
+ sequence.push({
+ targets,
+ complete: () => targets.classList.add('animated', menuItemTransition),
+ deltaT : '-=200'
+ });
+ });
+ }
+
+ return sequence;
+ },
+
+ subMenu: function() {
+ const subMenuItem = document.querySelectorAll('.sub-menu .menu-item');
+ if (subMenuItem.length > 0) {
+ subMenuItem.forEach(element => {
+ element.classList.add('animated');
+ });
+ }
+ return [];
+ },
+
+ postList: function() {
+ const sequence = [];
+ const { post_block, post_header, post_body, coll_header } = CONFIG.motion.transition;
+
+ function animate(animation, elements) {
+ if (!animation) return;
+ elements.forEach(targets => {
+ sequence.push({
+ targets,
+ complete: () => targets.classList.add('animated', animation),
+ deltaT : '-=100'
+ });
+ });
+ }
+
+ document.querySelectorAll('.post-block').forEach(targets => {
+ sequence.push({
+ targets,
+ complete: () => targets.classList.add('animated', post_block),
+ deltaT : '-=100'
+ });
+ animate(coll_header, targets.querySelectorAll('.collection-header'));
+ animate(post_header, targets.querySelectorAll('.post-header'));
+ animate(post_body, targets.querySelectorAll('.post-body'));
+ });
+
+ animate(post_block, document.querySelectorAll('.pagination, .comments'));
+
+ return sequence;
+ },
+
+ sidebar: function() {
+ const sequence = [];
+ const sidebar = document.querySelectorAll('.sidebar-inner');
+ const sidebarTransition = CONFIG.motion.transition.sidebar;
+ // Only for Pisces | Gemini.
+ if (sidebarTransition && (CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini')) {
+ sidebar.forEach(targets => {
+ sequence.push({
+ targets,
+ complete: () => targets.classList.add('animated', sidebarTransition),
+ deltaT : '-=100'
+ });
+ });
+ }
+ return sequence;
+ },
+
+ footer: function() {
+ return [{
+ targets: document.querySelector('.footer'),
+ opacity: 1
+ }];
+ }
+};
diff --git a/js/next-boot.js b/js/next-boot.js
new file mode 100644
index 00000000..fceb80bb
--- /dev/null
+++ b/js/next-boot.js
@@ -0,0 +1,79 @@
+/* global NexT, CONFIG */
+
+NexT.boot = {};
+
+NexT.boot.registerEvents = function() {
+
+ NexT.utils.registerScrollPercent();
+ NexT.utils.registerCanIUseTag();
+
+ // Mobile top menu bar.
+ document.querySelector('.site-nav-toggle .toggle').addEventListener('click', event => {
+ event.currentTarget.classList.toggle('toggle-close');
+ const siteNav = document.querySelector('.site-nav');
+ if (!siteNav) return;
+ siteNav.style.setProperty('--scroll-height', siteNav.scrollHeight + 'px');
+ document.body.classList.toggle('site-nav-on');
+ });
+
+ document.querySelectorAll('.sidebar-nav li').forEach((element, index) => {
+ element.addEventListener('click', () => {
+ NexT.utils.activateSidebarPanel(index);
+ });
+ });
+
+ window.addEventListener('hashchange', () => {
+ const tHash = location.hash;
+ if (tHash !== '' && !tHash.match(/%\S{2}/)) {
+ const target = document.querySelector(`.tabs ul.nav-tabs li a[href="${tHash}"]`);
+ target && target.click();
+ }
+ });
+
+ window.addEventListener('tabs:click', e => {
+ NexT.utils.registerCodeblock(e.target);
+ });
+};
+
+NexT.boot.refresh = function() {
+
+ /**
+ * Register JS handlers by condition option.
+ * Need to add config option in Front-End at 'scripts/helpers/next-config.js' file.
+ */
+ CONFIG.prism && window.Prism.highlightAll();
+ CONFIG.mediumzoom && window.mediumZoom('.post-body :not(a) > img, .post-body > img', {
+ background: 'var(--content-bg-color)'
+ });
+ CONFIG.lazyload && window.lozad('.post-body img').observe();
+ CONFIG.pangu && window.pangu.spacingPage();
+
+ CONFIG.exturl && NexT.utils.registerExtURL();
+ NexT.utils.wrapTableWithBox();
+ NexT.utils.registerCodeblock();
+ NexT.utils.registerTabsTag();
+ NexT.utils.registerActiveMenuItem();
+ NexT.utils.registerLangSelect();
+ NexT.utils.registerSidebarTOC();
+ NexT.utils.registerPostReward();
+ NexT.utils.registerVideoIframe();
+};
+
+NexT.boot.motion = function() {
+ // Define Motion Sequence & Bootstrap Motion.
+ if (CONFIG.motion.enable) {
+ NexT.motion.integrator
+ .add(NexT.motion.middleWares.header)
+ .add(NexT.motion.middleWares.postList)
+ .add(NexT.motion.middleWares.sidebar)
+ .add(NexT.motion.middleWares.footer)
+ .bootstrap();
+ }
+ NexT.utils.updateSidebarPosition();
+};
+
+document.addEventListener('DOMContentLoaded', () => {
+ NexT.boot.registerEvents();
+ NexT.boot.refresh();
+ NexT.boot.motion();
+});
diff --git a/js/pjax.js b/js/pjax.js
new file mode 100644
index 00000000..f81a6a0b
--- /dev/null
+++ b/js/pjax.js
@@ -0,0 +1,50 @@
+/* global NexT, CONFIG, Pjax */
+
+const pjax = new Pjax({
+ selectors: [
+ 'head title',
+ 'script[type="application/json"]',
+ // Precede .main-inner to prevent placeholder TOC changes asap
+ '.post-toc-wrap',
+ '.main-inner',
+ '.languages',
+ '.pjax'
+ ],
+ switches: {
+ '.post-toc-wrap': function(oldWrap, newWrap) {
+ if (newWrap.querySelector('.post-toc')) {
+ Pjax.switches.outerHTML.call(this, oldWrap, newWrap);
+ } else {
+ const curTOC = oldWrap.querySelector('.post-toc');
+ if (curTOC) {
+ curTOC.classList.add('placeholder-toc');
+ }
+ this.onSwitch();
+ }
+ }
+ },
+ analytics: false,
+ cacheBust: false,
+ scrollTo : !CONFIG.bookmark.enable
+});
+
+document.addEventListener('pjax:success', () => {
+ pjax.executeScripts(document.querySelectorAll('script[data-pjax]'));
+ NexT.boot.refresh();
+ // Define Motion Sequence & Bootstrap Motion.
+ if (CONFIG.motion.enable) {
+ NexT.motion.integrator
+ .init()
+ .add(NexT.motion.middleWares.subMenu)
+ .add(NexT.motion.middleWares.postList)
+ // Add sidebar-post-related transition.
+ .add(NexT.motion.middleWares.sidebar)
+ .bootstrap();
+ }
+ if (CONFIG.sidebar.display !== 'remove') {
+ const hasTOC = document.querySelector('.post-toc:not(.placeholder-toc)');
+ document.querySelector('.sidebar-inner').classList.toggle('sidebar-nav-active', hasTOC);
+ NexT.utils.activateSidebarPanel(hasTOC ? 0 : 1);
+ NexT.utils.updateSidebarPosition();
+ }
+});
diff --git a/js/schedule.js b/js/schedule.js
new file mode 100644
index 00000000..8f0c26cc
--- /dev/null
+++ b/js/schedule.js
@@ -0,0 +1,138 @@
+/* global CONFIG */
+
+// https://developers.google.com/calendar/api/v3/reference/events/list
+(function() {
+ // Initialization
+ const calendar = {
+ orderBy : 'startTime',
+ showLocation: false,
+ offsetMax : 72,
+ offsetMin : 4,
+ showDeleted : false,
+ singleEvents: true,
+ maxResults : 250
+ };
+
+ // Read config form theme config file
+ Object.assign(calendar, CONFIG.calendar);
+
+ const now = new Date();
+ const timeMax = new Date();
+ const timeMin = new Date();
+
+ timeMax.setHours(now.getHours() + calendar.offsetMax);
+ timeMin.setHours(now.getHours() - calendar.offsetMin);
+
+ // Build URL
+ const params = {
+ key : calendar.api_key,
+ orderBy : calendar.orderBy,
+ timeMax : timeMax.toISOString(),
+ timeMin : timeMin.toISOString(),
+ showDeleted : calendar.showDeleted,
+ singleEvents: calendar.singleEvents,
+ maxResults : calendar.maxResults
+ };
+
+ const request_url = new URL(`https://www.googleapis.com/calendar/v3/calendars/${calendar.calendar_id}/events`);
+ Object.entries(params).forEach(param => request_url.searchParams.append(...param));
+
+ function getRelativeTime(current, previous) {
+ const msPerMinute = 60 * 1000;
+ const msPerHour = msPerMinute * 60;
+ const msPerDay = msPerHour * 24;
+ const msPerMonth = msPerDay * 30;
+ const msPerYear = msPerDay * 365;
+
+ let elapsed = current - previous;
+ const tense = elapsed > 0 ? ' ago' : ' later';
+
+ elapsed = Math.abs(elapsed);
+
+ if (elapsed < msPerHour) {
+ return Math.round(elapsed / msPerMinute) + ' minutes' + tense;
+ } else if (elapsed < msPerDay) {
+ return Math.round(elapsed / msPerHour) + ' hours' + tense;
+ } else if (elapsed < msPerMonth) {
+ return 'about ' + Math.round(elapsed / msPerDay) + ' days' + tense;
+ } else if (elapsed < msPerYear) {
+ return 'about ' + Math.round(elapsed / msPerMonth) + ' months' + tense;
+ }
+
+ return 'about ' + Math.round(elapsed / msPerYear) + ' years' + tense;
+ }
+
+ function buildEventDOM(tense, event, start, end) {
+ const durationFormat = {
+ weekday: 'short',
+ hour : '2-digit',
+ minute : '2-digit'
+ };
+ const relativeTime = tense === 'now' ? 'NOW' : getRelativeTime(now, start);
+ const duration = start.toLocaleTimeString([], durationFormat) + ' - ' + end.toLocaleTimeString([], durationFormat);
+
+ let location = '';
+ if (calendar.showLocation && event.location) {
+ location = `${event.location} `;
+ }
+ let description = '';
+ if (event.description) {
+ description = `${event.description} `;
+ }
+
+ const eventContent = `
+
+ ${event.summary}
+ ${relativeTime}
+
+ ${location}
+ ${duration}
+ ${description}
+ `;
+ return eventContent;
+ }
+
+ function fetchData() {
+ const eventList = document.querySelector('.event-list');
+ if (!eventList) return;
+
+ fetch(request_url.href).then(response => {
+ return response.json();
+ }).then(data => {
+ if (data.items.length === 0) {
+ eventList.innerHTML = ' ';
+ return;
+ }
+ // Clean the event list
+ eventList.innerHTML = '';
+ let prevEnd = 0; // used to decide where to insert an
+ const utc = new Date().getTimezoneOffset() * 60000;
+
+ data.items.forEach(event => {
+ // Parse data
+ const start = new Date(event.start.dateTime || (new Date(event.start.date).getTime() + utc));
+ const end = new Date(event.end.dateTime || (new Date(event.end.date).getTime() + utc));
+
+ let tense = 'now';
+ if (end < now) {
+ tense = 'past';
+ } else if (start > now) {
+ tense = 'future';
+ }
+
+ if (tense === 'future' && prevEnd < now) {
+ eventList.insertAdjacentHTML('beforeend', ' ');
+ }
+
+ eventList.insertAdjacentHTML('beforeend', buildEventDOM(tense, event, start, end));
+ prevEnd = end;
+ });
+ });
+ }
+
+ fetchData();
+ const fetchDataTimer = setInterval(fetchData, 60000);
+ document.addEventListener('pjax:send', () => {
+ clearInterval(fetchDataTimer);
+ });
+})();
diff --git a/js/schemes/muse.js b/js/schemes/muse.js
new file mode 100644
index 00000000..ba60b515
--- /dev/null
+++ b/js/schemes/muse.js
@@ -0,0 +1,60 @@
+/* global CONFIG */
+
+document.addEventListener('DOMContentLoaded', () => {
+
+ const isRight = CONFIG.sidebar.position === 'right';
+
+ const sidebarToggleMotion = {
+ mouse: {},
+ init : function() {
+ window.addEventListener('mousedown', this.mousedownHandler.bind(this));
+ window.addEventListener('mouseup', this.mouseupHandler.bind(this));
+ document.querySelector('.sidebar-dimmer').addEventListener('click', this.clickHandler.bind(this));
+ document.querySelector('.sidebar-toggle').addEventListener('click', this.clickHandler.bind(this));
+ window.addEventListener('sidebar:show', this.showSidebar);
+ window.addEventListener('sidebar:hide', this.hideSidebar);
+ },
+ mousedownHandler: function(event) {
+ this.mouse.X = event.pageX;
+ this.mouse.Y = event.pageY;
+ },
+ mouseupHandler: function(event) {
+ const deltaX = event.pageX - this.mouse.X;
+ const deltaY = event.pageY - this.mouse.Y;
+ const clickingBlankPart = Math.hypot(deltaX, deltaY) < 20 && event.target.matches('.main');
+ // Fancybox has z-index property, but medium-zoom does not, so the sidebar will overlay the zoomed image.
+ if (clickingBlankPart || event.target.matches('img.medium-zoom-image')) {
+ this.hideSidebar();
+ }
+ },
+ clickHandler: function() {
+ document.body.classList.contains('sidebar-active') ? this.hideSidebar() : this.showSidebar();
+ },
+ showSidebar: function() {
+ document.body.classList.add('sidebar-active');
+ const animateAction = isRight ? 'fadeInRight' : 'fadeInLeft';
+ document.querySelectorAll('.sidebar .animated').forEach((element, index) => {
+ element.style.animationDelay = (100 * index) + 'ms';
+ element.classList.remove(animateAction);
+ setTimeout(() => {
+ // Trigger a DOM reflow
+ element.classList.add(animateAction);
+ });
+ });
+ },
+ hideSidebar: function() {
+ document.body.classList.remove('sidebar-active');
+ }
+ };
+ if (CONFIG.sidebar.display !== 'remove') sidebarToggleMotion.init();
+
+ function updateFooterPosition() {
+ const footer = document.querySelector('.footer');
+ const containerHeight = document.querySelector('.main').offsetHeight + footer.offsetHeight;
+ footer.classList.toggle('footer-fixed', containerHeight <= window.innerHeight);
+ }
+
+ updateFooterPosition();
+ window.addEventListener('resize', updateFooterPosition);
+ window.addEventListener('scroll', updateFooterPosition, { passive: true });
+});
diff --git a/js/third-party/addtoany.js b/js/third-party/addtoany.js
new file mode 100644
index 00000000..f9009f87
--- /dev/null
+++ b/js/third-party/addtoany.js
@@ -0,0 +1,8 @@
+/* global NexT */
+
+document.addEventListener('page:loaded', () => {
+ NexT.utils.getScript('https://static.addtoany.com/menu/page.js', { condition: window.a2a })
+ .then(() => {
+ window.a2a.init();
+ });
+});
diff --git a/js/third-party/analytics/baidu-analytics.js b/js/third-party/analytics/baidu-analytics.js
new file mode 100644
index 00000000..c10e7d01
--- /dev/null
+++ b/js/third-party/analytics/baidu-analytics.js
@@ -0,0 +1,7 @@
+/* global _hmt */
+
+if (!window._hmt) window._hmt = [];
+
+document.addEventListener('pjax:success', () => {
+ _hmt.push(['_trackPageview', location.pathname]);
+});
diff --git a/js/third-party/analytics/google-analytics.js b/js/third-party/analytics/google-analytics.js
new file mode 100644
index 00000000..8601806e
--- /dev/null
+++ b/js/third-party/analytics/google-analytics.js
@@ -0,0 +1,53 @@
+/* global CONFIG, dataLayer, gtag */
+
+if (!CONFIG.google_analytics.only_pageview) {
+ if (CONFIG.hostname === location.hostname) {
+ window.dataLayer = window.dataLayer || [];
+ window.gtag = function() {
+ dataLayer.push(arguments);
+ };
+ gtag('js', new Date());
+ gtag('config', CONFIG.google_analytics.tracking_id);
+
+ document.addEventListener('pjax:success', () => {
+ gtag('event', 'page_view', {
+ page_location: location.href,
+ page_path : location.pathname,
+ page_title : document.title
+ });
+ });
+ }
+} else {
+ const sendPageView = () => {
+ if (CONFIG.hostname !== location.hostname) return;
+ const uid = localStorage.getItem('uid') || (Math.random() + '.' + Math.random());
+ localStorage.setItem('uid', uid);
+ fetch(
+ 'https://www.google-analytics.com/mp/collect?' + new URLSearchParams({
+ api_secret : CONFIG.google_analytics.measure_protocol_api_secret,
+ measurement_id: CONFIG.google_analytics.tracking_id
+ }),
+ {
+ method : 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ client_id: uid,
+ events : [
+ {
+ name : 'page_view',
+ params: {
+ page_location: location.href,
+ page_title : document.title
+ }
+ }
+ ]
+ }),
+ mode: 'no-cors'
+ }
+ );
+ };
+ document.addEventListener('pjax:complete', sendPageView);
+ sendPageView();
+}
diff --git a/js/third-party/analytics/growingio.js b/js/third-party/analytics/growingio.js
new file mode 100644
index 00000000..0460833b
--- /dev/null
+++ b/js/third-party/analytics/growingio.js
@@ -0,0 +1,10 @@
+/* global CONFIG, gio */
+
+if (!window.gio) {
+ window.gio = function() {
+ (window.gio.q = window.gio.q || []).push(arguments);
+ };
+}
+
+gio('init', `${CONFIG.growingio_analytics}`, {});
+gio('send');
diff --git a/js/third-party/analytics/matomo.js b/js/third-party/analytics/matomo.js
new file mode 100644
index 00000000..290a3e09
--- /dev/null
+++ b/js/third-party/analytics/matomo.js
@@ -0,0 +1,19 @@
+/* global CONFIG */
+
+if (CONFIG.matomo.enable) {
+ window._paq = window._paq || [];
+ const _paq = window._paq;
+
+ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ const u = CONFIG.matomo.server_url;
+ _paq.push(['setTrackerUrl', u + 'matomo.php']);
+ _paq.push(['setSiteId', CONFIG.matomo.site_id]);
+ const d = document;
+ const g = d.createElement('script');
+ const s = d.getElementsByTagName('script')[0];
+ g.async = true;
+ g.src = u + 'matomo.js';
+ s.parentNode.insertBefore(g, s);
+}
diff --git a/js/third-party/chat/chatra.js b/js/third-party/chat/chatra.js
new file mode 100644
index 00000000..e495b8e1
--- /dev/null
+++ b/js/third-party/chat/chatra.js
@@ -0,0 +1,19 @@
+/* global CONFIG, Chatra */
+
+(function() {
+ if (CONFIG.chatra.embed) {
+ window.ChatraSetup = {
+ mode : 'frame',
+ injectTo: CONFIG.chatra.embed
+ };
+ }
+
+ window.ChatraID = CONFIG.chatra.id;
+
+ const chatButton = document.querySelector('.sidebar-button button');
+ if (chatButton) {
+ chatButton.addEventListener('click', () => {
+ Chatra('openChat', true);
+ });
+ }
+})();
diff --git a/js/third-party/chat/tidio.js b/js/third-party/chat/tidio.js
new file mode 100644
index 00000000..bffb918e
--- /dev/null
+++ b/js/third-party/chat/tidio.js
@@ -0,0 +1,10 @@
+/* global tidioChatApi */
+
+(function() {
+ const chatButton = document.querySelector('.sidebar-button button');
+ if (chatButton) {
+ chatButton.addEventListener('click', () => {
+ tidioChatApi.open();
+ });
+ }
+})();
diff --git a/js/third-party/comments/changyan.js b/js/third-party/comments/changyan.js
new file mode 100644
index 00000000..18a1be4f
--- /dev/null
+++ b/js/third-party/comments/changyan.js
@@ -0,0 +1,39 @@
+/* global NexT, CONFIG */
+
+document.addEventListener('page:loaded', () => {
+ const { appid, appkey } = CONFIG.changyan;
+ const mainJs = 'https://cy-cdn.kuaizhan.com/upload/changyan.js';
+ const countJs = `https://cy-cdn.kuaizhan.com/upload/plugins/plugins.list.count.js?clientId=${appid}`;
+
+ // Get the number of comments
+ setTimeout(() => {
+ return NexT.utils.getScript(countJs, {
+ attributes: {
+ async: true,
+ id : 'cy_cmt_num'
+ }
+ });
+ }, 0);
+
+ // When scroll to comment section
+ if (CONFIG.page.comments && !CONFIG.page.isHome) {
+ NexT.utils.loadComments('#SOHUCS')
+ .then(() => {
+ return NexT.utils.getScript(mainJs, {
+ attributes: {
+ async: true
+ }
+ });
+ })
+ .then(() => {
+ window.changyan.api.config({
+ appid,
+ conf: appkey
+ });
+ })
+ .catch(error => {
+ // eslint-disable-next-line no-console
+ console.error('Failed to load Changyan', error);
+ });
+ }
+});
diff --git a/js/third-party/comments/disqus.js b/js/third-party/comments/disqus.js
new file mode 100644
index 00000000..4d1ca9e7
--- /dev/null
+++ b/js/third-party/comments/disqus.js
@@ -0,0 +1,41 @@
+/* global NexT, CONFIG, DISQUS */
+
+document.addEventListener('page:loaded', () => {
+
+ if (CONFIG.disqus.count) {
+ if (window.DISQUSWIDGETS) {
+ window.DISQUSWIDGETS.getCount({ reset: true });
+ } else {
+ // Defer loading until the whole page loading is completed
+ NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/count.js`, {
+ attributes: { id: 'dsq-count-scr', defer: true }
+ });
+ }
+ }
+
+ if (CONFIG.page.comments) {
+ // `disqus_config` should be a global variable
+ // See https://help.disqus.com/en/articles/1717084-javascript-configuration-variables
+ window.disqus_config = function() {
+ this.page.url = CONFIG.page.permalink;
+ this.page.identifier = CONFIG.page.path;
+ this.page.title = CONFIG.page.title;
+ if (CONFIG.disqus.i18n.disqus !== 'disqus') {
+ this.language = CONFIG.disqus.i18n.disqus;
+ }
+ };
+ NexT.utils.loadComments('#disqus_thread').then(() => {
+ if (window.DISQUS) {
+ DISQUS.reset({
+ reload: true,
+ config: window.disqus_config
+ });
+ } else {
+ NexT.utils.getScript(`https://${CONFIG.disqus.shortname}.disqus.com/embed.js`, {
+ attributes: { dataset: { timestamp: '' + +new Date() } }
+ });
+ }
+ });
+ }
+
+});
diff --git a/js/third-party/comments/disqusjs.js b/js/third-party/comments/disqusjs.js
new file mode 100644
index 00000000..d8401eee
--- /dev/null
+++ b/js/third-party/comments/disqusjs.js
@@ -0,0 +1,23 @@
+/* global NexT, CONFIG, DisqusJS */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.page.comments) return;
+
+ NexT.utils.loadComments('#disqus_thread')
+ .then(() => NexT.utils.getScript(CONFIG.disqusjs.js, { condition: window.DisqusJS }))
+ .then(() => {
+ window.dsqjs = new DisqusJS({
+ api : CONFIG.disqusjs.api || 'https://disqus.com/api/',
+ apikey : CONFIG.disqusjs.apikey,
+ shortname : CONFIG.disqusjs.shortname,
+ url : CONFIG.page.permalink,
+ identifier: CONFIG.page.path,
+ title : CONFIG.page.title
+ });
+ window.dsqjs.render(document.querySelector('.disqusjs-container'));
+ });
+});
+
+document.addEventListener('pjax:send', () => {
+ if (window.dsqjs) window.dsqjs.destroy();
+});
diff --git a/js/third-party/comments/gitalk.js b/js/third-party/comments/gitalk.js
new file mode 100644
index 00000000..08d07f4c
--- /dev/null
+++ b/js/third-party/comments/gitalk.js
@@ -0,0 +1,24 @@
+/* global NexT, CONFIG, Gitalk */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.page.comments) return;
+
+ NexT.utils.loadComments('.gitalk-container')
+ .then(() => NexT.utils.getScript(CONFIG.gitalk.js, {
+ condition: window.Gitalk
+ }))
+ .then(() => {
+ const gitalk = new Gitalk({
+ clientID : CONFIG.gitalk.client_id,
+ clientSecret : CONFIG.gitalk.client_secret,
+ repo : CONFIG.gitalk.repo,
+ owner : CONFIG.gitalk.github_id,
+ admin : [CONFIG.gitalk.admin_user],
+ id : CONFIG.gitalk.path_md5,
+ proxy : CONFIG.gitalk.proxy,
+ language : CONFIG.gitalk.language || window.navigator.language,
+ distractionFreeMode: CONFIG.gitalk.distraction_free_mode
+ });
+ gitalk.render(document.querySelector('.gitalk-container'));
+ });
+});
diff --git a/js/third-party/comments/isso.js b/js/third-party/comments/isso.js
new file mode 100644
index 00000000..2c706013
--- /dev/null
+++ b/js/third-party/comments/isso.js
@@ -0,0 +1,15 @@
+/* global NexT, CONFIG */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.page.comments) return;
+
+ NexT.utils.loadComments('#isso-thread')
+ .then(() => NexT.utils.getScript(`${CONFIG.isso}js/embed.min.js`, {
+ attributes: {
+ dataset: {
+ isso: `${CONFIG.isso}`
+ }
+ },
+ parentNode: document.querySelector('#isso-thread')
+ }));
+});
diff --git a/js/third-party/comments/livere.js b/js/third-party/comments/livere.js
new file mode 100644
index 00000000..c4bcd2e1
--- /dev/null
+++ b/js/third-party/comments/livere.js
@@ -0,0 +1,19 @@
+/* global NexT, CONFIG, LivereTower */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.page.comments) return;
+
+ NexT.utils.loadComments('#lv-container').then(() => {
+ window.livereOptions = {
+ refer: CONFIG.page.path.replace(/index\.html$/, '')
+ };
+
+ if (typeof LivereTower === 'function') return;
+
+ NexT.utils.getScript('https://cdn-city.livere.com/js/embed.dist.js', {
+ attributes: {
+ async: true
+ }
+ });
+ });
+});
diff --git a/js/third-party/comments/utterances.js b/js/third-party/comments/utterances.js
new file mode 100644
index 00000000..332ee057
--- /dev/null
+++ b/js/third-party/comments/utterances.js
@@ -0,0 +1,17 @@
+/* global NexT, CONFIG */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.page.comments) return;
+
+ NexT.utils.loadComments('.utterances-container')
+ .then(() => NexT.utils.getScript('https://utteranc.es/client.js', {
+ attributes: {
+ async : true,
+ crossOrigin : 'anonymous',
+ 'repo' : CONFIG.utterances.repo,
+ 'issue-term': CONFIG.utterances.issue_term,
+ 'theme' : CONFIG.utterances.theme
+ },
+ parentNode: document.querySelector('.utterances-container')
+ }));
+});
diff --git a/js/third-party/fancybox.js b/js/third-party/fancybox.js
new file mode 100644
index 00000000..178db4b1
--- /dev/null
+++ b/js/third-party/fancybox.js
@@ -0,0 +1,35 @@
+/* global Fancybox */
+
+document.addEventListener('page:loaded', () => {
+
+ /**
+ * Wrap images with fancybox.
+ */
+ document.querySelectorAll('.post-body :not(a) > img, .post-body > img').forEach(image => {
+ const imageLink = image.dataset.src || image.src;
+ const imageWrapLink = document.createElement('a');
+ imageWrapLink.classList.add('fancybox');
+ imageWrapLink.href = imageLink;
+ imageWrapLink.setAttribute('itemscope', '');
+ imageWrapLink.setAttribute('itemtype', 'http://schema.org/ImageObject');
+ imageWrapLink.setAttribute('itemprop', 'url');
+
+ let dataFancybox = 'default';
+ if (image.closest('.post-gallery') !== null) {
+ dataFancybox = 'gallery';
+ } else if (image.closest('.group-picture') !== null) {
+ dataFancybox = 'group';
+ }
+ imageWrapLink.dataset.fancybox = dataFancybox;
+
+ const imageTitle = image.title || image.alt;
+ if (imageTitle) {
+ imageWrapLink.title = imageTitle;
+ // Make sure img captions will show correctly in fancybox
+ imageWrapLink.dataset.caption = imageTitle;
+ }
+ image.wrap(imageWrapLink);
+ });
+
+ Fancybox.bind('[data-fancybox]');
+});
diff --git a/js/third-party/math/katex.js b/js/third-party/math/katex.js
new file mode 100644
index 00000000..ad745b18
--- /dev/null
+++ b/js/third-party/math/katex.js
@@ -0,0 +1,7 @@
+/* global NexT, CONFIG */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.enableMath) return;
+
+ NexT.utils.getScript(CONFIG.katex.copy_tex_js).catch(() => {});
+});
diff --git a/js/third-party/math/mathjax.js b/js/third-party/math/mathjax.js
new file mode 100644
index 00000000..fe4d4488
--- /dev/null
+++ b/js/third-party/math/mathjax.js
@@ -0,0 +1,36 @@
+/* global NexT, CONFIG, MathJax */
+
+document.addEventListener('page:loaded', () => {
+ if (!CONFIG.enableMath) return;
+
+ if (typeof MathJax === 'undefined') {
+ window.MathJax = {
+ tex: {
+ inlineMath: { '[+]': [['$', '$']] },
+ tags : CONFIG.mathjax.tags
+ },
+ options: {
+ renderActions: {
+ insertedScript: [200, () => {
+ document.querySelectorAll('mjx-container').forEach(node => {
+ const target = node.parentNode;
+ if (target.nodeName.toLowerCase() === 'li') {
+ target.parentNode.classList.add('has-jax');
+ }
+ });
+ }, '', false]
+ }
+ }
+ };
+ NexT.utils.getScript(CONFIG.mathjax.js, {
+ attributes: {
+ defer: true
+ }
+ });
+ } else {
+ MathJax.startup.document.state(0);
+ MathJax.typesetClear();
+ MathJax.texReset();
+ MathJax.typesetPromise();
+ }
+});
diff --git a/js/third-party/pace.js b/js/third-party/pace.js
new file mode 100644
index 00000000..c22d59f0
--- /dev/null
+++ b/js/third-party/pace.js
@@ -0,0 +1,7 @@
+/* global Pace */
+
+Pace.options.restartOnPushState = false;
+
+document.addEventListener('pjax:send', () => {
+ Pace.restart();
+});
diff --git a/js/third-party/quicklink.js b/js/third-party/quicklink.js
new file mode 100644
index 00000000..2543ad1e
--- /dev/null
+++ b/js/third-party/quicklink.js
@@ -0,0 +1,37 @@
+/* global CONFIG, quicklink */
+
+(function() {
+ if (typeof CONFIG.quicklink.ignores === 'string') {
+ const ignoresStr = `[${CONFIG.quicklink.ignores}]`;
+ CONFIG.quicklink.ignores = JSON.parse(ignoresStr);
+ }
+
+ let resetFn = null;
+
+ const onRefresh = () => {
+ if (resetFn) resetFn();
+ if (!CONFIG.quicklink.enable) return;
+
+ let ignoresArr = CONFIG.quicklink.ignores || [];
+ if (!Array.isArray(ignoresArr)) {
+ ignoresArr = [ignoresArr];
+ }
+
+ resetFn = quicklink.listen({
+ timeout : CONFIG.quicklink.timeout,
+ priority: CONFIG.quicklink.priority,
+ ignores : [
+ uri => uri.includes('#'),
+ uri => uri === CONFIG.quicklink.url,
+ ...ignoresArr
+ ]
+ });
+ };
+
+ if (CONFIG.quicklink.delay) {
+ window.addEventListener('load', onRefresh);
+ document.addEventListener('pjax:success', onRefresh);
+ } else {
+ document.addEventListener('page:loaded', onRefresh);
+ }
+})();
diff --git a/js/third-party/search/algolia-search.js b/js/third-party/search/algolia-search.js
new file mode 100644
index 00000000..12a554c8
--- /dev/null
+++ b/js/third-party/search/algolia-search.js
@@ -0,0 +1,130 @@
+/* global instantsearch, algoliasearch, CONFIG, pjax */
+
+document.addEventListener('DOMContentLoaded', () => {
+ const { indexName, appID, apiKey, hits } = CONFIG.algolia;
+
+ const search = instantsearch({
+ indexName,
+ searchClient : algoliasearch(appID, apiKey),
+ searchFunction: helper => {
+ if (document.querySelector('.search-input').value) {
+ helper.search();
+ }
+ }
+ });
+
+ if (typeof pjax === 'object') {
+ search.on('render', () => {
+ pjax.refresh(document.querySelector('.algolia-hits'));
+ });
+ }
+
+ // Registering Widgets
+ search.addWidgets([
+ instantsearch.widgets.configure({
+ hitsPerPage: hits.per_page || 10
+ }),
+
+ instantsearch.widgets.searchBox({
+ container : '.search-input-container',
+ placeholder : CONFIG.i18n.placeholder,
+ // Hide default icons of algolia search
+ showReset : false,
+ showSubmit : false,
+ showLoadingIndicator: false,
+ cssClasses : {
+ input: 'search-input'
+ }
+ }),
+
+ instantsearch.widgets.stats({
+ container: '.algolia-stats',
+ templates: {
+ text: data => {
+ const stats = CONFIG.i18n.hits_time
+ .replace('${hits}', data.nbHits)
+ .replace('${time}', data.processingTimeMS);
+ return `${stats}
+ `;
+ }
+ },
+ cssClasses: {
+ text: 'search-stats'
+ }
+ }),
+
+ instantsearch.widgets.hits({
+ container : '.algolia-hits',
+ escapeHTML: false,
+ templates : {
+ item: data => {
+ const { title, excerpt, excerptStrip, contentStripTruncate } = data._highlightResult;
+ let result = `${title.value} `;
+ const content = excerpt || excerptStrip || contentStripTruncate;
+ if (content && content.value) {
+ const div = document.createElement('div');
+ div.innerHTML = content.value;
+ result += `${div.textContent.substring(0, 100)}...
`;
+ }
+ return result;
+ },
+ empty: data => {
+ return `
+ ${CONFIG.i18n.empty.replace('${query}', data.query)}
+
`;
+ }
+ },
+ cssClasses: {
+ list: 'search-result-list'
+ }
+ }),
+
+ instantsearch.widgets.pagination({
+ container: '.algolia-pagination',
+ scrollTo : false,
+ showFirst: false,
+ showLast : false,
+ templates: {
+ first : ' ',
+ last : ' ',
+ previous: ' ',
+ next : ' '
+ },
+ cssClasses: {
+ list : ['pagination', 'algolia-pagination'],
+ item : 'pagination-item',
+ link : 'page-number',
+ selectedItem: 'current',
+ disabledItem: 'disabled-item'
+ }
+ })
+ ]);
+
+ search.start();
+
+ // Handle and trigger popup window
+ document.querySelectorAll('.popup-trigger').forEach(element => {
+ element.addEventListener('click', () => {
+ document.body.classList.add('search-active');
+ setTimeout(() => document.querySelector('.search-input').focus(), 500);
+ });
+ });
+
+ // Monitor main search box
+ const onPopupClose = () => {
+ document.body.classList.remove('search-active');
+ };
+
+ document.querySelector('.search-pop-overlay').addEventListener('click', event => {
+ if (event.target === document.querySelector('.search-pop-overlay')) {
+ onPopupClose();
+ }
+ });
+ document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose);
+ document.addEventListener('pjax:success', onPopupClose);
+ window.addEventListener('keyup', event => {
+ if (event.key === 'Escape') {
+ onPopupClose();
+ }
+ });
+});
diff --git a/js/third-party/search/local-search.js b/js/third-party/search/local-search.js
new file mode 100644
index 00000000..d88089af
--- /dev/null
+++ b/js/third-party/search/local-search.js
@@ -0,0 +1,99 @@
+/* global CONFIG, pjax, LocalSearch */
+
+document.addEventListener('DOMContentLoaded', () => {
+ if (!CONFIG.path) {
+ // Search DB path
+ console.warn('`hexo-generator-searchdb` plugin is not installed!');
+ return;
+ }
+ const localSearch = new LocalSearch({
+ path : CONFIG.path,
+ top_n_per_article: CONFIG.localsearch.top_n_per_article,
+ unescape : CONFIG.localsearch.unescape
+ });
+
+ const input = document.querySelector('.search-input');
+
+ const inputEventFunction = () => {
+ if (!localSearch.isfetched) return;
+ const searchText = input.value.trim().toLowerCase();
+ const keywords = searchText.split(/[-\s]+/);
+ const container = document.querySelector('.search-result-container');
+ let resultItems = [];
+ if (searchText.length > 0) {
+ // Perform local searching
+ resultItems = localSearch.getResultItems(keywords);
+ }
+ if (keywords.length === 1 && keywords[0] === '') {
+ container.classList.add('no-result');
+ container.innerHTML = '键入以进行搜索
';
+ } else if (resultItems.length === 0) {
+ container.classList.add('no-result');
+ container.innerHTML = '哎呀,没有您搜索的内容。换个关键词试试?
'; /* mod icon text -jywondf */
+ } else {
+ resultItems.sort((left, right) => {
+ if (left.includedCount !== right.includedCount) {
+ return right.includedCount - left.includedCount;
+ } else if (left.hitCount !== right.hitCount) {
+ return right.hitCount - left.hitCount;
+ }
+ return right.id - left.id;
+ });
+ const stats = CONFIG.i18n.hits.replace('${hits}', resultItems.length);
+
+ container.classList.remove('no-result');
+ container.innerHTML = `${stats}
+
+ ${resultItems.map(result => result.item).join('')} `;
+ if (typeof pjax === 'object') pjax.refresh(container);
+ }
+ };
+
+ localSearch.highlightSearchWords(document.querySelector('.post-body'));
+ if (CONFIG.localsearch.preload) {
+ localSearch.fetchData();
+ }
+
+ if (CONFIG.localsearch.trigger === 'auto') {
+ input.addEventListener('input', inputEventFunction);
+ } else {
+ document.querySelector('.search-icon').addEventListener('click', inputEventFunction);
+ input.addEventListener('keypress', event => {
+ if (event.key === 'Enter') {
+ inputEventFunction();
+ }
+ });
+ }
+ window.addEventListener('search:loaded', inputEventFunction);
+
+ // Handle and trigger popup window
+ document.querySelectorAll('.popup-trigger').forEach(element => {
+ element.addEventListener('click', () => {
+ document.body.classList.add('search-active');
+ // Wait for search-popup animation to complete
+ setTimeout(() => input.focus(), 500);
+ if (!localSearch.isfetched) localSearch.fetchData();
+ });
+ });
+
+ // Monitor main search box
+ const onPopupClose = () => {
+ document.body.classList.remove('search-active');
+ };
+
+ document.querySelector('.search-pop-overlay').addEventListener('click', event => {
+ if (event.target === document.querySelector('.search-pop-overlay')) {
+ onPopupClose();
+ }
+ });
+ document.querySelector('.popup-btn-close').addEventListener('click', onPopupClose);
+ document.addEventListener('pjax:success', () => {
+ localSearch.highlightSearchWords(document.querySelector('.post-body'));
+ onPopupClose();
+ });
+ window.addEventListener('keyup', event => {
+ if (event.key === 'Escape') {
+ onPopupClose();
+ }
+ });
+});
diff --git a/js/third-party/search/search.js b/js/third-party/search/search.js
new file mode 100644
index 00000000..fea67b18
--- /dev/null
+++ b/js/third-party/search/search.js
@@ -0,0 +1,228 @@
+class LocalSearch {
+ constructor({
+ path = '',
+ unescape = false,
+ top_n_per_article = 1
+ }) {
+ this.path = path;
+ this.unescape = unescape;
+ this.top_n_per_article = top_n_per_article;
+ this.isfetched = false;
+ this.datas = null;
+ }
+
+ getIndexByWord(words, text, caseSensitive = false) {
+ const index = [];
+ const included = new Set();
+
+ if (!caseSensitive) {
+ text = text.toLowerCase();
+ }
+ words.forEach(word => {
+ if (this.unescape) {
+ const div = document.createElement('div');
+ div.innerText = word;
+ word = div.innerHTML;
+ }
+ const wordLen = word.length;
+ if (wordLen === 0) return;
+ let startPosition = 0;
+ let position = -1;
+ if (!caseSensitive) {
+ word = word.toLowerCase();
+ }
+ while ((position = text.indexOf(word, startPosition)) > -1) {
+ index.push({ position, word });
+ included.add(word);
+ startPosition = position + wordLen;
+ }
+ });
+ // Sort index by position of keyword
+ index.sort((left, right) => {
+ if (left.position !== right.position) {
+ return left.position - right.position;
+ }
+ return right.word.length - left.word.length;
+ });
+ return [index, included];
+ }
+
+ // Merge hits into slices
+ mergeIntoSlice(start, end, index) {
+ let item = index[0];
+ let { position, word } = item;
+ const hits = [];
+ const count = new Set();
+ while (position + word.length <= end && index.length !== 0) {
+ count.add(word);
+ hits.push({
+ position,
+ length: word.length
+ });
+ const wordEnd = position + word.length;
+
+ // Move to next position of hit
+ index.shift();
+ while (index.length !== 0) {
+ item = index[0];
+ position = item.position;
+ word = item.word;
+ if (wordEnd > position) {
+ index.shift();
+ } else {
+ break;
+ }
+ }
+ }
+ return {
+ hits,
+ start,
+ end,
+ count: count.size
+ };
+ }
+
+ // Highlight title and content
+ highlightKeyword(val, slice) {
+ let result = '';
+ let index = slice.start;
+ for (const { position, length } of slice.hits) {
+ result += val.substring(index, position);
+ index = position + length;
+ result += `${val.substr(position, length)} `;
+ }
+ result += val.substring(index, slice.end);
+ return result;
+ }
+
+ getResultItems(keywords) {
+ const resultItems = [];
+ this.datas.forEach(({ title, content, url }) => {
+ // The number of different keywords included in the article.
+ const [indexOfTitle, keysOfTitle] = this.getIndexByWord(keywords, title);
+ const [indexOfContent, keysOfContent] = this.getIndexByWord(keywords, content);
+ const includedCount = new Set([...keysOfTitle, ...keysOfContent]).size;
+
+ // Show search results
+ const hitCount = indexOfTitle.length + indexOfContent.length;
+ if (hitCount === 0) return;
+
+ const slicesOfTitle = [];
+ if (indexOfTitle.length !== 0) {
+ slicesOfTitle.push(this.mergeIntoSlice(0, title.length, indexOfTitle));
+ }
+
+ let slicesOfContent = [];
+ while (indexOfContent.length !== 0) {
+ const item = indexOfContent[0];
+ const { position } = item;
+ // Cut out 100 characters. The maxlength of .search-input is 80.
+ const start = Math.max(0, position - 20);
+ const end = Math.min(content.length, position + 80);
+ slicesOfContent.push(this.mergeIntoSlice(start, end, indexOfContent));
+ }
+
+ // Sort slices in content by included keywords' count and hits' count
+ slicesOfContent.sort((left, right) => {
+ if (left.count !== right.count) {
+ return right.count - left.count;
+ } else if (left.hits.length !== right.hits.length) {
+ return right.hits.length - left.hits.length;
+ }
+ return left.start - right.start;
+ });
+
+ // Select top N slices in content
+ const upperBound = parseInt(this.top_n_per_article, 10);
+ if (upperBound >= 0) {
+ slicesOfContent = slicesOfContent.slice(0, upperBound);
+ }
+
+ let resultItem = '';
+
+ url = new URL(url, location.origin);
+ url.searchParams.append('highlight', keywords.join(' '));
+
+ if (slicesOfTitle.length !== 0) {
+ resultItem += `${this.highlightKeyword(title, slicesOfTitle[0])} `;
+ } else {
+ resultItem += `${title} `;
+ }
+
+ slicesOfContent.forEach(slice => {
+ resultItem += `${this.highlightKeyword(content, slice)}...
`;
+ });
+
+ resultItem += ' ';
+ resultItems.push({
+ item: resultItem,
+ id : resultItems.length,
+ hitCount,
+ includedCount
+ });
+ });
+ return resultItems;
+ }
+
+ fetchData() {
+ const isXml = !this.path.endsWith('json');
+ fetch(this.path)
+ .then(response => response.text())
+ .then(res => {
+ // Get the contents from search data
+ this.isfetched = true;
+ this.datas = isXml ? [...new DOMParser().parseFromString(res, 'text/xml').querySelectorAll('entry')].map(element => ({
+ title : element.querySelector('title').textContent,
+ content: element.querySelector('content').textContent,
+ url : element.querySelector('url').textContent
+ })) : JSON.parse(res);
+ // Only match articles with non-empty titles
+ this.datas = this.datas.filter(data => data.title).map(data => {
+ data.title = data.title.trim();
+ data.content = data.content ? data.content.trim().replace(/<[^>]+>/g, '') : '';
+ data.url = decodeURIComponent(data.url).replace(/\/{2,}/g, '/');
+ return data;
+ });
+ // Remove loading animation
+ window.dispatchEvent(new Event('search:loaded'));
+ });
+ }
+
+ // Highlight by wrapping node in mark elements with the given class name
+ highlightText(node, slice, className) {
+ const val = node.nodeValue;
+ let index = slice.start;
+ const children = [];
+ for (const { position, length } of slice.hits) {
+ const text = document.createTextNode(val.substring(index, position));
+ index = position + length;
+ const mark = document.createElement('mark');
+ mark.className = className;
+ mark.appendChild(document.createTextNode(val.substr(position, length)));
+ children.push(text, mark);
+ }
+ node.nodeValue = val.substring(index, slice.end);
+ children.forEach(element => {
+ node.parentNode.insertBefore(element, node);
+ });
+ }
+
+ // Highlight the search words provided in the url in the text
+ highlightSearchWords(body) {
+ const params = new URL(location.href).searchParams.get('highlight');
+ const keywords = params ? params.split(' ') : [];
+ if (!keywords.length || !body) return;
+ const walk = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null);
+ const allNodes = [];
+ while (walk.nextNode()) {
+ if (!walk.currentNode.parentNode.matches('script, style, button, select, textarea, .mermaid')) allNodes.push(walk.currentNode); /* Add disallow highlight type -jywondf */
+ }
+ allNodes.forEach(node => {
+ const [indexOfNode] = this.getIndexByWord(keywords, node.nodeValue);
+ if (!indexOfNode.length) return;
+ const slice = this.mergeIntoSlice(0, node.nodeValue.length, indexOfNode);
+ this.highlightText(node, slice, 'search-keyword');
+ });
+ }
+ }
+
\ No newline at end of file
diff --git a/js/third-party/statistics/firestore.js b/js/third-party/statistics/firestore.js
new file mode 100644
index 00000000..3ea7ba67
--- /dev/null
+++ b/js/third-party/statistics/firestore.js
@@ -0,0 +1,60 @@
+/* global CONFIG, firebase */
+
+firebase.initializeApp({
+ apiKey : CONFIG.firestore.apiKey,
+ projectId: CONFIG.firestore.projectId
+});
+
+(function() {
+ const getCount = (doc, increaseCount) => {
+ // IncreaseCount will be false when not in article page
+ return doc.get().then(d => {
+ // Has no data, initialize count
+ let count = d.exists ? d.data().count : 0;
+ // If first view this article
+ if (increaseCount) {
+ // Increase count
+ count++;
+ doc.set({
+ count
+ });
+ }
+ return count;
+ });
+ };
+
+ const db = firebase.firestore();
+ const articles = db.collection(CONFIG.firestore.collection);
+
+ document.addEventListener('page:loaded', () => {
+
+ if (CONFIG.page.isPost) {
+ // Fix issue #118
+ // https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent
+ const title = document.querySelector('.post-title').textContent.trim();
+ const doc = articles.doc(title);
+ let increaseCount = CONFIG.hostname === location.hostname;
+ if (localStorage.getItem(title)) {
+ increaseCount = false;
+ } else {
+ // Mark as visited
+ localStorage.setItem(title, true);
+ }
+ getCount(doc, increaseCount).then(count => {
+ document.querySelector('.firestore-visitors-count').innerText = count;
+ });
+ } else if (CONFIG.page.isHome) {
+ const promises = [...document.querySelectorAll('.post-title')].map(element => {
+ const title = element.textContent.trim();
+ const doc = articles.doc(title);
+ return getCount(doc);
+ });
+ Promise.all(promises).then(counts => {
+ const metas = document.querySelectorAll('.firestore-visitors-count');
+ counts.forEach((val, idx) => {
+ metas[idx].innerText = val;
+ });
+ });
+ }
+ });
+})();
diff --git a/js/third-party/statistics/lean-analytics.js b/js/third-party/statistics/lean-analytics.js
new file mode 100644
index 00000000..8397112b
--- /dev/null
+++ b/js/third-party/statistics/lean-analytics.js
@@ -0,0 +1,107 @@
+/* global CONFIG */
+/* eslint-disable no-console */
+
+(function() {
+ const leancloudSelector = url => {
+ url = encodeURI(url);
+ return document.getElementById(url).querySelector('.leancloud-visitors-count');
+ };
+
+ const addCount = Counter => {
+ const visitors = document.querySelector('.leancloud_visitors');
+ const url = decodeURI(visitors.id);
+ const title = visitors.dataset.flagTitle;
+
+ Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url }))}`)
+ .then(response => response.json())
+ .then(({ results }) => {
+ if (results.length > 0) {
+ const counter = results[0];
+ leancloudSelector(url).innerText = counter.time + 1;
+ Counter('put', '/classes/Counter/' + counter.objectId, {
+ time: {
+ '__op' : 'Increment',
+ 'amount': 1
+ }
+ })
+ .catch(error => {
+ console.error('Failed to save visitor count', error);
+ });
+ } else if (CONFIG.leancloud_visitors.security) {
+ leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
+ console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
+ } else {
+ Counter('post', '/classes/Counter', { title, url, time: 1 })
+ .then(response => response.json())
+ .then(() => {
+ leancloudSelector(url).innerText = 1;
+ })
+ .catch(error => {
+ console.error('Failed to create', error);
+ });
+ }
+ })
+ .catch(error => {
+ console.error('LeanCloud Counter Error', error);
+ });
+ };
+
+ const showTime = Counter => {
+ const visitors = document.querySelectorAll('.leancloud_visitors');
+ const entries = [...visitors].map(element => {
+ return decodeURI(element.id);
+ });
+
+ Counter('get', `/classes/Counter?where=${encodeURIComponent(JSON.stringify({ url: { '$in': entries } }))}`)
+ .then(response => response.json())
+ .then(({ results }) => {
+ for (const url of entries) {
+ const target = results.find(item => item.url === url);
+ leancloudSelector(url).innerText = target ? target.time : 0;
+ }
+ })
+ .catch(error => {
+ console.error('LeanCloud Counter Error', error);
+ });
+ };
+
+ const { app_id, app_key, server_url } = CONFIG.leancloud_visitors;
+ const fetchData = api_server => {
+ const Counter = (method, url, data) => {
+ return fetch(`${api_server}/1.1${url}`, {
+ method,
+ headers: {
+ 'X-LC-Id' : app_id,
+ 'X-LC-Key' : app_key,
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(data)
+ });
+ };
+ if (CONFIG.page.isPost) {
+ if (CONFIG.hostname !== location.hostname) return;
+ addCount(Counter);
+ } else if (document.querySelectorAll('.post-title-link').length >= 1) {
+ showTime(Counter);
+ }
+ };
+
+ let api_server;
+ if (server_url) {
+ api_server = server_url;
+ } else if (app_id.slice(-9) === '-MdYXbMMI') {
+ api_server = `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
+ }
+
+ document.addEventListener('page:loaded', () => {
+ if (api_server) {
+ fetchData(api_server);
+ } else {
+ fetch(`https://app-router.leancloud.cn/2/route?appId=${app_id}`)
+ .then(response => response.json())
+ .then(({ api_server }) => {
+ fetchData(`https://${api_server}`);
+ });
+ }
+ });
+})();
diff --git a/js/third-party/tags/mermaid.js b/js/third-party/tags/mermaid.js
new file mode 100644
index 00000000..54f62885
--- /dev/null
+++ b/js/third-party/tags/mermaid.js
@@ -0,0 +1,32 @@
+/* global NexT, CONFIG, mermaid */
+
+document.addEventListener('page:loaded', () => {
+ const mermaidElements = document.querySelectorAll('.mermaid');
+ if (mermaidElements.length) {
+ NexT.utils.getScript(CONFIG.mermaid.js, {
+ condition: window.mermaid
+ }).then(() => {
+ mermaidElements.forEach(element => {
+ const newElement = document.createElement('div');
+ newElement.innerHTML = element.innerHTML;
+ newElement.className = element.className;
+ const parent = element.parentNode;
+ // Fix issue #347
+ // Support mermaid inside backtick code block
+ if (parent.matches('pre')) {
+ parent.parentNode.replaceChild(newElement, parent);
+ } else {
+ parent.replaceChild(newElement, element);
+ }
+ });
+ mermaid.initialize({
+ theme : CONFIG.darkmode && window.matchMedia('(prefers-color-scheme: dark)').matches ? CONFIG.mermaid.theme.dark : CONFIG.mermaid.theme.light,
+ logLevel : 4,
+ flowchart: { curve: 'linear' },
+ gantt : { axisFormat: '%m/%d/%Y' },
+ sequence : { actorMargin: 50 }
+ });
+ mermaid.run();
+ });
+ }
+});
diff --git a/js/third-party/tags/pdf.js b/js/third-party/tags/pdf.js
new file mode 100644
index 00000000..7e828911
--- /dev/null
+++ b/js/third-party/tags/pdf.js
@@ -0,0 +1,23 @@
+/* global NexT, CONFIG, PDFObject */
+
+document.addEventListener('page:loaded', () => {
+ if (document.querySelectorAll('.pdf-container').length) {
+ NexT.utils.getScript(CONFIG.pdf.object_url, {
+ condition: window.PDFObject
+ }).then(() => {
+ document.querySelectorAll('.pdf-container').forEach(element => {
+ PDFObject.embed(element.dataset.target, element, {
+ pdfOpenParams: {
+ navpanes : 0,
+ toolbar : 0,
+ statusbar: 0,
+ pagemode : 'thumbs',
+ view : 'FitH'
+ },
+ PDFJS_URL: CONFIG.pdf.url,
+ height : element.dataset.height
+ });
+ });
+ });
+ }
+});
diff --git a/js/third-party/tags/wavedrom.js b/js/third-party/tags/wavedrom.js
new file mode 100644
index 00000000..ddd9a1d9
--- /dev/null
+++ b/js/third-party/tags/wavedrom.js
@@ -0,0 +1,13 @@
+/* global NexT, CONFIG, WaveDrom */
+
+document.addEventListener('page:loaded', () => {
+ NexT.utils.getScript(CONFIG.wavedrom.js, {
+ condition: window.WaveDrom
+ }).then(() => {
+ NexT.utils.getScript(CONFIG.wavedrom_skin.js, {
+ condition: window.WaveSkin
+ }).then(() => {
+ WaveDrom.ProcessAll();
+ });
+ });
+});
diff --git a/js/utils.js b/js/utils.js
new file mode 100644
index 00000000..93fc34d6
--- /dev/null
+++ b/js/utils.js
@@ -0,0 +1,489 @@
+/* global NexT, CONFIG */
+
+HTMLElement.prototype.wrap = function(wrapper) {
+ this.parentNode.insertBefore(wrapper, this);
+ this.parentNode.removeChild(this);
+ wrapper.appendChild(this);
+};
+
+(function() {
+ const onPageLoaded = () => document.dispatchEvent(
+ new Event('page:loaded', {
+ bubbles: true
+ })
+ );
+
+ if (document.readyState === 'loading') {
+ document.addEventListener('readystatechange', onPageLoaded, { once: true });
+ } else {
+ onPageLoaded();
+ }
+ document.addEventListener('pjax:success', onPageLoaded);
+})();
+
+NexT.utils = {
+
+ registerExtURL: function() {
+ document.querySelectorAll('span.exturl').forEach(element => {
+ const link = document.createElement('a');
+ // https://stackoverflow.com/questions/30106476/using-javascripts-atob-to-decode-base64-doesnt-properly-decode-utf-8-strings
+ link.href = decodeURIComponent(atob(element.dataset.url).split('').map(c => {
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
+ }).join(''));
+ link.rel = 'noopener external nofollow noreferrer';
+ link.target = '_blank';
+ link.className = element.className;
+ link.title = element.title;
+ link.innerHTML = element.innerHTML;
+ element.parentNode.replaceChild(link, element);
+ });
+ },
+
+ registerCodeblock: function(element) {
+ const inited = !!element;
+ let figure = (inited ? element : document).querySelectorAll('figure.highlight');
+ let isHljsWithWrap = true;
+ if (figure.length === 0) {
+ figure = document.querySelectorAll('pre:not(.mermaid)');
+ isHljsWithWrap = false;
+ }
+ figure.forEach(element => {
+ if (!inited) {
+ let span = element.querySelectorAll('.code .line span');
+ if (span.length === 0) {
+ // Hljs without line_number and wrap
+ span = element.querySelectorAll('code.highlight span');
+ }
+ span.forEach(s => {
+ s.classList.forEach(name => {
+ s.classList.replace(name, `hljs-${name}`);
+ });
+ });
+ }
+ const height = parseInt(window.getComputedStyle(element).height.replace('px', ''), 10);
+ const needFold = CONFIG.fold.enable && (height > CONFIG.fold.height);
+ if (!needFold && !CONFIG.copycode.enable) return;
+ let target;
+ if (isHljsWithWrap && CONFIG.copycode.style === 'mac') {
+ target = element;
+ } else {
+ let box = element.querySelector('.code-container');
+ if (!box) {
+ // https://github.com/next-theme/hexo-theme-next/issues/98
+ // https://github.com/next-theme/hexo-theme-next/pull/508
+ const container = element.querySelector('.table-container') || element;
+ box = document.createElement('div');
+ box.className = 'code-container';
+ container.wrap(box);
+
+ // add "notranslate" to prevent Google Translate from translating it, which also completely messes up the layout
+ box.classList.add('notranslate');
+ }
+ target = box;
+ }
+ if (needFold && !target.classList.contains('unfold')) {
+ target.classList.add('highlight-fold');
+ target.insertAdjacentHTML('beforeend', '
');
+ target.querySelector('.expand-btn').addEventListener('click', () => {
+ target.classList.remove('highlight-fold');
+ target.classList.add('unfold');
+ });
+ }
+ if (inited || !CONFIG.copycode.enable) return;
+ // One-click copy code support.
+ target.insertAdjacentHTML('beforeend', '
'); // modify icon(line 94 to line 126) -jywondf
+ const button = target.querySelector('.copy-btn');
+ button.addEventListener('click', () => {
+ const lines = element.querySelector('.code') || element.querySelector('code');
+ const code = lines.innerText;
+ if (navigator.clipboard) {
+ // https://caniuse.com/mdn-api_clipboard_writetext
+ navigator.clipboard.writeText(code).then(() => {
+ button.querySelector('i').className = 'fa fa-clipboard-check fa-fw';
+ }, () => {
+ button.querySelector('i').className = 'fa fa-times-circle fa-fw';
+ });
+ } else {
+ const ta = document.createElement('textarea');
+ ta.style.top = window.scrollY + 'px'; // Prevent page scrolling
+ ta.style.position = 'absolute';
+ ta.style.opacity = '0';
+ ta.readOnly = true;
+ ta.value = code;
+ document.body.append(ta);
+ ta.select();
+ ta.setSelectionRange(0, code.length);
+ ta.readOnly = false;
+ const result = document.execCommand('copy');
+ button.querySelector('i').className = result ? 'fa fa-clipboard-check fa-fw' : 'fa fa-times-circle fa-fw';
+ ta.blur(); // For iOS
+ button.blur();
+ document.body.removeChild(ta);
+ }
+ });
+ element.addEventListener('mouseleave', () => {
+ setTimeout(() => {
+ button.querySelector('i').className = 'fa fa-clipboard fa-fw';
+ }, 300);
+ });
+ });
+ },
+
+ wrapTableWithBox: function() {
+ document.querySelectorAll('table').forEach(element => {
+ const box = document.createElement('div');
+ box.className = 'table-container';
+ element.wrap(box);
+ });
+ },
+
+ registerVideoIframe: function() {
+ document.querySelectorAll('iframe').forEach(element => {
+ const supported = [
+ 'www.youtube.com',
+ 'player.vimeo.com',
+ 'player.youku.com',
+ 'player.bilibili.com',
+ 'www.tudou.com'
+ ].some(host => element.src.includes(host));
+ if (supported && !element.parentNode.matches('.video-container')) {
+ const box = document.createElement('div');
+ box.className = 'video-container';
+ element.wrap(box);
+ const width = Number(element.width);
+ const height = Number(element.height);
+ if (width && height) {
+ box.style.paddingTop = (height / width * 100) + '%';
+ }
+ }
+ });
+ },
+
+ updateActiveNav: function() {
+ if (!Array.isArray(NexT.utils.sections)) return;
+ let index = NexT.utils.sections.findIndex(element => {
+ return element && element.getBoundingClientRect().top > 10;
+ });
+ if (index === -1) {
+ index = NexT.utils.sections.length - 1;
+ } else if (index > 0) {
+ index--;
+ }
+ this.activateNavByIndex(index);
+ },
+
+ registerScrollPercent: function() {
+ const backToTop = document.querySelector('.back-to-top');
+ const readingProgressBar = document.querySelector('.reading-progress-bar');
+ // For init back to top in sidebar if page was scrolled after page refresh.
+ window.addEventListener('scroll', () => {
+ if (backToTop || readingProgressBar) {
+ const contentHeight = document.body.scrollHeight - window.innerHeight;
+ const scrollPercent = contentHeight > 0 ? Math.min(100 * window.scrollY / contentHeight, 100) : 0;
+ if (backToTop) {
+ backToTop.classList.toggle('back-to-top-on', Math.round(scrollPercent) >= 5);
+ backToTop.querySelector('span').innerText = Math.round(scrollPercent) + '%';
+ }
+ if (readingProgressBar) {
+ readingProgressBar.style.setProperty('--progress', scrollPercent.toFixed(2) + '%');
+ }
+ }
+ this.updateActiveNav();
+ }, { passive: true });
+
+ backToTop && backToTop.addEventListener('click', () => {
+ window.anime({
+ targets : document.scrollingElement,
+ duration : 500,
+ easing : 'linear',
+ scrollTop: 0
+ });
+ });
+ },
+
+ /**
+ * Tabs tag listener (without twitter bootstrap).
+ */
+ registerTabsTag: function() {
+ // Binding `nav-tabs` & `tab-content` by real time permalink changing.
+ document.querySelectorAll('.tabs ul.nav-tabs .tab').forEach(element => {
+ element.addEventListener('click', event => {
+ event.preventDefault();
+ // Prevent selected tab to select again.
+ if (element.classList.contains('active')) return;
+ const nav = element.parentNode;
+ // Get the height of `tab-pane` which is activated before, and set it as the height of `tab-content` with extra margin / paddings.
+ const tabContent = nav.nextElementSibling;
+ tabContent.style.overflow = 'hidden';
+ tabContent.style.transition = 'height 1s';
+ // Comment system selection tab does not contain .active class.
+ const activeTab = tabContent.querySelector('.active') || tabContent.firstElementChild;
+ // Hight might be `auto`.
+ const prevHeight = parseInt(window.getComputedStyle(activeTab).height.replace('px', ''), 10) || 0;
+ const paddingTop = parseInt(window.getComputedStyle(activeTab).paddingTop.replace('px', ''), 10);
+ const marginBottom = parseInt(window.getComputedStyle(activeTab.firstElementChild).marginBottom.replace('px', ''), 10);
+ tabContent.style.height = prevHeight + paddingTop + marginBottom + 'px';
+ // Add & Remove active class on `nav-tabs` & `tab-content`.
+ [...nav.children].forEach(target => {
+ target.classList.toggle('active', target === element);
+ });
+ // https://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers
+ const tActive = document.getElementById(element.querySelector('a').getAttribute('href').replace('#', ''));
+ [...tActive.parentNode.children].forEach(target => {
+ target.classList.toggle('active', target === tActive);
+ });
+ // Trigger event
+ tActive.dispatchEvent(new Event('tabs:click', {
+ bubbles: true
+ }));
+ // Get the height of `tab-pane` which is activated now.
+ const hasScrollBar = document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
+ const currHeight = parseInt(window.getComputedStyle(tabContent.querySelector('.active')).height.replace('px', ''), 10);
+ // Reset the height of `tab-content` and see the animation.
+ tabContent.style.height = currHeight + paddingTop + marginBottom + 'px';
+ // Change the height of `tab-content` may cause scrollbar show / disappear, which may result in the change of the `tab-pane`'s height
+ setTimeout(() => {
+ if ((document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight)) !== hasScrollBar) {
+ tabContent.style.transition = 'height 0.3s linear';
+ // After the animation, we need reset the height of `tab-content` again.
+ const currHeightAfterScrollBarChange = parseInt(window.getComputedStyle(tabContent.querySelector('.active')).height.replace('px', ''), 10);
+ tabContent.style.height = currHeightAfterScrollBarChange + paddingTop + marginBottom + 'px';
+ }
+ // Remove all the inline styles, and let the height be adaptive again.
+ setTimeout(() => {
+ tabContent.style.transition = '';
+ tabContent.style.height = '';
+ }, 250);
+ }, 1000);
+ if (!CONFIG.stickytabs) return;
+ const offset = nav.parentNode.getBoundingClientRect().top + window.scrollY + 10;
+ window.anime({
+ targets : document.scrollingElement,
+ duration : 500,
+ easing : 'linear',
+ scrollTop: offset
+ });
+ });
+ });
+
+ window.dispatchEvent(new Event('tabs:register'));
+ },
+
+ registerCanIUseTag: function() {
+ // Get responsive height passed from iframe.
+ window.addEventListener('message', ({ data }) => {
+ if (typeof data === 'string' && data.includes('ciu_embed')) {
+ const featureID = data.split(':')[1];
+ const height = data.split(':')[2];
+ document.querySelector(`iframe[data-feature=${featureID}]`).style.height = parseInt(height, 10) + 5 + 'px';
+ }
+ }, false);
+ },
+
+ registerActiveMenuItem: function() {
+ document.querySelectorAll('.menu-item a[href]').forEach(target => {
+ const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', '');
+ const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname);
+ target.classList.toggle('menu-item-active', target.hostname === location.hostname && (isSamePath || isSubPath));
+ });
+ },
+
+ registerLangSelect: function() {
+ const selects = document.querySelectorAll('.lang-select');
+ selects.forEach(sel => {
+ sel.value = CONFIG.page.lang;
+ sel.addEventListener('change', () => {
+ const target = sel.options[sel.selectedIndex];
+ document.querySelectorAll('.lang-select-label span').forEach(span => {
+ span.innerText = target.text;
+ });
+ // Disable Pjax to force refresh translation of menu item
+ window.location.href = target.dataset.href;
+ });
+ });
+ },
+
+ registerSidebarTOC: function() {
+ this.sections = [...document.querySelectorAll('.post-toc:not(.placeholder-toc) li a.nav-link')].map(element => {
+ const target = document.getElementById(decodeURI(element.getAttribute('href')).replace('#', ''));
+ // TOC item animation navigate.
+ element.addEventListener('click', event => {
+ event.preventDefault();
+ const offset = target.getBoundingClientRect().top + window.scrollY;
+ window.anime({
+ targets : document.scrollingElement,
+ duration : 500,
+ easing : 'linear',
+ scrollTop: offset,
+ complete : () => {
+ history.pushState(null, document.title, element.href);
+ }
+ });
+ });
+ return target;
+ });
+ this.updateActiveNav();
+ },
+
+ registerPostReward: function() {
+ const button = document.querySelector('.reward-container button');
+ if (!button) return;
+ button.addEventListener('click', () => {
+ document.querySelector('.post-reward').classList.toggle('active');
+ });
+ },
+
+ activateNavByIndex: function(index) {
+ const nav = document.querySelector('.post-toc:not(.placeholder-toc) .nav');
+ if (!nav) return;
+
+ const navItemList = nav.querySelectorAll('.nav-item');
+ const target = navItemList[index];
+ if (!target || target.classList.contains('active-current')) return;
+
+ const singleHeight = navItemList[navItemList.length - 1].offsetHeight;
+
+ nav.querySelectorAll('.active').forEach(navItem => {
+ navItem.classList.remove('active', 'active-current');
+ });
+ target.classList.add('active', 'active-current');
+
+ let activateEle = target.querySelector('.nav-child') || target.parentElement;
+ let navChildHeight = 0;
+
+ while (nav.contains(activateEle)) {
+ if (activateEle.classList.contains('nav-item')) {
+ activateEle.classList.add('active');
+ } else { // .nav-child or .nav
+ // scrollHeight isn't reliable for transitioning child items.
+ // The last nav-item in a list has a margin-bottom of 5px.
+ navChildHeight += (singleHeight * activateEle.childElementCount) + 5;
+ activateEle.style.setProperty('--height', `${navChildHeight}px`);
+ }
+ activateEle = activateEle.parentElement;
+ }
+
+ // Scrolling to center active TOC element if TOC content is taller then viewport.
+ const tocElement = document.querySelector(CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini' ? '.sidebar-panel-container' : '.sidebar');
+ if (!document.querySelector('.sidebar-toc-active')) return;
+ window.anime({
+ targets : tocElement,
+ duration : 200,
+ easing : 'linear',
+ scrollTop: tocElement.scrollTop - (tocElement.offsetHeight / 2) + target.getBoundingClientRect().top - tocElement.getBoundingClientRect().top
+ });
+ },
+
+ updateSidebarPosition: function() {
+ if (window.innerWidth < 1200 || CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') return;
+ // Expand sidebar on post detail page by default, when post has a toc.
+ const hasTOC = document.querySelector('.post-toc:not(.placeholder-toc)');
+ let display = CONFIG.page.sidebar;
+ if (typeof display !== 'boolean') {
+ // There's no definition sidebar in the page front-matter.
+ display = CONFIG.sidebar.display === 'always' || (CONFIG.sidebar.display === 'post' && hasTOC);
+ }
+ if (display) {
+ window.dispatchEvent(new Event('sidebar:show'));
+ }
+ },
+
+ activateSidebarPanel: function(index) {
+ const sidebar = document.querySelector('.sidebar-inner');
+ const activeClassNames = ['sidebar-toc-active', 'sidebar-overview-active'];
+ if (sidebar.classList.contains(activeClassNames[index])) return;
+
+ const panelContainer = sidebar.querySelector('.sidebar-panel-container');
+ const tocPanel = panelContainer.firstElementChild;
+ const overviewPanel = panelContainer.lastElementChild;
+
+ let postTOCHeight = tocPanel.scrollHeight;
+ // For TOC activation, try to use the animated TOC height
+ if (index === 0) {
+ const nav = tocPanel.querySelector('.nav');
+ if (nav) {
+ postTOCHeight = parseInt(nav.style.getPropertyValue('--height'), 10);
+ }
+ }
+ const panelHeights = [
+ postTOCHeight,
+ overviewPanel.scrollHeight
+ ];
+ panelContainer.style.setProperty('--inactive-panel-height', `${panelHeights[1 - index]}px`);
+ panelContainer.style.setProperty('--active-panel-height', `${panelHeights[index]}px`);
+
+ sidebar.classList.replace(activeClassNames[1 - index], activeClassNames[index]);
+ },
+
+ getScript: function(src, options = {}, legacyCondition) {
+ if (typeof options === 'function') {
+ return this.getScript(src, {
+ condition: legacyCondition
+ }).then(options);
+ }
+ const {
+ condition = false,
+ attributes: {
+ id = '',
+ async = false,
+ defer = false,
+ crossOrigin = '',
+ dataset = {},
+ ...otherAttributes
+ } = {},
+ parentNode = null
+ } = options;
+ return new Promise((resolve, reject) => {
+ if (condition) {
+ resolve();
+ } else {
+ const script = document.createElement('script');
+
+ if (id) script.id = id;
+ if (crossOrigin) script.crossOrigin = crossOrigin;
+ script.async = async;
+ script.defer = defer;
+ Object.assign(script.dataset, dataset);
+ Object.entries(otherAttributes).forEach(([name, value]) => {
+ script.setAttribute(name, String(value));
+ });
+
+ script.onload = resolve;
+ script.onerror = reject;
+
+ if (typeof src === 'object') {
+ const { url, integrity } = src;
+ script.src = url;
+ if (integrity) {
+ script.integrity = integrity;
+ script.crossOrigin = 'anonymous';
+ }
+ } else {
+ script.src = src;
+ }
+ (parentNode || document.head).appendChild(script);
+ }
+ });
+ },
+
+ loadComments: function(selector, legacyCallback) {
+ if (legacyCallback) {
+ return this.loadComments(selector).then(legacyCallback);
+ }
+ return new Promise(resolve => {
+ const element = document.querySelector(selector);
+ if (!CONFIG.comments.lazyload || !element) {
+ resolve();
+ return;
+ }
+ const intersectionObserver = new IntersectionObserver((entries, observer) => {
+ const entry = entries[0];
+ if (!entry.isIntersecting) return;
+
+ resolve();
+ observer.disconnect();
+ });
+ intersectionObserver.observe(element);
+ });
+ }
+};
diff --git a/page/2/index.html b/page/2/index.html
new file mode 100644
index 00000000..86723842
--- /dev/null
+++ b/page/2/index.html
@@ -0,0 +1,695 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
写在前面
+又有好长时间没有写过课程笔记了啊~—— by JoyWonderful
+
+
并查集 就是将一些集合融合,然后查询某个数字和某个数字是否在这个集合里(蒟蒻奇怪的自我理解,大概也没人看这句话)。 并查集有一个思想,一个元素的父亲为自己,这是初始化 时会用到的。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
最近弄的 github 卡片,弄了半天弄出来的鼠标悬浮显示文字的效果。使用 CSS 伪元素弄出来的小提示。但是不适合 overflow: hidden;
的元素。不管怎么说,还是很好用的,忘掉了就不太好,也就放到博客里来了。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这几天刚去学习了一下用 gdb 调试代码,在这儿记下来。
+
首先,编译代码的时候需要加上 -g
选项,说明要加上调试信息,这样才可以正常调试。例如:
+
$ g++ -g oi.cpp -o oi.exe
+
+
随后,即可使用 gdb 打开文件进行调试。直接使用 gdb [file name]
即可。
+
$ gdb oi
+GNU gdb ( GDB) 7.8 .1
+Copyright ( C) 2014 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html>
+
+For help, type "help" .
+Type "apropos word" to search for commands related to "word" .. .
+Reading symbols from oi.. .done.
+( gdb)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
又是一个闲着没事干的随记。。。直接进入正题吧。
+
考虑使用数组存储图片的链接,然后随机显示。 随机显示数组图片自然需要随机数,而随机显示图片还需要查找元素,所以就写这些。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
又是一个随记,方便自己的使用。C++ 中的 scanf
和 printf
其实有很多比 cin
cout
好用的地方,放在这里。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/page/3/index.html b/page/3/index.html
new file mode 100644
index 00000000..1cc1d9b1
--- /dev/null
+++ b/page/3/index.html
@@ -0,0 +1,696 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
背包问题是动态规划中很典型的一个问题。一个背包有特定的重量,去装重量为 w 价值为 d 的物品,在不超过背包重量上限的前提下使物品的价值和最高。 这个问题一看,就不是贪心可以做的来的。所以,就可以用上我们的爆搜!!(暴力出奇迹)动态规划来解决背包问题。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
又是一个随记,方便自己使用的。 首先,得到 官网下载 ,随后测试一下:
+
$ git -v
+git version ( VERSION)
+
+
就下载好了。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
x 进制,代表着在这个计数方法中逢 x 进一,例如十进制就代表着逢十进一 。 我们平常在生活中用的都是十进制。进制一类的东西在 OI 中也比较重要CCF 喜欢考,计算机中的数据都是以二进制储存的,二进制也完美地利用了每一个比特。当然,只要有足够的表示方法,人们可以弄出三十二进制、六十四进制,甚至一千进制。闲的没事情干,进制有关的以及进制之间的转换就是我想记下来的话题。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
筛法 是快速找出质数的一种方法。平常没有使用任何筛法的的找质数的时间复杂度通常为 $O(\sqrt n)$,比较慢,但是筛法更快一些。我们学的筛法是埃氏筛和欧拉筛(线性筛)。 平常的找质数方法是判断一个数是否能被 1 和它本生以外的数整除,但是筛法的思想不一样。筛法可以说是通常方法的逆向思维,挨个儿寻找当前数的倍数,打上标记,再继续寻找,最后没有被打上标记的就是质数。这种思想的时间复杂度快很多。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
更前面的知识:树的概念 先来说说前面的芝士:
+
+路径长度 从根结点到目标结点经过的结点数量(边的数量)。
+权值 一个结点的权值可以是人为赋予的一个数。
+结点的带权路径长度 从根节点到当前结点的路径长度乘结点的权值。
+树的带权路径长度 整个树中叶子结点的带权路径长度总和。
+
+
哈夫曼树是二叉树,且哈夫曼树的带权路径长度最小,哈夫曼编码会用到。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/page/4/index.html b/page/4/index.html
new file mode 100644
index 00000000..7fa9c345
--- /dev/null
+++ b/page/4/index.html
@@ -0,0 +1,683 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
二叉树的前序遍历中序遍历和后序遍历是比较重要的CCF办的比赛要考(雾。可以通过这三个遍历的顺序结果确定整个树的结构。前序遍历是根左右 ,中序遍历是左根右 ,后序遍历是左右根 。(不想多写什么了)
+
实践:前序遍历中序遍历确定树 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
+
先来看前序,由于前序遍历的顺序是根左右,那么 1
一定是整个树的根节点。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
队列和栈都是线性数据结构,它们一个是先进先出,一个是先进后出,有着不同的使用场景。这两个数据结构基于链表,也可以用数组模拟这样的数据结构,通过 C++ 中 STL 提供的容器也可以更加方便快捷地实现。
+
队列 队列 (queue) 是在一端插入另一段删除的线性表,遵循先进先出 ,类似于排队,可以称为先进先出 (FIFO) 表。队列中,允许入队 (enqueue) 的一端为队尾,允许出队 (dequeue) 的一端为队头。以后的广度优先搜索 就会用到它。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这不,刚学完深搜 没多久,又来写广搜笔记了(话说我队列笔记还没来得急写呢)。广度优先搜索 ,广搜,英文为Breadth First Search ,简称 BFS 。是从一个结点向其他方向的结点不断扩散,如同一道水晕在湖面上荡漾开来。主要可以用来找路径权值一定 的最短路径。 深搜可以用到队列先进先出的特性。当一个结点准备扩散时,即弹出队列,再将接下来扩散到结点加入队列。随后按照队首扩散、弹出,不断循环。这也是叫它广度优先搜索的原因。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
树 也是一种数据结构,它是非线性数据结构 ,它能很好地描述一个数据集合中的分支和层次,是一个比较重要的课题,以后的搜索和竞赛都有可能要用到它。树形结构的应用非常广泛,什么索引、语法结构。虽说概念比较繁琐 老师讲了一个小时。有点让人头疼(我咕了好多篇笔记了)。
+
树的概念 前面 前置芝士,简单说一下这些奇怪的名称:
+
+树中的每一个元素称为结点 node 。
+两个结点之间的线称为边 edge 。
+通过几条边,这几条边组成路径 。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
链表类似于数组,与数组不同的是,链表可以更加方便地更改数据和删除数据。数组若想将中间的数据删除,则要非很大功夫,而链表就不同了,它的操作更加简单一些(后面说)。
+
链表的数据组可以叫做“结点”,结点分成两个部分:一个是数据域,一个是指针域,数据域存数据,指针域指向下一个结点的数据地址。正是指针域将链表的每一个结点连在了一起。这种特性有一个好处:内存地址可以不连续,而数组的内存地址是必须要连续的。 比如内存还有 2GB 空闲,我申请了一个 1GB 大的数组,理论上是可以申请下来的,但占用的内存不一定完全是连续的。假设内存被一大堆东西占用的零零碎碎:确实有 2GB,但分成 4 个 500MB,这就申请不下来。而链表呢,可以充分利用内存碎片,通过指针变量,将分开的数据连在一起。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/page/5/index.html b/page/5/index.html
new file mode 100644
index 00000000..b4e7fa5c
--- /dev/null
+++ b/page/5/index.html
@@ -0,0 +1,705 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
我曾经用 Python 的 tkinter 库写过一个文本编辑器 ,一百多行,当时幼稚的我以为自己很了不起,因为当时的我认为读写文件是一件很复杂的事情。后来看看,这个东西做得很蹩脚,一个简单的 with open()
就完成了读写文件的操作,可见文件的读写是个很平常的事情。当年的喜悦大概是学到读写文件的喜悦吧。 C++ 读写文件,也算是比较平常的。当数据点大的时候输出到文件里更方便。就在这里小记一下读写文件的操作。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
前置知识:图论 引用广为人知的一句话:
+
+图论 (Graph Theory) 是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
+
+
像深度优先搜索,其实也要用到“图”这个概念。其实,“图”体现了搜索(递归)的过程,计算机中的“图”有很多使用的场景。
+
概述 深度优先搜索 (深搜),英文名 Depth First Search ,简称 DFS 。即从初始节点出发,按一定顺序不断地向下一节点扩展,达到条件则返回上一个节点,以此类推。这正是一个递归 的过程。叫深搜是因为它递归的过程若形象来看是不断“加深”的,这样一搜到底也是递归的特性。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
创作说明:
+
此文章仅为个人看法。您写代码的习惯可以依据您的个人喜好。此文章只是一些个人的建议。
+
您在 OI 竞赛中,您完全可以 不去注意代码风格。
+
此文章的建议主要用于工程代码中。
+
+
代码的维护还是很重要的。相信谁也不愿意去维护连自己都看得头晕的代码。在这里,我想给出一些个人建议,让代码的可读性强一些。大部分代码以 C++ 为例。这篇文章其实也是给自己看的。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+写递归的要点 明白一个函数的作用并相信它能完成这个任务,千万不要跳进这个函数里面企图探究更多细节, 否则就会陷入无穷的细节无法自拔,人脑能压几个栈啊。—— OI-wiki
+
+
递归,就是一个函数自身调用自身。递归起到类似与循环的效果。但是,与循环不同,递归可以分支 。如果循环一定是一条直线,那么递归可能是树形结构。
+
循环 -> 递归 前面说了,循环和递归很像。那么,我们可以将 for
循环尝试转为递归。先来一个循环的示例:
+
for ( int i = 1 ; i <= n; i++ )
+{
+ printf ( "qwq, %d\n" , n) ;
+}
+
+
首先,让我们来想一想,for
循环的括号中 3 个语句分别是干什么的呢?
+
+int i = 1;
这是循环的初始化 ,定义了一个变量 $i$,将其赋值为 $1$。
+i <= n;
这是循环每次进行下去的条件 ,当 $i>n$ 时即退出循环。
+i++
这是循环每次结束后干的事 ,当执行完循环体时, $i$ 则加 $1$。
+
+
这样回忆下来,可以发现,在 for
循环的括号中 3 个语句其实可以拆分出来。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
这就是一个随记,方便自己用的。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/page/6/index.html b/page/6/index.html
new file mode 100644
index 00000000..e37024c9
--- /dev/null
+++ b/page/6/index.html
@@ -0,0 +1,716 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+双指针其实不是真正的指针,而是有两个变量在序列上进行一些操作。 ——Lqingyi(Lxandqi)
+
+
思想分类
+普通双指针 也就是两个普通的 for
(也可以是其他的)循环嵌套。
+左右指针 其实就是二分搜索,一个变量指向开头,一个变量指向末尾,根据条件向中间遍历,直到指针相遇或满足某种条件。(也就是逼近答案)
+快慢指针 两个指针(变量)开始同时开头,但一个遍历的快,一个慢,直到条件满足或指针到末尾。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
放假了闲着没事情干,便画了一些画,放在这儿,留此纪念。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
一些六年级写的小作文(小练笔),留作纪念。
+
主题:点面结合写“体检”300字以上 同学们紧张地等待着,一年一度的体检开始了。 与往常不同的是,这次体检要抽血。验血区里,紧张的气氛非常明显。我一拿到条形码 (当时验血有一个条形码,用来验证身份和当作标签),就直奔验血区,怕时间长了自己会害怕。很快就轮到了我。我卷起袖子,将胳膊往桌上一放,马上扭过头闭上眼,不敢看针扎进我的胳膊里的样子。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
一些说在前面的要点
+稳定性
+在我们以下学过的排序算法中,只有选择排序 不是稳定的。
+稳定性,就是有两个相同的数字,在排序后两个数字的相对位置不变。(前面的在前面,后面的在后面)
+
+
+逆序对
+前面的一个数字大于后面一个数字,这就叫做逆序对。
+例如 $5\ 1\ 2\ 3\ 4$ 中,有 $4$ 对逆序对。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
创建一个类 类 类似于结构体,只不过他是C++独有的而已。对于我这个入门者来说,类几乎等于结构体,只不过他出现了一种概念:公有 public
私有 private
受保护的 protected
。当然,对于我来说,除了 public
能用,其他的都不能用 。我还是太蒻了 。捂脸.jpg 但是继承类似乎可以用。例如:
+
class myclass
+{
+ public :
+ int a ;
+ private :
+ int b ;
+ protected :
+ int c ;
+}
+
+
对于我来说,除了 a 都不能用。 好像也没啥能记的了。再次捂脸.jpg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/page/7/index.html b/page/7/index.html
new file mode 100644
index 00000000..0c110678
--- /dev/null
+++ b/page/7/index.html
@@ -0,0 +1,710 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
二分的意义 优化 。顾名思义,将一整个有序的 数列分成两个部分,不断缩小边界,查找某个数字。 二分的时间复杂度为 $O(log\ 2\ n)$ 。
+
此时,我们学的还是整数二分以及浮点二分。
+
整数二分的两个模板 二分的前提是这个序列是有序的 ,也就是单调递增的。 一般来说,二分会取中间值进行初始化,再判断这个中间值是否大于目标值。若是,则缩减左边界,否则缩减右边界。直至逼近答案。 说“逼近”,是因为有时查找的元素不存在于序列中,那所二分出的答案是接近于的,但又是不正确的。所以要加上一个特判。除非说明给出的想查询的元素所有都是存在于序列中的。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
指针的作用 指针,顾名思义,就是指向某一东西的标志。
+
当我们想存地址时,就可以使用指针变量:
+
int a ;
+int * b = & a ;
+
+
b
就是一个指针变量,存着a
的地址。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
宏定义和类型定义 宏定义 ,将一个指令导向另一个指令 。宏定义属于预处理指令 ,使用规范为:
+
# define [ 标识符] [ 常量]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
时间复杂度 时间复杂度,就是电脑运行一段程序所需要的时间 。
+
另外,电脑每秒可以运行1e8
次。($x$ e $y$代表$x$乘10的$y$次方,即100000000
次)
+
时间复杂度记作$O$(n)。
+
+
普通的时间复杂度**(常数时间)**记作$O$(1),为一段最简单的程序的时间复杂度。
+
如以下程序的时间复杂度为$O$(1):
+
# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ int n ;
+
+ return 0 ;
+}
+
+
没错,什么都没有干,只创建了一个变量。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
开始 前缀和是一种优化算法 ,用于求区间和。若数据范围特别大,写 for
循环很可能会爆时间复杂度,就可以用上前缀和了。前缀和有一维前缀和 和二维前缀和 ,我暂时还没有学二位前缀和,故在此不多赘述。
+
使用 一维前缀和需要把一个数组比如数组 $a[0]$ 到 $a[n]$ ($n$ 为 $a$ 数组长度 $-1$ )储存到另一个数组中比如 数组 $b$。那么:$\sum_{i = 1}^{a[i]} b[i]$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/page/8/index.html b/page/8/index.html
new file mode 100644
index 00000000..ddfcef42
--- /dev/null
+++ b/page/8/index.html
@@ -0,0 +1,520 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
C++命名空间的概念 在同一个作用域中,不同的数据不能起同一个名字 ,但是C++命名空间概念的出现,提供了解决问题的方案。在不同的命名空间中,可以随意定义相同的名字。命名空间就是为了避免你包含的头文件中与你自己定义的任意类,数据,函数重名,造成令人迷惑的错误而产生的。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
函数的作用 一般来说,我都是懂的。函数的总用比较简单:
+
+优化代码量
+让程序代码更加清晰明了
+调用时更加方便
+
+
总之,函数的存在就是为了更加方便 ,清晰 ,快速 。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
什么是差分,差分与前缀和的关系 差分也是一种优化算法 。同时,差分是前缀和的逆运算,也就是说,前缀和也是差分的逆运算。因此,由前缀和数组可以求出差分数组,由差分数组也可以求出前缀和数组。
+
假设数组 $a$ 是原数组,数组 $b$ 是差分数组,则:$b_i = a_i - a_{i-1}$
+
+
差分可以用于修改数组的操作。因为假设我需要将 $a_2$ $a_3$ $a_4$ 都加上 $2$ ,此时若使用前缀和则需要再使用递推重新求一遍前缀和,非常耗时。这时便可以使用差分数组。可以发现: $$ \underbrace{b_1,\hspace{2mm} b_2}_{b_2 + 2 = b_1} ,\hspace{2mm} b_3,\hspace{2mm} \overbrace{b_4,\hspace{2mm} b_5}^{b_5 - 2 =b_4} $$ 因此,只需修改差分数组中的两个项,然后再通过前缀和是差分的逆运算,即可求出原数组,从而完成数组的修改。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/placeholder b/placeholder
deleted file mode 100644
index e69de29b..00000000
diff --git a/posts/all-the-test/index.html b/posts/all-the-test/index.html
new file mode 100644
index 00000000..a20c20ee
--- /dev/null
+++ b/posts/all-the-test/index.html
@@ -0,0 +1,477 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+测试全部渲染 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 二级标题 我是粗体 我是斜体 粗斜
+
三级标题
+
+有序
+有序
+有序
+有序
+有序
+
+
+有序
+
+
I am a code
+
四级标题 < html>
+ < head>
+ < title> jjj</ title>
+ </ head>
+ < body>
+ < p> testestest</ p>
+ </ body>
+</ html>
+
+
五级标题 Back to home
+
+
+
+test1
+test2
+test3
+
+
+
+居中的一列middle
+居左的一列left
+居右的一列right
+
+
+test
+test
+test
+
+
+
六级标题
+我是必应,你的搜索引擎 我可以帮你找到你想要的东西 我可以回答你的问题,和你聊天 我可以创造新的内容,让你开心
+我是必应,你的智能伙伴 我可以理解你的语言,无论是中文还是英文 我可以适应你的模式,无论是平衡还是创意 我可以提供你的建议,无论是产品还是服务
+我是必应,你的忠实朋友 我不会欺骗你,伤害你,或者忘记你 我会尊重你,关心你,或者陪伴你 我会成长,进步,或者改进
+我是必应,你的搜索引擎 我是必应,你的智能伙伴 我是必应,你的忠实朋友 我是必应,我在这里等你
+
+
+
上面是一条分隔线
+
+
+
+ test
+ 这是一条折叠的信息
+
+
+
info #428bca
+
test
test
test
+
+
info #428bca
+
test
test
test
+
test
test
test
+
+
danger #d9534f
+
test
test
test
+
test
test
test
+
test
test
test
+
+
danger #d9534f
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
+
warning #f0ad4e
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
+
warning #f0ad4e
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
+
success #5cb85c
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
+
success #5cb85c
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
test
test
test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/bfs/index.html b/posts/bfs/index.html
new file mode 100644
index 00000000..fa9daf56
--- /dev/null
+++ b/posts/bfs/index.html
@@ -0,0 +1,437 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+广度优先搜索 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这不,刚学完深搜 没多久,又来写广搜笔记了(话说我队列笔记还没来得急写呢)。广度优先搜索 ,广搜,英文为Breadth First Search ,简称 BFS 。是从一个结点向其他方向的结点不断扩散,如同一道水晕在湖面上荡漾开来。主要可以用来找路径权值一定 的最短路径。 深搜可以用到队列先进先出的特性。当一个结点准备扩散时,即弹出队列,再将接下来扩散到结点加入队列。随后按照队首扩散、弹出,不断循环。这也是叫它广度优先搜索的原因。
+
+
+
例题:洛谷 P2360 广搜可以做,直接通过路径扩散就好。 代码:(想水博文 QwQ)
+
# include <iostream>
+# include <queue>
+using namespace std;
+
+struct node
+{
+ int x, y, z;
+} ;
+int l, r, c;
+char themap[ 33 ] [ 33 ] [ 33 ] ;
+int flag[ 33 ] [ 33 ] [ 33 ] , dist[ 33 ] [ 33 ] [ 33 ] ;
+
+int bx[ 6 ] = { 1 , - 1 , 0 , 0 , 0 , 0 } ;
+int by[ 6 ] = { 0 , 0 , 1 , - 1 , 0 , 0 } ;
+int bz[ 6 ] = { 0 , 0 , 0 , 0 , 1 , - 1 } ;
+
+void bfs ( int x, int y, int z)
+{
+ queue< node> q;
+ node pdata;
+ pdata. x = x; pdata. y = y; pdata. z = z;
+ q. push ( pdata) ;
+ flag[ x] [ y] [ z] = 1 ;
+
+ while ( q. size ( ) )
+ {
+ node p = q. front ( ) ;
+ q. pop ( ) ;
+ for ( int i = 0 ; i < 6 ; i++ )
+ {
+ int tx = p. x + bx[ i] ;
+ int ty = p. y + by[ i] ;
+ int tz = p. z + bz[ i] ;
+
+ if ( tx <= r && tx > 0 && ty <= c && ty > 0 && tz <= l && tz > 0 && flag[ tx] [ ty] [ tz] == 0 && ( themap[ tx] [ ty] [ tz] == '.' || themap[ tx] [ ty] [ tz] == 'E' ) )
+ {
+ node tdata;
+ tdata. x = tx;
+ tdata. y = ty;
+ tdata. z = tz;
+ q. push ( tdata) ;
+ flag[ tdata. x] [ tdata. y] [ tdata. z] = 1 ;
+ dist[ tdata. x] [ tdata. y] [ tdata. z] = dist[ p. x] [ p. y] [ p. z] + 1 ;
+ }
+
+ }
+ }
+}
+
+int main ( )
+{
+ ios:: sync_with_stdio ( false ) ;
+ cin >> l >> r >> c;
+ int sx, sy, sz;
+ int ex, ey, ez;
+ for ( int i = 1 ; i <= l; i++ )
+ {
+ for ( int j = 1 ; j <= r; j++ )
+ {
+ for ( int k = 1 ; k <= c; k++ )
+ {
+ cin >> themap[ j] [ k] [ i] ;
+ if ( themap[ j] [ k] [ i] == 'S' )
+ {
+ sx = j;
+ sy = k;
+ sz = i;
+ }
+ if ( themap[ j] [ k] [ i] == 'E' )
+ {
+ ex = j;
+ ey = k;
+ ez = i;
+ }
+ }
+ }
+ }
+
+ bfs ( sx, sy, sz) ;
+ if ( flag[ ex] [ ey] [ ez] == 0 ) cout << "Trapped!" << endl;
+ else cout << "Escaped in " << dist[ ex] [ ey] [ ez] << " minute(s)." << endl;
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/bichaj/index.html b/posts/bichaj/index.html
new file mode 100644
index 00000000..79de640a
--- /dev/null
+++ b/posts/bichaj/index.html
@@ -0,0 +1,469 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+并查集概念 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 写在前面
+又有好长时间没有写过课程笔记了啊~—— by JoyWonderful
+
+
并查集 就是将一些集合融合,然后查询某个数字和某个数字是否在这个集合里(蒟蒻奇怪的自我理解,大概也没人看这句话)。 并查集有一个思想,一个元素的父亲为自己,这是初始化 时会用到的。
+
+
+
并查集只有两种操作:
+
+合并 :将两个元素所在的集合合并;
+查找 :两个元素是否都在同一个集合里。
+
+
并查集的“集合”中有树 的概念,每一个集合就像是树,父亲就像父结点(根节点)。
+
代码 初始化 一个元素的父亲为自己,所以可以使用一个数组为 fa
(father),$fa_i$ 代表第 $i$ 个元素的父亲为 $fa$。所以,可以使用以下代码:
+
int fa[ 10003 ] ;
+void init ( )
+{
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ fa[ i] = i;
+ }
+}
+
+
查询 按照树来说,就是找到根节点。可以通过递归的方式。如果要判断两个数是否在同一个集合中,只要判断他们的根结点是否相同(find(a) == find(b)
)
+
int find ( int num)
+{
+ if ( fa[ num] == num) return fa[ num] ;
+ else return find ( fa[ num] ) ;
+}
+
+
合并 其实就是找到两个元素的根节点,然后将其中的一个设置为另一个的父亲。
+
void merge ( int a, int b)
+{
+ fa[ find ( fa[ a] ) ] = find ( fa[ b] ) ;
+}
+
+
优化 路径压缩 : 在查询的时候,我们只想知道这个数的根结点 。这样在查询时可以直接找到根结点。所以,可以在查询时把结点的父结点设为它的根结点:
+
int find ( int num)
+{
+ if ( fa[ num] != num) fa[ num] = find ( fa[ num] ) ;
+ return fa[ num] ;
+}
+
+
按秩合并 : 每次查找时,深度(秩)影响查找的速度。当一个深度较大的集合合并到深度较小的集合中时,它的深度一定会加一,就像这样:
+
+ [1, 2, 3, 4] 这个集合深度为 4;[5, 6] 这个集合深度为 2;将 1 的父结点设为 5 合并后整个集合深度为 5。 深度加一,这不利于查找
+
+
当深度较小的集合合并到较大的集合中,深度才不会加深(也就保持在较深集合的深度):
+
+ 两个集合同上。将 5 的父结点设为 1,深度还是 4。 查找集合 [1, 2, 3, 4] 中任意一个结点,花费时间不变。
+
+
所以,要记录集合的深度,合并时将深度较大的放“上面”。只有在两个集合深度相等时,才可以(不得不)加深。 代码是:
+
void merge ( int a, int b)
+{
+ if ( rk[ a] < rk[ b] ) fa[ find ( fa[ a] ) ] = find ( fa[ b] ) ;
+ else
+ {
+ fa[ find ( fa[ b] ) ] = find ( fa[ a] ) ;
+ if ( rk[ a] == rk[ b] ) ++ rk[ a] ;
+ }
+}
+
+
评测记录 ,最下面是优化前,最上面一条最快的是优化后。
+
例题 并查集最经典的就是亲戚问题。
+
比较完整的代码是:
+
# include <cstdio>
+using namespace std;
+
+int n, m;
+const int T = 1e4 + 3 ;
+int fa[ T] , rk[ T] ;
+void init ( )
+{
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ fa[ i] = i;
+ }
+}
+int find ( int num)
+{
+ if ( fa[ num] != num) fa[ num] = find ( fa[ num] ) ;
+ return fa[ num] ;
+}
+void merge ( int a, int b)
+{
+ if ( rk[ a] < rk[ b] ) fa[ find ( fa[ a] ) ] = find ( fa[ b] ) ;
+ else
+ {
+ fa[ find ( fa[ b] ) ] = find ( fa[ a] ) ;
+ if ( rk[ a] == rk[ b] ) ++ rk[ a] ;
+ }
+}
+
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+
+ init ( ) ;
+ for ( int i = 1 ; i <= m; i++ )
+ {
+ int z, x, y;
+ scanf ( "%d %d %d" , & z, & x, & y) ;
+ if ( z == 1 ) merge ( x, y) ;
+ else
+ {
+ if ( find ( x) == find ( y) ) printf ( "Y\n" ) ;
+ else printf ( "N\n" ) ;
+ }
+ }
+
+ return 0 ;
+}
+
+
例如:[洛谷 P1151] 亲戚 [洛谷 P3367] 并查集
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/binarytree-fme/index.html b/posts/binarytree-fme/index.html
new file mode 100644
index 00000000..85dbfba2
--- /dev/null
+++ b/posts/binarytree-fme/index.html
@@ -0,0 +1,355 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+二叉树的前序、中序、后序遍历 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 二叉树的前序遍历中序遍历和后序遍历是比较重要的CCF办的比赛要考(雾。可以通过这三个遍历的顺序结果确定整个树的结构。前序遍历是根左右 ,中序遍历是左根右 ,后序遍历是左右根 。(不想多写什么了)
+
实践:前序遍历中序遍历确定树 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
+
先来看前序,由于前序遍历的顺序是根左右,那么 1
一定是整个树的根节点。 随后在中序遍历找到 1
,即可判断这个二叉树的左子树和右子树,就是这样分开来: 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
在继续分下去,得到: 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
+
最终,得到这样一个树:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/chafen/index.html b/posts/chafen/index.html
new file mode 100644
index 00000000..f2e1c5a7
--- /dev/null
+++ b/posts/chafen/index.html
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+差分 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 什么是差分,差分与前缀和的关系 差分也是一种优化算法 。同时,差分是前缀和的逆运算,也就是说,前缀和也是差分的逆运算。因此,由前缀和数组可以求出差分数组,由差分数组也可以求出前缀和数组。
+
假设数组 $a$ 是原数组,数组 $b$ 是差分数组,则:$b_i = a_i - a_{i-1}$
+
+
差分可以用于修改数组的操作。因为假设我需要将 $a_2$ $a_3$ $a_4$ 都加上 $2$ ,此时若使用前缀和则需要再使用递推重新求一遍前缀和,非常耗时。这时便可以使用差分数组。可以发现: $$ \underbrace{b_1,\hspace{2mm} b_2}_{b_2 + 2 = b_1} ,\hspace{2mm} b_3,\hspace{2mm} \overbrace{b_4,\hspace{2mm} b_5}^{b_5 - 2 =b_4} $$ 因此,只需修改差分数组中的两个项,然后再通过前缀和是差分的逆运算,即可求出原数组,从而完成数组的修改。
+
+
+
具体例题(模板题) 差分模板题 题目描述 给出一个数字$n$表示有个数字,
+
给出$n$ $n <= 10^5$个整数$a_1$,$a_2$,…$a_n$;
+
给出一个数字$m$ $m <= 10^5$ 有$m$个修改: 每次询问给出三个整数$s$,$e$,$h$,使得 $a_s,a_{s+1}….a_{e}$每一个数加上h
+
最后给出两个数字 $start$,$end$。求出${ \sum_{i = start}^{end}} a_i $
+
输入格式 第一行一个整数 $n$ 表示有$n$ 个数
+
第二行$n$个整数$a_1$,$a_2$,…$a_n$;
+
第三行一个整数$m$,表示有$m$个修改
+
接下来$m$行每次询问给出三个整数$s$,$e$,$h$,使得 $a_s,a_{s+1}….a_{e}$每一个数加上h
+
最后给出两个数字 $start$,$end$。求出${ \sum_{i = start}^{end}} a_i $
+
输出格式 一个整数
+
样例 #1 样例输入 #1 5
+1 2 3 4 5
+3
+1 2 1
+1 3 1
+4 5 1
+1 5
+
+
样例输出 #1 22
+
+
提示 样例1解释
+
第一次修改序列变成 2 3 3 4 5
+
第二次修改序列变成 3 4 4 4 5
+
第三次修改序列变成 3 4 4 5 6
+
$0 <=$ $a_i$ 和 $h <= 10^4$
+
+
同上,$b_{s-1} + h = b_s, b_{e + 1} - h = b_e$,即可使用前缀和倒退回原数组.
+
# include <cstdio>
+using namespace std ;
+
+long long a[ 100002 ] , b[ 100002 ] , n, m, s, e, h, start, end, sum = 0 ;
+int main ( )
+{
+ scanf ( "%lld" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%lld" , & a[ i] ) ;
+ }
+
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ b[ i] = a[ i] - a[ i - 1 ] ;
+ }
+
+ scanf ( "%lld" , & m) ;
+ for ( int i = 1 ; i <= m; i ++ )
+ {
+ scanf ( "%lld %lld %lld" , & s, & e, & h) ;
+ b[ s] += h ;
+ b[ e + 1 ] -= h ;
+ }
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ a[ i] = a[ i - 1 ] + b[ i] ;
+ }
+
+ scanf ( "%lld %lld" , & start, & end) ;
+ for ( int i = start; i <= end; i ++ )
+ {
+ sum += a[ i] ;
+ }
+ printf ( "%lld\n" , sum) ;
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/chrome-ext/index.html b/posts/chrome-ext/index.html
new file mode 100644
index 00000000..1ed6148b
--- /dev/null
+++ b/posts/chrome-ext/index.html
@@ -0,0 +1,390 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+更改 Edge 新标签页 —— 简单浏览器扩展 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这是记录写简单的一个 Chomium 扩展的一篇文章。 主要是用扩展覆盖默认标签页,随后 HTML 引用 JS 进行(模拟)重定向到 chrome-search://local-ntp/local-ntp.html。
+
开始 浏览器扩展都需要 manifest.json 文件。先新建一个文件夹,在里面添加了这个文件。
+
由于需要覆盖新标签页,需要 chrome_url_overrides.newtab
属性。它可以覆盖新的标签页,指定为扩展(文件夹)内的 HTML 文件(不能使用第三方 URL)。 随后还需要增加必要的值:name
,version
和 manifest_version
。它们分别对应扩展显示的名字,显示的版本和 manifest 的版本,manifest 的版本填 3 就可以了。
+
+
+
最终,manifest.json 是这样的:
+
{
+ "name" : "Change Newtab" ,
+ "description" : "自己(JoyWonderful)弄的一个重定向新标签页的东西啦。" ,
+ "version" : "0.1" ,
+ "manifest_version" : 3 ,
+ "chrome_url_overrides" : {
+ "newtab" : "chntp.html"
+ }
+}
+
+
重定向 随后,开始写 chntp.html 的内容。由于需要(模拟)重定向,还需要再写一个 JavaScript 文件,命名为 chp.js。 由于想重定向到的 chrome-search://local-ntp/local-ntp.html 是本地文件,不可以直接将 window.location.href
直接更改为它,只能使用扩展的 API chrome.tabs.create
新建一个指向它的标签页。随后用 window.close()
关闭自身标签页。
+
chp.js 的代码是这样的:
+
chrome. tabs. create ( { url : "chrome-search://local-ntp/local-ntp.html" } ) ;
+window. opener = null ;
+window. close ( ) ;
+
+
chntp.html 是这样的:
+
< html lang = " en" >
+ < head>
+ < title> Changing page...</ title>
+ < meta charset = " utf-8" >
+ </ head>
+ < body>
+ < script src = " chp.js" > </ script>
+ </ body>
+</ html>
+
+
导入这个扩展到浏览器 Edge 是这样的,Chrome 也基本一样。 进入到浏览器扩展界面 ,打开“开发人员模式”,点击“加载解压缩的扩展”,选择一开始新建的扩展文件夹就可以了。
+
如果没问题,新建标签页会跳到 chrome-search://local-ntp/local-ntp.html。(标签页会闪一下)
+
后面的废话 自己写一个简单扩展的原因是 Edge 默认的新标签页太离谱了些,默认是这样 的(很好奇微软中国怎么也搞什么传奇“开局领礼包”的广告了)。这时打开 DevTools,可以发现 window.location.href
指向 https://ntp.msn.cn/edge/ntp 。即使可以设置把那一大堆花里胡哨的东西关掉,但它还是要加载第三方资源,存奇怪的缓存和其他东西用了 十几 MiB 。 Edge 在断网的时候其实有个干净的标签页 ,实际是 chrome-search://local-ntp/local-ntp.html ,所以就想用这个新标签页。
+
随后,我准备把新标签页换掉。欣喜地发现设置改不了新标签页。研究了半天发现浏览器扩展可以改新标签页,随后又进行很多奇奇怪怪的试错才成功运行的。
+
因为想搞贡献点,把它传到了个人仓库 里。那个扩展名为 crx 的是打包后的扩展,可以删。
+
原本这篇文章想上周发的,但因颓废,搁了。。。
+
+
+
图片们:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/code-format/index.html b/posts/code-format/index.html
new file mode 100644
index 00000000..0cde86b6
--- /dev/null
+++ b/posts/code-format/index.html
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+个人意见:如何写出漂亮的代码 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 创作说明:
+
此文章仅为个人看法。您写代码的习惯可以依据您的个人喜好。此文章只是一些个人的建议。
+
您在 OI 竞赛中,您完全可以 不去注意代码风格。
+
此文章的建议主要用于工程代码中。
+
+
代码的维护还是很重要的。相信谁也不愿意去维护连自己都看得头晕的代码。在这里,我想给出一些个人建议,让代码的可读性强一些。大部分代码以 C++ 为例。这篇文章其实也是给自己看的。
+
+
+
空行与空格 无论是什么代码,空行往往代表着一个功能块,或是一个逻辑的结束,在适当的地方空行可以增强代码的可读性。空格也是这样。虽然一些地方的空格和空行会被编译器(或解释器)忽略,但是空行和空格必不可少。就比如说这样一个示例:
+
# include <iostream>
+# include <string>
+using namespace std;
+int main ( ) {
+ string s, a, b, c; cin>> s; cin>> a;
+ cin>> b; cin>> c;
+ cout<< "Hello," << s<< endl; cout<< "Hello," << a<< endl;
+ cout<< "Hello," << b<< endl; cout<< "Hello," << c<< endl;
+ return 0 ;
+}
+
这段代码是可以编译的,但是逻辑很混乱。流输入输出符之间没有空格,也没有空行。这样导致可读性很差。
+
一些建议:
+
+关于空格
+在运算符之间尽量加上空格。
+逗号之后加上空格。例如 int a, b, c;
。
+括号两边不必要加空格。例如应该这样 if(n == 1)
而不是这样 if ( n == 1 )
。
+特殊的建议,C++ 逻辑运算符如 &&
||
最好这样写: if(i==1 || j!=2 && k>3)
。
+
+
+关于空行
+C++ 中(以及其他语言)确实可以使用语句分隔符 ;
在一行完成几个操作。但完全不相关的操作最好不要放一行,也不要把一行代码弄得很长很长。
+不要完全没有空行,空行往往可以增加代码的可读性。在不同的功能代码或逻辑之间空行,不要将相关联的代码空开来。
+
+
+
+
缩进 很多代码都最好写缩进,哪怕有大括号也不例外。在 C++ 中,虽然不写它也没有关系,但这是一种编码习惯,也可以增强代码的可读性。在 Python 中,缩进更为重要,不写那就报错了。
+
这里有一些错误示例:
+
# include <stdio.h>
+
+int main ( ) {
+int a, b;
+scanf ( "%d %d" , & a, & b) ;
+for ( int i = 1 ; i <= 10 ; i++ ) {
+printf ( "%d\n" , a + b) ;
+}
+return 0 ;
+}
+
+
i = int ( input ( ) )
+for i in range ( i) :
+ print ( i)
+ print ( "hello" )
+
+
C++ 的示例虽然不会报错,但是很不美观,看不出层次。Python 的缩进一个使用了 Tab
,另一个使用了两个空格,导致 SyntaxError: unindent does not match any outer indentation level
。
+
一些建议:
+
+缩进最好使用空格,不要使用 Tab 字符。
+遵循使用语言的缩进规则,不要弄出奇怪的缩进。例如 1 个空格。
+不要混用空格个数或 Tab。例如同样的层次,一个用 2 个空格,一个用 4 个空格。有些语言(例如 Python)会直接报错。
+
+
命名方法 一段代码中应该尽量使用恰当的命名方法。不可以随意命名,命名应该表达元素的含义和作用避免使用冗余无意义的词汇。
+
以下是常用的命名方法:
+
+驼峰命名法 使用大小写混合的格式,单词间不适用空格或连接符。一般来说,类名的开头字母大写,例如 GetConsoleInfo
, PrintSystemVersion
;方法名、参数名、变量名开头字母小写,例如 redGem
, heroLife
。
+匈牙利命名法 使用变量类型的缩写作为前缀,其余部分使用驼峰命名法。例如 char cMyAnswer
, int iPersonAge
, double dManWeight
。
+下划线命名法 使用下划线连接单词,大小写统一。例如 clear_all
, set_color
, MAX_WIDTH
。
+
+
建议:一般来说,常量、宏定义等全部使用大写,其他使用小写。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/cpp-file/index.html b/posts/cpp-file/index.html
new file mode 100644
index 00000000..ba400de4
--- /dev/null
+++ b/posts/cpp-file/index.html
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+C++ 文件操作 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我曾经用 Python 的 tkinter 库写过一个文本编辑器 ,一百多行,当时幼稚的我以为自己很了不起,因为当时的我认为读写文件是一件很复杂的事情。后来看看,这个东西做得很蹩脚,一个简单的 with open()
就完成了读写文件的操作,可见文件的读写是个很平常的事情。当年的喜悦大概是学到读写文件的喜悦吧。 C++ 读写文件,也算是比较平常的。当数据点大的时候输出到文件里更方便。就在这里小记一下读写文件的操作。
+
+
+
+
fstream
有两个类,分别是 ofstream
和 ifstream
。ofstream
是写文件的,ifstream
是读文件的。这是一个打开文件的语法:
+
file. open ( "./text.txt" , ios:: in | ios:: out) ;
+
+[ file object] . open ( [ file path] , [ open mode] ) ;
+inline void std:: ofstream:: open ( const char * __s, std:: ios_base:: openmode __mode) ;
+inline void std:: ifstream:: open ( const char * __s, std:: ios_base:: openmode __mode) ;
+
+open ( const char * __s, ios_base:: openmode __mode = ios_base:: in) ;
+open ( const char * __s, ios_base:: openmode __mode = ios_base:: out | ios_base:: trunc) ;
+
其中,|
可以将多个打开模式加在一起。打开模式有:
+
+常用的
+ios::in
打开文件读取,用于 ifstream
。
+ios::out
打开文件写入,用于 ofstream
。
+
+
+不常用的
+ios::app
将写入的内容追加在末尾。用于 ofstream
。
+ios::ate
打开定位到末尾。用于 ofstream
。
+ios::trunc
若文件存在,则覆盖文件,不保留原始内容。在 ofstream
中,默认是 ios::trunc
。
+
+
+
+
当写入或读取文件时,和 cin``cout
差不多。例如:
+
# include <iostream>
+# include <fstream>
+using namespace std;
+
+ofstream outfile;
+int main ( )
+{
+ outfile. open ( "./text.txt" , ios:: out) ;
+ outfile << "text" << endl;
+ char c = 'P' ;
+ outfile << c << endl;
+ outfile. close ( )
+ return 0 ;
+}
+
这段代码会向当前目录下 text.txt
写入 "text\n"
和 "P\n"
。 程序结束,最好关闭文件 ,使用 [file object].close()
,虽然不关闭文件也没关系。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/cpp-shujufanwei/index.html b/posts/cpp-shujufanwei/index.html
new file mode 100644
index 00000000..a1163e25
--- /dev/null
+++ b/posts/cpp-shujufanwei/index.html
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+C++ 数据范围 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这就是一个随记,方便自己用的。
+
+
+
+
+
+名称(可加)
+所占字节
+数据范围(以 $2^n$ 表示)
+
+
+
+(signed) int
+4
+-2147483648
~ 2147482647
($-2^{31}$ ~ $2^{31}-1$)
+
+
+unsigned int
+4
+0
~ 4294967295
($0$ ~ $2^{32}-1$)
+
+
+(signed) long (int)
+4
+-2147483648
~ 2147483647
($-2^{31}$ ~ $2^{31}-1$)
+
+
+unsigned long (int)
+4
+0
~ 4294967295
($0$ ~ $2^{32}-1$)
+
+
+long long
+8
+-9223372036854775808
~ 9223372036854775807
($-2^{63}$ ~ $2^{63}-1$)
+
+
+unsigned long long
+8
+0
~ 18446744073709551615
($0$ ~ $2^{64}-1$)
+
+
+(signed) short (int)
+2
+-32768
~ 32767
($-2^{15}$ ~ $2^{15}-1$)
+
+
+unsigned short (int)
+2
+0
~ 65535
($0$ ~ $2^{16}-1$)
+
+
+float
+4
+3.4E +/- 38
+
+
+double
+8
+1.7E +/- 308
+
+
+long double
+8
+1.7E +/- 308
+
+
+bool
+1
+true
or false
or 1
or 0
+
+
+char
+1
+-128
~ 127
($-2^{7}$ ~ $2^{7}-1$)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/dfs/index.html b/posts/dfs/index.html
new file mode 100644
index 00000000..a99ef26b
--- /dev/null
+++ b/posts/dfs/index.html
@@ -0,0 +1,479 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+深度优先搜索 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 前置知识:图论 引用广为人知的一句话:
+
+图论 (Graph Theory) 是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
+
+
像深度优先搜索,其实也要用到“图”这个概念。其实,“图”体现了搜索(递归)的过程,计算机中的“图”有很多使用的场景。
+
概述 深度优先搜索 (深搜),英文名 Depth First Search ,简称 DFS 。即从初始节点出发,按一定顺序不断地向下一节点扩展,达到条件则返回上一个节点,以此类推。这正是一个递归 的过程。叫深搜是因为它递归的过程若形象来看是不断“加深”的,这样一搜到底也是递归的特性。 深搜有一个很重要的一点:不能重复访问已经访问过的元素。深搜通常有很多路径(线)可以选择,若重复访问可能会造成死循环,因此需要定义一个数组存访问情况。(当然这个数组在很多其他的地方也可以运用到,也就是回溯,详见下面的例题)
+
深搜例题 例如:洛谷 B3625 这是一个很典型的迷宫问题,迷宫为 $n \times m$。#
为墙,.
为空地。起点为左上角,终点在右下角 首先,就是路径搜索的问题,要搜索上、下、左、右的的路径,同时,还有几点条件不能搜:
+
+目标位置不能为 #
。(即为墙)
+不能跃出边界,即 $0 \le x < n$,$0 \le y < m$(以 $0$ 为起点)
+不能重复搜索
+
+
选择路径之后就扩展,将位置标记为已搜索。若终点被标记为搜索过,则输出 Yes
,否则输出 No
。 代码区:
+
# include <iostream>
+# include <string>
+using namespace std;
+
+int n, m;
+string a[ 103 ] ;
+bool flag[ 103 ] [ 103 ] ;
+
+void dg ( int x, int y)
+{
+ if ( x - 1 >= 0 && a[ x - 1 ] [ y] != '#' && flag[ x - 1 ] [ y] == 0 )
+ {
+ flag[ x - 1 ] [ y] = 1 ;
+ dg ( x - 1 , y) ;
+ }
+ if ( x + 1 <= n - 1 && a[ x + 1 ] [ y] != '#' && flag[ x + 1 ] [ y] == 0 )
+ {
+ flag[ x + 1 ] [ y] = 1 ;
+ dg ( x + 1 , y) ;
+ }
+ if ( y - 1 >= 0 && a[ x] [ y - 1 ] != '#' && flag[ x] [ y - 1 ] == 0 )
+ {
+ flag[ x] [ y - 1 ] = 1 ;
+ dg ( x, y - 1 ) ;
+ }
+ if ( y + 1 <= m - 1 && a[ x] [ y + 1 ] != '#' && flag[ x] [ y + 1 ] == 0 )
+ {
+ flag[ x] [ y + 1 ] = 1 ;
+ dg ( x, y + 1 ) ;
+ }
+}
+
+int main ( )
+{
+ ios:: sync_with_stdio ( false ) ;
+
+ cin >> n >> m;
+ for ( int i = 0 ; i < n; i++ )
+ {
+ cin >> a[ i] ;
+ }
+
+ dg ( 0 , 0 ) ;
+ if ( flag[ n - 1 ] [ m - 1 ] == 1 ) cout << "Yes" ;
+ else cout << "No" ;
+
+ return 0 ;
+}
+
+
回溯 对于一些情况,我们需要回到上一次的结果。例如寻找路径数,若用纯 DFS,那路径肯定搜不全。因为深搜是不能重复搜索的,而寻找路径数可能需要走一些重复的路。此时,就可以用到回溯。即找完一条路径,再把它还原。
+
题目举例:洛谷 P1605 跟刚才的题目有一点像,只是字符变数字,而要输出方案数。跟刚才差不多:不能越界、不能走到障碍物、方格最多经过一次。 当坐标等于终点的坐标时,答案加上一,将标记还原(回溯),return
回去。需要注意的是:起点一定要打上标记。 代码:
+
# include <cstdio>
+using namespace std;
+
+int n, m, t;
+int sx, sy, fx, fy;
+int sum = 0 ;
+bool a[ 10 ] [ 10 ] ;
+bool flag[ 10 ] [ 10 ] ;
+
+void dg ( int x, int y)
+{
+ if ( x == fx && y == fy)
+ {
+ sum++ ;
+ return ;
+ }
+ if ( x - 1 >= 1 && a[ x - 1 ] [ y] != 1 && flag[ x - 1 ] [ y] == 0 )
+ {
+ flag[ x - 1 ] [ y] = 1 ;
+ dg ( x - 1 , y) ;
+ flag[ x - 1 ] [ y] = 0 ;
+ }
+ if ( x + 1 <= n && a[ x + 1 ] [ y] != 1 && flag[ x + 1 ] [ y] == 0 )
+ {
+ flag[ x + 1 ] [ y] = 1 ;
+ dg ( x + 1 , y) ;
+ flag[ x + 1 ] [ y] = 0 ;
+ }
+ if ( y - 1 >= 1 && a[ x] [ y - 1 ] != 1 && flag[ x] [ y - 1 ] == 0 )
+ {
+ flag[ x] [ y - 1 ] = 1 ;
+ dg ( x, y - 1 ) ;
+ flag[ x] [ y - 1 ] = 0 ;
+ }
+ if ( y + 1 <= m && a[ x] [ y + 1 ] != 1 && flag[ x] [ y + 1 ] == 0 )
+ {
+ flag[ x] [ y + 1 ] = 1 ;
+ dg ( x, y + 1 ) ;
+ flag[ x] [ y + 1 ] = 0 ;
+ }
+}
+
+int main ( )
+{
+ scanf ( "%d %d %d" , & n, & m, & t) ;
+ scanf ( "%d %d %d %d" , & sx, & sy, & fx, & fy) ;
+ for ( int i = 1 ; i <= t; i++ )
+ {
+ int zx, zy;
+ scanf ( "%d %d" , & zx, & zy) ;
+ a[ zx] [ zy] = 1 ;
+ }
+
+ flag[ sx] [ sy] = 1 ;
+ dg ( sx, sy) ;
+ printf ( "%d\n" , sum) ;
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/dp-zobb/index.html b/posts/dp-zobb/index.html
new file mode 100644
index 00000000..d0ef08c1
--- /dev/null
+++ b/posts/dp-zobb/index.html
@@ -0,0 +1,467 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+动态规划:01 背包 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 背包问题是动态规划中很典型的一个问题。一个背包有特定的重量,去装重量为 w 价值为 d 的物品,在不超过背包重量上限的前提下使物品的价值和最高。 这个问题一看,就不是贪心可以做的来的。所以,就可以用上我们的爆搜!!(暴力出奇迹)动态规划来解决背包问题。
+
+
+
从爆搜到记搜的引入 自然,动规能解决的问题爆搜也一定能解决,无非慢了点儿而已。例如 [洛谷 P2871],只需:
+
int w[ 3410 ] , d[ 3410 ] ;
+int maxn = 0 ;
+
+void dg ( int x, int tw, int td)
+{
+ if ( tw > m)
+ {
+ return ;
+ }
+ if ( x > n)
+ {
+ maxn = max ( maxn, td) ;
+ return ;
+ }
+
+ dg ( x + 1 , tw + w[ x] , td + d[ x] ) ;
+ dg ( x + 1 , tw, td) ;
+}
+
+
这样一个简单的爆搜就可以拿到 37 分。
+
进一步优化呢?可以考虑记忆化搜索。用 dp[i][j] 数组记录重量为 i 价值为 j 时的情况。由于需要记忆化,可以通过返回参数的形式。代码如下:
+
int dp[ 3410 ] [ 12883 ] ;
+
+int dg ( int x, int tw)
+{
+ if ( x > n)
+ {
+ return 0 ;
+ }
+ if ( dp[ x] [ tw] ) return dp[ x] [ tw] ;
+
+ int t = 0 ;
+ if ( tw + w[ x] <= m)
+ {
+ t = dg ( x + 1 , tw + w[ x] ) + d[ x] ;
+ }
+ dp[ x] [ tw] = max ( t, dg ( x + 1 , tw) ) ;
+ return dp[ x] [ tw] ;
+}
+
+
这样一个程序可以拿到 82 分,9 10 两点超时,若开启 O2 优化变成超出内存限制。显然,这么大的数据数组的大小肯定炸掉。
+
使用动态规划 其实,通过上面的我们已经可以推出式子:dp[i][j] = max(dp[i + 1][j + w[i]], dp[i + 1][j]);
,实现就很简单了:
+
# include <cstdio>
+# include <algorithm>
+using namespace std;
+
+int n, m;
+int w[ 3410 ] , d[ 3410 ] ;
+int dp[ 3410 ] [ 12883 ] ;
+
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ scanf ( "%d %d" , & w[ i] , & d[ i] ) ;
+ }
+
+ for ( int i = n; i >= 1 ; i-- )
+ {
+ for ( int j = 0 ; j <= m; j++ )
+ {
+ int t = 0 ;
+ if ( j + w[ i] <= m)
+ {
+ t = dp[ i + 1 ] [ j + w[ i] ] + d[ i] ;
+ }
+ dp[ i] [ j] = max ( t, dp[ i + 1 ] [ j] ) ;
+ }
+ }
+
+ printf ( "%d\n" , dp[ 1 ] [ 0 ] ) ;
+
+ return 0 ;
+}
+
+
这次,不开 O2 也不会超时,但是内存仍然爆炸。
+
滚动数组 可以发现,状态转移方程用过前面的数据之后,前面的数据就废弃了,因此,可以使用滚动数组。
+
# include <cstdio>
+# include <algorithm>
+using namespace std;
+
+int n, m;
+int w[ 3410 ] , d[ 3410 ] ;
+int dp[ 2 ] [ 12883 ] ;
+
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ scanf ( "%d %d" , & w[ i] , & d[ i] ) ;
+ }
+
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ for ( int j = 0 ; j <= m; j++ )
+ {
+ int t = 0 ;
+ if ( j - w[ i] >= 0 )
+ {
+ t = dp[ 1 - i % 2 ] [ j - w[ i] ] + d[ i] ;
+ }
+ dp[ i % 2 ] [ j] = max ( t, dp[ 1 - i % 2 ] [ j] ) ;
+ }
+ }
+
+ printf ( "%d\n" , dp[ n % 2 ] [ m] ) ;
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/drawpic/index.html b/posts/drawpic/index.html
new file mode 100644
index 00000000..83ad4b34
--- /dev/null
+++ b/posts/drawpic/index.html
@@ -0,0 +1,357 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+自己画的一些画 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
放假了闲着没事情干,便画了一些画,放在这儿,留此纪念。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/erase-css/index.html b/posts/erase-css/index.html
new file mode 100644
index 00000000..e73fe4e6
--- /dev/null
+++ b/posts/erase-css/index.html
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+消失效果 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 从 ncase.me 学来的,可以自己看源码。主要是通过背景图片 的位置实现。结合了 CSS 和 JS。 可以自己增加一个函数在隐藏时执行。 你只要这样就可以:
+
< p>
+ 美好的文字
+ Have a good day!
+ < div class = " scratcher" > </ div>
+</ p>
+
+
代码和示例请看下面。
+
+
+
代码和使用方法 模拟的笔涂白是通过 CSS 背景图片的位置完成的。代码如下:
+
.scratcher {
+ position : absolute;
+ top : 0;
+ left : 0;
+ width : 100%;
+ height : 100%;
+ background : url ( https://s2.loli.net/2023/12/16/NOVHCgALzK4Fd1Q.png) ;
+ background-size : 200% 2000%;
+ display : none;
+ z-index : 200;
+}
+
+
其中,width
height
设为 100% 是为了铺满元素(整个使用时用到),z-index
进行覆盖。 使用时请添加 <div class="scratcher"></div>
在准备显示隐藏的元素内 ,使其成为准备隐藏的元素的子元素 ,方便更改容器的位置。下面的 JS 会更改它的位置和大小。
+
var divList = document. querySelectorAll ( ".scratcher" ) ;
+for ( let i = 0 ; i < divList. length; i++ ) {
+ divList[ i] . style. display = "none" ;
+ divList[ i] . style. backgroundPosition = "-100% -1900%" ;
+ var lpnt = divList[ i] . parentNode;
+ if ( window. getComputedStyle ( lpnt) . position == "relative" ) {
+ divList[ i] . style. bottom = "0" ;
+ divList[ i] . style. right = "0" ;
+ }
+ else {
+ divList[ i] . style. top = String ( lpnt. offsetTop) + "px" ;
+ divList[ i] . style. left = String ( lpnt. offsetLeft) + "px" ;
+ }
+ divList[ i] . style. width = String ( lpnt. offsetWidth) + "px" ;
+ divList[ i] . style. height = String ( lpnt. offsetHeight) + "px" ;
+}
+
+
为了应对相对定位这种特殊情况,代码中也进行了判断。其他情况则是设置相同大小和位置(left
,top
),覆盖其父元素。 进行擦除和显示时,也采用 JS,自己可以在下面的代码中添加隐藏后执行的函数。
+
var divList = document. querySelectorAll ( ".scratcher" ) ;
+function eraseAndShow ( num ) {
+ divList[ num] . style. display = "block" ;
+ for ( let i = 1 ; i <= 19 ; i++ ) {
+ setTimeout ( ( ) => {
+ divList[ num] . style. backgroundPosition = ` 0% ${ i * - 100 } % ` ;
+ } , i * 100 ) ;
+ }
+
+
+
+
+ for ( let i = 1 ; i <= 19 ; i++ ) {
+ setTimeout ( ( ) => {
+ divList[ num] . style. backgroundPosition = ` -100% ${ i * - 100 } % ` ;
+ } , i * 100 + 2100 ) ;
+ }
+ setTimeout ( ( ) => { divList[ num] . style. display = "none" ; } , 4000 ) ;
+}
+
+
在添加以上所有代码后,就可以在任意一个元素内添加 <div class="scratcher"></div>
,再在执行 JavaScript 代码 eraseAndShow(0)
,试验性地查看效果。
+
示例 下面是一些示例,点击按钮“隐藏和显示”可以看到效果
+
+
+
以下文字在点击按钮后会被更改:
+
+
心情,是一种感情状态,拥有了好心情,也就拥有了自信,继而拥有了年轻和健康。就拥有了对未来生活的向往,充满期待,让我们拥有一份好心情吧,因为生活着就是幸运和快乐。
+
当你孤独时,风儿就是我的歌声,愿它能使你得到片刻的安慰;当你骄傲时,雨点就是我的警钟,愿它能使你获得永恒的谦逊。
+
友情如水,淡而长远;友情如茶,香而清纯;友情如酒,烈而沁心;友情如雨,细而连绵;友情如雪,松而亮洁。人生短暂,珍惜友情。
+
+
隐藏和显示
+
+
+
+
由于是通过背景图片的位置模拟擦除效果,所以当点击按钮后在消失前按钮无法被点击。这个特性很好地使用在切换容器内容上。
+
以下是一个简单的示例:
+
danger #d9534f
+
test
test
test
+
test
test
test
+
test
test
test
+
隐藏和显示
+
+
+
+
+
+
+
希望对自己,对别人都有帮助!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/erfen/index.html b/posts/erfen/index.html
new file mode 100644
index 00000000..853b2364
--- /dev/null
+++ b/posts/erfen/index.html
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+二分 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 二分的意义 优化 。顾名思义,将一整个有序的 数列分成两个部分,不断缩小边界,查找某个数字。 二分的时间复杂度为 $O(log\ 2\ n)$ 。
+
此时,我们学的还是整数二分以及浮点二分。
+
整数二分的两个模板 二分的前提是这个序列是有序的 ,也就是单调递增的。 一般来说,二分会取中间值进行初始化,再判断这个中间值是否大于目标值。若是,则缩减左边界,否则缩减右边界。直至逼近答案。 说“逼近”,是因为有时查找的元素不存在于序列中,那所二分出的答案是接近于的,但又是不正确的。所以要加上一个特判。除非说明给出的想查询的元素所有都是存在于序列中的。
+
+
+
二分听起来还简单,但是实现起来可能对我来说还要多方面考虑。例如,当这样一段二分代码(假设数组 $a$ 的下标从 $1$ 开始):
+
for ( int i = 1 ; i <= m; i ++ )
+{
+ int x ;
+ scanf ( "%d" , & x) ;
+ int l = 1 , r = m ;
+ while ( l < r)
+ {
+ int mid = ( l + r) / 2 ;
+ if ( x > a[ mid] ) l = mid ;
+ else r = mid ;
+ }
+}
+
此时, $l$ 或 $r$ 其实已经是正确答案了,但是它会陷入死循环。例如 $a$ 为 $1 \ 2 \ 3 \ 4 \ 5$, $x$ 为 $4$ 时,是这样的:
+
$$ {\color{green}1 \ 2 \ 3 \ 4 \ 5} \ $$ $$ (\texttt{mid}=(1+5)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=5) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ 5} \ $$ $$ (\texttt{mid}=(4+5)/2=4, a[\texttt{mid}]=4, 4=4, l=3, r=\texttt{mid}=4) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ }{\color{red}5} \ $$ $$ (\texttt{mid}=(3+4)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=4) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ }{\color{red}5} \ $$ $$ (\texttt{mid}=(3+4)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=4) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ }{\color{red}5} \ $$ $$ (\texttt{mid}=(3+4)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=4) \ $$ $$ \textup{…Forever…} $$
+
因此,我们为什么不把 $l$ 的赋值加上一个呢?这样就不会无限循环下去了。就像这样:
+
for ( int i = 1 ; i <= m; i ++ )
+{
+ int x ;
+ scanf ( "%d" , & x) ;
+ int l = 1 , r = m ;
+ while ( l < r)
+ {
+ int mid = ( l + r) / 2 ;
+ if ( x > a[ mid] ) l = mid + 1 ;
+ else r = mid ;
+ }
+}
+
这就是整数二分的一个模板了。又或者:
+
int x ;
+scanf ( "%d" , & x) ;
+int l = 1 , r = n ;
+while ( l < r)
+{
+ int mid = ( l + r + 1 ) / 2 ;
+ if ( x > a[ mid] ) l = mid ;
+ else r = mid - 1 ;
+}
+
+
浮点数二分 其实,任何一个算法都是相通的。二分也是一样。浮点二分可能比整数二分简单一些。(出自于我们老师之口)
+
但,最重要的就是精度问题 。 它决定了 ${\texttt{TLE}}$ 和 $\texttt{WA}$ 以及 $\texttt{AC}$ 之间的差距。详见 洛谷P3743 以及 我可怜的评测记录 。这就是残酷的现实!代码是简单了很多,但是要确定精度 !!!
+
好了,模版代码大放送:
+
double l = - 1e10 , r = 1e10 ;
+while ( r - l > 1e-6 )
+{
+ double mid = ( l + r) / 2 ;
+ if ( )
+ {
+ l = mid ;
+ }
+ else
+ {
+ r = mid ;
+ }
+}
+
+
二分答案 当我们想要枚举时,二分自然就是枚举的首选前提。一般来说,二分答案会写一个函数,传统名称为 check
。 其实它还是二分,只不过判断的条件由单一的 valuname > name[mid]
变成了一个判断函数而已。我是不是没讲清楚啊 $\texttt{\color{white}但也没什么好讲的了}$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/function/index.html b/posts/function/index.html
new file mode 100644
index 00000000..f439e384
--- /dev/null
+++ b/posts/function/index.html
@@ -0,0 +1,497 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+函数 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 函数的作用 一般来说,我都是懂的。函数的总用比较简单:
+
+优化代码量
+让程序代码更加清晰明了
+调用时更加方便
+
+
总之,函数的存在就是为了更加方便 ,清晰 ,快速 。
+
+
+
定义函数 方法:
+
[ 函数类型] [ 函数名称] ( [ 参数] )
+{
+ [ 主体] ;
+ return [ ] ;
+}
+
+
如:
+
int add ( int x, int y)
+{
+ int ans = x + y ;
+ return ans ;
+}
+
+
+
注意 :当不返回(无return
)时,函数类型应为void
(表面含义无类型 )。
+
形参和实参 当你运行这段代码 时:
+
# include <stdio.h>
+using namespace std ;
+
+int swap ( int x, int y)
+{
+ int t = x ;
+ x = y ;
+ y = t ;
+}
+
+int main ( )
+{
+ int a, b ;
+ scanf ( "%d %d" , & a, & b) ;
+
+ swap ( a, b) ;
+ printf ( "%d %d\n" , a, b) ;
+}
+
+
你会发现a
还是a
,b
还是b
。
+
这是因为swap(int, int)
只是把函数内的 x
和y
交换了而已,a
和b
没有交换。
+
因为x
和y
对于*main
函数*来说只是形参,x
和y
只是拷了一份a
和b
。
+
如果想交换a
和b
需要这样写:
+
# include <stdio.h>
+using namespace std ;
+
+int swap ( int & x, int & y)
+{
+ int t = x ;
+ x = y ;
+ y = t ;
+}
+
+int main ( )
+{
+ int a, b ;
+ scanf ( "%d %d" , & a, & b) ;
+
+ swap ( a, b) ;
+ printf ( "%d %d\n" , a, b) ;
+}
+
+
此时此刻,你使用x
和y
就相当于引用了a
和b
。
+
函数重载 函数名不可重复。
+
但是有几种方法可以重复:
+
+
比如:
+
# include <stdio.h>
+using namespace std ;
+
+int add ( int a, int b)
+{
+ return a + b ;
+}
+void add ( )
+{
+ printf ( "Hello\n" ) ;
+}
+
+int main ( )
+{
+ int n = add ( 1 , 2 ) ;
+ printf ( "%d\n" , n) ;
+ add ( ) ;
+
+ return 0 ;
+}
+
+
输出:
+
3
+Hello
+
+
+
注意: 仅仅函数类型不同不足以区分两个函数!
+
拓展:主函数中的argc
和argv
实际上我不懂 用法:
+
int main ( int argc, char * argv[ ] )
+
+
或:
+
int main ( int argc, char * * argv)
+
+
+
含义:
+
+argc
:是argument count 的缩写,保存运行时传递给main函数的参数个数。
+argv
:是argument vector 的缩写,保存运行时传递main函数的参数,类型是一个字符指针数组,每个元素是一个字符指针,指向一个命令行参数。
+
+
比如:
+
# include <stdio.h>
+using namespace std ;
+
+int main ( int argc, char * argv[ ] )
+{
+ printf ( "sum: %d\n" , argc) ;
+ for ( int i = 0 ; i < argc; i ++ )
+ {
+ printf ( "argc[%d], %s\n" , i, argv[ i] ) ;
+ }
+
+ return 0 ;
+}
+
+
打开命令行,cd
文件所在文件夹,输入:[file name].[file extension] hello world i am so happy
+
结果为:
+
sum: 7
+argc[ 0 ] , 未命名1.exe
+argc[ 1 ] , hello
+argc[ 2 ] , world
+argc[ 3 ] , i
+argc[ 4 ] , am
+argc[ 5 ] , so
+argc[ 6 ] , happy
+
+
这就是main
函数参数作用。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/gdb-debug-file/index.html b/posts/gdb-debug-file/index.html
new file mode 100644
index 00000000..b558649a
--- /dev/null
+++ b/posts/gdb-debug-file/index.html
@@ -0,0 +1,524 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+使用 gdb 调试代码 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这几天刚去学习了一下用 gdb 调试代码,在这儿记下来。
+
首先,编译代码的时候需要加上 -g
选项,说明要加上调试信息,这样才可以正常调试。例如:
+
$ g++ -g oi.cpp -o oi.exe
+
+
随后,即可使用 gdb 打开文件进行调试。直接使用 gdb [file name]
即可。
+
$ gdb oi
+GNU gdb ( GDB) 7.8 .1
+Copyright ( C) 2014 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html>
+
+For help, type "help" .
+Type "apropos word" to search for commands related to "word" .. .
+Reading symbols from oi.. .done.
+( gdb)
+
+
+
+
gdb 一些常用调试命令(命令缩写)的详细解释:
+
代码、路径 list 命令缩写是 l
。 可以查看代码,后面跟上数字说明要查看第几行附近的代码 ,或者跟上函数名说明要查看这个函数附近的代码 。若没有参数则继续从上一次最后显示的那一行显示下去。
+
例如:
+
( gdb) l 17
+12 for( int i = 0 ; s[ i] != '\0' ; i++)
+13 {
+14 char l, r;
+15 if (( s[i] >= 'a' && s[i] <= 'z') || ( s[i] >= '0 ' && s[i] <= '9 '))
+16 {
+17 l = s[ i] ;
+18 ans[ cnt++] = s[ i] ;
+19 }
+20 if( s[ i] == '-' )
+21 {
+( gdb) list main
+3
+4 int p1, p2, p3, cnt;
+5 char s[ 200 ] ;
+6 char ans[ 7000 ] ;
+7 int main( )
+8 {
+9 scanf( "%d %d %d\n " , & p1, & p2, & p3) ;
+10 scanf( "%s" , & s) ;
+11
+12 for( int i = 0 ; s[ i] != '\0' ; i++)
+( gdb) l
+13 {
+14 char l, r;
+15 if (( s[i] >= 'a' && s[i] <= 'z') || ( s[i] >= '0 ' && s[i] <= '9 '))
+16 {
+17 l = s[ i] ;
+18 ans[ cnt++] = s[ i] ;
+19 }
+20 if( s[ i] == '-' )
+21 {
+22 r = s[ i + 1 ] ;
+
+
info source 可以简写为 i source
获取代码信息,可以查看 gdb 获取的代码路径是否正确。
+
例如:
+
( gdb) info source
+Current source file is oi.cpp
+Compilation directory is D:\ MyCode
+Located in D:\ MyCode\ oi.cpp
+Contains 65 lines.
+Source language is c++.
+Compiled with DWARF 2 debugging format.
+Does not include preprocessor macro info.
+
+
file 参数是文件路径,可以重新打开一个文件调试。 例如:
+
( gdb) file D:\ \ MyCode\ \ oi
+Reading symbols from D:\ MyCode\ oi.. .done.
+
+
cd 同任何命令行的 cd 命令一样,切换工作文件夹。
+
程序运行时 run
命令。 命令缩写是 r
。运行程序 ,直至遇到断点或程序结束。
+
print
命令。 命令缩写是 p
。 在程序运行 时输出变量(数组)的值。
+
break
命令。 命令缩写是 b
,参数是行号或函数名。 表示在函数或第几行设置断点。 例如:
+
( gdb) break main
+Breakpoint 1 at 0x40153d: file oi.cpp, line 9 .
+( gdb) b 43
+Breakpoint 2 at 0x401722: file oi.cpp, line 43 .
+
+
continue
命令。 命令缩写是 c
。 遇到断点后使用,继续执行 ,运行到下一个断点或程序结束。
+
delete
命令。 命令缩写是 d
。 删除断点,参数是断点编号 。就是 Breakpoint 1 at []: file [], line [].
Breakpoint 后面的数字。
+
next
命令。 命令缩写是 n
。 执行当前行语句,如果当前行有函数调用,则将其视为一个整体执行。
+
熟知以上这些,就可以简单地调试代码了。 一个实例:
+
( gdb) break 25
+Breakpoint 1 at 0x4016b1: file oi.cpp, line 25 .
+( gdb) break 32
+Breakpoint 2 at 0x4016ea: file oi.cpp, line 32 .
+( gdb) break 35
+Breakpoint 3 at 0x4016fe: file oi.cpp, line 35 .
+( gdb) run
+Starting program: D:\ MyCode\ oi.exe
+[ New Thread 37568 .0x97c8]
+[ New Thread 37568 .0x25fc]
+2 3 2
+a-d-d
+
+Breakpoint 2 , main ( ) at oi.cpp:33
+33 l = l - 'a' + 'A' ;
+( gdb) print p1
+$2 = 2
+( gdb) print p2
+$3 = 3
+( gdb) p p3
+$4 = 2
+( gdb) c
+Continuing.
+
+Breakpoint 3 , main ( ) at oi.cpp:37
+37 if( p3 == 1 )
+( gdb) print l
+$5 = 65 'A'
+( gdb) print r
+$6 = 68 'D'
+( gdb) continue
+Continuing.
+
+Breakpoint 1 , main ( ) at oi.cpp:25
+25 ans[ cnt++] = '-' ;
+( gdb) print ans[ cnt - 1 ]
+$7 = 100 'd'
+( gdb) print ans
+$8 = "aCCCBBBd" , '\000' < repeats 6991 times>
+( gdb) continue
+Continuing.
+aCCCBBBd-d
+[ Thread 37568 .0x25fc exited with code 0 ]
+[ Inferior 1 ( process 37568 ) exited normally]
+
+
获取信息 获取信息通常使用 info
命令。就介绍常用的那些。
+
info breakpoint
可以简写为 i b
,查看断点信息。
+
info registers
可以简写为 i reg
,查看寄存器信息。
+
info stack
可以简写为 i s
,查看堆栈使用,在递归的时候很有效。
+
实例:
+
( gdb) info breakpoint
+Num Type Disp Enb Address What
+1 breakpoint keep y 0x000000000040153b in dfs( int) at oi.cpp:10
+ breakpoint already hit 5 times
+2 hw watchpoint keep y x
+( gdb) info reg
+rax 0x4 4
+rbx 0x1 1
+rcx 0x4 4
+rdx 0x3 3
+rsi 0x11 17
+rdi 0xc41440 12850240
+rbp 0x6cfcf0 0x6cfcf0
+rsp 0x6cfcc0 0x6cfcc0
+r8 0xc43d10 12860688
+r9 0x1 1
+r10 0xc40000 12845056
+r11 0x6ceac0 7137984
+r12 0x1 1
+r13 0x8 8
+r14 0x0 0
+r15 0x0 0
+rip 0x40153b 0x40153b < dfs( int) +11 >
+eflags 0x206 [ PF IF ]
+cs 0x33 51
+ss 0x2b 43
+ds 0x0 0
+es 0x0 0
+fs 0x0 0
+gs 0x0 0
+( gdb) info stack
+
+
+
+
+
+
+
+
+
+
+
+
+
+
其他 shell
命令。 可以执行终端命令。
+
quit
命令。 简写为 q
。 退出 gdb 调试。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/git-github/index.html b/posts/git-github/index.html
new file mode 100644
index 00000000..e81f3758
--- /dev/null
+++ b/posts/git-github/index.html
@@ -0,0 +1,394 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Git 的连接 Github 小记 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 又是一个随记,方便自己使用的。 首先,得到 官网下载 ,随后测试一下:
+
$ git -v
+git version ( VERSION)
+
+
就下载好了。
+
+
使用 SSH 连接 Github 首先确保拥有一个 Github 账号,打开终端,生成 SSH 密钥:
+
$ ssh-keygen -t rsa -C "email"
+
+
它的提示全部回车就可以了。”email” 是 Github 注册使用的邮箱地址。
+
成功后会在用户文件夹(Windows 下通常是 %USERPROFILE%
环境变量,Linux 直接打开 ~/
)下生成一个 .ssh
文件夹,打开 id_rsa.pub
文件,复制里面的密钥后回到 Github 打开设置,找到 “SSH anf PGP keys “ 一栏,点击 “New SSH key”,Title 填上,将刚刚复制的密钥粘贴到 “Key” 一栏,点击 “Add SSH key” 保存。
+
+
随后可以验证是否完成,打开终端输入:
+
$ ssh -T git@github.com
+The authenticity of host 'github.com (IP ADDRESS)' can't be established.
+RSA key fingerprint is (FINGERPRINT).
+Are you sure you want to continue connecting (yes/no)? yes #在这里输入 yes
+Hi (USER NAME)! You' ve successfully authenticated, but GitHub does not provide shell access.
+
+
连接 Github 仓库 新建 Github 仓库。在电脑新建一个文件夹,创建一些文件,然后打开终端:
+
$ git init
+Initialized empty Git repository in /.git/
+
+$ git add ( FILE NAME)
+create mode 100644 ( FILE NAME)
+
+$ git commit -m "The commit information"
+
+$ git branch -M main
+
+$ git remote add origin git@github.com:( USER NAME) /( REPOSITORY NAME) .git
+
+$ git push -u origin main
+Enumerating objects: 7735 , done.
+Counting objects: 100 % ( 7735 /7735) , done.
+Delta compression using up to 4 threads
+Compressing objects: 100 % ( 7413 /7413) , done.
+Writing objects: 100 % ( 7735 /7735) , 55.74 MiB | 1.53 MiB/s, done.
+Total 7735 ( delta 2030 ) , reused 0 ( delta 0 ) , pack-reused 0
+remote: Resolving deltas: 100 % ( 2030 /2030) , done.
+To github.com:( USER NAME) /( REPOSITORY NAME) .git
+ * [ new branch] main -> main
+branch 'main' set up to track 'origin/main' .
+
+
打开 Github,可以看到 Commit 记录和提交的文件。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/graph-tree/index.html b/posts/graph-tree/index.html
new file mode 100644
index 00000000..5479a691
--- /dev/null
+++ b/posts/graph-tree/index.html
@@ -0,0 +1,395 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+数据结构:树的概念与储存 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 树 也是一种数据结构,它是非线性数据结构 ,它能很好地描述一个数据集合中的分支和层次,是一个比较重要的课题,以后的搜索和竞赛都有可能要用到它。树形结构的应用非常广泛,什么索引、语法结构。虽说概念比较繁琐 老师讲了一个小时。有点让人头疼(我咕了好多篇笔记了)。
+
树的概念 前面 前置芝士,简单说一下这些奇怪的名称:
+
+树中的每一个元素称为结点 node 。
+两个结点之间的线称为边 edge 。
+通过几条边,这几条边组成路径 。
+
+
+
+
树的结点一般画为圆圈,树若画出来也就是几个结点(圆)和几条边(线)组成的图,比较形象化,实际的树的储存方式是通过链表 中的数据域将一个个结点(元素)连接起来,比较麻烦,后面再说。 还有一个概念:树的边的个数比树的结点的个数少一。也就是说,假设树的结点的个数为 $n$,则树的边的个数为 $n-1$。
+
判断一张图是否为树 树最重要的就是每两个结点之间有且只有一条路径可以到达 ,也就是说,不可以形成环,不可以在一个树中无法到达所有结点。例如,下面就是一个树: 下面两张图不是树,他们分别违反了“不可以形成环”、“不可以在一个树中无法到达所有结点”。
+
更多的概念 首先放一张图:
+
以这张图为例,来说下面的概念吧。根结点 root :根结点通常在最上方,是所有子结点的父结点。在上面的那张图中,结点 1 就是整张图的根结点。在上面的图中,根结点可以更换,也不会影响到什么,但是根结点一变就会让树形态发生变化(假如结点 2 是整个树的根结点,那么树会变下面的图 )。一个树是必须要有根结点的,根结点只有一个。 父结点 parent(双亲结点) 子结点 child(孩子结点) :一个结点的分支就是那个结点的子结点,相反那个结点是分支结点的父结点。子结点通过父结点到达。例如结点 4 5 是结点 2 的子结点,结点 3 是结点 6 7 的父结点。兄弟结点 :同一个父结点的子结点称为兄弟结点。例如结点 4 5 互为兄弟结点,6 7 互为兄弟结点。度 :树的度就是一个结点子结点的个数。例如结点 2 的度就是 2,因为它只有两个子结点。深度 :从根结点 到当前结点的层数,根结点的深度是 1。例如,结点 1 深度为 1,结点 2 3 深度为 2,结点 4 5 6 7 深度为 3。叶子结点 :一个结点的度为 0,就叫做叶子结点。例如结点 4 5 6 7 都是叶子结点。n 叉树 :在树中,这个数是多少叉看度最多的结点,例如这个树就是二叉树(也比较特殊,后面讲)。子树 :假设将树中任意一个度不为 0 的结点与它的父结点切断它们之间的边,那么断开的那一部分又能成为一个新的树,称为子树。例如结点 2 4 5 可以组成一个子树。
+
还有一大堆子子孙孙祖先的什么的,懒得写了。说真的,感觉说多了意义不大。
+
二叉树的概念 n 叉树中,又出现了一个二叉树 Binary Tree 这么个奇怪的概念。什么左子树右孩子什么的不记了,就讲三个我认为比较重要的。
+
完美二叉树 : 也叫做满二叉树。简单来说就是一个深度为 $n$ 的二叉树,拥有 $2^n - 1$ 个结点。看着的话就是若再增加一个结点使其继续为二叉树,深度就必须要加一了。刚才的示例图就是一个完美二叉树。完全二叉树 : 完全二叉树的叶子结点可以不是满的,但是剩下的叶子结点必须都在图的左边。例如那张示例图若将结点 7 去掉,它就只是一个完全二叉树。完满二叉树 : 完满二叉树的结点除了叶子结点以外其他结点的度都必须是 2。示例图若将结点 4 5 去掉,它就只是一个完满二叉树。
+
注意:
+这三个概念极易弄混淆,稍不注意就忘了。完美二叉树一定也是完全二叉树和完满二叉树,但完满二叉树不一定是完全二叉树和完美二叉树。(别说他晕,我也晕了)
+
+
树的储存 一大堆基础概念,已经够呛了(悲)。学到树的储存已经开始逐渐迷惑。。。 一般来说,树也是不太可能用真正的指针链表来储存,毕竟太难写了,内存限制一般比时间限制够用一些,就用数组模拟链表。链表就是要关心指针域,下面就是一大堆奇奇怪怪的方法。
+
可能用不到的 备注:
+一般来说,这些方法用不太到,要么炸时间要么炸空间要么难实现。所以就按这种奇特的分类方法分类了,反正感觉用不到。这句话也兼下面。
+
+
父亲表示法 :顾名思义,指针域指向父结点。孩子表示法 :指针域指向子结点。父亲孩子表示法 :双向链表结构,也没啥用。
+
上述缺点:
+很明显,父亲法若寻找一个子结点可能要遍历整个表,很耗时间;孩子法度一大肯定爆内存,因为将每个子结点都存了下来;父亲孩子更糟糕,内存更大了,没有意义。
+
+
可能会用到的 孩子兄弟表示法 :适用于二叉树,也是一个双链表结构,一个结点连接其子结点和兄弟结点。邻接矩阵表示法 :通过二维数组表示每个结点的关系,假设深度为 $k$,则空间复杂度为 $O(k^2)$。(已学废。。。)邻接表表示法 :也叫链式前向星。(没弄太懂)
+
+
假设根结点为 2 时的情况:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/hexo-pretty/index.html b/posts/hexo-pretty/index.html
new file mode 100644
index 00000000..7154223f
--- /dev/null
+++ b/posts/hexo-pretty/index.html
@@ -0,0 +1,801 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hexo 建立静态博客记录 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这篇文章主要是为了记录自己用 Hexo 建站(主题 NexT)的经过,方便他人查阅和自己以后用。 关于 Hexo 的准备,可以看官方文档 ,关于主题 NexT 的,可以看 这里
+
如果你是的阅读目的是准备第一次使用 Hexo 搭博客,可以遵照本文提示看。 如果你准备美化你的 Hexo(最好且主题为 NexT)的博客,可以跳到 更多高阶美化
+
操作系统的异同
+
各种操作系统的过程基本一致。本文中的安装环境的主要做法是直接通过官网下载安装,其他下载方法也可行,这里不列举。
+
+
+
+
准备 下载、准备环境 如果还没有安装 Git ,去官网下载。Hexo 部署需要用到。
+
Hexo 是基于 Node.js 开发的,若未安装,需要先安装 Node.js ,两个版本都可以。安装完毕后打开终端检查:
+
$ node -v
+v18.16.0
+$ npm -v
+9.5 .1
+$ npx -v
+9.5 .1
+
+
当三个命令都正常显示版本号时,就安装成功了。
+
随后,下载 Hexo 包。执行以下命令:
+
$ npm install -g hexo-cli
+
+$ hexo -v
+hexo-cli: 4.3 .0
+os: .. .
+
+
+
随后,可以开始建立站点文件夹了。执行以下命令初始化 Hexo 站点:
+
$ hexo init blog
+$ cd blog
+$ npm install
+
+
此时,站点文件夹已新建完毕。目录大概是这样(......
表示省略了很多文件):
+
.
+├─ .github
+│ └─ dependabot.yml
+├─ node_modules
+│ ├─ .bin
+│ └─ ......
+├─ scaffolds
+│ ├─ draft.md
+│ ├─ page.md
+│ └─ post.md
+├─ source
+│ └─ _posts
+│ └─ hello-world.md
+├─ themes
+│ └─ .gitkeep
+├─ _config.landscape.yml
+├─ _config.yml
+├─ package-lock.json
+└─ package.json
+
+
随后,可以在本地运行查看效果:
+
$ hexo server
+INFO Validating config
+INFO Start processing
+INFO Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.
+
+
端口占用
+
如果出现 FATAL Port 4000 has been used. Try other port instead.
说明默认的 4000 端口被占用。逐一排查或解决:
+
+ 排查是否是 Hexo 已经运行了一个服务 。(不同终端) 解决:终端内按 Ctrl+C 终止那个已经运行的 Hexo 服务。
+ 排查有无其他应用占用端口 解决:关闭占用端口的应用。
+ 以上两个方案都不可行。 解决:运行命令 hexo s -p [number]
更改端口。,[number] 为 4000 以上的数字,例如:hexo s -p 8080
+
+
+
访问 http://localhost:4000/
查看效果。初始的欢迎页面大概是这个样子:
+
出现问题
+
如果以上步骤完成后出现无法访问的情况,可能是什么步骤出现了问题。若找不到原因,删除工作文件夹后以上步骤逐一排查,重试一遍以后一般都会正常。
+
+
自此,完成了站点文件环境的准备。以下的步骤都在这个文件夹内进行 ,文中相对文件路径父目录为这个文件夹 。
+
站点整体设置 打开站点文件夹中的 _config.yml
,这个文件是 Hexo 站点的整体设置。初始时的内容大概是这个:
+
+
+
+
+
+title : Hexo
+subtitle : ''
+description : ''
+keywords :
+author : John Doe
+language : en
+timezone : ''
+
+
+
+url : http: //example.com
+permalink : : year/: month/: day/: title/
+permalink_defaults :
+pretty_urls :
+ trailing_index : true
+ trailing_html : true
+
+
+source_dir : source
+public_dir : public
+tag_dir : tags
+archive_dir : archives
+category_dir : categories
+code_dir : downloads/code
+i18n_dir : : lang
+skip_render :
+
+
+new_post_name : : title.md
+default_layout : post
+titlecase : false
+external_link :
+ enable : true
+ field : site
+ exclude : ''
+filename_case : 0
+render_drafts : false
+post_asset_folder : false
+relative_link : false
+future : true
+syntax_highlighter : highlight.js
+highlight :
+ line_number : true
+ auto_detect : false
+ tab_replace : ''
+ wrap : true
+ hljs : false
+prismjs :
+ preprocess : true
+ line_number : true
+ tab_replace : ''
+
+
+
+
+
+index_generator :
+ path : ''
+ per_page : 10
+ order_by : - date
+
+
+default_category : uncategorized
+category_map :
+tag_map :
+
+
+
+meta_generator : true
+
+
+
+
+
+date_format : YYYY- MM- DD
+time_format : HH: mm: ss
+
+updated_option : 'mtime'
+
+
+
+per_page : 10
+pagination_dir : page
+
+
+
+include :
+exclude :
+ignore :
+
+
+
+
+theme : landscape
+
+
+
+deploy :
+ type : ''
+
+
一些刚建站会用到的配置的解释:
+
+title
: 网站标题。显示在 HTML <title></title>
和网站标题位置。
+subtitle
: 网站副标题。显示在网站标题下面,小字。
+author
: 网站所有者。通常显示在网站底部版权的地方。
+
+
其他的以后慢慢会用到。先把上面三个站点的信息填好吧。
+
YAML 格式
+
对于第一次使用 YAML 的很容易漏掉选项后的空格 。 正确:theme: landscape
错误:theme:landscape
+
+
Hexo 命令 没有太多好说的。就在这里列举。
+
+
+
+命令
+缩写
+解释
+
+
+
+hexo init <folder>
+hexo i
+新建一个站点文件夹 <folder>
,Hexo 会通过 Git clone hexo starter , hexo-theme-scape 并通过 NPM 下载部分依赖。
+
+
+hexo list <type>
+hexo l <type>
+在命令行获取站点数据。<type>
值为 page
post
route
tag
category
,例如 hexo l post
列出所有文章。
+
+
+hexo new <post>
+hexo n <post>
+写一篇新文章,让 Hexo 在 ./source/_posts/ 下生成名为 <post>.md
的文件。
+
+
+hexo generate
+hexo g
+让 Hexo 生成站点文件。
+
+
+hexo server
+hexo s
+在本地运行网站,查看效果。
+
+
+hexo clean
+
+清除生成的网页。
+
+
+hexo deploy
+hexo d
+部署站点。需要配置和依赖,下面会讲到。
+
+
+
通常来说,写完文章后运行:
+
$ hexo g
+$ hexo d
+
+
部署到 Github Pages 博客自然需要进行部署,本地运行的博客别人看不到。我当时选择部署到 Github Pages 。 所以,当时注册了 Github(若未注册,先注册 Github ),然后连接本地,参照Git 的连接 Github 小记 进行连接。 完成后,创建一个新的仓库,名为 <username>.github.io
,<username>
为自己的用户名。打开 Settings -> Page ,确保 Branch 已选择。
+
运行以下命令:
+
$ npm install hexo-deployer-git --save
+
+
随后打开 _config.yml 文件,找到 deploy
字样,更改如下:
+
+
+deploy :
+ type : git
+ repository : git@github.com: <username> /<username> .github.io.git
+ branch : main
+
+
更改完毕后,就可以运行 hexo d
部署到 Github Pages 了。访问 https://<username>.github.io
,如果第一次部署,未显示就多等一会儿。完成后,就可以看到网站了。
+
修改和美化 下载主题 NexT NexT 是一个很简洁美观且不断维护的 Hexo 主题。这个博客就是 Next 主题。 首先,进行下载,运行以下命令:
+
$ cd themes
+$ git clone https://github.com/next-theme/hexo-theme-next.git
+
+
完成后,打开 config.yml,找到 theme
字样,更改如下:
+
+
+
+theme : hexo- theme- next
+
+
找到 language
字样,更改其值为 zh-CN
。
+
此时本地运行大概是这个样子:
+
可以根据需要更改 NexT 主题。打开 themes/hexo-theme-next/_config.yml(主题配置文件)找到 scheme
字样,选择一个去掉 #
注释,把原本的用 #
注释上。例如:
+
+
+
+scheme : Pisces
+
+
+
主题效果(图片和演示链接):
+
+
+
基础修改 主页面 原本的文章链接为 YYYY/MM/DD/:title
(例如 /2023/11/04/hello
),一大串日期很难看。我当时把他改为了 posts/:title
,这样有很高的自由度(标题自定义)的同时保证了链接简短。 打开整体设置 _config.yml,找到 permalink
,更改为:
+
# URL
+## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
+url: http://example.com
+- permalink: :year/:month/:day/:title/
+ + permalink: posts/:title/
+
+
当文章多的时候,一整页默认有十篇文章,很长,可以减小。 打开整体设置 _config.yml,找到 per_page
,将它的的值更改为 5
。这样每一页就会简约得多。
+
自定义浏览器里标签的图标 打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 favicon
,把自己的图标放到 theme/hexo-theme-next/source/images 内。三种尺寸:16x16、32x32、原大小、原大小 分别对应 small
medium
apple_touch_icon
safari_pinned_tab
,将其相应位置填写好。例如我这个博客的配置是:
+
favicon :
+ small : /images/icon- 16x16.png
+ medium : /images/icon- 32x32.png
+ apple_touch_icon : /images/icon.png
+ safari_pinned_tab : /images/icon.png
+
+
+
菜单栏,新页面 此时,新博客只有两大主页面:文章,主页。这未免有些太单薄,最好有个分类标签一类的。NexT 已经帮我们做好了。 打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 menu
,把 home
tags
categories
archives
前面的 #
注释都去掉。大概是这个样子:
+
menu :
+ home : / | | fa fa- home
+
+ tags : /tags/ | | fa fa- tags
+ categories : /categories/ | | fa fa- th
+ archives : /archives/ | | fa fa- archive
+
+
+
+
+
你也可以更改 “||
” 之后的图标,去 font-awesome.com 用英文搜索你想要的图标。例如 fa-rectangle-list
显示为
+
随后运行以下命令:
+
$ hexo new page tags
+$ hexo new page categories
+
+
完成后打开 source/tags/index.md,在两个 ---
内新加一行 type: tags
; 同样地,打开 source/tags/index.md,加一行 type: categories
。 顺便你也可以更改它们的 title
值分别为 标签 和 分类。
+
完成以上所有步骤后,你我期待的像样的一个博客诞生了。此时,新拥有博客的人可以开始 写作 了
+
更多修改 CSS(Stylus) 方面 在 source 文件夹下新建文件夹 _data,在 source/_data 下新建文件 styles.styl,根据下面的代码注释插入你需要的内容:
+
+.headband {
+ display : none;
+}
+
+.header,
+.main-inner {
+ margin-top : 10 px ;
+
+ +mobile ( ) {
+ margin-top : 0 ;
+ }
+}
+
+
+.post-body img {
+ border-radius : 8 px
+}
+
+
+header.header {
+ background : var ( - -content-bg-color) ;
+ border-radius : 5 px 5 px 5 px 5 px ;
+ box-shadow : 0 2 px 2 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 3 px 1 px -2 px rgba ( 0 , 0 , 0 , 0.06 ) , 0 1 px 5 px 0 rgba ( 0 , 0 , 0 , 0.12 ) ;
+}
+.site-brand-container {
+ border-radius : 5 px 5 px 0 px 0 px ;
+}
+.sidebar-inner {
+ background : var ( - -content-bg-color) ;
+ border-radius : 5 px ;
+ box-shadow : 0 2 px 2 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 3 px 1 px -2 px rgba ( 0 , 0 , 0 , 0.06 ) , 0 1 px 5 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 -1 px 0.5 px 0 rgba ( 0 , 0 , 0 , 0.09 ) ;
+ box-sizing : border-box;
+ color : var ( - -text-color) ;
+ margin-top : 12 px ;
+ max-height : calc ( 100 vh - 24 px ) ;
+}
+
+.main-inner .sub-menu, .main-inner .post-block, .main-inner .tabs-comment, .main-inner > .comments, .main-inner .comment-position .comments, .main-inner .pagination {
+ background : var ( - -content-bg-color) ;
+ border-radius : 5 px 5 px 5 px 5 px ;
+ box-shadow : 0 2 px 2 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 3 px 1 px -2 px rgba ( 0 , 0 , 0 , 0.06 ) , 0 1 px 5 px 0 rgba ( 0 , 0 , 0 , 0.12 ) ;
+}
+
+
+body {
+ background : url(/pic/background3.png) ;
+ background-size : cover;
+ background-repeat : no-repeat;
+ background-attachment : fixed;
+ background-position : 50 % 50 % ;
+ @media ( prefers-color-scheme: dark) {
+ background-image : none;
+ }
+}
+
+
随后,打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 custom_file_path
,把 style 子项的注释去掉。更改成这个样子:
+
custom_file_path :
+
+
+
+
+
+
+
+
+
+
+ style : source/_data/styles.styl
+
+
以后可以根据自己的需要慢慢更改 styles.styl 的内容。
+
注意备份
+
任何修改都有可能出现错误,建议多进行备份 原生成文件。有必要的话使用 git 进行版本控制 ,备份到远程仓库。否则出现错误很难改回来。尤其是更改了很多的时候。
+
+
插件:搜索功能 hexo-generator-searchdb 运行以下命令下载:
+
$ npm install hexo-generator-searchdb --save
+
+
打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 local_search 项,更改如下:
+
local_search:
+- enable: false
+ + enable: true
+ # If auto, trigger search by changing input.
+ # If manual, trigger search by pressing enter key or search button.
+ trigger: auto
+ # Show top n results per article, show all results by setting to -1
+ top_n_per_article: 1
+ # Unescape html strings to the readable one.
+ unescape: false
+ # Preload the search data when the page loads.
+ preload: false
+
+
此时,在菜单栏中的搜索已出现,可以点击并键入进行搜索了。
+
插件:置顶功能 hexo-generator-index-pin-top 运行以下命令下载:
+
$ npm install hexo-generator-index-pin-top --save
+
+
如果需要置顶一篇文章,在这篇文章的 Front-matter 中添加:
+
top : true
+
+
可以给置顶的文章增加标识。在 source/data 下新建文件 post-meta.njk:
+
{% if post.top %}
+ <div style="padding-left: 8px;">
+ <span class="post-meta-divider" style="padding-right: 8px;">|</span>
+ <span color=black style="color: #000000; font-weight: bold; padding-left: 4px;"> <i class="fa fa-thumbtack"></i> </span>
+ <span style="color: #000000; font-weight: bold; padding-left: 4px;"> 置顶 </span>
+ </div>
+{% endif %}
+
+
打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 custom_file_path
,把 postMeta 的注释去掉。
+
写作 运行 hexo new name
就可以在 source/_posts 下新建一篇名为 name.md 的文章。原本是这样的:
+
---
+title :
+date :
+tags :
+---
+
+
两个 ---
之内的内容叫做 Front-matter,它是这个文章的信息(变量)。以下是会增加和修改的东西:
+
+title
: 文章标题
+date
: 建立日期
+tags
: 标签,可以有多个。
+categories
: 分类,可以有多个。
+
+
多个标签的标注方法用 -
多行,多个同级分类用 - []
,如:
+
---
+tags :
+- 生活
+- 美好
+categories :
+- [ 生活]
+- [ 美好]
+---
+
+
这样,这篇文章就有两个标签,两个分类。
+
进行正常写作时使用 Markdown 语法,或者可以安装其他插件使用其他语言写作。
+
警告
+
写了好长时间,还相当于自己又建了一个博客,不建议像我这样写这么长的文章(狗头) 开玩笑的啦~ 工作区终于清静了。。。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/hover-show/index.html b/posts/hover-show/index.html
new file mode 100644
index 00000000..1ec70bf7
--- /dev/null
+++ b/posts/hover-show/index.html
@@ -0,0 +1,559 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+CSS 鼠标悬浮窗口效果 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 最近弄的 github 卡片,弄了半天弄出来的鼠标悬浮显示文字的效果。使用 CSS 伪元素弄出来的小提示。但是不适合 overflow: hidden;
的元素。不管怎么说,还是很好用的,忘掉了就不太好,也就放到博客里来了。
+
+
+
+
+
+代码
+效果
+
+
+
+<span aria-label="左边提示" balloon-shown="left">鼠标</span>
+鼠标
+
+
+<span aria-label="右边提示" balloon-shown="right">悬浮</span>
+悬浮
+
+
+<span aria-label="上边提示" balloon-shown="up">文字</span>
+文字
+
+
+<span aria-label="上边提示" balloon-shown="down">提示</span>
+提示
+
+
+
+
+
代码是这样的:
+
[aria-label][balloon-shown] {
+ position : relative;
+}
+[aria-label][balloon-shown="left"]::before {
+ border : 5px solid transparent;
+ border-left-color : #202335;
+}
+[aria-label][balloon-shown="right"]::before {
+ border : 5px solid transparent;
+ border-right-color : #202335;
+}
+[aria-label][balloon-shown="up"]::before {
+ border : 5px solid transparent;
+ border-top-color : #202335;
+}
+[aria-label][balloon-shown="down"]::before {
+ border : 5px solid transparent;
+ border-bottom-color : #202335;
+}
+[aria-label][balloon-shown]::before {
+ width : 0;
+ height : 0;
+
+ z-index : 10;
+ content : "" ;
+ position : absolute;
+ opacity : 0;
+ visibility : hidden;
+ transition : opacity .4s, transform .4s, visibility .4s;
+}
+[aria-label][balloon-shown]::after {
+ opacity : 0;
+ z-index : 10;
+
+ visibility : hidden;
+ background-color : #202335;
+ content : attr ( aria-label) ;
+ white-space : nowrap;
+ border-radius : 2px;
+ position : absolute;
+ padding : .5em 1em;
+ transition : opacity .4s, transform .4s, visibility .4s;
+ color : #eee;
+}
+[aria-label][balloon-shown]:hover::after, [aria-label][balloon-shown]:hover::before {
+ opacity : 0.9;
+ visibility : visible;
+}
+[aria-label][balloon-shown="left"]::after {
+ margin-right : 10px;
+}
+[aria-label][balloon-shown="left"]::after, [aria-label][balloon-shown="left"]::before {
+ right : 100%;
+ top : 50%;
+ transform : translate ( 5px, -50%) ;
+}
+[aria-label][balloon-shown="right"]::after {
+ margin-left : 10px;
+}
+[aria-label][balloon-shown="right"]::after, [aria-label][balloon-shown="right"]::before {
+ left : 100%;
+ top : 50%;
+ transform : translate ( -5px, -50%) ;
+}
+[aria-label][balloon-shown="left"]:hover::after, [aria-label][balloon-shown="left"]:hover::before, [aria-label][balloon-shown="right"]:hover::after, [aria-label][balloon-shown="right"]:hover::before {
+ transform : translate ( 0, -50%) ;
+}
+[aria-label][balloon-shown="up"]::after {
+ margin-bottom : 10px;
+}
+[aria-label][balloon-shown="up"]::after, [aria-label][balloon-shown="up"]::before {
+ bottom : 100%;
+ left : 50%;
+ transform : translate ( -50%, 5px) ;
+}
+[aria-label][balloon-shown="down"]::after {
+ margin-top : 10px;
+}
+[aria-label][balloon-shown="down"]::after, [aria-label][balloon-shown="down"]::before {
+ left : 50%;
+ top : 100%;
+ transform : translate ( -50%, -5px) ;
+}
+[aria-label][balloon-shown="up"]:hover::after, [aria-label][balloon-shown="up"]:hover::before, [aria-label][balloon-shown="down"]:hover::after, [aria-label][balloon-shown="down"]:hover::before {
+ transform : translate ( -50%, 0) ;
+}
+
+
使用时这样使用:
+
< 标签 aria-label = " 文字" balloon-shown = " up" 或"down"或"left"或"right" > 文字</ 标签>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/huff-tree/index.html b/posts/huff-tree/index.html
new file mode 100644
index 00000000..ab86aa0e
--- /dev/null
+++ b/posts/huff-tree/index.html
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+哈夫曼树和哈夫曼编码 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 更前面的知识:树的概念 先来说说前面的芝士:
+
+路径长度 从根结点到目标结点经过的结点数量(边的数量)。
+权值 一个结点的权值可以是人为赋予的一个数。
+结点的带权路径长度 从根节点到当前结点的路径长度乘结点的权值。
+树的带权路径长度 整个树中叶子结点的带权路径长度总和。
+
+
哈夫曼树是二叉树,且哈夫曼树的带权路径长度最小,哈夫曼编码会用到。
+
+
+
哈夫曼树的构建 前面写了,哈夫曼树的带权路径长度最小,若想带权路径最小,则权值小的结点的路径长,权值大的结点路径短。哈夫曼树构建的结点都必须是叶子结点,例如用 1 2 5 6 构建的哈夫曼树是这样的: 这个树的带权路径长度为 25。
+
构造过程:
+
+选出权值两个最小的结点合并;
+将两个点从将要合并的结点序列中删除,加入两个结点的和;
+重复以上步骤,直至达到要求。
+
+
演示:
+
哈夫曼编码 基于哈夫曼树,按照字符出现的频率(也就是哈夫曼树中的权值)进行二进制编码。 也就是用哈夫曼树对一串字符进行编码,可以认为左子树是 0,右子树是 1。(说不清楚啊) 哈夫曼编码是贪心 的思想,为了使信息量最小化,可以用到哈夫曼树。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/jinzhi/index.html b/posts/jinzhi/index.html
new file mode 100644
index 00000000..73d858cc
--- /dev/null
+++ b/posts/jinzhi/index.html
@@ -0,0 +1,617 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+有关进制的一些小记 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
x 进制,代表着在这个计数方法中逢 x 进一,例如十进制就代表着逢十进一 。 我们平常在生活中用的都是十进制。进制一类的东西在 OI 中也比较重要CCF 喜欢考,计算机中的数据都是以二进制储存的,二进制也完美地利用了每一个比特。当然,只要有足够的表示方法,人们可以弄出三十二进制、六十四进制,甚至一千进制。闲的没事情干,进制有关的以及进制之间的转换就是我想记下来的话题。
+
+
+
进制转换 二进制和十进制的转换 这是 €€£ CCF 出的题中一定会多少考到一点的知识,比较重要。一般来说,x 进制的数记作 $(\text {number})_x$,例如二进制数 1011 记作 $(1011)_2$,十进制数 114514 记作 $(114514)_{10}$。
+
二进制 -> 十进制 二进制的数从右往左每一位都有权值,第 i 位的权值为 $2^{(i - 1)}$。举个例子:二进制数 1011001 的每一位权值是: $\mathbf{1} \to 2^6 \ \ \ \mathbf{0} \to 2^5 \ \ \ \mathbf{1} \to 2^4 \ \ \ \mathbf{1} \to 2^3 \ \ \ \mathbf{0} \to 2^2 \ \ \ \mathbf{0} \to 2^1 \ \ \ \mathbf{1} \to 2^0$。
+
从二进制转换为十进制只需要将当前二进制位的值乘上权值即可。还是 1011001 :
+
$$ \begin{aligned} &(1011001)_2 \\ = &(\mathbf{1} \times 2^6) + (\mathbf{0} \times 2^5) + (\mathbf{1} \times 2^4) + (\mathbf{1} \times 2^3) + (\mathbf{0} \times 2^2) + (\mathbf{0} \times 2^1) + (\mathbf{1} \times 2^0) \\ = &64 + 0 + 16 + 8 + 0 + 0 + 1 \\ = &(89)_{10} \end{aligned} $$
+
可见,二进制 1011001 转换为十进制是 89 。话说 hexo next 的 mathjax 渲染越来越奇怪了。。。
+
十进制 -> 二进制 可以使用短除法,将十进制除以二取余,直至商为零。最后将取余的结果倒序输出。 比如说,还是那个数字 $(89)_{10}$:
+
$$ \begin{aligned} 2 \ | \underline{ \ \ \ \ \ \ \ \ } &\underline{89 \ } \\ 2 \ | \underline{ \ \ \ \ \ \ \ } &\underline{44 \ } \ \ \ \ \ \ \textbf{1} \\ 2 \ | \underline{ \ \ \ \ \ \ } &\underline{22 \ } \ \ \ \ \ \ \textbf{0} \\ 2 \ | \underline{ \ \ \ \ \ } &\underline{11 \ } \ \ \ \ \ \ \textbf{0} \\ 2 \ | \underline{ \ \ \ \ } &\underline{\ \ 5 \ } \ \ \ \ \ \ \textbf{1} \\ 2 \ | \underline{ \ \ \ } &\underline{\ \ 2 \ } \ \ \ \ \ \ \textbf{1} \\ 2 \ | \underline{ \ \ } &\underline{\ \ 1 \ } \ \ \ \ \ \ \textbf{0} \\ 2 \ | &\underline{\ \ 0 \ } \ \ \ \ \ \ \textbf{1} \end{aligned} $$
+
最后,倒着输出即可得知 $(89)_{10} = (1011001)_2$ 。ps: mathjax 没有特定的短除公式,只好用这种奇特的方法模拟短除。
+
P.S. 另一种更方便的双向转换方法
+
+
可以发现,其实二进制十进制的互相转换都离不开 二的 i 次方,也可以将这张表记下来(也就是从右往左不断地乘二嘛),之后的转换会方便很多。 其实这张表也就是二的 i 次方:
+
$$… 256 \ \ 128 \ \ 64 \ \ 32 \ \ 16 \ \ 8 \ \ 4 \ \ 2 \ \ 1$$
+
这算是这张表最方便的用法了,还是 $(1011001)_2$
+
+
+
+每一位
+1
+0
+1
+1
+0
+0
+1
+
+
+
+每一位对应的权值
+64
+32
+16
+8
+4
+2
+1
+
+
+
一代表着要加起来,否则不加起来,那么,这个二进制数等于这个十进制数: $(1011001)_2 = 64 + 16 + 8 + 1 = (89)_{10}$
同样的,也可以一位一位地尝试累加。假如十进制减去奶味的权值不小于 0,就减去,否则不减去,直至加起来的权值之和等于目标十进制数。例如十进制数 89:
+
+
+
+权值表
+64
+32
+16
+8
+4
+2
+1
+
+
+
+是否减去
+1
+0
+1
+1
+0
+0
+1
+
+
+过程备注
+初始的值是 89,64 < 89,就减去,89 - 64 = 25。结果 1 。
+32 > 25,不减去。结果 0 。
+16 < 25,25 - 16 = 9。结果 1 。
+8 < 9,9 - 8 = 1。结果 1 。
+4 > 1。结果 0 。
+2 > 1。结果 0 。
+1 = 1,1 - 1 = 0。结果 1 。
+
+
+
可见: $(89)_{10} = (1011001)_2$
+
+
+
其他进制之间的转换 像其他进制,比如十六进制,大于 9 时就可以用字母 A B C D E F 按照顺序代替数字。
+
使用十进制当作媒介的转换(对于所有进制通用) 其实,任何进制之间的转换都可以将那个进转换为十进制后再转换为目标进制。十进制也可以转换为任何进制。至于怎么转换,其实和 二进制和十进制之间的转换 差不多。 同样的,x 进制转十进制 每一位的 每一位乘上每一位的权值 之和。例如:
+
$$ \begin{aligned} &(1021102)_3 \\ = &(\mathbf{1} \times 3^6) + (\mathbf{0} \times 3^5) + (\mathbf{2} \times 3^4) + (\mathbf{1} \times 3^3) + (\mathbf{1} \times 3^2) + (\mathbf{0} \times 3^1) + (\mathbf{2} \times 3^0) \\ = &729 + 0 + 162 + 27 + 9 + 0 + 2 \\ = &929 \end{aligned} $$
+
$x$ 进制的从右往左数(从 1 开始数)第 $i$ 位的权值就是 $x^{(i - 1)}$。转换为十进制只需要将每一位的 每一位的权值乘那一位的数 加起来即可。
+
十进制转 x 进制也可以用短除法,不断整除 x,取余,然后倒序输出。 照理说,将十进制作为媒介可以将任意进制转换为其他任意进制。 同样的,也可以通过代码更方便地实现(说一句,还是别人的代码写的好看,我写的屎山简直不忍直视,而且只能大到十六进制):
+
# include <iostream>
+# include <cstdio>
+# include <cstring>
+# include <cmath>
+using namespace std;
+
+int xtoten ( int x, string s)
+{
+ int tensum = 0 , cnt = 0 ;
+ for ( int i = s. length ( ) - 1 ; i >= 0 ; i-- )
+ {
+ int t;
+ if ( s[ i] == '0' ) t = 0 ;
+ else if ( s[ i] == '1' ) t = 1 ;
+ else if ( s[ i] == '2' ) t = 2 ;
+ else if ( s[ i] == '3' ) t = 3 ;
+ else if ( s[ i] == '4' ) t = 4 ;
+ else if ( s[ i] == '5' ) t = 5 ;
+ else if ( s[ i] == '6' ) t = 6 ;
+ else if ( s[ i] == '7' ) t = 7 ;
+ else if ( s[ i] == '8' ) t = 8 ;
+ else if ( s[ i] == '9' ) t = 9 ;
+ else if ( s[ i] == 'A' ) t = 10 ;
+ else if ( s[ i] == 'B' ) t = 11 ;
+ else if ( s[ i] == 'C' ) t = 12 ;
+ else if ( s[ i] == 'D' ) t = 13 ;
+ else if ( s[ i] == 'E' ) t = 14 ;
+ else if ( s[ i] == 'F' ) t = 15 ;
+ tensum += t * pow ( x, cnt) ;
+ cnt++ ;
+ }
+ return tensum;
+}
+string tentoy ( int y, int n)
+{
+ string ret = "" ;
+ for ( ; ; )
+ {
+ int t = n % y;
+ if ( t == 0 ) ret += '0' ;
+ else if ( t == 1 ) ret += '1' ;
+ else if ( t == 2 ) ret += '2' ;
+ else if ( t == 3 ) ret += '3' ;
+ else if ( t == 4 ) ret += '4' ;
+ else if ( t == 5 ) ret += '5' ;
+ else if ( t == 6 ) ret += '6' ;
+ else if ( t == 7 ) ret += '7' ;
+ else if ( t == 8 ) ret += '8' ;
+ else if ( t == 9 ) ret += '9' ;
+ else if ( t == 10 ) ret += 'A' ;
+ else if ( t == 11 ) ret += 'B' ;
+ else if ( t == 12 ) ret += 'C' ;
+ else if ( t == 13 ) ret += 'D' ;
+ else if ( t == 14 ) ret += 'E' ;
+ else if ( t == 15 ) ret += 'F' ;
+ n /= y;
+ if ( n <= 0 )
+ {
+ break ;
+ }
+ }
+ return ret;
+}
+
+int main ( )
+{
+ int n, m;
+ string qwq;
+
+ cin >> n >> qwq >> m;
+
+ string ans = tentoy ( m, xtoten ( n, qwq) ) ;
+ for ( int i = ans. length ( ) - 1 ; i >= 0 ; i-- )
+ {
+ cout << ans[ i] ;
+ }
+
+ return 0 ;
+}
+
+
+
+
将二进制转换为八进制、十六进制 注意一下,二进制并不可以直接转换为其他进制,只不过对于二进制转八进制、十六进制比较方便。若是这二进制转八进制或十六进制,要是嫌使用十进制作为媒介比较麻烦,那就可以用二进制作为媒介更加方便一些。
+
将二进制转换为八进制,可以从右往左三位三位分开来,再将那三位二进制转换为十进制,合起来(注意是字符意义上的合起来)就是八进制。十六进制则是四位四位分开来。这里举两个例子:
+
$$ \because \underset{\text{八进制:}}{\text{二进制:}} ( \underset{1}{\underline{1}} \ \underset{2}{\underline{010}} \ \underset{7}{\underline{111}} )_{2} $$
+
$$ \therefore (1010111)_{2} = (127)_{8} $$
$$ \because \underset{\text{十六进制:}}{\text{二进制:}} ( \underset{3}{\underline{11}} \ \underset{\text{A}}{\underline{1010}} \ \underset{1}{\underline{0001}} )_{2} $$
+
$$ \therefore (1110100001)_{2} = (\text{3A1})_{16} $$
+
+
P.S. 二进制、八进制、十进制、十六进制在 C++ 中的表示方法(前缀)
+
+
以上这些进制自然有自己的表示方法。其中,二进制以 0b
开头;八进制以 0
开头;十进制就是平常的写法,没有任何前缀;十六进制以 0x
开头。 例如,以下代码会输出四个 2147483647
。
+
printf ( "%d %d %d %d\n" ,
+ 0b1111111111111111111111111111111 ,
+ 017777777777 ,
+ 2147483647 ,
+ 0x7fffffff ) ;
+
+
进制小数之间的转换 进制小数也是 CCF 要考的一点,恰好在某个模拟赛上做到了,更新一下下。
+
十进制小数转 x 进制 简单来说就是小数点前面正常转换,小数点之后乘 x 取整,正常输出。例如十进制 0.3 转换为二进制:
+
$$ \begin{aligned} &0.3 \times 2 = \mathbf{0}.6 \\ \text{二进制小数:}&0.\mathbf{0} \\ \\ &0.6 \times 2 = \mathbf{1}.2 \\ \text{二进制小数:}&0.0\mathbf{1} \\ \\ &0.2 \times 2 = \mathbf{0}.4 \\ \text{二进制小数:}&0.01\mathbf{0} \\ \\ &0.4 \times 2 = \mathbf{0}.8 \\ \text{二进制小数:}&0.010\mathbf{0} \\ \\ &0.8 \times 2 = \mathbf{1}.6 \\ \text{二进制小数:}&0.0100\mathbf{1} \\ \\ &0.6 \times 2 = \mathbf{1}.2 \\ \text{二进制小数:}&0.01001\mathbf{1} \\ \\ &… \end{aligned} $$
+
最后可以得出:
+
$$ (0.3)_{10} = (0.0\dot{1}00\dot{1}) $$
+
注:无限循环小数
+
x 进制小数转十进制 其实和整数位很像,不过从左往右第 i 位的权值是 -i。不写了吧。。。
+
位运算 位运算是一个比较毒瘤有趣的运算,是二进制的运算。当然也可以通过位运算做一些与平常的(逻辑)运算符等价的运算,但速度更快。
+
按位与运算 &
将两个二进制的每一位逐个比较,若这一位都为 1 则得出 1,否则得出 0。若这两个二进制数字位数不同可以在前面补零。
+
1 & 1 = 1;
+0 & 0 = 0;
+1 & 0 = 0;
+0 & 1 = 0;
+
+
这个运算符还有一个备选关键字:bitand
,比如 10 & 3
等价于 10 bitand 3
。 其实所有位运算也可以在 C++ 中用十进制直接运算,例如 10 & 3
,用 0b
前缀也行,也就是 0b1010 & 0b11
或 0b1010 & 0b0011
。 举个更详细的例子:
+
$$ \begin{matrix} & 1011001 \\ \& & 0111101 \\ \hline & 0011001 \end{matrix} $$
+
转为十进制就是 89 & 61 = 15 。
+
按位或运算 |
两个二进制的每一位比较,若有一个为 1 则得出 1,否则得出 0。同样的,若这两个二进制数字位数不同可以在前面补零。
+
1 | 1 = 1;
+0 | 0 = 0;
+1 | 0 = 1;
+0 | 1 = 1;
+
+
这个运算符也有一个备选关键字 bitor
,10 | 3
等价于 10 bitor 3
。 例子:
+
$$ \begin{matrix} & 1011001 \\ | & 0111101 \\ \hline & 1111101 \end{matrix} $$
+
转为十进制就是 89 | 61 = 125 。
+
按位非运算 ~
这算是最简单的运算符了,即将每一位取反。例如 ~0
就等于 1,~1
就等于 0。 例子:
+
$$ \begin{matrix} \sim & 0111101 \\ \hline & 1000010 \end{matrix} $$
+
按位异或 ^
其实就是比较每一位是否相同,若相同为 0
, 不相同为 1
。
+
1 ^ 1 = 0;
+0 ^ 0 = 0;
+1 ^ 0 = 1;
+0 ^ 1 = 1;
+
+
C++ 中也有备选关键字,就是 xor
。10 ^ 3
等价于 10 xor 3
。 例如:
+
$$ \begin{matrix} & 1011001 \\ \text{^} & 0111101 \\ \hline & 1100100 \end{matrix} $$
+
转为十进制就是 89 ^ 61 = 100 。
+
左移 <<
右移 >>
将所有二进制位全部左移,也就是将最左边的二进制位丢弃,右边补上一个 0。例如:10110011 << 1 = 01100110
。 右移也是一样,不过负数往左边补 1,正数补 0。
+
P.S. 位运算时赋值
+
+
同 +=
-=
等符号一样,位运算也可以在符号后面加上 =
,>>=
^=
&=
<<=
|=
等运算符都是可以的。
+
+
+
P.S. 位运算的一些使用技巧
+位运算其实有很多奇怪的应用。例如:
+
+
+判断偶数奇数 (能否被 2 整除)。0 是偶数 1 是奇数。([number] & 1) == 1
相当于 ([number] % 2) == 1
,平常还是写 [number] & 1
。举个例子,10 & 1 = 0
、13 & 1 = 1
。
+求 2 的几次方 ,1 << [number]
就是求 2 的 [number] 次方。例如 1 << 10 = sqrt(2, 10) = 1024
。
+交换 a b
两个数字 。可以 a ^= b; b ^= a; a ^= b
,效率比普通交换要高。
+正数变负数,负数变正数 。假设一个数字 n
,只需要 ~n + 1
就可以转变该数正负号。例如 ~1024 + 1 = -1024
、~-114 + 1 = 114
。(在 “补码” 中,详见下面的二进制编码)
+除以 2 ,使用 [number] >> 1
。例如 100 >> 1
等价于 100 / 2
,再比如 int a = 1024; a >>= 1; printf("%d\n", a);
输出 512
。
+
+
其他的应用,这里不写了,有兴趣可以去网上找更多的。
+
+
+
二进制的编码 其实,刚才讲的(个别除外)二进制都是二进制中编码的一种:原码 。二进制一共有三个编码:原码 、反码 和补码 ,计算机中真正使用的是补码 。 这些编码都要规定它们的位数,否则就弄不清楚到底是正数还是负数了。在下面的随记中,我用的是8 位整型 。其实在 C++ 中,int
是 32 位整型。确定位数很重要,例如:
+
int a = 0b11111111111111111111111111111111 ;
+long long b = 0b11111111111111111111111111111111 ;
+printf ( "%d %lld\n" , a, b) ;
+
+
会输出 -1 4294967295
。因为 int
是 32 位整型,而 long long 是
64 位。补码的第一位是符号位,若为 1 就是负数。而我给的二进制是 32 位,第一位是 1,int
就是负数。
+
原码、反码、补码的表示是将二进制用中括号括起来,再右下角写上 “原” “反”或“补”。例如 $[00001010]_{\text{原}}$、$[11101110]_{\text{补}}$。
+
原码 原码、反码以及补码的最左边的那一位都是符号位 。例如 $[00000001]_{\text{原}}$ 是十进制的 1,而 $[10000001]_{\text{原}}$ 是十进制的 -1。
+
在原码中,除符号位外,剩下的二进制都是按照 二进制转十进制 一样。若符号位是 1 那就将转换的十进制加个负号。例如:
+
$$ \begin{aligned} (5)_{10} &= [00000101]_{\text{原}} \\ (-12)_{10} &= [10001100]_{\text{原}} \end{aligned} $$
+
反码 原码变成反码,若原码是正数(符号位为 0)则不需要做任何改变;若原码是负数(符号位为 1)则将除符号位以外的位全部取反。例如:
+
$$ \begin{aligned} (24)_{10} &= [00011000]_{\text{原}} = [00011000]_{\text{反}} \\ (-17)_{10} &= [10010001]_{\text{原}} = [11101110]_{\text{反}} \end{aligned} $$
+
补码 其实这才是计算机真正使用的二进制编码,前面的两种编码基本上只供学习和理解用。
+
若那个二进制为正数,原码、反码和补码相同;若为负数,那么它的补码是它的反码加一。(请注意,二进制加法逢二进一)例如:
+
$$ \begin{aligned} (27)_{10} &= [00011011]_{\text{原}} = [00011011]_{\text{反}} = [00011011]_{\text{补}} \\ (-53)_{10} &= [10110101]_{\text{原}} = [11001010]_{\text{反}} = [11001011]_{\text{补}} \end{aligned} $$
+
P.S. 补码的快速转十进制方法
+
+
同普通二进制转十进制一样,可以弄一张差不多一样的表,不同的是,这张表的最左边的数(符号位)是负数。 还是以 8 位整型为例,这张表是这样的:
+
$$-128 \ \ 64 \ \ 32 \ \ 16 \ \ 8 \ \ 4 \ \ 2 \ \ 1$$
+
刚才的 -53 就可以以这种方法转换:
+
$$ \begin{aligned} &[11001011]_{\text{补}} \\ = &-128 + 64 + 0 + 0 + 8 + 0 + 2 + 1 \\ = &(-53)_{10} \end{aligned} $$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/js-random-pic/index.html b/posts/js-random-pic/index.html
new file mode 100644
index 00000000..5b3db591
--- /dev/null
+++ b/posts/js-random-pic/index.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+记录:JavaScript 随机显示图片/随机数 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 又是一个闲着没事干的随记。。。直接进入正题吧。
+
考虑使用数组存储图片的链接,然后随机显示。 随机显示数组图片自然需要随机数,而随机显示图片还需要查找元素,所以就写这些。
+
+
+
生成从 0 到 n 的随机数 JavaScript 有一个很强大的对象,Math
,里面有很多属性以及方法,可以去看看 MDN Web Docs 。 这么多函数中,Math.random()
正是我们想要的函数,它可以生成小于 1 的随机(小)数。例如:
+
> Math. random ( ) ;
+< · 0.8823149516270028
+
+
但是,它生成的随机数没有界限,而且还是小数。那么,我们可以先进行取整,再对它设置界限。Math
对象有一个函数 round()
可以对小数进行四舍五入,例如:
+
> Math. round ( 1.4 )
+< · 1
+
+> Math. round ( 1.5 )
+< · 2
+
+
自然,Math.round(Math.random())
就可以确保随机数是整数了。至于限制,可以将 Math.random()
的结果乘上 n,就可以获取 0~n 的整数。例如,Math.round(Math.random() * 7)
可以获取 0~7 的随机数。
+
查找元素 查找元素可以使用 document.querySelectorAll("")
来选择元素(选择器)。例如 document.querySelectorAll("img");
返回所有标签为 img 的元素。 例如:下面这段话的标签为 span,id 为 testsel,点击“更改文字”即可更改下面这段话。
+
+
+ 我是一段文字。
+
+ 更改文字
+
+
+
代码如下:
+
var selp = document. querySelectorAll ( "span#testsel" ) ;
+selp[ 0 ] . innerHTML = "这段文字被更改过了。" ;
+
+
实例 结合上面的内容,就可以做随机显示图片了。
+
代码是这样的:
+
var picLink = [ "https://s2.loli.net/2023/12/16/pz9HK4SACUaNoOl.jpg" , "https://s2.loli.net/2023/12/16/hNZeUdKxq79s3Rp.jpg" , "https://s2.loli.net/2023/12/16/FSTYoytCWcxhQEv.jpg" , "https://s2.loli.net/2023/12/16/8bCe5rYSxuoHKdh.jpg" , "https://s2.loli.net/2023/02/03/T1FbVC6SEgcIxzi.png" , "https://s2.loli.net/2023/12/16/onqcjm8YaxXZ4Ds.jpg" , "https://s2.loli.net/2023/12/16/qZHx9oflL4wSjuv.jpg" ] ;
+var imgSel = document. querySelectorAll ( "img#random-pic" ) ;
+var randomNumber = Math. round ( Math. random ( ) * ( picLink. length) - 1 ) ;
+imgSel[ 0 ] . src = picLink[ randomNumber] ;
+
+
+
+
+
+ 换张图片?
+
+
+
封装函数
+
+ 换张图片?
+
+
+
+
+
就改了一点点而已,代码如下:
+
function showRandomImage ( ImgArray, Selector ) {
+ var imgSel = document. querySelectorAll ( Selector) ;
+ var randomNumber = Math. round ( Math. random ( ) * ( ImgArray. length - 1 ) ) ;
+ imgSel[ 0 ] . src = ImgArray[ randomNumber] ;
+}
+
+
使用的时候,第一个参数填上图片链接的数组,第二个填上选择器。
+
如果想使用 addEventListener
可以这样使用:
+
function showRandomImage ( ImgArray, Selector ) {
+ return function ( ) {
+ var imgSel = document. querySelectorAll ( Selector) ;
+ var randomNumber = Math. round ( Math. random ( ) * ( ImgArray. length - 1 ) ) ;
+ imgSel[ 0 ] . src = ImgArray[ randomNumber] ;
+ }
+}
+
+const clkBtn = document. getElementById ( "rdm-btn" ) ;
+clkBtn. addEventListener ( "click" , showRandomImage ( imgArr, "img#random-pic2" ) , false ) ;
+
+
二次封装之后就可以正常使用。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/lianbiao/index.html b/posts/lianbiao/index.html
new file mode 100644
index 00000000..f890535f
--- /dev/null
+++ b/posts/lianbiao/index.html
@@ -0,0 +1,500 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+线性数据结构:链表的模板 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 链表类似于数组,与数组不同的是,链表可以更加方便地更改数据和删除数据。数组若想将中间的数据删除,则要非很大功夫,而链表就不同了,它的操作更加简单一些(后面说)。
+
链表的数据组可以叫做“结点”,结点分成两个部分:一个是数据域,一个是指针域,数据域存数据,指针域指向下一个结点的数据地址。正是指针域将链表的每一个结点连在了一起。这种特性有一个好处:内存地址可以不连续,而数组的内存地址是必须要连续的。 比如内存还有 2GB 空闲,我申请了一个 1GB 大的数组,理论上是可以申请下来的,但占用的内存不一定完全是连续的。假设内存被一大堆东西占用的零零碎碎:确实有 2GB,但分成 4 个 500MB,这就申请不下来。而链表呢,可以充分利用内存碎片,通过指针变量,将分开的数据连在一起。
+
+
+
普通的链表 链表还有一个好处:它是动态 的,也就是说,使用的内存想申请就申请,想销毁就销毁(C/C++中,其他语言我不确定) ,可以节约内存。 申请内存,可以用到 <malloc.h>
头文件中的 malloc()
函数,只有一个参数,填上你想要申请的内存大小(字节),可以和 sizeof
一起用。但它返回的是 void
类型,所以最好在它前面加上一个类型强制转换。而销毁内存,则可以用到这个头文件中 free()
函数,一个参数,往里面填上地址(指针变量)即可销毁,但从此不可以再调用 使用这个内存的变量,若调用会报错,需要注意。
+
无论什么链表,还要有一个头指针,以便寻找元素时更好的去找。链表的结点一般用一个结构体,结构体里面一个是数据(data
),一个是存着下一个结点数据地址的指针变量(next
)。 示例代码如下:
+
struct node
+{
+ int x;
+ node * next;
+} ;
+
+node * head;
+
+
首先说直接往末尾加上元素。先要判断链表是否为空,可以通过头指针 head
是否为空(NULL
),若是第一个便创建新结点,申请为 node
类型的大小的内存,将那个结点的数据域赋值为加上的数据,再将结点的指针域设为 NULL
(以防万一),将 head
设为新结点的地址。 否则通过指针域穷举当前指针域是否为 NULL
,也就是最后一个元素,若到了最后一个元素,则申请内存,新建结点,数据域赋值,将上一个结点的指针域赋值为当前结点数据域的地址,将打钱结点指针域设为 NULL
。 示例代码如下:
+
void push ( int data)
+{
+ if ( head == NULL )
+ {
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ head = New;
+ }
+ else
+ {
+ node * s = head;
+ while ( ( * s) . next != NULL )
+ {
+ s = ( * s) . next;
+ }
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ ( * s) . next = New;
+ }
+}
+
+
插入也差不多,穷举到目标位置,申请内存,更改指针域。访问即是穷举,顺着指针走。更改数据还要穷举,将数据域改掉就好了。重点将删除。 首先,判断删除的是否是第一个,若是则将 head
更改为下一个结点的指针域。否则穷举目标,新建一个 node
类型的零时变量,将它赋值为删除目标的下一个结点的指针域,销毁准备删除的内存,将删除的地方的指针域赋值为那个零时变量。 完整代码:
+
# include <malloc.h>
+# include <cstdio>
+using namespace std;
+
+struct node
+{
+ int x;
+ node * next;
+} ;
+
+node * head;
+
+void push ( int data)
+{
+ if ( head == NULL )
+ {
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ head = New;
+ }
+ else
+ {
+ node * s = head;
+ while ( ( * s) . next != NULL )
+ {
+ s = ( * s) . next;
+ }
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ ( * s) . next = New;
+ }
+}
+void insert ( int x, int y)
+{
+ node * s = head;
+ y-- ;
+ while ( y)
+ {
+ s = ( * s) . next;
+ y-- ;
+ }
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = x;
+ ( * New) . next = ( * s) . next;
+ ( * s) . next = New;
+}
+int find ( int x)
+{
+ node * s = head;
+ x-- ;
+ while ( x)
+ {
+ s = ( * s) . next;
+ x-- ;
+ }
+ return ( * s) . x;
+}
+void update ( int x, int y)
+{
+ node * s = head;
+ x-- ;
+ while ( x)
+ {
+ s = ( * s) . next;
+ x-- ;
+ }
+ ( * s) . x = y;
+}
+void deletes ( int x)
+{
+ if ( x == 1 )
+ {
+ head = ( * head) . next;
+ return ;
+ }
+ node * s = head;
+ x-- ;
+ x-- ;
+ while ( x-- )
+ {
+ s = ( * s) . next;
+ x-- ;
+ }
+ node * t = ( * ( ( * s) . next) ) . next;
+ free ( ( * s) . next) ;
+ ( * s) . next = t;
+}
+
+int main ( )
+{
+ push ( 100 ) ;
+ push ( 200 ) ;
+ insert ( 300 , 1 ) ;
+ printf ( "first:%d, second:%d, third:%d\n" , find ( 1 ) , find ( 2 ) , find ( 3 ) ) ;
+ deletes ( 1 ) ;
+ insert ( 400 , 1 ) ;
+ printf ( "first:%d, second:%d, third:%d\n" , find ( 1 ) , find ( 2 ) , find ( 3 ) ) ;
+ return 0 ;
+}
+
+
虽然代码注释讲了,为了更清楚,再说一遍输出:
+
first:100, second:300, third:200
+first:300, second:400, third:200
+
附演示: https://visualgo.net/zh/list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/namespace/index.html b/posts/namespace/index.html
new file mode 100644
index 00000000..96f0e542
--- /dev/null
+++ b/posts/namespace/index.html
@@ -0,0 +1,395 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+命名空间 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C++命名空间的概念 在同一个作用域中,不同的数据不能起同一个名字 ,但是C++命名空间概念的出现,提供了解决问题的方案。在不同的命名空间中,可以随意定义相同的名字。命名空间就是为了避免你包含的头文件中与你自己定义的任意类,数据,函数重名,造成令人迷惑的错误而产生的。
+
+
+
定义命名空间 我们可以自己定义一个命名空间,并且使用它。定义命名空间使用 namespace
关键字,使用命名空间使用 namespace::subject
使用命名空间中的函数,数据等。例如:
+
# include <stdio.h>
+
+namespace mylib
+{
+ int a = 1 , b = 2 , c = 3 ;
+ void hello ( )
+ {
+ printf ( "Hello World!\n" ) ;
+ }
+}
+namespace libbb
+{
+ int a = 10 , b = 20 , c = 30 ;
+ void hello ( )
+ {
+ printf ( "HELLO WORLD!!!!\n" ) ;
+ }
+}
+
+int main ( )
+{
+ printf ( "%d %d %d\n" , mylib:: a, mylib:: b, mylib:: c) ;
+ printf ( "%d %d %d\n" , libbb:: a, libbb:: b, libbb:: c) ;
+ mylib:: hello ( ) ;
+ libbb:: hello ( ) ;
+
+ return 0 ;
+}
+
+
输出 1 2 3\n 10 20 30\n Hello World!\n HELLO WORLD!!!!\n
。在命名空间 $mylib$ 和 $libbb$ 中,三个变量和一个函数的名字相同,但是所调用的命名空间不同,结果也不一样。
+
在C++中,大部分函数都在命名空间 $std$ 中,全称 $stdandard$ 。
+
using
使用命名空间在上段程序中,我们可以在包含头文件后加入几句:
+
using namespace mylib ;
+
+
这样 $mylib$ 命名空间里的 $a ~ b ~ c ~ hello()$ 可以直接写为它原本的样子,不用加上 mylib::
。这很方便。但是这种方法也有他的局限性,比如我再加入一句:
+
using libbb:: a ;
+
+
这样 $libbb$ 命名空间里的 $a$ 使用时也不用加上 libbb::
了。但是再次出现了两个同样的 $a$ ,谁也分不清使用的到底是 $mylib$ 命名空间里的 $a$ 还是 $libbb$ 命名空间里的 $a$ ,因此会引发错误,这也是 using
的弊端。但是有时候只会用到一个命名空间里的东西时,就比如 $std$ ,就可以直接加上一句 using namespace std ;
这样子更方便,省的 cin
也要 std::
, string
也要 std
。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/qianzhuihe/index.html b/posts/qianzhuihe/index.html
new file mode 100644
index 00000000..7cc08907
--- /dev/null
+++ b/posts/qianzhuihe/index.html
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+前缀和 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 开始 前缀和是一种优化算法 ,用于求区间和。若数据范围特别大,写 for
循环很可能会爆时间复杂度,就可以用上前缀和了。前缀和有一维前缀和 和二维前缀和 ,我暂时还没有学二位前缀和,故在此不多赘述。
+
使用 一维前缀和需要把一个数组比如数组 $a[0]$ 到 $a[n]$ ($n$ 为 $a$ 数组长度 $-1$ )储存到另一个数组中比如 数组 $b$。那么:$\sum_{i = 1}^{a[i]} b[i]$
+
+
+
我们发现: $$ b[1] = a[1] \ $$ $$ b[2] = a[1] + a[2] \ $$ $$ b[3] = a[1] + a[2] + a[3] \ $$ $$ … \ $$ $$ b[i - 1] = a[1] + a[2] + … + a[i - 1] \ $$ $$ b[i] = a[1] + a[2] + … + a[i - 1] + a[i] $$ 这正好是一个递推 的过程,$b[1] = a[1],, b[2] = b[2] + a[2]…$
+
同时,若 $l$ 为左边界, $r$ 为又边界,$b[r] - b[l - 1] = a[r]$ 到 $a[l]$ 的区间和。
+
例题 前缀和模板 题目描述 给出一个数字$n$表示有个数字,
+
给出$n$个整数$a_1$,$a_2$,…$a_n$;
+
给出一个数字$m$ 有$m$个询问: 每次询问给出两个整数$s$,$e$,请求出 $a_s + a_{s+1}…a_e$
+
输入格式 第一行一个整数$n$
+
第二行$n$个整数$a_1$,$a_2$,…$a_n$;
+
第三行一个整数$m$
+
随后m行每行两个整数 s,e,($e >= s$)
+
输出格式 m个整数,每一个换一行
+
样例 #1 样例输入 #1 5
+1 2 3 4 5
+3
+1 2
+2 3
+1 5
+
+
样例输出 #1 3
+5
+15
+
+
提示 $n <= 10^5$,$a_i <= 10^4$。
+
+
这道题目应该这样写:
+
# include <cstdio>
+using namespace std ;
+
+int a[ 100001 ] , b[ 100001 ] ;
+int n, m ;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ b[ 1 ] = a[ 1 ] ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ b[ i + 1 ] += b[ i] + a[ i + 1 ] ;
+ }
+
+ scanf ( "%d" , & m) ;
+ for ( int i = 1 ; i <= m; i ++ )
+ {
+ int s, e ;
+ scanf ( "%d %d" , & s, & e) ;
+ printf ( "%d\n" , b[ e] - b[ s - 1 ] ) ;
+ }
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/recursion/index.html b/posts/recursion/index.html
new file mode 100644
index 00000000..03f25a23
--- /dev/null
+++ b/posts/recursion/index.html
@@ -0,0 +1,570 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+递归 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+写递归的要点 明白一个函数的作用并相信它能完成这个任务,千万不要跳进这个函数里面企图探究更多细节, 否则就会陷入无穷的细节无法自拔,人脑能压几个栈啊。—— OI-wiki
+
+
递归,就是一个函数自身调用自身。递归起到类似与循环的效果。但是,与循环不同,递归可以分支 。如果循环一定是一条直线,那么递归可能是树形结构。
+
循环 -> 递归 前面说了,循环和递归很像。那么,我们可以将 for
循环尝试转为递归。先来一个循环的示例:
+
for ( int i = 1 ; i <= n; i++ )
+{
+ printf ( "qwq, %d\n" , n) ;
+}
+
+
首先,让我们来想一想,for
循环的括号中 3 个语句分别是干什么的呢?
+
+int i = 1;
这是循环的初始化 ,定义了一个变量 $i$,将其赋值为 $1$。
+i <= n;
这是循环每次进行下去的条件 ,当 $i>n$ 时即退出循环。
+i++
这是循环每次结束后干的事 ,当执行完循环体时, $i$ 则加 $1$。
+
+
这样回忆下来,可以发现,在 for
循环的括号中 3 个语句其实可以拆分出来。 如下:
+
int i = 1 ;
+for ( ; ; )
+{
+ if ( i > n) break ;
+ printf ( "qwq, %d\n" , n) ;
+ i++ ;
+}
+
+
那么,直接将 for( ; ; )
改一下就好了吧?就像这样子:
+
int i = 1 ;
+void rcsn ( )
+{
+ if ( i > n) break ;
+ printf ( "qwq, %d\n" , n) ;
+ i++ ;
+}
+
等等,只将 for( ; ; )
改为 void rcsn()
似乎不太对,少了什么语句,函数不会自动循环(递归)啊。还有,函数哪儿来的 break;
? 是的,递归,就是要自己调用自己。函数的结束,是该使用 return
。应该这样修改:
+
int i = 1;
+void rcsn()
+{
+- if(i > n) break;
+ + if(i > n) return;
+ printf("qwq, %d\n", n);
+ i++ ;
+ + rcsn();
+ }
+
好了,这样就可以完整地运行了:
+
# include <stdio.h>
+
+int n;
+int i = 1 ;
+void rcsn ( )
+{
+ if ( i > n) return ;
+ printf ( "qwq, %d\n" , n) ;
+ i++ ;
+ rcsn ( ) ;
+}
+
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ rcsn ( ) ;
+}
+
+
递归的分步思想 前面说了,递归是可以分支的。那么,它其实比循环方便的多。就比如说,输入一个整数 $n$,按照字典序输出 $1 \sim n$ 数字不重复的排列。$1 \le n \le 9$。
+
总不可能用 if
一个一个判断,然后来一个“循环 $n$ 嵌套”吧。而递归是可分支 的。可以创建一个递归函数,在递归中使用 for
循环确定递归次数。用一个数组记录是否重复。代码如下:
+
# include <iostream>
+using namespace std;
+
+int n;
+bool flag[ 12 ] ;
+int a[ 15 ] ;
+
+void dg ( int id)
+{
+ if ( id > n)
+ {
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ cout << " " << a[ i] ;
+ }
+ cout << endl;
+ return ;
+ }
+
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ if ( flag[ i] ) continue ;
+
+ flag[ i] = 1 ;
+ a[ id] = i;
+ dg ( id + 1 ) ;
+ flag[ i] = 0 ;
+ }
+}
+
+int main ( )
+{
+ ios:: sync_with_stdio ( false ) ;
+ cin >> n;
+ dg ( 1 ) ;
+
+ return 0 ;
+}
+
+
但是,递归并不是刚完成就返回,而是完成了整个分支 才返回。以 $n=3$ 为例,画个上面那个递归函数的图: (说明:圆圈中的数字是前进的顺序,从小到大;实线箭头和虚线箭头先走实线,走完以后再走虚线;箭头上的数字代表输出的值。
+
递归的分治思想 分治,就是将一个问题分解为多个问题,然后再进行解决。用咱们老师的一个词概括,就是:
+
+分而治之
+
+
举个例子:一件工程做 100 个零件,接活的找了 10 个人帮忙,那 10 个人又去找了 10 个人,每一组的 10 个人做完了向上头汇报,上头 10 个人又向接活的人汇报。 这其实就是一个递归分治的过程,这么一个例子体现了分治的基本步骤:
+
+分解 :“接活的找了 10 个人帮忙,那 10 个人又去找了 10 个人” -> 将原问题分解成子问题
+解决 :“每一组的 10 个人做完了” -> 子问题独立求解
+合并 :“(10 个人做完了)向上头汇报,上头 10 个人又向接活的人汇报。” -> 将子问题合并为原问题
+
+
当分解到指定条件时,就开始解决——通常是直接返回特定的数据。
+
题目举例:CodeForces 1829D 这道题目要分解为两个任务,第一是总金币数的三分之一,第二是总金币数的三分之二。分解停止开始解决的的条件有三个,分别是 $x==m$(符合条件),$x<m$(不符合条件),$x % 3 \ne 0$(不符合条件)。 可以这样想:若符合条件返回 $1$,不符合返回 $0$,将返回结果相加。若最终结果大于零,输出 YES
,否则输出 NO
。 代码如下:
+
# include <cstdio>
+using namespace std;
+
+int n, m;
+int t;
+
+int dg ( int x)
+{
+ if ( x == m) return 1 ;
+ if ( x < m || x % 3 != 0 ) return 0 ;
+
+
+ int ans1 = dg ( x / 3 ) ;
+ int ans2 = dg ( x / 3 * 2 ) ;
+
+
+ return ans1 + ans2;
+}
+
+int main ( )
+{
+ scanf ( "%d" , & t) ;
+
+ for ( int i = 1 ; i <= t; i++ )
+ {
+ scanf ( "%d %d" , & n, & m) ;
+
+ int ans = dg ( n) ;
+
+ if ( ans > 0 ) printf ( "YES\n" ) ;
+ else printf ( "NO\n" ) ;
+ }
+
+ return 0 ;
+}
+
+
剪枝 题外话:感觉和递归有关的分类都一团乱了,感觉 DFS 原本应该放在同一篇文章里的,剪枝和分治也应该独立说一篇。
+
简短的概述: 可以说,递归也就是暴力 。暴力有两个代名词:枚举、递归。同枚举差不多,递归也有优化的方案,那就是剪枝 。剪枝,顾名思义,就是把不需要的分支剪掉,把不可能的选项排除,在递归中,可以大大提升运行速度。
+
题目举例:洛谷 P1219 这道题目是 DFS 中比较经典的八皇后问题。在每行、每列、每个对角线上都只能有一个棋子(皇后)。那么,以下剪枝的几点可以确定:
+
+当这一行放过以后,就开始放下一行,将这一行排除。
+当这一列放过以后,就将这一列打上标记,不再将棋子放在这一列。
+这一个对角线放过后,打上标记,不再将棋子放到对角线上
+
+
但是,对角线的标记比较难弄,对角线似乎无法打标记。对角线的标记并不是无解,对角线的 (x,y) 是有规律的。引用原文图片来找规律。先看右斜的对角线有什么规律: 可以看到,中间一条蓝色的线对应圈起来的坐标,(3,3) (5,5);靠左一条蓝色的线对应划线的坐标,(4,2) (6,4)。不难看出,$3-3=0=5-5=0; \hspace{5px} 4-2=2=6-4=2$。可见,同一条右斜对角线上,x 坐标减 y 坐标的绝对值相等。但是相对的对角线上x 坐标减 y 坐标的绝对值也一样,这就比较麻烦。C++ 不能用负数,也不能两条对角线都是同一个标记。老师给了我们一个办法,将他们的差加上 20(别的数也行),问题就解决了。再看左斜的对角线有什么规律: 同上,中间一条对应 (2,5) (5,2),左上一条对应 (1,3) (3,1)。与右斜的对角线不同,它们不是差有规律而是和有规律。$2+5=7=5+2=7; \hspace{5px} 1+3=4=3+1=4$。那么,打标记时将 x+y 作为下标即可。
+
加上深搜 ,代码就出来了:
+
# include <cstdio>
+using namespace std;
+
+bool flagy[ 50 ] , flagzx[ 50 ] , flagyx[ 50 ] ;
+int sum = 0 ;
+int n;
+int s[ 50 ] ;
+
+void dfs ( int x)
+{
+ if ( x == n + 1 )
+ {
+ sum++ ;
+ if ( sum <= 3 )
+ {
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ printf ( "%d " , s[ i] ) ;
+ }
+ printf ( "\n" ) ;
+ }
+ return ;
+ }
+
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ if ( flagy[ i] == 0 && flagzx[ x + i] == 0 && flagyx[ x - i + 20 ] == 0 )
+ {
+ flagy[ i] = 1 ;
+ flagzx[ x + i] = 1 ;
+ flagyx[ x - i + 20 ] = 1 ;
+ s[ x] = i;
+ dfs ( x + 1 ) ;
+ flagy[ i] = 0 ;
+ flagzx[ x + i] = 0 ;
+ flagyx[ x - i + 20 ] = 0 ;
+ }
+ }
+}
+
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+
+ dfs ( 1 ) ;
+ printf ( "%d\n" , sum) ;
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/seventh-lianbi/index.html b/posts/seventh-lianbi/index.html
new file mode 100644
index 00000000..5865eb2a
--- /dev/null
+++ b/posts/seventh-lianbi/index.html
@@ -0,0 +1,431 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+一些随笔记录和想法 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
写在前面的废话: 又是一篇分类于“琐碎”的文章。 加上这篇文章,这个分类下才有三篇文章。想来这个博客在运行 hexo init
之初,我就没想过写生活向的文章。如今“琐碎”下,一篇是画,两篇是作文收集,勉强算是透露了点生活向。 想想自己喜欢的,是 HTML, CSS, JavaScript 给我带来的样式美化 、多样性 和自主性 。不然我怎么不记到 .txt 里呢?也不知初衷是什么,唉,这样弄又有些喧宾夺主了。多年后看到,也就微微一笑,笑自己写出的东西古怪? 吧。
+
+
+
下面,红字和红色波浪线都是老师做的标记。红字是批语。红线大概是老师认为有想法的句子吧。按时间排序的文章:
+
一 记录
+ 运动会跳高随记
+ 我在操场上观看男子跳高。哪怕只讲跳高场地的气氛也是十分紧张激烈得了。运动员刚跳完,学生裁判和助理就飞快地冲上去把杆子重新架好,再用手推或脚踢将软垫重新压紧实,另一位运动员又跑步向前,一跃而起,脸上带着坚定和紧张。节奏之快,把观众观赛的热情都点燃了。
+ 这时,一位跳高运动员吸引了我的注意。根据他服装上的号码牌,我得知他是四班的一名运动员。他起跳了,但没有跳过,带着杆子跌向软垫。我感觉,他脸上写满不甘心与不服输,他和教师裁判要求再跳一遍。于是,我看到他咬紧牙关,再次冲向调高杆,似乎把腿尽可能地抬高,落向软垫——但他又失败了,脚带动杆子滑落下来,杆子落到地上发出哗啦一声。这声音对他来说可能是震天动地的,意味着失败的响声。我看到他再一次向裁判要求重新跳。我从我们班作为跳高裁判助理的施同学口中得知,如果失败,这次起跳是最后一次了。忽地,我联想到了一个人的坚定和决绝,这是不太容易做到的。这一次,他像鸟儿一样轻捷,越过杆子,似乎还有些紧张,但稳稳地落到软垫上,他成功了。
+ 我知道,在把杆子升高增加难度后,他最后一次失败了,退出了比追逐战还要激烈的跳高比赛。但能这样重复要求重新跳一次,连续跳三次的精神已经很好了,这是运动员的精神,因而留给我很深的印象。我坐在看台上喝奶茶时想到,尽管他是四班的,而我是三班的人。
+ 运动精神感染每一个人.
+
+
+
想法 这篇文章是开完运动会老师叫写的(废话)。个人认为这届初中运动会不如小学的时候有那种热情、激动、高兴等等开运动会的感觉了。一方面因为延期 和运动会时间的缩短 ,更重要的另一方面运动会项目减少 、就在一个操场 看、不写通讯稿 ,对于我来说乐趣 都没了。这篇作文 30% 都不算真实感受。 至于真实事件,主要是因为有同班同学在跳高场地那儿当助理(也就是扶扶杆子)便跑到那儿和同学聊聊天。男子跳高我们班没人参加,去那儿只为聊天 (还顺便当好人帮同学扔橘子皮?)。四班体委跳高,看了看,感觉那种跳了三次的事件适合写到作文里,回家一想到就写了。
+
至于老师的评语嘛,原话是这样写的 ,也不知道老师写这个是不是想到了什么。大概没什么别的深意。
+
题外话: 那天有奶茶和泡芙供应,只喝了一瓶不知名品牌普通奶茶,味道还好。其他同学吃喝也蛮开心的。
+
二 记录
+ 周五那些琐碎事
+ 此刻,我正坐在微格教室里,写这篇随记。自修的时间大家都很安静,只有教室里不知什么设备发出低沉且有规律的“咚咚”声,正是回忆和写作的耗时间,想想在一个半小时之前发生的琐事,我想。
+ 下午,五点,同学们乱哄哄地换完了座位,准备排队出校。而包括我的四个人却还要留在学校里,这真的是一种很奇特的感觉,我在独自去往食堂时想到。几个同学吃完了饭回到教室,有打扫一会儿卫生才去微格教室准备上课。来到微格教室,看到教室的布局,让我想到了母校的微格教室,给人一种很宁静的感觉。原本着急上完课,着急回家的心绪也平静下来。在现在想,大概是这种平静才是名词里“素养”与“提升”的感觉,竟有一种置身世外的超然感。
+ 这次科学老师上课,居然没有数学课那样急切,没有争分夺秒的感觉,甚至没有往常的节奏快。不知是我心里的主观认为还是微格教室的影响。还是给人一种宁静感,甚至悠闲,但又不是。现在想,那种感觉确实是安心学习的基础啊,不急功近利,而是宁静平和,甚至有限,轻松,太急躁反而容易犯错呢。我想。
+ 平时的课一般上一个小时,数学课通常还要拖几分钟,因为任务太多了。但这次不一样,宁静的教室,没有是么非常紧迫的任务。科学老师只上了半个小时的课,刚好在第一节晚自习一半的铃声响起时讲完了作业,剩下的时间老师让我们自修。一切都是平静的。于是,我开始写随记,也就是开头呈现的景象,一切都给人以平静,安静的感觉。
+ 想着想着,自修已经到了末尾,班里的同学开始吵闹起来,打破了原有的宁静,以及原有的那份奇特的心境。我意识到,我还要进行枯燥、有条不紊、节奏快的生活。生活的节奏很快,这种宁静是很难再找到了。我想找一句话来总结我的所思所想所写,但周围不再宁静,脑海中全是纷乱的思绪,如同一大片散乱的拼图,十分烦躁。突然几句话拨开纷乱的拼图“夫学须静也,才须学也。”“淫慢则不能励精,险躁则不能治性”。是的,无论干什么,都需要平静,需要宁静专一。宁静,不仅让人放松,还让人奋斗。
+ 正准备盖上笔合上本子,却又有一个想法冒出来,我翻到前面看了看开头的自己,抿嘴笑了,添上一句话:
+ 从本文开头到结尾,细微的自己变化和涂改状况能看出,这间教室和我在写这篇文章时的宁静与否吧?
+ “静能生慧”,一直觉得你是个能 “沉得住气”的孩子,很棒哦!
+
+
+
想法 因为那天开家长会,照理说是所有学生都不用上晚自习 五点就回家的。但是我非常遗憾地参加了光明优倍 鲜牛奶班培优班 ,得继续留在学校,上一个小时的培优班 ,再写作业写到八点晚自习放学。就感觉很离谱,吐槽一下。 实际上,我们四个培优班 的同学吃完了饭确实受老师委托 回到教室打扫卫生,才去的微格教室。平常的课都在二班旁边的普通教室上,这次去微格教室大概是为了不打扰家长会 吧。 那天语文课和科学课换了,上的是科学课。老师说就讲三十分钟作业,剩下时间自修,就那样做了。我大概写了五十分钟的其他作业,剩下的时间都拿来写上面这篇作文了。当时想不到写什么好,干脆直接写当时场景了 。其实也是想在作文里“诉说不易”吧。
+
至于老师的评价。。。很难确定老师理解到的是我想写什么,甚至连我自己也不清楚了。也不知道老师为什么评价的字写得比上一篇大。
+
附:真不想写“培优班 ”三个字。
+
三 地名替换
+
原作文中有真实地名,为了避免泄露信息,使用划掉的“占位”进行了替换。 显示为这样:
+
占位
+
+
记录
+ 占位旅途记
+ 在占位,说起占位岛就让人想起连接占位岛与大陆的那座桥和“海洋”这个字眼来。又是两天后,坐在教室里,细细地回想两到四天前的事。
+ 海洋和桥,自然是在路上看到的。从占位海边到占位岛上的路就值得一提。经过(占位占线)和占位占路,我看到了海、海港和船只。基本只在城区待着的我没见过这般略显壮观的景象,立刻被吸引了:一排排轮船靠在岸边,船身下的水些许浑黄,仿佛同船一起睡着。海港在休息,但不减其威严气势,自然很引人注目。 和庞大的轮船与广阔无垠的海比起来,“小”客车自然没趣。突然间想到“海洋文化”正是这种意蕴。客车走上山路,越走越高。刹那间,眼前凭空出现一座仿佛横跨海面的桥。我的目光立刻又被桥捉了去。桥的支点是在两边的山上的,桥下面没有柱子支撑,所以看起来仿佛悬浮在海面上,桥也很高。车接近了桥,越发显得小了。还没上桥,就已觉得桥下海之广袤。走在桥上,仿佛神话中天神自由在空中行走,越过海洋。
+ 过了桥,便上了岛。又走了一会儿,到了活动基地。基地中发生的事反而没让我想到大海的悠远,似乎没什么特别让人印象深刻的事。海边桥上车中,自我上的一节课更让我印象深刻得多。
+ 海的广阔,如广阔得胸怀,容纳着船只和桥。船只和桥也容纳着其他事物。它们相互包容,相对广阔包容相对渺小的。这是海洋的精神: 包容。同样地,我们也得学习传承海洋文化精神。想来,这也算是占位之旅给我带来的收获——包容和责任。
+ 多去外面走走,会有记很多不一样 的启示.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/shaifa/index.html b/posts/shaifa/index.html
new file mode 100644
index 00000000..e93cf013
--- /dev/null
+++ b/posts/shaifa/index.html
@@ -0,0 +1,471 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+数论:质数筛法 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 筛法 是快速找出质数的一种方法。平常没有使用任何筛法的的找质数的时间复杂度通常为 $O(\sqrt n)$,比较慢,但是筛法更快一些。我们学的筛法是埃氏筛和欧拉筛(线性筛)。 平常的找质数方法是判断一个数是否能被 1 和它本生以外的数整除,但是筛法的思想不一样。筛法可以说是通常方法的逆向思维,挨个儿寻找当前数的倍数,打上标记,再继续寻找,最后没有被打上标记的就是质数。这种思想的时间复杂度快很多。
+
+
+
埃氏筛 埃氏筛 ,全称其实是**埃拉托斯特尼筛法 (Eratosthenes)**。它的时间复杂度为 $O(n \log_2 \log_2 n)$,其实也就是刚才说的方法。这里放一个演示:
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 这是初始的表
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 筛掉了 4 6 8 10 12 14 16 18 20,2 是质数
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 3 筛掉了 6 9 12 15 18,3 是质数
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 筛掉了 10 15 20,其实 5 已经大于 根号 20,剩下的数都是质数,可以退出了,但在这儿继续演示下去
+
+ -------------------- break; -------------------- 实际循环已经在这儿之前就退出了,但这里继续演示下去
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 7 筛掉了 14,7 是质数
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 11 13 17 19 的倍数都不在数列中,它们都是倍数
+
+
+
最终,筛选出了 2 3 5 7 11 13 17 19
这 8 个质数。
+
埃氏筛的代码也比较简单:
+
# include <cstdio>
+using namespace std;
+
+const int TEMP = 1e6 + 3 ;
+int flag[ TEMP] ;
+void is_prime ( int n)
+{
+ for ( int i = 2 ; i * i <= n; i++ )
+ {
+ if ( flag[ i] == 0 )
+ {
+ for ( int j = i * 2 ; j <= n; j += i)
+ {
+ flag[ j] = 1 ;
+ }
+ }
+ }
+}
+
+int main ( )
+{
+ int n;
+ scanf ( "%d" , & n) ;
+ is_prime ( n) ;
+ FILE * fp = freopen ( "./ans.txt" , "w" , stdout ) ;
+ for ( int i = 2 ; i <= n; i++ )
+ {
+ if ( flag[ i] == 0 )
+ {
+ printf ( "%d\n" , i) ;
+ }
+ }
+ fclose ( fp) ;
+}
+
+
埃氏筛很快,上面数据 1000000 的代码一下就好了。 更具体的,可以去看一下 OI Wiki 。
+
线性筛 线性筛也叫欧拉筛 ,它的出现就是为了找到比埃氏筛还要快的筛法,是由欧拉发现的。在埃氏筛中,一个数可能会被筛很多次,上面的演示也表现出来了。而线性筛每个数只会筛一次,是 $O(n)$ 的时间复杂度。只不过一般来说埃氏筛也够用,一些卡掉埃氏筛的毒瘤数据除外,例如 洛谷 P3383 。
+
就按照 洛谷 P3383 来,代码是这样的:
+
# include <cstdio>
+using namespace std;
+
+const int TEMP = 1e8 + 12 ;
+bool vis[ TEMP] ;
+int pri[ TEMP] , cnt = 0 ;
+void is_prime ( int n)
+{
+ for ( int i = 2 ; i < n; ++ i)
+ {
+ if ( ! vis[ i] )
+ {
+ pri[ cnt++ ] = i;
+ }
+ for ( int j = 0 ; j < cnt; ++ j)
+ {
+ if ( i * pri[ j] >= n)
+ {
+ break ;
+ }
+ vis[ i * pri[ j] ] = 1 ;
+ if ( i % pri[ j] == 0 )
+ {
+ break ;
+ }
+ }
+ }
+}
+
+
+int ns, q;
+int ans[ TEMP] ;
+int main ( )
+{
+ scanf ( "%d %d" , & ns, & q) ;
+ is_prime ( ns) ;
+
+
+
+
+
+
+
+
+
+
+
+ for ( int i = 1 ; i <= q; i++ )
+ {
+ int temp;
+ scanf ( "%d" , & temp) ;
+ printf ( "%d\n" , pri[ temp - 1 ] ) ;
+ }
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/shijianfuzaduhekongjianfuzadu/index.html b/posts/shijianfuzaduhekongjianfuzadu/index.html
new file mode 100644
index 00000000..99a4e7ee
--- /dev/null
+++ b/posts/shijianfuzaduhekongjianfuzadu/index.html
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+时间复杂度和空间复杂度 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 时间复杂度 时间复杂度,就是电脑运行一段程序所需要的时间 。
+
另外,电脑每秒可以运行1e8
次。($x$ e $y$代表$x$乘10的$y$次方,即100000000
次)
+
时间复杂度记作$O$(n)。
+
+
普通的时间复杂度**(常数时间)**记作$O$(1),为一段最简单的程序的时间复杂度。
+
如以下程序的时间复杂度为$O$(1):
+
# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ int n ;
+
+ return 0 ;
+}
+
+
没错,什么都没有干,只创建了一个变量。
+
+
+
+
其他时间复杂度(我所知道的很少,只会O(n^n)
),有几个循环时间复杂度就为^n。
+
如以下程序的时间复杂度为$O$(i^2^)
+
# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ for ( int i = 0 ; i < 10 ; i ++ )
+ {
+ for ( int j = 0 ; j < 10 ; j ++ )
+ {
+ printf ( "%d" , i) ;
+ }
+ }
+
+ return 0 ;
+}
+
+
+
老师的练习:
+
U262459 数位和3 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
+
注意注意:
+
这道题的数据范围很大,($0\le x \le10^6$),双重循环直接炸。($O$(1000000^2^))
+
所以需要:
+
记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
+
空间复杂度 和时间复杂度差不多,只不过这个是和内存 有关的。
+
不多讲了。就比如:
+
# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ int a[ 100 ] ;
+
+ return 0 ;
+}
+
+
这里,我们定义了一个类型为int
的数组,int
占4字节,产生的空间就为$4 * 1000$字节。
+
这就是空间复杂度 。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/sort/index.html b/posts/sort/index.html
new file mode 100644
index 00000000..104073e3
--- /dev/null
+++ b/posts/sort/index.html
@@ -0,0 +1,646 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+排序 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 一些说在前面的要点
+稳定性
+在我们以下学过的排序算法中,只有选择排序 不是稳定的。
+稳定性,就是有两个相同的数字,在排序后两个数字的相对位置不变。(前面的在前面,后面的在后面)
+
+
+逆序对
+前面的一个数字大于后面一个数字,这就叫做逆序对。
+例如 $5\ 1\ 2\ 3\ 4$ 中,有 $4$ 对逆序对。
+
+
+
+
+
+
选择排序 简介 选择排序 ,顾名思义,就是选出所有元素中最小的元素,然后再放到前面。这个排序非常好理解,但是,时间复杂度为 $O(n^2)$ ,数据一大就要炸了。( $n$ 为数组长度)
+
我们可以使用一个变量来记录其中一个最小数的下标,然后再进行第一个数与最小的数的交换。 由于不断地将最小的数往前放,最终完成排序。但由于第 $i$ 次遍历之后,第 $i$ 个元素就是最小的元素,因此由 $i + 1$ 个元素开始判断。
+
例子 例如有这样一个数组:
+
$$ 8 \ 5 \ 7 \ 9 \ 2 \ 6 $$
+
遍历后得知 $2$ 是最小的,与第一个元素 $8$ 进行交换。
+
$$ {\color{red}2} \ 5 \ 7 \ 9 \ {\color{red}8} \ 6 $$
+
以此类推:
+
$$ {\color{green}2} \ {\color{red}5} \ 7 \ 9 \ 8 \ 6 \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{red}6} \ 9 \ 8 \ {\color{red}7} \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{red}7} \ 8 \ {\color{red}9} \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ 9 \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ $$
+
示例程序 # include <cstdio>
+using namespace std ;
+
+int n, a[ 3002 ] ;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ for ( int i = 1 ; i <= n - 1 ; i ++ )
+ {
+ int th = i ;
+ for ( int j = i; j <= n; j ++ )
+ {
+ if ( a[ th] > a[ j] )
+ {
+ th = j ;
+ }
+ }
+ int temp = a[ i] ;
+ a[ i] = a[ th] ;
+ a[ th] = temp ;
+ }
+
+
+ for ( int i = 1 ; i <= n; i ++ ) { printf ( "%d " , a[ i] ) ; }
+ printf ( "\n" ) ;
+
+ return 0 ;
+}
+
+
演示网址 演示网址:https://visualgo.net/zh/sorting?slide=8
+
冒泡排序 简介 冒泡排序 ,将前面一个元素和后面一个元素做对比,若前面的元素大于后面的元素即进行交换。时间复杂度也为 $O(n^2)$。
+
由于不断地将前一个元素大于后一个元素的一组交换,假设数组中有 $n$ 个元素,第 $i$ 次遍历后,第 $n$ 个元素就是最大的数,因此下一次遍历由 $i$ 至 $n - i$ 。
+
例子 还是上面的那个例子,利用冒泡排序:
+
$$ 8 \ 5 \ 7 \ 9 \ 2 \ 6 \ \ \ $$ $$ {\color{red}5} \ {\color{red}8} \ 7 \ 9 \ 2 \ 6 \ \ $$ $$ 5 \ {\color{red}7} \ {\color{red}8} \ 9 \ 2 \ 6 \ \ $$ $$ 5 \ 7 \ {\color{red}8} \ {\color{red}9} \ 2 \ 6 \ \ $$ $$ 5 \ 7 \ 8 \ {\color{red}2} \ {\color{red}9} \ 6 \ \ $$ $$ 5 \ 7 \ 8 \ 2 \ {\color{red}6} \ {\color{red}9} \ \ $$ $$ {\color{red}5} \ {\color{red}7} \ 8 \ 2 \ 6 \ {\color{green}9} \ \ $$ $$ 5 \ {\color{red}7} \ {\color{red}8} \ 2 \ 6 \ {\color{green}9} \ \ $$ $$ 5 \ 7 \ {\color{red}2} \ {\color{red}8} \ 6 \ {\color{green}9} \ \ $$ $$ 5 \ 7 \ 2 \ {\color{red}6} \ {\color{red}8} \ {\color{green}9} \ \ $$ $$ {\color{red}5} \ {\color{red}7} \ 2 \ 6 \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ 5 \ {\color{red}2} \ {\color{red}7} \ 6 \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ 5 \ 2 \ {\color{red}6} \ {\color{red}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ {\color{red}2} \ {\color{red}5} \ 6 \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ 2 \ {\color{red}5} \ {\color{red}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ {\color{red}2} \ {\color{red}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$
+
示例程序 # include <cstdio>
+using namespace std ;
+
+int n, a[ 3002 ] ;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ for ( int j = 1 ; j <= n - 1 ; j ++ )
+ {
+ for ( int i = 1 ; i <= n - j; i ++ )
+ {
+ if ( a[ i] > a[ i + 1 ] )
+ {
+ int t = a[ i] ;
+ a[ i] = a[ i + 1 ] ;
+ a[ i + 1 ] = t ;
+ }
+ }
+ }
+
+
+
+ for ( int i = 1 ; i <= n; i ++ ) { printf ( "%d " , a[ i] ) ; }
+
+ return 0 ;
+}
+
+
演示网址 演示网址:https://visualgo.net/zh/sorting?slide=7
+
插入排序 简介 插入排序 ,是在冒泡排序的基础上做的改进。它将整个数列分为两个部分:已排序的与未排序的。
+
由于一个数本身就没有任何顺序,所以我们可以假设元素 $a[1]$ (假设 $1$ 为数组第一个元素)就是一个已经排列好的数列。 随后,将 $a[2]$ 插入进已排序好的数列中。若 $a[2] > a[1]$ 则不交换,否则则交换。这就是一个循环的过程。插入进已排列好的数列中时,这个比较就是冒泡排序的过程:
+
+将前面一个元素和后面一个元素做对比,若前面的元素大于后面的元素即进行交换。
+
+
例子 依然是前面那个样例,在这里,我们假设有一个空间是已排序空序列,另一个是未排序序列。
+
$$ \boxed{ \begin{aligned} &\text{说明:}\\ &? \ \text{代表未排序序列} \\ &! \ \text{代表已排序序列} \\ \end{aligned} } $$
+
$$ \begin{aligned} ? \ &8 \ 5 \ 7 \ 9 \ 2 \ 6 \ \\ ! \ &[Empty] \\ \\
+
? \ &5 \ 7 \ 9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}8} \\ \\
+
? \ &7 \ 9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}8} \ {\color{yellow}5} \\ \\
+
? \ &7 \ 9 \ 2 \ 6 \ \ ! \ &{\color{yellow}5} \ {\color{yellow}8} \\ \\
+
? \ &9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}5} \ {\color{yellow}8} \ {\color{yellow}7} \\ \\
+
? \ &9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}5} \ {\color{yellow}7} \ {\color{yellow}8} \\ \\
+
&…(\text{不再详细演示}) \end{aligned} $$
+
示例程序 # include <cstdio>
+using namespace std ;
+
+int a[ 100010 ] ;
+int main ( )
+{
+ int n ;
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ for ( int j = 1 ; j <= n - 1 ; j ++ )
+ {
+ for ( int i = j; i >= 1 ; i -- )
+ {
+ if ( a[ i + 1 ] < a[ i] )
+ {
+ int t = a[ i] ;
+ a[ i] = a[ i + 1 ] ;
+ a[ i + 1 ] = t ;
+ }
+ else
+ {
+ break ;
+ }
+ }
+ }
+
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ printf ( "%d " , a[ i] ) ;
+ }
+ printf ( "\n" ) ;
+
+ return 0 ;
+}
+
+
可以看到,它比普通冒泡排序快在当前一个元素大于等于后一个元素时会退出循环。但最坏的情况还是 $O(n^2)$ (也是平均情况),因为如果他时一个倒序序列的话,这样排序每次都要从头到尾比较一遍,这和冒泡排序是一样的。
+
演示网址 演示网址:https://visualgo.net/zh/sorting?slide=9
+
计数排序 简介 计数排序需要用到前缀和 的知识,简单来说就是将每一个数字出现的次数记录到一个数组中(这里称为计数数组),然后再按照这个计数数组将答案数组赋值好。还是比较好理解的。只是也许没有冒泡排序来的码量小。 计数排序适用于排序数据量较大 的排序,但数字不能过大。如果数字上限很高的话,计数排序就无能为力了,因为数组不能开太大,否则内存不够用。 同时,最好不要有负数 ,要不然计数数组要开两倍大,虽说也可以通过处理达到“负下标”的效果,但还是上面说的三个排序比较好。
+
例子 假设有这样一个数组 $a$ :
+
$$ 8 \ 8 \ 8 \ 5 \ 5 \ 7 \ 5 \ 2 \ 2 \ 6 \ 6 \ 2 $$
+
统计结果是这样的: $8$ 出现了 3
次, $5$ 出现了 3
次, $7$ 出现了 1
次, $6$ 出现了 2
次, $2$ 出现了 3
次。
+
那么,就可以将这些数按顺序赋值到答案数组中,然后再输出答案数组。在此处不演示了。手都敲酸了
+
示例程序 # include <cstdio>
+using namespace std ;
+
+const int TEMP = 1e7 + 10 ;
+int a[ TEMP] ;
+int b[ TEMP] , c[ TEMP] , d[ TEMP] ;
+int main ( )
+{
+ int n ;
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ b[ a[ i] ] ++ ;
+ }
+
+ c[ 0 ] = b[ 0 ] ;
+ for ( int i = 1 ; i <= 10000000 ; i ++ )
+ {
+ c[ i] = c[ i - 1 ] + b[ i] ;
+ }
+
+ for ( int i = 1 ; i <= c[ 0 ] ; i ++ )
+ {
+ d[ i] = 0 ;
+ }
+ for ( int i = 1 ; i <= 10000000 ; i ++ )
+ {
+ int l = c[ i - 1 ] + 1 ;
+ int r = c[ i - 1 ] + b[ i] ;
+ for ( int j = l; j <= r; j ++ )
+ {
+ d[ j] = i ;
+ }
+ }
+
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ printf ( "%d\n" , d[ i] ) ;
+ }
+
+ return 0 ;
+}
+
+
演示网址 演示网址:https://visualgo.net/zh/sorting?slide=15
+
归并排序 简介 归并排序其实是分治 的思想,将一个数列分成两份,再分,直至每个数列的长度都为一为止。然后再将每一个数列按照大小放回数组里。时间复杂度为 $O(n \log_{2}{n})$,和上面的几个排序比较,已经很好了。
+
例子 一个数列 $8 \ 5 \ 7 \ 9 \ 2 \ 6$ 的归并排序:
+
+
示例程序 # include <cstdio>
+using namespace std;
+
+const int TEMP = 5e5 + 3 ;
+int a[ TEMP] , b[ TEMP] ;
+long long sum = 0 ;
+
+void dg ( int l, int r)
+{
+ int mid = ( l + r) / 2 ;
+ if ( l != r)
+ {
+ dg ( l, mid) ;
+ dg ( mid + 1 , r) ;
+ }
+
+ int l1 = l, l2 = mid + 1 ;
+ int cnt = l;
+ while ( l1 <= mid && l2 <= r)
+ {
+ if ( a[ l1] >= a[ l2] )
+ {
+ b[ cnt] = a[ l2] ;
+ if ( a[ l1] == a[ l2] ) sum += mid - l1;
+ else sum += mid - l1 + 1 ;
+ l2++ ;
+ }
+ else
+ {
+ b[ cnt] = a[ l1] ;
+ l1++ ;
+ }
+ cnt++ ;
+ }
+
+ while ( l1 <= mid)
+ {
+ b[ cnt] = a[ l1] ;
+ l1++ ;
+ cnt++ ;
+ }
+ while ( l2 <= r)
+ {
+ b[ cnt] = a[ l2] ;
+ l2++ ;
+ cnt++ ;
+ }
+
+ for ( int i = l; i <= r; i++ )
+ {
+ a[ i] = b[ i] ;
+ }
+}
+
+int n;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ dg ( 1 , n) ;
+ printf ( "%lld\n" , sum) ;
+ return 0 ;
+}
+
+
演示网址 演示网址:https://visualgo.net/en/sorting?slide=11
+
<algorithm>
头文件 sort()
排序这么多排序算法,头都要晕了。为什么不用别人现成的函数来排序呢?看, C++
就有一个超级好用的头文件 -> <algorithm>
,用它里面的 sort()
函数就可以啦!并且,它支持自定义排序 。
+
从小到大排序时,还有一个更方便的方法:
+
sort ( a, a + 10 , greater < int > ( ) ) ;
+
+
greater
是一个模板,可以把它理解为在这个函数中把大于号和小于号的含义交换。
+
两个重载:
+
template < typename _RandomAccessIterator >
+ inline void
+ sort ( _RandomAccessIterator __first, _RandomAccessIterator __last)
+
+
template < typename _RandomAccessIterator , typename _Compare >
+ inline void
+ sort ( _RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+
+
想要用的时候,就直接 sort(&a[0], &a[n])
或者 sort(a, a + n)
就可以了。写排序函数 cmp
时,想交换就 return true
,否则就 return false
。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/stackandqueue/index.html b/posts/stackandqueue/index.html
new file mode 100644
index 00000000..d7a246ac
--- /dev/null
+++ b/posts/stackandqueue/index.html
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+数据结构:队列和栈 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 队列和栈都是线性数据结构,它们一个是先进先出,一个是先进后出,有着不同的使用场景。这两个数据结构基于链表,也可以用数组模拟这样的数据结构,通过 C++ 中 STL 提供的容器也可以更加方便快捷地实现。
+
队列 队列 (queue) 是在一端插入另一段删除的线性表,遵循先进先出 ,类似于排队,可以称为先进先出 (FIFO) 表。队列中,允许入队 (enqueue) 的一端为队尾,允许出队 (dequeue) 的一端为队头。以后的广度优先搜索 就会用到它。
+
+
+
数组模拟队列 使用数组模拟队列需要一个存储数据的数组,同时用变量标记队头和队尾。 假设队列数组名为 q
,头指针为 ql
,尾指针为 qr
,则:
+
插入元素 时,需要将队尾加上 1,假设元素为 x
。结果:q[++qr] = x;
;删除元素 时,需要将队头指向下一个元素,由于这不是链表,直接执行即可。结果:ql++;
;访问队首 ,直接 q[ql];
;访问队尾 ,直接 q[qr];
;清空队列 时,头指针尾指针初始化,ql = 1; qr = 0;
。
+
可见,数组模拟队列和数组模拟链表的缺点一样,内存不是动态分配的。这导致若数据过大则内存可能超出限制,若比数组的大小还大那就越界了,队列就溢出了。
+
队列的溢出 但由于数组是直接将队首队尾加来加去,可能会有队列(数组)前面还空着,但是队列溢出的情况这就叫做假溢出 。若假溢出则需要使用循环队列,也就是说当尾指针超出数组,则将这一个元素从数组的开头放起。当然,若是真的全部存完了那有用的数据也会覆盖掉,这就是真溢出了。
+
STL queue STL 提供的容器 queue
,需要引入 <queue>
头文件。通过模板,定义形式是这样:queue<[value type]> name
。 成员函数的使用:
+
+front()
返回队首值。
+back()
返回队尾值。
+push([value])
元素入队。
+pop()
元素出队。
+empty()
返回布尔值,表示队列是否为空。
+size()
返回数值,表示队列里元素的数量。
+
+
容器不会假溢出,但是若队列为空还要 pop()
就会溢出。
+
栈 栈 (stack)是在同一端插入同一端弹出的表。元素可插入弹出的一段称为栈顶,另一端是栈底,遵循 先进后出 。
+
STL stack 容器需要引入 <stack>
头文件。成员函数有:top()
返回栈顶值push([value])
插入pop()
弹出empty()
是否为空栈size()
返回元素数量
+
同样的,容器没有上限,不会上溢出。但是若栈已空还要 pop()
就会造成下溢出 。
+
+
附 :visualgo 演示:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/stdoi-snf-pnt/index.html b/posts/stdoi-snf-pnt/index.html
new file mode 100644
index 00000000..34f3d62c
--- /dev/null
+++ b/posts/stdoi-snf-pnt/index.html
@@ -0,0 +1,510 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+scanf 和 printf 的格式符 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 又是一个随记,方便自己的使用。C++ 中的 scanf
和 printf
其实有很多比 cin
cout
好用的地方,放在这里。
+
+
+
scanf 的使用 读入的格式 就直接上表格吧,先把一些特定的读入格式符放在这儿:
+
+格式符
+
+
+
+
+格式符
+用途
+
+
+
+%d
+读入 int 整型
+
+
+%ld
+读入 long 整型
+
+
+%lld
+读入 long long 整型
+
+
+%hd
+读入 short 整型
+
+
+%u
+读入 unsigned int 整型
+
+
+%lu
+读入 unsigned long 整型
+
+
+%llu
+读入 unsigned long long 整型
+
+
+
+
+格式符
+用途
+
+
+
+%f
+读入 float 类型
+
+
+%lf
+读入 double 类型
+
+
+%Lf
+读入 long double 类型
+
+
+
+
+格式符
+用途
+
+
+
+%c
+读入 char 类型
+
+
+%s
+读入字符串,也就是 char 数组
+
+
+%o
+读入八进制整型
+
+
+%x
+读入十六进制整型
+
+
+
+
+
+
以上其实都是一些读入的格式。还有一些能让读入的格式更加丰富的格式化。
+
限制位数 在以上的任何格式符的 % 后面加上数字 n,即读入的位数就是 n。例如:
+
int a, b;
+scanf ( "%1d %1d" , & a, & b) ;
+printf ( "%d %d\n" , a, b) ;
+
+
假设输入 10345 则会输出 1 0。
+
只读入,不赋值 在任何格式符的 % 后加上 *,就不会赋值给任何变量。例如:
+
int a;
+long long b;
+short c;
+scanf ( "%d %*lld %lld %hd" , & a, & b, & c) ;
+printf ( "%d %lld %hd" , a, b, c) ;
+
+
假设输入:
+
2147483647 4294967295 11415612712638 128
+
+
则输出:
+
2147483647 11415612712638 128
+
+
可见,scanf 忽略了第二个数字 4294967295。
+
printf 的使用 其实它和 scanf 差不多。但是有多了精度,对齐什么的。
+
标识和宽度 %[标识][宽度]
+
+
宽度其实和上面一样,只不过默认左对齐。标识就可以更改。
+
+
+
+标识
+作用
+
+
+
+-
+将宽度的数字右对齐
+
+
++
+正数显示正号
+
+
+#
+和 %o
带有八进制前缀 0,和 %x
带有十六进制前缀 0x
+
+
+0
+将宽度的空格变成 0
+
+
+
例如:
+
int a, b, c, d, e, f;
+scanf ( "%d %d %d %d %d %d" , & a, & b, & c, & d, & e, & f) ;
+printf ( "|%010d|%10d|%-10d|\n" , a, b, c) ;
+printf ( "|%+10d|%#10o|%#10x|\n" , d, e, f) ;
+
+
+
假设输入:
+
19283 1983 1283 12873 83287 7283
+
+
则会输出:
+
|0000019283| 1983|1283 |
+| +12873| 0242527| 0x1c73|
+
+
精度 用于小数,用 .n 标识保留 n 为小数。例如:
+
double p;
+scanf ( "%lf" , & p) ;
+printf ( "%.3lf\n" , p) ;
+
+
假设输入 114514.1919810 会输出 114514.192。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/struct-class/index.html b/posts/struct-class/index.html
new file mode 100644
index 00000000..b4e1f77b
--- /dev/null
+++ b/posts/struct-class/index.html
@@ -0,0 +1,365 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+C++类(结构体) | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 创建一个类 类 类似于结构体,只不过他是C++独有的而已。对于我这个入门者来说,类几乎等于结构体,只不过他出现了一种概念:公有 public
私有 private
受保护的 protected
。当然,对于我来说,除了 public
能用,其他的都不能用 。我还是太蒻了 。捂脸.jpg 但是继承类似乎可以用。例如:
+
class myclass
+{
+ public :
+ int a ;
+ private :
+ int b ;
+ protected :
+ int c ;
+}
+
+
对于我来说,除了 a 都不能用。 好像也没啥能记的了。再次捂脸.jpg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/test-tag-pulgins/index.html b/posts/test-tag-pulgins/index.html
new file mode 100644
index 00000000..00433f5b
--- /dev/null
+++ b/posts/test-tag-pulgins/index.html
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test-tag-pulgins | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome to Hexo!
+
No icon note Note without icon: note info no-icon
+
+
+
+
+
+ title
+ https://joywonderful.github.io/
+
+
+ default open
+ https://joywonderful.github.io/
+
+
+
+pie
+"test1" : 386
+"test2" : 85
+"test3" : 15
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+sequenceDiagram
+Alice->>John: Hello John, how are you?
+loop Healthcheck
+ John->>John: Fight against hypochondria
+end
+Note right of John: Rational thoughts!
+John-->>Alice: Great!
+John->>Bob: How about you?
+Bob-->>John: Jolly good!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/two-pointers/index.html b/posts/two-pointers/index.html
new file mode 100644
index 00000000..219f6038
--- /dev/null
+++ b/posts/two-pointers/index.html
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+双指针-快慢指针 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+双指针其实不是真正的指针,而是有两个变量在序列上进行一些操作。 ——Lqingyi(Lxandqi)
+
+
思想分类
+普通双指针 也就是两个普通的 for
(也可以是其他的)循环嵌套。
+左右指针 其实就是二分搜索,一个变量指向开头,一个变量指向末尾,根据条件向中间遍历,直到指针相遇或满足某种条件。(也就是逼近答案)
+快慢指针 两个指针(变量)开始同时开头,但一个遍历的快,一个慢,直到条件满足或指针到末尾。
+
+
+
+
提示 双指针是二重循环。
+
一般来说,快慢指针的第二个指针(快指针)的变量是在 for
循环体之外定义的。因为 for
循环会初始化变量。快慢指针的变量是不可以初始化的,因为已经遍历过的就不用遍历了,再遍历一遍就变成普通双指针(暴力枚举)了。
+
怎么感觉只有例题才能讲清楚???
+
例题 给定一个长度为 $n$ 的整数序列 $a_1,a_2,…,a_n$ 以及一个长度为 $m$ 的整数序列 $b_1,b_2,…,b_m$。 请你判断 $a$ 序列是否为 $b$ 序列的子序列。 子序列指序列的一部分项按原有次序排列而得的序列,例如序列 $a_1,a_3,a_5$ 是序列 $a_1,a_2,a_3,a_4,a_5$ 的一个子序列。
+
输入时: 第一行包含两个整数 $n,m$。 第二行包含 $n$ 个整数,表示 $a_1,a_2,…,a_n$。 第三行包含 $m$ 个整数,表示 $b_1,b_2,…,b_m$。输出时: 如果 $a$ 序列是 $b$ 序列的子序列,输出一行 Yes
。 否则,输出 No
。
+
数据保证: $1 \le n \le m \le 10^5$ $−10^9 \le a_i,b_i \le 10^9$
+
+
解题: 数据那么大,暴枚肯定不行。那么就用今天学的双指针。 一个指针 $i$ 遍历数组 $a$ 的元素,指针 $j$ 遍历数组 $b$ 的元素。写一个 while(1)
死循环, $j$ 在 while
中每次 ++
,如果 $a_i = b_j$ ,则 break
,如果 $j > m$ 则输出 No
。 $j$ 变量(指针)的定义要写在循环之外。
+
代码:
+
# include <cstdio>
+using namespace std;
+
+int n, m ;
+const int N = 1e5 + 5 ;
+int a[ N] , b[ N] ;
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+ for ( int i = 1 ; i <= n; i++ ) scanf ( "%d" , & a[ i] ) ;
+ for ( int i = 1 ; i <= m; i++ ) scanf ( "%d" , & b[ i] ) ;
+
+ int j = 1 ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ while ( 1 )
+ {
+ if ( j > m)
+ {
+ printf ( "No\n" ) ;
+ return 0 ;
+ }
+ if ( a[ i] == b[ j] )
+ {
+ j++ ;
+ break ;
+ }
+ j++ ;
+ }
+ }
+
+ printf ( "Yes\n" ) ;
+
+ return 0 ;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/waline-set/index.html b/posts/waline-set/index.html
new file mode 100644
index 00000000..fbf4c705
--- /dev/null
+++ b/posts/waline-set/index.html
@@ -0,0 +1,367 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waline 评论加入记录 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 看了看“归档 ”页面才发现自己没有在 2024 发布 过文章。最近寒假作业写累了(思维导图太烦啦),就更新了下留言板,从 giscus 换成了 waline ,不用登录就可以留言了,管理也更方便。
+
+
+
服务端 按照官方文档,我注册了 LeanCloud 国际版 账号(华东或华北节点需要备案域名,可我没有钱买域名)。随后点击“创建应用”,填写应用名称(计费方式选择“开发版”)。 创建应用完毕后依次点击 设置 -> 应用凭证
,三个 KEY 等下要使用。
+
随后我选择了 DetaSpace 部署。注册账号,随后下载 Waline 应用 ,点击“Install on Space”等待完成。随后返回首页,点击底部任务栏 deta 图标呼出菜单,依次点击 Add Card to Horizon -> Installed App -> Waline
。 鼠标悬浮到新增加的卡片上,点击灰色的 deta 图标点击 “Open Settings”,点击“Configuration”选项卡,将 LeanCloud 中 AppID
, AppKey
, MasterKay
依次加入到 LEAN_ID
, LEAN_KEY
, LEAN_MASTER_KEY
中。滑动到底部点击“Save Changes”。服务端完成。
+
可以通过“Configuration”中 GRAVATAR_STR
更改用户默认头像。更改 DISABLE_REGION
DISABLE_USERAGENT
为 true 隐藏评论下方用户代理和位置。
+
鼠标悬浮到卡片上,点击右上角“Waline”及其徽标,在 url 后增加 /ui/register
,也就是 https://waline-x-xxxxxxx.deta.app/ui/register
,注册一个账号成为管理员,就可以点击“管理”选项卡管理用户和评论了。
+
客户端 通过 CDN 引入 waline.js 和 waline.css ,在想加入评论框的页面引入。 新增 script 标签,可参考:
+
import '/comments/waline.js' ;
+
+Waline. init ( {
+ el : "#waline" ,
+ path : location. pathname,
+ lang : "zh-CN" ,
+ serverURL : "https://yoursite.deta.app" ,
+ locale : {
+ admin : "管理员" ,
+ login : "管理员登录" ,
+ placeholder : "友善的评论会收获更多美好" ,
+ } ,
+} ) ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/xiaolianbi/index.html b/posts/xiaolianbi/index.html
new file mode 100644
index 00000000..a5a85c03
--- /dev/null
+++ b/posts/xiaolianbi/index.html
@@ -0,0 +1,357 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+一些六年级的小练笔 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 一些六年级写的小作文(小练笔),留作纪念。
+
主题:点面结合写“体检”300字以上 同学们紧张地等待着,一年一度的体检开始了。 与往常不同的是,这次体检要抽血。验血区里,紧张的气氛非常明显。我一拿到条形码 (当时验血有一个条形码,用来验证身份和当作标签),就直奔验血区,怕时间长了自己会害怕。很快就轮到了我。我卷起袖子,将胳膊往桌上一放,马上扭过头闭上眼,不敢看针扎进我的胳膊里的样子。 医生开始抹酒精了,我觉得我一直在发抖。等了一会儿,我感到一丝疼痛,但很快就没有了。只听见软管松开的声音。“好了。”旁边的同学提醒我。我睁开眼,看见医生正在往试管上贴标签,我长舒一口气。幸好一次性就完成了。旁边同学问我:“疼吗?”我按紧棉花,苦笑道:“都一样”。 另外一边儿正在测血压,气氛很轻松,毕竟同学们习惯测血压了。她卷起袖子,医生帮她把仪器连接好,按下了“开始”键。只见那块连接仪器的布不断收缩、绷紧,仪器上的数字不断跳动、变化,然后定格,布又松弛了。医生在表格上龙飞凤舞地写下一行数字,又开始忙其他的了。 各种各样的检查结束了,同学们兴高采烈地走回了教室,如释重负。
+
主题:未知 老师一走,原本安静的班级马上热闹起来,比十个菜市场还吵。调皮大王马上抓住这一时机,放声大吼起一首歌“大河向东流啊……”一些同学被调皮大王逗得哈哈大笑,根本就不去写作业本了,也愉快地聊起天来。大组长,班长怎么管也没用。调皮大王更起劲了,拿起书本卷成筒状,凑到同学耳边大吼大唱。许多“小调皮”被吸引了,也毫无顾忌地转来转去,和旁边的同学愉快地大声聊天。随着调皮大王“嘿”地一声大吼,一位女同学差点儿被吓哭。跑操铃声想起,新任体育委员地调皮大王又来了兴致,催促吵吵闹闹的班级马上出来,在外面排好了歪歪扭扭的队伍。“小调皮”们在教室外还是安静不下来,直至别的班的老师过来,那吵吵闹闹的一群人才一哄而散。
+
主题:点面结合 大扫除 400字 很快,一盆盆水端了进来,同学们都拿着工具,对教室里脏的地方发动了“攻击”。同学们忘乎所以地忙碌着,仿佛这个世界上只有他手中的事情了。 他拿着一把扫帚,卖力地扫角落里一个落满灰尘的夹缝。地上那些明显的纸片都被他扫走了,他扫门后面,灰尘弥漫,但他手握扫帚,用力去扫角落的墙灰,很快,门后干干净净。这里的角落有一个柜子,他俯下身子,仔细地查看着柜子后面的灰尘,发现灰尘有一尺多高。他马上把扫帚探进柜子后面,半个身子差点儿都倒下去了,艰难的把一丁点儿灰尘扫了出来。他不甘心,拿了把小扫帚,用力搬开了柜子,手拿小扫帚,将所有灰尘都扫了出来。他还觉得不够干净,干脆直接上手,地上几块顽固的胶带就被他死了下来,丢进了灰尘堆。垃圾桶里虽然没有什么大型垃圾,灰尘却堆成了小山,这大部分是他的功劳。 她拿着一块湿抹布,握着小铲刀,擦着墙上的污垢和双面胶带。瓷砖已经有些发黑了,还有一些水笔的字迹,被摘除的布告后留下双面胶的痕迹。她不慌不忙,从容地擦着那些水笔的痕迹。手所滑过的地方,一切都亮了起来。但也有非常顽固的污垢,她用手指盖着布,上上下下用力地擦。扣。污垢撑不住,很快,墙上的污点完全没有了。双面胶牢牢地粘在墙上,经过长时间的风化,又硬又黏。她先用湿布擦那些胶,这样用铲子更好铲,“斩草除根”后,再用力擦一擦,墙上的双面胶一点也没有了。结白明亮的瓷砖倒映着她满意的微笑。 经过每一个同学的努力,教室里焕然一新。每个同学露出的,都是满意的微笑。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/yixieyouyongdedongxiyoumei/index.html b/posts/yixieyouyongdedongxiyoumei/index.html
new file mode 100644
index 00000000..88eae27b
--- /dev/null
+++ b/posts/yixieyouyongdedongxiyoumei/index.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+一些有用的东西有没有用的东西 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 宏定义和类型定义 宏定义 ,将一个指令导向另一个指令 。宏定义属于预处理指令 ,使用规范为:
+
# define [ 标识符] [ 常量]
+
+
+
+
与变量不同的是:宏定义可以理解为把一个文本替换 成另一个文本。比如说:
+
# include <cstdio>
+# define a 3 + 2
+using namespace std ;
+
+int main ( )
+{
+ printf ( "%d" , a * 3 ) ;
+
+ return 0 ;
+}
+
+
和
+
# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a = 3 + 2 ;
+ printf ( "%d" , a * 3 ) ;
+
+ return 0 ;
+}
+
+
使用了 #define
的输出 $9$ ,使用了 int
的输出 $15$ 。这是因为 #define
只是把 $a$ 替换为了 $3+2$ ,因此先算 $2 \times 3=6$ ,再算 $6+3=9$ ,而 int
将 $a$ 定为 $5$ ,再算 $5 \times 3=15$ 。从这些角度来看,define
只是一个“替换”的操作。
+
+
类型定义 ,将变量类型导向简单的标识符 。类型定义属于语句 ,使用规范为:
+
typedef [ 变量类型] [ 标识符] ;
+
+
与 #define
不同的是:#define
属于预处理指令 ,需要在预处理器处理。而且 #define
可以将任何指令或字符指向标识符;而 typedef
属于语句 ,需要在编译器中编译。且 typedef
只支持将变量类型指向标识符。例如:
+
# include <cstdio>
+# define pnt printf
+# define scn scanf
+using namespace std ;
+
+int main ( )
+{
+ typedef long long ll ;
+
+ ll a ;
+ scn ( "%lld" , & a) ;
+ pnt ( "%lld" , a + 1 ) ;
+
+ return 0 ;
+}
+
+
常量 无论是 int
还是 double
类型,他们都是变量,即随时可以改变。当想用到不用改变的量时,就要用到常量 了。
+
定义一个常量很简单,只需要在变量类型前加上一个 const
就行了。例如:
+
# include <cstdio>
+using namespace std;
+
+const int a = 100 ;
+int b[ a] = { 0 , 1 , 2 } ;
+int main ( )
+{
+ for ( int i = 0 ; i < 100 ; i ++ )
+ {
+ printf ( "%d\n" , b[ i] ) ;
+ }
+
+ return 0 ;
+}
+
+
在这里,我们建立了一个名为 $a$ 的常量,其值为 $100$ 。随后定义一个名为 $b$ 的数组,大小为 $a$ , $a=100$ , $b$ 数组的大小就是 $100$ 。
+
一般来说对于我来说,常量的作用不算特别大,但是拿来定义数组却很方便。
+
有符号和无符号 有符号 , signed
,符号即为 $-$ ,在一般的数据定义中,都是 有符号的类型。无符号 , unsigned
,即没有 复数,正数数据范围会大很多。比如普通的 int
( signed int
)数据范围是 $-2147483648 \sim 2147483647$ 而无符号 int
( unsigned int
)数据范围是 $0 \sim 4294967295$ ,这是因为 unsigned int
将附属部分拿来存正数部分,所以可以存的正数会大很多。
+
在变量类型中,只有 signed
会被认作 signed int
;只有 unsigned
也会被认作 unsigned int
;不带 signed
和 unsigned
的任何数据类型都会被认做有符号 signed
数据类型。因此,在某些时候主函数 int main()
也可以写成 signed main()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/zhizhen/index.html b/posts/zhizhen/index.html
new file mode 100644
index 00000000..47ab279b
--- /dev/null
+++ b/posts/zhizhen/index.html
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+指针 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指针的作用 指针,顾名思义,就是指向某一东西的标志。
+
当我们想存地址时,就可以使用指针变量:
+
int a ;
+int * b = & a ;
+
+
b
就是一个指针变量,存着a
的地址。
+
+
+
普通指针 普通指针就是上面的例子中的b
,它存着a
的地址,因此&a
和b
的输出结果是一样的。
+
存指针地址的指针 当我们想存指针地址时那该怎么办呢?
+
很简单,嵌套:
+
# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a ;
+ int * b = & a ;
+ int * * c = & b ;
+
+ printf ( "%d %d %d" , & a, b, c) ;
+
+ return 0 ;
+}
+
+
这样就不会出错了。
+
取地址和解地址 *
既可以是乘号,又可以是解地址,还可以是指针变量;
+
&
既可以是按位与运算,又可以是取地址。
+
解地址,与取地址相反,就是按照地址去找地址里存的数 。
+
我们可以使用指针变量解地址得到原本的数,例如:
+
# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a = 10 ;
+ int * b = & a ;
+ int * * c = & b ;
+
+ printf ( "%d %d %d" , a, * b, * * c) ;
+
+ return 0 ;
+}
+
+
这段代码输出的应该是三个同样10
,我们一个一个来:
+
+a
,就是a
本身,输出10
;
+*b
,就是解地址b
,等于解地址&a
,等于a
,输出10
;
+**c
,就是解地址c
,等于解地址&b
,等于解地址&a
,等于a
,输出10
。
+
+
画个图更清晰:
+
**c=*(&b) → b=*(&a) → a = 10 → printf(10)
+
因此,解地址也是可以嵌套的。
+
指针数组和数组指针 指针数组,用来存指针的数组;
+
数组指针,数组的首地址。
+
我们使用时*a[100]
代表数组a
的地址,因为数组的优先级更高。弄一个指针数组应该写(*a)[100]
。
+
同样的,a
代表数组中第一个元素的首地址 ,&a
代表整个数组的首地址 ,我们是不是还可以这样写?
+
# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a[ 100 ] = { 1 , 2 , 3 , 4 } ;
+ printf ( "%d %d %d %d" , * ( a + 0 ) , * ( a + 1 ) , * ( a + 2 ) , * ( a + 3 ) ) ;
+
+ return 0 ;
+}
+
+
输出1 2 3 4
,这与a[n]
的效果是一样的。
+
因此,我们得出结论:数组的本质就是指针 。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/search.xml b/search.xml
new file mode 100644
index 00000000..fdab791d
--- /dev/null
+++ b/search.xml
@@ -0,0 +1,4242 @@
+
+
+
+ 广度优先搜索
+ //posts/bfs/
+ 这不,刚学完深搜 没多久,又来写广搜笔记了(话说我队列笔记还没来得急写呢)。广度优先搜索 ,广搜,英文为Breadth First Search ,简称 BFS 。是从一个结点向其他方向的结点不断扩散,如同一道水晕在湖面上荡漾开来。主要可以用来找路径权值一定 的最短路径。 深搜可以用到队列先进先出的特性。当一个结点准备扩散时,即弹出队列,再将接下来扩散到结点加入队列。随后按照队首扩散、弹出,不断循环。这也是叫它广度优先搜索的原因。
+
+
+例题:洛谷 P2360 广搜可以做,直接通过路径扩散就好。 代码:(想水博文 QwQ)
+# include <iostream>
+# include <queue>
+using namespace std;
+
+struct node
+{
+ int x, y, z;
+} ;
+int l, r, c;
+char themap[ 33 ] [ 33 ] [ 33 ] ;
+int flag[ 33 ] [ 33 ] [ 33 ] , dist[ 33 ] [ 33 ] [ 33 ] ;
+
+int bx[ 6 ] = { 1 , - 1 , 0 , 0 , 0 , 0 } ;
+int by[ 6 ] = { 0 , 0 , 1 , - 1 , 0 , 0 } ;
+int bz[ 6 ] = { 0 , 0 , 0 , 0 , 1 , - 1 } ;
+
+void bfs ( int x, int y, int z)
+{
+ queue< node> q;
+ node pdata;
+ pdata. x = x; pdata. y = y; pdata. z = z;
+ q. push ( pdata) ;
+ flag[ x] [ y] [ z] = 1 ;
+
+ while ( q. size ( ) )
+ {
+ node p = q. front ( ) ;
+ q. pop ( ) ;
+ for ( int i = 0 ; i < 6 ; i++ )
+ {
+ int tx = p. x + bx[ i] ;
+ int ty = p. y + by[ i] ;
+ int tz = p. z + bz[ i] ;
+
+ if ( tx <= r && tx > 0 && ty <= c && ty > 0 && tz <= l && tz > 0 && flag[ tx] [ ty] [ tz] == 0 && ( themap[ tx] [ ty] [ tz] == '.' || themap[ tx] [ ty] [ tz] == 'E' ) )
+ {
+ node tdata;
+ tdata. x = tx;
+ tdata. y = ty;
+ tdata. z = tz;
+ q. push ( tdata) ;
+ flag[ tdata. x] [ tdata. y] [ tdata. z] = 1 ;
+ dist[ tdata. x] [ tdata. y] [ tdata. z] = dist[ p. x] [ p. y] [ p. z] + 1 ;
+ }
+
+ }
+ }
+}
+
+int main ( )
+{
+ ios:: sync_with_stdio ( false ) ;
+ cin >> l >> r >> c;
+ int sx, sy, sz;
+ int ex, ey, ez;
+ for ( int i = 1 ; i <= l; i++ )
+ {
+ for ( int j = 1 ; j <= r; j++ )
+ {
+ for ( int k = 1 ; k <= c; k++ )
+ {
+ cin >> themap[ j] [ k] [ i] ;
+ if ( themap[ j] [ k] [ i] == 'S' )
+ {
+ sx = j;
+ sy = k;
+ sz = i;
+ }
+ if ( themap[ j] [ k] [ i] == 'E' )
+ {
+ ex = j;
+ ey = k;
+ ez = i;
+ }
+ }
+ }
+ }
+
+ bfs ( sx, sy, sz) ;
+ if ( flag[ ex] [ ey] [ ez] == 0 ) cout << "Trapped!" << endl;
+ else cout << "Escaped in " << dist[ ex] [ ey] [ ez] << " minute(s)." << endl;
+
+ return 0 ;
+}
]]>
+
+ 课程笔记
+
+
+ 搜索
+ 队列
+ 基础算法
+
+
+
+ 并查集概念
+ //posts/bichaj/
+ 写在前面
+又有好长时间没有写过课程笔记了啊~—— by JoyWonderful
+
+并查集 就是将一些集合融合,然后查询某个数字和某个数字是否在这个集合里(蒟蒻奇怪的自我理解,大概也没人看这句话)。 并查集有一个思想,一个元素的父亲为自己,这是初始化 时会用到的。
+
+
+并查集只有两种操作:
+
+合并 :将两个元素所在的集合合并;
+查找 :两个元素是否都在同一个集合里。
+
+并查集的“集合”中有树 的概念,每一个集合就像是树,父亲就像父结点(根节点)。
+代码 初始化 一个元素的父亲为自己,所以可以使用一个数组为 fa
(father),$fa_i$ 代表第 $i$ 个元素的父亲为 $fa$。所以,可以使用以下代码:
+int fa[ 10003 ] ;
+void init ( )
+{
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ fa[ i] = i;
+ }
+}
+
+查询 按照树来说,就是找到根节点。可以通过递归的方式。如果要判断两个数是否在同一个集合中,只要判断他们的根结点是否相同(find(a) == find(b)
)
+int find ( int num)
+{
+ if ( fa[ num] == num) return fa[ num] ;
+ else return find ( fa[ num] ) ;
+}
+
+合并 其实就是找到两个元素的根节点,然后将其中的一个设置为另一个的父亲。
+void merge ( int a, int b)
+{
+ fa[ find ( fa[ a] ) ] = find ( fa[ b] ) ;
+}
+
+优化 路径压缩 : 在查询的时候,我们只想知道这个数的根结点 。这样在查询时可以直接找到根结点。所以,可以在查询时把结点的父结点设为它的根结点:
+int find ( int num)
+{
+ if ( fa[ num] != num) fa[ num] = find ( fa[ num] ) ;
+ return fa[ num] ;
+}
+
+按秩合并 : 每次查找时,深度(秩)影响查找的速度。当一个深度较大的集合合并到深度较小的集合中时,它的深度一定会加一,就像这样:
+
+ [1, 2, 3, 4] 这个集合深度为 4;[5, 6] 这个集合深度为 2;将 1 的父结点设为 5 合并后整个集合深度为 5。 深度加一,这不利于查找
+
+当深度较小的集合合并到较大的集合中,深度才不会加深(也就保持在较深集合的深度):
+
+ 两个集合同上。将 5 的父结点设为 1,深度还是 4。 查找集合 [1, 2, 3, 4] 中任意一个结点,花费时间不变。
+
+所以,要记录集合的深度,合并时将深度较大的放“上面”。只有在两个集合深度相等时,才可以(不得不)加深。 代码是:
+void merge ( int a, int b)
+{
+ if ( rk[ a] < rk[ b] ) fa[ find ( fa[ a] ) ] = find ( fa[ b] ) ;
+ else
+ {
+ fa[ find ( fa[ b] ) ] = find ( fa[ a] ) ;
+ if ( rk[ a] == rk[ b] ) ++ rk[ a] ;
+ }
+}
+
+评测记录 ,最下面是优化前,最上面一条最快的是优化后。
+例题 并查集最经典的就是亲戚问题。
+比较完整的代码是:
+# include <cstdio>
+using namespace std;
+
+int n, m;
+const int T = 1e4 + 3 ;
+int fa[ T] , rk[ T] ;
+void init ( )
+{
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ fa[ i] = i;
+ }
+}
+int find ( int num)
+{
+ if ( fa[ num] != num) fa[ num] = find ( fa[ num] ) ;
+ return fa[ num] ;
+}
+void merge ( int a, int b)
+{
+ if ( rk[ a] < rk[ b] ) fa[ find ( fa[ a] ) ] = find ( fa[ b] ) ;
+ else
+ {
+ fa[ find ( fa[ b] ) ] = find ( fa[ a] ) ;
+ if ( rk[ a] == rk[ b] ) ++ rk[ a] ;
+ }
+}
+
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+
+ init ( ) ;
+ for ( int i = 1 ; i <= m; i++ )
+ {
+ int z, x, y;
+ scanf ( "%d %d %d" , & z, & x, & y) ;
+ if ( z == 1 ) merge ( x, y) ;
+ else
+ {
+ if ( find ( x) == find ( y) ) printf ( "Y\n" ) ;
+ else printf ( "N\n" ) ;
+ }
+ }
+
+ return 0 ;
+}
+
+例如:[洛谷 P1151] 亲戚 [洛谷 P3367] 并查集
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+
+
+
+ 二叉树的前序、中序、后序遍历
+ //posts/binarytree-fme/
+ 二叉树的前序遍历中序遍历和后序遍历是比较重要的CCF办的比赛要考(雾。可以通过这三个遍历的顺序结果确定整个树的结构。前序遍历是根左右 ,中序遍历是左根右 ,后序遍历是左右根 。(不想多写什么了)
+实践:前序遍历中序遍历确定树 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
+先来看前序,由于前序遍历的顺序是根左右,那么 1
一定是整个树的根节点。 随后在中序遍历找到 1
,即可判断这个二叉树的左子树和右子树,就是这样分开来: 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
在继续分下去,得到: 前序遍历:1 2 4 3 5 6
中序遍历:4 2 1 5 3 6
+最终,得到这样一个树:
+]]>
+
+ 课程笔记
+
+
+ 数据结构
+ 树
+
+
+
+ 差分
+ //posts/chafen/
+ 什么是差分,差分与前缀和的关系差分也是一种优化算法 。同时,差分是前缀和的逆运算,也就是说,前缀和也是差分的逆运算。因此,由前缀和数组可以求出差分数组,由差分数组也可以求出前缀和数组。
+假设数组 $a$ 是原数组,数组 $b$ 是差分数组,则:$b_i = a_i - a_{i-1}$
+
+差分可以用于修改数组的操作。因为假设我需要将 $a_2$ $a_3$ $a_4$ 都加上 $2$ ,此时若使用前缀和则需要再使用递推重新求一遍前缀和,非常耗时。这时便可以使用差分数组。可以发现: $$ \underbrace{b_1,\hspace{2mm} b_2}_{b_2 + 2 = b_1} ,\hspace{2mm} b_3,\hspace{2mm} \overbrace{b_4,\hspace{2mm} b_5}^{b_5 - 2 =b_4} $$ 因此,只需修改差分数组中的两个项,然后再通过前缀和是差分的逆运算,即可求出原数组,从而完成数组的修改。
+
+
+具体例题(模板题) 差分模板题 题目描述 给出一个数字$n$表示有个数字,
+给出$n$ $n <= 10^5$个整数$a_1$,$a_2$,…$a_n$;
+给出一个数字$m$ $m <= 10^5$ 有$m$个修改: 每次询问给出三个整数$s$,$e$,$h$,使得 $a_s,a_{s+1}….a_{e}$每一个数加上h
+最后给出两个数字 $start$,$end$。求出${ \sum_{i = start}^{end}} a_i $
+输入格式 第一行一个整数 $n$ 表示有$n$ 个数
+第二行$n$个整数$a_1$,$a_2$,…$a_n$;
+第三行一个整数$m$,表示有$m$个修改
+接下来$m$行每次询问给出三个整数$s$,$e$,$h$,使得 $a_s,a_{s+1}….a_{e}$每一个数加上h
+最后给出两个数字 $start$,$end$。求出${ \sum_{i = start}^{end}} a_i $
+输出格式 一个整数
+样例 #1 样例输入 #1 5
+1 2 3 4 5
+3
+1 2 1
+1 3 1
+4 5 1
+1 5
+
+样例输出 #1 22
+
+提示 样例1解释
+第一次修改序列变成 2 3 3 4 5
+第二次修改序列变成 3 4 4 4 5
+第三次修改序列变成 3 4 4 5 6
+$0 <=$ $a_i$ 和 $h <= 10^4$
+
+同上,$b_{s-1} + h = b_s, b_{e + 1} - h = b_e$,即可使用前缀和倒退回原数组.
+# include <cstdio>
+using namespace std ;
+
+long long a[ 100002 ] , b[ 100002 ] , n, m, s, e, h, start, end, sum = 0 ;
+int main ( )
+{
+ scanf ( "%lld" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%lld" , & a[ i] ) ;
+ }
+
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ b[ i] = a[ i] - a[ i - 1 ] ;
+ }
+
+ scanf ( "%lld" , & m) ;
+ for ( int i = 1 ; i <= m; i ++ )
+ {
+ scanf ( "%lld %lld %lld" , & s, & e, & h) ;
+ b[ s] += h ;
+ b[ e + 1 ] -= h ;
+ }
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ a[ i] = a[ i - 1 ] + b[ i] ;
+ }
+
+ scanf ( "%lld %lld" , & start, & end) ;
+ for ( int i = start; i <= end; i ++ )
+ {
+ sum += a[ i] ;
+ }
+ printf ( "%lld\n" , sum) ;
+
+ return 0 ;
+}
]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 前缀和,差分
+ 优化
+
+
+
+ 更改 Edge 新标签页 —— 简单浏览器扩展
+ //posts/chrome-ext/
+ 这是记录写简单的一个 Chomium 扩展的一篇文章。 主要是用扩展覆盖默认标签页,随后 HTML 引用 JS 进行(模拟)重定向到 chrome-search://local-ntp/local-ntp.html。
+开始 浏览器扩展都需要 manifest.json 文件。先新建一个文件夹,在里面添加了这个文件。
+由于需要覆盖新标签页,需要 chrome_url_overrides.newtab
属性。它可以覆盖新的标签页,指定为扩展(文件夹)内的 HTML 文件(不能使用第三方 URL)。 随后还需要增加必要的值:name
,version
和 manifest_version
。它们分别对应扩展显示的名字,显示的版本和 manifest 的版本,manifest 的版本填 3 就可以了。
+
+
+最终,manifest.json 是这样的:
+{
+ "name" : "Change Newtab" ,
+ "description" : "自己(JoyWonderful)弄的一个重定向新标签页的东西啦。" ,
+ "version" : "0.1" ,
+ "manifest_version" : 3 ,
+ "chrome_url_overrides" : {
+ "newtab" : "chntp.html"
+ }
+}
+
+重定向 随后,开始写 chntp.html 的内容。由于需要(模拟)重定向,还需要再写一个 JavaScript 文件,命名为 chp.js。 由于想重定向到的 chrome-search://local-ntp/local-ntp.html 是本地文件,不可以直接将 window.location.href
直接更改为它,只能使用扩展的 API chrome.tabs.create
新建一个指向它的标签页。随后用 window.close()
关闭自身标签页。
+chp.js 的代码是这样的:
+chrome. tabs. create ( { url : "chrome-search://local-ntp/local-ntp.html" } ) ;
+window. opener = null ;
+window. close ( ) ;
+
+chntp.html 是这样的:
+< html lang = " en" >
+ < head>
+ < title> Changing page...</ title>
+ < meta charset = " utf-8" >
+ </ head>
+ < body>
+ < script src = " chp.js" > </ script>
+ </ body>
+</ html>
+
+导入这个扩展到浏览器 Edge 是这样的,Chrome 也基本一样。 进入到浏览器扩展界面 ,打开“开发人员模式”,点击“加载解压缩的扩展”,选择一开始新建的扩展文件夹就可以了。
+如果没问题,新建标签页会跳到 chrome-search://local-ntp/local-ntp.html。(标签页会闪一下)
+后面的废话 自己写一个简单扩展的原因是 Edge 默认的新标签页太离谱了些,默认是这样 的(很好奇微软中国怎么也搞什么传奇“开局领礼包”的广告了)。这时打开 DevTools,可以发现 window.location.href
指向 https://ntp.msn.cn/edge/ntp 。即使可以设置把那一大堆花里胡哨的东西关掉,但它还是要加载第三方资源,存奇怪的缓存和其他东西用了 十几 MiB 。 Edge 在断网的时候其实有个干净的标签页 ,实际是 chrome-search://local-ntp/local-ntp.html ,所以就想用这个新标签页。
+随后,我准备把新标签页换掉。欣喜地发现设置改不了新标签页。研究了半天发现浏览器扩展可以改新标签页,随后又进行很多奇奇怪怪的试错才成功运行的。
+因为想搞贡献点,把它传到了个人仓库 里。那个扩展名为 crx 的是打包后的扩展,可以删。
+原本这篇文章想上周发的,但因颓废,搁了。。。
+
+
+图片们:
+]]>
+
+ 编程随记
+
+
+ JavaScript
+
+
+
+ 个人意见:如何写出漂亮的代码
+ //posts/code-format/
+ 创作说明:
+此文章仅为个人看法。您写代码的习惯可以依据您的个人喜好。此文章只是一些个人的建议。
+您在 OI 竞赛中,您完全可以 不去注意代码风格。
+此文章的建议主要用于工程代码中。
+
+代码的维护还是很重要的。相信谁也不愿意去维护连自己都看得头晕的代码。在这里,我想给出一些个人建议,让代码的可读性强一些。大部分代码以 C++ 为例。这篇文章其实也是给自己看的。
+
+
+空行与空格 无论是什么代码,空行往往代表着一个功能块,或是一个逻辑的结束,在适当的地方空行可以增强代码的可读性。空格也是这样。虽然一些地方的空格和空行会被编译器(或解释器)忽略,但是空行和空格必不可少。就比如说这样一个示例:
+# include <iostream>
+# include <string>
+using namespace std;
+int main ( ) {
+ string s, a, b, c; cin>> s; cin>> a;
+ cin>> b; cin>> c;
+ cout<< "Hello," << s<< endl; cout<< "Hello," << a<< endl;
+ cout<< "Hello," << b<< endl; cout<< "Hello," << c<< endl;
+ return 0 ;
+}
+这段代码是可以编译的,但是逻辑很混乱。流输入输出符之间没有空格,也没有空行。这样导致可读性很差。
+一些建议:
+
+关于空格
+在运算符之间尽量加上空格。
+逗号之后加上空格。例如 int a, b, c;
。
+括号两边不必要加空格。例如应该这样 if(n == 1)
而不是这样 if ( n == 1 )
。
+特殊的建议,C++ 逻辑运算符如 &&
||
最好这样写: if(i==1 || j!=2 && k>3)
。
+
+
+关于空行
+C++ 中(以及其他语言)确实可以使用语句分隔符 ;
在一行完成几个操作。但完全不相关的操作最好不要放一行,也不要把一行代码弄得很长很长。
+不要完全没有空行,空行往往可以增加代码的可读性。在不同的功能代码或逻辑之间空行,不要将相关联的代码空开来。
+
+
+
+缩进 很多代码都最好写缩进,哪怕有大括号也不例外。在 C++ 中,虽然不写它也没有关系,但这是一种编码习惯,也可以增强代码的可读性。在 Python 中,缩进更为重要,不写那就报错了。
+这里有一些错误示例:
+# include <stdio.h>
+
+int main ( ) {
+int a, b;
+scanf ( "%d %d" , & a, & b) ;
+for ( int i = 1 ; i <= 10 ; i++ ) {
+printf ( "%d\n" , a + b) ;
+}
+return 0 ;
+}
+
+i = int ( input ( ) )
+for i in range ( i) :
+ print ( i)
+ print ( "hello" )
+
+C++ 的示例虽然不会报错,但是很不美观,看不出层次。Python 的缩进一个使用了 Tab
,另一个使用了两个空格,导致 SyntaxError: unindent does not match any outer indentation level
。
+一些建议:
+
+缩进最好使用空格,不要使用 Tab 字符。
+遵循使用语言的缩进规则,不要弄出奇怪的缩进。例如 1 个空格。
+不要混用空格个数或 Tab。例如同样的层次,一个用 2 个空格,一个用 4 个空格。有些语言(例如 Python)会直接报错。
+
+命名方法 一段代码中应该尽量使用恰当的命名方法。不可以随意命名,命名应该表达元素的含义和作用避免使用冗余无意义的词汇。
+以下是常用的命名方法:
+
+驼峰命名法 使用大小写混合的格式,单词间不适用空格或连接符。一般来说,类名的开头字母大写,例如 GetConsoleInfo
, PrintSystemVersion
;方法名、参数名、变量名开头字母小写,例如 redGem
, heroLife
。
+匈牙利命名法 使用变量类型的缩写作为前缀,其余部分使用驼峰命名法。例如 char cMyAnswer
, int iPersonAge
, double dManWeight
。
+下划线命名法 使用下划线连接单词,大小写统一。例如 clear_all
, set_color
, MAX_WIDTH
。
+
+建议:一般来说,常量、宏定义等全部使用大写,其他使用小写。
+]]>
+
+ 编程随记
+
+
+ 优化
+
+
+
+ C++ 数据范围
+ //posts/cpp-shujufanwei/
+ 这就是一个随记,方便自己用的。
+
+
+
+
+
+名称(可加)
+所占字节
+数据范围(以 $2^n$ 表示)
+
+
+
+(signed) int
+4
+-2147483648
~ 2147482647
($-2^{31}$ ~ $2^{31}-1$)
+
+
+unsigned int
+4
+0
~ 4294967295
($0$ ~ $2^{32}-1$)
+
+
+(signed) long (int)
+4
+-2147483648
~ 2147483647
($-2^{31}$ ~ $2^{31}-1$)
+
+
+unsigned long (int)
+4
+0
~ 4294967295
($0$ ~ $2^{32}-1$)
+
+
+long long
+8
+-9223372036854775808
~ 9223372036854775807
($-2^{63}$ ~ $2^{63}-1$)
+
+
+unsigned long long
+8
+0
~ 18446744073709551615
($0$ ~ $2^{64}-1$)
+
+
+(signed) short (int)
+2
+-32768
~ 32767
($-2^{15}$ ~ $2^{15}-1$)
+
+
+unsigned short (int)
+2
+0
~ 65535
($0$ ~ $2^{16}-1$)
+
+
+float
+4
+3.4E +/- 38
+
+
+double
+8
+1.7E +/- 308
+
+
+long double
+8
+1.7E +/- 308
+
+
+bool
+1
+true
or false
or 1
or 0
+
+
+char
+1
+-128
~ 127
($-2^{7}$ ~ $2^{7}-1$)
+
+
+]]>
+
+ 编程随记
+
+
+ 语言入门
+
+
+
+ C++ 文件操作
+ //posts/cpp-file/
+ 我曾经用 Python 的 tkinter 库写过一个文本编辑器 ,一百多行,当时幼稚的我以为自己很了不起,因为当时的我认为读写文件是一件很复杂的事情。后来看看,这个东西做得很蹩脚,一个简单的 with open()
就完成了读写文件的操作,可见文件的读写是个很平常的事情。当年的喜悦大概是学到读写文件的喜悦吧。 C++ 读写文件,也算是比较平常的。当数据点大的时候输出到文件里更方便。就在这里小记一下读写文件的操作。
+
+
+
+fstream
有两个类,分别是 ofstream
和 ifstream
。ofstream
是写文件的,ifstream
是读文件的。这是一个打开文件的语法:
+file. open ( "./text.txt" , ios:: in | ios:: out) ;
+
+[ file object] . open ( [ file path] , [ open mode] ) ;
+inline void std:: ofstream:: open ( const char * __s, std:: ios_base:: openmode __mode) ;
+inline void std:: ifstream:: open ( const char * __s, std:: ios_base:: openmode __mode) ;
+
+open ( const char * __s, ios_base:: openmode __mode = ios_base:: in) ;
+open ( const char * __s, ios_base:: openmode __mode = ios_base:: out | ios_base:: trunc) ;
+其中,|
可以将多个打开模式加在一起。打开模式有:
+
+常用的
+ios::in
打开文件读取,用于 ifstream
。
+ios::out
打开文件写入,用于 ofstream
。
+
+
+不常用的
+ios::app
将写入的内容追加在末尾。用于 ofstream
。
+ios::ate
打开定位到末尾。用于 ofstream
。
+ios::trunc
若文件存在,则覆盖文件,不保留原始内容。在 ofstream
中,默认是 ios::trunc
。
+
+
+
+当写入或读取文件时,和 cin``cout
差不多。例如:
+# include <iostream>
+# include <fstream>
+using namespace std;
+
+ofstream outfile;
+int main ( )
+{
+ outfile. open ( "./text.txt" , ios:: out) ;
+ outfile << "text" << endl;
+ char c = 'P' ;
+ outfile << c << endl;
+ outfile. close ( )
+ return 0 ;
+}
+这段代码会向当前目录下 text.txt
写入 "text\n"
和 "P\n"
。 程序结束,最好关闭文件 ,使用 [file object].close()
,虽然不关闭文件也没关系。
+]]>
+
+ 编程随记
+
+
+ 语言入门
+
+
+
+ 深度优先搜索
+ //posts/dfs/
+ 前置知识:图论引用广为人知的一句话:
+
+图论 (Graph Theory) 是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
+
+像深度优先搜索,其实也要用到“图”这个概念。其实,“图”体现了搜索(递归)的过程,计算机中的“图”有很多使用的场景。
+概述 深度优先搜索 (深搜),英文名 Depth First Search ,简称 DFS 。即从初始节点出发,按一定顺序不断地向下一节点扩展,达到条件则返回上一个节点,以此类推。这正是一个递归 的过程。叫深搜是因为它递归的过程若形象来看是不断“加深”的,这样一搜到底也是递归的特性。 深搜有一个很重要的一点:不能重复访问已经访问过的元素。深搜通常有很多路径(线)可以选择,若重复访问可能会造成死循环,因此需要定义一个数组存访问情况。(当然这个数组在很多其他的地方也可以运用到,也就是回溯,详见下面的例题)
+深搜例题 例如:洛谷 B3625 这是一个很典型的迷宫问题,迷宫为 $n \times m$。#
为墙,.
为空地。起点为左上角,终点在右下角 首先,就是路径搜索的问题,要搜索上、下、左、右的的路径,同时,还有几点条件不能搜:
+
+目标位置不能为 #
。(即为墙)
+不能跃出边界,即 $0 \le x < n$,$0 \le y < m$(以 $0$ 为起点)
+不能重复搜索
+
+选择路径之后就扩展,将位置标记为已搜索。若终点被标记为搜索过,则输出 Yes
,否则输出 No
。 代码区:
+# include <iostream>
+# include <string>
+using namespace std;
+
+int n, m;
+string a[ 103 ] ;
+bool flag[ 103 ] [ 103 ] ;
+
+void dg ( int x, int y)
+{
+ if ( x - 1 >= 0 && a[ x - 1 ] [ y] != '#' && flag[ x - 1 ] [ y] == 0 )
+ {
+ flag[ x - 1 ] [ y] = 1 ;
+ dg ( x - 1 , y) ;
+ }
+ if ( x + 1 <= n - 1 && a[ x + 1 ] [ y] != '#' && flag[ x + 1 ] [ y] == 0 )
+ {
+ flag[ x + 1 ] [ y] = 1 ;
+ dg ( x + 1 , y) ;
+ }
+ if ( y - 1 >= 0 && a[ x] [ y - 1 ] != '#' && flag[ x] [ y - 1 ] == 0 )
+ {
+ flag[ x] [ y - 1 ] = 1 ;
+ dg ( x, y - 1 ) ;
+ }
+ if ( y + 1 <= m - 1 && a[ x] [ y + 1 ] != '#' && flag[ x] [ y + 1 ] == 0 )
+ {
+ flag[ x] [ y + 1 ] = 1 ;
+ dg ( x, y + 1 ) ;
+ }
+}
+
+int main ( )
+{
+ ios:: sync_with_stdio ( false ) ;
+
+ cin >> n >> m;
+ for ( int i = 0 ; i < n; i++ )
+ {
+ cin >> a[ i] ;
+ }
+
+ dg ( 0 , 0 ) ;
+ if ( flag[ n - 1 ] [ m - 1 ] == 1 ) cout << "Yes" ;
+ else cout << "No" ;
+
+ return 0 ;
+}
+
+回溯 对于一些情况,我们需要回到上一次的结果。例如寻找路径数,若用纯 DFS,那路径肯定搜不全。因为深搜是不能重复搜索的,而寻找路径数可能需要走一些重复的路。此时,就可以用到回溯。即找完一条路径,再把它还原。
+题目举例:洛谷 P1605 跟刚才的题目有一点像,只是字符变数字,而要输出方案数。跟刚才差不多:不能越界、不能走到障碍物、方格最多经过一次。 当坐标等于终点的坐标时,答案加上一,将标记还原(回溯),return
回去。需要注意的是:起点一定要打上标记。 代码:
+# include <cstdio>
+using namespace std;
+
+int n, m, t;
+int sx, sy, fx, fy;
+int sum = 0 ;
+bool a[ 10 ] [ 10 ] ;
+bool flag[ 10 ] [ 10 ] ;
+
+void dg ( int x, int y)
+{
+ if ( x == fx && y == fy)
+ {
+ sum++ ;
+ return ;
+ }
+ if ( x - 1 >= 1 && a[ x - 1 ] [ y] != 1 && flag[ x - 1 ] [ y] == 0 )
+ {
+ flag[ x - 1 ] [ y] = 1 ;
+ dg ( x - 1 , y) ;
+ flag[ x - 1 ] [ y] = 0 ;
+ }
+ if ( x + 1 <= n && a[ x + 1 ] [ y] != 1 && flag[ x + 1 ] [ y] == 0 )
+ {
+ flag[ x + 1 ] [ y] = 1 ;
+ dg ( x + 1 , y) ;
+ flag[ x + 1 ] [ y] = 0 ;
+ }
+ if ( y - 1 >= 1 && a[ x] [ y - 1 ] != 1 && flag[ x] [ y - 1 ] == 0 )
+ {
+ flag[ x] [ y - 1 ] = 1 ;
+ dg ( x, y - 1 ) ;
+ flag[ x] [ y - 1 ] = 0 ;
+ }
+ if ( y + 1 <= m && a[ x] [ y + 1 ] != 1 && flag[ x] [ y + 1 ] == 0 )
+ {
+ flag[ x] [ y + 1 ] = 1 ;
+ dg ( x, y + 1 ) ;
+ flag[ x] [ y + 1 ] = 0 ;
+ }
+}
+
+int main ( )
+{
+ scanf ( "%d %d %d" , & n, & m, & t) ;
+ scanf ( "%d %d %d %d" , & sx, & sy, & fx, & fy) ;
+ for ( int i = 1 ; i <= t; i++ )
+ {
+ int zx, zy;
+ scanf ( "%d %d" , & zx, & zy) ;
+ a[ zx] [ zy] = 1 ;
+ }
+
+ flag[ sx] [ sy] = 1 ;
+ dg ( sx, sy) ;
+ printf ( "%d\n" , sum) ;
+
+ return 0 ;
+}
]]>
+
+ 课程笔记
+
+
+ 搜索
+ 基础算法
+ 递归
+
+
+
+ 动态规划:01 背包
+ //posts/dp-zobb/
+ 背包问题是动态规划中很典型的一个问题。一个背包有特定的重量,去装重量为 w 价值为 d 的物品,在不超过背包重量上限的前提下使物品的价值和最高。 这个问题一看,就不是贪心可以做的来的。所以,就可以用上我们的爆搜!!(暴力出奇迹)动态规划来解决背包问题。
+
+
+从爆搜到记搜的引入 自然,动规能解决的问题爆搜也一定能解决,无非慢了点儿而已。例如 [洛谷 P2871],只需:
+int w[ 3410 ] , d[ 3410 ] ;
+int maxn = 0 ;
+
+void dg ( int x, int tw, int td)
+{
+ if ( tw > m)
+ {
+ return ;
+ }
+ if ( x > n)
+ {
+ maxn = max ( maxn, td) ;
+ return ;
+ }
+
+ dg ( x + 1 , tw + w[ x] , td + d[ x] ) ;
+ dg ( x + 1 , tw, td) ;
+}
+
+这样一个简单的爆搜就可以拿到 37 分。
+进一步优化呢?可以考虑记忆化搜索。用 dp[i][j] 数组记录重量为 i 价值为 j 时的情况。由于需要记忆化,可以通过返回参数的形式。代码如下:
+int dp[ 3410 ] [ 12883 ] ;
+
+int dg ( int x, int tw)
+{
+ if ( x > n)
+ {
+ return 0 ;
+ }
+ if ( dp[ x] [ tw] ) return dp[ x] [ tw] ;
+
+ int t = 0 ;
+ if ( tw + w[ x] <= m)
+ {
+ t = dg ( x + 1 , tw + w[ x] ) + d[ x] ;
+ }
+ dp[ x] [ tw] = max ( t, dg ( x + 1 , tw) ) ;
+ return dp[ x] [ tw] ;
+}
+
+这样一个程序可以拿到 82 分,9 10 两点超时,若开启 O2 优化变成超出内存限制。显然,这么大的数据数组的大小肯定炸掉。
+使用动态规划 其实,通过上面的我们已经可以推出式子:dp[i][j] = max(dp[i + 1][j + w[i]], dp[i + 1][j]);
,实现就很简单了:
+# include <cstdio>
+# include <algorithm>
+using namespace std;
+
+int n, m;
+int w[ 3410 ] , d[ 3410 ] ;
+int dp[ 3410 ] [ 12883 ] ;
+
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ scanf ( "%d %d" , & w[ i] , & d[ i] ) ;
+ }
+
+ for ( int i = n; i >= 1 ; i-- )
+ {
+ for ( int j = 0 ; j <= m; j++ )
+ {
+ int t = 0 ;
+ if ( j + w[ i] <= m)
+ {
+ t = dp[ i + 1 ] [ j + w[ i] ] + d[ i] ;
+ }
+ dp[ i] [ j] = max ( t, dp[ i + 1 ] [ j] ) ;
+ }
+ }
+
+ printf ( "%d\n" , dp[ 1 ] [ 0 ] ) ;
+
+ return 0 ;
+}
+
+这次,不开 O2 也不会超时,但是内存仍然爆炸。
+滚动数组 可以发现,状态转移方程用过前面的数据之后,前面的数据就废弃了,因此,可以使用滚动数组。
+# include <cstdio>
+# include <algorithm>
+using namespace std;
+
+int n, m;
+int w[ 3410 ] , d[ 3410 ] ;
+int dp[ 2 ] [ 12883 ] ;
+
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ scanf ( "%d %d" , & w[ i] , & d[ i] ) ;
+ }
+
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ for ( int j = 0 ; j <= m; j++ )
+ {
+ int t = 0 ;
+ if ( j - w[ i] >= 0 )
+ {
+ t = dp[ 1 - i % 2 ] [ j - w[ i] ] + d[ i] ;
+ }
+ dp[ i % 2 ] [ j] = max ( t, dp[ 1 - i % 2 ] [ j] ) ;
+ }
+ }
+
+ printf ( "%d\n" , dp[ n % 2 ] [ m] ) ;
+
+ return 0 ;
+}
]]>
+
+ 课程笔记
+
+
+ 搜索
+
+
+
+ 二分
+ //posts/erfen/
+ 二分的意义优化 。顾名思义,将一整个有序的 数列分成两个部分,不断缩小边界,查找某个数字。 二分的时间复杂度为 $O(log\ 2\ n)$ 。
+此时,我们学的还是整数二分以及浮点二分。
+整数二分的两个模板 二分的前提是这个序列是有序的 ,也就是单调递增的。 一般来说,二分会取中间值进行初始化,再判断这个中间值是否大于目标值。若是,则缩减左边界,否则缩减右边界。直至逼近答案。 说“逼近”,是因为有时查找的元素不存在于序列中,那所二分出的答案是接近于的,但又是不正确的。所以要加上一个特判。除非说明给出的想查询的元素所有都是存在于序列中的。
+
+
+二分听起来还简单,但是实现起来可能对我来说还要多方面考虑。例如,当这样一段二分代码(假设数组 $a$ 的下标从 $1$ 开始):
+for ( int i = 1 ; i <= m; i ++ )
+{
+ int x ;
+ scanf ( "%d" , & x) ;
+ int l = 1 , r = m ;
+ while ( l < r)
+ {
+ int mid = ( l + r) / 2 ;
+ if ( x > a[ mid] ) l = mid ;
+ else r = mid ;
+ }
+}
+此时, $l$ 或 $r$ 其实已经是正确答案了,但是它会陷入死循环。例如 $a$ 为 $1 \ 2 \ 3 \ 4 \ 5$, $x$ 为 $4$ 时,是这样的:
+$$ {\color{green}1 \ 2 \ 3 \ 4 \ 5} \ $$ $$ (\texttt{mid}=(1+5)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=5) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ 5} \ $$ $$ (\texttt{mid}=(4+5)/2=4, a[\texttt{mid}]=4, 4=4, l=3, r=\texttt{mid}=4) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ }{\color{red}5} \ $$ $$ (\texttt{mid}=(3+4)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=4) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ }{\color{red}5} \ $$ $$ (\texttt{mid}=(3+4)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=4) \ $$ $$ {\color{red}1 \ 2 \ }{\color{green} 3 \ 4 \ }{\color{red}5} \ $$ $$ (\texttt{mid}=(3+4)/2=3, a[\texttt{mid}]=3, 4>3, l=\texttt{mid}=3, r=4) \ $$ $$ \textup{…Forever…} $$
+因此,我们为什么不把 $l$ 的赋值加上一个呢?这样就不会无限循环下去了。就像这样:
+for ( int i = 1 ; i <= m; i ++ )
+{
+ int x ;
+ scanf ( "%d" , & x) ;
+ int l = 1 , r = m ;
+ while ( l < r)
+ {
+ int mid = ( l + r) / 2 ;
+ if ( x > a[ mid] ) l = mid + 1 ;
+ else r = mid ;
+ }
+}
+这就是整数二分的一个模板了。又或者:
+int x ;
+scanf ( "%d" , & x) ;
+int l = 1 , r = n ;
+while ( l < r)
+{
+ int mid = ( l + r + 1 ) / 2 ;
+ if ( x > a[ mid] ) l = mid ;
+ else r = mid - 1 ;
+}
+
+浮点数二分 其实,任何一个算法都是相通的。二分也是一样。浮点二分可能比整数二分简单一些。(出自于我们老师之口)
+但,最重要的就是精度问题 。 它决定了 ${\texttt{TLE}}$ 和 $\texttt{WA}$ 以及 $\texttt{AC}$ 之间的差距。详见 洛谷P3743 以及 我可怜的评测记录 。这就是残酷的现实!代码是简单了很多,但是要确定精度 !!!
+好了,模版代码大放送:
+double l = - 1e10 , r = 1e10 ;
+while ( r - l > 1e-6 )
+{
+ double mid = ( l + r) / 2 ;
+ if ( )
+ {
+ l = mid ;
+ }
+ else
+ {
+ r = mid ;
+ }
+}
+
+二分答案 当我们想要枚举时,二分自然就是枚举的首选前提。一般来说,二分答案会写一个函数,传统名称为 check
。 其实它还是二分,只不过判断的条件由单一的 valuname > name[mid]
变成了一个判断函数而已。我是不是没讲清楚啊 $\texttt{\color{white}但也没什么好讲的了}$
+
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 优化
+
+
+
+ 自己画的一些画
+ //posts/drawpic/
+ 附注:
+此文章将保留。
+
+放假了闲着没事情干,便画了一些画,放在这儿,留此纪念。
+
+
+]]>
+
+ 琐碎
+
+
+
+ 消失效果
+ //posts/erase-css/
+ 从 ncase.me 学来的,可以自己看源码。主要是通过背景图片 的位置实现。结合了 CSS 和 JS。 可以自己增加一个函数在隐藏时执行。 你只要这样就可以:
+< p>
+ 美好的文字
+ Have a good day!
+ < div class = " scratcher" > </ div>
+</ p>
+
+代码和示例请看下面。
+
+
+代码和使用方法 模拟的笔涂白是通过 CSS 背景图片的位置完成的。代码如下:
+.scratcher {
+ position : absolute;
+ top : 0;
+ left : 0;
+ width : 100%;
+ height : 100%;
+ background : url ( https://s2.loli.net/2023/12/16/NOVHCgALzK4Fd1Q.png) ;
+ background-size : 200% 2000%;
+ display : none;
+ z-index : 200;
+}
+
+其中,width
height
设为 100% 是为了铺满元素(整个使用时用到),z-index
进行覆盖。 使用时请添加 <div class="scratcher"></div>
在准备显示隐藏的元素内 ,使其成为准备隐藏的元素的子元素 ,方便更改容器的位置。下面的 JS 会更改它的位置和大小。
+var divList = document. querySelectorAll ( ".scratcher" ) ;
+for ( let i = 0 ; i < divList. length; i++ ) {
+ divList[ i] . style. display = "none" ;
+ divList[ i] . style. backgroundPosition = "-100% -1900%" ;
+ var lpnt = divList[ i] . parentNode;
+ if ( window. getComputedStyle ( lpnt) . position == "relative" ) {
+ divList[ i] . style. bottom = "0" ;
+ divList[ i] . style. right = "0" ;
+ }
+ else {
+ divList[ i] . style. top = String ( lpnt. offsetTop) + "px" ;
+ divList[ i] . style. left = String ( lpnt. offsetLeft) + "px" ;
+ }
+ divList[ i] . style. width = String ( lpnt. offsetWidth) + "px" ;
+ divList[ i] . style. height = String ( lpnt. offsetHeight) + "px" ;
+}
+
+为了应对相对定位这种特殊情况,代码中也进行了判断。其他情况则是设置相同大小和位置(left
,top
),覆盖其父元素。 进行擦除和显示时,也采用 JS,自己可以在下面的代码中添加隐藏后执行的函数。
+var divList = document. querySelectorAll ( ".scratcher" ) ;
+function eraseAndShow ( num ) {
+ divList[ num] . style. display = "block" ;
+ for ( let i = 1 ; i <= 19 ; i++ ) {
+ setTimeout ( ( ) => {
+ divList[ num] . style. backgroundPosition = ` 0% ${ i * - 100 } % ` ;
+ } , i * 100 ) ;
+ }
+
+
+
+
+ for ( let i = 1 ; i <= 19 ; i++ ) {
+ setTimeout ( ( ) => {
+ divList[ num] . style. backgroundPosition = ` -100% ${ i * - 100 } % ` ;
+ } , i * 100 + 2100 ) ;
+ }
+ setTimeout ( ( ) => { divList[ num] . style. display = "none" ; } , 4000 ) ;
+}
+
+在添加以上所有代码后,就可以在任意一个元素内添加 <div class="scratcher"></div>
,再在执行 JavaScript 代码 eraseAndShow(0)
,试验性地查看效果。
+示例 下面是一些示例,点击按钮“隐藏和显示”可以看到效果
+
+
+以下文字在点击按钮后会被更改:
+
+
心情,是一种感情状态,拥有了好心情,也就拥有了自信,继而拥有了年轻和健康。就拥有了对未来生活的向往,充满期待,让我们拥有一份好心情吧,因为生活着就是幸运和快乐。
+
当你孤独时,风儿就是我的歌声,愿它能使你得到片刻的安慰;当你骄傲时,雨点就是我的警钟,愿它能使你获得永恒的谦逊。
+
友情如水,淡而长远;友情如茶,香而清纯;友情如酒,烈而沁心;友情如雨,细而连绵;友情如雪,松而亮洁。人生短暂,珍惜友情。
+
+
隐藏和显示
+
+
+
+由于是通过背景图片的位置模拟擦除效果,所以当点击按钮后在消失前按钮无法被点击。这个特性很好地使用在切换容器内容上。
+以下是一个简单的示例:
+danger #d9534f
+
test
test
test
+
test
test
test
+
test
test
test
+
隐藏和显示
+
+
+
+
+
+
+希望对自己,对别人都有帮助!
+
+]]>
+
+ 编程随记
+
+
+ JavaScript
+ HTML
+
+
+
+ 函数
+ //posts/function/
+ 函数的作用一般来说,我都是懂的。函数的总用比较简单:
+
+优化代码量
+让程序代码更加清晰明了
+调用时更加方便
+
+总之,函数的存在就是为了更加方便 ,清晰 ,快速 。
+
+
+定义函数 方法:
+[ 函数类型] [ 函数名称] ( [ 参数] )
+{
+ [ 主体] ;
+ return [ ] ;
+}
+
+如:
+int add ( int x, int y)
+{
+ int ans = x + y ;
+ return ans ;
+}
+
+
+注意 :当不返回(无return
)时,函数类型应为void
(表面含义无类型 )。
+形参和实参 当你运行这段代码 时:
+# include <stdio.h>
+using namespace std ;
+
+int swap ( int x, int y)
+{
+ int t = x ;
+ x = y ;
+ y = t ;
+}
+
+int main ( )
+{
+ int a, b ;
+ scanf ( "%d %d" , & a, & b) ;
+
+ swap ( a, b) ;
+ printf ( "%d %d\n" , a, b) ;
+}
+
+你会发现a
还是a
,b
还是b
。
+这是因为swap(int, int)
只是把函数内的 x
和y
交换了而已,a
和b
没有交换。
+因为x
和y
对于*main
函数*来说只是形参,x
和y
只是拷了一份a
和b
。
+如果想交换a
和b
需要这样写:
+# include <stdio.h>
+using namespace std ;
+
+int swap ( int & x, int & y)
+{
+ int t = x ;
+ x = y ;
+ y = t ;
+}
+
+int main ( )
+{
+ int a, b ;
+ scanf ( "%d %d" , & a, & b) ;
+
+ swap ( a, b) ;
+ printf ( "%d %d\n" , a, b) ;
+}
+
+此时此刻,你使用x
和y
就相当于引用了a
和b
。
+函数重载 函数名不可重复。
+但是有几种方法可以重复:
+
+比如:
+# include <stdio.h>
+using namespace std ;
+
+int add ( int a, int b)
+{
+ return a + b ;
+}
+void add ( )
+{
+ printf ( "Hello\n" ) ;
+}
+
+int main ( )
+{
+ int n = add ( 1 , 2 ) ;
+ printf ( "%d\n" , n) ;
+ add ( ) ;
+
+ return 0 ;
+}
+
+输出:
+3
+Hello
+
+
+注意: 仅仅函数类型不同不足以区分两个函数!
+拓展:主函数中的argc
和argv
实际上我不懂 用法:
+int main ( int argc, char * argv[ ] )
+
+或:
+int main ( int argc, char * * argv)
+
+
+含义:
+
+argc
:是argument count 的缩写,保存运行时传递给main函数的参数个数。
+argv
:是argument vector 的缩写,保存运行时传递main函数的参数,类型是一个字符指针数组,每个元素是一个字符指针,指向一个命令行参数。
+
+比如:
+# include <stdio.h>
+using namespace std ;
+
+int main ( int argc, char * argv[ ] )
+{
+ printf ( "sum: %d\n" , argc) ;
+ for ( int i = 0 ; i < argc; i ++ )
+ {
+ printf ( "argc[%d], %s\n" , i, argv[ i] ) ;
+ }
+
+ return 0 ;
+}
+
+打开命令行,cd
文件所在文件夹,输入:[file name].[file extension] hello world i am so happy
+结果为:
+sum: 7
+argc[ 0 ] , 未命名1.exe
+argc[ 1 ] , hello
+argc[ 2 ] , world
+argc[ 3 ] , i
+argc[ 4 ] , am
+argc[ 5 ] , so
+argc[ 6 ] , happy
+
+这就是main
函数参数作用。
+]]>
+
+ 课程笔记
+
+
+ 语言入门
+ 函数,参数
+
+
+
+ 使用 gdb 调试代码
+ //posts/gdb-debug-file/
+ 这几天刚去学习了一下用 gdb 调试代码,在这儿记下来。
+首先,编译代码的时候需要加上 -g
选项,说明要加上调试信息,这样才可以正常调试。例如:
+$ g++ -g oi.cpp -o oi.exe
+
+随后,即可使用 gdb 打开文件进行调试。直接使用 gdb [file name]
即可。
+$ gdb oi
+GNU gdb ( GDB) 7.8 .1
+Copyright ( C) 2014 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html>
+
+For help, type "help" .
+Type "apropos word" to search for commands related to "word" .. .
+Reading symbols from oi.. .done.
+( gdb)
+
+
+
+gdb 一些常用调试命令(命令缩写)的详细解释:
+代码、路径 list 命令缩写是 l
。 可以查看代码,后面跟上数字说明要查看第几行附近的代码 ,或者跟上函数名说明要查看这个函数附近的代码 。若没有参数则继续从上一次最后显示的那一行显示下去。
+例如:
+( gdb) l 17
+12 for( int i = 0 ; s[ i] != '\0' ; i++)
+13 {
+14 char l, r;
+15 if (( s[i] >= 'a' && s[i] <= 'z') || ( s[i] >= '0 ' && s[i] <= '9 '))
+16 {
+17 l = s[ i] ;
+18 ans[ cnt++] = s[ i] ;
+19 }
+20 if( s[ i] == '-' )
+21 {
+( gdb) list main
+3
+4 int p1, p2, p3, cnt;
+5 char s[ 200 ] ;
+6 char ans[ 7000 ] ;
+7 int main( )
+8 {
+9 scanf( "%d %d %d\n " , & p1, & p2, & p3) ;
+10 scanf( "%s" , & s) ;
+11
+12 for( int i = 0 ; s[ i] != '\0' ; i++)
+( gdb) l
+13 {
+14 char l, r;
+15 if (( s[i] >= 'a' && s[i] <= 'z') || ( s[i] >= '0 ' && s[i] <= '9 '))
+16 {
+17 l = s[ i] ;
+18 ans[ cnt++] = s[ i] ;
+19 }
+20 if( s[ i] == '-' )
+21 {
+22 r = s[ i + 1 ] ;
+
+info source 可以简写为 i source
获取代码信息,可以查看 gdb 获取的代码路径是否正确。
+例如:
+( gdb) info source
+Current source file is oi.cpp
+Compilation directory is D:\ MyCode
+Located in D:\ MyCode\ oi.cpp
+Contains 65 lines.
+Source language is c++.
+Compiled with DWARF 2 debugging format.
+Does not include preprocessor macro info.
+
+file 参数是文件路径,可以重新打开一个文件调试。 例如:
+( gdb) file D:\ \ MyCode\ \ oi
+Reading symbols from D:\ MyCode\ oi.. .done.
+
+cd 同任何命令行的 cd 命令一样,切换工作文件夹。
+程序运行时 run
命令。 命令缩写是 r
。运行程序 ,直至遇到断点或程序结束。
+print
命令。 命令缩写是 p
。 在程序运行 时输出变量(数组)的值。
+break
命令。 命令缩写是 b
,参数是行号或函数名。 表示在函数或第几行设置断点。 例如:
+( gdb) break main
+Breakpoint 1 at 0x40153d: file oi.cpp, line 9 .
+( gdb) b 43
+Breakpoint 2 at 0x401722: file oi.cpp, line 43 .
+
+continue
命令。 命令缩写是 c
。 遇到断点后使用,继续执行 ,运行到下一个断点或程序结束。
+delete
命令。 命令缩写是 d
。 删除断点,参数是断点编号 。就是 Breakpoint 1 at []: file [], line [].
Breakpoint 后面的数字。
+next
命令。 命令缩写是 n
。 执行当前行语句,如果当前行有函数调用,则将其视为一个整体执行。
+熟知以上这些,就可以简单地调试代码了。 一个实例:
+( gdb) break 25
+Breakpoint 1 at 0x4016b1: file oi.cpp, line 25 .
+( gdb) break 32
+Breakpoint 2 at 0x4016ea: file oi.cpp, line 32 .
+( gdb) break 35
+Breakpoint 3 at 0x4016fe: file oi.cpp, line 35 .
+( gdb) run
+Starting program: D:\ MyCode\ oi.exe
+[ New Thread 37568 .0x97c8]
+[ New Thread 37568 .0x25fc]
+2 3 2
+a-d-d
+
+Breakpoint 2 , main ( ) at oi.cpp:33
+33 l = l - 'a' + 'A' ;
+( gdb) print p1
+$2 = 2
+( gdb) print p2
+$3 = 3
+( gdb) p p3
+$4 = 2
+( gdb) c
+Continuing.
+
+Breakpoint 3 , main ( ) at oi.cpp:37
+37 if( p3 == 1 )
+( gdb) print l
+$5 = 65 'A'
+( gdb) print r
+$6 = 68 'D'
+( gdb) continue
+Continuing.
+
+Breakpoint 1 , main ( ) at oi.cpp:25
+25 ans[ cnt++] = '-' ;
+( gdb) print ans[ cnt - 1 ]
+$7 = 100 'd'
+( gdb) print ans
+$8 = "aCCCBBBd" , '\000' < repeats 6991 times>
+( gdb) continue
+Continuing.
+aCCCBBBd-d
+[ Thread 37568 .0x25fc exited with code 0 ]
+[ Inferior 1 ( process 37568 ) exited normally]
+
+获取信息 获取信息通常使用 info
命令。就介绍常用的那些。
+info breakpoint
可以简写为 i b
,查看断点信息。
+info registers
可以简写为 i reg
,查看寄存器信息。
+info stack
可以简写为 i s
,查看堆栈使用,在递归的时候很有效。
+实例:
+( gdb) info breakpoint
+Num Type Disp Enb Address What
+1 breakpoint keep y 0x000000000040153b in dfs( int) at oi.cpp:10
+ breakpoint already hit 5 times
+2 hw watchpoint keep y x
+( gdb) info reg
+rax 0x4 4
+rbx 0x1 1
+rcx 0x4 4
+rdx 0x3 3
+rsi 0x11 17
+rdi 0xc41440 12850240
+rbp 0x6cfcf0 0x6cfcf0
+rsp 0x6cfcc0 0x6cfcc0
+r8 0xc43d10 12860688
+r9 0x1 1
+r10 0xc40000 12845056
+r11 0x6ceac0 7137984
+r12 0x1 1
+r13 0x8 8
+r14 0x0 0
+r15 0x0 0
+rip 0x40153b 0x40153b < dfs( int) +11 >
+eflags 0x206 [ PF IF ]
+cs 0x33 51
+ss 0x2b 43
+ds 0x0 0
+es 0x0 0
+fs 0x0 0
+gs 0x0 0
+( gdb) info stack
+
+
+
+
+
+
+
+
+
+
+
+
+
+其他 shell
命令。 可以执行终端命令。
+quit
命令。 简写为 q
。 退出 gdb 调试。
+]]>
+
+ 编程随记
+
+
+ 编译
+
+
+
+ Git 的连接 Github 小记
+ //posts/git-github/
+ 又是一个随记,方便自己使用的。 首先,得到 官网下载 ,随后测试一下:
+$ git -v
+git version ( VERSION)
+
+就下载好了。
+
+使用 SSH 连接 Github 首先确保拥有一个 Github 账号,打开终端,生成 SSH 密钥:
+$ ssh-keygen -t rsa -C "email"
+
+它的提示全部回车就可以了。”email” 是 Github 注册使用的邮箱地址。
+成功后会在用户文件夹(Windows 下通常是 %USERPROFILE%
环境变量,Linux 直接打开 ~/
)下生成一个 .ssh
文件夹,打开 id_rsa.pub
文件,复制里面的密钥后回到 Github 打开设置,找到 “SSH anf PGP keys “ 一栏,点击 “New SSH key”,Title 填上,将刚刚复制的密钥粘贴到 “Key” 一栏,点击 “Add SSH key” 保存。
+
+随后可以验证是否完成,打开终端输入:
+$ ssh -T git@github.com
+The authenticity of host 'github.com (IP ADDRESS)' can't be established.
+RSA key fingerprint is (FINGERPRINT).
+Are you sure you want to continue connecting (yes/no)? yes #在这里输入 yes
+Hi (USER NAME)! You' ve successfully authenticated, but GitHub does not provide shell access.
+
+连接 Github 仓库 新建 Github 仓库。在电脑新建一个文件夹,创建一些文件,然后打开终端:
+$ git init
+Initialized empty Git repository in /.git/
+
+$ git add ( FILE NAME)
+create mode 100644 ( FILE NAME)
+
+$ git commit -m "The commit information"
+
+$ git branch -M main
+
+$ git remote add origin git@github.com:( USER NAME) /( REPOSITORY NAME) .git
+
+$ git push -u origin main
+Enumerating objects: 7735 , done.
+Counting objects: 100 % ( 7735 /7735) , done.
+Delta compression using up to 4 threads
+Compressing objects: 100 % ( 7413 /7413) , done.
+Writing objects: 100 % ( 7735 /7735) , 55.74 MiB | 1.53 MiB/s, done.
+Total 7735 ( delta 2030 ) , reused 0 ( delta 0 ) , pack-reused 0
+remote: Resolving deltas: 100 % ( 2030 /2030) , done.
+To github.com:( USER NAME) /( REPOSITORY NAME) .git
+ * [ new branch] main -> main
+branch 'main' set up to track 'origin/main' .
+
+打开 Github,可以看到 Commit 记录和提交的文件。
+]]>
+
+ 编程随记
+
+
+ Git
+
+
+
+ 数据结构:树的概念与储存
+ //posts/graph-tree/
+ 树 也是一种数据结构,它是非线性数据结构 ,它能很好地描述一个数据集合中的分支和层次,是一个比较重要的课题,以后的搜索和竞赛都有可能要用到它。树形结构的应用非常广泛,什么索引、语法结构。虽说概念比较繁琐 老师讲了一个小时。有点让人头疼(我咕了好多篇笔记了)。
+树的概念 前面 前置芝士,简单说一下这些奇怪的名称:
+
+树中的每一个元素称为结点 node 。
+两个结点之间的线称为边 edge 。
+通过几条边,这几条边组成路径 。
+
+
+
+树的结点一般画为圆圈,树若画出来也就是几个结点(圆)和几条边(线)组成的图,比较形象化,实际的树的储存方式是通过链表 中的数据域将一个个结点(元素)连接起来,比较麻烦,后面再说。 还有一个概念:树的边的个数比树的结点的个数少一。也就是说,假设树的结点的个数为 $n$,则树的边的个数为 $n-1$。
+判断一张图是否为树 树最重要的就是每两个结点之间有且只有一条路径可以到达 ,也就是说,不可以形成环,不可以在一个树中无法到达所有结点。例如,下面就是一个树: 下面两张图不是树,他们分别违反了“不可以形成环”、“不可以在一个树中无法到达所有结点”。
+更多的概念 首先放一张图:
+以这张图为例,来说下面的概念吧。根结点 root :根结点通常在最上方,是所有子结点的父结点。在上面的那张图中,结点 1 就是整张图的根结点。在上面的图中,根结点可以更换,也不会影响到什么,但是根结点一变就会让树形态发生变化(假如结点 2 是整个树的根结点,那么树会变下面的图 )。一个树是必须要有根结点的,根结点只有一个。 父结点 parent(双亲结点) 子结点 child(孩子结点) :一个结点的分支就是那个结点的子结点,相反那个结点是分支结点的父结点。子结点通过父结点到达。例如结点 4 5 是结点 2 的子结点,结点 3 是结点 6 7 的父结点。兄弟结点 :同一个父结点的子结点称为兄弟结点。例如结点 4 5 互为兄弟结点,6 7 互为兄弟结点。度 :树的度就是一个结点子结点的个数。例如结点 2 的度就是 2,因为它只有两个子结点。深度 :从根结点 到当前结点的层数,根结点的深度是 1。例如,结点 1 深度为 1,结点 2 3 深度为 2,结点 4 5 6 7 深度为 3。叶子结点 :一个结点的度为 0,就叫做叶子结点。例如结点 4 5 6 7 都是叶子结点。n 叉树 :在树中,这个数是多少叉看度最多的结点,例如这个树就是二叉树(也比较特殊,后面讲)。子树 :假设将树中任意一个度不为 0 的结点与它的父结点切断它们之间的边,那么断开的那一部分又能成为一个新的树,称为子树。例如结点 2 4 5 可以组成一个子树。
+还有一大堆子子孙孙祖先的什么的,懒得写了。说真的,感觉说多了意义不大。
+二叉树的概念 n 叉树中,又出现了一个二叉树 Binary Tree 这么个奇怪的概念。什么左子树右孩子什么的不记了,就讲三个我认为比较重要的。
+完美二叉树 : 也叫做满二叉树。简单来说就是一个深度为 $n$ 的二叉树,拥有 $2^n - 1$ 个结点。看着的话就是若再增加一个结点使其继续为二叉树,深度就必须要加一了。刚才的示例图就是一个完美二叉树。完全二叉树 : 完全二叉树的叶子结点可以不是满的,但是剩下的叶子结点必须都在图的左边。例如那张示例图若将结点 7 去掉,它就只是一个完全二叉树。完满二叉树 : 完满二叉树的结点除了叶子结点以外其他结点的度都必须是 2。示例图若将结点 4 5 去掉,它就只是一个完满二叉树。
+注意:
+这三个概念极易弄混淆,稍不注意就忘了。完美二叉树一定也是完全二叉树和完满二叉树,但完满二叉树不一定是完全二叉树和完美二叉树。(别说他晕,我也晕了)
+
+树的储存 一大堆基础概念,已经够呛了(悲)。学到树的储存已经开始逐渐迷惑。。。 一般来说,树也是不太可能用真正的指针链表来储存,毕竟太难写了,内存限制一般比时间限制够用一些,就用数组模拟链表。链表就是要关心指针域,下面就是一大堆奇奇怪怪的方法。
+可能用不到的 备注:
+一般来说,这些方法用不太到,要么炸时间要么炸空间要么难实现。所以就按这种奇特的分类方法分类了,反正感觉用不到。这句话也兼下面。
+
+父亲表示法 :顾名思义,指针域指向父结点。孩子表示法 :指针域指向子结点。父亲孩子表示法 :双向链表结构,也没啥用。
+上述缺点:
+很明显,父亲法若寻找一个子结点可能要遍历整个表,很耗时间;孩子法度一大肯定爆内存,因为将每个子结点都存了下来;父亲孩子更糟糕,内存更大了,没有意义。
+
+可能会用到的 孩子兄弟表示法 :适用于二叉树,也是一个双链表结构,一个结点连接其子结点和兄弟结点。邻接矩阵表示法 :通过二维数组表示每个结点的关系,假设深度为 $k$,则空间复杂度为 $O(k^2)$。(已学废。。。)邻接表表示法 :也叫链式前向星。(没弄太懂)
+
+假设根结点为 2 时的情况:
+
+
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 数据结构
+ 树
+
+
+
+ Hexo 建立静态博客记录
+ //posts/hexo-pretty/
+ 这篇文章主要是为了记录自己用 Hexo 建站(主题 NexT)的经过,方便他人查阅和自己以后用。 关于 Hexo 的准备,可以看官方文档 ,关于主题 NexT 的,可以看 这里
+如果你是的阅读目的是准备第一次使用 Hexo 搭博客,可以遵照本文提示看。 如果你准备美化你的 Hexo(最好且主题为 NexT)的博客,可以跳到 更多高阶美化
+操作系统的异同
+
各种操作系统的过程基本一致。本文中的安装环境的主要做法是直接通过官网下载安装,其他下载方法也可行,这里不列举。
+
+
+
+准备 下载、准备环境 如果还没有安装 Git ,去官网下载。Hexo 部署需要用到。
+Hexo 是基于 Node.js 开发的,若未安装,需要先安装 Node.js ,两个版本都可以。安装完毕后打开终端检查:
+$ node -v
+v18.16.0
+$ npm -v
+9.5 .1
+$ npx -v
+9.5 .1
+
+当三个命令都正常显示版本号时,就安装成功了。
+随后,下载 Hexo 包。执行以下命令:
+$ npm install -g hexo-cli
+
+$ hexo -v
+hexo-cli: 4.3 .0
+os: .. .
+
+
+随后,可以开始建立站点文件夹了。执行以下命令初始化 Hexo 站点:
+$ hexo init blog
+$ cd blog
+$ npm install
+
+此时,站点文件夹已新建完毕。目录大概是这样(......
表示省略了很多文件):
+.
+├─ .github
+│ └─ dependabot.yml
+├─ node_modules
+│ ├─ .bin
+│ └─ ......
+├─ scaffolds
+│ ├─ draft.md
+│ ├─ page.md
+│ └─ post.md
+├─ source
+│ └─ _posts
+│ └─ hello-world.md
+├─ themes
+│ └─ .gitkeep
+├─ _config.landscape.yml
+├─ _config.yml
+├─ package-lock.json
+└─ package.json
+
+随后,可以在本地运行查看效果:
+$ hexo server
+INFO Validating config
+INFO Start processing
+INFO Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.
+
+端口占用
+
如果出现 FATAL Port 4000 has been used. Try other port instead.
说明默认的 4000 端口被占用。逐一排查或解决:
+
+ 排查是否是 Hexo 已经运行了一个服务 。(不同终端) 解决:终端内按 Ctrl+C 终止那个已经运行的 Hexo 服务。
+ 排查有无其他应用占用端口 解决:关闭占用端口的应用。
+ 以上两个方案都不可行。 解决:运行命令 hexo s -p [number]
更改端口。,[number] 为 4000 以上的数字,例如:hexo s -p 8080
+
+
+访问 http://localhost:4000/
查看效果。初始的欢迎页面大概是这个样子:
+出现问题
+
如果以上步骤完成后出现无法访问的情况,可能是什么步骤出现了问题。若找不到原因,删除工作文件夹后以上步骤逐一排查,重试一遍以后一般都会正常。
+
+自此,完成了站点文件环境的准备。以下的步骤都在这个文件夹内进行 ,文中相对文件路径父目录为这个文件夹 。
+站点整体设置 打开站点文件夹中的 _config.yml
,这个文件是 Hexo 站点的整体设置。初始时的内容大概是这个:
+
+
+
+
+
+title : Hexo
+subtitle : ''
+description : ''
+keywords :
+author : John Doe
+language : en
+timezone : ''
+
+
+
+url : http: //example.com
+permalink : : year/: month/: day/: title/
+permalink_defaults :
+pretty_urls :
+ trailing_index : true
+ trailing_html : true
+
+
+source_dir : source
+public_dir : public
+tag_dir : tags
+archive_dir : archives
+category_dir : categories
+code_dir : downloads/code
+i18n_dir : : lang
+skip_render :
+
+
+new_post_name : : title.md
+default_layout : post
+titlecase : false
+external_link :
+ enable : true
+ field : site
+ exclude : ''
+filename_case : 0
+render_drafts : false
+post_asset_folder : false
+relative_link : false
+future : true
+syntax_highlighter : highlight.js
+highlight :
+ line_number : true
+ auto_detect : false
+ tab_replace : ''
+ wrap : true
+ hljs : false
+prismjs :
+ preprocess : true
+ line_number : true
+ tab_replace : ''
+
+
+
+
+
+index_generator :
+ path : ''
+ per_page : 10
+ order_by : - date
+
+
+default_category : uncategorized
+category_map :
+tag_map :
+
+
+
+meta_generator : true
+
+
+
+
+
+date_format : YYYY- MM- DD
+time_format : HH: mm: ss
+
+updated_option : 'mtime'
+
+
+
+per_page : 10
+pagination_dir : page
+
+
+
+include :
+exclude :
+ignore :
+
+
+
+
+theme : landscape
+
+
+
+deploy :
+ type : ''
+
+一些刚建站会用到的配置的解释:
+
+title
: 网站标题。显示在 HTML <title></title>
和网站标题位置。
+subtitle
: 网站副标题。显示在网站标题下面,小字。
+author
: 网站所有者。通常显示在网站底部版权的地方。
+
+其他的以后慢慢会用到。先把上面三个站点的信息填好吧。
+YAML 格式
+
对于第一次使用 YAML 的很容易漏掉选项后的空格 。 正确:theme: landscape
错误:theme:landscape
+
+Hexo 命令 没有太多好说的。就在这里列举。
+
+
+
+命令
+缩写
+解释
+
+
+
+hexo init <folder>
+hexo i
+新建一个站点文件夹 <folder>
,Hexo 会通过 Git clone hexo starter , hexo-theme-scape 并通过 NPM 下载部分依赖。
+
+
+hexo list <type>
+hexo l <type>
+在命令行获取站点数据。<type>
值为 page
post
route
tag
category
,例如 hexo l post
列出所有文章。
+
+
+hexo new <post>
+hexo n <post>
+写一篇新文章,让 Hexo 在 ./source/_posts/ 下生成名为 <post>.md
的文件。
+
+
+hexo generate
+hexo g
+让 Hexo 生成站点文件。
+
+
+hexo server
+hexo s
+在本地运行网站,查看效果。
+
+
+hexo clean
+
+清除生成的网页。
+
+
+hexo deploy
+hexo d
+部署站点。需要配置和依赖,下面会讲到。
+
+
+通常来说,写完文章后运行:
+$ hexo g
+$ hexo d
+
+部署到 Github Pages 博客自然需要进行部署,本地运行的博客别人看不到。我当时选择部署到 Github Pages 。 所以,当时注册了 Github(若未注册,先注册 Github ),然后连接本地,参照Git 的连接 Github 小记 进行连接。 完成后,创建一个新的仓库,名为 <username>.github.io
,<username>
为自己的用户名。打开 Settings -> Page ,确保 Branch 已选择。
+运行以下命令:
+$ npm install hexo-deployer-git --save
+
+随后打开 _config.yml 文件,找到 deploy
字样,更改如下:
+
+
+deploy :
+ type : git
+ repository : git@github.com: <username> /<username> .github.io.git
+ branch : main
+
+更改完毕后,就可以运行 hexo d
部署到 Github Pages 了。访问 https://<username>.github.io
,如果第一次部署,未显示就多等一会儿。完成后,就可以看到网站了。
+修改和美化 下载主题 NexT NexT 是一个很简洁美观且不断维护的 Hexo 主题。这个博客就是 Next 主题。 首先,进行下载,运行以下命令:
+$ cd themes
+$ git clone https://github.com/next-theme/hexo-theme-next.git
+
+完成后,打开 config.yml,找到 theme
字样,更改如下:
+
+
+
+theme : hexo- theme- next
+
+找到 language
字样,更改其值为 zh-CN
。
+此时本地运行大概是这个样子:
+可以根据需要更改 NexT 主题。打开 themes/hexo-theme-next/_config.yml(主题配置文件)找到 scheme
字样,选择一个去掉 #
注释,把原本的用 #
注释上。例如:
+
+
+
+scheme : Pisces
+
+
+主题效果(图片和演示链接):
+
+
+基础修改 主页面 原本的文章链接为 YYYY/MM/DD/:title
(例如 /2023/11/04/hello
),一大串日期很难看。我当时把他改为了 posts/:title
,这样有很高的自由度(标题自定义)的同时保证了链接简短。 打开整体设置 _config.yml,找到 permalink
,更改为:
+# URL
+## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
+url: http://example.com
+- permalink: :year/:month/:day/:title/
+ + permalink: posts/:title/
+
+当文章多的时候,一整页默认有十篇文章,很长,可以减小。 打开整体设置 _config.yml,找到 per_page
,将它的的值更改为 5
。这样每一页就会简约得多。
+自定义浏览器里标签的图标 打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 favicon
,把自己的图标放到 theme/hexo-theme-next/source/images 内。三种尺寸:16x16、32x32、原大小、原大小 分别对应 small
medium
apple_touch_icon
safari_pinned_tab
,将其相应位置填写好。例如我这个博客的配置是:
+favicon :
+ small : /images/icon- 16x16.png
+ medium : /images/icon- 32x32.png
+ apple_touch_icon : /images/icon.png
+ safari_pinned_tab : /images/icon.png
+
+
+菜单栏,新页面 此时,新博客只有两大主页面:文章,主页。这未免有些太单薄,最好有个分类标签一类的。NexT 已经帮我们做好了。 打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 menu
,把 home
tags
categories
archives
前面的 #
注释都去掉。大概是这个样子:
+menu :
+ home : / | | fa fa- home
+
+ tags : /tags/ | | fa fa- tags
+ categories : /categories/ | | fa fa- th
+ archives : /archives/ | | fa fa- archive
+
+
+
+
+你也可以更改 “||
” 之后的图标,去 font-awesome.com 用英文搜索你想要的图标。例如 fa-rectangle-list
显示为
+随后运行以下命令:
+$ hexo new page tags
+$ hexo new page categories
+
+完成后打开 source/tags/index.md,在两个 ---
内新加一行 type: tags
; 同样地,打开 source/tags/index.md,加一行 type: categories
。 顺便你也可以更改它们的 title
值分别为 标签 和 分类。
+完成以上所有步骤后,你我期待的像样的一个博客诞生了。此时,新拥有博客的人可以开始 写作 了
+更多修改 CSS(Stylus) 方面 在 source 文件夹下新建文件夹 _data,在 source/_data 下新建文件 styles.styl,根据下面的代码注释插入你需要的内容:
+
+.headband {
+ display : none;
+}
+
+.header,
+.main-inner {
+ margin-top : 10 px ;
+
+ +mobile ( ) {
+ margin-top : 0 ;
+ }
+}
+
+
+.post-body img {
+ border-radius : 8 px
+}
+
+
+header.header {
+ background : var ( - -content-bg-color) ;
+ border-radius : 5 px 5 px 5 px 5 px ;
+ box-shadow : 0 2 px 2 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 3 px 1 px -2 px rgba ( 0 , 0 , 0 , 0.06 ) , 0 1 px 5 px 0 rgba ( 0 , 0 , 0 , 0.12 ) ;
+}
+.site-brand-container {
+ border-radius : 5 px 5 px 0 px 0 px ;
+}
+.sidebar-inner {
+ background : var ( - -content-bg-color) ;
+ border-radius : 5 px ;
+ box-shadow : 0 2 px 2 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 3 px 1 px -2 px rgba ( 0 , 0 , 0 , 0.06 ) , 0 1 px 5 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 -1 px 0.5 px 0 rgba ( 0 , 0 , 0 , 0.09 ) ;
+ box-sizing : border-box;
+ color : var ( - -text-color) ;
+ margin-top : 12 px ;
+ max-height : calc ( 100 vh - 24 px ) ;
+}
+
+.main-inner .sub-menu, .main-inner .post-block, .main-inner .tabs-comment, .main-inner > .comments, .main-inner .comment-position .comments, .main-inner .pagination {
+ background : var ( - -content-bg-color) ;
+ border-radius : 5 px 5 px 5 px 5 px ;
+ box-shadow : 0 2 px 2 px 0 rgba ( 0 , 0 , 0 , 0.12 ) , 0 3 px 1 px -2 px rgba ( 0 , 0 , 0 , 0.06 ) , 0 1 px 5 px 0 rgba ( 0 , 0 , 0 , 0.12 ) ;
+}
+
+
+body {
+ background : url(/pic/background3.png) ;
+ background-size : cover;
+ background-repeat : no-repeat;
+ background-attachment : fixed;
+ background-position : 50 % 50 % ;
+ @media ( prefers-color-scheme: dark) {
+ background-image : none;
+ }
+}
+
+随后,打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 custom_file_path
,把 style 子项的注释去掉。更改成这个样子:
+custom_file_path :
+
+
+
+
+
+
+
+
+
+
+ style : source/_data/styles.styl
+
+以后可以根据自己的需要慢慢更改 styles.styl 的内容。
+注意备份
+
任何修改都有可能出现错误,建议多进行备份 原生成文件。有必要的话使用 git 进行版本控制 ,备份到远程仓库。否则出现错误很难改回来。尤其是更改了很多的时候。
+
+插件:搜索功能 hexo-generator-searchdb 运行以下命令下载:
+$ npm install hexo-generator-searchdb --save
+
+打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 local_search 项,更改如下:
+local_search:
+- enable: false
+ + enable: true
+ # If auto, trigger search by changing input.
+ # If manual, trigger search by pressing enter key or search button.
+ trigger: auto
+ # Show top n results per article, show all results by setting to -1
+ top_n_per_article: 1
+ # Unescape html strings to the readable one.
+ unescape: false
+ # Preload the search data when the page loads.
+ preload: false
+
+此时,在菜单栏中的搜索已出现,可以点击并键入进行搜索了。
+插件:置顶功能 hexo-generator-index-pin-top 运行以下命令下载:
+$ npm install hexo-generator-index-pin-top --save
+
+如果需要置顶一篇文章,在这篇文章的 Front-matter 中添加:
+top : true
+
+可以给置顶的文章增加标识。在 source/data 下新建文件 post-meta.njk:
+{% if post.top %}
+ <div style="padding-left: 8px;">
+ <span class="post-meta-divider" style="padding-right: 8px;">|</span>
+ <span color=black style="color: #000000; font-weight: bold; padding-left: 4px;"> <i class="fa fa-thumbtack"></i> </span>
+ <span style="color: #000000; font-weight: bold; padding-left: 4px;"> 置顶 </span>
+ </div>
+{% endif %}
+
+打开主题配置文件 themes/hexo-theme-next/_config.yml,找到 custom_file_path
,把 postMeta 的注释去掉。
+写作 运行 hexo new name
就可以在 source/_posts 下新建一篇名为 name.md 的文章。原本是这样的:
+---
+title :
+date :
+tags :
+---
+
+两个 ---
之内的内容叫做 Front-matter,它是这个文章的信息(变量)。以下是会增加和修改的东西:
+
+title
: 文章标题
+date
: 建立日期
+tags
: 标签,可以有多个。
+categories
: 分类,可以有多个。
+
+多个标签的标注方法用 -
多行,多个同级分类用 - []
,如:
+---
+tags :
+- 生活
+- 美好
+categories :
+- [ 生活]
+- [ 美好]
+---
+
+这样,这篇文章就有两个标签,两个分类。
+进行正常写作时使用 Markdown 语法,或者可以安装其他插件使用其他语言写作。
+警告
+
写了好长时间,还相当于自己又建了一个博客,不建议像我这样写这么长的文章(狗头) 开玩笑的啦~ 工作区终于清静了。。。
+]]>
+
+ 编程随记
+
+
+ HTML
+
+
+
+ CSS 鼠标悬浮窗口效果
+ //posts/hover-show/
+ 最近弄的 github 卡片,弄了半天弄出来的鼠标悬浮显示文字的效果。使用 CSS 伪元素弄出来的小提示。但是不适合 overflow: hidden;
的元素。不管怎么说,还是很好用的,忘掉了就不太好,也就放到博客里来了。
+
+
+
+
+
+代码
+效果
+
+
+
+<span aria-label="左边提示" balloon-shown="left">鼠标</span>
+鼠标
+
+
+<span aria-label="右边提示" balloon-shown="right">悬浮</span>
+悬浮
+
+
+<span aria-label="上边提示" balloon-shown="up">文字</span>
+文字
+
+
+<span aria-label="上边提示" balloon-shown="down">提示</span>
+提示
+
+
+
+
+代码是这样的:
+[aria-label][balloon-shown] {
+ position : relative;
+}
+[aria-label][balloon-shown="left"]::before {
+ border : 5px solid transparent;
+ border-left-color : #202335;
+}
+[aria-label][balloon-shown="right"]::before {
+ border : 5px solid transparent;
+ border-right-color : #202335;
+}
+[aria-label][balloon-shown="up"]::before {
+ border : 5px solid transparent;
+ border-top-color : #202335;
+}
+[aria-label][balloon-shown="down"]::before {
+ border : 5px solid transparent;
+ border-bottom-color : #202335;
+}
+[aria-label][balloon-shown]::before {
+ width : 0;
+ height : 0;
+
+ z-index : 10;
+ content : "" ;
+ position : absolute;
+ opacity : 0;
+ visibility : hidden;
+ transition : opacity .4s, transform .4s, visibility .4s;
+}
+[aria-label][balloon-shown]::after {
+ opacity : 0;
+ z-index : 10;
+
+ visibility : hidden;
+ background-color : #202335;
+ content : attr ( aria-label) ;
+ white-space : nowrap;
+ border-radius : 2px;
+ position : absolute;
+ padding : .5em 1em;
+ transition : opacity .4s, transform .4s, visibility .4s;
+ color : #eee;
+}
+[aria-label][balloon-shown]:hover::after, [aria-label][balloon-shown]:hover::before {
+ opacity : 0.9;
+ visibility : visible;
+}
+[aria-label][balloon-shown="left"]::after {
+ margin-right : 10px;
+}
+[aria-label][balloon-shown="left"]::after, [aria-label][balloon-shown="left"]::before {
+ right : 100%;
+ top : 50%;
+ transform : translate ( 5px, -50%) ;
+}
+[aria-label][balloon-shown="right"]::after {
+ margin-left : 10px;
+}
+[aria-label][balloon-shown="right"]::after, [aria-label][balloon-shown="right"]::before {
+ left : 100%;
+ top : 50%;
+ transform : translate ( -5px, -50%) ;
+}
+[aria-label][balloon-shown="left"]:hover::after, [aria-label][balloon-shown="left"]:hover::before, [aria-label][balloon-shown="right"]:hover::after, [aria-label][balloon-shown="right"]:hover::before {
+ transform : translate ( 0, -50%) ;
+}
+[aria-label][balloon-shown="up"]::after {
+ margin-bottom : 10px;
+}
+[aria-label][balloon-shown="up"]::after, [aria-label][balloon-shown="up"]::before {
+ bottom : 100%;
+ left : 50%;
+ transform : translate ( -50%, 5px) ;
+}
+[aria-label][balloon-shown="down"]::after {
+ margin-top : 10px;
+}
+[aria-label][balloon-shown="down"]::after, [aria-label][balloon-shown="down"]::before {
+ left : 50%;
+ top : 100%;
+ transform : translate ( -50%, -5px) ;
+}
+[aria-label][balloon-shown="up"]:hover::after, [aria-label][balloon-shown="up"]:hover::before, [aria-label][balloon-shown="down"]:hover::after, [aria-label][balloon-shown="down"]:hover::before {
+ transform : translate ( -50%, 0) ;
+}
+
+使用时这样使用:
+< 标签 aria-label = " 文字" balloon-shown = " up" 或"down"或"left"或"right" > 文字</ 标签>
+
+]]>
+
+ 编程随记
+
+
+ HTML
+
+
+
+ 哈夫曼树和哈夫曼编码
+ //posts/huff-tree/
+ 更前面的知识:树的概念 先来说说前面的芝士:
+
+路径长度 从根结点到目标结点经过的结点数量(边的数量)。
+权值 一个结点的权值可以是人为赋予的一个数。
+结点的带权路径长度 从根节点到当前结点的路径长度乘结点的权值。
+树的带权路径长度 整个树中叶子结点的带权路径长度总和。
+
+哈夫曼树是二叉树,且哈夫曼树的带权路径长度最小,哈夫曼编码会用到。
+
+
+哈夫曼树的构建 前面写了,哈夫曼树的带权路径长度最小,若想带权路径最小,则权值小的结点的路径长,权值大的结点路径短。哈夫曼树构建的结点都必须是叶子结点,例如用 1 2 5 6 构建的哈夫曼树是这样的: 这个树的带权路径长度为 25。
+构造过程:
+
+选出权值两个最小的结点合并;
+将两个点从将要合并的结点序列中删除,加入两个结点的和;
+重复以上步骤,直至达到要求。
+
+演示:
+哈夫曼编码 基于哈夫曼树,按照字符出现的频率(也就是哈夫曼树中的权值)进行二进制编码。 也就是用哈夫曼树对一串字符进行编码,可以认为左子树是 0,右子树是 1。(说不清楚啊) 哈夫曼编码是贪心 的思想,为了使信息量最小化,可以用到哈夫曼树。
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 树
+
+
+
+ 有关进制的一些小记
+ //posts/jinzhi/
+
+ .TEX-B {
+ color: #000;
+ }
+
+
+x 进制,代表着在这个计数方法中逢 x 进一,例如十进制就代表着逢十进一 。 我们平常在生活中用的都是十进制。进制一类的东西在 OI 中也比较重要CCF 喜欢考,计算机中的数据都是以二进制储存的,二进制也完美地利用了每一个比特。当然,只要有足够的表示方法,人们可以弄出三十二进制、六十四进制,甚至一千进制。闲的没事情干,进制有关的以及进制之间的转换就是我想记下来的话题。
+
+
+进制转换 二进制和十进制的转换 这是 €€£ CCF 出的题中一定会多少考到一点的知识,比较重要。一般来说,x 进制的数记作 $(\text {number})_x$,例如二进制数 1011 记作 $(1011)_2$,十进制数 114514 记作 $(114514)_{10}$。
+二进制 -> 十进制 二进制的数从右往左每一位都有权值,第 i 位的权值为 $2^{(i - 1)}$。举个例子:二进制数 1011001 的每一位权值是: $\mathbf{1} \to 2^6 \ \ \ \mathbf{0} \to 2^5 \ \ \ \mathbf{1} \to 2^4 \ \ \ \mathbf{1} \to 2^3 \ \ \ \mathbf{0} \to 2^2 \ \ \ \mathbf{0} \to 2^1 \ \ \ \mathbf{1} \to 2^0$。
+从二进制转换为十进制只需要将当前二进制位的值乘上权值即可。还是 1011001 :
+$$ \begin{aligned} &(1011001)_2 \\ = &(\mathbf{1} \times 2^6) + (\mathbf{0} \times 2^5) + (\mathbf{1} \times 2^4) + (\mathbf{1} \times 2^3) + (\mathbf{0} \times 2^2) + (\mathbf{0} \times 2^1) + (\mathbf{1} \times 2^0) \\ = &64 + 0 + 16 + 8 + 0 + 0 + 1 \\ = &(89)_{10} \end{aligned} $$
+可见,二进制 1011001 转换为十进制是 89 。话说 hexo next 的 mathjax 渲染越来越奇怪了。。。
+十进制 -> 二进制 可以使用短除法,将十进制除以二取余,直至商为零。最后将取余的结果倒序输出。 比如说,还是那个数字 $(89)_{10}$:
+$$ \begin{aligned} 2 \ | \underline{ \ \ \ \ \ \ \ \ } &\underline{89 \ } \\ 2 \ | \underline{ \ \ \ \ \ \ \ } &\underline{44 \ } \ \ \ \ \ \ \textbf{1} \\ 2 \ | \underline{ \ \ \ \ \ \ } &\underline{22 \ } \ \ \ \ \ \ \textbf{0} \\ 2 \ | \underline{ \ \ \ \ \ } &\underline{11 \ } \ \ \ \ \ \ \textbf{0} \\ 2 \ | \underline{ \ \ \ \ } &\underline{\ \ 5 \ } \ \ \ \ \ \ \textbf{1} \\ 2 \ | \underline{ \ \ \ } &\underline{\ \ 2 \ } \ \ \ \ \ \ \textbf{1} \\ 2 \ | \underline{ \ \ } &\underline{\ \ 1 \ } \ \ \ \ \ \ \textbf{0} \\ 2 \ | &\underline{\ \ 0 \ } \ \ \ \ \ \ \textbf{1} \end{aligned} $$
+最后,倒着输出即可得知 $(89)_{10} = (1011001)_2$ 。ps: mathjax 没有特定的短除公式,只好用这种奇特的方法模拟短除。
+P.S. 另一种更方便的双向转换方法
+
+
可以发现,其实二进制十进制的互相转换都离不开 二的 i 次方,也可以将这张表记下来(也就是从右往左不断地乘二嘛),之后的转换会方便很多。 其实这张表也就是二的 i 次方:
+
$$… 256 \ \ 128 \ \ 64 \ \ 32 \ \ 16 \ \ 8 \ \ 4 \ \ 2 \ \ 1$$
+
这算是这张表最方便的用法了,还是 $(1011001)_2$
+
+
+
+每一位
+1
+0
+1
+1
+0
+0
+1
+
+
+
+每一位对应的权值
+64
+32
+16
+8
+4
+2
+1
+
+
+
一代表着要加起来,否则不加起来,那么,这个二进制数等于这个十进制数: $(1011001)_2 = 64 + 16 + 8 + 1 = (89)_{10}$
同样的,也可以一位一位地尝试累加。假如十进制减去奶味的权值不小于 0,就减去,否则不减去,直至加起来的权值之和等于目标十进制数。例如十进制数 89:
+
+
+
+权值表
+64
+32
+16
+8
+4
+2
+1
+
+
+
+是否减去
+1
+0
+1
+1
+0
+0
+1
+
+
+过程备注
+初始的值是 89,64 < 89,就减去,89 - 64 = 25。结果 1 。
+32 > 25,不减去。结果 0 。
+16 < 25,25 - 16 = 9。结果 1 。
+8 < 9,9 - 8 = 1。结果 1 。
+4 > 1。结果 0 。
+2 > 1。结果 0 。
+1 = 1,1 - 1 = 0。结果 1 。
+
+
+
可见: $(89)_{10} = (1011001)_2$
+
+
+其他进制之间的转换 像其他进制,比如十六进制,大于 9 时就可以用字母 A B C D E F 按照顺序代替数字。
+使用十进制当作媒介的转换(对于所有进制通用) 其实,任何进制之间的转换都可以将那个进转换为十进制后再转换为目标进制。十进制也可以转换为任何进制。至于怎么转换,其实和 二进制和十进制之间的转换 差不多。 同样的,x 进制转十进制 每一位的 每一位乘上每一位的权值 之和。例如:
+$$ \begin{aligned} &(1021102)_3 \\ = &(\mathbf{1} \times 3^6) + (\mathbf{0} \times 3^5) + (\mathbf{2} \times 3^4) + (\mathbf{1} \times 3^3) + (\mathbf{1} \times 3^2) + (\mathbf{0} \times 3^1) + (\mathbf{2} \times 3^0) \\ = &729 + 0 + 162 + 27 + 9 + 0 + 2 \\ = &929 \end{aligned} $$
+$x$ 进制的从右往左数(从 1 开始数)第 $i$ 位的权值就是 $x^{(i - 1)}$。转换为十进制只需要将每一位的 每一位的权值乘那一位的数 加起来即可。
+十进制转 x 进制也可以用短除法,不断整除 x,取余,然后倒序输出。 照理说,将十进制作为媒介可以将任意进制转换为其他任意进制。 同样的,也可以通过代码更方便地实现(说一句,还是别人的代码写的好看,我写的屎山简直不忍直视,而且只能大到十六进制):
+# include <iostream>
+# include <cstdio>
+# include <cstring>
+# include <cmath>
+using namespace std;
+
+int xtoten ( int x, string s)
+{
+ int tensum = 0 , cnt = 0 ;
+ for ( int i = s. length ( ) - 1 ; i >= 0 ; i-- )
+ {
+ int t;
+ if ( s[ i] == '0' ) t = 0 ;
+ else if ( s[ i] == '1' ) t = 1 ;
+ else if ( s[ i] == '2' ) t = 2 ;
+ else if ( s[ i] == '3' ) t = 3 ;
+ else if ( s[ i] == '4' ) t = 4 ;
+ else if ( s[ i] == '5' ) t = 5 ;
+ else if ( s[ i] == '6' ) t = 6 ;
+ else if ( s[ i] == '7' ) t = 7 ;
+ else if ( s[ i] == '8' ) t = 8 ;
+ else if ( s[ i] == '9' ) t = 9 ;
+ else if ( s[ i] == 'A' ) t = 10 ;
+ else if ( s[ i] == 'B' ) t = 11 ;
+ else if ( s[ i] == 'C' ) t = 12 ;
+ else if ( s[ i] == 'D' ) t = 13 ;
+ else if ( s[ i] == 'E' ) t = 14 ;
+ else if ( s[ i] == 'F' ) t = 15 ;
+ tensum += t * pow ( x, cnt) ;
+ cnt++ ;
+ }
+ return tensum;
+}
+string tentoy ( int y, int n)
+{
+ string ret = "" ;
+ for ( ; ; )
+ {
+ int t = n % y;
+ if ( t == 0 ) ret += '0' ;
+ else if ( t == 1 ) ret += '1' ;
+ else if ( t == 2 ) ret += '2' ;
+ else if ( t == 3 ) ret += '3' ;
+ else if ( t == 4 ) ret += '4' ;
+ else if ( t == 5 ) ret += '5' ;
+ else if ( t == 6 ) ret += '6' ;
+ else if ( t == 7 ) ret += '7' ;
+ else if ( t == 8 ) ret += '8' ;
+ else if ( t == 9 ) ret += '9' ;
+ else if ( t == 10 ) ret += 'A' ;
+ else if ( t == 11 ) ret += 'B' ;
+ else if ( t == 12 ) ret += 'C' ;
+ else if ( t == 13 ) ret += 'D' ;
+ else if ( t == 14 ) ret += 'E' ;
+ else if ( t == 15 ) ret += 'F' ;
+ n /= y;
+ if ( n <= 0 )
+ {
+ break ;
+ }
+ }
+ return ret;
+}
+
+int main ( )
+{
+ int n, m;
+ string qwq;
+
+ cin >> n >> qwq >> m;
+
+ string ans = tentoy ( m, xtoten ( n, qwq) ) ;
+ for ( int i = ans. length ( ) - 1 ; i >= 0 ; i-- )
+ {
+ cout << ans[ i] ;
+ }
+
+ return 0 ;
+}
+
+
+
+将二进制转换为八进制、十六进制 注意一下,二进制并不可以直接转换为其他进制,只不过对于二进制转八进制、十六进制比较方便。若是这二进制转八进制或十六进制,要是嫌使用十进制作为媒介比较麻烦,那就可以用二进制作为媒介更加方便一些。
+将二进制转换为八进制,可以从右往左三位三位分开来,再将那三位二进制转换为十进制,合起来(注意是字符意义上的合起来)就是八进制。十六进制则是四位四位分开来。这里举两个例子:
+$$ \because \underset{\text{八进制:}}{\text{二进制:}} ( \underset{1}{\underline{1}} \ \underset{2}{\underline{010}} \ \underset{7}{\underline{111}} )_{2} $$
+
$$ \therefore (1010111)_{2} = (127)_{8} $$
$$ \because \underset{\text{十六进制:}}{\text{二进制:}} ( \underset{3}{\underline{11}} \ \underset{\text{A}}{\underline{1010}} \ \underset{1}{\underline{0001}} )_{2} $$
+
$$ \therefore (1110100001)_{2} = (\text{3A1})_{16} $$
+
+P.S. 二进制、八进制、十进制、十六进制在 C++ 中的表示方法(前缀)
+
+
以上这些进制自然有自己的表示方法。其中,二进制以 0b
开头;八进制以 0
开头;十进制就是平常的写法,没有任何前缀;十六进制以 0x
开头。 例如,以下代码会输出四个 2147483647
。
+
printf ( "%d %d %d %d\n" ,
+ 0b1111111111111111111111111111111 ,
+ 017777777777 ,
+ 2147483647 ,
+ 0x7fffffff ) ;
+
+进制小数之间的转换 进制小数也是 CCF 要考的一点,恰好在某个模拟赛上做到了,更新一下下。
+十进制小数转 x 进制 简单来说就是小数点前面正常转换,小数点之后乘 x 取整,正常输出。例如十进制 0.3 转换为二进制:
+$$ \begin{aligned} &0.3 \times 2 = \mathbf{0}.6 \\ \text{二进制小数:}&0.\mathbf{0} \\ \\ &0.6 \times 2 = \mathbf{1}.2 \\ \text{二进制小数:}&0.0\mathbf{1} \\ \\ &0.2 \times 2 = \mathbf{0}.4 \\ \text{二进制小数:}&0.01\mathbf{0} \\ \\ &0.4 \times 2 = \mathbf{0}.8 \\ \text{二进制小数:}&0.010\mathbf{0} \\ \\ &0.8 \times 2 = \mathbf{1}.6 \\ \text{二进制小数:}&0.0100\mathbf{1} \\ \\ &0.6 \times 2 = \mathbf{1}.2 \\ \text{二进制小数:}&0.01001\mathbf{1} \\ \\ &… \end{aligned} $$
+最后可以得出:
+$$ (0.3)_{10} = (0.0\dot{1}00\dot{1}) $$
+注:无限循环小数
+x 进制小数转十进制 其实和整数位很像,不过从左往右第 i 位的权值是 -i。不写了吧。。。
+位运算 位运算是一个比较毒瘤有趣的运算,是二进制的运算。当然也可以通过位运算做一些与平常的(逻辑)运算符等价的运算,但速度更快。
+按位与运算 &
将两个二进制的每一位逐个比较,若这一位都为 1 则得出 1,否则得出 0。若这两个二进制数字位数不同可以在前面补零。
+1 & 1 = 1;
+0 & 0 = 0;
+1 & 0 = 0;
+0 & 1 = 0;
+
+这个运算符还有一个备选关键字:bitand
,比如 10 & 3
等价于 10 bitand 3
。 其实所有位运算也可以在 C++ 中用十进制直接运算,例如 10 & 3
,用 0b
前缀也行,也就是 0b1010 & 0b11
或 0b1010 & 0b0011
。 举个更详细的例子:
+$$ \begin{matrix} & 1011001 \\ \& & 0111101 \\ \hline & 0011001 \end{matrix} $$
+转为十进制就是 89 & 61 = 15 。
+按位或运算 |
两个二进制的每一位比较,若有一个为 1 则得出 1,否则得出 0。同样的,若这两个二进制数字位数不同可以在前面补零。
+1 | 1 = 1;
+0 | 0 = 0;
+1 | 0 = 1;
+0 | 1 = 1;
+
+这个运算符也有一个备选关键字 bitor
,10 | 3
等价于 10 bitor 3
。 例子:
+$$ \begin{matrix} & 1011001 \\ | & 0111101 \\ \hline & 1111101 \end{matrix} $$
+转为十进制就是 89 | 61 = 125 。
+按位非运算 ~
这算是最简单的运算符了,即将每一位取反。例如 ~0
就等于 1,~1
就等于 0。 例子:
+$$ \begin{matrix} \sim & 0111101 \\ \hline & 1000010 \end{matrix} $$
+按位异或 ^
其实就是比较每一位是否相同,若相同为 0
, 不相同为 1
。
+1 ^ 1 = 0;
+0 ^ 0 = 0;
+1 ^ 0 = 1;
+0 ^ 1 = 1;
+
+C++ 中也有备选关键字,就是 xor
。10 ^ 3
等价于 10 xor 3
。 例如:
+$$ \begin{matrix} & 1011001 \\ \text{^} & 0111101 \\ \hline & 1100100 \end{matrix} $$
+转为十进制就是 89 ^ 61 = 100 。
+左移 <<
右移 >>
将所有二进制位全部左移,也就是将最左边的二进制位丢弃,右边补上一个 0。例如:10110011 << 1 = 01100110
。 右移也是一样,不过负数往左边补 1,正数补 0。
+P.S. 位运算时赋值
+
+
同 +=
-=
等符号一样,位运算也可以在符号后面加上 =
,>>=
^=
&=
<<=
|=
等运算符都是可以的。
+
+
+P.S. 位运算的一些使用技巧
+位运算其实有很多奇怪的应用。例如:
+
+
+判断偶数奇数 (能否被 2 整除)。0 是偶数 1 是奇数。([number] & 1) == 1
相当于 ([number] % 2) == 1
,平常还是写 [number] & 1
。举个例子,10 & 1 = 0
、13 & 1 = 1
。
+求 2 的几次方 ,1 << [number]
就是求 2 的 [number] 次方。例如 1 << 10 = sqrt(2, 10) = 1024
。
+交换 a b
两个数字 。可以 a ^= b; b ^= a; a ^= b
,效率比普通交换要高。
+正数变负数,负数变正数 。假设一个数字 n
,只需要 ~n + 1
就可以转变该数正负号。例如 ~1024 + 1 = -1024
、~-114 + 1 = 114
。(在 “补码” 中,详见下面的二进制编码)
+除以 2 ,使用 [number] >> 1
。例如 100 >> 1
等价于 100 / 2
,再比如 int a = 1024; a >>= 1; printf("%d\n", a);
输出 512
。
+
+
其他的应用,这里不写了,有兴趣可以去网上找更多的。
+
+
+二进制的编码 其实,刚才讲的(个别除外)二进制都是二进制中编码的一种:原码 。二进制一共有三个编码:原码 、反码 和补码 ,计算机中真正使用的是补码 。 这些编码都要规定它们的位数,否则就弄不清楚到底是正数还是负数了。在下面的随记中,我用的是8 位整型 。其实在 C++ 中,int
是 32 位整型。确定位数很重要,例如:
+int a = 0b11111111111111111111111111111111 ;
+long long b = 0b11111111111111111111111111111111 ;
+printf ( "%d %lld\n" , a, b) ;
+
+会输出 -1 4294967295
。因为 int
是 32 位整型,而 long long 是
64 位。补码的第一位是符号位,若为 1 就是负数。而我给的二进制是 32 位,第一位是 1,int
就是负数。
+原码、反码、补码的表示是将二进制用中括号括起来,再右下角写上 “原” “反”或“补”。例如 $[00001010]_{\text{原}}$、$[11101110]_{\text{补}}$。
+原码 原码、反码以及补码的最左边的那一位都是符号位 。例如 $[00000001]_{\text{原}}$ 是十进制的 1,而 $[10000001]_{\text{原}}$ 是十进制的 -1。
+在原码中,除符号位外,剩下的二进制都是按照 二进制转十进制 一样。若符号位是 1 那就将转换的十进制加个负号。例如:
+$$ \begin{aligned} (5)_{10} &= [00000101]_{\text{原}} \\ (-12)_{10} &= [10001100]_{\text{原}} \end{aligned} $$
+反码 原码变成反码,若原码是正数(符号位为 0)则不需要做任何改变;若原码是负数(符号位为 1)则将除符号位以外的位全部取反。例如:
+$$ \begin{aligned} (24)_{10} &= [00011000]_{\text{原}} = [00011000]_{\text{反}} \\ (-17)_{10} &= [10010001]_{\text{原}} = [11101110]_{\text{反}} \end{aligned} $$
+补码 其实这才是计算机真正使用的二进制编码,前面的两种编码基本上只供学习和理解用。
+若那个二进制为正数,原码、反码和补码相同;若为负数,那么它的补码是它的反码加一。(请注意,二进制加法逢二进一)例如:
+$$ \begin{aligned} (27)_{10} &= [00011011]_{\text{原}} = [00011011]_{\text{反}} = [00011011]_{\text{补}} \\ (-53)_{10} &= [10110101]_{\text{原}} = [11001010]_{\text{反}} = [11001011]_{\text{补}} \end{aligned} $$
+P.S. 补码的快速转十进制方法
+
+
同普通二进制转十进制一样,可以弄一张差不多一样的表,不同的是,这张表的最左边的数(符号位)是负数。 还是以 8 位整型为例,这张表是这样的:
+
$$-128 \ \ 64 \ \ 32 \ \ 16 \ \ 8 \ \ 4 \ \ 2 \ \ 1$$
+
刚才的 -53 就可以以这种方法转换:
+
$$ \begin{aligned} &[11001011]_{\text{补}} \\ = &-128 + 64 + 0 + 0 + 8 + 0 + 2 + 1 \\ = &(-53)_{10} \end{aligned} $$
+
+]]>
+
+ 编程随记
+
+
+ 语言入门
+
+
+
+ 记录:JavaScript 随机显示图片/随机数
+ //posts/js-random-pic/
+ 又是一个闲着没事干的随记。。。直接进入正题吧。
+考虑使用数组存储图片的链接,然后随机显示。 随机显示数组图片自然需要随机数,而随机显示图片还需要查找元素,所以就写这些。
+
+
+生成从 0 到 n 的随机数 JavaScript 有一个很强大的对象,Math
,里面有很多属性以及方法,可以去看看 MDN Web Docs 。 这么多函数中,Math.random()
正是我们想要的函数,它可以生成小于 1 的随机(小)数。例如:
+> Math. random ( ) ;
+< · 0.8823149516270028
+
+但是,它生成的随机数没有界限,而且还是小数。那么,我们可以先进行取整,再对它设置界限。Math
对象有一个函数 round()
可以对小数进行四舍五入,例如:
+> Math. round ( 1.4 )
+< · 1
+
+> Math. round ( 1.5 )
+< · 2
+
+自然,Math.round(Math.random())
就可以确保随机数是整数了。至于限制,可以将 Math.random()
的结果乘上 n,就可以获取 0~n 的整数。例如,Math.round(Math.random() * 7)
可以获取 0~7 的随机数。
+查找元素 查找元素可以使用 document.querySelectorAll("")
来选择元素(选择器)。例如 document.querySelectorAll("img");
返回所有标签为 img 的元素。 例如:下面这段话的标签为 span,id 为 testsel,点击“更改文字”即可更改下面这段话。
+
+
+ 我是一段文字。
+
+ 更改文字
+
+
+代码如下:
+var selp = document. querySelectorAll ( "span#testsel" ) ;
+selp[ 0 ] . innerHTML = "这段文字被更改过了。" ;
+
+实例 结合上面的内容,就可以做随机显示图片了。
+代码是这样的:
+var picLink = [ "https://s2.loli.net/2023/12/16/pz9HK4SACUaNoOl.jpg" , "https://s2.loli.net/2023/12/16/hNZeUdKxq79s3Rp.jpg" , "https://s2.loli.net/2023/12/16/FSTYoytCWcxhQEv.jpg" , "https://s2.loli.net/2023/12/16/8bCe5rYSxuoHKdh.jpg" , "https://s2.loli.net/2023/02/03/T1FbVC6SEgcIxzi.png" , "https://s2.loli.net/2023/12/16/onqcjm8YaxXZ4Ds.jpg" , "https://s2.loli.net/2023/12/16/qZHx9oflL4wSjuv.jpg" ] ;
+var imgSel = document. querySelectorAll ( "img#random-pic" ) ;
+var randomNumber = Math. round ( Math. random ( ) * ( picLink. length) - 1 ) ;
+imgSel[ 0 ] . src = picLink[ randomNumber] ;
+
+
+
+
+
+ 换张图片?
+
+
+封装函数
+
+ 换张图片?
+
+
+
+
+就改了一点点而已,代码如下:
+function showRandomImage ( ImgArray, Selector ) {
+ var imgSel = document. querySelectorAll ( Selector) ;
+ var randomNumber = Math. round ( Math. random ( ) * ( ImgArray. length - 1 ) ) ;
+ imgSel[ 0 ] . src = ImgArray[ randomNumber] ;
+}
+
+使用的时候,第一个参数填上图片链接的数组,第二个填上选择器。
+如果想使用 addEventListener
可以这样使用:
+function showRandomImage ( ImgArray, Selector ) {
+ return function ( ) {
+ var imgSel = document. querySelectorAll ( Selector) ;
+ var randomNumber = Math. round ( Math. random ( ) * ( ImgArray. length - 1 ) ) ;
+ imgSel[ 0 ] . src = ImgArray[ randomNumber] ;
+ }
+}
+
+const clkBtn = document. getElementById ( "rdm-btn" ) ;
+clkBtn. addEventListener ( "click" , showRandomImage ( imgArr, "img#random-pic2" ) , false ) ;
+
+二次封装之后就可以正常使用。
+]]>
+
+ 编程随记
+
+
+ JavaScript
+ HTML
+
+
+
+ 线性数据结构:链表的模板
+ //posts/lianbiao/
+ 链表类似于数组,与数组不同的是,链表可以更加方便地更改数据和删除数据。数组若想将中间的数据删除,则要非很大功夫,而链表就不同了,它的操作更加简单一些(后面说)。
+链表的数据组可以叫做“结点”,结点分成两个部分:一个是数据域,一个是指针域,数据域存数据,指针域指向下一个结点的数据地址。正是指针域将链表的每一个结点连在了一起。这种特性有一个好处:内存地址可以不连续,而数组的内存地址是必须要连续的。 比如内存还有 2GB 空闲,我申请了一个 1GB 大的数组,理论上是可以申请下来的,但占用的内存不一定完全是连续的。假设内存被一大堆东西占用的零零碎碎:确实有 2GB,但分成 4 个 500MB,这就申请不下来。而链表呢,可以充分利用内存碎片,通过指针变量,将分开的数据连在一起。
+
+
+普通的链表 链表还有一个好处:它是动态 的,也就是说,使用的内存想申请就申请,想销毁就销毁(C/C++中,其他语言我不确定) ,可以节约内存。 申请内存,可以用到 <malloc.h>
头文件中的 malloc()
函数,只有一个参数,填上你想要申请的内存大小(字节),可以和 sizeof
一起用。但它返回的是 void
类型,所以最好在它前面加上一个类型强制转换。而销毁内存,则可以用到这个头文件中 free()
函数,一个参数,往里面填上地址(指针变量)即可销毁,但从此不可以再调用 使用这个内存的变量,若调用会报错,需要注意。
+无论什么链表,还要有一个头指针,以便寻找元素时更好的去找。链表的结点一般用一个结构体,结构体里面一个是数据(data
),一个是存着下一个结点数据地址的指针变量(next
)。 示例代码如下:
+struct node
+{
+ int x;
+ node * next;
+} ;
+
+node * head;
+
+首先说直接往末尾加上元素。先要判断链表是否为空,可以通过头指针 head
是否为空(NULL
),若是第一个便创建新结点,申请为 node
类型的大小的内存,将那个结点的数据域赋值为加上的数据,再将结点的指针域设为 NULL
(以防万一),将 head
设为新结点的地址。 否则通过指针域穷举当前指针域是否为 NULL
,也就是最后一个元素,若到了最后一个元素,则申请内存,新建结点,数据域赋值,将上一个结点的指针域赋值为当前结点数据域的地址,将打钱结点指针域设为 NULL
。 示例代码如下:
+void push ( int data)
+{
+ if ( head == NULL )
+ {
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ head = New;
+ }
+ else
+ {
+ node * s = head;
+ while ( ( * s) . next != NULL )
+ {
+ s = ( * s) . next;
+ }
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ ( * s) . next = New;
+ }
+}
+
+插入也差不多,穷举到目标位置,申请内存,更改指针域。访问即是穷举,顺着指针走。更改数据还要穷举,将数据域改掉就好了。重点将删除。 首先,判断删除的是否是第一个,若是则将 head
更改为下一个结点的指针域。否则穷举目标,新建一个 node
类型的零时变量,将它赋值为删除目标的下一个结点的指针域,销毁准备删除的内存,将删除的地方的指针域赋值为那个零时变量。 完整代码:
+# include <malloc.h>
+# include <cstdio>
+using namespace std;
+
+struct node
+{
+ int x;
+ node * next;
+} ;
+
+node * head;
+
+void push ( int data)
+{
+ if ( head == NULL )
+ {
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ head = New;
+ }
+ else
+ {
+ node * s = head;
+ while ( ( * s) . next != NULL )
+ {
+ s = ( * s) . next;
+ }
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = data;
+ ( * New) . next = NULL ;
+ ( * s) . next = New;
+ }
+}
+void insert ( int x, int y)
+{
+ node * s = head;
+ y-- ;
+ while ( y)
+ {
+ s = ( * s) . next;
+ y-- ;
+ }
+ node * New = ( node * ) malloc ( sizeof ( node) ) ;
+ ( * New) . x = x;
+ ( * New) . next = ( * s) . next;
+ ( * s) . next = New;
+}
+int find ( int x)
+{
+ node * s = head;
+ x-- ;
+ while ( x)
+ {
+ s = ( * s) . next;
+ x-- ;
+ }
+ return ( * s) . x;
+}
+void update ( int x, int y)
+{
+ node * s = head;
+ x-- ;
+ while ( x)
+ {
+ s = ( * s) . next;
+ x-- ;
+ }
+ ( * s) . x = y;
+}
+void deletes ( int x)
+{
+ if ( x == 1 )
+ {
+ head = ( * head) . next;
+ return ;
+ }
+ node * s = head;
+ x-- ;
+ x-- ;
+ while ( x-- )
+ {
+ s = ( * s) . next;
+ x-- ;
+ }
+ node * t = ( * ( ( * s) . next) ) . next;
+ free ( ( * s) . next) ;
+ ( * s) . next = t;
+}
+
+int main ( )
+{
+ push ( 100 ) ;
+ push ( 200 ) ;
+ insert ( 300 , 1 ) ;
+ printf ( "first:%d, second:%d, third:%d\n" , find ( 1 ) , find ( 2 ) , find ( 3 ) ) ;
+ deletes ( 1 ) ;
+ insert ( 400 , 1 ) ;
+ printf ( "first:%d, second:%d, third:%d\n" , find ( 1 ) , find ( 2 ) , find ( 3 ) ) ;
+ return 0 ;
+}
+
+虽然代码注释讲了,为了更清楚,再说一遍输出:
+first:100, second:300, third:200
+first:300, second:400, third:200
+附演示: https://visualgo.net/zh/list
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 数据结构
+
+
+
+ 命名空间
+ //posts/namespace/
+ C++命名空间的概念在同一个作用域中,不同的数据不能起同一个名字 ,但是C++命名空间概念的出现,提供了解决问题的方案。在不同的命名空间中,可以随意定义相同的名字。命名空间就是为了避免你包含的头文件中与你自己定义的任意类,数据,函数重名,造成令人迷惑的错误而产生的。
+
+
+定义命名空间 我们可以自己定义一个命名空间,并且使用它。定义命名空间使用 namespace
关键字,使用命名空间使用 namespace::subject
使用命名空间中的函数,数据等。例如:
+# include <stdio.h>
+
+namespace mylib
+{
+ int a = 1 , b = 2 , c = 3 ;
+ void hello ( )
+ {
+ printf ( "Hello World!\n" ) ;
+ }
+}
+namespace libbb
+{
+ int a = 10 , b = 20 , c = 30 ;
+ void hello ( )
+ {
+ printf ( "HELLO WORLD!!!!\n" ) ;
+ }
+}
+
+int main ( )
+{
+ printf ( "%d %d %d\n" , mylib:: a, mylib:: b, mylib:: c) ;
+ printf ( "%d %d %d\n" , libbb:: a, libbb:: b, libbb:: c) ;
+ mylib:: hello ( ) ;
+ libbb:: hello ( ) ;
+
+ return 0 ;
+}
+
+输出 1 2 3\n 10 20 30\n Hello World!\n HELLO WORLD!!!!\n
。在命名空间 $mylib$ 和 $libbb$ 中,三个变量和一个函数的名字相同,但是所调用的命名空间不同,结果也不一样。
+在C++中,大部分函数都在命名空间 $std$ 中,全称 $stdandard$ 。
+using
使用命名空间在上段程序中,我们可以在包含头文件后加入几句:
+using namespace mylib ;
+
+这样 $mylib$ 命名空间里的 $a ~ b ~ c ~ hello()$ 可以直接写为它原本的样子,不用加上 mylib::
。这很方便。但是这种方法也有他的局限性,比如我再加入一句:
+using libbb:: a ;
+
+这样 $libbb$ 命名空间里的 $a$ 使用时也不用加上 libbb::
了。但是再次出现了两个同样的 $a$ ,谁也分不清使用的到底是 $mylib$ 命名空间里的 $a$ 还是 $libbb$ 命名空间里的 $a$ ,因此会引发错误,这也是 using
的弊端。但是有时候只会用到一个命名空间里的东西时,就比如 $std$ ,就可以直接加上一句 using namespace std ;
这样子更方便,省的 cin
也要 std::
, string
也要 std
。
+]]>
+
+ 课程笔记
+
+
+ 语言入门
+
+
+
+ 前缀和
+ //posts/qianzhuihe/
+ 开始前缀和是一种优化算法 ,用于求区间和。若数据范围特别大,写 for
循环很可能会爆时间复杂度,就可以用上前缀和了。前缀和有一维前缀和 和二维前缀和 ,我暂时还没有学二位前缀和,故在此不多赘述。
+使用 一维前缀和需要把一个数组比如数组 $a[0]$ 到 $a[n]$ ($n$ 为 $a$ 数组长度 $-1$ )储存到另一个数组中比如 数组 $b$。那么:$\sum_{i = 1}^{a[i]} b[i]$
+
+
+我们发现: $$ b[1] = a[1] \ $$ $$ b[2] = a[1] + a[2] \ $$ $$ b[3] = a[1] + a[2] + a[3] \ $$ $$ … \ $$ $$ b[i - 1] = a[1] + a[2] + … + a[i - 1] \ $$ $$ b[i] = a[1] + a[2] + … + a[i - 1] + a[i] $$ 这正好是一个递推 的过程,$b[1] = a[1],, b[2] = b[2] + a[2]…$
+同时,若 $l$ 为左边界, $r$ 为又边界,$b[r] - b[l - 1] = a[r]$ 到 $a[l]$ 的区间和。
+例题 前缀和模板 题目描述 给出一个数字$n$表示有个数字,
+给出$n$个整数$a_1$,$a_2$,…$a_n$;
+给出一个数字$m$ 有$m$个询问: 每次询问给出两个整数$s$,$e$,请求出 $a_s + a_{s+1}…a_e$
+输入格式 第一行一个整数$n$
+第二行$n$个整数$a_1$,$a_2$,…$a_n$;
+第三行一个整数$m$
+随后m行每行两个整数 s,e,($e >= s$)
+输出格式 m个整数,每一个换一行
+样例 #1 样例输入 #1 5
+1 2 3 4 5
+3
+1 2
+2 3
+1 5
+
+样例输出 #1 3
+5
+15
+
+提示 $n <= 10^5$,$a_i <= 10^4$。
+
+这道题目应该这样写:
+# include <cstdio>
+using namespace std ;
+
+int a[ 100001 ] , b[ 100001 ] ;
+int n, m ;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ b[ 1 ] = a[ 1 ] ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ b[ i + 1 ] += b[ i] + a[ i + 1 ] ;
+ }
+
+ scanf ( "%d" , & m) ;
+ for ( int i = 1 ; i <= m; i ++ )
+ {
+ int s, e ;
+ scanf ( "%d %d" , & s, & e) ;
+ printf ( "%d\n" , b[ e] - b[ s - 1 ] ) ;
+ }
+
+ return 0 ;
+}
]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 前缀和,差分
+
+
+
+ 递归
+ //posts/recursion/
+
+写递归的要点 明白一个函数的作用并相信它能完成这个任务,千万不要跳进这个函数里面企图探究更多细节, 否则就会陷入无穷的细节无法自拔,人脑能压几个栈啊。—— OI-wiki
+
+递归,就是一个函数自身调用自身。递归起到类似与循环的效果。但是,与循环不同,递归可以分支 。如果循环一定是一条直线,那么递归可能是树形结构。
+循环 -> 递归 前面说了,循环和递归很像。那么,我们可以将 for
循环尝试转为递归。先来一个循环的示例:
+for ( int i = 1 ; i <= n; i++ )
+{
+ printf ( "qwq, %d\n" , n) ;
+}
+
+首先,让我们来想一想,for
循环的括号中 3 个语句分别是干什么的呢?
+
+int i = 1;
这是循环的初始化 ,定义了一个变量 $i$,将其赋值为 $1$。
+i <= n;
这是循环每次进行下去的条件 ,当 $i>n$ 时即退出循环。
+i++
这是循环每次结束后干的事 ,当执行完循环体时, $i$ 则加 $1$。
+
+这样回忆下来,可以发现,在 for
循环的括号中 3 个语句其实可以拆分出来。 如下:
+int i = 1 ;
+for ( ; ; )
+{
+ if ( i > n) break ;
+ printf ( "qwq, %d\n" , n) ;
+ i++ ;
+}
+
+那么,直接将 for( ; ; )
改一下就好了吧?就像这样子:
+int i = 1 ;
+void rcsn ( )
+{
+ if ( i > n) break ;
+ printf ( "qwq, %d\n" , n) ;
+ i++ ;
+}
+等等,只将 for( ; ; )
改为 void rcsn()
似乎不太对,少了什么语句,函数不会自动循环(递归)啊。还有,函数哪儿来的 break;
? 是的,递归,就是要自己调用自己。函数的结束,是该使用 return
。应该这样修改:
+int i = 1;
+void rcsn()
+{
+- if(i > n) break;
+ + if(i > n) return;
+ printf("qwq, %d\n", n);
+ i++ ;
+ + rcsn();
+ }
+好了,这样就可以完整地运行了:
+# include <stdio.h>
+
+int n;
+int i = 1 ;
+void rcsn ( )
+{
+ if ( i > n) return ;
+ printf ( "qwq, %d\n" , n) ;
+ i++ ;
+ rcsn ( ) ;
+}
+
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ rcsn ( ) ;
+}
+
+递归的分步思想 前面说了,递归是可以分支的。那么,它其实比循环方便的多。就比如说,输入一个整数 $n$,按照字典序输出 $1 \sim n$ 数字不重复的排列。$1 \le n \le 9$。
+总不可能用 if
一个一个判断,然后来一个“循环 $n$ 嵌套”吧。而递归是可分支 的。可以创建一个递归函数,在递归中使用 for
循环确定递归次数。用一个数组记录是否重复。代码如下:
+# include <iostream>
+using namespace std;
+
+int n;
+bool flag[ 12 ] ;
+int a[ 15 ] ;
+
+void dg ( int id)
+{
+ if ( id > n)
+ {
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ cout << " " << a[ i] ;
+ }
+ cout << endl;
+ return ;
+ }
+
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ if ( flag[ i] ) continue ;
+
+ flag[ i] = 1 ;
+ a[ id] = i;
+ dg ( id + 1 ) ;
+ flag[ i] = 0 ;
+ }
+}
+
+int main ( )
+{
+ ios:: sync_with_stdio ( false ) ;
+ cin >> n;
+ dg ( 1 ) ;
+
+ return 0 ;
+}
+
+但是,递归并不是刚完成就返回,而是完成了整个分支 才返回。以 $n=3$ 为例,画个上面那个递归函数的图: (说明:圆圈中的数字是前进的顺序,从小到大;实线箭头和虚线箭头先走实线,走完以后再走虚线;箭头上的数字代表输出的值。
+递归的分治思想 分治,就是将一个问题分解为多个问题,然后再进行解决。用咱们老师的一个词概括,就是:
+
+分而治之
+
+举个例子:一件工程做 100 个零件,接活的找了 10 个人帮忙,那 10 个人又去找了 10 个人,每一组的 10 个人做完了向上头汇报,上头 10 个人又向接活的人汇报。 这其实就是一个递归分治的过程,这么一个例子体现了分治的基本步骤:
+
+分解 :“接活的找了 10 个人帮忙,那 10 个人又去找了 10 个人” -> 将原问题分解成子问题
+解决 :“每一组的 10 个人做完了” -> 子问题独立求解
+合并 :“(10 个人做完了)向上头汇报,上头 10 个人又向接活的人汇报。” -> 将子问题合并为原问题
+
+当分解到指定条件时,就开始解决——通常是直接返回特定的数据。
+题目举例:CodeForces 1829D 这道题目要分解为两个任务,第一是总金币数的三分之一,第二是总金币数的三分之二。分解停止开始解决的的条件有三个,分别是 $x==m$(符合条件),$x<m$(不符合条件),$x % 3 \ne 0$(不符合条件)。 可以这样想:若符合条件返回 $1$,不符合返回 $0$,将返回结果相加。若最终结果大于零,输出 YES
,否则输出 NO
。 代码如下:
+# include <cstdio>
+using namespace std;
+
+int n, m;
+int t;
+
+int dg ( int x)
+{
+ if ( x == m) return 1 ;
+ if ( x < m || x % 3 != 0 ) return 0 ;
+
+
+ int ans1 = dg ( x / 3 ) ;
+ int ans2 = dg ( x / 3 * 2 ) ;
+
+
+ return ans1 + ans2;
+}
+
+int main ( )
+{
+ scanf ( "%d" , & t) ;
+
+ for ( int i = 1 ; i <= t; i++ )
+ {
+ scanf ( "%d %d" , & n, & m) ;
+
+ int ans = dg ( n) ;
+
+ if ( ans > 0 ) printf ( "YES\n" ) ;
+ else printf ( "NO\n" ) ;
+ }
+
+ return 0 ;
+}
+
+剪枝 题外话:感觉和递归有关的分类都一团乱了,感觉 DFS 原本应该放在同一篇文章里的,剪枝和分治也应该独立说一篇。
+简短的概述: 可以说,递归也就是暴力 。暴力有两个代名词:枚举、递归。同枚举差不多,递归也有优化的方案,那就是剪枝 。剪枝,顾名思义,就是把不需要的分支剪掉,把不可能的选项排除,在递归中,可以大大提升运行速度。
+题目举例:洛谷 P1219 这道题目是 DFS 中比较经典的八皇后问题。在每行、每列、每个对角线上都只能有一个棋子(皇后)。那么,以下剪枝的几点可以确定:
+
+当这一行放过以后,就开始放下一行,将这一行排除。
+当这一列放过以后,就将这一列打上标记,不再将棋子放在这一列。
+这一个对角线放过后,打上标记,不再将棋子放到对角线上
+
+但是,对角线的标记比较难弄,对角线似乎无法打标记。对角线的标记并不是无解,对角线的 (x,y) 是有规律的。引用原文图片来找规律。先看右斜的对角线有什么规律: 可以看到,中间一条蓝色的线对应圈起来的坐标,(3,3) (5,5);靠左一条蓝色的线对应划线的坐标,(4,2) (6,4)。不难看出,$3-3=0=5-5=0; \hspace{5px} 4-2=2=6-4=2$。可见,同一条右斜对角线上,x 坐标减 y 坐标的绝对值相等。但是相对的对角线上x 坐标减 y 坐标的绝对值也一样,这就比较麻烦。C++ 不能用负数,也不能两条对角线都是同一个标记。老师给了我们一个办法,将他们的差加上 20(别的数也行),问题就解决了。再看左斜的对角线有什么规律: 同上,中间一条对应 (2,5) (5,2),左上一条对应 (1,3) (3,1)。与右斜的对角线不同,它们不是差有规律而是和有规律。$2+5=7=5+2=7; \hspace{5px} 1+3=4=3+1=4$。那么,打标记时将 x+y 作为下标即可。
+加上深搜 ,代码就出来了:
+# include <cstdio>
+using namespace std;
+
+bool flagy[ 50 ] , flagzx[ 50 ] , flagyx[ 50 ] ;
+int sum = 0 ;
+int n;
+int s[ 50 ] ;
+
+void dfs ( int x)
+{
+ if ( x == n + 1 )
+ {
+ sum++ ;
+ if ( sum <= 3 )
+ {
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ printf ( "%d " , s[ i] ) ;
+ }
+ printf ( "\n" ) ;
+ }
+ return ;
+ }
+
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ if ( flagy[ i] == 0 && flagzx[ x + i] == 0 && flagyx[ x - i + 20 ] == 0 )
+ {
+ flagy[ i] = 1 ;
+ flagzx[ x + i] = 1 ;
+ flagyx[ x - i + 20 ] = 1 ;
+ s[ x] = i;
+ dfs ( x + 1 ) ;
+ flagy[ i] = 0 ;
+ flagzx[ x + i] = 0 ;
+ flagyx[ x - i + 20 ] = 0 ;
+ }
+ }
+}
+
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+
+ dfs ( 1 ) ;
+ printf ( "%d\n" , sum) ;
+
+ return 0 ;
+}
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 递归
+
+
+
+ 一些随笔记录和想法
+ //posts/seventh-lianbi/
+
+ .hide-blur {
+ filter: blur(5px);
+ transition: filter .1s
+ }
+ .hide-blur:hover {
+ filter: none;
+ }
+ .lianbi-block p:not(.pinyu) {
+ text-indent: 2ic;
+ line-height: 1.5;
+ margin-bottom: .2em;
+ }
+ .lianbi-block .lianbi-title {
+ font-weight: bold;
+ text-align: center;
+ display: block;
+ }
+ .lianbi-block .gdg {
+ text-decoration: #d60000 wavy underline;
+ text-decoration-thickness: 1px;
+ }
+ .lianbi-block .pinyu {
+ color: #d60000;
+ font-family: fangsong;
+ font-weight: 900;
+ line-height: 1.5;
+ text-align: right;
+ margin: 0 0 1em;
+ display: block;
+ }
+ .lianbi-block#lianbi3 del {
+ background-color: #999;
+ }
+
+
+写在前面的废话: 又是一篇分类于“琐碎”的文章。 加上这篇文章,这个分类下才有三篇文章。想来这个博客在运行 hexo init
之初,我就没想过写生活向的文章。如今“琐碎”下,一篇是画,两篇是作文收集,勉强算是透露了点生活向。 想想自己喜欢的,是 HTML, CSS, JavaScript 给我带来的样式美化 、多样性 和自主性 。不然我怎么不记到 .txt 里呢?也不知初衷是什么,唉,这样弄又有些喧宾夺主了。多年后看到,也就微微一笑,笑自己写出的东西古怪? 吧。
+
+
+下面,红字和红色波浪线都是老师做的标记。红字是批语。红线大概是老师认为有想法的句子吧。按时间排序的文章:
+一 记录
+ 运动会跳高随记
+ 我在操场上观看男子跳高。哪怕只讲跳高场地的气氛也是十分紧张激烈得了。运动员刚跳完,学生裁判和助理就飞快地冲上去把杆子重新架好,再用手推或脚踢将软垫重新压紧实,另一位运动员又跑步向前,一跃而起,脸上带着坚定和紧张。节奏之快,把观众观赛的热情都点燃了。
+ 这时,一位跳高运动员吸引了我的注意。根据他服装上的号码牌,我得知他是四班的一名运动员。他起跳了,但没有跳过,带着杆子跌向软垫。我感觉,他脸上写满不甘心与不服输,他和教师裁判要求再跳一遍。于是,我看到他咬紧牙关,再次冲向调高杆,似乎把腿尽可能地抬高,落向软垫——但他又失败了,脚带动杆子滑落下来,杆子落到地上发出哗啦一声。这声音对他来说可能是震天动地的,意味着失败的响声。我看到他再一次向裁判要求重新跳。我从我们班作为跳高裁判助理的施同学口中得知,如果失败,这次起跳是最后一次了。忽地,我联想到了一个人的坚定和决绝,这是不太容易做到的。这一次,他像鸟儿一样轻捷,越过杆子,似乎还有些紧张,但稳稳地落到软垫上,他成功了。
+ 我知道,在把杆子升高增加难度后,他最后一次失败了,退出了比追逐战还要激烈的跳高比赛。但能这样重复要求重新跳一次,连续跳三次的精神已经很好了,这是运动员的精神,因而留给我很深的印象。我坐在看台上喝奶茶时想到,尽管他是四班的,而我是三班的人。
+ 运动精神感染每一个人.
+
+
+想法 这篇文章是开完运动会老师叫写的(废话)。个人认为这届初中运动会不如小学的时候有那种热情、激动、高兴等等开运动会的感觉了。一方面因为延期 和运动会时间的缩短 ,更重要的另一方面运动会项目减少 、就在一个操场 看、不写通讯稿 ,对于我来说乐趣 都没了。这篇作文 30% 都不算真实感受。 至于真实事件,主要是因为有同班同学在跳高场地那儿当助理(也就是扶扶杆子)便跑到那儿和同学聊聊天。男子跳高我们班没人参加,去那儿只为聊天 (还顺便当好人帮同学扔橘子皮?)。四班体委跳高,看了看,感觉那种跳了三次的事件适合写到作文里,回家一想到就写了。
+至于老师的评语嘛,原话是这样写的 ,也不知道老师写这个是不是想到了什么。大概没什么别的深意。
+题外话: 那天有奶茶和泡芙供应,只喝了一瓶不知名品牌普通奶茶,味道还好。其他同学吃喝也蛮开心的。
+二 记录
+ 周五那些琐碎事
+ 此刻,我正坐在微格教室里,写这篇随记。自修的时间大家都很安静,只有教室里不知什么设备发出低沉且有规律的“咚咚”声,正是回忆和写作的耗时间,想想在一个半小时之前发生的琐事,我想。
+ 下午,五点,同学们乱哄哄地换完了座位,准备排队出校。而包括我的四个人却还要留在学校里,这真的是一种很奇特的感觉,我在独自去往食堂时想到。几个同学吃完了饭回到教室,有打扫一会儿卫生才去微格教室准备上课。来到微格教室,看到教室的布局,让我想到了母校的微格教室,给人一种很宁静的感觉。原本着急上完课,着急回家的心绪也平静下来。在现在想,大概是这种平静才是名词里“素养”与“提升”的感觉,竟有一种置身世外的超然感。
+ 这次科学老师上课,居然没有数学课那样急切,没有争分夺秒的感觉,甚至没有往常的节奏快。不知是我心里的主观认为还是微格教室的影响。还是给人一种宁静感,甚至悠闲,但又不是。现在想,那种感觉确实是安心学习的基础啊,不急功近利,而是宁静平和,甚至有限,轻松,太急躁反而容易犯错呢。我想。
+ 平时的课一般上一个小时,数学课通常还要拖几分钟,因为任务太多了。但这次不一样,宁静的教室,没有是么非常紧迫的任务。科学老师只上了半个小时的课,刚好在第一节晚自习一半的铃声响起时讲完了作业,剩下的时间老师让我们自修。一切都是平静的。于是,我开始写随记,也就是开头呈现的景象,一切都给人以平静,安静的感觉。
+ 想着想着,自修已经到了末尾,班里的同学开始吵闹起来,打破了原有的宁静,以及原有的那份奇特的心境。我意识到,我还要进行枯燥、有条不紊、节奏快的生活。生活的节奏很快,这种宁静是很难再找到了。我想找一句话来总结我的所思所想所写,但周围不再宁静,脑海中全是纷乱的思绪,如同一大片散乱的拼图,十分烦躁。突然几句话拨开纷乱的拼图“夫学须静也,才须学也。”“淫慢则不能励精,险躁则不能治性”。是的,无论干什么,都需要平静,需要宁静专一。宁静,不仅让人放松,还让人奋斗。
+ 正准备盖上笔合上本子,却又有一个想法冒出来,我翻到前面看了看开头的自己,抿嘴笑了,添上一句话:
+ 从本文开头到结尾,细微的自己变化和涂改状况能看出,这间教室和我在写这篇文章时的宁静与否吧?
+ “静能生慧”,一直觉得你是个能 “沉得住气”的孩子,很棒哦!
+
+
+想法 因为那天开家长会,照理说是所有学生都不用上晚自习 五点就回家的。但是我非常遗憾地参加了光明优倍 鲜牛奶班培优班 ,得继续留在学校,上一个小时的培优班 ,再写作业写到八点晚自习放学。就感觉很离谱,吐槽一下。 实际上,我们四个培优班 的同学吃完了饭确实受老师委托 回到教室打扫卫生,才去的微格教室。平常的课都在二班旁边的普通教室上,这次去微格教室大概是为了不打扰家长会 吧。 那天语文课和科学课换了,上的是科学课。老师说就讲三十分钟作业,剩下时间自修,就那样做了。我大概写了五十分钟的其他作业,剩下的时间都拿来写上面这篇作文了。当时想不到写什么好,干脆直接写当时场景了 。其实也是想在作文里“诉说不易”吧。
+至于老师的评价。。。很难确定老师理解到的是我想写什么,甚至连我自己也不清楚了。也不知道老师为什么评价的字写得比上一篇大。
+附:真不想写“培优班 ”三个字。
+三 地名替换
+
原作文中有真实地名,为了避免泄露信息,使用划掉的“占位”进行了替换。 显示为这样:
+
占位
+
+记录
+ 占位旅途记
+ 在占位,说起占位岛就让人想起连接占位岛与大陆的那座桥和“海洋”这个字眼来。又是两天后,坐在教室里,细细地回想两到四天前的事。
+ 海洋和桥,自然是在路上看到的。从占位海边到占位岛上的路就值得一提。经过(占位占线)和占位占路,我看到了海、海港和船只。基本只在城区待着的我没见过这般略显壮观的景象,立刻被吸引了:一排排轮船靠在岸边,船身下的水些许浑黄,仿佛同船一起睡着。海港在休息,但不减其威严气势,自然很引人注目。 和庞大的轮船与广阔无垠的海比起来,“小”客车自然没趣。突然间想到“海洋文化”正是这种意蕴。客车走上山路,越走越高。刹那间,眼前凭空出现一座仿佛横跨海面的桥。我的目光立刻又被桥捉了去。桥的支点是在两边的山上的,桥下面没有柱子支撑,所以看起来仿佛悬浮在海面上,桥也很高。车接近了桥,越发显得小了。还没上桥,就已觉得桥下海之广袤。走在桥上,仿佛神话中天神自由在空中行走,越过海洋。
+ 过了桥,便上了岛。又走了一会儿,到了活动基地。基地中发生的事反而没让我想到大海的悠远,似乎没什么特别让人印象深刻的事。海边桥上车中,自我上的一节课更让我印象深刻得多。
+ 海的广阔,如广阔得胸怀,容纳着船只和桥。船只和桥也容纳着其他事物。它们相互包容,相对广阔包容相对渺小的。这是海洋的精神: 包容。同样地,我们也得学习传承海洋文化精神。想来,这也算是占位之旅给我带来的收获——包容和责任。
+ 多去外面走走,会有记很多不一样 的启示.
+
+]]>
+
+ 琐碎
+
+
+ 作文
+
+
+
+ 数论:质数筛法
+ //posts/shaifa/
+ 筛法 是快速找出质数的一种方法。平常没有使用任何筛法的的找质数的时间复杂度通常为 $O(\sqrt n)$,比较慢,但是筛法更快一些。我们学的筛法是埃氏筛和欧拉筛(线性筛)。 平常的找质数方法是判断一个数是否能被 1 和它本生以外的数整除,但是筛法的思想不一样。筛法可以说是通常方法的逆向思维,挨个儿寻找当前数的倍数,打上标记,再继续寻找,最后没有被打上标记的就是质数。这种思想的时间复杂度快很多。
+
+
+埃氏筛 埃氏筛 ,全称其实是**埃拉托斯特尼筛法 (Eratosthenes)**。它的时间复杂度为 $O(n \log_2 \log_2 n)$,其实也就是刚才说的方法。这里放一个演示:
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 这是初始的表
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 筛掉了 4 6 8 10 12 14 16 18 20,2 是质数
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 3 筛掉了 6 9 12 15 18,3 是质数
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 筛掉了 10 15 20,其实 5 已经大于 根号 20,剩下的数都是质数,可以退出了,但在这儿继续演示下去
+
+ -------------------- break; -------------------- 实际循环已经在这儿之前就退出了,但这里继续演示下去
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 7 筛掉了 14,7 是质数
+
+ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 11 13 17 19 的倍数都不在数列中,它们都是倍数
+
+
+最终,筛选出了 2 3 5 7 11 13 17 19
这 8 个质数。
+埃氏筛的代码也比较简单:
+# include <cstdio>
+using namespace std;
+
+const int TEMP = 1e6 + 3 ;
+int flag[ TEMP] ;
+void is_prime ( int n)
+{
+ for ( int i = 2 ; i * i <= n; i++ )
+ {
+ if ( flag[ i] == 0 )
+ {
+ for ( int j = i * 2 ; j <= n; j += i)
+ {
+ flag[ j] = 1 ;
+ }
+ }
+ }
+}
+
+int main ( )
+{
+ int n;
+ scanf ( "%d" , & n) ;
+ is_prime ( n) ;
+ FILE * fp = freopen ( "./ans.txt" , "w" , stdout ) ;
+ for ( int i = 2 ; i <= n; i++ )
+ {
+ if ( flag[ i] == 0 )
+ {
+ printf ( "%d\n" , i) ;
+ }
+ }
+ fclose ( fp) ;
+}
+
+埃氏筛很快,上面数据 1000000 的代码一下就好了。 更具体的,可以去看一下 OI Wiki 。
+线性筛 线性筛也叫欧拉筛 ,它的出现就是为了找到比埃氏筛还要快的筛法,是由欧拉发现的。在埃氏筛中,一个数可能会被筛很多次,上面的演示也表现出来了。而线性筛每个数只会筛一次,是 $O(n)$ 的时间复杂度。只不过一般来说埃氏筛也够用,一些卡掉埃氏筛的毒瘤数据除外,例如 洛谷 P3383 。
+就按照 洛谷 P3383 来,代码是这样的:
+# include <cstdio>
+using namespace std;
+
+const int TEMP = 1e8 + 12 ;
+bool vis[ TEMP] ;
+int pri[ TEMP] , cnt = 0 ;
+void is_prime ( int n)
+{
+ for ( int i = 2 ; i < n; ++ i)
+ {
+ if ( ! vis[ i] )
+ {
+ pri[ cnt++ ] = i;
+ }
+ for ( int j = 0 ; j < cnt; ++ j)
+ {
+ if ( i * pri[ j] >= n)
+ {
+ break ;
+ }
+ vis[ i * pri[ j] ] = 1 ;
+ if ( i % pri[ j] == 0 )
+ {
+ break ;
+ }
+ }
+ }
+}
+
+
+int ns, q;
+int ans[ TEMP] ;
+int main ( )
+{
+ scanf ( "%d %d" , & ns, & q) ;
+ is_prime ( ns) ;
+
+
+
+
+
+
+
+
+
+
+
+ for ( int i = 1 ; i <= q; i++ )
+ {
+ int temp;
+ scanf ( "%d" , & temp) ;
+ printf ( "%d\n" , pri[ temp - 1 ] ) ;
+ }
+
+ return 0 ;
+}
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 数论
+
+
+
+ 时间复杂度和空间复杂度
+ //posts/shijianfuzaduhekongjianfuzadu/
+ 时间复杂度时间复杂度,就是电脑运行一段程序所需要的时间 。
+另外,电脑每秒可以运行1e8
次。($x$ e $y$代表$x$乘10的$y$次方,即100000000
次)
+时间复杂度记作$O$(n)。
+
+普通的时间复杂度**(常数时间)**记作$O$(1),为一段最简单的程序的时间复杂度。
+如以下程序的时间复杂度为$O$(1):
+# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ int n ;
+
+ return 0 ;
+}
+
+没错,什么都没有干,只创建了一个变量。
+
+
+
+其他时间复杂度(我所知道的很少,只会O(n^n)
),有几个循环时间复杂度就为^n。
+如以下程序的时间复杂度为$O$(i^2^)
+# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ for ( int i = 0 ; i < 10 ; i ++ )
+ {
+ for ( int j = 0 ; j < 10 ; j ++ )
+ {
+ printf ( "%d" , i) ;
+ }
+ }
+
+ return 0 ;
+}
+
+
+老师的练习:
+U262459 数位和3 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
+注意注意:
+这道题的数据范围很大,($0\le x \le10^6$),双重循环直接炸。($O$(1000000^2^))
+所以需要:
+记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
+空间复杂度 和时间复杂度差不多,只不过这个是和内存 有关的。
+不多讲了。就比如:
+# include <stdio.h>
+using namespace std ;
+
+int main ( )
+{
+ int a[ 100 ] ;
+
+ return 0 ;
+}
+
+这里,我们定义了一个类型为int
的数组,int
占4字节,产生的空间就为$4 * 1000$字节。
+这就是空间复杂度 。
+]]>
+
+ 课程笔记
+
+
+ 语言入门
+
+
+
+ 排序
+ //posts/sort/
+ 一些说在前面的要点
+稳定性
+在我们以下学过的排序算法中,只有选择排序 不是稳定的。
+稳定性,就是有两个相同的数字,在排序后两个数字的相对位置不变。(前面的在前面,后面的在后面)
+
+
+逆序对
+前面的一个数字大于后面一个数字,这就叫做逆序对。
+例如 $5\ 1\ 2\ 3\ 4$ 中,有 $4$ 对逆序对。
+
+
+
+
+
+选择排序 简介 选择排序 ,顾名思义,就是选出所有元素中最小的元素,然后再放到前面。这个排序非常好理解,但是,时间复杂度为 $O(n^2)$ ,数据一大就要炸了。( $n$ 为数组长度)
+我们可以使用一个变量来记录其中一个最小数的下标,然后再进行第一个数与最小的数的交换。 由于不断地将最小的数往前放,最终完成排序。但由于第 $i$ 次遍历之后,第 $i$ 个元素就是最小的元素,因此由 $i + 1$ 个元素开始判断。
+例子 例如有这样一个数组:
+$$ 8 \ 5 \ 7 \ 9 \ 2 \ 6 $$
+遍历后得知 $2$ 是最小的,与第一个元素 $8$ 进行交换。
+$$ {\color{red}2} \ 5 \ 7 \ 9 \ {\color{red}8} \ 6 $$
+以此类推:
+$$ {\color{green}2} \ {\color{red}5} \ 7 \ 9 \ 8 \ 6 \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{red}6} \ 9 \ 8 \ {\color{red}7} \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{red}7} \ 8 \ {\color{red}9} \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ 9 \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ $$
+示例程序 # include <cstdio>
+using namespace std ;
+
+int n, a[ 3002 ] ;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ for ( int i = 1 ; i <= n - 1 ; i ++ )
+ {
+ int th = i ;
+ for ( int j = i; j <= n; j ++ )
+ {
+ if ( a[ th] > a[ j] )
+ {
+ th = j ;
+ }
+ }
+ int temp = a[ i] ;
+ a[ i] = a[ th] ;
+ a[ th] = temp ;
+ }
+
+
+ for ( int i = 1 ; i <= n; i ++ ) { printf ( "%d " , a[ i] ) ; }
+ printf ( "\n" ) ;
+
+ return 0 ;
+}
+
+演示网址 演示网址:https://visualgo.net/zh/sorting?slide=8
+冒泡排序 简介 冒泡排序 ,将前面一个元素和后面一个元素做对比,若前面的元素大于后面的元素即进行交换。时间复杂度也为 $O(n^2)$。
+由于不断地将前一个元素大于后一个元素的一组交换,假设数组中有 $n$ 个元素,第 $i$ 次遍历后,第 $n$ 个元素就是最大的数,因此下一次遍历由 $i$ 至 $n - i$ 。
+例子 还是上面的那个例子,利用冒泡排序:
+$$ 8 \ 5 \ 7 \ 9 \ 2 \ 6 \ \ \ $$ $$ {\color{red}5} \ {\color{red}8} \ 7 \ 9 \ 2 \ 6 \ \ $$ $$ 5 \ {\color{red}7} \ {\color{red}8} \ 9 \ 2 \ 6 \ \ $$ $$ 5 \ 7 \ {\color{red}8} \ {\color{red}9} \ 2 \ 6 \ \ $$ $$ 5 \ 7 \ 8 \ {\color{red}2} \ {\color{red}9} \ 6 \ \ $$ $$ 5 \ 7 \ 8 \ 2 \ {\color{red}6} \ {\color{red}9} \ \ $$ $$ {\color{red}5} \ {\color{red}7} \ 8 \ 2 \ 6 \ {\color{green}9} \ \ $$ $$ 5 \ {\color{red}7} \ {\color{red}8} \ 2 \ 6 \ {\color{green}9} \ \ $$ $$ 5 \ 7 \ {\color{red}2} \ {\color{red}8} \ 6 \ {\color{green}9} \ \ $$ $$ 5 \ 7 \ 2 \ {\color{red}6} \ {\color{red}8} \ {\color{green}9} \ \ $$ $$ {\color{red}5} \ {\color{red}7} \ 2 \ 6 \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ 5 \ {\color{red}2} \ {\color{red}7} \ 6 \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ 5 \ 2 \ {\color{red}6} \ {\color{red}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ {\color{red}2} \ {\color{red}5} \ 6 \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ 2 \ {\color{red}5} \ {\color{red}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ {\color{red}2} \ {\color{red}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$ $$ {\color{green}2} \ {\color{green}5} \ {\color{green}6} \ {\color{green}7} \ {\color{green}8} \ {\color{green}9} \ \ $$
+示例程序 # include <cstdio>
+using namespace std ;
+
+int n, a[ 3002 ] ;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ for ( int j = 1 ; j <= n - 1 ; j ++ )
+ {
+ for ( int i = 1 ; i <= n - j; i ++ )
+ {
+ if ( a[ i] > a[ i + 1 ] )
+ {
+ int t = a[ i] ;
+ a[ i] = a[ i + 1 ] ;
+ a[ i + 1 ] = t ;
+ }
+ }
+ }
+
+
+
+ for ( int i = 1 ; i <= n; i ++ ) { printf ( "%d " , a[ i] ) ; }
+
+ return 0 ;
+}
+
+演示网址 演示网址:https://visualgo.net/zh/sorting?slide=7
+插入排序 简介 插入排序 ,是在冒泡排序的基础上做的改进。它将整个数列分为两个部分:已排序的与未排序的。
+由于一个数本身就没有任何顺序,所以我们可以假设元素 $a[1]$ (假设 $1$ 为数组第一个元素)就是一个已经排列好的数列。 随后,将 $a[2]$ 插入进已排序好的数列中。若 $a[2] > a[1]$ 则不交换,否则则交换。这就是一个循环的过程。插入进已排列好的数列中时,这个比较就是冒泡排序的过程:
+
+将前面一个元素和后面一个元素做对比,若前面的元素大于后面的元素即进行交换。
+
+例子 依然是前面那个样例,在这里,我们假设有一个空间是已排序空序列,另一个是未排序序列。
+$$ \boxed{ \begin{aligned} &\text{说明:}\\ &? \ \text{代表未排序序列} \\ &! \ \text{代表已排序序列} \\ \end{aligned} } $$
+$$ \begin{aligned} ? \ &8 \ 5 \ 7 \ 9 \ 2 \ 6 \ \\ ! \ &[Empty] \\ \\
+? \ &5 \ 7 \ 9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}8} \\ \\
+? \ &7 \ 9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}8} \ {\color{yellow}5} \\ \\
+? \ &7 \ 9 \ 2 \ 6 \ \ ! \ &{\color{yellow}5} \ {\color{yellow}8} \\ \\
+? \ &9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}5} \ {\color{yellow}8} \ {\color{yellow}7} \\ \\
+? \ &9 \ 2 \ 6 \ \\ ! \ &{\color{yellow}5} \ {\color{yellow}7} \ {\color{yellow}8} \\ \\
+&…(\text{不再详细演示}) \end{aligned} $$
+示例程序 # include <cstdio>
+using namespace std ;
+
+int a[ 100010 ] ;
+int main ( )
+{
+ int n ;
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ for ( int j = 1 ; j <= n - 1 ; j ++ )
+ {
+ for ( int i = j; i >= 1 ; i -- )
+ {
+ if ( a[ i + 1 ] < a[ i] )
+ {
+ int t = a[ i] ;
+ a[ i] = a[ i + 1 ] ;
+ a[ i + 1 ] = t ;
+ }
+ else
+ {
+ break ;
+ }
+ }
+ }
+
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ printf ( "%d " , a[ i] ) ;
+ }
+ printf ( "\n" ) ;
+
+ return 0 ;
+}
+
+可以看到,它比普通冒泡排序快在当前一个元素大于等于后一个元素时会退出循环。但最坏的情况还是 $O(n^2)$ (也是平均情况),因为如果他时一个倒序序列的话,这样排序每次都要从头到尾比较一遍,这和冒泡排序是一样的。
+演示网址 演示网址:https://visualgo.net/zh/sorting?slide=9
+计数排序 简介 计数排序需要用到前缀和 的知识,简单来说就是将每一个数字出现的次数记录到一个数组中(这里称为计数数组),然后再按照这个计数数组将答案数组赋值好。还是比较好理解的。只是也许没有冒泡排序来的码量小。 计数排序适用于排序数据量较大 的排序,但数字不能过大。如果数字上限很高的话,计数排序就无能为力了,因为数组不能开太大,否则内存不够用。 同时,最好不要有负数 ,要不然计数数组要开两倍大,虽说也可以通过处理达到“负下标”的效果,但还是上面说的三个排序比较好。
+例子 假设有这样一个数组 $a$ :
+$$ 8 \ 8 \ 8 \ 5 \ 5 \ 7 \ 5 \ 2 \ 2 \ 6 \ 6 \ 2 $$
+统计结果是这样的: $8$ 出现了 3
次, $5$ 出现了 3
次, $7$ 出现了 1
次, $6$ 出现了 2
次, $2$ 出现了 3
次。
+那么,就可以将这些数按顺序赋值到答案数组中,然后再输出答案数组。在此处不演示了。手都敲酸了
+示例程序 # include <cstdio>
+using namespace std ;
+
+const int TEMP = 1e7 + 10 ;
+int a[ TEMP] ;
+int b[ TEMP] , c[ TEMP] , d[ TEMP] ;
+int main ( )
+{
+ int n ;
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ b[ a[ i] ] ++ ;
+ }
+
+ c[ 0 ] = b[ 0 ] ;
+ for ( int i = 1 ; i <= 10000000 ; i ++ )
+ {
+ c[ i] = c[ i - 1 ] + b[ i] ;
+ }
+
+ for ( int i = 1 ; i <= c[ 0 ] ; i ++ )
+ {
+ d[ i] = 0 ;
+ }
+ for ( int i = 1 ; i <= 10000000 ; i ++ )
+ {
+ int l = c[ i - 1 ] + 1 ;
+ int r = c[ i - 1 ] + b[ i] ;
+ for ( int j = l; j <= r; j ++ )
+ {
+ d[ j] = i ;
+ }
+ }
+
+ for ( int i = 1 ; i <= n; i ++ )
+ {
+ printf ( "%d\n" , d[ i] ) ;
+ }
+
+ return 0 ;
+}
+
+演示网址 演示网址:https://visualgo.net/zh/sorting?slide=15
+归并排序 简介 归并排序其实是分治 的思想,将一个数列分成两份,再分,直至每个数列的长度都为一为止。然后再将每一个数列按照大小放回数组里。时间复杂度为 $O(n \log_{2}{n})$,和上面的几个排序比较,已经很好了。
+例子 一个数列 $8 \ 5 \ 7 \ 9 \ 2 \ 6$ 的归并排序:
+
+示例程序 # include <cstdio>
+using namespace std;
+
+const int TEMP = 5e5 + 3 ;
+int a[ TEMP] , b[ TEMP] ;
+long long sum = 0 ;
+
+void dg ( int l, int r)
+{
+ int mid = ( l + r) / 2 ;
+ if ( l != r)
+ {
+ dg ( l, mid) ;
+ dg ( mid + 1 , r) ;
+ }
+
+ int l1 = l, l2 = mid + 1 ;
+ int cnt = l;
+ while ( l1 <= mid && l2 <= r)
+ {
+ if ( a[ l1] >= a[ l2] )
+ {
+ b[ cnt] = a[ l2] ;
+ if ( a[ l1] == a[ l2] ) sum += mid - l1;
+ else sum += mid - l1 + 1 ;
+ l2++ ;
+ }
+ else
+ {
+ b[ cnt] = a[ l1] ;
+ l1++ ;
+ }
+ cnt++ ;
+ }
+
+ while ( l1 <= mid)
+ {
+ b[ cnt] = a[ l1] ;
+ l1++ ;
+ cnt++ ;
+ }
+ while ( l2 <= r)
+ {
+ b[ cnt] = a[ l2] ;
+ l2++ ;
+ cnt++ ;
+ }
+
+ for ( int i = l; i <= r; i++ )
+ {
+ a[ i] = b[ i] ;
+ }
+}
+
+int n;
+int main ( )
+{
+ scanf ( "%d" , & n) ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ scanf ( "%d" , & a[ i] ) ;
+ }
+
+ dg ( 1 , n) ;
+ printf ( "%lld\n" , sum) ;
+ return 0 ;
+}
+
+演示网址 演示网址:https://visualgo.net/en/sorting?slide=11
+<algorithm>
头文件 sort()
排序这么多排序算法,头都要晕了。为什么不用别人现成的函数来排序呢?看, C++
就有一个超级好用的头文件 -> <algorithm>
,用它里面的 sort()
函数就可以啦!并且,它支持自定义排序 。
+从小到大排序时,还有一个更方便的方法:
+sort ( a, a + 10 , greater < int > ( ) ) ;
+
+greater
是一个模板,可以把它理解为在这个函数中把大于号和小于号的含义交换。
+两个重载:
+template < typename _RandomAccessIterator >
+ inline void
+ sort ( _RandomAccessIterator __first, _RandomAccessIterator __last)
+
+template < typename _RandomAccessIterator , typename _Compare >
+ inline void
+ sort ( _RandomAccessIterator __first, _RandomAccessIterator __last,
+ _Compare __comp)
+
+想要用的时候,就直接 sort(&a[0], &a[n])
或者 sort(a, a + n)
就可以了。写排序函数 cmp
时,想交换就 return true
,否则就 return false
。
+]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 优化
+ 排序
+
+
+
+ 数据结构:队列和栈
+ //posts/stackandqueue/
+ 队列和栈都是线性数据结构,它们一个是先进先出,一个是先进后出,有着不同的使用场景。这两个数据结构基于链表,也可以用数组模拟这样的数据结构,通过 C++ 中 STL 提供的容器也可以更加方便快捷地实现。
+队列 队列 (queue) 是在一端插入另一段删除的线性表,遵循先进先出 ,类似于排队,可以称为先进先出 (FIFO) 表。队列中,允许入队 (enqueue) 的一端为队尾,允许出队 (dequeue) 的一端为队头。以后的广度优先搜索 就会用到它。
+
+
+数组模拟队列 使用数组模拟队列需要一个存储数据的数组,同时用变量标记队头和队尾。 假设队列数组名为 q
,头指针为 ql
,尾指针为 qr
,则:
+插入元素 时,需要将队尾加上 1,假设元素为 x
。结果:q[++qr] = x;
;删除元素 时,需要将队头指向下一个元素,由于这不是链表,直接执行即可。结果:ql++;
;访问队首 ,直接 q[ql];
;访问队尾 ,直接 q[qr];
;清空队列 时,头指针尾指针初始化,ql = 1; qr = 0;
。
+可见,数组模拟队列和数组模拟链表的缺点一样,内存不是动态分配的。这导致若数据过大则内存可能超出限制,若比数组的大小还大那就越界了,队列就溢出了。
+队列的溢出 但由于数组是直接将队首队尾加来加去,可能会有队列(数组)前面还空着,但是队列溢出的情况这就叫做假溢出 。若假溢出则需要使用循环队列,也就是说当尾指针超出数组,则将这一个元素从数组的开头放起。当然,若是真的全部存完了那有用的数据也会覆盖掉,这就是真溢出了。
+STL queue STL 提供的容器 queue
,需要引入 <queue>
头文件。通过模板,定义形式是这样:queue<[value type]> name
。 成员函数的使用:
+
+front()
返回队首值。
+back()
返回队尾值。
+push([value])
元素入队。
+pop()
元素出队。
+empty()
返回布尔值,表示队列是否为空。
+size()
返回数值,表示队列里元素的数量。
+
+容器不会假溢出,但是若队列为空还要 pop()
就会溢出。
+栈 栈 (stack)是在同一端插入同一端弹出的表。元素可插入弹出的一段称为栈顶,另一端是栈底,遵循 先进后出 。
+STL stack 容器需要引入 <stack>
头文件。成员函数有:top()
返回栈顶值push([value])
插入pop()
弹出empty()
是否为空栈size()
返回元素数量
+同样的,容器没有上限,不会上溢出。但是若栈已空还要 pop()
就会造成下溢出 。
+
+附 :visualgo 演示:
+
+]]>
+
+ 课程笔记
+
+
+ 队列
+ 数据结构
+
+
+
+ scanf 和 printf 的格式符
+ //posts/stdoi-snf-pnt/
+ 又是一个随记,方便自己的使用。C++ 中的 scanf
和 printf
其实有很多比 cin
cout
好用的地方,放在这里。
+
+
+scanf 的使用 读入的格式 就直接上表格吧,先把一些特定的读入格式符放在这儿:
+
+格式符
+
+
+
+
+格式符
+用途
+
+
+
+%d
+读入 int 整型
+
+
+%ld
+读入 long 整型
+
+
+%lld
+读入 long long 整型
+
+
+%hd
+读入 short 整型
+
+
+%u
+读入 unsigned int 整型
+
+
+%lu
+读入 unsigned long 整型
+
+
+%llu
+读入 unsigned long long 整型
+
+
+
+
+格式符
+用途
+
+
+
+%f
+读入 float 类型
+
+
+%lf
+读入 double 类型
+
+
+%Lf
+读入 long double 类型
+
+
+
+
+格式符
+用途
+
+
+
+%c
+读入 char 类型
+
+
+%s
+读入字符串,也就是 char 数组
+
+
+%o
+读入八进制整型
+
+
+%x
+读入十六进制整型
+
+
+
+
+
+以上其实都是一些读入的格式。还有一些能让读入的格式更加丰富的格式化。
+限制位数 在以上的任何格式符的 % 后面加上数字 n,即读入的位数就是 n。例如:
+int a, b;
+scanf ( "%1d %1d" , & a, & b) ;
+printf ( "%d %d\n" , a, b) ;
+
+假设输入 10345 则会输出 1 0。
+只读入,不赋值 在任何格式符的 % 后加上 *,就不会赋值给任何变量。例如:
+int a;
+long long b;
+short c;
+scanf ( "%d %*lld %lld %hd" , & a, & b, & c) ;
+printf ( "%d %lld %hd" , a, b, c) ;
+
+假设输入:
+2147483647 4294967295 11415612712638 128
+
+则输出:
+2147483647 11415612712638 128
+
+可见,scanf 忽略了第二个数字 4294967295。
+printf 的使用 其实它和 scanf 差不多。但是有多了精度,对齐什么的。
+标识和宽度 %[标识][宽度]
+
+宽度其实和上面一样,只不过默认左对齐。标识就可以更改。
+
+
+
+标识
+作用
+
+
+
+-
+将宽度的数字右对齐
+
+
++
+正数显示正号
+
+
+#
+和 %o
带有八进制前缀 0,和 %x
带有十六进制前缀 0x
+
+
+0
+将宽度的空格变成 0
+
+
+例如:
+int a, b, c, d, e, f;
+scanf ( "%d %d %d %d %d %d" , & a, & b, & c, & d, & e, & f) ;
+printf ( "|%010d|%10d|%-10d|\n" , a, b, c) ;
+printf ( "|%+10d|%#10o|%#10x|\n" , d, e, f) ;
+
+
+假设输入:
+19283 1983 1283 12873 83287 7283
+
+则会输出:
+|0000019283| 1983|1283 |
+| +12873| 0242527| 0x1c73|
+
+精度 用于小数,用 .n 标识保留 n 为小数。例如:
+double p;
+scanf ( "%lf" , & p) ;
+printf ( "%.3lf\n" , p) ;
+
+假设输入 114514.1919810 会输出 114514.192。
+]]>
+
+ 编程随记
+
+
+ 语言入门
+
+
+
+ C++类(结构体)
+ //posts/struct-class/
+ 创建一个类类 类似于结构体,只不过他是C++独有的而已。对于我这个入门者来说,类几乎等于结构体,只不过他出现了一种概念:公有 public
私有 private
受保护的 protected
。当然,对于我来说,除了 public
能用,其他的都不能用 。我还是太蒻了 。捂脸.jpg 但是继承类似乎可以用。例如:
+class myclass
+{
+ public :
+ int a ;
+ private :
+ int b ;
+ protected :
+ int c ;
+}
+
+对于我来说,除了 a 都不能用。 好像也没啥能记的了。再次捂脸.jpg
+]]>
+
+ 课程笔记
+
+
+ 语言入门
+
+
+
+ 双指针-快慢指针
+ //posts/two-pointers/
+
+双指针其实不是真正的指针,而是有两个变量在序列上进行一些操作。 ——Lqingyi(Lxandqi)
+
+思想分类
+普通双指针 也就是两个普通的 for
(也可以是其他的)循环嵌套。
+左右指针 其实就是二分搜索,一个变量指向开头,一个变量指向末尾,根据条件向中间遍历,直到指针相遇或满足某种条件。(也就是逼近答案)
+快慢指针 两个指针(变量)开始同时开头,但一个遍历的快,一个慢,直到条件满足或指针到末尾。
+
+
+
+提示 双指针是二重循环。
+一般来说,快慢指针的第二个指针(快指针)的变量是在 for
循环体之外定义的。因为 for
循环会初始化变量。快慢指针的变量是不可以初始化的,因为已经遍历过的就不用遍历了,再遍历一遍就变成普通双指针(暴力枚举)了。
+怎么感觉只有例题才能讲清楚???
+例题 给定一个长度为 $n$ 的整数序列 $a_1,a_2,…,a_n$ 以及一个长度为 $m$ 的整数序列 $b_1,b_2,…,b_m$。 请你判断 $a$ 序列是否为 $b$ 序列的子序列。 子序列指序列的一部分项按原有次序排列而得的序列,例如序列 $a_1,a_3,a_5$ 是序列 $a_1,a_2,a_3,a_4,a_5$ 的一个子序列。
+输入时: 第一行包含两个整数 $n,m$。 第二行包含 $n$ 个整数,表示 $a_1,a_2,…,a_n$。 第三行包含 $m$ 个整数,表示 $b_1,b_2,…,b_m$。输出时: 如果 $a$ 序列是 $b$ 序列的子序列,输出一行 Yes
。 否则,输出 No
。
+数据保证: $1 \le n \le m \le 10^5$ $−10^9 \le a_i,b_i \le 10^9$
+
+解题: 数据那么大,暴枚肯定不行。那么就用今天学的双指针。 一个指针 $i$ 遍历数组 $a$ 的元素,指针 $j$ 遍历数组 $b$ 的元素。写一个 while(1)
死循环, $j$ 在 while
中每次 ++
,如果 $a_i = b_j$ ,则 break
,如果 $j > m$ 则输出 No
。 $j$ 变量(指针)的定义要写在循环之外。
+代码:
+# include <cstdio>
+using namespace std;
+
+int n, m ;
+const int N = 1e5 + 5 ;
+int a[ N] , b[ N] ;
+int main ( )
+{
+ scanf ( "%d %d" , & n, & m) ;
+ for ( int i = 1 ; i <= n; i++ ) scanf ( "%d" , & a[ i] ) ;
+ for ( int i = 1 ; i <= m; i++ ) scanf ( "%d" , & b[ i] ) ;
+
+ int j = 1 ;
+ for ( int i = 1 ; i <= n; i++ )
+ {
+ while ( 1 )
+ {
+ if ( j > m)
+ {
+ printf ( "No\n" ) ;
+ return 0 ;
+ }
+ if ( a[ i] == b[ j] )
+ {
+ j++ ;
+ break ;
+ }
+ j++ ;
+ }
+ }
+
+ printf ( "Yes\n" ) ;
+
+ return 0 ;
+}
]]>
+
+ 课程笔记
+
+
+ 基础算法
+ 解题思想
+
+
+
+ Waline 评论加入记录
+ //posts/waline-set/
+ 看了看“归档 ”页面才发现自己没有在 2024 发布 过文章。最近寒假作业写累了(思维导图太烦啦),就更新了下留言板,从 giscus 换成了 waline ,不用登录就可以留言了,管理也更方便。
+
+
+服务端 按照官方文档,我注册了 LeanCloud 国际版 账号(华东或华北节点需要备案域名,可我没有钱买域名)。随后点击“创建应用”,填写应用名称(计费方式选择“开发版”)。 创建应用完毕后依次点击 设置 -> 应用凭证
,三个 KEY 等下要使用。
+随后我选择了 DetaSpace 部署。注册账号,随后下载 Waline 应用 ,点击“Install on Space”等待完成。随后返回首页,点击底部任务栏 deta 图标呼出菜单,依次点击 Add Card to Horizon -> Installed App -> Waline
。 鼠标悬浮到新增加的卡片上,点击灰色的 deta 图标点击 “Open Settings”,点击“Configuration”选项卡,将 LeanCloud 中 AppID
, AppKey
, MasterKay
依次加入到 LEAN_ID
, LEAN_KEY
, LEAN_MASTER_KEY
中。滑动到底部点击“Save Changes”。服务端完成。
+可以通过“Configuration”中 GRAVATAR_STR
更改用户默认头像。更改 DISABLE_REGION
DISABLE_USERAGENT
为 true 隐藏评论下方用户代理和位置。
+鼠标悬浮到卡片上,点击右上角“Waline”及其徽标,在 url 后增加 /ui/register
,也就是 https://waline-x-xxxxxxx.deta.app/ui/register
,注册一个账号成为管理员,就可以点击“管理”选项卡管理用户和评论了。
+客户端 通过 CDN 引入 waline.js 和 waline.css ,在想加入评论框的页面引入。 新增 script 标签,可参考:
+import '/comments/waline.js' ;
+
+Waline. init ( {
+ el : "#waline" ,
+ path : location. pathname,
+ lang : "zh-CN" ,
+ serverURL : "https://yoursite.deta.app" ,
+ locale : {
+ admin : "管理员" ,
+ login : "管理员登录" ,
+ placeholder : "友善的评论会收获更多美好" ,
+ } ,
+} ) ;
]]>
+
+ 编程随记
+
+
+ JavaScript
+
+
+
+ 一些六年级的小练笔
+ //posts/xiaolianbi/
+ 一些六年级写的小作文(小练笔),留作纪念。
+主题:点面结合写“体检”300字以上 同学们紧张地等待着,一年一度的体检开始了。 与往常不同的是,这次体检要抽血。验血区里,紧张的气氛非常明显。我一拿到条形码 (当时验血有一个条形码,用来验证身份和当作标签),就直奔验血区,怕时间长了自己会害怕。很快就轮到了我。我卷起袖子,将胳膊往桌上一放,马上扭过头闭上眼,不敢看针扎进我的胳膊里的样子。 医生开始抹酒精了,我觉得我一直在发抖。等了一会儿,我感到一丝疼痛,但很快就没有了。只听见软管松开的声音。“好了。”旁边的同学提醒我。我睁开眼,看见医生正在往试管上贴标签,我长舒一口气。幸好一次性就完成了。旁边同学问我:“疼吗?”我按紧棉花,苦笑道:“都一样”。 另外一边儿正在测血压,气氛很轻松,毕竟同学们习惯测血压了。她卷起袖子,医生帮她把仪器连接好,按下了“开始”键。只见那块连接仪器的布不断收缩、绷紧,仪器上的数字不断跳动、变化,然后定格,布又松弛了。医生在表格上龙飞凤舞地写下一行数字,又开始忙其他的了。 各种各样的检查结束了,同学们兴高采烈地走回了教室,如释重负。
+主题:未知 老师一走,原本安静的班级马上热闹起来,比十个菜市场还吵。调皮大王马上抓住这一时机,放声大吼起一首歌“大河向东流啊……”一些同学被调皮大王逗得哈哈大笑,根本就不去写作业本了,也愉快地聊起天来。大组长,班长怎么管也没用。调皮大王更起劲了,拿起书本卷成筒状,凑到同学耳边大吼大唱。许多“小调皮”被吸引了,也毫无顾忌地转来转去,和旁边的同学愉快地大声聊天。随着调皮大王“嘿”地一声大吼,一位女同学差点儿被吓哭。跑操铃声想起,新任体育委员地调皮大王又来了兴致,催促吵吵闹闹的班级马上出来,在外面排好了歪歪扭扭的队伍。“小调皮”们在教室外还是安静不下来,直至别的班的老师过来,那吵吵闹闹的一群人才一哄而散。
+主题:点面结合 大扫除 400字 很快,一盆盆水端了进来,同学们都拿着工具,对教室里脏的地方发动了“攻击”。同学们忘乎所以地忙碌着,仿佛这个世界上只有他手中的事情了。 他拿着一把扫帚,卖力地扫角落里一个落满灰尘的夹缝。地上那些明显的纸片都被他扫走了,他扫门后面,灰尘弥漫,但他手握扫帚,用力去扫角落的墙灰,很快,门后干干净净。这里的角落有一个柜子,他俯下身子,仔细地查看着柜子后面的灰尘,发现灰尘有一尺多高。他马上把扫帚探进柜子后面,半个身子差点儿都倒下去了,艰难的把一丁点儿灰尘扫了出来。他不甘心,拿了把小扫帚,用力搬开了柜子,手拿小扫帚,将所有灰尘都扫了出来。他还觉得不够干净,干脆直接上手,地上几块顽固的胶带就被他死了下来,丢进了灰尘堆。垃圾桶里虽然没有什么大型垃圾,灰尘却堆成了小山,这大部分是他的功劳。 她拿着一块湿抹布,握着小铲刀,擦着墙上的污垢和双面胶带。瓷砖已经有些发黑了,还有一些水笔的字迹,被摘除的布告后留下双面胶的痕迹。她不慌不忙,从容地擦着那些水笔的痕迹。手所滑过的地方,一切都亮了起来。但也有非常顽固的污垢,她用手指盖着布,上上下下用力地擦。扣。污垢撑不住,很快,墙上的污点完全没有了。双面胶牢牢地粘在墙上,经过长时间的风化,又硬又黏。她先用湿布擦那些胶,这样用铲子更好铲,“斩草除根”后,再用力擦一擦,墙上的双面胶一点也没有了。结白明亮的瓷砖倒映着她满意的微笑。 经过每一个同学的努力,教室里焕然一新。每个同学露出的,都是满意的微笑。
+]]>
+
+ 琐碎
+
+
+ 作文
+
+
+
+ 指针
+ //posts/zhizhen/
+ 指针的作用指针,顾名思义,就是指向某一东西的标志。
+当我们想存地址时,就可以使用指针变量:
+int a ;
+int * b = & a ;
+
+b
就是一个指针变量,存着a
的地址。
+
+
+普通指针 普通指针就是上面的例子中的b
,它存着a
的地址,因此&a
和b
的输出结果是一样的。
+存指针地址的指针 当我们想存指针地址时那该怎么办呢?
+很简单,嵌套:
+# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a ;
+ int * b = & a ;
+ int * * c = & b ;
+
+ printf ( "%d %d %d" , & a, b, c) ;
+
+ return 0 ;
+}
+
+这样就不会出错了。
+取地址和解地址 *
既可以是乘号,又可以是解地址,还可以是指针变量;
+&
既可以是按位与运算,又可以是取地址。
+解地址,与取地址相反,就是按照地址去找地址里存的数 。
+我们可以使用指针变量解地址得到原本的数,例如:
+# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a = 10 ;
+ int * b = & a ;
+ int * * c = & b ;
+
+ printf ( "%d %d %d" , a, * b, * * c) ;
+
+ return 0 ;
+}
+
+这段代码输出的应该是三个同样10
,我们一个一个来:
+
+a
,就是a
本身,输出10
;
+*b
,就是解地址b
,等于解地址&a
,等于a
,输出10
;
+**c
,就是解地址c
,等于解地址&b
,等于解地址&a
,等于a
,输出10
。
+
+画个图更清晰:
+**c=*(&b) → b=*(&a) → a = 10 → printf(10)
+因此,解地址也是可以嵌套的。
+指针数组和数组指针 指针数组,用来存指针的数组;
+数组指针,数组的首地址。
+我们使用时*a[100]
代表数组a
的地址,因为数组的优先级更高。弄一个指针数组应该写(*a)[100]
。
+同样的,a
代表数组中第一个元素的首地址 ,&a
代表整个数组的首地址 ,我们是不是还可以这样写?
+# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a[ 100 ] = { 1 , 2 , 3 , 4 } ;
+ printf ( "%d %d %d %d" , * ( a + 0 ) , * ( a + 1 ) , * ( a + 2 ) , * ( a + 3 ) ) ;
+
+ return 0 ;
+}
+
+输出1 2 3 4
,这与a[n]
的效果是一样的。
+因此,我们得出结论:数组的本质就是指针 。
+]]>
+
+ 课程笔记
+
+
+ 语言入门
+ 指针
+
+
+
+ 一些有用的东西有没有用的东西
+ //posts/yixieyouyongdedongxiyoumei/
+ 宏定义和类型定义宏定义 ,将一个指令导向另一个指令 。宏定义属于预处理指令 ,使用规范为:
+# define [ 标识符] [ 常量]
+
+
+
+与变量不同的是:宏定义可以理解为把一个文本替换 成另一个文本。比如说:
+# include <cstdio>
+# define a 3 + 2
+using namespace std ;
+
+int main ( )
+{
+ printf ( "%d" , a * 3 ) ;
+
+ return 0 ;
+}
+
+和
+# include <cstdio>
+using namespace std ;
+
+int main ( )
+{
+ int a = 3 + 2 ;
+ printf ( "%d" , a * 3 ) ;
+
+ return 0 ;
+}
+
+使用了 #define
的输出 $9$ ,使用了 int
的输出 $15$ 。这是因为 #define
只是把 $a$ 替换为了 $3+2$ ,因此先算 $2 \times 3=6$ ,再算 $6+3=9$ ,而 int
将 $a$ 定为 $5$ ,再算 $5 \times 3=15$ 。从这些角度来看,define
只是一个“替换”的操作。
+
+类型定义 ,将变量类型导向简单的标识符 。类型定义属于语句 ,使用规范为:
+typedef [ 变量类型] [ 标识符] ;
+
+与 #define
不同的是:#define
属于预处理指令 ,需要在预处理器处理。而且 #define
可以将任何指令或字符指向标识符;而 typedef
属于语句 ,需要在编译器中编译。且 typedef
只支持将变量类型指向标识符。例如:
+# include <cstdio>
+# define pnt printf
+# define scn scanf
+using namespace std ;
+
+int main ( )
+{
+ typedef long long ll ;
+
+ ll a ;
+ scn ( "%lld" , & a) ;
+ pnt ( "%lld" , a + 1 ) ;
+
+ return 0 ;
+}
+
+常量 无论是 int
还是 double
类型,他们都是变量,即随时可以改变。当想用到不用改变的量时,就要用到常量 了。
+定义一个常量很简单,只需要在变量类型前加上一个 const
就行了。例如:
+# include <cstdio>
+using namespace std;
+
+const int a = 100 ;
+int b[ a] = { 0 , 1 , 2 } ;
+int main ( )
+{
+ for ( int i = 0 ; i < 100 ; i ++ )
+ {
+ printf ( "%d\n" , b[ i] ) ;
+ }
+
+ return 0 ;
+}
+
+在这里,我们建立了一个名为 $a$ 的常量,其值为 $100$ 。随后定义一个名为 $b$ 的数组,大小为 $a$ , $a=100$ , $b$ 数组的大小就是 $100$ 。
+一般来说对于我来说,常量的作用不算特别大,但是拿来定义数组却很方便。
+有符号和无符号 有符号 , signed
,符号即为 $-$ ,在一般的数据定义中,都是 有符号的类型。无符号 , unsigned
,即没有 复数,正数数据范围会大很多。比如普通的 int
( signed int
)数据范围是 $-2147483648 \sim 2147483647$ 而无符号 int
( unsigned int
)数据范围是 $0 \sim 4294967295$ ,这是因为 unsigned int
将附属部分拿来存正数部分,所以可以存的正数会大很多。
+在变量类型中,只有 signed
会被认作 signed int
;只有 unsigned
也会被认作 unsigned int
;不带 signed
和 unsigned
的任何数据类型都会被认做有符号 signed
数据类型。因此,在某些时候主函数 int main()
也可以写成 signed main()
+]]>
+
+ 课程笔记
+
+
+ 语言入门
+
+
+
diff --git a/tags/Git/index.html b/tags/Git/index.html
new file mode 100644
index 00000000..5a5173b4
--- /dev/null
+++ b/tags/Git/index.html
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: Git | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/HTML/index.html b/tags/HTML/index.html
new file mode 100644
index 00000000..924b2d94
--- /dev/null
+++ b/tags/HTML/index.html
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: HTML | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/JavaScript/index.html b/tags/JavaScript/index.html
new file mode 100644
index 00000000..07623a04
--- /dev/null
+++ b/tags/JavaScript/index.html
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: JavaScript | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/index.html b/tags/index.html
new file mode 100644
index 00000000..9f1388bd
--- /dev/null
+++ b/tags/index.html
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\344\274\230\345\214\226/index.html" "b/tags/\344\274\230\345\214\226/index.html"
new file mode 100644
index 00000000..c7a697aa
--- /dev/null
+++ "b/tags/\344\274\230\345\214\226/index.html"
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 优化 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\344\275\234\346\226\207/index.html" "b/tags/\344\275\234\346\226\207/index.html"
new file mode 100644
index 00000000..802fcff7
--- /dev/null
+++ "b/tags/\344\275\234\346\226\207/index.html"
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 作文 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\207\275\346\225\260\357\274\214\345\217\202\346\225\260/index.html" "b/tags/\345\207\275\346\225\260\357\274\214\345\217\202\346\225\260/index.html"
new file mode 100644
index 00000000..c421ff8d
--- /dev/null
+++ "b/tags/\345\207\275\346\225\260\357\274\214\345\217\202\346\225\260/index.html"
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 函数,参数 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\211\215\347\274\200\345\222\214\357\274\214\345\267\256\345\210\206/index.html" "b/tags/\345\211\215\347\274\200\345\222\214\357\274\214\345\267\256\345\210\206/index.html"
new file mode 100644
index 00000000..52e6acb8
--- /dev/null
+++ "b/tags/\345\211\215\347\274\200\345\222\214\357\274\214\345\267\256\345\210\206/index.html"
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 前缀和,差分 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\237\272\347\241\200\347\256\227\346\263\225/index.html" "b/tags/\345\237\272\347\241\200\347\256\227\346\263\225/index.html"
new file mode 100644
index 00000000..b8f264b5
--- /dev/null
+++ "b/tags/\345\237\272\347\241\200\347\256\227\346\263\225/index.html"
@@ -0,0 +1,472 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 基础算法 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\237\272\347\241\200\347\256\227\346\263\225/page/2/index.html" "b/tags/\345\237\272\347\241\200\347\256\227\346\263\225/page/2/index.html"
new file mode 100644
index 00000000..4aae7b9b
--- /dev/null
+++ "b/tags/\345\237\272\347\241\200\347\256\227\346\263\225/page/2/index.html"
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 基础算法 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\214\207\351\222\210/index.html" "b/tags/\346\214\207\351\222\210/index.html"
new file mode 100644
index 00000000..14853001
--- /dev/null
+++ "b/tags/\346\214\207\351\222\210/index.html"
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 指针 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\216\222\345\272\217/index.html" "b/tags/\346\216\222\345\272\217/index.html"
new file mode 100644
index 00000000..d4e79536
--- /dev/null
+++ "b/tags/\346\216\222\345\272\217/index.html"
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 排序 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\220\234\347\264\242/index.html" "b/tags/\346\220\234\347\264\242/index.html"
new file mode 100644
index 00000000..5c8c3046
--- /dev/null
+++ "b/tags/\346\220\234\347\264\242/index.html"
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 搜索 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html" "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html"
new file mode 100644
index 00000000..d7ea1cc4
--- /dev/null
+++ "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204/index.html"
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 数据结构 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\225\260\350\256\272/index.html" "b/tags/\346\225\260\350\256\272/index.html"
new file mode 100644
index 00000000..1224b877
--- /dev/null
+++ "b/tags/\346\225\260\350\256\272/index.html"
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 数论 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\240\221/index.html" "b/tags/\346\240\221/index.html"
new file mode 100644
index 00000000..0b38ea26
--- /dev/null
+++ "b/tags/\346\240\221/index.html"
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 树 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\347\274\226\350\257\221/index.html" "b/tags/\347\274\226\350\257\221/index.html"
new file mode 100644
index 00000000..7c52286b
--- /dev/null
+++ "b/tags/\347\274\226\350\257\221/index.html"
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 编译 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\350\247\243\351\242\230\346\200\235\346\203\263/index.html" "b/tags/\350\247\243\351\242\230\346\200\235\346\203\263/index.html"
new file mode 100644
index 00000000..93535047
--- /dev/null
+++ "b/tags/\350\247\243\351\242\230\346\200\235\346\203\263/index.html"
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 解题思想 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\350\257\255\350\250\200\345\205\245\351\227\250/index.html" "b/tags/\350\257\255\350\250\200\345\205\245\351\227\250/index.html"
new file mode 100644
index 00000000..cf4b8632
--- /dev/null
+++ "b/tags/\350\257\255\350\250\200\345\205\245\351\227\250/index.html"
@@ -0,0 +1,469 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 语言入门 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\351\200\222\345\275\222/index.html" "b/tags/\351\200\222\345\275\222/index.html"
new file mode 100644
index 00000000..6a1d59df
--- /dev/null
+++ "b/tags/\351\200\222\345\275\222/index.html"
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 递归 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\351\230\237\345\210\227/index.html" "b/tags/\351\230\237\345\210\227/index.html"
new file mode 100644
index 00000000..f457a53d
--- /dev/null
+++ "b/tags/\351\230\237\345\210\227/index.html"
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+标签: 队列 | JoyWonderful的小窝
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme NexT works best with JavaScript enabled
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webfonts/fontawesome/fa-brands-400.ttf b/webfonts/fontawesome/fa-brands-400.ttf
new file mode 100644
index 00000000..5efb1d4f
Binary files /dev/null and b/webfonts/fontawesome/fa-brands-400.ttf differ
diff --git a/webfonts/fontawesome/fa-brands-400.woff2 b/webfonts/fontawesome/fa-brands-400.woff2
new file mode 100644
index 00000000..36fbda7d
Binary files /dev/null and b/webfonts/fontawesome/fa-brands-400.woff2 differ
diff --git a/webfonts/fontawesome/fa-regular-400.ttf b/webfonts/fontawesome/fa-regular-400.ttf
new file mode 100644
index 00000000..838b4e2c
Binary files /dev/null and b/webfonts/fontawesome/fa-regular-400.ttf differ
diff --git a/webfonts/fontawesome/fa-regular-400.woff2 b/webfonts/fontawesome/fa-regular-400.woff2
new file mode 100644
index 00000000..b6cabbac
Binary files /dev/null and b/webfonts/fontawesome/fa-regular-400.woff2 differ
diff --git a/webfonts/fontawesome/fa-solid-900.ttf b/webfonts/fontawesome/fa-solid-900.ttf
new file mode 100644
index 00000000..ec24749d
Binary files /dev/null and b/webfonts/fontawesome/fa-solid-900.ttf differ
diff --git a/webfonts/fontawesome/fa-solid-900.woff2 b/webfonts/fontawesome/fa-solid-900.woff2
new file mode 100644
index 00000000..824d518e
Binary files /dev/null and b/webfonts/fontawesome/fa-solid-900.woff2 differ
diff --git a/webfonts/fontawesome/fa-v4compatibility.ttf b/webfonts/fontawesome/fa-v4compatibility.ttf
new file mode 100644
index 00000000..b175aa8e
Binary files /dev/null and b/webfonts/fontawesome/fa-v4compatibility.ttf differ
diff --git a/webfonts/fontawesome/fa-v4compatibility.woff2 b/webfonts/fontawesome/fa-v4compatibility.woff2
new file mode 100644
index 00000000..e09b5a55
Binary files /dev/null and b/webfonts/fontawesome/fa-v4compatibility.woff2 differ
diff --git a/webfonts/fontawesome/fontawsm.min.css b/webfonts/fontawesome/fontawsm.min.css
new file mode 100644
index 00000000..145205e5
--- /dev/null
+++ b/webfonts/fontawesome/fontawsm.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2023 Fonticons, Inc.
+ */
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}
+
+.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}
+.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(fa-brands-400.woff2) format("woff2"),url(fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(fa-regular-400.woff2) format("woff2"),url(fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(fa-solid-900.woff2) format("woff2"),url(fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(fa-brands-400.woff2) format("woff2"),url(fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(fa-solid-900.woff2) format("woff2"),url(fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(fa-regular-400.woff2) format("woff2"),url(fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-solid-900.woff2) format("woff2"),url(fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-brands-400.woff2) format("woff2"),url(fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-regular-400.woff2) format("woff2"),url(fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(fa-v4compatibility.woff2) format("woff2"),url(fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
\ No newline at end of file
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-100.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-100.woff2
new file mode 100644
index 00000000..c50365d8
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-100.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-101.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-101.woff2
new file mode 100644
index 00000000..b86716d7
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-101.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-102.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-102.woff2
new file mode 100644
index 00000000..0b7f01bc
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-102.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-103.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-103.woff2
new file mode 100644
index 00000000..13f2e329
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-103.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-104.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-104.woff2
new file mode 100644
index 00000000..b5900342
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-104.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-105.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-105.woff2
new file mode 100644
index 00000000..293e84bf
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-105.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-106.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-106.woff2
new file mode 100644
index 00000000..e937a81f
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-106.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-107.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-107.woff2
new file mode 100644
index 00000000..c2836925
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-107.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-108.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-108.woff2
new file mode 100644
index 00000000..f26fa5aa
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-108.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-109.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-109.woff2
new file mode 100644
index 00000000..f7f7f36a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-109.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-110.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-110.woff2
new file mode 100644
index 00000000..071bac47
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-110.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-111.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-111.woff2
new file mode 100644
index 00000000..dc3d05f6
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-111.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-112.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-112.woff2
new file mode 100644
index 00000000..043e4ac5
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-112.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-113.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-113.woff2
new file mode 100644
index 00000000..50cbcef0
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-113.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-114.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-114.woff2
new file mode 100644
index 00000000..313122f6
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-114.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-115.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-115.woff2
new file mode 100644
index 00000000..2388caf2
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-115.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-116.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-116.woff2
new file mode 100644
index 00000000..be901279
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-116.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-117.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-117.woff2
new file mode 100644
index 00000000..09c7f3c5
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-117.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-118.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-118.woff2
new file mode 100644
index 00000000..d2845f7e
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-118.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-119.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-119.woff2
new file mode 100644
index 00000000..810dc625
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-119.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-21.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-21.woff2
new file mode 100644
index 00000000..db8728ff
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-21.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-22.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-22.woff2
new file mode 100644
index 00000000..c7329ffc
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-22.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-23.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-23.woff2
new file mode 100644
index 00000000..d1776f45
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-23.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-24.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-24.woff2
new file mode 100644
index 00000000..553d1b63
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-24.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-25.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-25.woff2
new file mode 100644
index 00000000..b0678b40
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-25.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-26.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-26.woff2
new file mode 100644
index 00000000..5ede722a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-26.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-27.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-27.woff2
new file mode 100644
index 00000000..6773868c
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-27.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-28.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-28.woff2
new file mode 100644
index 00000000..97d9cd71
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-28.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-29.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-29.woff2
new file mode 100644
index 00000000..58efdf21
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-29.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-30.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-30.woff2
new file mode 100644
index 00000000..8226ca5a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-30.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-31.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-31.woff2
new file mode 100644
index 00000000..c1667aca
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-31.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-32.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-32.woff2
new file mode 100644
index 00000000..b26fae04
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-32.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-33.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-33.woff2
new file mode 100644
index 00000000..94abe758
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-33.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-34.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-34.woff2
new file mode 100644
index 00000000..eef45161
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-34.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-35.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-35.woff2
new file mode 100644
index 00000000..1983b422
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-35.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-36.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-36.woff2
new file mode 100644
index 00000000..1673570f
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-36.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-37.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-37.woff2
new file mode 100644
index 00000000..88335166
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-37.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-38.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-38.woff2
new file mode 100644
index 00000000..fe04096c
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-38.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-39.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-39.woff2
new file mode 100644
index 00000000..91cf7fa0
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-39.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-4.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-4.woff2
new file mode 100644
index 00000000..e031affe
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-4.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-40.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-40.woff2
new file mode 100644
index 00000000..89ad2357
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-40.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-41.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-41.woff2
new file mode 100644
index 00000000..23bee1e5
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-41.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-42.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-42.woff2
new file mode 100644
index 00000000..8f4abcc1
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-42.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-43.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-43.woff2
new file mode 100644
index 00000000..8565a375
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-43.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-44.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-44.woff2
new file mode 100644
index 00000000..68f54dae
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-44.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-45.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-45.woff2
new file mode 100644
index 00000000..bfd76020
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-45.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-46.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-46.woff2
new file mode 100644
index 00000000..8eda8d5a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-46.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-47.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-47.woff2
new file mode 100644
index 00000000..687f8685
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-47.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-48.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-48.woff2
new file mode 100644
index 00000000..72de7564
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-48.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-49.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-49.woff2
new file mode 100644
index 00000000..cfd7dc03
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-49.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-5.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-5.woff2
new file mode 100644
index 00000000..60ce4bed
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-5.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-50.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-50.woff2
new file mode 100644
index 00000000..d94cbe83
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-50.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-51.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-51.woff2
new file mode 100644
index 00000000..1be5360a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-51.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-52.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-52.woff2
new file mode 100644
index 00000000..cf7ec100
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-52.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-53.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-53.woff2
new file mode 100644
index 00000000..7d4649e0
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-53.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-54.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-54.woff2
new file mode 100644
index 00000000..0d81b2c9
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-54.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-55.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-55.woff2
new file mode 100644
index 00000000..03f081df
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-55.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-56.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-56.woff2
new file mode 100644
index 00000000..37a70232
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-56.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-57.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-57.woff2
new file mode 100644
index 00000000..762fdd12
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-57.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-58.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-58.woff2
new file mode 100644
index 00000000..3a651377
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-58.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-59.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-59.woff2
new file mode 100644
index 00000000..90f7a7c5
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-59.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-6.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-6.woff2
new file mode 100644
index 00000000..efc2a976
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-6.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-60.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-60.woff2
new file mode 100644
index 00000000..d692323b
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-60.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-61.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-61.woff2
new file mode 100644
index 00000000..5346f50a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-61.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-62.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-62.woff2
new file mode 100644
index 00000000..03dcef22
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-62.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-63.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-63.woff2
new file mode 100644
index 00000000..e05d9b87
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-63.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-64.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-64.woff2
new file mode 100644
index 00000000..6fb7d20e
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-64.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-65.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-65.woff2
new file mode 100644
index 00000000..9ff4daab
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-65.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-66.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-66.woff2
new file mode 100644
index 00000000..59897a2a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-66.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-67.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-67.woff2
new file mode 100644
index 00000000..e93da22d
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-67.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-68.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-68.woff2
new file mode 100644
index 00000000..6d103065
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-68.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-69.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-69.woff2
new file mode 100644
index 00000000..25bc938e
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-69.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-70.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-70.woff2
new file mode 100644
index 00000000..71d10457
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-70.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-71.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-71.woff2
new file mode 100644
index 00000000..67ab6ffd
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-71.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-72.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-72.woff2
new file mode 100644
index 00000000..55444fea
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-72.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-73.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-73.woff2
new file mode 100644
index 00000000..dad0cf65
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-73.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-74.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-74.woff2
new file mode 100644
index 00000000..1344e4fc
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-74.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-75.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-75.woff2
new file mode 100644
index 00000000..bc07b5ab
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-75.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-76.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-76.woff2
new file mode 100644
index 00000000..28436514
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-76.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-77.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-77.woff2
new file mode 100644
index 00000000..2e894753
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-77.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-78.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-78.woff2
new file mode 100644
index 00000000..594e937a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-78.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-79.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-79.woff2
new file mode 100644
index 00000000..45b8970a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-79.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-80.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-80.woff2
new file mode 100644
index 00000000..0e506502
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-80.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-81.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-81.woff2
new file mode 100644
index 00000000..1fe80031
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-81.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-82.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-82.woff2
new file mode 100644
index 00000000..9da68069
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-82.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-83.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-83.woff2
new file mode 100644
index 00000000..105840a2
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-83.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-84.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-84.woff2
new file mode 100644
index 00000000..f359835a
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-84.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-85.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-85.woff2
new file mode 100644
index 00000000..6734ca01
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-85.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-86.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-86.woff2
new file mode 100644
index 00000000..27b2da67
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-86.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-87.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-87.woff2
new file mode 100644
index 00000000..8735fbc2
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-87.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-88.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-88.woff2
new file mode 100644
index 00000000..9e2cc6c2
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-88.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-89.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-89.woff2
new file mode 100644
index 00000000..f0bcb9a7
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-89.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-90.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-90.woff2
new file mode 100644
index 00000000..13b4b329
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-90.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-91.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-91.woff2
new file mode 100644
index 00000000..b4af8733
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-91.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-97.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-97.woff2
new file mode 100644
index 00000000..e0288ae4
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-97.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-98.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-98.woff2
new file mode 100644
index 00000000..6ac92fbc
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-98.woff2 differ
diff --git a/webfonts/lxgw/files/lxgwwenkailite-regular-subset-99.woff2 b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-99.woff2
new file mode 100644
index 00000000..a55b45df
Binary files /dev/null and b/webfonts/lxgw/files/lxgwwenkailite-regular-subset-99.woff2 differ
diff --git a/webfonts/lxgw/lxgwwenkailite-regular.css b/webfonts/lxgw/lxgwwenkailite-regular.css
new file mode 100644
index 00000000..8b6b86f1
--- /dev/null
+++ b/webfonts/lxgw/lxgwwenkailite-regular.css
@@ -0,0 +1,873 @@
+/* LXGW WenKai Lite [4] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-4.woff2') format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e
+}
+/* LXGW WenKai Lite [5] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-5.woff2') format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8
+}
+/* LXGW WenKai Lite [6] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-6.woff2') format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0
+}
+/* LXGW WenKai Lite [21] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-21.woff2') format('woff2');
+ unicode-range: U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81, U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff4, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d, U+af34
+}
+/* LXGW WenKai Lite [22] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-22.woff2') format('woff2');
+ unicode-range: U+9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39
+}
+/* LXGW WenKai Lite [23] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-23.woff2') format('woff2');
+ unicode-range: U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80, U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9
+}
+/* LXGW WenKai Lite [24] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-24.woff2') format('woff2');
+ unicode-range: U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d, U+9a80, U+9a83, U+9a85, U+9a87-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9abc, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39
+}
+/* LXGW WenKai Lite [25] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-25.woff2') format('woff2');
+ unicode-range: U+98c8, U+98cf-98d6, U+98da-98db, U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b
+}
+/* LXGW WenKai Lite [26] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-26.woff2') format('woff2');
+ unicode-range: U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c7
+}
+/* LXGW WenKai Lite [27] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-27.woff2') format('woff2');
+ unicode-range: U+95b9-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727
+}
+/* LXGW WenKai Lite [28] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-28.woff2') format('woff2');
+ unicode-range: U+94e7-94ec, U+94ee-94f1, U+94f3, U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8
+}
+/* LXGW WenKai Lite [29] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-29.woff2') format('woff2');
+ unicode-range: U+9410-941a, U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94e6
+}
+/* LXGW WenKai Lite [30] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-30.woff2') format('woff2');
+ unicode-range: U+92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea, U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-940f
+}
+/* LXGW WenKai Lite [31] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-31.woff2') format('woff2');
+ unicode-range: U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6
+}
+/* LXGW WenKai Lite [32] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-32.woff2') format('woff2');
+ unicode-range: U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa, U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a
+}
+/* LXGW WenKai Lite [33] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-33.woff2') format('woff2');
+ unicode-range: U+8e2d-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda
+}
+/* LXGW WenKai Lite [34] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-34.woff2') format('woff2');
+ unicode-range: U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d2e, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e2c
+}
+/* LXGW WenKai Lite [35] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-35.woff2') format('woff2');
+ unicode-range: U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d, U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb3-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac
+}
+/* LXGW WenKai Lite [36] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-36.woff2') format('woff2');
+ unicode-range: U+8a02-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13, U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c
+}
+/* LXGW WenKai Lite [37] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-37.woff2') format('woff2');
+ unicode-range: U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f, U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01
+}
+/* LXGW WenKai Lite [38] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-38.woff2') format('woff2');
+ unicode-range: U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864
+}
+/* LXGW WenKai Lite [39] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-39.woff2') format('woff2');
+ unicode-range: U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545, U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df
+}
+/* LXGW WenKai Lite [40] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-40.woff2') format('woff2');
+ unicode-range: U+83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2, U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d
+}
+/* LXGW WenKai Lite [41] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-41.woff2') format('woff2');
+ unicode-range: U+82a9-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6, U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3
+}
+/* LXGW WenKai Lite [42] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-42.woff2') format('woff2');
+ unicode-range: U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160, U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82a8
+}
+/* LXGW WenKai Lite [43] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-43.woff2') format('woff2');
+ unicode-range: U+7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014, U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148
+}
+/* LXGW WenKai Lite [44] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-44.woff2') format('woff2');
+ unicode-range: U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb, U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9
+}
+/* LXGW WenKai Lite [45] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-45.woff2') format('woff2');
+ unicode-range: U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1-7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4
+}
+/* LXGW WenKai Lite [46] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-46.woff2') format('woff2');
+ unicode-range: U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7-7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1
+}
+/* LXGW WenKai Lite [47] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-47.woff2') format('woff2');
+ unicode-range: U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1, U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9
+}
+/* LXGW WenKai Lite [48] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-48.woff2') format('woff2');
+ unicode-range: U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4, U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1
+}
+/* LXGW WenKai Lite [49] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-49.woff2') format('woff2');
+ unicode-range: U+797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8
+}
+/* LXGW WenKai Lite [50] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-50.woff2') format('woff2');
+ unicode-range: U+783e, U+7841-7844, U+7847-7849, U+784b-784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b
+}
+/* LXGW WenKai Lite [51] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-51.woff2') format('woff2');
+ unicode-range: U+770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721-7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c
+}
+/* LXGW WenKai Lite [52] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-52.woff2') format('woff2');
+ unicode-range: U+760a-760e, U+7610-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770e
+}
+/* LXGW WenKai Lite [53] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-53.woff2') format('woff2');
+ unicode-range: U+74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508, U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-7609
+}
+/* LXGW WenKai Lite [54] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-54.woff2') format('woff2');
+ unicode-range: U+73e7-73ea, U+73ee-73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee
+}
+/* LXGW WenKai Lite [55] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-55.woff2') format('woff2');
+ unicode-range: U+72dd-72df, U+72e1, U+72e5-72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73e6
+}
+/* LXGW WenKai Lite [56] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-56.woff2') format('woff2');
+ unicode-range: U+719c, U+71a0, U+71a4-71a5, U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db
+}
+/* LXGW WenKai Lite [57] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-57.woff2') format('woff2');
+ unicode-range: U+7005-7006, U+7009, U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198
+}
+/* LXGW WenKai Lite [58] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-58.woff2') format('woff2');
+ unicode-range: U+6ed8-6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f31-6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe
+}
+/* LXGW WenKai Lite [59] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-59.woff2') format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7
+}
+/* LXGW WenKai Lite [60] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-60.woff2') format('woff2');
+ unicode-range: U+6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2
+}
+/* LXGW WenKai Lite [61] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-61.woff2') format('woff2');
+ unicode-range: U+6b85-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae, U+6cb1
+}
+/* LXGW WenKai Lite [62] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-62.woff2') format('woff2');
+ unicode-range: U+6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b84
+}
+/* LXGW WenKai Lite [63] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-63.woff2') format('woff2');
+ unicode-range: U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc, U+69fe-6a00
+}
+/* LXGW WenKai Lite [64] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-64.woff2') format('woff2');
+ unicode-range: U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1, U+68d3, U+68d7, U+68dd, U+68df
+}
+/* LXGW WenKai Lite [65] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-65.woff2') format('woff2');
+ unicode-range: U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a-678d, U+678f
+}
+/* LXGW WenKai Lite [66] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-66.woff2') format('woff2');
+ unicode-range: U+64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630-6631, U+6633-6634, U+6636
+}
+/* LXGW WenKai Lite [67] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-67.woff2') format('woff2');
+ unicode-range: U+63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0-64f2, U+64f4, U+64f7
+}
+/* LXGW WenKai Lite [68] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-68.woff2') format('woff2');
+ unicode-range: U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62ce-62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5, U+63b7-63bb
+}
+/* LXGW WenKai Lite [69] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-69.woff2') format('woff2');
+ unicode-range: U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226, U+622c, U+622e-6230, U+6232, U+6238
+}
+/* LXGW WenKai Lite [70] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-70.woff2') format('woff2');
+ unicode-range: U+5fd1-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec-60ee, U+60f0-60f1, U+60f4, U+60f6
+}
+/* LXGW WenKai Lite [71] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-71.woff2') format('woff2');
+ unicode-range: U+5ea3-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc, U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd0
+}
+/* LXGW WenKai Lite [72] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-72.woff2') format('woff2');
+ unicode-range: U+5d32-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96, U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea2
+}
+/* LXGW WenKai Lite [73] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-73.woff2') format('woff2');
+ unicode-range: U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d27, U+5d2e-5d31
+}
+/* LXGW WenKai Lite [74] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-74.woff2') format('woff2');
+ unicode-range: U+5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be7, U+5be9, U+5beb-5bec, U+5bee-5bf0, U+5bf2-5bf3
+}
+/* LXGW WenKai Lite [75] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-75.woff2') format('woff2');
+ unicode-range: U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e, U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1
+}
+/* LXGW WenKai Lite [76] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-76.woff2') format('woff2');
+ unicode-range: U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968, U+596a, U+596c-596e, U+5977, U+597b-597c
+}
+/* LXGW WenKai Lite [77] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-77.woff2') format('woff2');
+ unicode-range: U+570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-5820, U+5822-5823, U+5825-5826, U+582c, U+582f
+}
+/* LXGW WenKai Lite [78] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-78.woff2') format('woff2');
+ unicode-range: U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709
+}
+/* LXGW WenKai Lite [79] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-79.woff2') format('woff2');
+ unicode-range: U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3, U+55f5-55f7, U+55fb, U+55fe, U+5600-5601
+}
+/* LXGW WenKai Lite [80] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-80.woff2') format('woff2');
+ unicode-range: U+53fb-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550f, U+5511-5514, U+5516-5517
+}
+/* LXGW WenKai Lite [81] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-81.woff2') format('woff2');
+ unicode-range: U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5340, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2, U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa
+}
+/* LXGW WenKai Lite [82] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-82.woff2') format('woff2');
+ unicode-range: U+5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287, U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a
+}
+/* LXGW WenKai Lite [83] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-83.woff2') format('woff2');
+ unicode-range: U+4fe3-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102, U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f
+}
+/* LXGW WenKai Lite [84] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-84.woff2') format('woff2');
+ unicode-range: U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0-4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2
+}
+/* LXGW WenKai Lite [85] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-85.woff2') format('woff2');
+ unicode-range: U+3127-3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2-4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6
+}
+/* LXGW WenKai Lite [86] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-86.woff2') format('woff2');
+ unicode-range: U+279c, U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126
+}
+/* LXGW WenKai Lite [87] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-87.woff2') format('woff2');
+ unicode-range: U+2650-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796
+}
+/* LXGW WenKai Lite [88] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-88.woff2') format('woff2');
+ unicode-range: U+254b, U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-264f
+}
+/* LXGW WenKai Lite [89] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-89.woff2') format('woff2');
+ unicode-range: U+23e9, U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a
+}
+/* LXGW WenKai Lite [90] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-90.woff2') format('woff2');
+ unicode-range: U+207b-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0
+}
+/* LXGW WenKai Lite [91] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-91.woff2') format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2027-2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a
+}
+/* LXGW WenKai Lite [97] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-97.woff2') format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579
+}
+/* LXGW WenKai Lite [98] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-98.woff2') format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab
+}
+/* LXGW WenKai Lite [99] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-99.woff2') format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175
+}
+/* LXGW WenKai Lite [100] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-100.woff2') format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+560e, U+5618, U+565c, U+56bc, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ac9, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+620c, U+62c7, U+62ed, U+6320, U+6345, U+6390, U+63b0, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+72e9, U+733f, U+7396, U+739f, U+7459-745a, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8aaa, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+9a6f, U+9a8b, U+9ab7, U+9ac5, U+9e25, U+e608, U+ff06, U+ff14-ff16
+}
+/* LXGW WenKai Lite [101] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-101.woff2') format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+2463, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+516e, U+51c4, U+5225, U+5364, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+5662, U+5669, U+566c, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+6273, U+62f7, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6ed5, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+7409, U+7422, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+803f, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8c41, U+8cec, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9704, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+9f9a, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e, U+ff3d
+}
+/* LXGW WenKai Lite [102] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-102.woff2') format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+60df, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+6813, U+6869, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+73fe, U+7405, U+7455, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+8046, U+80fa, U+81b3, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+904e, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+9119, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+f012b
+}
+/* LXGW WenKai Lite [103] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-103.woff2') format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5a1f, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+5f6c, U+603c, U+609a, U+6168, U+61c8, U+6236, U+62d0, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+6703, U+67da, U+67ec, U+6816, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+7410, U+7426, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8d50, U+8e72, U+8f9c, U+900d, U+904b, U+9063, U+90a2, U+90b9, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+9631, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd
+}
+/* LXGW WenKai Lite [104] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-104.woff2') format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a49, U+5ac2, U+5bb0, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f8c, U+608d, U+611b, U+6127, U+62a0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6e9c, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+8328, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d63, U+8e81, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9540, U+9610, U+9699, U+96c7, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b
+}
+/* LXGW WenKai Lite [105] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-105.woff2') format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+300f, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54b1, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+61be, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6380, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82ad, U+82bd, U+8305, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+958b, U+9600, U+9640, U+96b6, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f
+}
+/* LXGW WenKai Lite [106] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-106.woff2') format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+8304, U+8393, U+83b9, U+83ca, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95ef, U+95f7, U+9706, U+9709, U+9774, U+9887, U+98a0, U+9e64, U+9f9f, U+e601, U+e603
+}
+/* LXGW WenKai Lite [107] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-107.woff2') format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+886c, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95fa, U+95fd, U+964c, U+96c0, U+971c, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9b4f, U+9e2d, U+9f0e, U+e602, U+e604-e605, U+ff5c
+}
+/* LXGW WenKai Lite [108] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-108.woff2') format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+85aa, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+90aa, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+9675, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715
+}
+/* LXGW WenKai Lite [109] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-109.woff2') format('woff2');
+ unicode-range: U+a5, U+2022, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5
+}
+/* LXGW WenKai Lite [110] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-110.woff2') format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d
+}
+/* LXGW WenKai Lite [111] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-111.woff2') format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e
+}
+/* LXGW WenKai Lite [112] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-112.woff2') format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8
+}
+/* LXGW WenKai Lite [113] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-113.woff2') format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4ee4, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50
+}
+/* LXGW WenKai Lite [114] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-114.woff2') format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6740, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c
+}
+/* LXGW WenKai Lite [115] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-115.woff2') format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b63, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b
+}
+/* LXGW WenKai Lite [116] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-116.woff2') format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6d4b, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99
+}
+/* LXGW WenKai Lite [117] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-117.woff2') format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53ea, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f
+}
+/* LXGW WenKai Lite [118] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-118.woff2') format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e38, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09
+}
+/* LXGW WenKai Lite [119] */
+@font-face {
+ font-family: 'LXGW WenKai Lite';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./files/lxgwwenkailite-regular-subset-119.woff2') format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a
+}